Commit 54d5ef53 authored by Jeff Garzik's avatar Jeff Garzik

Merge bk://gkernel@bkbits.net/netdev-2.6

into pobox.com:/spare/repo/netdev-2.6/ALL
parents 30e74fea b1106618
...@@ -1586,6 +1586,8 @@ L: oprofile-list@lists.sf.net ...@@ -1586,6 +1586,8 @@ L: oprofile-list@lists.sf.net
S: Maintained S: Maintained
ORINOCO DRIVER ORINOCO DRIVER
P: Pavel Roskin
M: proski@gnu.org
P: David Gibson P: David Gibson
M: hermes@gibson.dropbear.id.au M: hermes@gibson.dropbear.id.au
W: http://www.ozlabs.org/people/dgibson/dldwd W: http://www.ozlabs.org/people/dgibson/dldwd
......
...@@ -306,10 +306,10 @@ CONFIG_EEPRO100=y ...@@ -306,10 +306,10 @@ CONFIG_EEPRO100=y
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set # CONFIG_TIGON3 is not set
CONFIG_MV64340_ETH=y CONFIG_MV643XX_ETH=y
CONFIG_MV64340_ETH_0=y CONFIG_MV643XX_ETH_0=y
CONFIG_MV64340_ETH_1=y CONFIG_MV643XX_ETH_1=y
CONFIG_MV64340_ETH_2=y CONFIG_MV643XX_ETH_2=y
# #
# Ethernet (10000 Mbit) # Ethernet (10000 Mbit)
......
...@@ -304,7 +304,7 @@ CONFIG_NET_ETHERNET=y ...@@ -304,7 +304,7 @@ CONFIG_NET_ETHERNET=y
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set # CONFIG_TIGON3 is not set
# CONFIG_MV64340_ETH is not set # CONFIG_MV643XX_ETH is not set
# #
# Ethernet (10000 Mbit) # Ethernet (10000 Mbit)
......
...@@ -40,7 +40,7 @@ const char *get_system_type(void) ...@@ -40,7 +40,7 @@ const char *get_system_type(void)
return "Momentum Jaguar-ATX"; return "Momentum Jaguar-ATX";
} }
#ifdef CONFIG_MV64340_ETH #ifdef CONFIG_MV643XX_ETH
extern unsigned char prom_mac_addr_base[6]; extern unsigned char prom_mac_addr_base[6];
static void burn_clocks(void) static void burn_clocks(void)
...@@ -230,7 +230,7 @@ void __init prom_init(void) ...@@ -230,7 +230,7 @@ void __init prom_init(void)
mips_machgroup = MACH_GROUP_MOMENCO; mips_machgroup = MACH_GROUP_MOMENCO;
mips_machtype = MACH_MOMENCO_JAGUAR_ATX; mips_machtype = MACH_MOMENCO_JAGUAR_ATX;
#ifdef CONFIG_MV64340_ETH #ifdef CONFIG_MV643XX_ETH
/* get the base MAC address for on-board ethernet ports */ /* get the base MAC address for on-board ethernet ports */
get_mac(prom_mac_addr_base); get_mac(prom_mac_addr_base);
#endif #endif
......
...@@ -32,7 +32,7 @@ struct callvectors* debug_vectors; ...@@ -32,7 +32,7 @@ struct callvectors* debug_vectors;
extern unsigned long marvell_base; extern unsigned long marvell_base;
extern unsigned long cpu_clock; extern unsigned long cpu_clock;
#ifdef CONFIG_MV64340_ETH #ifdef CONFIG_MV643XX_ETH
extern unsigned char prom_mac_addr_base[6]; extern unsigned char prom_mac_addr_base[6];
#endif #endif
...@@ -45,7 +45,7 @@ const char *get_system_type(void) ...@@ -45,7 +45,7 @@ const char *get_system_type(void)
#endif #endif
} }
#ifdef CONFIG_MV64340_ETH #ifdef CONFIG_MV643XX_ETH
static void burn_clocks(void) static void burn_clocks(void)
{ {
int i; int i;
...@@ -227,7 +227,7 @@ void __init prom_init(void) ...@@ -227,7 +227,7 @@ void __init prom_init(void)
mips_machgroup = MACH_GROUP_MOMENCO; mips_machgroup = MACH_GROUP_MOMENCO;
mips_machtype = MACH_MOMENCO_OCELOT_C; mips_machtype = MACH_MOMENCO_OCELOT_C;
#ifdef CONFIG_MV64340_ETH #ifdef CONFIG_MV643XX_ETH
/* get the base MAC address for on-board ethernet ports */ /* get the base MAC address for on-board ethernet ports */
get_mac(prom_mac_addr_base); get_mac(prom_mac_addr_base);
#endif #endif
......
...@@ -613,7 +613,7 @@ static int rtl8139_open (struct net_device *dev); ...@@ -613,7 +613,7 @@ static int rtl8139_open (struct net_device *dev);
static int mdio_read (struct net_device *dev, int phy_id, int location); static int mdio_read (struct net_device *dev, int phy_id, int location);
static void mdio_write (struct net_device *dev, int phy_id, int location, static void mdio_write (struct net_device *dev, int phy_id, int location,
int val); int val);
static inline void rtl8139_start_thread(struct net_device *dev); static void rtl8139_start_thread(struct net_device *dev);
static void rtl8139_tx_timeout (struct net_device *dev); static void rtl8139_tx_timeout (struct net_device *dev);
static void rtl8139_init_ring (struct net_device *dev); static void rtl8139_init_ring (struct net_device *dev);
static int rtl8139_start_xmit (struct sk_buff *skb, static int rtl8139_start_xmit (struct sk_buff *skb,
...@@ -1643,7 +1643,7 @@ static int rtl8139_thread (void *data) ...@@ -1643,7 +1643,7 @@ static int rtl8139_thread (void *data)
complete_and_exit (&tp->thr_exited, 0); complete_and_exit (&tp->thr_exited, 0);
} }
static inline void rtl8139_start_thread(struct net_device *dev) static void rtl8139_start_thread(struct net_device *dev)
{ {
struct rtl8139_private *tp = dev->priv; struct rtl8139_private *tp = dev->priv;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
module by all drivers that require it. module by all drivers that require it.
Alan Cox : Spinlocking work, added 'BUG_83C690' Alan Cox : Spinlocking work, added 'BUG_83C690'
Paul Gortmaker : Separate out Tx timeout code from Tx path. Paul Gortmaker : Separate out Tx timeout code from Tx path.
Paul Gortmaker : Remove old unused single Tx buffer code.
Sources: Sources:
The National Semiconductor LAN Databook, and the 3Com 3c503 databook. The National Semiconductor LAN Databook, and the 3Com 3c503 databook.
...@@ -289,8 +290,6 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -289,8 +290,6 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
send_length = ETH_ZLEN < length ? length : ETH_ZLEN; send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
#ifdef EI_PINGPONG
/* /*
* We have two Tx slots available for use. Find the first free * We have two Tx slots available for use. Find the first free
* slot, and then perform some sanity checks. With two Tx bufs, * slot, and then perform some sanity checks. With two Tx bufs,
...@@ -309,7 +308,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -309,7 +308,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
} }
else if (ei_local->tx2 == 0) else if (ei_local->tx2 == 0)
{ {
output_page = ei_local->tx_start_page + TX_1X_PAGES; output_page = ei_local->tx_start_page + TX_PAGES/2;
ei_local->tx2 = send_length; ei_local->tx2 = send_length;
if (ei_debug && ei_local->tx1 > 0) if (ei_debug && ei_local->tx1 > 0)
printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n", printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
...@@ -366,28 +365,6 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -366,28 +365,6 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
else else
netif_start_queue(dev); netif_start_queue(dev);
#else /* EI_PINGPONG */
/*
* Only one Tx buffer in use. You need two Tx bufs to come close to
* back-to-back transmits. Expect a 20 -> 25% performance hit on
* reasonable hardware if you only use one Tx buffer.
*/
if (length == send_length)
ei_block_output(dev, length, skb->data, ei_local->tx_start_page);
else {
memset(scratch, 0, ETH_ZLEN);
memcpy(scratch, skb->data, skb->len);
ei_block_output(dev, ETH_ZLEN, scratch, ei_local->tx_start_page);
}
ei_local->txing = 1;
NS8390_trigger_send(dev, send_length, ei_local->tx_start_page);
dev->trans_start = jiffies;
netif_stop_queue(dev);
#endif /* EI_PINGPONG */
/* Turn 8390 interrupts back on. */ /* Turn 8390 interrupts back on. */
ei_local->irqlock = 0; ei_local->irqlock = 0;
outb_p(ENISR_ALL, e8390_base + EN0_IMR); outb_p(ENISR_ALL, e8390_base + EN0_IMR);
...@@ -590,8 +567,6 @@ static void ei_tx_intr(struct net_device *dev) ...@@ -590,8 +567,6 @@ static void ei_tx_intr(struct net_device *dev)
outb_p(ENISR_TX, e8390_base + EN0_ISR); /* Ack intr. */ outb_p(ENISR_TX, e8390_base + EN0_ISR); /* Ack intr. */
#ifdef EI_PINGPONG
/* /*
* There are two Tx buffers, see which one finished, and trigger * There are two Tx buffers, see which one finished, and trigger
* the send of another one if it exists. * the send of another one if it exists.
...@@ -634,13 +609,6 @@ static void ei_tx_intr(struct net_device *dev) ...@@ -634,13 +609,6 @@ static void ei_tx_intr(struct net_device *dev)
// else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n", // else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n",
// dev->name, ei_local->lasttx); // dev->name, ei_local->lasttx);
#else /* EI_PINGPONG */
/*
* Single Tx buffer: mark it free so another packet can be loaded.
*/
ei_local->txing = 0;
#endif
/* Minimize Tx latency: update the statistics after we restart TXing. */ /* Minimize Tx latency: update the statistics after we restart TXing. */
if (status & ENTSR_COL) if (status & ENTSR_COL)
ei_local->stat.collisions++; ei_local->stat.collisions++;
......
...@@ -12,17 +12,7 @@ ...@@ -12,17 +12,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#define TX_2X_PAGES 12 #define TX_PAGES 12 /* Two Tx slots */
#define TX_1X_PAGES 6
/* Should always use two Tx slots to get back-to-back transmits. */
#define EI_PINGPONG
#ifdef EI_PINGPONG
#define TX_PAGES TX_2X_PAGES
#else
#define TX_PAGES TX_1X_PAGES
#endif
#define ETHER_ADDR_LEN 6 #define ETHER_ADDR_LEN 6
......
...@@ -1746,6 +1746,7 @@ config VIA_VELOCITY ...@@ -1746,6 +1746,7 @@ config VIA_VELOCITY
tristate "VIA Velocity support" tristate "VIA Velocity support"
depends on NET_PCI && PCI depends on NET_PCI && PCI
select CRC32 select CRC32
select CRC16
select MII select MII
help help
If you have a VIA "Velocity" based network card say Y here. If you have a VIA "Velocity" based network card say Y here.
...@@ -2043,6 +2044,11 @@ config R8169 ...@@ -2043,6 +2044,11 @@ config R8169
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called r8169. This is recommended. will be called r8169. This is recommended.
config R8169_NAPI
bool "Use Rx and Tx Polling (NAPI) (EXPERIMENTAL)"
depends on R8169 && EXPERIMENTAL
config SK98LIN config SK98LIN
tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support" tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
depends on PCI depends on PCI
...@@ -2131,6 +2137,45 @@ config TIGON3 ...@@ -2131,6 +2137,45 @@ config TIGON3
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called tg3. This is recommended. will be called tg3. This is recommended.
config GIANFAR
tristate "Gianfar Ethernet"
depends on 85xx
help
This driver supports the Gigabit TSEC on the MPC85xx
family of chips, and the FEC on the 8540
config GFAR_NAPI
bool "NAPI Support"
depends on GIANFAR
config MV643XX_ETH
tristate "MV-643XX Ethernet support"
depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX
help
This driver supports the gigabit Ethernet on the Marvell MV643XX
chipset which is used in the Momenco Ocelot C and Jaguar ATX.
config MV643XX_ETH_0
bool "MV-643XX Port 0"
depends on MV643XX_ETH
help
This enables support for Port 0 of the Marvell MV643XX Gigabit
Ethernet.
config MV643XX_ETH_1
bool "MV-643XX Port 1"
depends on MV643XX_ETH
help
This enables support for Port 1 of the Marvell MV643XX Gigabit
Ethernet.
config MV643XX_ETH_2
bool "MV-643XX Port 2"
depends on MV643XX_ETH
help
This enables support for Port 2 of the Marvell MV643XX Gigabit
Ethernet.
endmenu endmenu
# #
......
...@@ -10,6 +10,7 @@ obj-$(CONFIG_E1000) += e1000/ ...@@ -10,6 +10,7 @@ obj-$(CONFIG_E1000) += e1000/
obj-$(CONFIG_IBM_EMAC) += ibm_emac/ obj-$(CONFIG_IBM_EMAC) += ibm_emac/
obj-$(CONFIG_IXGB) += ixgb/ obj-$(CONFIG_IXGB) += ixgb/
obj-$(CONFIG_BONDING) += bonding/ obj-$(CONFIG_BONDING) += bonding/
obj-$(CONFIG_GIANFAR) += gianfar.o gianfar_ethtool.o gianfar_phy.o
# #
# link order important here # link order important here
...@@ -95,6 +96,8 @@ obj-$(CONFIG_B44) += b44.o ...@@ -95,6 +96,8 @@ obj-$(CONFIG_B44) += b44.o
obj-$(CONFIG_FORCEDETH) += forcedeth.o obj-$(CONFIG_FORCEDETH) += forcedeth.o
obj-$(CONFIG_NE_H8300) += ne-h8300.o 8390.o obj-$(CONFIG_NE_H8300) += ne-h8300.o 8390.o
obj-$(CONFIG_MV643XX_ETH) += mv643xx_eth.o
obj-$(CONFIG_PPP) += ppp_generic.o slhc.o obj-$(CONFIG_PPP) += ppp_generic.o slhc.o
obj-$(CONFIG_PPP_ASYNC) += ppp_async.o obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
......
This diff is collapsed.
...@@ -693,7 +693,7 @@ struct ace_private ...@@ -693,7 +693,7 @@ struct ace_private
int board_idx; int board_idx;
u16 pci_command; u16 pci_command;
u8 pci_latency; u8 pci_latency;
char name[48]; const char *name;
#ifdef INDEX_DEBUG #ifdef INDEX_DEBUG
spinlock_t debug_lock spinlock_t debug_lock
__attribute__ ((aligned (SMP_CACHE_BYTES))); __attribute__ ((aligned (SMP_CACHE_BYTES)));
......
...@@ -87,9 +87,8 @@ ...@@ -87,9 +87,8 @@
* cb_to_use is the next CB to use for queuing a command; cb_to_clean * cb_to_use is the next CB to use for queuing a command; cb_to_clean
* is the next CB to check for completion; cb_to_send is the first * is the next CB to check for completion; cb_to_send is the first
* CB to start on in case of a previous failure to resume. CB clean * CB to start on in case of a previous failure to resume. CB clean
* up happens in interrupt context in response to a CU interrupt, or * up happens in interrupt context in response to a CU interrupt.
* in dev->poll in the case where NAPI is enabled. cbs_avail keeps * cbs_avail keeps track of number of free CB resources available.
* track of number of free CB resources available.
* *
* Hardware padding of short packets to minimum packet size is * Hardware padding of short packets to minimum packet size is
* enabled. 82557 pads with 7Eh, while the later controllers pad * enabled. 82557 pads with 7Eh, while the later controllers pad
...@@ -112,9 +111,8 @@ ...@@ -112,9 +111,8 @@
* replacement RFDs cannot be allocated, or the RU goes non-active, * replacement RFDs cannot be allocated, or the RU goes non-active,
* the RU must be restarted. Frame arrival generates an interrupt, * the RU must be restarted. Frame arrival generates an interrupt,
* and Rx indication and re-allocation happen in the same context, * and Rx indication and re-allocation happen in the same context,
* therefore no locking is required. If NAPI is enabled, this work * therefore no locking is required. A software-generated interrupt
* happens in dev->poll. A software-generated interrupt is gen- * is generated from the watchdog to recover from a failed allocation
* erated from the watchdog to recover from a failed allocation
* senario where all Rx resources have been indicated and none re- * senario where all Rx resources have been indicated and none re-
* placed. * placed.
* *
...@@ -126,8 +124,6 @@ ...@@ -126,8 +124,6 @@
* supported. Tx Scatter/Gather is not supported. Jumbo Frames is * supported. Tx Scatter/Gather is not supported. Jumbo Frames is
* not supported (hardware limitation). * not supported (hardware limitation).
* *
* NAPI support is enabled with CONFIG_E100_NAPI.
*
* MagicPacket(tm) WoL support is enabled/disabled via ethtool. * MagicPacket(tm) WoL support is enabled/disabled via ethtool.
* *
* Thanks to JC (jchapman@katalix.com) for helping with * Thanks to JC (jchapman@katalix.com) for helping with
...@@ -158,7 +154,8 @@ ...@@ -158,7 +154,8 @@
#define DRV_NAME "e100" #define DRV_NAME "e100"
#define DRV_VERSION "3.0.18" #define DRV_EXT "-NAPI"
#define DRV_VERSION "3.0.27-k2"DRV_EXT
#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"
#define DRV_COPYRIGHT "Copyright(c) 1999-2004 Intel Corporation" #define DRV_COPYRIGHT "Copyright(c) 1999-2004 Intel Corporation"
#define PFX DRV_NAME ": " #define PFX DRV_NAME ": "
...@@ -201,6 +198,8 @@ static struct pci_device_id e100_id_table[] = { ...@@ -201,6 +198,8 @@ static struct pci_device_id e100_id_table[] = {
INTEL_8255X_ETHERNET_DEVICE(0x1053, 5), INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
INTEL_8255X_ETHERNET_DEVICE(0x1054, 5), INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
INTEL_8255X_ETHERNET_DEVICE(0x1055, 5), INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
INTEL_8255X_ETHERNET_DEVICE(0x1064, 6), INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
INTEL_8255X_ETHERNET_DEVICE(0x1065, 6), INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
INTEL_8255X_ETHERNET_DEVICE(0x1066, 6), INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
...@@ -242,6 +241,7 @@ enum phy { ...@@ -242,6 +241,7 @@ enum phy {
phy_nsc_tx = 0x5C002000, phy_nsc_tx = 0x5C002000,
phy_82562_et = 0x033002A8, phy_82562_et = 0x033002A8,
phy_82562_em = 0x032002A8, phy_82562_em = 0x032002A8,
phy_82562_ek = 0x031002A8,
phy_82562_eh = 0x017002A8, phy_82562_eh = 0x017002A8,
phy_unknown = 0xFFFFFFFF, phy_unknown = 0xFFFFFFFF,
}; };
...@@ -330,11 +330,16 @@ enum eeprom_op { ...@@ -330,11 +330,16 @@ enum eeprom_op {
}; };
enum eeprom_offsets { enum eeprom_offsets {
eeprom_cnfg_mdix = 0x03,
eeprom_id = 0x0A, eeprom_id = 0x0A,
eeprom_config_asf = 0x0D, eeprom_config_asf = 0x0D,
eeprom_smbus_addr = 0x90, eeprom_smbus_addr = 0x90,
}; };
enum eeprom_cnfg_mdix {
eeprom_mdix_enabled = 0x0080,
};
enum eeprom_id { enum eeprom_id {
eeprom_id_wol = 0x0020, eeprom_id_wol = 0x0020,
}; };
...@@ -350,10 +355,12 @@ enum cb_status { ...@@ -350,10 +355,12 @@ enum cb_status {
}; };
enum cb_command { enum cb_command {
cb_nop = 0x0000,
cb_iaaddr = 0x0001, cb_iaaddr = 0x0001,
cb_config = 0x0002, cb_config = 0x0002,
cb_multi = 0x0003, cb_multi = 0x0003,
cb_tx = 0x0004, cb_tx = 0x0004,
cb_ucode = 0x0005,
cb_dump = 0x0006, cb_dump = 0x0006,
cb_tx_sf = 0x0008, cb_tx_sf = 0x0008,
cb_cid = 0x1f00, cb_cid = 0x1f00,
...@@ -428,12 +435,14 @@ struct multi { ...@@ -428,12 +435,14 @@ struct multi {
}; };
/* Important: keep total struct u32-aligned */ /* Important: keep total struct u32-aligned */
#define UCODE_SIZE 134
struct cb { struct cb {
u16 status; u16 status;
u16 command; u16 command;
u32 link; u32 link;
union { union {
u8 iaaddr[ETH_ALEN]; u8 iaaddr[ETH_ALEN];
u32 ucode[UCODE_SIZE];
struct config config; struct config config;
struct multi multi; struct multi multi;
struct { struct {
...@@ -548,6 +557,7 @@ struct nic { ...@@ -548,6 +557,7 @@ struct nic {
u32 rx_fc_pause; u32 rx_fc_pause;
u32 rx_fc_unsupported; u32 rx_fc_unsupported;
u32 rx_tco_frames; u32 rx_tco_frames;
u32 rx_over_length_errors;
u8 rev_id; u8 rev_id;
u16 leds; u16 leds;
...@@ -980,6 +990,27 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb) ...@@ -980,6 +990,27 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]); c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
} }
static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
{
int i;
static const u32 ucode[UCODE_SIZE] = {
/* NFS packets are misinterpreted as TCO packets and
* incorrectly routed to the BMC over SMBus. This
* microcode patch checks the fragmented IP bit in the
* NFS/UDP header to distinguish between NFS and TCO. */
0x0EF70E36, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF,
0x1FFF1FFF, 0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000,
0x00906EFD, 0x00900EFD, 0x00E00EF8,
};
if(nic->mac == mac_82551_F || nic->mac == mac_82551_10) {
for(i = 0; i < UCODE_SIZE; i++)
cb->u.ucode[i] = cpu_to_le32(ucode[i]);
cb->command = cpu_to_le16(cb_ucode);
} else
cb->command = cpu_to_le16(cb_nop);
}
static void e100_setup_iaaddr(struct nic *nic, struct cb *cb, static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
struct sk_buff *skb) struct sk_buff *skb)
{ {
...@@ -1045,7 +1076,9 @@ static int e100_phy_init(struct nic *nic) ...@@ -1045,7 +1076,9 @@ static int e100_phy_init(struct nic *nic)
mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong); mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
} }
if(nic->mac >= mac_82550_D102) if((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
(mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled)))
/* enable/disable MDI/MDI-X auto-switching */ /* enable/disable MDI/MDI-X auto-switching */
mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG, mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH); nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
...@@ -1069,6 +1102,8 @@ static int e100_hw_init(struct nic *nic) ...@@ -1069,6 +1102,8 @@ static int e100_hw_init(struct nic *nic)
return err; return err;
if((err = e100_exec_cmd(nic, ruc_load_base, 0))) if((err = e100_exec_cmd(nic, ruc_load_base, 0)))
return err; return err;
if((err = e100_exec_cb(nic, NULL, e100_load_ucode)))
return err;
if((err = e100_exec_cb(nic, NULL, e100_configure))) if((err = e100_exec_cb(nic, NULL, e100_configure)))
return err; return err;
if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr))) if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
...@@ -1143,9 +1178,11 @@ static void e100_update_stats(struct nic *nic) ...@@ -1143,9 +1178,11 @@ static void e100_update_stats(struct nic *nic)
ns->tx_errors += le32_to_cpu(s->tx_max_collisions) + ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
le32_to_cpu(s->tx_lost_crs); le32_to_cpu(s->tx_lost_crs);
ns->rx_dropped += le32_to_cpu(s->rx_resource_errors); ns->rx_dropped += le32_to_cpu(s->rx_resource_errors);
ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors); ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
nic->rx_over_length_errors;
ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors); ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors); ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors); ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
ns->rx_errors += le32_to_cpu(s->rx_crc_errors) + ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
le32_to_cpu(s->rx_alignment_errors) + le32_to_cpu(s->rx_alignment_errors) +
...@@ -1456,18 +1493,14 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx, ...@@ -1456,18 +1493,14 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx,
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} else if(actual_size > nic->netdev->mtu + VLAN_ETH_HLEN) { } else if(actual_size > nic->netdev->mtu + VLAN_ETH_HLEN) {
/* Don't indicate oversized frames */ /* Don't indicate oversized frames */
nic->net_stats.rx_over_errors++; nic->rx_over_length_errors++;
nic->net_stats.rx_dropped++; nic->net_stats.rx_dropped++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} else { } else {
nic->net_stats.rx_packets++; nic->net_stats.rx_packets++;
nic->net_stats.rx_bytes += actual_size; nic->net_stats.rx_bytes += actual_size;
nic->netdev->last_rx = jiffies; nic->netdev->last_rx = jiffies;
#ifdef CONFIG_E100_NAPI
netif_receive_skb(skb); netif_receive_skb(skb);
#else
netif_rx(skb);
#endif
if(work_done) if(work_done)
(*work_done)++; (*work_done)++;
} }
...@@ -1562,20 +1595,12 @@ static irqreturn_t e100_intr(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1562,20 +1595,12 @@ static irqreturn_t e100_intr(int irq, void *dev_id, struct pt_regs *regs)
if(stat_ack & stat_ack_rnr) if(stat_ack & stat_ack_rnr)
nic->ru_running = 0; nic->ru_running = 0;
#ifdef CONFIG_E100_NAPI
e100_disable_irq(nic); e100_disable_irq(nic);
netif_rx_schedule(netdev); netif_rx_schedule(netdev);
#else
if(stat_ack & stat_ack_rx)
e100_rx_clean(nic, NULL, 0);
if(stat_ack & stat_ack_tx)
e100_tx_clean(nic);
#endif
return IRQ_HANDLED; return IRQ_HANDLED;
} }
#ifdef CONFIG_E100_NAPI
static int e100_poll(struct net_device *netdev, int *budget) static int e100_poll(struct net_device *netdev, int *budget)
{ {
struct nic *nic = netdev_priv(netdev); struct nic *nic = netdev_priv(netdev);
...@@ -1598,7 +1623,6 @@ static int e100_poll(struct net_device *netdev, int *budget) ...@@ -1598,7 +1623,6 @@ static int e100_poll(struct net_device *netdev, int *budget)
return 1; return 1;
} }
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static void e100_netpoll(struct net_device *netdev) static void e100_netpoll(struct net_device *netdev)
...@@ -1641,7 +1665,7 @@ static int e100_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -1641,7 +1665,7 @@ static int e100_change_mtu(struct net_device *netdev, int new_mtu)
static int e100_asf(struct nic *nic) static int e100_asf(struct nic *nic)
{ {
/* ASF can be enabled from eeprom */ /* ASF can be enabled from eeprom */
return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1055) && return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
(nic->eeprom[eeprom_config_asf] & eeprom_asf) && (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
!(nic->eeprom[eeprom_config_asf] & eeprom_gcl) && !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE)); ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
...@@ -1961,18 +1985,27 @@ static int e100_diag_test_count(struct net_device *netdev) ...@@ -1961,18 +1985,27 @@ static int e100_diag_test_count(struct net_device *netdev)
static void e100_diag_test(struct net_device *netdev, static void e100_diag_test(struct net_device *netdev,
struct ethtool_test *test, u64 *data) struct ethtool_test *test, u64 *data)
{ {
struct ethtool_cmd cmd;
struct nic *nic = netdev_priv(netdev); struct nic *nic = netdev_priv(netdev);
int i; int i, err;
memset(data, 0, E100_TEST_LEN * sizeof(u64)); memset(data, 0, E100_TEST_LEN * sizeof(u64));
data[0] = !mii_link_ok(&nic->mii); data[0] = !mii_link_ok(&nic->mii);
data[1] = e100_eeprom_load(nic); data[1] = e100_eeprom_load(nic);
if(test->flags & ETH_TEST_FL_OFFLINE) { if(test->flags & ETH_TEST_FL_OFFLINE) {
/* save speed, duplex & autoneg settings */
err = mii_ethtool_gset(&nic->mii, &cmd);
if(netif_running(netdev)) if(netif_running(netdev))
e100_down(nic); e100_down(nic);
data[2] = e100_self_test(nic); data[2] = e100_self_test(nic);
data[3] = e100_loopback_test(nic, lb_mac); data[3] = e100_loopback_test(nic, lb_mac);
data[4] = e100_loopback_test(nic, lb_phy); data[4] = e100_loopback_test(nic, lb_phy);
/* restore speed, duplex & autoneg settings */
err = mii_ethtool_sset(&nic->mii, &cmd);
if(netif_running(netdev)) if(netif_running(netdev))
e100_up(nic); e100_up(nic);
} }
...@@ -2135,10 +2168,8 @@ static int __devinit e100_probe(struct pci_dev *pdev, ...@@ -2135,10 +2168,8 @@ static int __devinit e100_probe(struct pci_dev *pdev,
SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops); SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
netdev->tx_timeout = e100_tx_timeout; netdev->tx_timeout = e100_tx_timeout;
netdev->watchdog_timeo = E100_WATCHDOG_PERIOD; netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
#ifdef CONFIG_E100_NAPI
netdev->poll = e100_poll; netdev->poll = e100_poll;
netdev->weight = E100_NAPI_WEIGHT; netdev->weight = E100_NAPI_WEIGHT;
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
netdev->poll_controller = e100_netpoll; netdev->poll_controller = e100_netpoll;
#endif #endif
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
#include <linux/udp.h> #include <linux/udp.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/rtnetlink.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#ifdef NETIF_F_TSO #ifdef NETIF_F_TSO
#include <net/checksum.h> #include <net/checksum.h>
...@@ -77,6 +79,8 @@ ...@@ -77,6 +79,8 @@
#define BAR_1 1 #define BAR_1 1
#define BAR_5 5 #define BAR_5 5
#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\
PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
struct e1000_adapter; struct e1000_adapter;
...@@ -98,11 +102,12 @@ struct e1000_adapter; ...@@ -98,11 +102,12 @@ struct e1000_adapter;
#define E1000_MAX_INTR 10 #define E1000_MAX_INTR 10
/* How many descriptors for TX and RX ? */ /* TX/RX descriptor defines */
#define E1000_DEFAULT_TXD 256 #define E1000_DEFAULT_TXD 256
#define E1000_MAX_TXD 256 #define E1000_MAX_TXD 256
#define E1000_MIN_TXD 80 #define E1000_MIN_TXD 80
#define E1000_MAX_82544_TXD 4096 #define E1000_MAX_82544_TXD 4096
#define E1000_DEFAULT_RXD 256 #define E1000_DEFAULT_RXD 256
#define E1000_MAX_RXD 256 #define E1000_MAX_RXD 256
#define E1000_MIN_RXD 80 #define E1000_MIN_RXD 80
...@@ -123,14 +128,11 @@ struct e1000_adapter; ...@@ -123,14 +128,11 @@ struct e1000_adapter;
#define E1000_TX_HEAD_ADDR_SHIFT 7 #define E1000_TX_HEAD_ADDR_SHIFT 7
#define E1000_PBA_TX_MASK 0xFFFF0000 #define E1000_PBA_TX_MASK 0xFFFF0000
/* Flow Control High-Watermark: 5688 bytes below Rx FIFO size */ /* Flow Control Watermarks */
#define E1000_FC_HIGH_DIFF 0x1638 #define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */
#define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */
/* Flow Control Low-Watermark: 5696 bytes below Rx FIFO size */
#define E1000_FC_LOW_DIFF 0x1640
/* Flow Control Pause Time: 858 usec */ #define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */
#define E1000_FC_PAUSE_TIME 0x0680
/* How many Tx Descriptors do we need to call netif_wake_queue ? */ /* How many Tx Descriptors do we need to call netif_wake_queue ? */
#define E1000_TX_QUEUE_WAKE 16 #define E1000_TX_QUEUE_WAKE 16
...@@ -153,9 +155,9 @@ struct e1000_adapter; ...@@ -153,9 +155,9 @@ struct e1000_adapter;
struct e1000_buffer { struct e1000_buffer {
struct sk_buff *skb; struct sk_buff *skb;
uint64_t dma; uint64_t dma;
unsigned long length;
unsigned long time_stamp; unsigned long time_stamp;
unsigned int next_to_watch; uint16_t length;
uint16_t next_to_watch;
}; };
struct e1000_desc_ring { struct e1000_desc_ring {
......
...@@ -88,9 +88,9 @@ static const struct e1000_stats e1000_gstrings_stats[] = { ...@@ -88,9 +88,9 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{ "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) }, { "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) },
{ "tx_flow_control_xon", E1000_STAT(stats.xontxc) }, { "tx_flow_control_xon", E1000_STAT(stats.xontxc) },
{ "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) }, { "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) },
{ "rx_long_byte_count", E1000_STAT(stats.gorcl) },
{ "rx_csum_offload_good", E1000_STAT(hw_csum_good) }, { "rx_csum_offload_good", E1000_STAT(hw_csum_good) },
{ "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }
{ "rx_long_byte_count", E1000_STAT(stats.gorcl) }
}; };
#define E1000_STATS_LEN \ #define E1000_STATS_LEN \
sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats) sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
...@@ -170,7 +170,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ...@@ -170,7 +170,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
ecmd->duplex = -1; ecmd->duplex = -1;
} }
ecmd->autoneg = (hw->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); ecmd->autoneg = ((hw->media_type == e1000_media_type_fiber) ||
hw->autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE;
return 0; return 0;
} }
...@@ -192,6 +193,7 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ...@@ -192,6 +193,7 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
if(netif_running(adapter->netdev)) { if(netif_running(adapter->netdev)) {
e1000_down(adapter); e1000_down(adapter);
e1000_reset(adapter);
e1000_up(adapter); e1000_up(adapter);
} else } else
e1000_reset(adapter); e1000_reset(adapter);
...@@ -205,6 +207,7 @@ e1000_get_pauseparam(struct net_device *netdev, ...@@ -205,6 +207,7 @@ e1000_get_pauseparam(struct net_device *netdev,
{ {
struct e1000_adapter *adapter = netdev->priv; struct e1000_adapter *adapter = netdev->priv;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
pause->autoneg = pause->autoneg =
(adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE);
...@@ -418,6 +421,10 @@ e1000_get_regs(struct net_device *netdev, ...@@ -418,6 +421,10 @@ e1000_get_regs(struct net_device *netdev,
e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data); e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */
regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ regs_buff[25] = regs_buff[24]; /* phy remote receiver status */
if(hw->mac_type >= e1000_82540 &&
hw->media_type == e1000_media_type_copper) {
regs_buff[26] = E1000_READ_REG(hw, MANC);
}
} }
static int static int
...@@ -448,7 +455,7 @@ e1000_get_eeprom(struct net_device *netdev, ...@@ -448,7 +455,7 @@ e1000_get_eeprom(struct net_device *netdev,
eeprom_buff = kmalloc(sizeof(uint16_t) * eeprom_buff = kmalloc(sizeof(uint16_t) *
(last_word - first_word + 1), GFP_KERNEL); (last_word - first_word + 1), GFP_KERNEL);
if (!eeprom_buff) if(!eeprom_buff)
return -ENOMEM; return -ENOMEM;
if(hw->eeprom.type == e1000_eeprom_spi) if(hw->eeprom.type == e1000_eeprom_spi)
...@@ -466,8 +473,7 @@ e1000_get_eeprom(struct net_device *netdev, ...@@ -466,8 +473,7 @@ e1000_get_eeprom(struct net_device *netdev,
for (i = 0; i < last_word - first_word + 1; i++) for (i = 0; i < last_word - first_word + 1; i++)
le16_to_cpus(&eeprom_buff[i]); le16_to_cpus(&eeprom_buff[i]);
memcpy(bytes, (uint8_t *)eeprom_buff + (eeprom->offset & 1),
memcpy(bytes, (uint8_t *)eeprom_buff + (eeprom->offset%2),
eeprom->len); eeprom->len);
kfree(eeprom_buff); kfree(eeprom_buff);
...@@ -520,6 +526,7 @@ e1000_set_eeprom(struct net_device *netdev, ...@@ -520,6 +526,7 @@ e1000_set_eeprom(struct net_device *netdev,
le16_to_cpus(&eeprom_buff[i]); le16_to_cpus(&eeprom_buff[i]);
memcpy(ptr, bytes, eeprom->len); memcpy(ptr, bytes, eeprom->len);
for (i = 0; i < last_word - first_word + 1; i++) for (i = 0; i < last_word - first_word + 1; i++)
eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]); eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
...@@ -575,13 +582,12 @@ static int ...@@ -575,13 +582,12 @@ static int
e1000_set_ringparam(struct net_device *netdev, e1000_set_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring) struct ethtool_ringparam *ring)
{ {
int err;
struct e1000_adapter *adapter = netdev->priv; struct e1000_adapter *adapter = netdev->priv;
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
struct e1000_desc_ring *txdr = &adapter->tx_ring; struct e1000_desc_ring *txdr = &adapter->tx_ring;
struct e1000_desc_ring *rxdr = &adapter->rx_ring; struct e1000_desc_ring *rxdr = &adapter->rx_ring;
struct e1000_desc_ring tx_old, tx_new; struct e1000_desc_ring tx_old, tx_new, rx_old, rx_new;
struct e1000_desc_ring rx_old, rx_new; int err;
tx_old = adapter->tx_ring; tx_old = adapter->tx_ring;
rx_old = adapter->rx_ring; rx_old = adapter->rx_ring;
...@@ -600,7 +606,7 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -600,7 +606,7 @@ e1000_set_ringparam(struct net_device *netdev,
E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE); E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE);
if(netif_running(adapter->netdev)) { if(netif_running(adapter->netdev)) {
/* try to get new resources before deleting old */ /* Try to get new resources before deleting old */
if((err = e1000_setup_rx_resources(adapter))) if((err = e1000_setup_rx_resources(adapter)))
goto err_setup_rx; goto err_setup_rx;
if((err = e1000_setup_tx_resources(adapter))) if((err = e1000_setup_tx_resources(adapter)))
...@@ -620,6 +626,7 @@ e1000_set_ringparam(struct net_device *netdev, ...@@ -620,6 +626,7 @@ e1000_set_ringparam(struct net_device *netdev,
if((err = e1000_up(adapter))) if((err = e1000_up(adapter)))
return err; return err;
} }
return 0; return 0;
err_setup_tx: err_setup_tx:
e1000_free_rx_resources(adapter); e1000_free_rx_resources(adapter);
...@@ -766,13 +773,15 @@ static int ...@@ -766,13 +773,15 @@ static int
e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
{ {
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
uint32_t icr, mask, i=0; uint32_t icr, mask, i=0, shared_int = TRUE;
uint32_t irq = adapter->pdev->irq;
*data = 0; *data = 0;
/* Hook up test interrupt handler just for this test */ /* Hook up test interrupt handler just for this test */
if(request_irq(adapter->pdev->irq, &e1000_test_intr, SA_SHIRQ, if(!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {
netdev->name, netdev)) { shared_int = FALSE;
} else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ, netdev->name, netdev)){
*data = 1; *data = 1;
return -1; return -1;
} }
...@@ -802,6 +811,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -802,6 +811,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
/* Interrupt to test */ /* Interrupt to test */
mask = 1 << i; mask = 1 << i;
if(!shared_int) {
/* Disable the interrupt to be reported in /* Disable the interrupt to be reported in
* the cause register and then force the same * the cause register and then force the same
* interrupt and see if one gets posted. If * interrupt and see if one gets posted. If
...@@ -817,6 +827,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -817,6 +827,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
*data = 3; *data = 3;
break; break;
} }
}
/* Enable the interrupt to be reported in /* Enable the interrupt to be reported in
* the cause register and then force the same * the cause register and then force the same
...@@ -834,6 +845,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -834,6 +845,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
break; break;
} }
if(!shared_int) {
/* Disable the other interrupts to be reported in /* Disable the other interrupts to be reported in
* the cause register and then force the other * the cause register and then force the other
* interrupts and see if any get posted. If * interrupts and see if any get posted. If
...@@ -850,13 +862,14 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) ...@@ -850,13 +862,14 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
break; break;
} }
} }
}
/* Disable all the interrupts */ /* Disable all the interrupts */
E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF); E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
msec_delay(10); msec_delay(10);
/* Unhook test interrupt handler */ /* Unhook test interrupt handler */
free_irq(adapter->pdev->irq, netdev); free_irq(irq, netdev);
return *data; return *data;
} }
...@@ -1021,7 +1034,7 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter) ...@@ -1021,7 +1034,7 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
return 0; return 0;
err_nomem: err_nomem:
e1000_free_desc_rings(adapter); e1000_free_desc_rings(adapter);
return ret_val; return ret_val;
} }
...@@ -1312,7 +1325,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter) ...@@ -1312,7 +1325,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
for(i = 0; i < 64; i++) { for(i = 0; i < 64; i++) {
e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 1024); e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 1024);
pci_dma_sync_single(pdev, txdr->buffer_info[i].dma, pci_dma_sync_single_for_device(pdev, txdr->buffer_info[i].dma,
txdr->buffer_info[i].length, txdr->buffer_info[i].length,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
} }
...@@ -1320,7 +1333,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter) ...@@ -1320,7 +1333,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
msec_delay(200); msec_delay(200);
pci_dma_sync_single(pdev, rxdr->buffer_info[0].dma, pci_dma_sync_single_for_cpu(pdev, rxdr->buffer_info[0].dma,
rxdr->buffer_info[0].length, PCI_DMA_FROMDEVICE); rxdr->buffer_info[0].length, PCI_DMA_FROMDEVICE);
return e1000_check_lbtest_frame(rxdr->buffer_info[0].skb, 1024); return e1000_check_lbtest_frame(rxdr->buffer_info[0].skb, 1024);
...@@ -1396,10 +1409,11 @@ e1000_diag_test(struct net_device *netdev, ...@@ -1396,10 +1409,11 @@ e1000_diag_test(struct net_device *netdev,
if(e1000_loopback_test(adapter, &data[3])) if(e1000_loopback_test(adapter, &data[3]))
eth_test->flags |= ETH_TEST_FL_FAILED; eth_test->flags |= ETH_TEST_FL_FAILED;
/* restore Autoneg/speed/duplex settings */ /* restore speed, duplex, autoneg settings */
adapter->hw.autoneg_advertised = autoneg_advertised; adapter->hw.autoneg_advertised = autoneg_advertised;
adapter->hw.forced_speed_duplex = forced_speed_duplex; adapter->hw.forced_speed_duplex = forced_speed_duplex;
adapter->hw.autoneg = autoneg; adapter->hw.autoneg = autoneg;
e1000_reset(adapter); e1000_reset(adapter);
if(if_running) if(if_running)
e1000_up(adapter); e1000_up(adapter);
...@@ -1427,6 +1441,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ...@@ -1427,6 +1441,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case E1000_DEV_ID_82543GC_FIBER: case E1000_DEV_ID_82543GC_FIBER:
case E1000_DEV_ID_82543GC_COPPER: case E1000_DEV_ID_82543GC_COPPER:
case E1000_DEV_ID_82544EI_FIBER: case E1000_DEV_ID_82544EI_FIBER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
wol->supported = 0; wol->supported = 0;
wol->wolopts = 0; wol->wolopts = 0;
return; return;
...@@ -1469,6 +1484,7 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ...@@ -1469,6 +1484,7 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case E1000_DEV_ID_82543GC_FIBER: case E1000_DEV_ID_82543GC_FIBER:
case E1000_DEV_ID_82543GC_COPPER: case E1000_DEV_ID_82543GC_COPPER:
case E1000_DEV_ID_82544EI_FIBER: case E1000_DEV_ID_82544EI_FIBER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
return wol->wolopts ? -EOPNOTSUPP : 0; return wol->wolopts ? -EOPNOTSUPP : 0;
case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_FIBER:
...@@ -1571,8 +1587,8 @@ e1000_get_ethtool_stats(struct net_device *netdev, ...@@ -1571,8 +1587,8 @@ e1000_get_ethtool_stats(struct net_device *netdev,
e1000_update_stats(adapter); e1000_update_stats(adapter);
for(i = 0; i < E1000_STATS_LEN; i++) { for(i = 0; i < E1000_STATS_LEN; i++) {
char *p = (char *)adapter+e1000_gstrings_stats[i].stat_offset; char *p = (char *)adapter+e1000_gstrings_stats[i].stat_offset;
data[i] = (e1000_gstrings_stats[i].sizeof_stat == sizeof(uint64_t)) data[i] = (e1000_gstrings_stats[i].sizeof_stat ==
? *(uint64_t *)p : *(uint32_t *)p; sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
} }
} }
......
...@@ -251,6 +251,7 @@ e1000_set_mac_type(struct e1000_hw *hw) ...@@ -251,6 +251,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
break; break;
case E1000_DEV_ID_82541ER: case E1000_DEV_ID_82541ER:
case E1000_DEV_ID_82541GI: case E1000_DEV_ID_82541GI:
case E1000_DEV_ID_82541GI_LF:
case E1000_DEV_ID_82541GI_MOBILE: case E1000_DEV_ID_82541GI_MOBILE:
hw->mac_type = e1000_82541_rev_2; hw->mac_type = e1000_82541_rev_2;
break; break;
...@@ -920,7 +921,8 @@ e1000_setup_copper_link(struct e1000_hw *hw) ...@@ -920,7 +921,8 @@ e1000_setup_copper_link(struct e1000_hw *hw)
if(ret_val) if(ret_val)
return ret_val; return ret_val;
if(hw->mac_type == e1000_82545_rev_3) { if((hw->mac_type == e1000_82545_rev_3) ||
(hw->mac_type == e1000_82546_rev_3)) {
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
phy_data |= 0x00000008; phy_data |= 0x00000008;
ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
...@@ -3057,16 +3059,6 @@ e1000_init_eeprom_params(struct e1000_hw *hw) ...@@ -3057,16 +3059,6 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
} }
break; break;
default: default:
eeprom->type = e1000_eeprom_spi;
eeprom->opcode_bits = 8;
eeprom->delay_usec = 1;
if (eecd & E1000_EECD_ADDR_BITS) {
eeprom->page_size = 32;
eeprom->address_bits = 16;
} else {
eeprom->page_size = 8;
eeprom->address_bits = 8;
}
break; break;
} }
...@@ -3453,7 +3445,6 @@ e1000_read_eeprom(struct e1000_hw *hw, ...@@ -3453,7 +3445,6 @@ e1000_read_eeprom(struct e1000_hw *hw,
uint32_t i = 0; uint32_t i = 0;
DEBUGFUNC("e1000_read_eeprom"); DEBUGFUNC("e1000_read_eeprom");
/* A check for invalid values: offset too large, too many words, and not /* A check for invalid values: offset too large, too many words, and not
* enough words. * enough words.
*/ */
...@@ -5224,3 +5215,4 @@ e1000_enable_mng_pass_thru(struct e1000_hw *hw) ...@@ -5224,3 +5215,4 @@ e1000_enable_mng_pass_thru(struct e1000_hw *hw)
} }
return FALSE; return FALSE;
} }
...@@ -357,11 +357,11 @@ int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active); ...@@ -357,11 +357,11 @@ int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
#define E1000_DEV_ID_82547GI 0x1075 #define E1000_DEV_ID_82547GI 0x1075
#define E1000_DEV_ID_82541GI 0x1076 #define E1000_DEV_ID_82541GI 0x1076
#define E1000_DEV_ID_82541GI_MOBILE 0x1077 #define E1000_DEV_ID_82541GI_MOBILE 0x1077
#define E1000_DEV_ID_82541GI_LF 0x107C
#define E1000_DEV_ID_82546GB_COPPER 0x1079 #define E1000_DEV_ID_82546GB_COPPER 0x1079
#define E1000_DEV_ID_82546GB_FIBER 0x107A #define E1000_DEV_ID_82546GB_FIBER 0x107A
#define E1000_DEV_ID_82546GB_SERDES 0x107B #define E1000_DEV_ID_82546GB_SERDES 0x107B
#define E1000_DEV_ID_82547EI 0x1019 #define E1000_DEV_ID_82547EI 0x1019
#define NODE_ADDRESS_SIZE 6 #define NODE_ADDRESS_SIZE 6
#define ETH_LENGTH_OF_ADDRESS 6 #define ETH_LENGTH_OF_ADDRESS 6
...@@ -1043,7 +1043,6 @@ struct e1000_hw { ...@@ -1043,7 +1043,6 @@ struct e1000_hw {
#define E1000_EEPROM_SWDPIN0 0x0001 /* SWDPIN 0 EEPROM Value */ #define E1000_EEPROM_SWDPIN0 0x0001 /* SWDPIN 0 EEPROM Value */
#define E1000_EEPROM_LED_LOGIC 0x0020 /* Led Logic Word */ #define E1000_EEPROM_LED_LOGIC 0x0020 /* Led Logic Word */
/* Register Bit Masks */ /* Register Bit Masks */
/* Device Control */ /* Device Control */
#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */ #define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */
......
This diff is collapsed.
...@@ -449,8 +449,7 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -449,8 +449,7 @@ e1000_check_options(struct e1000_adapter *adapter)
DPRINTK(PROBE, INFO, "%s turned off\n", opt.name); DPRINTK(PROBE, INFO, "%s turned off\n", opt.name);
break; break;
case 1: case 1:
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", opt.name);
"%s set to dynamic mode\n", opt.name);
break; break;
default: default:
e1000_validate_option(&adapter->itr, &opt, adapter); e1000_validate_option(&adapter->itr, &opt, adapter);
...@@ -493,8 +492,9 @@ e1000_check_fiber_options(struct e1000_adapter *adapter) ...@@ -493,8 +492,9 @@ e1000_check_fiber_options(struct e1000_adapter *adapter)
"parameter ignored\n"); "parameter ignored\n");
} }
if((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { if((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) {
DPRINTK(PROBE, INFO, "AutoNeg other than Full/1000 is " DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is "
"not valid for fiber adapters, parameter ignored\n"); "not valid for fiber adapters, "
"parameter ignored\n");
} }
} }
...@@ -611,24 +611,24 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -611,24 +611,24 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
break; break;
case HALF_DUPLEX: case HALF_DUPLEX:
DPRINTK(PROBE, INFO, "Half Duplex specified without Speed\n"); DPRINTK(PROBE, INFO, "Half Duplex specified without Speed\n");
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "Using Autonegotiation at "
"Using Autonegotiation at Half Duplex only\n"); "Half Duplex only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
ADVERTISE_100_HALF; ADVERTISE_100_HALF;
break; break;
case FULL_DUPLEX: case FULL_DUPLEX:
DPRINTK(PROBE, INFO, "Full Duplex specified without Speed\n"); DPRINTK(PROBE, INFO, "Full Duplex specified without Speed\n");
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "Using Autonegotiation at "
"Using Autonegotiation at Full Duplex only\n"); "Full Duplex only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | adapter->hw.autoneg_advertised = ADVERTISE_10_FULL |
ADVERTISE_100_FULL | ADVERTISE_100_FULL |
ADVERTISE_1000_FULL; ADVERTISE_1000_FULL;
break; break;
case SPEED_10: case SPEED_10:
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "10 Mbps Speed specified "
"10 Mbps Speed specified without Duplex\n"); "without Duplex\n");
DPRINTK(PROBE, INFO, "Using Autonegotiation at 10 Mbps only\n"); DPRINTK(PROBE, INFO, "Using Autonegotiation at 10 Mbps only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
...@@ -647,10 +647,10 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -647,10 +647,10 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
adapter->hw.autoneg_advertised = 0; adapter->hw.autoneg_advertised = 0;
break; break;
case SPEED_100: case SPEED_100:
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "100 Mbps Speed specified "
"100 Mbps Speed specified without Duplex\n"); "without Duplex\n");
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO, "Using Autonegotiation at "
"Using Autonegotiation at 100 Mbps only\n"); "100 Mbps only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | adapter->hw.autoneg_advertised = ADVERTISE_100_HALF |
ADVERTISE_100_FULL; ADVERTISE_100_FULL;
...@@ -668,10 +668,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -668,10 +668,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
adapter->hw.autoneg_advertised = 0; adapter->hw.autoneg_advertised = 0;
break; break;
case SPEED_1000: case SPEED_1000:
DPRINTK(PROBE, INFO, "1000 Mbps Speed specified without "
"Duplex\n");
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO,
"1000 Mbps Speed specified without Duplex\n"); "Using Autonegotiation at 1000 Mbps "
DPRINTK(PROBE, INFO, "Full Duplex only\n");
"Using Autonegotiation at 1000 Mbps Full Duplex only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
break; break;
...@@ -679,7 +680,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -679,7 +680,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO,
"Half Duplex is not supported at 1000 Mbps\n"); "Half Duplex is not supported at 1000 Mbps\n");
DPRINTK(PROBE, INFO, DPRINTK(PROBE, INFO,
"Using Autonegotiation at 1000 Mbps Full Duplex only\n"); "Using Autonegotiation at 1000 Mbps "
"Full Duplex only\n");
adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg = adapter->fc_autoneg = 1;
adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
break; break;
......
...@@ -88,7 +88,6 @@ static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1}; ...@@ -88,7 +88,6 @@ static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1};
#define PKT_BUF_SZ 1536 #define PKT_BUF_SZ 1536
#include <linux/config.h> #include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -2447,22 +2446,6 @@ static struct pci_driver eepro100_driver = { ...@@ -2447,22 +2446,6 @@ static struct pci_driver eepro100_driver = {
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
}; };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,48)
static int pci_module_init(struct pci_driver *pdev)
{
int rc;
rc = pci_register_driver(pdev);
if (rc <= 0) {
printk(KERN_INFO "%s: No cards found, driver not installed.\n",
pdev->name);
pci_unregister_driver(pdev);
return -ENODEV;
}
return 0;
}
#endif
static int __init eepro100_init_module(void) static int __init eepro100_init_module(void)
{ {
#ifdef MODULE #ifdef MODULE
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* drivers/net/gianfar_phy.h
*
* Gianfar Ethernet Driver -- PHY handling
* Driver for FEC on MPC8540 and TSEC on MPC8540/MPC8560
* Based on 8260_io/fcc_enet.c
*
* Author: Andy Fleming
* Maintainer: Kumar Gala (kumar.gala@freescale.com)
*
* Copyright 2004 Freescale Semiconductor, Inc
*
* 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 Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __GIANFAR_PHY_H
#define __GIANFAR_PHY_H
#define miim_end ((u32)-2)
#define miim_read ((u32)-1)
#define MIIMIND_BUSY 0x00000001
#define MIIMIND_NOTVALID 0x00000004
#define MIIM_CONTROL 0x00
#define MIIM_CONTROL_RESET 0x00008000
#define MIIM_CONTROL_INIT 0x00001140
#define MIIM_ANEN 0x00001000
#define MIIM_CR 0x00
#define MIIM_CR_RST 0x00008000
#define MIIM_CR_INIT 0x00001000
#define MIIM_STATUS 0x1
#define MIIM_STATUS_AN_DONE 0x00000020
#define MIIM_STATUS_LINK 0x0004
#define MIIM_PHYIR1 0x2
#define MIIM_PHYIR2 0x3
#define GFAR_AN_TIMEOUT 0x000fffff
#define MIIM_ANLPBPA 0x5
#define MIIM_ANLPBPA_HALF 0x00000040
#define MIIM_ANLPBPA_FULL 0x00000020
#define MIIM_ANEX 0x6
#define MIIM_ANEX_NP 0x00000004
#define MIIM_ANEX_PRX 0x00000002
/* Cicada Extended Control Register 1 */
#define MIIM_CIS8201_EXT_CON1 0x17
#define MIIM_CIS8201_EXTCON1_INIT 0x0000
/* Cicada Interrupt Mask Register */
#define MIIM_CIS8204_IMASK 0x19
#define MIIM_CIS8204_IMASK_IEN 0x8000
#define MIIM_CIS8204_IMASK_SPEED 0x4000
#define MIIM_CIS8204_IMASK_LINK 0x2000
#define MIIM_CIS8204_IMASK_DUPLEX 0x1000
#define MIIM_CIS8204_IMASK_MASK 0xf000
/* Cicada Interrupt Status Register */
#define MIIM_CIS8204_ISTAT 0x1a
#define MIIM_CIS8204_ISTAT_STATUS 0x8000
#define MIIM_CIS8204_ISTAT_SPEED 0x4000
#define MIIM_CIS8204_ISTAT_LINK 0x2000
#define MIIM_CIS8204_ISTAT_DUPLEX 0x1000
/* Cicada Auxiliary Control/Status Register */
#define MIIM_CIS8201_AUX_CONSTAT 0x1c
#define MIIM_CIS8201_AUXCONSTAT_INIT 0x0004
#define MIIM_CIS8201_AUXCONSTAT_DUPLEX 0x0020
#define MIIM_CIS8201_AUXCONSTAT_SPEED 0x0018
#define MIIM_CIS8201_AUXCONSTAT_GBIT 0x0010
#define MIIM_CIS8201_AUXCONSTAT_100 0x0008
/* 88E1011 PHY Status Register */
#define MIIM_88E1011_PHY_STATUS 0x11
#define MIIM_88E1011_PHYSTAT_SPEED 0xc000
#define MIIM_88E1011_PHYSTAT_GBIT 0x8000
#define MIIM_88E1011_PHYSTAT_100 0x4000
#define MIIM_88E1011_PHYSTAT_DUPLEX 0x2000
#define MIIM_88E1011_PHYSTAT_LINK 0x0400
#define MIIM_88E1011_IEVENT 0x13
#define MIIM_88E1011_IEVENT_CLEAR 0x0000
#define MIIM_88E1011_IMASK 0x12
#define MIIM_88E1011_IMASK_INIT 0x6400
#define MIIM_88E1011_IMASK_CLEAR 0x0000
/* DM9161 Control register values */
#define MIIM_DM9161_CR_STOP 0x0400
#define MIIM_DM9161_CR_RSTAN 0x1200
#define MIIM_DM9161_SCR 0x10
#define MIIM_DM9161_SCR_INIT 0x0610
/* DM9161 Specified Configuration and Status Register */
#define MIIM_DM9161_SCSR 0x11
#define MIIM_DM9161_SCSR_100F 0x8000
#define MIIM_DM9161_SCSR_100H 0x4000
#define MIIM_DM9161_SCSR_10F 0x2000
#define MIIM_DM9161_SCSR_10H 0x1000
/* DM9161 Interrupt Register */
#define MIIM_DM9161_INTR 0x15
#define MIIM_DM9161_INTR_PEND 0x8000
#define MIIM_DM9161_INTR_DPLX_MASK 0x0800
#define MIIM_DM9161_INTR_SPD_MASK 0x0400
#define MIIM_DM9161_INTR_LINK_MASK 0x0200
#define MIIM_DM9161_INTR_MASK 0x0100
#define MIIM_DM9161_INTR_DPLX_CHANGE 0x0010
#define MIIM_DM9161_INTR_SPD_CHANGE 0x0008
#define MIIM_DM9161_INTR_LINK_CHANGE 0x0004
#define MIIM_DM9161_INTR_INIT 0x0000
#define MIIM_DM9161_INTR_STOP \
(MIIM_DM9161_INTR_DPLX_MASK | MIIM_DM9161_INTR_SPD_MASK \
| MIIM_DM9161_INTR_LINK_MASK | MIIM_DM9161_INTR_MASK)
/* DM9161 10BT Configuration/Status */
#define MIIM_DM9161_10BTCSR 0x12
#define MIIM_DM9161_10BTCSR_INIT 0x7800
#define MIIM_READ_COMMAND 0x00000001
/*
* struct phy_cmd: A command for reading or writing a PHY register
*
* mii_reg: The register to read or write
*
* mii_data: For writes, the value to put in the register.
* A value of -1 indicates this is a read.
*
* funct: A function pointer which is invoked for each command.
* For reads, this function will be passed the value read
* from the PHY, and process it.
* For writes, the result of this function will be written
* to the PHY register
*/
struct phy_cmd {
u32 mii_reg;
u32 mii_data;
u16 (*funct) (u16 mii_reg, struct net_device * dev);
};
/* struct phy_info: a structure which defines attributes for a PHY
*
* id will contain a number which represents the PHY. During
* startup, the driver will poll the PHY to find out what its
* UID--as defined by registers 2 and 3--is. The 32-bit result
* gotten from the PHY will be shifted right by "shift" bits to
* discard any bits which may change based on revision numbers
* unimportant to functionality
*
* The struct phy_cmd entries represent pointers to an arrays of
* commands which tell the driver what to do to the PHY.
*/
struct phy_info {
u32 id;
char *name;
unsigned int shift;
/* Called to configure the PHY, and modify the controller
* based on the results */
const struct phy_cmd *config;
/* Called when starting up the controller. Usually sets
* up the interrupt for state changes */
const struct phy_cmd *startup;
/* Called inside the interrupt handler to acknowledge
* the interrupt */
const struct phy_cmd *ack_int;
/* Called in the bottom half to handle the interrupt */
const struct phy_cmd *handle_int;
/* Called when bringing down the controller. Usually stops
* the interrupts from being generated */
const struct phy_cmd *shutdown;
};
struct phy_info *get_phy_info(struct net_device *dev);
void phy_run_commands(struct net_device *dev, const struct phy_cmd *cmd);
#endif /* GIANFAR_PHY_H */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -750,6 +750,9 @@ static void netdev_error(struct net_device *dev, int intr_status); ...@@ -750,6 +750,9 @@ static void netdev_error(struct net_device *dev, int intr_status);
static void netdev_rx(struct net_device *dev); static void netdev_rx(struct net_device *dev);
static void netdev_tx_done(struct net_device *dev); static void netdev_tx_done(struct net_device *dev);
static int natsemi_change_mtu(struct net_device *dev, int new_mtu); static int natsemi_change_mtu(struct net_device *dev, int new_mtu);
#ifdef CONFIG_NET_POLL_CONTROLLER
static void natsemi_poll_controller(struct net_device *dev);
#endif
static void __set_rx_mode(struct net_device *dev); static void __set_rx_mode(struct net_device *dev);
static void set_rx_mode(struct net_device *dev); static void set_rx_mode(struct net_device *dev);
static void __get_stats(struct net_device *dev); static void __get_stats(struct net_device *dev);
...@@ -920,6 +923,9 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, ...@@ -920,6 +923,9 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
dev->do_ioctl = &netdev_ioctl; dev->do_ioctl = &netdev_ioctl;
dev->tx_timeout = &tx_timeout; dev->tx_timeout = &tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = &natsemi_poll_controller;
#endif
if (mtu) if (mtu)
dev->mtu = mtu; dev->mtu = mtu;
...@@ -2364,6 +2370,15 @@ static struct net_device_stats *get_stats(struct net_device *dev) ...@@ -2364,6 +2370,15 @@ static struct net_device_stats *get_stats(struct net_device *dev)
return &np->stats; return &np->stats;
} }
#ifdef CONFIG_NET_POLL_CONTROLLER
static void natsemi_poll_controller(struct net_device *dev)
{
disable_irq(dev->irq);
intr_handler(dev->irq, dev, NULL);
enable_irq(dev->irq);
}
#endif
#define HASH_TABLE 0x200 #define HASH_TABLE 0x200
static void __set_rx_mode(struct net_device *dev) static void __set_rx_mode(struct net_device *dev)
{ {
......
This diff is collapsed.
...@@ -53,60 +53,6 @@ ...@@ -53,60 +53,6 @@
#include "h/skrlmt.h" #include "h/skrlmt.h"
#include "h/skgedrv.h" #include "h/skgedrv.h"
#define SK_PCI_ISCOMPLIANT(result, pdev) { \
result = SK_FALSE; /* default */ \
/* 3Com (0x10b7) */ \
if (pdev->vendor == 0x10b7) { \
/* Gigabit Ethernet Adapter (0x1700) */ \
if ((pdev->device == 0x1700) || \
(pdev->device == 0x80eb)) { \
result = SK_TRUE; \
} \
/* SysKonnect (0x1148) */ \
} else if (pdev->vendor == 0x1148) { \
/* SK-98xx Gigabit Ethernet Server Adapter (0x4300) */ \
/* SK-98xx V2.0 Gigabit Ethernet Adapter (0x4320) */ \
if ((pdev->device == 0x4300) || \
(pdev->device == 0x4320)) { \
result = SK_TRUE; \
} \
/* D-Link (0x1186) */ \
} else if (pdev->vendor == 0x1186) { \
/* Gigabit Ethernet Adapter (0x4c00) */ \
if ((pdev->device == 0x4c00)) { \
result = SK_TRUE; \
} \
/* Marvell (0x11ab) */ \
} else if (pdev->vendor == 0x11ab) { \
/* Gigabit Ethernet Adapter (0x4320) */ \
/* Gigabit Ethernet Adapter (0x4360) */ \
/* Gigabit Ethernet Adapter (0x4361) */ \
/* Belkin (0x5005) */ \
if ((pdev->device == 0x4320) || \
(pdev->device == 0x4360) || \
(pdev->device == 0x4361) || \
(pdev->device == 0x5005)) { \
result = SK_TRUE; \
} \
/* CNet (0x1371) */ \
} else if (pdev->vendor == 0x1371) { \
/* GigaCard Network Adapter (0x434e) */ \
if ((pdev->device == 0x434e)) { \
result = SK_TRUE; \
} \
/* Linksys (0x1737) */ \
} else if (pdev->vendor == 0x1737) { \
/* Gigabit Network Adapter (0x1032) */ \
/* Gigabit Network Adapter (0x1064) */ \
if ((pdev->device == 0x1032) || \
(pdev->device == 0x1064)) { \
result = SK_TRUE; \
} \
} else { \
result = SK_FALSE; \
} \
}
extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned);
extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*);
......
...@@ -892,7 +892,7 @@ SK_AC *pAC, /* adapter context */ ...@@ -892,7 +892,7 @@ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber) /* Port Number */ SK_U32 PortNumber) /* Port Number */
{ {
int ReturnCode; int ReturnCode = 0;
#if (!defined(SK_SLIM) || defined(DEBUG)) #if (!defined(SK_SLIM) || defined(DEBUG))
if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
return (SK_ADDR_ILLEGAL_PORT); return (SK_ADDR_ILLEGAL_PORT);
...@@ -1424,7 +1424,7 @@ SK_IOC IoC, /* I/O context */ ...@@ -1424,7 +1424,7 @@ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* port whose promiscuous mode changes */ SK_U32 PortNumber, /* port whose promiscuous mode changes */
int NewPromMode) /* new promiscuous mode */ int NewPromMode) /* new promiscuous mode */
{ {
int ReturnCode; int ReturnCode = 0;
#if (!defined(SK_SLIM) || defined(DEBUG)) #if (!defined(SK_SLIM) || defined(DEBUG))
if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
return (SK_ADDR_ILLEGAL_PORT); return (SK_ADDR_ILLEGAL_PORT);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
#define OPTION_DEFAULT { [0 ... MAX_UNITS-1] = -1} #define OPTION_DEFAULT { [0 ... MAX_UNITS-1] = -1}
#define REV_ID_VT6110 (0) #define REV_ID_VT6110 (0)
#define DEVICE_ID (0x3119)
#define BYTE_REG_BITS_ON(x,p) do { writeb(readb((p))|(x),(p));} while (0) #define BYTE_REG_BITS_ON(x,p) do { writeb(readb((p))|(x),(p));} while (0)
#define WORD_REG_BITS_ON(x,p) do { writew(readw((p))|(x),(p));} while (0) #define WORD_REG_BITS_ON(x,p) do { writew(readw((p))|(x),(p));} while (0)
...@@ -1772,7 +1771,8 @@ struct velocity_info { ...@@ -1772,7 +1771,8 @@ struct velocity_info {
struct velocity_td_info *td_infos[TX_QUEUE_NO]; struct velocity_td_info *td_infos[TX_QUEUE_NO];
int rd_curr; int rd_curr;
int rd_used; int rd_dirty;
u32 rd_filled;
struct rx_desc *rd_ring; struct rx_desc *rd_ring;
struct velocity_rd_info *rd_info; /* It's an array */ struct velocity_rd_info *rd_info; /* It's an array */
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -76,4 +76,3 @@ struct ieee802_11_hdr { ...@@ -76,4 +76,3 @@ struct ieee802_11_hdr {
#define IEEE802_11_SCTL_SEQ 0xFFF0 #define IEEE802_11_SCTL_SEQ 0xFFF0
#endif /* _IEEE802_11_H */ #endif /* _IEEE802_11_H */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -1234,6 +1234,7 @@ ...@@ -1234,6 +1234,7 @@
#define PCI_DEVICE_ID_VIA_8233C_0 0x3109 #define PCI_DEVICE_ID_VIA_8233C_0 0x3109
#define PCI_DEVICE_ID_VIA_8361 0x3112 #define PCI_DEVICE_ID_VIA_8361 0x3112
#define PCI_DEVICE_ID_VIA_XM266 0x3116 #define PCI_DEVICE_ID_VIA_XM266 0x3116
#define PCI_DEVICE_ID_VIA_612X 0x3119
#define PCI_DEVICE_ID_VIA_862X_0 0x3123 #define PCI_DEVICE_ID_VIA_862X_0 0x3123
#define PCI_DEVICE_ID_VIA_8753_0 0x3128 #define PCI_DEVICE_ID_VIA_8753_0 0x3128
#define PCI_DEVICE_ID_VIA_8233A 0x3147 #define PCI_DEVICE_ID_VIA_8233A 0x3147
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment