Merge branch '7.0.38-k2' of git://66.93.40.222/srv/git/netdev-2.6

This commit is contained in:
Jeff Garzik 2006-04-14 23:19:41 -04:00
commit 8fc65162a8
9 changed files with 117 additions and 107 deletions

View File

@ -1395,6 +1395,8 @@ P: Jesse Brandeburg
M: jesse.brandeburg@intel.com M: jesse.brandeburg@intel.com
P: Jeff Kirsher P: Jeff Kirsher
M: jeffrey.t.kirsher@intel.com M: jeffrey.t.kirsher@intel.com
P: Auke Kok
M: auke-jan.h.kok@intel.com
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
@ -1407,6 +1409,8 @@ P: Jesse Brandeburg
M: jesse.brandeburg@intel.com M: jesse.brandeburg@intel.com
P: Jeff Kirsher P: Jeff Kirsher
M: jeffrey.t.kirsher@intel.com M: jeffrey.t.kirsher@intel.com
P: Auke Kok
M: auke-jan.h.kok@intel.com
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
@ -1419,6 +1423,8 @@ P: John Ronciak
M: john.ronciak@intel.com M: john.ronciak@intel.com
P: Jesse Brandeburg P: Jesse Brandeburg
M: jesse.brandeburg@intel.com M: jesse.brandeburg@intel.com
P: Auke Kok
M: auke-jan.h.kok@intel.com
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported

View File

