Update: TI 7×21 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 7×21 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.
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/
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
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
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 7×21 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…
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… 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.
Leave a Reply