patch-2.4.25 linux-2.4.25/drivers/net/e100/e100_main.c
Next file: linux-2.4.25/drivers/net/e100/e100_phy.c
Previous file: linux-2.4.25/drivers/net/e100/e100_eeprom.c
Back to the patch index
Back to the overall index
- Lines: 205
- Date:
2004-02-18 05:36:31.000000000 -0800
- Orig file:
linux-2.4.24/drivers/net/e100/e100_main.c
- Orig date:
2003-11-28 10:26:20.000000000 -0800
diff -urN linux-2.4.24/drivers/net/e100/e100_main.c linux-2.4.25/drivers/net/e100/e100_main.c
@@ -1,7 +1,7 @@
/*******************************************************************************
- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
+ Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
@@ -46,20 +46,20 @@
/* Change Log
*
- * 2.3.30 09/21/03
+ * 2.3.38 12/14/03
+ * o Added netpoll support.
+ * o Added ICH6 device ID support
+ * o Moved to 2.6 APIs: pci_name() and free_netdev().
+ * o Removed some __devinit from some functions that shouldn't be marked
+ * as such (Anton Blanchard [anton@samba.org]).
+ *
+ * 2.3.33 10/21/03
* o Bug fix (Bugzilla 97908): Loading e100 was causing crash on Itanium2
* with HP chipset
* o Bug fix (Bugzilla 101583): e100 can't pass traffic with ipv6
* o Bug fix (Bugzilla 101360): PRO/10+ can't pass traffic
*
* 2.3.27 08/08/03
- * o Bug fix: read skb->len after freeing skb
- * [Andrew Morton] akpm@zip.com.au
- * o Bug fix: 82557 (with National PHY) timeout during init
- * [Adam Kropelin] akropel1@rochester.rr.com
- * o Feature add: allow to change Wake On LAN when EEPROM disabled
- *
- * 2.3.13 05/08/03
*/
#include <linux/config.h>
@@ -80,7 +80,14 @@
"rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
"tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
"tx_heartbeat_errors", "tx_window_errors",
+ /* device-specific stats */
+ "tx_late_collision_errors", "tx_deferred",
+ "tx_single_collisions", "tx_multi_collisions",
+ "rx_collision_detected_errors", "tx_flow_control_pause",
+ "rx_flow_control_pause", "rx_flow_control_unsupported",
+ "tx_tco_packets", "rx_tco_packets",
};
+#define E100_NET_STATS_LEN 21
#define E100_STATS_LEN sizeof(e100_gstrings_stats) / ETH_GSTRING_LEN
static int e100_do_ethtool_ioctl(struct net_device *, struct ifreq *);
@@ -124,8 +131,8 @@
static void e100_non_tx_background(unsigned long);
static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb);
/* Global Data structures and variables */
-char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation";
-char e100_driver_version[]="2.3.30-k1";
+char e100_copyright[] __devinitdata = "Copyright (c) 2004 Intel Corporation";
+char e100_driver_version[]="2.3.38-k1";
const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver";
char e100_short_driver_name[] = "e100";
static int e100nics = 0;
@@ -134,6 +141,11 @@
static void e100_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
static void e100_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
+#ifdef CONFIG_NET_POLL_CONTROLLER
+/* for netdump / net console */
+static void e100_netpoll (struct net_device *dev);
+#endif
+
#ifdef CONFIG_PM
static int e100_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
static int e100_suspend(struct pci_dev *pcid, u32 state);
@@ -598,6 +610,8 @@
&& (bdp->pdev->device < 0x103F))
|| ((bdp->pdev->device >= 0x1050)
&& (bdp->pdev->device <= 0x1057))
+ || ((bdp->pdev->device >= 0x1064)
+ && (bdp->pdev->device <= 0x106B))
|| (bdp->pdev->device == 0x2449)
|| (bdp->pdev->device == 0x2459)
|| (bdp->pdev->device == 0x245D)) {
@@ -631,6 +645,10 @@
dev->set_mac_address = &e100_set_mac;
dev->do_ioctl = &e100_ioctl;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+ dev->poll_controller = e100_netpoll;
+#endif
+
if (bdp->flags & USE_IPCB)
dev->features = NETIF_F_SG | NETIF_F_IP_CSUM |
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
@@ -695,7 +713,7 @@
pci_disable_device(pcid);
err_dev:
pci_set_drvdata(pcid, NULL);
- kfree(dev);
+ free_netdev(dev);
out:
return rc;
}
@@ -717,7 +735,7 @@
e100_dealloc_space(bdp);
pci_set_drvdata(bdp->pdev, NULL);
- kfree(dev);
+ free_netdev(dev);
}
static void __devexit
@@ -746,7 +764,7 @@
--e100nics;
}
-static struct pci_device_id e100_id_table[] __devinitdata = {
+static struct pci_device_id e100_id_table[] = {
{0x8086, 0x1229, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x2449, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x1059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
@@ -770,6 +788,14 @@
{0x8086, 0x1053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x1054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x1055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1066, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1067, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1068, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x1069, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x106A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+ {0x8086, 0x106B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x2459, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0x8086, 0x245D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
{0,} /* This has to be the last entry*/
@@ -1317,7 +1343,7 @@
return 1;
}
-static void __devinit
+static void
e100_tco_workaround(struct e100_private *bdp)
{
int i;
@@ -2507,7 +2533,7 @@
* true: if successfully cleared stat counters
* false: otherwise
*/
-static unsigned char __devinit
+static unsigned char
e100_clr_cntrs(struct e100_private *bdp)
{
volatile u32 *pcmd_complete;
@@ -3176,9 +3202,19 @@
void *addr = ifr->ifr_data;
int i;
- for(i = 0; i < E100_STATS_LEN; i++)
+ for(i = 0; i < E100_NET_STATS_LEN; i++)
stats.data[i] =
((unsigned long *)&bdp->drv_stats.net_stats)[i];
+ stats.data[i++] = bdp->drv_stats.tx_late_col;
+ stats.data[i++] = bdp->drv_stats.tx_ok_defrd;
+ stats.data[i++] = bdp->drv_stats.tx_one_retry;
+ stats.data[i++] = bdp->drv_stats.tx_mt_one_retry;
+ stats.data[i++] = bdp->drv_stats.rcv_cdt_frames;
+ stats.data[i++] = bdp->drv_stats.xmt_fc_pkts;
+ stats.data[i++] = bdp->drv_stats.rcv_fc_pkts;
+ stats.data[i++] = bdp->drv_stats.rcv_fc_unsupported;
+ stats.data[i++] = bdp->drv_stats.xmt_tco_pkts;
+ stats.data[i++] = bdp->drv_stats.rcv_tco_pkts;
if(copy_to_user(addr, &stats, sizeof(stats)))
return -EFAULT;
return 0;
@@ -3582,7 +3618,7 @@
strncpy(info.version, e100_driver_version, sizeof (info.version) - 1);
strncpy(info.fw_version, "N/A",
sizeof (info.fw_version) - 1);
- strncpy(info.bus_info, bdp->pdev->slot_name,
+ strncpy(info.bus_info, pci_name(bdp->pdev),
sizeof (info.bus_info) - 1);
info.n_stats = E100_STATS_LEN;
info.regdump_len = E100_REGS_LEN * sizeof(u32);
@@ -4340,3 +4376,18 @@
}
#endif
+#ifdef CONFIG_NET_POLL_CONTROLLER
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void e100_netpoll (struct net_device *dev)
+{
+ struct e100_private *adapter = dev->priv;
+ disable_irq(adapter->pdev->irq);
+ e100intr (adapter->pdev->irq, dev, NULL);
+ enable_irq(adapter->pdev->irq);
+}
+#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)