RE: [git patches] net driver fixes
From: Li Yang-r58472 <hidden>
Date: 2007-01-08 10:08:01
Hi Jeff, Could you apply the updates for ucc_geth driver? The patches from Timur that make the driver compile correctly on 2.6.20. [PATCH] Fix phy_read/write redefinition errors in ucc_geth_phy.c [PATCH] Update ucc_geth.c for new workqueue structure The patch from Ahmed that cleans up some unnecessary casts. [PATCH 2.6.20-rc3] UCC Ether driver: kmalloc casting cleanups - Leo
-----Original Message----- From: linux-kernel-owner@vger.kernel.org [mailto:linux-kernel-owner@vger.kernel.org] On Behalf Of Jeff Garzik Sent: Monday, January 08, 2007 5:48 PM To: Andrew Morton; Linus Torvalds Cc: netdev@vger.kernel.org; LKML Subject: [git patches] net driver fixes 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/e1000/e1000_main.c | 6 ---- 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
++++++++++++++++++++++++++++++++++----
quoted hunk ↗ jump to hunk
drivers/net/qla3xxx.c | 38 +++++++++++++++---------- drivers/net/wireless/ipw2100.c | 2 +- drivers/s390/net/qeth_main.c | 13 +++++--- include/net/ieee80211.h | 2 +- 9 files changed, 88 insertions(+), 35 deletions(-) Aaron Salter (1): ixgb: Write RA register high word first, increment version 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 Ron Mercer (2): qla3xxx: Remove NETIF_F_LLTX from driver features. qla3xxx: Add delay to NVRAM register access. Zhu Yi (2): ieee80211: WLAN_GET_SEQ_SEQ fix (select correct region) ipw2100: Fix dropping fragmented small packet problemdiff --git a/drivers/net/e1000/e1000_main.c
b/drivers/net/e1000/e1000_main.c
quoted hunk ↗ jump to hunk
index 4c1ff75..c6259c7 100644--- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c@@ -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;diff --git a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h index 50ffe90..f4aba43 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h@@ -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;diff --git a/drivers/net/ixgb/ixgb_ethtool.c
b/drivers/net/ixgb/ixgb_ethtool.c
quoted hunk ↗ jump to hunk
index cd22523..82c044d 100644--- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c@@ -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_TSOdiff --git a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c index 02089b6..ecbf458 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c@@ -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;diff --git a/drivers/net/ixgb/ixgb_main.c
b/drivers/net/ixgb/ixgb_main.c
quoted hunk ↗ jump to hunk
index e628126..a083a91 100644--- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c@@ -36,7 +36,7 @@ static char ixgb_driver_string[] = "Intel(R)
PRO/10GbE Network
Driver"; #else #define DRIVERNAPI "-NAPI" #endif -#define DRV_VERSION "1.0.117-k2"DRIVERNAPI +#define DRV_VERSION "1.0.126-k2"DRIVERNAPI char ixgb_driver_version[] = DRV_VERSION; static char ixgb_copyright[] = "Copyright (c) 1999-2006 Intel
Corporation.";
quoted hunk ↗ jump to hunk
@@ -1287,6 +1287,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct
sk_buff
quoted hunk ↗ jump to hunk
*skb, struct ixgb_buffer *buffer_info; int len = skb->len; unsigned int offset = 0, size, count = 0, i; + unsigned int mss = skb_shinfo(skb)->gso_size; unsigned int nr_frags = skb_shinfo(skb)->nr_frags; unsigned int f;@@ -1298,6 +1299,11 @@ 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))
quoted hunk ↗ jump to hunk
+ size -= 4; + buffer_info->length = size; WARN_ON(buffer_info->dma != 0); buffer_info->dma =@@ -1324,6 +1330,13 @@ ixgb_tx_map(struct ixgb_adapter *adapter,
struct sk_buff
quoted hunk ↗ jump to hunk
*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; + buffer_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, intsize)
+{
+ if (likely(IXGB_DESC_UNUSED(tx_ring) >= size))
+ return 0;
+ return __ixgb_maybe_stop_tx(netdev, size);
+}
+
+
/* 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*/ + \
quoted hunk ↗ jump to hunk
+ MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1 /* for context */ \ + + 1 /* one more needed for sentinel TSO workaround */ static int ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)@@ -1430,7 +1475,8 @@ ixgb_xmit_frame(struct sk_buff *skb, struct
net_device
*netdev) spin_lock_irqsave(&adapter->tx_lock, flags); #endif - if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED))
{quoted hunk ↗ jump to hunk
+ if (unlikely(ixgb_maybe_stop_tx(netdev, &adapter->tx_ring, + DESC_NEEDED))) { netif_stop_queue(netdev); spin_unlock_irqrestore(&adapter->tx_lock, flags); return NETDEV_TX_BUSY;@@ -1468,8 +1514,7 @@ ixgb_xmit_frame(struct sk_buff *skb, struct
net_device
quoted hunk ↗ jump to hunk
*netdev) #ifdef NETIF_F_LLTX /* Make sure there is space in the ring for the next send. */ - if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) - netif_stop_queue(netdev); + ixgb_maybe_stop_tx(netdev, &adapter->tx_ring, DESC_NEEDED); spin_unlock_irqrestore(&adapter->tx_lock, flags);diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index d79d141..8844c20 100644 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c@@ -208,6 +208,15 @@ static void ql_write_common_reg(struct
ql3_adapter *qdev,
quoted hunk ↗ jump to hunk
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));
quoted hunk ↗ jump to hunk
}@@ -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,
quoted hunk ↗ jump to hunk
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
quoted hunk ↗ jump to hunk
* 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
quoted hunk ↗ jump to hunk
* 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,
quoted hunk ↗ jump to hunk
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 |
quoted hunk ↗ jump to hunk
@@ -3370,7 +3379,6 @@ static int __devinit ql3xxx_probe(struct pci_dev
*pdev,
quoted hunk ↗ jump to hunk
SET_MODULE_OWNER(ndev); SET_NETDEV_DEV(ndev, &pdev->dev); - ndev->features = NETIF_F_LLTX; if (pci_using_dac) ndev->features |= NETIF_F_HIGHDMA;diff --git a/drivers/net/wireless/ipw2100.c
b/drivers/net/wireless/ipw2100.c
quoted hunk ↗ jump to hunk
index 0e94fbb..b85857a 100644--- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c@@ -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)) {quoted hunk ↗ jump to hunk
case IEEE80211_FTYPE_MGMT:diff --git a/drivers/s390/net/qeth_main.c
b/drivers/s390/net/qeth_main.c
quoted hunk ↗ jump to hunk
index 2bde4f1..f17d7cf 100644--- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c@@ -2560,7 +2560,6 @@ qeth_process_inbound_buffer(struct qeth_card
*card,
int offset; int rxrc; __u16 vlan_tag = 0; - __u16 *vlan_addr; /* get first element of current buffer */ element = (struct qdio_buffer_element
*)&buf->buffer->element[0];
quoted hunk ↗ jump to hunk
@@ -4844,9 +4843,11 @@ qeth_arp_query(struct qeth_card *card, char
__user *udata)
"(0x%x/%d)\n", QETH_CARD_IFNAME(card),
qeth_arp_get_error_cause(&rc),
quoted hunk ↗ jump to hunk
tmp, tmp); - copy_to_user(udata, qinfo.udata, 4); + if (copy_to_user(udata, qinfo.udata, 4)) + rc = -EFAULT; } else { - copy_to_user(udata, qinfo.udata, qinfo.udata_len); + if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) + rc = -EFAULT; } kfree(qinfo.udata); return rc;@@ -4992,8 +4993,10 @@ qeth_snmp_command(struct qeth_card *card, char
__user
quoted hunk ↗ jump to hunk
*udata) if (rc) PRINT_WARN("SNMP command failed on %s: (0x%x)\n", QETH_CARD_IFNAME(card), rc); - else - copy_to_user(udata, qinfo.udata, qinfo.udata_len); + else { + if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) + rc = -EFAULT; + } kfree(ureq); kfree(qinfo.udata);diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index e6af381..e02d85f 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h@@ -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 -To unsubscribe from this list: send the line "unsubscribe
linux-kernel" in
the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/