TI 7x21 FlashMedia/SD Host Controller (104C:8033 & 104C:8034)
Update: TI 7x21 FlashMedia/SD Host Controller (104C:8033 & 104C:8034) The Compaq R4100 series of laptops feature a 6-in-1 memory card reader based on the widely used Texas Instruments 7x21 chips. Although TI provides Windows drivers there is very little information available to assist in development of a free Linux device driver for it. It appears that TI actually contracted another company (Everest) to write a Linux device driver, although the write-up on their work shows great potential there is no sign of the driver or its source code. There is however a binary version of the driver built for the 2.6.11 kernel available here - unfortunately it's useless for me since I am running a 64-bit kernel.
Exploring Reverse Engineering Approaches
I found a few promising leads while Googling where reverse engineering the Windows driver was helping development of a native kernel driver for it. http://tifmxx.berlios.de/ http://www.webcon.ca/~imorgan/tifm21/
Building from Source
Unfortunately there is no fully working driver as yet, however the Subversion repository at tifmxx.berlios.de is very active, I checked out the latest revision of the code to test it out make insmod tifmxx.ko returned: tifmxx: Unknown symbol scsi_remove_host tifmxx: Unknown symbol pci_intx tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_ae tifmxx: Unknown symbol scsi_host_put tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_brs tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_card tifmxx: Unknown symbol scsi_add_host tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_af tifmxx: Unknown symbol scsi_host_alloc tifmxx: Unknown symbol __scsi_add_device tifmxx: Unknown symbol scsi_remove_host tifmxx: Unknown symbol pci_intx tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_ae tifmxx: Unknown symbol scsi_host_put tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_brs tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_card tifmxx: Unknown symbol scsi_add_host tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_af tifmxx: Unknown symbol scsi_host_alloc tifmxx: Unknown symbol __scsi_add_device ## Kernel Compatibility Issues
Trawling mailing-lists I found that "pci_intx" wasn't implemented by the kernel in version 2.6.11-1.1369 but it is in later releases like 2.6.14-1.1656 which I also tested with. To workaround this in 2.6.11-1.1369 the recommendation was to add the following code to the top of tifmxx_hw.c. [cpp]static void pci_intx(struct pci_dev *pdev, int enable) { u16 pci_command, new; pci_read_config_word(pdev, PCI_COMMAND, &pci_command); if (enable) new = pci_command & ~PCI_COMMAND_INTX_DISABLE; else new = pci_command | PCI_COMMAND_INTX_DISABLE; if (new != pci_command) pci_write_config_word(pdev, PCI_COMMAND, pci_command); }[/cpp] Although this avoided the pci_intx problem the others remained, probably down to SCSI not being enabled in the Fedora Core 4 standard kernel; the missing tifmxx_ symbols simply aren't implemented yet. Rebuilding it without the pci_intx hack on my 2.6.14-1.1659 kernel appeared to be a lot better, looks promising. tifmxx: Unknown symbol scsi_remove_host tifmxx: Unknown symbol scsi_add_device tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_ae tifmxx: Unknown symbol scsi_host_put tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_brs tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_card tifmxx: Unknown symbol scsi_add_host tifmxx: Unknown symbol tifmxx_mmcsd_wait_for_af tifmxx: Unknown symbol scsi_host_alloc ## Attempting Windows Driver Emulation
After my recent success with ndiswrapper I decided to give it a bash using some Windows x64 drivers I found while trawling the net. It appears to be an official release for Windows x64 labelled "TI 7x21 FlashMedia/SD Host controller driver -Win64", "version 2.0.0.0", "build id FBCRX02W" - but I found no mention of it on their website - download it here. ndiswrapper -i tifm21.inf modprobe ndiswrapper returned: ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'ExReleaseFastMutex' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'ExAcquireFastMutex' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'IoUnregisterPlugPlayNotification' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'IoGetDmaAdapter' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'KeLeaveCriticalRegion' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'KeEnterCriticalRegion' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'IoGetDeviceObjectPointer' ndiswrapper (import:239): unknown symbol: ntoskrnl.exe:'IoRegisterPlugPlayNotification' ndiswrapper (load_sys_files:218): couldn't prepare driver 'tifm21' ndiswrapper (load_wrap_driver:112): loadndiswrapper failed (65280); check system log for messages from 'loadndisdriver' Game Over... It was a long shot anyway...
Next Steps
I have emailed Everest and will try calling them tomorrow, failing that I might try give TI a call, the binary kernel module is labelled as GPL so the source must be available in some form. Other than that I will be keeping an eye on the progress over at tifmxx.berlios.de One day... maybe it will all just work...
Hardware Details
Ah yes, just for completeness... Here is a lspci dump: 03:04.0 CardBus bridge: Texas Instruments PCIxx21/x515 Cardbus Controller Subsystem: Hewlett-Packard Company: Unknown device 3085 Flags: bus master, medium devsel, latency 168, IRQ 185 Memory at b0209000 (32-bit, non-prefetchable) [size=4K] Bus: primary=03, secondary=04, subordinate=07, sec-latency=176 Memory window 0: 30000000-31fff000 (prefetchable) Memory window 1: 32000000-33fff000 I/O window 0: 0000a400-0000a4ff I/O window 1: 0000a800-0000a8ff 16-bit legacy interface ports at 0001 03:04.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller Subsystem: Hewlett-Packard Company: Unknown device 3085 Flags: bus master, medium devsel, latency 64, IRQ 10 Memory at b0206000 (32-bit, non-prefetchable) [size=8K] Capabilities: [44] Power Management version 2 03:04.4 Class 0805: Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller Subsystem: Hewlett-Packard Company: Unknown device 3085 Flags: bus master, medium devsel, latency 64, IRQ 10 Memory at b020a000 (32-bit, non-prefetchable) [size=256] Memory at b0208c00 (32-bit, non-prefetchable) [size=256] Memory at b0208800 (32-bit, non-prefetchable) [size=256] Capabilities: [80] Power Management version 2 UPDATE: I just got a response from Everest
This is a custom project done for Texas instruments and not open source. Any queries regarding this driver should be addressed to TI.
The Cutler.sg Newsletter
Weekly notes on AI, engineering leadership, and building in Singapore. No fluff.
Supermicro AOC-SASLP-MV8: DRIVER_TIMEOUT
Troubleshooting DRIVER_TIMEOUT errors with Supermicro AOC-SASLP-MV8 storage controller on modern Linux kernels and finding alternatives
Open MPI Master & Servant Example - BogoMips
Extend MPI master-servant pattern to pass numerical data between nodes using BogoMips CPU calibration across distributed cluster processors
An Open MPI Master & Servant Example
Learn to create master-servant MPI programs with process communication using practical C examples for distributed computing clusters