eepro100 driver fixes
PATCH 1/1 eepro100 driver fixes
Hello,
Here is a patch with important eepro100 fixes for 2.4 kernel:
- Big-endian fixes (double cpu->bus conversion).
- "card reports no resources" hardware timing bug workaround. Thanks to Donald Becker.
It may also fix a problem with "wait_for_cmd_done timeout" symptom.
Best regards
Andrey
drivers/net/eepro100.c +9 -6
@@ -29,7 +29,7 @@static const char *version ="eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" -"eepro100.c: $Revision: 1.35 $ 2000/11/17 Modified by Andrey V. Savochkin <[email protected]> and others\n" ; +"eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin <[email protected]> and others\n" ;/* A few user-configurable values that apply to all boards. First set is undocumented and spelled per Intel recommendations. */
@@ -698,6 +698,7 @@This takes less than 10usec and will easily finish before the next action. */ outl (PortReset, ioaddr + SCBPort); +inl (ioaddr + SCBPort);udelay (10 );if (eeprom[3 ] &0x0100 )
@@ -785,6 +786,7 @@#endif /* kernel_bloat */ outl (PortReset, ioaddr + SCBPort); +inl (ioaddr + SCBPort);udelay (10 );/* Return the chip to its original power state. */
@@ -801,7 +803,7 @@ sp->tx_ring = tx_ring_space; sp->tx_ring_dma = tx_ring_dma; sp->lstats = (struct speedo_stats *)(sp->tx_ring +TX_RING_SIZE ); - sp->lstats_dma =cpu_to_le32 (TX_RING_ELEM_DMA (sp,TX_RING_SIZE )); + sp->lstats_dma =TX_RING_ELEM_DMA (sp,TX_RING_SIZE );init_timer (&sp->timer);/* used in ioctl() */ sp->full_duplex = option >=0 && (option &0x10 ) ?1 :0 ;
@@ -1002,7 +1004,9 @@/* Set the segment registers to '0'. */ wait_for_cmd_done (ioaddr + SCBCmd);outl (0 , ioaddr + SCBPointer); -inl (ioaddr + SCBPointer);/* XXX */ +/* impose a delay to avoid a bug */ +inl (ioaddr + SCBPointer); +udelay (10 );outb (RxAddrLoad, ioaddr + SCBCmd);wait_for_cmd_done (ioaddr + SCBCmd);outb (CUCmdBase, ioaddr + SCBCmd);
@@ -1010,7 +1014,6 @@/* Load the statistics block and rx ring addresses. */ wait_for_cmd_done (ioaddr + SCBCmd);outl (sp->lstats_dma, ioaddr + SCBPointer); -inl (ioaddr + SCBPointer);/* XXX */ outb (CUStatsAddr, ioaddr + SCBCmd); sp->lstats->done_marker =0 ;
@@ -1045,7 +1048,7 @@/* Start the chip's Tx process and unmask interrupts. */ wait_for_cmd_done (ioaddr + SCBCmd); -outl (cpu_to_le32 (TX_RING_ELEM_DMA (sp, sp->dirty_tx %TX_RING_SIZE )), +outl (TX_RING_ELEM_DMA (sp, sp->dirty_tx %TX_RING_SIZE ), ioaddr + SCBPointer);/* We are not ACK-ing FCP and ER in the interrupt handler yet so they should remain masked --Dragan */
@@ -1274,7 +1277,7 @@/* Only the command unit has stopped. */ printk (KERN_WARNING "%s: Trying to restart the transmitter...\n" , dev->name); - outl(cpu_to_le32(TX_RING_ELEM_DMA(sp, dirty_tx % TX_RING_SIZE])), + outl(TX_RING_ELEM_DMA(sp, dirty_tx % TX_RING_SIZE]), ioaddr + SCBPointer);outw (CUStart, ioaddr + SCBCmd);reset_mii (dev);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/