@ -22,6 +22,7 @@
# #
# Contact Information: # Contact Information:
# Linux NICS <linux.nics@intel.com> # Linux NICS <linux.nics@intel.com>
# e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
# Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 # Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
# #
################################################################################ ################################################################################

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/
@ -114,6 +115,8 @@ struct e1000_adapter;
/* Supported Rx Buffer Sizes */ /* Supported Rx Buffer Sizes */
#define E1000_RXBUFFER_128 128 /* Used for packet split */ #define E1000_RXBUFFER_128 128 /* Used for packet split */
#define E1000_RXBUFFER_256 256 /* Used for packet split */ #define E1000_RXBUFFER_256 256 /* Used for packet split */
#define E1000_RXBUFFER_512 512
#define E1000_RXBUFFER_1024 1024
#define E1000_RXBUFFER_2048 2048 #define E1000_RXBUFFER_2048 2048
#define E1000_RXBUFFER_4096 4096 #define E1000_RXBUFFER_4096 4096
#define E1000_RXBUFFER_8192 8192 #define E1000_RXBUFFER_8192 8192
@ -334,7 +337,6 @@ struct e1000_adapter {
boolean_t have_msi; boolean_t have_msi;
#endif #endif
/* to not mess up cache alignment, always add to the bottom */ /* to not mess up cache alignment, always add to the bottom */
boolean_t txb2b;
#ifdef NETIF_F_TSO #ifdef NETIF_F_TSO
boolean_t tso_force; boolean_t tso_force;
#endif #endif

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/
@ -74,9 +75,9 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
#else #else
#define DRIVERNAPI "-NAPI" #define DRIVERNAPI "-NAPI"
#endif #endif
#define DRV_VERSION "7.0.33-k2"DRIVERNAPI #define DRV_VERSION "7.0.38-k2"DRIVERNAPI
char e1000_driver_version[] = DRV_VERSION; char e1000_driver_version[] = DRV_VERSION;
static char e1000_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
/* e1000_pci_tbl - PCI Device ID Table /* e1000_pci_tbl - PCI Device ID Table
* *
@ -208,8 +209,8 @@ static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
static void e1000_tx_timeout(struct net_device *dev); static void e1000_tx_timeout(struct net_device *dev);
static void e1000_reset_task(struct net_device *dev); static void e1000_reset_task(struct net_device *dev);
static void e1000_smartspeed(struct e1000_adapter *adapter); static void e1000_smartspeed(struct e1000_adapter *adapter);
static inline int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
struct sk_buff *skb); struct sk_buff *skb);
static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp); static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid); static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
@ -291,7 +292,7 @@ module_exit(e1000_exit_module);
* @adapter: board private structure * @adapter: board private structure
**/ **/
static inline void static void
e1000_irq_disable(struct e1000_adapter *adapter) e1000_irq_disable(struct e1000_adapter *adapter)
{ {
atomic_inc(&adapter->irq_sem); atomic_inc(&adapter->irq_sem);
@ -305,7 +306,7 @@ e1000_irq_disable(struct e1000_adapter *adapter)
* @adapter: board private structure * @adapter: board private structure
**/ **/
static inline void static void
e1000_irq_enable(struct e1000_adapter *adapter) e1000_irq_enable(struct e1000_adapter *adapter)
{ {
if (likely(atomic_dec_and_test(&adapter->irq_sem))) { if (likely(atomic_dec_and_test(&adapter->irq_sem))) {
@ -349,7 +350,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter)
* *
**/ **/
static inline void static void
e1000_release_hw_control(struct e1000_adapter *adapter) e1000_release_hw_control(struct e1000_adapter *adapter)
{ {
uint32_t ctrl_ext; uint32_t ctrl_ext;
@ -359,6 +360,7 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
switch (adapter->hw.mac_type) { switch (adapter->hw.mac_type) {
case e1000_82571: case e1000_82571:
case e1000_82572: case e1000_82572:
case e1000_80003es2lan:
ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
E1000_WRITE_REG(&adapter->hw, CTRL_EXT, E1000_WRITE_REG(&adapter->hw, CTRL_EXT,
ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
@ -383,7 +385,7 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
* *
**/ **/
static inline void static void
e1000_get_hw_control(struct e1000_adapter *adapter) e1000_get_hw_control(struct e1000_adapter *adapter)
{ {
uint32_t ctrl_ext; uint32_t ctrl_ext;
@ -392,6 +394,7 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
switch (adapter->hw.mac_type) { switch (adapter->hw.mac_type) {
case e1000_82571: case e1000_82571:
case e1000_82572: case e1000_82572:
case e1000_80003es2lan:
ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
E1000_WRITE_REG(&adapter->hw, CTRL_EXT, E1000_WRITE_REG(&adapter->hw, CTRL_EXT,
ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
@ -419,7 +422,7 @@ e1000_up(struct e1000_adapter *adapter)
uint16_t mii_reg; uint16_t mii_reg;
e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
if (mii_reg & MII_CR_POWER_DOWN) if (mii_reg & MII_CR_POWER_DOWN)
e1000_phy_reset(&adapter->hw); e1000_phy_hw_reset(&adapter->hw);
} }
e1000_set_multi(netdev); e1000_set_multi(netdev);
@ -970,8 +973,8 @@ e1000_sw_init(struct e1000_adapter *adapter)
pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word); pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
adapter->rx_buffer_len = E1000_RXBUFFER_2048; adapter->rx_buffer_len = MAXIMUM_ETHERNET_FRAME_SIZE;
adapter->rx_ps_bsize0 = E1000_RXBUFFER_256; adapter->rx_ps_bsize0 = E1000_RXBUFFER_128;
hw->max_frame_size = netdev->mtu + hw->max_frame_size = netdev->mtu +
ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE; hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
@ -1179,7 +1182,7 @@ e1000_close(struct net_device *netdev)
* @start: address of beginning of memory * @start: address of beginning of memory
* @len: length of memory * @len: length of memory
**/ **/
static inline boolean_t static boolean_t
e1000_check_64k_bound(struct e1000_adapter *adapter, e1000_check_64k_bound(struct e1000_adapter *adapter,
void *start, unsigned long len) void *start, unsigned long len)
{ {
@ -1597,14 +1600,21 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
rctl |= E1000_RCTL_LPE; rctl |= E1000_RCTL_LPE;
/* Setup buffer sizes */ /* Setup buffer sizes */
if (adapter->hw.mac_type >= e1000_82571) { rctl &= ~E1000_RCTL_SZ_4096;
/* We can now specify buffers in 1K increments. rctl |= E1000_RCTL_BSEX;
* BSIZE and BSEX are ignored in this case. */ switch (adapter->rx_buffer_len) {
rctl |= adapter->rx_buffer_len << 0x11; case E1000_RXBUFFER_256:
} else { rctl |= E1000_RCTL_SZ_256;
rctl &= ~E1000_RCTL_SZ_4096; rctl &= ~E1000_RCTL_BSEX;
rctl |= E1000_RCTL_BSEX; break;
switch (adapter->rx_buffer_len) { case E1000_RXBUFFER_512:
rctl |= E1000_RCTL_SZ_512;
rctl &= ~E1000_RCTL_BSEX;
break;
case E1000_RXBUFFER_1024:
rctl |= E1000_RCTL_SZ_1024;
rctl &= ~E1000_RCTL_BSEX;
break;
case E1000_RXBUFFER_2048: case E1000_RXBUFFER_2048:
default: default:
rctl |= E1000_RCTL_SZ_2048; rctl |= E1000_RCTL_SZ_2048;
@ -1619,7 +1629,6 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
case E1000_RXBUFFER_16384: case E1000_RXBUFFER_16384:
rctl |= E1000_RCTL_SZ_16384; rctl |= E1000_RCTL_SZ_16384;
break; break;
}
} }
#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT #ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
@ -1713,7 +1722,7 @@ e1000_configure_rx(struct e1000_adapter *adapter)
if (hw->mac_type >= e1000_82571) { if (hw->mac_type >= e1000_82571) {
ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
/* Reset delay timers after every interrupt */ /* Reset delay timers after every interrupt */
ctrl_ext |= E1000_CTRL_EXT_CANC; ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR;
#ifdef CONFIG_E1000_NAPI #ifdef CONFIG_E1000_NAPI
/* Auto-Mask interrupts upon ICR read. */ /* Auto-Mask interrupts upon ICR read. */
ctrl_ext |= E1000_CTRL_EXT_IAME; ctrl_ext |= E1000_CTRL_EXT_IAME;
@ -1805,7 +1814,7 @@ e1000_free_all_tx_resources(struct e1000_adapter *adapter)
e1000_free_tx_resources(adapter, &adapter->tx_ring[i]); e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
} }
static inline void static void
e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
struct e1000_buffer *buffer_info) struct e1000_buffer *buffer_info)
{ {
@ -2245,6 +2254,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
if (link) { if (link) {
if (!netif_carrier_ok(netdev)) { if (!netif_carrier_ok(netdev)) {
boolean_t txb2b = 1;
e1000_get_speed_and_duplex(&adapter->hw, e1000_get_speed_and_duplex(&adapter->hw,
&adapter->link_speed, &adapter->link_speed,
&adapter->link_duplex); &adapter->link_duplex);
@ -2258,23 +2268,22 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
* and adjust the timeout factor */ * and adjust the timeout factor */
netdev->tx_queue_len = adapter->tx_queue_len; netdev->tx_queue_len = adapter->tx_queue_len;
adapter->tx_timeout_factor = 1; adapter->tx_timeout_factor = 1;
adapter->txb2b = 1;
switch (adapter->link_speed) { switch (adapter->link_speed) {
case SPEED_10: case SPEED_10:
adapter->txb2b = 0; txb2b = 0;
netdev->tx_queue_len = 10; netdev->tx_queue_len = 10;
adapter->tx_timeout_factor = 8; adapter->tx_timeout_factor = 8;
break; break;
case SPEED_100: case SPEED_100:
adapter->txb2b = 0; txb2b = 0;
netdev->tx_queue_len = 100; netdev->tx_queue_len = 100;
/* maybe add some timeout factor ? */ /* maybe add some timeout factor ? */
break; break;
} }
if ((adapter->hw.mac_type == e1000_82571 || if ((adapter->hw.mac_type == e1000_82571 ||
adapter->hw.mac_type == e1000_82572) && adapter->hw.mac_type == e1000_82572) &&
adapter->txb2b == 0) { txb2b == 0) {
#define SPEED_MODE_BIT (1 << 21) #define SPEED_MODE_BIT (1 << 21)
uint32_t tarc0; uint32_t tarc0;
tarc0 = E1000_READ_REG(&adapter->hw, TARC0); tarc0 = E1000_READ_REG(&adapter->hw, TARC0);
@ -2398,7 +2407,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter)
#define E1000_TX_FLAGS_VLAN_MASK 0xffff0000 #define E1000_TX_FLAGS_VLAN_MASK 0xffff0000
#define E1000_TX_FLAGS_VLAN_SHIFT 16 #define E1000_TX_FLAGS_VLAN_SHIFT 16
static inline int static int
e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
struct sk_buff *skb) struct sk_buff *skb)
{ {
@ -2478,7 +2487,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
return FALSE; return FALSE;
} }
static inline boolean_t static boolean_t
e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
struct sk_buff *skb) struct sk_buff *skb)
{ {
@ -2514,7 +2523,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
#define E1000_MAX_TXD_PWR 12 #define E1000_MAX_TXD_PWR 12
#define E1000_MAX_DATA_PER_TXD (1<<E1000_MAX_TXD_PWR) #define E1000_MAX_DATA_PER_TXD (1<<E1000_MAX_TXD_PWR)
static inline int static int
e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
struct sk_buff *skb, unsigned int first, unsigned int max_per_txd, struct sk_buff *skb, unsigned int first, unsigned int max_per_txd,
unsigned int nr_frags, unsigned int mss) unsigned int nr_frags, unsigned int mss)
@ -2623,7 +2632,7 @@ e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
return count; return count;
} }
static inline void static void
e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
int tx_flags, int count) int tx_flags, int count)
{ {
@ -2687,7 +2696,7 @@ e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
#define E1000_FIFO_HDR 0x10 #define E1000_FIFO_HDR 0x10
#define E1000_82547_PAD_LEN 0x3E0 #define E1000_82547_PAD_LEN 0x3E0
static inline int static int
e1000_82547_fifo_workaround(struct e1000_adapter *adapter, struct sk_buff *skb) e1000_82547_fifo_workaround(struct e1000_adapter *adapter, struct sk_buff *skb)
{ {
uint32_t fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head; uint32_t fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
@ -2714,7 +2723,7 @@ no_fifo_stall_required:
} }
#define MINIMUM_DHCP_PACKET_SIZE 282 #define MINIMUM_DHCP_PACKET_SIZE 282
static inline int static int
e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb) e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -2980,8 +2989,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
/* Adapter-specific max frame size limits. */ /* Adapter-specific max frame size limits. */
switch (adapter->hw.mac_type) { switch (adapter->hw.mac_type) {
case e1000_82542_rev2_0: case e1000_undefined ... e1000_82542_rev2_1:
case e1000_82542_rev2_1:
if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n"); DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
return -EINVAL; return -EINVAL;
@ -3015,27 +3023,32 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
break; break;
} }
/* NOTE: dev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
* means we reserve 2 more, this pushes us to allocate from the next
* larger slab size
* i.e. RXBUFFER_2048 --> size-4096 slab */
if (adapter->hw.mac_type > e1000_82547_rev_2) { if (max_frame <= E1000_RXBUFFER_256)
adapter->rx_buffer_len = max_frame; adapter->rx_buffer_len = E1000_RXBUFFER_256;
E1000_ROUNDUP(adapter->rx_buffer_len, 1024); else if (max_frame <= E1000_RXBUFFER_512)
} else { adapter->rx_buffer_len = E1000_RXBUFFER_512;
if(unlikely((adapter->hw.mac_type < e1000_82543) && else if (max_frame <= E1000_RXBUFFER_1024)
(max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) { adapter->rx_buffer_len = E1000_RXBUFFER_1024;
DPRINTK(PROBE, ERR, "Jumbo Frames not supported " else if (max_frame <= E1000_RXBUFFER_2048)
"on 82542\n"); adapter->rx_buffer_len = E1000_RXBUFFER_2048;
return -EINVAL; else if (max_frame <= E1000_RXBUFFER_4096)
} else { adapter->rx_buffer_len = E1000_RXBUFFER_4096;
if(max_frame <= E1000_RXBUFFER_2048) else if (max_frame <= E1000_RXBUFFER_8192)
adapter->rx_buffer_len = E1000_RXBUFFER_2048; adapter->rx_buffer_len = E1000_RXBUFFER_8192;
else if(max_frame <= E1000_RXBUFFER_4096) else if (max_frame <= E1000_RXBUFFER_16384)
adapter->rx_buffer_len = E1000_RXBUFFER_4096; adapter->rx_buffer_len = E1000_RXBUFFER_16384;
else if(max_frame <= E1000_RXBUFFER_8192)
adapter->rx_buffer_len = E1000_RXBUFFER_8192; /* adjust allocation if LPE protects us, and we aren't using SBP */
else if(max_frame <= E1000_RXBUFFER_16384) #define MAXIMUM_ETHERNET_VLAN_SIZE 1522
adapter->rx_buffer_len = E1000_RXBUFFER_16384; if (!adapter->hw.tbi_compatibility_on &&
} ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) ||
} (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
netdev->mtu = new_mtu; netdev->mtu = new_mtu;
@ -3163,7 +3176,6 @@ e1000_update_stats(struct e1000_adapter *adapter)
adapter->stats.crcerrs + adapter->stats.algnerrc + adapter->stats.crcerrs + adapter->stats.algnerrc +
adapter->stats.ruc + adapter->stats.roc + adapter->stats.ruc + adapter->stats.roc +
adapter->stats.cexterr; adapter->stats.cexterr;
adapter->net_stats.rx_dropped = 0;
adapter->net_stats.rx_length_errors = adapter->stats.ruc + adapter->net_stats.rx_length_errors = adapter->stats.ruc +
adapter->stats.roc; adapter->stats.roc;
adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
@ -3389,13 +3401,15 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
tx_ring->next_to_clean = i; tx_ring->next_to_clean = i;
spin_lock(&tx_ring->tx_lock); #define TX_WAKE_THRESHOLD 32
if (unlikely(cleaned && netif_queue_stopped(netdev) && if (unlikely(cleaned && netif_queue_stopped(netdev) &&
netif_carrier_ok(netdev))) netif_carrier_ok(netdev))) {
netif_wake_queue(netdev); spin_lock(&tx_ring->tx_lock);
if (netif_queue_stopped(netdev) &&
spin_unlock(&tx_ring->tx_lock); (E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD))
netif_wake_queue(netdev);
spin_unlock(&tx_ring->tx_lock);
}
if (adapter->detect_tx_hung) { if (adapter->detect_tx_hung) {
/* Detect a transmit hang in hardware, this serializes the /* Detect a transmit hang in hardware, this serializes the
@ -3443,7 +3457,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
* @sk_buff: socket buffer with received data * @sk_buff: socket buffer with received data
**/ **/
static inline void static void
e1000_rx_checksum(struct e1000_adapter *adapter, e1000_rx_checksum(struct e1000_adapter *adapter,
uint32_t status_err, uint32_t csum, uint32_t status_err, uint32_t csum,
struct sk_buff *skb) struct sk_buff *skb)
@ -3567,10 +3581,12 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
flags); flags);
length--; length--;
} else { } else {
dev_kfree_skb_irq(skb); /* recycle */
buffer_info->skb = skb;
goto next_desc; goto next_desc;
} }
} } else
skb_put(skb, length);
/* code added for copybreak, this should improve /* code added for copybreak, this should improve
* performance for small packets with large amounts * performance for small packets with large amounts
@ -3675,6 +3691,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
i = rx_ring->next_to_clean; i = rx_ring->next_to_clean;
rx_desc = E1000_RX_DESC_PS(*rx_ring, i); rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
staterr = le32_to_cpu(rx_desc->wb.middle.status_error); staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
buffer_info = &rx_ring->buffer_info[i];
while (staterr & E1000_RXD_STAT_DD) { while (staterr & E1000_RXD_STAT_DD) {
buffer_info = &rx_ring->buffer_info[i]; buffer_info = &rx_ring->buffer_info[i];
@ -3735,7 +3752,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
/* page alloc/put takes too long and effects small packet /* page alloc/put takes too long and effects small packet
* throughput, so unsplit small packets and save the alloc/put*/ * throughput, so unsplit small packets and save the alloc/put*/
if (l1 && ((length + l1) < E1000_CB_LENGTH)) { if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) {
u8 *vaddr; u8 *vaddr;
/* there is no documentation about how to call /* there is no documentation about how to call
* kmap_atomic, so we can't hold the mapping * kmap_atomic, so we can't hold the mapping
@ -3768,6 +3785,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
ps_page->ps_page[j] = NULL; ps_page->ps_page[j] = NULL;
skb->len += length; skb->len += length;
skb->data_len += length; skb->data_len += length;
skb->truesize += length;
} }
copydone: copydone:
@ -4515,21 +4533,13 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN); E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN);
E1000_WRITE_REG(&adapter->hw, WUFC, wufc); E1000_WRITE_REG(&adapter->hw, WUFC, wufc);
retval = pci_enable_wake(pdev, PCI_D3hot, 1); pci_enable_wake(pdev, PCI_D3hot, 1);
if (retval) pci_enable_wake(pdev, PCI_D3cold, 1);
DPRINTK(PROBE, ERR, "Error enabling D3 wake\n");
retval = pci_enable_wake(pdev, PCI_D3cold, 1);
if (retval)
DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n");
} else { } else {
E1000_WRITE_REG(&adapter->hw, WUC, 0); E1000_WRITE_REG(&adapter->hw, WUC, 0);
E1000_WRITE_REG(&adapter->hw, WUFC, 0); E1000_WRITE_REG(&adapter->hw, WUFC, 0);
retval = pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3hot, 0);
if (retval) pci_enable_wake(pdev, PCI_D3cold, 0);
DPRINTK(PROBE, ERR, "Error enabling D3 wake\n");
retval = pci_enable_wake(pdev, PCI_D3cold, 0);
if (retval)
DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n");
} }
if (adapter->hw.mac_type >= e1000_82540 && if (adapter->hw.mac_type >= e1000_82540 &&
@ -4538,13 +4548,8 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
if (manc & E1000_MANC_SMBUS_EN) { if (manc & E1000_MANC_SMBUS_EN) {
manc |= E1000_MANC_ARP_EN; manc |= E1000_MANC_ARP_EN;
E1000_WRITE_REG(&adapter->hw, MANC, manc); E1000_WRITE_REG(&adapter->hw, MANC, manc);
retval = pci_enable_wake(pdev, PCI_D3hot, 1); pci_enable_wake(pdev, PCI_D3hot, 1);
if (retval) pci_enable_wake(pdev, PCI_D3cold, 1);
DPRINTK(PROBE, ERR, "Error enabling D3 wake\n");
retval = pci_enable_wake(pdev, PCI_D3cold, 1);
if (retval)
DPRINTK(PROBE, ERR,
"Error enabling D3 cold wake\n");
} }
} }
@ -4554,9 +4559,7 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
pci_disable_device(pdev); pci_disable_device(pdev);
retval = pci_set_power_state(pdev, pci_choose_state(pdev, state)); pci_set_power_state(pdev, pci_choose_state(pdev, state));
if (retval)
DPRINTK(PROBE, ERR, "Error in setting power state\n");
return 0; return 0;
} }
@ -4567,22 +4570,15 @@ e1000_resume(struct pci_dev *pdev)
{ {
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
int retval;
uint32_t manc, ret_val; uint32_t manc, ret_val;
retval = pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
if (retval)
DPRINTK(PROBE, ERR, "Error in setting power state\n");
e1000_pci_restore_state(adapter); e1000_pci_restore_state(adapter);
ret_val = pci_enable_device(pdev); ret_val = pci_enable_device(pdev);
pci_set_master(pdev); pci_set_master(pdev);
retval = pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3hot, 0);
if (retval) pci_enable_wake(pdev, PCI_D3cold, 0);
DPRINTK(PROBE, ERR, "Error enabling D3 wake\n");
retval = pci_enable_wake(pdev, PCI_D3cold, 0);
if (retval)
DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n");
e1000_reset(adapter); e1000_reset(adapter);
E1000_WRITE_REG(&adapter->hw, WUS, ~0); E1000_WRITE_REG(&adapter->hw, WUS, ~0);

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the Free
@ -22,6 +22,7 @@
Contact Information: Contact Information:
Linux NICS <linux.nics@intel.com> Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/