Commit 8861e981 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

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