32 bit Linux Kernel not recognising PCI I/O port unlike 64 bit counter part
Hi,
I just completed a port of the standard Linux PCI (wdt_pci) watchdog driver to support ACCES I/O's PCI watchdog, but I have found something strange, specifically in terms of how 32bit Linux kernels are allocating memory and I/O ports for the PCI Watchdog board. Here's an example of the correct output , using a 2.6.32.60 64 bit kernel ( built from kernel.org ), that includes the correct memory and I/O ports based off of Bars 0-2 on the PCI device. In this case , the I/O ports that are required to be correct start at addres 0xd080. lspci -vv -xx -s 04:06.0 04:06.0 Class ff00: ACCES I/O Products, Inc. PCI-WDG-CSM (rev 02) Subsystem: ACCES I/O Products, Inc. PCI-WDG-CSM Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Interrupt: pin A routed to IRQ 11 Region 0: Memory at ff700000 (32-bit, non-prefetchable) [size=128] Region 1: I/O ports at d000 [size=128] Region 2: I/O ports at d080 [size=16] Kernel modules: aio_wdt 00: 4f 49 c0 22 03 00 80 02 02 00 00 ff 10 00 00 00 10: 00 00 70 ff 01 d0 00 00 81 d0 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 4f 49 c0 22 30: 00 00 00 00 00 00 00 00 00 00 00 00 0b 01 00 00 However, when this is performed under a 32bit version of the exact same kernel release , I see the following: 04:06.0 Class ff00: ACCES I/O Products, Inc. PCI-WDG-CSM (rev 02) Subsystem: ACCES I/O Products, Inc. PCI-WDG-CSM Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Interrupt: pin A routed to IRQ 11 Region 0: Memory at ff700000 (32-bit, non-prefetchable) [size=128] Region 1: I/O ports at d000 [size=128] Region 2: [virtual] Memory at 0000d080 (32-bit, non-prefetchable) [size=16] 00: 4f 49 c0 22 03 00 80 02 02 00 00 ff 10 00 00 00 10: 00 00 70 ff 01 d0 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 4f 49 c0 22 30: 00 00 00 00 00 00 00 00 00 00 00 00 0b 01 00 00 Does anyone have any ideas of ways to correct this. The problem is that once the Kernel has allocated the I/O ports at region d080 incorrectly, I am unable to correctly write to this memory address and actually talk to the hardware. It is believe that this used to work with older Kernels ( 2.4 days ) but I have yet been able to verify this. I am including this last statement in case it jogs someone's memory. Thanks for any suggestions. |
Did you tried with 3.x.x kernels?
Regards |
All times are GMT -5. The time now is 10:25 AM. |