Commit 8fc65162 authored by Jeff Garzik's avatar Jeff Garzik

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

parents 2acab771 99a1f9e8
...@@ -1395,6 +1395,8 @@ P: Jesse Brandeburg ...@@ -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 ...@@ -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 ...@@ -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
......
...@@ -22,6 +22,7 @@ ...@@ -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
# #
################################################################################ ################################################################################
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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; ...@@ -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 { ...@@ -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
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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
*******************************************************************************/ *******************************************************************************/
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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
*******************************************************************************/ *******************************************************************************/
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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
*******************************************************************************/ *******************************************************************************/
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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"; ...@@ -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); ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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: ...@@ -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) ...@@ -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) ...@@ -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
if (adapter->hw.mac_type > e1000_82547_rev_2) { * means we reserve 2 more, this pushes us to allocate from the next
adapter->rx_buffer_len = max_frame; * larger slab size
E1000_ROUNDUP(adapter->rx_buffer_len, 1024); * i.e. RXBUFFER_2048 --> size-4096 slab */
} else {
if(unlikely((adapter->hw.mac_type < e1000_82543) && if (max_frame <= E1000_RXBUFFER_256)
(max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) { adapter->rx_buffer_len = E1000_RXBUFFER_256;
DPRINTK(PROBE, ERR, "Jumbo Frames not supported " else if (max_frame <= E1000_RXBUFFER_512)
"on 82542\n"); adapter->rx_buffer_len = E1000_RXBUFFER_512;
return -EINVAL; else if (max_frame <= E1000_RXBUFFER_1024)
} else { adapter->rx_buffer_len = E1000_RXBUFFER_1024;
if(max_frame <= E1000_RXBUFFER_2048) else if (max_frame <= E1000_RXBUFFER_2048)
adapter->rx_buffer_len = E1000_RXBUFFER_2048; adapter->rx_buffer_len = E1000_RXBUFFER_2048;
else if(max_frame <= E1000_RXBUFFER_4096) else if (max_frame <= E1000_RXBUFFER_4096)
adapter->rx_buffer_len = E1000_RXBUFFER_4096; adapter->rx_buffer_len = E1000_RXBUFFER_4096;
else if(max_frame <= E1000_RXBUFFER_8192) else if (max_frame <= E1000_RXBUFFER_8192)
adapter->rx_buffer_len = E1000_RXBUFFER_8192; adapter->rx_buffer_len = E1000_RXBUFFER_8192;
else if(max_frame <= E1000_RXBUFFER_16384) else if (max_frame <= E1000_RXBUFFER_16384)
adapter->rx_buffer_len = E1000_RXBUFFER_16384; adapter->rx_buffer_len = E1000_RXBUFFER_16384;
}
} /* adjust allocation if LPE protects us, and we aren't using SBP */
#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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
*******************************************************************************/ *******************************************************************************/
......
/******************************************************************************* /*******************************************************************************
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 @@ ...@@ -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
*******************************************************************************/ *******************************************************************************/
......
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