net driver fixes
Subsystems (4)
PATCH 1/1 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/myri10ge/myri10ge.c | 24 - drivers/net/phy/phy.c | 8 drivers/net/s2io.c | 386 ++++++++++++++------------------ drivers/net/s2io.h | 10 drivers/net/wireless/zd1211rw/zd_chip.c | 4 drivers/net/wireless/zd1211rw/zd_chip.h | 10 drivers/net/wireless/zd1211rw/zd_mac.c | 16 - drivers/net/wireless/zd1211rw/zd_usb.c | 7 8 files changed, 215 insertions(+), 250 deletions(-)
Ananda Raju:
s2io driver bug fixes #1
s2io driver bug fixes #2
Brice Goglin:
myri10ge - Write the firmware in 256-bytes chunks myri10ge - Fix spurious invokations of the watchdog reset handler
Daniel Drake:
zd1211rw: Pass more management frame types up to host
zd1211rw: Fix software encryption/decryption
zd1211rw: Remove bogus assert
Sergei Shtylylov:
Stop calling phy_stop_interrupts() twice
Ulrich Kunitz:
zd1211rw: Fixes radiotap header
zd1211rw: Fixed endianess issue with length info tag detection
zd1211rw: Packet filter fix for managed (STA) mode
drivers/net/myri10ge/myri10ge.c +11 -13
@@ -177,6 +177,7 @@ struct myri10ge_priv {struct work_struct watchdog_work;struct timer_list watchdog_timer;int watchdog_tx_done; +int watchdog_tx_req;int watchdog_resets;int tx_linearized;int pause;
@@ -448,6 +449,7 @@ static int myri10ge_load_hotplug_firmwarstruct mcp_gen_header *hdr;size_t hdr_offset;int status; +unsigned i;if ((status =request_firmware (&fw, mgp->fw_name, dev)) <0 ) { dev_err(dev, "Unable to load %s firmware image via hotplug\n",
@@ -479,18 +481,12 @@ static int myri10ge_load_hotplug_firmwar goto abort_with_fw; crc =crc32 (~0 , fw->data, fw->size); -if (mgp->tx.boundary ==2048 ) { -/* Avoid PCI burst on chipset with unaligned completions. */ -int i; -__iomem u32 *ptr = (__iomem u32 *) (mgp->sram + -MYRI10GE_FW_OFFSET ); -for (i =0 ; i < fw->size /4 ; i++) { -__raw_writel (((u32 *) fw->data)[i], ptr + i); -wmb (); - } - }else { -myri10ge_pio_copy (mgp->sram +MYRI10GE_FW_OFFSET , fw->data, - fw->size); +for (i =0 ; i < fw->size; i +=256 ) { +myri10ge_pio_copy (mgp->sram +MYRI10GE_FW_OFFSET + i, + fw->data + i, +min (256U , (unsigned )(fw->size - i))); +mb (); +readb (mgp->sram); }/* corruption checking is good for parity recovery and buggy chipset */ memcpy_fromio (fw->data, mgp->sram +MYRI10GE_FW_OFFSET , fw->size);
@@ -2547,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsi mgp = (struct myri10ge_priv *)arg;if (mgp->tx.req != mgp->tx.done && - mgp->tx.done == mgp->watchdog_tx_done) + mgp->tx.done == mgp->watchdog_tx_done && + mgp->watchdog_tx_req != mgp->watchdog_tx_done)/* nic seems like it might be stuck.. */ schedule_work (&mgp->watchdog_work);else
@@ -2556,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsi jiffies + myri10ge_watchdog_timeout * HZ); mgp->watchdog_tx_done = mgp->tx.done; + mgp->watchdog_tx_req = mgp->tx.req; }static int myri10ge_probe (struct pci_dev *pdev,const struct pci_device_id *ent)
drivers/net/phy/phy.c +2 -6
@@ -419,9 +419,8 @@ void phy_start_machine(struct phy_device/* phy_stop_machine * -* description: Stops the state machine timer, sets the state to -* UP (unless it wasn't up yet), and then frees the interrupt, -* if it is in use. This function must be called BEFORE +* description: Stops the state machine timer, sets the state to UP +* (unless it wasn't up yet). This function must be called BEFORE * phy_detach. */ void phy_stop_machine (struct phy_device *phydev)
@@ -433,9 +432,6 @@ void phy_stop_machine(struct phy_device phydev->state =PHY_UP ;spin_unlock (&phydev->lock); -if (phydev->irq !=PHY_POLL ) -phy_stop_interrupts (phydev); - phydev->adjust_state =NULL ; }
drivers/net/s2io.c +173 -213
704 lines not on this page · raw message
drivers/net/s2io.h +10 -0
@@ -719,6 +719,7 @@ struct msix_info_st {/* Data structure to represent a LRO session */ typedef struct lro { struct sk_buff *parent; + struct sk_buff *last_frag; u8 *l2h; struct iphdr *iph; struct tcphdr *tcph;
@@ -1011,4 +1012,13 @@ static void clear_lro_session(lro_t *lrostatic void queue_rx_frame (struct sk_buff *skb);static void update_L3L4_header (nic_t *sp,lro_t *lro);static void lro_append_pkt (nic_t *sp,lro_t *lro,struct sk_buff *skb,u32 tcp_len); + +#define s2io_tcp_mss (skb) skb_shinfo(skb)->gso_size +#define s2io_udp_mss (skb) skb_shinfo(skb)->gso_size +#define s2io_offload_type (skb) skb_shinfo(skb)->gso_type + +#define S2IO_PARM_INT (X , def_val) \ + static unsigned int X = def_val;\ + module_param(X , uint, 0); +#endif /* _S2IO_H */
drivers/net/wireless/zd1211rw/zd_chip.c +2 -2
@@ -797,7 +797,7 @@ static int zd1211_hw_init_hmac(struct zd { CR_ADDA_MBIAS_WARMTIME, 0x30000808 }, { CR_ZD1211_RETRY_MAX, 0x2 }, { CR_SNIFFER_ON, 0 }, - { CR_RX_FILTER, AP_RX_FILTER }, + { CR_RX_FILTER, STA_RX_FILTER }, { CR_GROUP_HASH_P1, 0x00 }, { CR_GROUP_HASH_P2, 0x80000000 }, { CR_REG1, 0xa4 },
@@ -844,7 +844,7 @@ static int zd1211b_hw_init_hmac(struct z { CR_ZD1211B_AIFS_CTL2, 0x008C003C }, { CR_ZD1211B_TXOP, 0x01800824 }, { CR_SNIFFER_ON, 0 }, - { CR_RX_FILTER, AP_RX_FILTER }, + { CR_RX_FILTER, STA_RX_FILTER }, { CR_GROUP_HASH_P1, 0x00 }, { CR_GROUP_HASH_P2, 0x80000000 }, { CR_REG1, 0xa4 },
drivers/net/wireless/zd1211rw/zd_chip.h +6 -4
@@ -461,10 +461,15 @@ #define CR_UNDERRUN_CNT CTL_REG(0x0688#define CR_RX_FILTER CTL_REG(0x068c)#define RX_FILTER_ASSOC_RESPONSE 0x0002 +#define RX_FILTER_REASSOC_RESPONSE 0x0008#define RX_FILTER_PROBE_RESPONSE 0x0020#define RX_FILTER_BEACON 0x0100 +#define RX_FILTER_DISASSOC 0x0400#define RX_FILTER_AUTH 0x0800 -/* Sniff modus sets filter to 0xfffff */ +#define AP_RX_FILTER 0x0400feff +#define STA_RX_FILTER 0x0000ffff + +/* Monitor mode sets filter to 0xfffff */ #define CR_ACK_TIMEOUT_EXT CTL_REG(0x0690)#define CR_BCN_FIFO_SEMAPHORE CTL_REG(0x0694)
@@ -546,9 +551,6 @@ #define CR_ZD1211B_AIFS_CTL2 CTL_REG(0x#define CR_ZD1211B_TXOP CTL_REG(0x0b20)#define CR_ZD1211B_RETRY_MAX CTL_REG(0x0b28) -#define AP_RX_FILTER 0x0400feff -#define STA_RX_FILTER 0x0000ffff -#define CWIN_SIZE 0x007f043f
drivers/net/wireless/zd1211rw/zd_mac.c +8 -8
@@ -108,7 +108,9 @@ int zd_mac_init_hw(struct zd_mac *mac, uif (r) goto disable_int; - r =zd_set_encryption_type (chip,NO_WEP ); +/* We must inform the device that we are doing encryption/decryption in +* software at the moment. */ + r =zd_set_encryption_type (chip,ENC_SNIFFER );if (r) goto disable_int;
@@ -136,10 +138,8 @@ static int reset_mode(struct zd_mac *mac {struct ieee80211_device *ieee =zd_mac_to_ieee80211 (mac);struct zd_ioreq32 ioreqs[3 ] = { - {CR_RX_FILTER ,RX_FILTER_BEACON |RX_FILTER_PROBE_RESPONSE | -RX_FILTER_AUTH |RX_FILTER_ASSOC_RESPONSE }, + {CR_RX_FILTER ,STA_RX_FILTER }, {CR_SNIFFER_ON ,0U }, - {CR_ENCRYPTION_TYPE ,NO_WEP }, };if (ieee->iw_mode ==IW_MODE_MONITOR ) {
@@ -713,10 +713,10 @@ static int zd_mac_tx(struct zd_mac *mac,struct zd_rt_hdr {struct ieee80211_radiotap_header rt_hdr;u8 rt_flags; +u8 rt_rate;u16 rt_channel;u16 rt_chbitmask; -u16 rt_rate; -}; +} __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, const struct ieee80211_rx_stats *stats,
@@ -735,14 +735,14 @@ static void fill_rt_header(void *buffer,if (status->decryption_type & (ZD_RX_WEP64 |ZD_RX_WEP128 |ZD_RX_WEP256 )) hdr->rt_flags |=IEEE80211_RADIOTAP_F_WEP ; + hdr->rt_rate = stats->rate /5 ; +/* FIXME: 802.11a */ hdr->rt_channel =cpu_to_le16 (ieee80211chan2mhz (_zd_chip_get_channel (&mac->chip))); hdr->rt_chbitmask =cpu_to_le16 (IEEE80211_CHAN_2GHZ | ((status->frame_status &ZD_RX_FRAME_MODULATION_MASK ) ==ZD_RX_OFDM ?IEEE80211_CHAN_OFDM :IEEE80211_CHAN_CCK )); - - hdr->rt_rate = stats->rate /5 ; }/* Returns 1 if the data packet is for us and 0 otherwise. */
drivers/net/wireless/zd1211rw/zd_usb.c +3 -4
@@ -323,7 +323,6 @@ static void disable_read_regs_int(struct {struct zd_usb_interrupt *intr = &usb->intr; -ZD_ASSERT (in_interrupt ());spin_lock (&intr->lock); intr->read_regs_enabled =0 ;spin_unlock (&intr->lock);
@@ -545,11 +544,11 @@ static void handle_rx_packet(struct zd_u* be padded. Unaligned access might also happen if the length_info * structure is not present. */ -if (get_unaligned (&length_info->tag) ==RX_LENGTH_INFO_TAG ) { +if (get_unaligned (&length_info->tag) ==cpu_to_le16 (RX_LENGTH_INFO_TAG )) + {unsigned int l, k, n;for (i =0 , l =0 ;; i++) { - k =le16_to_cpu (get_unaligned ( - &length_info->length[i])); + k =le16_to_cpu (get_unaligned (&length_info->length[i])); n = l+k;if (n > length)return ;