rtl8139 pci mem freeze (more info)

Donald Becker becker@tidalwave.net
Thu Sep 30 18:37:12 1999

On Thu, 30 Sep 1999, Daniel Kobras wrote:
> On Thu, 30 Sep 1999, Donald Becker wrote:
> > > +	outl_f(dev->dev_addr[0], ioaddr + MAC0);
> > > +	outl(dev->dev_addr[4], ioaddr + MAC0 + 4);

> > This is incorrect -- you are only writing one byte of the station address.
> > I think that the proper code is
> > 	outl(cpu_to_le32(*(u32*)(dev->dev_addr + 0)), ioaddr + MAC0 + 0);
> > 	outl(cpu_to_le32(*(u32*)(dev->dev_addr + 4)), ioaddr + MAC0 + 4);
> Hm... I admit I always get terribly confused when it comes to endianness
> issues but isn't the LE ordering already enforced by the fact that
> dev_addr is a u8[] rather than a u32[]?

The endian conversion is confusing.  The typical big-endian PCI bus
implementation orders the bytes so that host writes of addresses and
integers are correct.  When the card does bus-master operations the bytes
are ordered (reversed) so that byte streams are in the correct order, but
addresses and integers are byte reversed.

The RTL8139 doesn't have in-memory descriptors.  It's simplicity makes it
one of the easiest designs to convert to big-endian.  The only endian
conversion is on the data read from the EEPROM, the Rx status the chip
writes to memory, and perhaps generating the multicast filter.

When we do *(u32*)dev_addr on a big-endian we end up with dev_addr[0] in the
high byte, rather than the low byte where it should be on the little-endian
PCI bus.

> > > -		outw(cur_rx - 16, ioaddr + RxBufPtr);
> > > +		outw_f(cur_rx - 16, ioaddr + RxBufPtr);
> > 
> > This is very curious.  It makes me suspicious about what the motherboard
> > chipset is doing to the writes if this doesn't work correctly.
> I'm puzzled as well. That's why I was extra careful that this change 
> indeed fixed the problem before sending out the patch. It did, but I don't
> have the faintest idea as to why. So I guess there are still possible
> lockups hidden in the driver (on certain chipsets). 

Does reading any register avoid the hang, or must it be RxBufPtr?

 | To unsubscribe, send mail to Majordomo@cesdis.gsfc.nasa.gov, and within the
 |  body of the mail, include only the text:
 |   unsubscribe this-list-name youraddress@wherever.org
 | You will be unsubscribed as speedily as possible.