patch-2.4.20 linux-2.4.20/drivers/net/eepro.c
Next file: linux-2.4.20/drivers/net/eepro100.c
Previous file: linux-2.4.20/drivers/net/e2100.c
Back to the patch index
Back to the overall index
- Lines: 253
- Date:
Thu Nov 28 15:53:13 2002
- Orig file:
linux-2.4.19/drivers/net/eepro.c
- Orig date:
Mon Nov 19 15:19:42 2001
diff -urN linux-2.4.19/drivers/net/eepro.c linux-2.4.20/drivers/net/eepro.c
@@ -23,6 +23,8 @@
This is a compatibility hardware problem.
Versions:
+ 0.13a in memory shortage, drop packets also in board
+ (Michael Westermann <mw@microdata-pos.de>, 07/30/2002)
0.13 irq sharing, rewrote probe function, fixed a nasty bug in
hardware_send_packet and a major cleanup (aris, 11/08/2001)
0.12d fixing a problem with single card detected as eight eth devices
@@ -665,37 +667,37 @@
i = inb(dev->base_addr + ID_REG);
printk(KERN_DEBUG " id: %#x ",i);
- printk(KERN_DEBUG " io: %#x ", (unsigned)dev->base_addr);
+ printk(" io: %#x ", (unsigned)dev->base_addr);
switch (lp->eepro) {
case LAN595FX_10ISA:
- printk(KERN_INFO "%s: Intel EtherExpress 10 ISA\n at %#x,",
+ printk("%s: Intel EtherExpress 10 ISA\n at %#x,",
dev->name, (unsigned)dev->base_addr);
break;
case LAN595FX:
- printk(KERN_INFO "%s: Intel EtherExpress Pro/10+ ISA\n at %#x,",
+ printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,",
dev->name, (unsigned)dev->base_addr);
break;
case LAN595TX:
- printk(KERN_INFO "%s: Intel EtherExpress Pro/10 ISA at %#x,",
+ printk("%s: Intel EtherExpress Pro/10 ISA at %#x,",
dev->name, (unsigned)dev->base_addr);
break;
case LAN595:
- printk(KERN_INFO "%s: Intel 82595-based lan card at %#x,",
+ printk("%s: Intel 82595-based lan card at %#x,",
dev->name, (unsigned)dev->base_addr);
}
for (i=0; i < 6; i++)
- printk(KERN_INFO "%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
+ printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
if (net_debug > 3)
printk(KERN_DEBUG ", %dK RCV buffer",
(int)(lp->rcv_ram)/1024);
if (dev->irq > 2)
- printk(KERN_INFO ", IRQ %d, %s.\n", dev->irq, ifmap[dev->if_port]);
+ printk(", IRQ %d, %s.\n", dev->irq, ifmap[dev->if_port]);
else
- printk(KERN_INFO ", %s.\n", ifmap[dev->if_port]);
+ printk(", %s.\n", ifmap[dev->if_port]);
if (net_debug > 3) {
i = read_eeprom(dev->base_addr, 5, dev);
@@ -730,27 +732,27 @@
goto exit;
}
- /* We seem to have the 82595 signature, let's
- play with its counter (last 2 bits of
- register 2 of bank 0) to be sure. */
+ /* We seem to have the 82595 signature, let's
+ play with its counter (last 2 bits of
+ register 2 of bank 0) to be sure. */
- counter = (id & R_ROBIN_BITS);
+ counter = (id & R_ROBIN_BITS);
if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS)!=(counter + 0x40)) {
retval = -ENODEV;
goto exit;
}
- /* Initialize the device structure */
- dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
+ /* Initialize the device structure */
+ dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
if (!dev->priv) {
retval = -ENOMEM;
goto exit;
}
- memset(dev->priv, 0, sizeof(struct eepro_local));
+ memset(dev->priv, 0, sizeof(struct eepro_local));
- lp = (struct eepro_local *)dev->priv;
+ lp = (struct eepro_local *)dev->priv;
/* default values */
lp->eepro = 0;
@@ -759,37 +761,37 @@
lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO;
lp->eeprom_reg = EEPROM_REG_PRO;
- /* Now, get the ethernet hardware address from
- the EEPROM */
- station_addr[0] = read_eeprom(ioaddr, 2, dev);
-
- /* FIXME - find another way to know that we've found
- * an Etherexpress 10
- */
- if (station_addr[0] == 0x0000 ||
- station_addr[0] == 0xffff) {
- lp->eepro = LAN595FX_10ISA;
+ /* Now, get the ethernet hardware address from
+ the EEPROM */
+ station_addr[0] = read_eeprom(ioaddr, 2, dev);
+
+ /* FIXME - find another way to know that we've found
+ * an Etherexpress 10
+ */
+ if (station_addr[0] == 0x0000 ||
+ station_addr[0] == 0xffff) {
+ lp->eepro = LAN595FX_10ISA;
lp->eeprom_reg = EEPROM_REG_10;
lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10;
lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10;
lp->xmt_bar = XMT_BAR_10;
station_addr[0] = read_eeprom(ioaddr, 2, dev);
- }
- station_addr[1] = read_eeprom(ioaddr, 3, dev);
- station_addr[2] = read_eeprom(ioaddr, 4, dev);
+ }
+ station_addr[1] = read_eeprom(ioaddr, 3, dev);
+ station_addr[2] = read_eeprom(ioaddr, 4, dev);
if (!lp->eepro) {
if (read_eeprom(ioaddr,7,dev)== ee_FX_INT2IRQ)
lp->eepro = 2;
else if (station_addr[2] == SA_ADDR1)
lp->eepro = 1;
- }
+ }
- /* Fill in the 'dev' fields. */
- dev->base_addr = ioaddr;
+ /* Fill in the 'dev' fields. */
+ dev->base_addr = ioaddr;
for (i=0; i < 6; i++)
- dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
+ dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
/* RX buffer must be more than 3K and less than 29K */
if (dev->mem_end < 3072 || dev->mem_end > 29696)
@@ -798,57 +800,58 @@
/* calculate {xmt,rcv}_{lower,upper}_limit */
eepro_recalc(dev);
-
- if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE))
- dev->if_port = BNC;
+ if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE))
+ dev->if_port = BNC;
else
dev->if_port = TPE;
if ((dev->irq < 2) && (lp->eepro!=0)) {
- i = read_eeprom(ioaddr, 1, dev);
- irqMask = read_eeprom(ioaddr, 7, dev);
- i &= 0x07; /* Mask off INT number */
-
- for (j=0; ((j<16) && (i>=0)); j++) {
- if ((irqMask & (1<<j))!=0) {
- if (i==0) {
- dev->irq = j;
- break; /* found bit corresponding to irq */
- }
- i--; /* count bits set in irqMask */
- }
+ i = read_eeprom(ioaddr, 1, dev);
+ irqMask = read_eeprom(ioaddr, 7, dev);
+ i &= 0x07; /* Mask off INT number */
+
+ for (j=0; ((j<16) && (i>=0)); j++) {
+ if ((irqMask & (1<<j))!=0) {
+ if (i==0) {
+ dev->irq = j;
+ break; /* found bit corresponding to irq */
}
- if (dev->irq < 2) {
+ i--; /* count bits set in irqMask */
+ }
+ }
+ if (dev->irq < 2) {
printk(KERN_ERR " Duh! illegal interrupt vector stored in EEPROM.\n");
- kfree(dev->priv);
+ kfree(dev->priv);
retval = -ENODEV;
goto freeall;
- } else
- if (dev->irq==2) dev->irq = 9;
- }
-
- /* Grab the region so we can find another board if autoIRQ fails. */
- request_region(ioaddr, EEPRO_IO_EXTENT, dev->name);
-
- ((struct eepro_local *)dev->priv)->lock = SPIN_LOCK_UNLOCKED;
+ }
+ else if (dev->irq==2) dev->irq = 9;
+ }
- dev->open = eepro_open;
- dev->stop = eepro_close;
- dev->hard_start_xmit = eepro_send_packet;
- dev->get_stats = eepro_get_stats;
- dev->set_multicast_list = &set_multicast_list;
- dev->tx_timeout = eepro_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-
- /* Fill in the fields of the device structure with
- ethernet generic values */
- ether_setup(dev);
+ /* Grab the region so we can find another board if autoIRQ fails. */
+ if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) {
+ printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n", ioaddr);
+ goto freeall;
+ }
+ ((struct eepro_local *)dev->priv)->lock = SPIN_LOCK_UNLOCKED;
+
+ dev->open = eepro_open;
+ dev->stop = eepro_close;
+ dev->hard_start_xmit = eepro_send_packet;
+ dev->get_stats = eepro_get_stats;
+ dev->set_multicast_list = &set_multicast_list;
+ dev->tx_timeout = eepro_tx_timeout;
+ dev->watchdog_timeo = TX_TIMEOUT;
+
+ /* Fill in the fields of the device structure with
+ ethernet generic values */
+ ether_setup(dev);
/* print boot time info */
eepro_print_info(dev);
/* reset 82595 */
- eepro_reset(ioaddr);
+ eepro_reset(ioaddr);
exit:
return retval;
@@ -1578,6 +1581,10 @@
if (skb == NULL) {
printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
lp->stats.rx_dropped++;
+ rcv_car = lp->rx_start + RCV_HEADER + rcv_size;
+ lp->rx_start = rcv_next_frame;
+ outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG);
+
break;
}
skb->dev = dev;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)