We are using Zoom CDK MCF5485 board together with Freescale’s Linux Board Support Package ltib-mcf547x_8x-20051213.iso, based on kernel 2.6.10.
Our project is actually in final stage, but we faced a problem with PCI communication. Our device makes reading information from PCI our device and transferring it through TCP/IP to host PC.
The handshaking with PCI device is very simple. As soon as new device’s buffer is ready, the device pulls interrupt line down. We are using IRQ7 line for this purpose. When interrupt occurred, the interrupt routine reads information from PCI device, puts it into TCP/IP buffer and clears dedicated acknowledgement bit in PCI device. After that PCI device pulls the line up. This is repeating continuously.
The problem occurred when the transfer made with high speed. Probably it can be observed with lower speed as well, we just need to wait it long time.
The problem description:
After arbitrary number of interrupts (say 1000, 10000, 50000, 100000, etc.) reading/writing from/to PCI device fails. We observed relevant signals on oscilloscope. The interrupt routine writes word to PCI (clears acknowledgement bit), however the line is not going up, i.e. the PCI device didn’t receive it. As a result, when interrupt routine exits, the line is still low. Since the interrupt is level-sensitive, it called immediately again. And again, the routine trying to acknowledge PCI device by writing the appropriate word, but it’s vain. This is repeating continuously and of course the system is actually hanged up, because all processors time is captured by persistent interrupt service.
Since the PCI device could release the line too late, I tried to put delay on interrupt routine exits. It doesn’t resolve the problem.
I checked what the interrupt routine reading from PCI device, when it’s happening. Instead of ‘normal’ words, it reads only ‘FFFFFFFF’.
So, we are highly puzzled, what is the reason of the problem. It’s happening only if we do both transfers, through PCI and TCP/IP, simultaneously. I tried to bypass transfer via TCP/IP and system runs fine.
I tried two different Linux Board Support packages (LTIB and PCS), but the system’s behavior is the same.
May be this is already known issue? Bug in chip or in FireEngine board? Any known fixes/workaround?
Could you please help us figure out the problem?