diff options
author | David S. Miller <davem@davemloft.net> | 2008-12-06 01:54:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-06 01:54:40 -0500 |
commit | 730c30ec646bd252a9448a66ecd51d794853513f (patch) | |
tree | c0d413860f9d8bf37374f17cfabb4911143465d7 /drivers/net | |
parent | 726e07a8a38168266ac95d87736f9501a2d9e7b2 (diff) | |
parent | 0a0755c9fe47dc9f8271935909c66096e43efbfe (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-sta.c
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/bnx2.c | 35 | ||||
-rw-r--r-- | drivers/net/bnx2.h | 6 | ||||
-rw-r--r-- | drivers/net/enc28j60.c | 16 | ||||
-rw-r--r-- | drivers/net/netx-eth.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-sta.c | 26 | ||||
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_mac.c | 2 |
8 files changed, 81 insertions, 11 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 182f2410c23d..0e2218dadb3d 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -3147,6 +3147,28 @@ bnx2_has_work(struct bnx2_napi *bnapi) | |||
3147 | return 0; | 3147 | return 0; |
3148 | } | 3148 | } |
3149 | 3149 | ||
3150 | static void | ||
3151 | bnx2_chk_missed_msi(struct bnx2 *bp) | ||
3152 | { | ||
3153 | struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; | ||
3154 | u32 msi_ctrl; | ||
3155 | |||
3156 | if (bnx2_has_work(bnapi)) { | ||
3157 | msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL); | ||
3158 | if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE)) | ||
3159 | return; | ||
3160 | |||
3161 | if (bnapi->last_status_idx == bp->idle_chk_status_idx) { | ||
3162 | REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl & | ||
3163 | ~BNX2_PCICFG_MSI_CONTROL_ENABLE); | ||
3164 | REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl); | ||
3165 | bnx2_msi(bp->irq_tbl[0].vector, bnapi); | ||
3166 | } | ||
3167 | } | ||
3168 | |||
3169 | bp->idle_chk_status_idx = bnapi->last_status_idx; | ||
3170 | } | ||
3171 | |||
3150 | static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi) | 3172 | static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi) |
3151 | { | 3173 | { |
3152 | struct status_block *sblk = bnapi->status_blk.msi; | 3174 | struct status_block *sblk = bnapi->status_blk.msi; |
@@ -3221,14 +3243,15 @@ static int bnx2_poll(struct napi_struct *napi, int budget) | |||
3221 | 3243 | ||
3222 | work_done = bnx2_poll_work(bp, bnapi, work_done, budget); | 3244 | work_done = bnx2_poll_work(bp, bnapi, work_done, budget); |
3223 | 3245 | ||
3224 | if (unlikely(work_done >= budget)) | ||
3225 | break; | ||
3226 | |||
3227 | /* bnapi->last_status_idx is used below to tell the hw how | 3246 | /* bnapi->last_status_idx is used below to tell the hw how |
3228 | * much work has been processed, so we must read it before | 3247 | * much work has been processed, so we must read it before |
3229 | * checking for more work. | 3248 | * checking for more work. |
3230 | */ | 3249 | */ |
3231 | bnapi->last_status_idx = sblk->status_idx; | 3250 | bnapi->last_status_idx = sblk->status_idx; |
3251 | |||
3252 | if (unlikely(work_done >= budget)) | ||
3253 | break; | ||
3254 | |||
3232 | rmb(); | 3255 | rmb(); |
3233 | if (likely(!bnx2_has_work(bnapi))) { | 3256 | if (likely(!bnx2_has_work(bnapi))) { |
3234 | netif_rx_complete(bp->dev, napi); | 3257 | netif_rx_complete(bp->dev, napi); |
@@ -4581,6 +4604,8 @@ bnx2_init_chip(struct bnx2 *bp) | |||
4581 | for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) | 4604 | for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) |
4582 | bp->bnx2_napi[i].last_status_idx = 0; | 4605 | bp->bnx2_napi[i].last_status_idx = 0; |
4583 | 4606 | ||
4607 | bp->idle_chk_status_idx = 0xffff; | ||
4608 | |||
4584 | bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE; | 4609 | bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE; |
4585 | 4610 | ||
4586 | /* Set up how to generate a link change interrupt. */ | 4611 | /* Set up how to generate a link change interrupt. */ |
@@ -5729,6 +5754,10 @@ bnx2_timer(unsigned long data) | |||
5729 | if (atomic_read(&bp->intr_sem) != 0) | 5754 | if (atomic_read(&bp->intr_sem) != 0) |
5730 | goto bnx2_restart_timer; | 5755 | goto bnx2_restart_timer; |
5731 | 5756 | ||
5757 | if ((bp->flags & (BNX2_FLAG_USING_MSI | BNX2_FLAG_ONE_SHOT_MSI)) == | ||
5758 | BNX2_FLAG_USING_MSI) | ||
5759 | bnx2_chk_missed_msi(bp); | ||
5760 | |||
5732 | bnx2_send_heart_beat(bp); | 5761 | bnx2_send_heart_beat(bp); |
5733 | 5762 | ||
5734 | bp->stats_blk->stat_FwRxDrop = | 5763 | bp->stats_blk->stat_FwRxDrop = |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 0763108fa1c5..2f43c45b7ad6 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -378,6 +378,9 @@ struct l2_fhdr { | |||
378 | * pci_config_l definition | 378 | * pci_config_l definition |
379 | * offset: 0000 | 379 | * offset: 0000 |
380 | */ | 380 | */ |
381 | #define BNX2_PCICFG_MSI_CONTROL 0x00000058 | ||
382 | #define BNX2_PCICFG_MSI_CONTROL_ENABLE (1L<<16) | ||
383 | |||
381 | #define BNX2_PCICFG_MISC_CONFIG 0x00000068 | 384 | #define BNX2_PCICFG_MISC_CONFIG 0x00000068 |
382 | #define BNX2_PCICFG_MISC_CONFIG_TARGET_BYTE_SWAP (1L<<2) | 385 | #define BNX2_PCICFG_MISC_CONFIG_TARGET_BYTE_SWAP (1L<<2) |
383 | #define BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP (1L<<3) | 386 | #define BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP (1L<<3) |
@@ -6882,6 +6885,9 @@ struct bnx2 { | |||
6882 | 6885 | ||
6883 | u8 num_tx_rings; | 6886 | u8 num_tx_rings; |
6884 | u8 num_rx_rings; | 6887 | u8 num_rx_rings; |
6888 | |||
6889 | u32 idle_chk_status_idx; | ||
6890 | |||
6885 | }; | 6891 | }; |
6886 | 6892 | ||
6887 | #define REG_RD(bp, offset) \ | 6893 | #define REG_RD(bp, offset) \ |
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c index 32c19790d013..d3c8e742e9ea 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c | |||
@@ -566,6 +566,17 @@ static u16 erxrdpt_workaround(u16 next_packet_ptr, u16 start, u16 end) | |||
566 | return erxrdpt; | 566 | return erxrdpt; |
567 | } | 567 | } |
568 | 568 | ||
569 | /* | ||
570 | * Calculate wrap around when reading beyond the end of the RX buffer | ||
571 | */ | ||
572 | static u16 rx_packet_start(u16 ptr) | ||
573 | { | ||
574 | if (ptr + RSV_SIZE > RXEND_INIT) | ||
575 | return (ptr + RSV_SIZE) - (RXEND_INIT - RXSTART_INIT + 1); | ||
576 | else | ||
577 | return ptr + RSV_SIZE; | ||
578 | } | ||
579 | |||
569 | static void nolock_rxfifo_init(struct enc28j60_net *priv, u16 start, u16 end) | 580 | static void nolock_rxfifo_init(struct enc28j60_net *priv, u16 start, u16 end) |
570 | { | 581 | { |
571 | u16 erxrdpt; | 582 | u16 erxrdpt; |
@@ -936,8 +947,9 @@ static void enc28j60_hw_rx(struct net_device *ndev) | |||
936 | skb->dev = ndev; | 947 | skb->dev = ndev; |
937 | skb_reserve(skb, NET_IP_ALIGN); | 948 | skb_reserve(skb, NET_IP_ALIGN); |
938 | /* copy the packet from the receive buffer */ | 949 | /* copy the packet from the receive buffer */ |
939 | enc28j60_mem_read(priv, priv->next_pk_ptr + sizeof(rsv), | 950 | enc28j60_mem_read(priv, |
940 | len, skb_put(skb, len)); | 951 | rx_packet_start(priv->next_pk_ptr), |
952 | len, skb_put(skb, len)); | ||
941 | if (netif_msg_pktdata(priv)) | 953 | if (netif_msg_pktdata(priv)) |
942 | dump_packet(__func__, skb->len, skb->data); | 954 | dump_packet(__func__, skb->len, skb->data); |
943 | skb->protocol = eth_type_trans(skb, ndev); | 955 | skb->protocol = eth_type_trans(skb, ndev); |
diff --git a/drivers/net/netx-eth.c b/drivers/net/netx-eth.c index b418771f6811..1861d5bbd96b 100644 --- a/drivers/net/netx-eth.c +++ b/drivers/net/netx-eth.c | |||
@@ -400,6 +400,8 @@ static int netx_eth_drv_probe(struct platform_device *pdev) | |||
400 | priv->xmac_base = priv->xc->xmac_base; | 400 | priv->xmac_base = priv->xc->xmac_base; |
401 | priv->sram_base = priv->xc->sram_base; | 401 | priv->sram_base = priv->xc->sram_base; |
402 | 402 | ||
403 | spin_lock_init(&priv->lock); | ||
404 | |||
403 | ret = pfifo_request(PFIFO_MASK(priv->id)); | 405 | ret = pfifo_request(PFIFO_MASK(priv->id)); |
404 | if (ret) { | 406 | if (ret) { |
405 | printk("unable to request PFIFO\n"); | 407 | printk("unable to request PFIFO\n"); |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 48fa6df3a774..23728eb6110a 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
@@ -3895,6 +3895,7 @@ static int ipw_disassociate(void *data) | |||
3895 | if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) | 3895 | if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) |
3896 | return 0; | 3896 | return 0; |
3897 | ipw_send_disassociate(data, 0); | 3897 | ipw_send_disassociate(data, 0); |
3898 | netif_carrier_off(priv->net_dev); | ||
3898 | return 1; | 3899 | return 1; |
3899 | } | 3900 | } |
3900 | 3901 | ||
@@ -10155,6 +10156,9 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, | |||
10155 | u16 remaining_bytes; | 10156 | u16 remaining_bytes; |
10156 | int fc; | 10157 | int fc; |
10157 | 10158 | ||
10159 | if (!(priv->status & STATUS_ASSOCIATED)) | ||
10160 | goto drop; | ||
10161 | |||
10158 | hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); | 10162 | hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); |
10159 | switch (priv->ieee->iw_mode) { | 10163 | switch (priv->ieee->iw_mode) { |
10160 | case IW_MODE_ADHOC: | 10164 | case IW_MODE_ADHOC: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 1b021ca74e25..d00dfe4edc3b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -238,7 +238,6 @@ int iwl_hw_nic_init(struct iwl_priv *priv) | |||
238 | } | 238 | } |
239 | EXPORT_SYMBOL(iwl_hw_nic_init); | 239 | EXPORT_SYMBOL(iwl_hw_nic_init); |
240 | 240 | ||
241 | |||
242 | void iwl_reset_qos(struct iwl_priv *priv) | 241 | void iwl_reset_qos(struct iwl_priv *priv) |
243 | { | 242 | { |
244 | u16 cw_min = 15; | 243 | u16 cw_min = 15; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index f86a8ca2aa3b..4a2479a1622a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
@@ -494,7 +494,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv) | |||
494 | if (!test_and_set_bit(i, &priv->ucode_key_table)) | 494 | if (!test_and_set_bit(i, &priv->ucode_key_table)) |
495 | return i; | 495 | return i; |
496 | 496 | ||
497 | return -1; | 497 | return WEP_INVALID_OFFSET; |
498 | } | 498 | } |
499 | 499 | ||
500 | int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty) | 500 | int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty) |
@@ -639,6 +639,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv, | |||
639 | /* else, we are overriding an existing key => no need to allocated room | 639 | /* else, we are overriding an existing key => no need to allocated room |
640 | * in uCode. */ | 640 | * in uCode. */ |
641 | 641 | ||
642 | WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, | ||
643 | "no space for new kew"); | ||
644 | |||
642 | priv->stations[sta_id].sta.key.key_flags = key_flags; | 645 | priv->stations[sta_id].sta.key.key_flags = key_flags; |
643 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; | 646 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; |
644 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; | 647 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; |
@@ -656,6 +659,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, | |||
656 | { | 659 | { |
657 | unsigned long flags; | 660 | unsigned long flags; |
658 | __le16 key_flags = 0; | 661 | __le16 key_flags = 0; |
662 | int ret; | ||
659 | 663 | ||
660 | key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK); | 664 | key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK); |
661 | key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); | 665 | key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); |
@@ -683,14 +687,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, | |||
683 | /* else, we are overriding an existing key => no need to allocated room | 687 | /* else, we are overriding an existing key => no need to allocated room |
684 | * in uCode. */ | 688 | * in uCode. */ |
685 | 689 | ||
690 | WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, | ||
691 | "no space for new kew"); | ||
692 | |||
686 | priv->stations[sta_id].sta.key.key_flags = key_flags; | 693 | priv->stations[sta_id].sta.key.key_flags = key_flags; |
687 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; | 694 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; |
688 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; | 695 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; |
689 | 696 | ||
697 | ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); | ||
698 | |||
690 | spin_unlock_irqrestore(&priv->sta_lock, flags); | 699 | spin_unlock_irqrestore(&priv->sta_lock, flags); |
691 | 700 | ||
692 | IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n"); | 701 | return ret; |
693 | return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); | ||
694 | } | 702 | } |
695 | 703 | ||
696 | static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, | 704 | static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, |
@@ -715,7 +723,10 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, | |||
715 | /* else, we are overriding an existing key => no need to allocated room | 723 | /* else, we are overriding an existing key => no need to allocated room |
716 | * in uCode. */ | 724 | * in uCode. */ |
717 | 725 | ||
718 | /* This copy is actually not needed: we get the key with each TX */ | 726 | WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, |
727 | "no space for new kew"); | ||
728 | |||
729 | /* This copy is acutally not needed: we get the key with each TX */ | ||
719 | memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16); | 730 | memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16); |
720 | 731 | ||
721 | memcpy(priv->stations[sta_id].sta.key.key, keyconf->key, 16); | 732 | memcpy(priv->stations[sta_id].sta.key.key, keyconf->key, 16); |
@@ -802,6 +813,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
802 | return 0; | 813 | return 0; |
803 | } | 814 | } |
804 | 815 | ||
816 | if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { | ||
817 | IWL_WARNING("Removing wrong key %d 0x%x\n", | ||
818 | keyconf->keyidx, key_flags); | ||
819 | spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
820 | return 0; | ||
821 | } | ||
822 | |||
805 | if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset, | 823 | if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset, |
806 | &priv->ucode_key_table)) | 824 | &priv->ucode_key_table)) |
807 | IWL_ERROR("index %d not used in uCode key table.\n", | 825 | IWL_ERROR("index %d not used in uCode key table.\n", |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 07513e48b8f2..9caa96a13586 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
@@ -615,7 +615,7 @@ static int filter_ack(struct ieee80211_hw *hw, struct ieee80211_hdr *rx_hdr, | |||
615 | struct ieee80211_hdr *tx_hdr; | 615 | struct ieee80211_hdr *tx_hdr; |
616 | 616 | ||
617 | tx_hdr = (struct ieee80211_hdr *)skb->data; | 617 | tx_hdr = (struct ieee80211_hdr *)skb->data; |
618 | if (likely(!compare_ether_addr(tx_hdr->addr2, rx_hdr->addr1))) | 618 | if (likely(!memcmp(tx_hdr->addr2, rx_hdr->addr1, ETH_ALEN))) |
619 | { | 619 | { |
620 | __skb_unlink(skb, q); | 620 | __skb_unlink(skb, q); |
621 | tx_status(hw, skb, stats->signal, 1); | 621 | tx_status(hw, skb, stats->signal, 1); |