net driver fixes
Subsystems (5)
PATCH 1/1 net driver fixes
[resend; updated with a few more bug fixes, since yesterday]
Please pull from 'upstream-linus' branch of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git upstream-linus
to receive the following updates:
drivers/net/chelsio/my3126.c | 5 +- drivers/net/e1000/e1000_main.c | 6 - drivers/net/forcedeth.c | 111 ++++++++++---------- drivers/net/ixgb/ixgb.h | 1 + drivers/net/ixgb/ixgb_ethtool.c | 1 + drivers/net/ixgb/ixgb_hw.c | 3 +- drivers/net/ixgb/ixgb_main.c | 57 +++++++++- drivers/net/pcmcia/pcnet_cs.c | 2 + drivers/net/qla3xxx.c | 38 ++++--- drivers/net/wireless/ipw2100.c | 2 +- drivers/s390/net/Kconfig | 5 +- drivers/s390/net/qeth.h | 2 +- drivers/s390/net/qeth_main.c | 217 +++++++++++++++++---------------------- include/net/ieee80211.h | 2 +- 14 files changed, 236 insertions(+), 216 deletions(-)
Aaron Salter (1):
ixgb: Write RA register high word first, increment version
Ayaz Abdulla (1):
forcedeth: sideband management fix
Frank Blaschka (3):
s390: qeth driver fixes: VLAN hdr, perf stats
s390: qeth driver fixes: packet socket
s390: qeth driver fixes: atomic context fixups
Frank Pavlic (1):
s390: iucv Kconfig help description changes
Heiko Carstens (1):
qeth: fix uaccess handling and get rid of unused variable
Jeff Garzik (1):
Revert "e1000: disable TSO on the 82544 with slab debugging"
Jesse Brandeburg (2):
ixgb: Fix early TSO completion
ixgb: Maybe stop TX if not enough free descriptors
Komuro (1):
pcnet_cs : add new id
Ron Mercer (2):
qla3xxx: Remove NETIF_F_LLTX from driver features.
qla3xxx: Add delay to NVRAM register access.
Stephen Hemminger (1):
chelsio: error path fix
Zhu Yi (2):
ieee80211: WLAN_GET_SEQ_SEQ fix (select correct region)
ipw2100: Fix dropping fragmented small packet problem
drivers/net/chelsio/my3126.c +3 -2
@@ -170,9 +170,10 @@ static struct cphy *my3126_phy_create(adapter_t *adapter, {struct cphy *cphy =kzalloc (sizeof (*cphy),GFP_KERNEL ); -if (cphy) -cphy_init (cphy, adapter, phy_addr, &my3126_ops, mdio_ops); +if (!cphy) +return NULL ; +cphy_init (cphy, adapter, phy_addr, &my3126_ops, mdio_ops);INIT_DELAYED_WORK (&cphy->phy_update, my3216_poll); cphy->bmsr =0 ;
drivers/net/e1000/e1000_main.c +0 -6
@@ -995,12 +995,6 @@ e1000_probe(struct pci_dev *pdev, (adapter->hw.mac_type != e1000_82547)) netdev->features |=NETIF_F_TSO ; -#ifdef CONFIG_DEBUG_SLAB -/* 82544's work arounds do not play nicely with DEBUG SLAB */ -if (adapter->hw.mac_type == e1000_82544) - netdev->features &= ~NETIF_F_TSO ; -#endif -#ifdef NETIF_F_TSO6 if (adapter->hw.mac_type > e1000_82547_rev_2) netdev->features |=NETIF_F_TSO6 ;
drivers/net/forcedeth.c +56 -55
203 lines not on this page · raw message
drivers/net/ixgb/ixgb.h +1 -0
@@ -171,6 +171,7 @@ struct ixgb_adapter {/* TX */ struct ixgb_desc_ring tx_ring____cacheline_aligned_in_smp ; +unsigned int restart_queue;unsigned long timeo_start;uint32_t tx_cmd_type;uint64_t hw_csum_tx_good;
drivers/net/ixgb/ixgb_ethtool.c +1 -0
@@ -79,6 +79,7 @@ static struct ixgb_stats ixgb_gstrings_stats[] = { {"tx_window_errors", IXGB_STAT(net_stats.tx_window_errors)}, {"tx_deferred_ok", IXGB_STAT(stats.dc)}, {"tx_timeout_count", IXGB_STAT(tx_timeout_count) }, + {"tx_restart_queue", IXGB_STAT(restart_queue) }, {"rx_long_length_errors", IXGB_STAT(stats.roc)}, {"rx_short_length_errors", IXGB_STAT(stats.ruc)}, #ifdef NETIF_F_TSO
drivers/net/ixgb/ixgb_hw.c +2 -1
@@ -399,8 +399,9 @@ ixgb_init_rx_addrs(struct ixgb_hw *hw)/* Zero out the other 15 receive addresses. */ DEBUGOUT ("Clearing RAR[1-15]\n" );for (i =1 ; i <IXGB_RAR_ENTRIES ; i++) { -IXGB_WRITE_REG_ARRAY (hw,RA , (i <<1 ),0 ); +/* Write high reg first to disable the AV bit first */ IXGB_WRITE_REG_ARRAY (hw,RA , ((i <<1 ) +1 ),0 ); +IXGB_WRITE_REG_ARRAY (hw,RA , (i <<1 ),0 ); }return ;
drivers/net/ixgb/ixgb_main.c +51 -6
102 lines not on this page · raw message
drivers/net/pcmcia/pcnet_cs.c +2 -0
@@ -1617,6 +1617,7 @@ static struct pcmcia_device_id pcnet_ids[] = {PCMCIA_DEVICE_PROD_ID12 ("corega K.K." ,"corega FastEther PCC-TX" ,0x5261440f ,0x485e85d9 ),PCMCIA_DEVICE_PROD_ID12 ("Corega,K.K." ,"Ethernet LAN Card" ,0x110d26d9 ,0x9fd2f0a2 ),PCMCIA_DEVICE_PROD_ID12 ("corega,K.K." ,"Ethernet LAN Card" ,0x9791a90e ,0x9fd2f0a2 ), +PCMCIA_DEVICE_PROD_ID12 ("corega K.K." ,"(CG-LAPCCTXD)" ,0x5261440f ,0x73ec0d88 ),PCMCIA_DEVICE_PROD_ID12 ("CouplerlessPCMCIA" ,"100BASE" ,0xee5af0ad ,0x7c2add04 ),PCMCIA_DEVICE_PROD_ID12 ("CyQ've" ,"ELA-010" ,0x77008979 ,0x9d8d445d ), PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-110E 10/100M LAN Card", 0x77008979, 0xfd184814),
@@ -1667,6 +1668,7 @@ static struct pcmcia_device_id pcnet_ids[] = {PCMCIA_DEVICE_PROD_ID12 ("Logitec" ,"LPM-LN100TX" ,0x88fcdeda ,0x6d772737 ),PCMCIA_DEVICE_PROD_ID12 ("Logitec" ,"LPM-LN100TE" ,0x88fcdeda ,0x0e714bee ),PCMCIA_DEVICE_PROD_ID12 ("Logitec" ,"LPM-LN20T" ,0x88fcdeda ,0x81090922 ), +PCMCIA_DEVICE_PROD_ID12 ("Logitec" ,"LPM-LN10TE" ,0x88fcdeda ,0xc1e2521c ),PCMCIA_DEVICE_PROD_ID12 ("LONGSHINE" ,"PCMCIA Ethernet Card" ,0xf866b0b0 ,0x6f6652e0 ),PCMCIA_DEVICE_PROD_ID12 ("MACNICA" ,"ME1-JEIDA" ,0x20841b68 ,0xaf8a3578 ), PCMCIA_DEVICE_PROD_ID12("Macsense", "MPC-10", 0xd830297f, 0xd265c307),
drivers/net/qla3xxx.c +23 -15
@@ -208,6 +208,15 @@ static void ql_write_common_reg(struct ql3_adapter *qdev,return ; } +static void ql_write_nvram_reg (struct ql3_adapter *qdev, +u32 __iomem *reg,u32 value) +{ +writel (value, reg); +readl (reg); +udelay (1 ); +return ; +} +static void ql_write_page0_reg (struct ql3_adapter *qdev,u32 __iomem *reg,u32 value) {
@@ -336,9 +345,9 @@ static void fm93c56a_select(struct ql3_adapter *qdev) qdev->mem_map_registers; qdev->eeprom_cmd_data =AUBURN_EEPROM_CS_1 ; -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg,ISP_NVRAM_MASK | qdev->eeprom_cmd_data); -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, ((ISP_NVRAM_MASK <<16 ) | qdev->eeprom_cmd_data)); }
@@ -355,14 +364,14 @@ static void fm93c56a_cmd(struct ql3_adapter *qdev, u32 cmd, u32 eepromAddr) qdev->mem_map_registers;/* Clock in a zero, then do the start bit */ -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg,ISP_NVRAM_MASK | qdev->eeprom_cmd_data |AUBURN_EEPROM_DO_1 ); -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data |AUBURN_EEPROM_DO_1 |AUBURN_EEPROM_CLK_RISE ); -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data |AUBURN_EEPROM_DO_1 |AUBURN_EEPROM_CLK_FALL );
@@ -378,20 +387,20 @@ static void fm93c56a_cmd(struct ql3_adapter *qdev, u32 cmd, u32 eepromAddr)* If the bit changed, then change the DO state to * match */ -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data | dataBit); previousBit = dataBit; } -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data | dataBit |AUBURN_EEPROM_CLK_RISE ); -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg, ISP_NVRAM_MASK | qdev->
@@ -412,20 +421,20 @@ static void fm93c56a_cmd(struct ql3_adapter *qdev, u32 cmd, u32 eepromAddr)* If the bit changed, then change the DO state to * match */ -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data | dataBit); previousBit = dataBit; } -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg,ISP_NVRAM_MASK | qdev-> eeprom_cmd_data | dataBit |AUBURN_EEPROM_CLK_RISE ); -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg, ISP_NVRAM_MASK | qdev->
@@ -443,7 +452,7 @@ static void fm93c56a_deselect(struct ql3_adapter *qdev)struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; qdev->eeprom_cmd_data =AUBURN_EEPROM_CS_0 ; -ql_write_common_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs.serialPortInterfaceReg,ISP_NVRAM_MASK | qdev->eeprom_cmd_data); }
@@ -461,12 +470,12 @@ static void fm93c56a_datain(struct ql3_adapter *qdev, unsigned short *value)/* Read the data bits */ /* The first bit is a dummy. Clock right over it. */ for (i =0 ; i < dataBits; i++) { -ql_write_common_reg (qdev, +ql_write_nvram_reg (qdev, &port_regs->CommonRegs. serialPortInterfaceReg,ISP_NVRAM_MASK | qdev->eeprom_cmd_data |AUBURN_EEPROM_CLK_RISE ); - ql_write_common_reg(qdev, + ql_write_nvram_reg(qdev, &port_regs->CommonRegs. serialPortInterfaceReg, ISP_NVRAM_MASK | qdev->eeprom_cmd_data |
@@ -3370,7 +3379,6 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev,SET_MODULE_OWNER (ndev);SET_NETDEV_DEV (ndev, &pdev->dev); - ndev->features =NETIF_F_LLTX ;if (pci_using_dac) ndev->features |=NETIF_F_HIGHDMA ;
drivers/net/wireless/ipw2100.c +1 -1
@@ -2664,7 +2664,7 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) break; }#endif -if (stats.len <sizeof (u->rx_data.header)) +if (stats.len <sizeof (struct ieee80211_hdr_3addr ))break ;switch (WLAN_FC_GET_TYPE (u->rx_data.header.frame_ctl)) {case IEEE80211_FTYPE_MGMT :
drivers/s390/net/Kconfig +1 -4
@@ -27,10 +27,7 @@ config IUCV help Select this option if you want to use inter-user communication under VM or VIF. If unsure, say "Y" to enable a fast communication - link between VM guests. At boot time the user ID of the guest needs - to be passed to the kernel. Note that both kernels need to be - compiled with this option and both need to be booted with the user ID - of the other VM guest. + link between VM guests. config NETIUCV tristate "IUCV network device support (VM only)"
drivers/s390/net/qeth.h +1 -1
@@ -710,7 +710,7 @@ struct qeth_reply {int (*callback)(struct qeth_card *,struct qeth_reply *,unsigned long );u32 seqno;unsigned long offset; -int received; +atomic_t received;int rc;void *param;struct qeth_card *card;
drivers/s390/net/qeth_main.c +93 -124
403 lines not on this page · raw message
include/net/ieee80211.h +1 -1
@@ -218,7 +218,7 @@ struct ieee80211_snap_hdr {#define WLAN_FC_GET_STYPE (fc) ((fc) & IEEE80211_FCTL_STYPE)#define WLAN_GET_SEQ_FRAG (seq) ((seq) & IEEE80211_SCTL_FRAG) -#define WLAN_GET_SEQ_SEQ (seq) ((seq) & IEEE80211_SCTL_SEQ) +#define WLAN_GET_SEQ_SEQ (seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)/* Authentication algorithms */ #define WLAN_AUTH_OPEN 0
On Tue, Jan 09, 2007 at 04:50:59AM -0500, Jeff Garzik wrote:
...
Quoted 69 lines
drivers/net/chelsio/my3126.c +3
-2@@ -170,9 +170,10 @@ static struct cphy *my3126_phy_create(adapter_t *adapter, {struct cphy *cphy =kzalloc (sizeof (*cphy),GFP_KERNEL ); -if (cphy) -cphy_init (cphy, adapter, phy_addr, &my3126_ops, mdio_ops); +if (!cphy) +return NULL ; +cphy_init (cphy, adapter, phy_addr, &my3126_ops, mdio_ops);INIT_DELAYED_WORK (&cphy->phy_update, my3216_poll); cphy->bmsr =0 ;drivers/net/e1000/e1000_main.c +0
-6@@ -995,12 +995,6 @@ e1000_probe(struct pci_dev *pdev, (adapter->hw.mac_type != e1000_82547)) netdev->features |=NETIF_F_TSO ; -#ifdef CONFIG_DEBUG_SLAB -/* 82544's work arounds do not play nicely with DEBUG SLAB */ -if (adapter->hw.mac_type == e1000_82544) - netdev->features &= ~NETIF_F_TSO ; -#endif -#ifdef NETIF_F_TSO6 if (adapter->hw.mac_type > e1000_82547_rev_2) netdev->features |=NETIF_F_TSO6 ;drivers/net/forcedeth.c +6
-2@@ -234,6 +234,7 @@ enum {#define NVREG_XMITCTL_HOST_SEMA_MASK 0x0000f000#define NVREG_XMITCTL_HOST_SEMA_ACQ 0x0000f000#define NVREG_XMITCTL_HOST_LOADED 0x00004000 +#define NVREG_XMITCTL_TX_PATH_EN 0x01000000 NvRegTransmitterStatus = 0x088,#define NVREG_XMITSTAT_BUSY 0x01@@ -249,6 +250,7 @@ enum {#define NVREG_OFFLOAD_NORMAL RX_NIC_BUFSIZE NvRegReceiverControl = 0x094,#define NVREG_RCVCTL_START 0x01 +#define NVREG_RCVCTL_RX_PATH_EN 0x01000000 NvRegReceiverStatus = 0x98,#define NVREG_RCVSTAT_BUSY 0x01@@ -1169,16 +1171,21 @@ static void nv_start_rx(struct net_device *dev) {struct fe_priv *np =netdev_priv (dev);u8 __iomem *base =get_hwbase (dev); +u32 rx_ctrl =readl (base + NvRegReceiverControl);dprintk (KERN_DEBUG "%s: nv_start_rx\n" , dev->name);/* Already running? Stop it. */ -if (readl (base + NvRegReceiverControl) &NVREG_RCVCTL_START ) { -writel (0 , base + NvRegReceiverControl); +if ((readl (base + NvRegReceiverControl) &NVREG_RCVCTL_START ) && !np->mac_in_use) { + rx_ctrl &= ~NVREG_RCVCTL_START ; +writel (rx_ctrl, base + NvRegReceiverControl);pci_push (base); }
drivers/net/forcedeth.c static void nv_start_rx(struct net_device *dev) · line 1191
Quoted 10 lines
drivers/net/forcedeth.c +4
-1writel (np->linkspeed, base + NvRegLinkSpeed);pci_push (base); -writel (NVREG_RCVCTL_START , base + NvRegReceiverControl); + rx_ctrl |=NVREG_RCVCTL_START ; +if (np->mac_in_use) + rx_ctrl &= ~NVREG_RCVCTL_RX_PATH_EN ; +writel (rx_ctrl, base + NvRegReceiverControl);dprintk (KERN_DEBUG "%s: nv_start_rx to duplex %d, speed 0x%08x.\n" , dev->name, np->duplex, np->linkspeed);pci_push (base);
Bad indentation.
Quoted 2 lines
drivers/net/ixgb/ixgb_main.c +0
-0
...
drivers/net/ixgb/ixgb_main.c ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, · line 1339
Quoted 11 lines
drivers/net/ixgb/ixgb_main.c +7
-0@@ -1324,6 +1330,13 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,while (len) { buffer_info = &tx_ring->buffer_info[i]; size =min (len,IXGB_MAX_DATA_PER_TXD ); + +/* Workaround for premature desc write-backs +* in TSO mode. Append 4-byte sentinel desc */ +if (unlikely (mss && !nr_frags && size == len + && size >8 )) + size -=4 ; +
The condition could be on one line.
Quoted 36 lines
drivers/net/ixgb/ixgb_main.c +29
-0buffer_info->length = size; buffer_info->dma = pci_map_page(adapter->pdev,@@ -1398,11 +1411,43 @@ ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,int tx_flags)IXGB_WRITE_REG (&adapter->hw,TDT , i); } +static int __ixgb_maybe_stop_tx (struct net_device *netdev,int size) +{ +struct ixgb_adapter *adapter =netdev_priv (netdev); +struct ixgb_desc_ring *tx_ring = &adapter->tx_ring; + +netif_stop_queue (netdev); +/* Herbert's original patch had: +* smp_mb__after_netif_stop_queue(); +* but since that doesn't exist yet, just open code it. */ +smp_mb (); + +/* We need to check again in a case another CPU has just +* made room available. */ +if (likely (IXGB_DESC_UNUSED (tx_ring) < size)) +return -EBUSY ; + +/* A reprieve! */ +netif_start_queue (netdev); + ++adapter->restart_queue; +return 0 ; +} + +static int ixgb_maybe_stop_tx (struct net_device *netdev, +struct ixgb_desc_ring *tx_ring,int size) +{ +if (likely (IXGB_DESC_UNUSED (tx_ring) >= size)) +return 0 ; +return __ixgb_maybe_stop_tx (netdev, size); +}
drivers/net/ixgb/ixgb_main.c ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,int tx_flags) · line 1450
Quoted 10 lines
drivers/net/ixgb/ixgb_main.c +5
-2+ +/* Tx Descriptors needed, worst case */ #define TXD_USE_COUNT (S ) (((S) >> IXGB_MAX_TXD_PWR) + \ (((S) & (IXGB_MAX_DATA_PER_TXD - 1)) ? 1 : 0)) -#define DESC_NEEDED TXD_USE_COUNT(IXGB_MAX_DATA_PER_TXD) + \ - MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1 +#define DESC_NEEDED TXD_USE_COUNT(IXGB_MAX_DATA_PER_TXD)/* skb->date */ + \ +MAX_SKB_FRAGS *TXD_USE_COUNT (PAGE_SIZE ) +1 /* for context */ \ + +1 /* one more needed for sentinel TSO workaround */
() around the additions
Josef "Jeff" Sipek.
Signature · 4 lines
The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. - George Bernard Shaw