On Sat, 8 Jan 2011, Kevin D. Kissell wrote:
> > With the Bonito I'd have assumed it was some low-level PCI code rewrite
> > -- that seem to keep happening over and over again -- that missed a bit in
> > the Bonito driver or the driver altogether. With the Bonito core cards
> > limited to the MIPS 20Kc core and some exotic (for the Malta) QED CPU
> > options that would be no surprise at all to me.
> I don't think it's a "classic" Bonito, YAMON calls out:
>
> MIPS SOC-it 101 OCP / 1.3 SDR-FW-1:1
If it doesn't say "Bonito", then it's not a Bonito. ;)
I've had a peek at the driver and I bet it's related to the "PCI iomap"
thing. The PCNet32 driver doesn't use it and goes for the traditional
direct inw()/outw()/etc. approach. I haven't been following the relevant
discussions, so I can't say offhand whether PCI iomap has become mandatory
now or not, but what I think is happening is that inw()/outw()/etc. no
longer reach the PCI port I/O space from the driver on your system by
default.
Now the other driver presumably does use PCI iomap and when it
initialises, it maps a piece of PCI port I/O space somewhere in the
virtual address space (or initialises a KSEG/XKPHYS mapping in kernel's
structures) making inw()/outw()/etc. see it. And given due to PC/AT
legacy PCI port I/O space ranges requested are typically small (256
contiguous bytes are the guaranteed maximum on PC/AT-compatible systems),
one MMU page spans more than one (as does obviously a kernel segment)
making the other driver's mapping inadvertently valid for this driver too.
This in turn magically makes it work.
Note, while a plausible explanation, this is a pure guess on my side. If
it is indeed valid, then where the bug lies will depend on whether PCI
iomap has become mandatory or not.
Maciej
|