diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/mwl8k.c | 51 |
1 files changed, 13 insertions, 38 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index f93eddda9c0f..0251b6144f57 100644 --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c | |||
@@ -184,7 +184,7 @@ struct mwl8k_priv { | |||
184 | /* PHY parameters */ | 184 | /* PHY parameters */ |
185 | struct ieee80211_supported_band band; | 185 | struct ieee80211_supported_band band; |
186 | struct ieee80211_channel channels[14]; | 186 | struct ieee80211_channel channels[14]; |
187 | struct ieee80211_rate rates[13]; | 187 | struct ieee80211_rate rates[14]; |
188 | 188 | ||
189 | bool radio_on; | 189 | bool radio_on; |
190 | bool radio_short_preamble; | 190 | bool radio_short_preamble; |
@@ -220,15 +220,6 @@ struct mwl8k_vif { | |||
220 | u8 bssid[ETH_ALEN]; | 220 | u8 bssid[ETH_ALEN]; |
221 | u8 mac_addr[ETH_ALEN]; | 221 | u8 mac_addr[ETH_ALEN]; |
222 | 222 | ||
223 | /* | ||
224 | * Subset of supported legacy rates. | ||
225 | * Intersection of AP and STA supported rates. | ||
226 | */ | ||
227 | struct ieee80211_rate legacy_rates[13]; | ||
228 | |||
229 | /* number of supported legacy rates */ | ||
230 | u8 legacy_nrates; | ||
231 | |||
232 | /* Index into station database.Returned by update_sta_db call */ | 223 | /* Index into station database.Returned by update_sta_db call */ |
233 | u8 peer_id; | 224 | u8 peer_id; |
234 | 225 | ||
@@ -266,6 +257,11 @@ static const struct ieee80211_rate mwl8k_rates[] = { | |||
266 | { .bitrate = 360, .hw_value = 72, }, | 257 | { .bitrate = 360, .hw_value = 72, }, |
267 | { .bitrate = 480, .hw_value = 96, }, | 258 | { .bitrate = 480, .hw_value = 96, }, |
268 | { .bitrate = 540, .hw_value = 108, }, | 259 | { .bitrate = 540, .hw_value = 108, }, |
260 | { .bitrate = 720, .hw_value = 144, }, | ||
261 | }; | ||
262 | |||
263 | static const u8 mwl8k_rateids[12] = { | ||
264 | 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, | ||
269 | }; | 265 | }; |
270 | 266 | ||
271 | /* Set or get info from Firmware */ | 267 | /* Set or get info from Firmware */ |
@@ -633,8 +629,6 @@ struct ewc_ht_info { | |||
633 | /* Peer Entry flags - used to define the type of the peer node */ | 629 | /* Peer Entry flags - used to define the type of the peer node */ |
634 | #define MWL8K_PEER_TYPE_ACCESSPOINT 2 | 630 | #define MWL8K_PEER_TYPE_ACCESSPOINT 2 |
635 | 631 | ||
636 | #define MWL8K_IEEE_LEGACY_DATA_RATES 13 | ||
637 | |||
638 | struct peer_capability_info { | 632 | struct peer_capability_info { |
639 | /* Peer type - AP vs. STA. */ | 633 | /* Peer type - AP vs. STA. */ |
640 | __u8 peer_type; | 634 | __u8 peer_type; |
@@ -651,7 +645,7 @@ struct peer_capability_info { | |||
651 | struct ewc_ht_info ewc_info; | 645 | struct ewc_ht_info ewc_info; |
652 | 646 | ||
653 | /* Legacy rate table. Intersection of our rates and peer rates. */ | 647 | /* Legacy rate table. Intersection of our rates and peer rates. */ |
654 | __u8 legacy_rates[MWL8K_IEEE_LEGACY_DATA_RATES]; | 648 | __u8 legacy_rates[12]; |
655 | 649 | ||
656 | /* HT rate table. Intersection of our rates and peer rates. */ | 650 | /* HT rate table. Intersection of our rates and peer rates. */ |
657 | __u8 ht_rates[16]; | 651 | __u8 ht_rates[16]; |
@@ -2514,9 +2508,7 @@ static int mwl8k_cmd_update_sta_db(struct ieee80211_hw *hw, | |||
2514 | struct ieee80211_bss_conf *info = &mv_vif->bss_info; | 2508 | struct ieee80211_bss_conf *info = &mv_vif->bss_info; |
2515 | struct mwl8k_cmd_update_sta_db *cmd; | 2509 | struct mwl8k_cmd_update_sta_db *cmd; |
2516 | struct peer_capability_info *peer_info; | 2510 | struct peer_capability_info *peer_info; |
2517 | struct ieee80211_rate *bitrates = mv_vif->legacy_rates; | ||
2518 | int rc; | 2511 | int rc; |
2519 | __u8 count, *rates; | ||
2520 | 2512 | ||
2521 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | 2513 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); |
2522 | if (cmd == NULL) | 2514 | if (cmd == NULL) |
@@ -2535,13 +2527,11 @@ static int mwl8k_cmd_update_sta_db(struct ieee80211_hw *hw, | |||
2535 | /* Build peer_info block */ | 2527 | /* Build peer_info block */ |
2536 | peer_info->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT; | 2528 | peer_info->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT; |
2537 | peer_info->basic_caps = cpu_to_le16(info->assoc_capability); | 2529 | peer_info->basic_caps = cpu_to_le16(info->assoc_capability); |
2530 | memcpy(peer_info->legacy_rates, mwl8k_rateids, | ||
2531 | sizeof(mwl8k_rateids)); | ||
2538 | peer_info->interop = 1; | 2532 | peer_info->interop = 1; |
2539 | peer_info->amsdu_enabled = 0; | 2533 | peer_info->amsdu_enabled = 0; |
2540 | 2534 | ||
2541 | rates = peer_info->legacy_rates; | ||
2542 | for (count = 0; count < mv_vif->legacy_nrates; count++) | ||
2543 | rates[count] = bitrates[count].hw_value; | ||
2544 | |||
2545 | rc = mwl8k_post_cmd(hw, &cmd->header); | 2535 | rc = mwl8k_post_cmd(hw, &cmd->header); |
2546 | if (rc == 0) | 2536 | if (rc == 0) |
2547 | mv_vif->peer_id = peer_info->station_id; | 2537 | mv_vif->peer_id = peer_info->station_id; |
@@ -2564,8 +2554,6 @@ static int mwl8k_cmd_update_sta_db(struct ieee80211_hw *hw, | |||
2564 | /* | 2554 | /* |
2565 | * CMD_SET_AID. | 2555 | * CMD_SET_AID. |
2566 | */ | 2556 | */ |
2567 | #define MWL8K_RATE_INDEX_MAX_ARRAY 14 | ||
2568 | |||
2569 | #define MWL8K_FRAME_PROT_DISABLED 0x00 | 2557 | #define MWL8K_FRAME_PROT_DISABLED 0x00 |
2570 | #define MWL8K_FRAME_PROT_11G 0x07 | 2558 | #define MWL8K_FRAME_PROT_11G 0x07 |
2571 | #define MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY 0x02 | 2559 | #define MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY 0x02 |
@@ -2578,7 +2566,7 @@ struct mwl8k_cmd_update_set_aid { | |||
2578 | /* AP's MAC address (BSSID) */ | 2566 | /* AP's MAC address (BSSID) */ |
2579 | __u8 bssid[ETH_ALEN]; | 2567 | __u8 bssid[ETH_ALEN]; |
2580 | __le16 protection_mode; | 2568 | __le16 protection_mode; |
2581 | __u8 supp_rates[MWL8K_RATE_INDEX_MAX_ARRAY]; | 2569 | __u8 supp_rates[14]; |
2582 | } __attribute__((packed)); | 2570 | } __attribute__((packed)); |
2583 | 2571 | ||
2584 | static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw, | 2572 | static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw, |
@@ -2587,8 +2575,6 @@ static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw, | |||
2587 | struct mwl8k_vif *mv_vif = MWL8K_VIF(vif); | 2575 | struct mwl8k_vif *mv_vif = MWL8K_VIF(vif); |
2588 | struct ieee80211_bss_conf *info = &mv_vif->bss_info; | 2576 | struct ieee80211_bss_conf *info = &mv_vif->bss_info; |
2589 | struct mwl8k_cmd_update_set_aid *cmd; | 2577 | struct mwl8k_cmd_update_set_aid *cmd; |
2590 | struct ieee80211_rate *bitrates = mv_vif->legacy_rates; | ||
2591 | int count; | ||
2592 | u16 prot_mode; | 2578 | u16 prot_mode; |
2593 | int rc; | 2579 | int rc; |
2594 | 2580 | ||
@@ -2620,8 +2606,7 @@ static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw, | |||
2620 | } | 2606 | } |
2621 | cmd->protection_mode = cpu_to_le16(prot_mode); | 2607 | cmd->protection_mode = cpu_to_le16(prot_mode); |
2622 | 2608 | ||
2623 | for (count = 0; count < mv_vif->legacy_nrates; count++) | 2609 | memcpy(cmd->supp_rates, mwl8k_rateids, sizeof(mwl8k_rateids)); |
2624 | cmd->supp_rates[count] = bitrates[count].hw_value; | ||
2625 | 2610 | ||
2626 | rc = mwl8k_post_cmd(hw, &cmd->header); | 2611 | rc = mwl8k_post_cmd(hw, &cmd->header); |
2627 | kfree(cmd); | 2612 | kfree(cmd); |
@@ -2634,7 +2619,7 @@ static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw, | |||
2634 | */ | 2619 | */ |
2635 | struct mwl8k_cmd_update_rateset { | 2620 | struct mwl8k_cmd_update_rateset { |
2636 | struct mwl8k_cmd_pkt header; | 2621 | struct mwl8k_cmd_pkt header; |
2637 | __u8 legacy_rates[MWL8K_RATE_INDEX_MAX_ARRAY]; | 2622 | __u8 legacy_rates[14]; |
2638 | 2623 | ||
2639 | /* Bitmap for supported MCS codes. */ | 2624 | /* Bitmap for supported MCS codes. */ |
2640 | __u8 mcs_set[16]; | 2625 | __u8 mcs_set[16]; |
@@ -2644,10 +2629,7 @@ struct mwl8k_cmd_update_rateset { | |||
2644 | static int mwl8k_update_rateset(struct ieee80211_hw *hw, | 2629 | static int mwl8k_update_rateset(struct ieee80211_hw *hw, |
2645 | struct ieee80211_vif *vif) | 2630 | struct ieee80211_vif *vif) |
2646 | { | 2631 | { |
2647 | struct mwl8k_vif *mv_vif = MWL8K_VIF(vif); | ||
2648 | struct mwl8k_cmd_update_rateset *cmd; | 2632 | struct mwl8k_cmd_update_rateset *cmd; |
2649 | struct ieee80211_rate *bitrates = mv_vif->legacy_rates; | ||
2650 | int count; | ||
2651 | int rc; | 2633 | int rc; |
2652 | 2634 | ||
2653 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | 2635 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); |
@@ -2656,9 +2638,7 @@ static int mwl8k_update_rateset(struct ieee80211_hw *hw, | |||
2656 | 2638 | ||
2657 | cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATE); | 2639 | cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATE); |
2658 | cmd->header.length = cpu_to_le16(sizeof(*cmd)); | 2640 | cmd->header.length = cpu_to_le16(sizeof(*cmd)); |
2659 | 2641 | memcpy(cmd->legacy_rates, mwl8k_rateids, sizeof(mwl8k_rateids)); | |
2660 | for (count = 0; count < mv_vif->legacy_nrates; count++) | ||
2661 | cmd->legacy_rates[count] = bitrates[count].hw_value; | ||
2662 | 2642 | ||
2663 | rc = mwl8k_post_cmd(hw, &cmd->header); | 2643 | rc = mwl8k_post_cmd(hw, &cmd->header); |
2664 | kfree(cmd); | 2644 | kfree(cmd); |
@@ -2931,11 +2911,6 @@ static int mwl8k_add_interface(struct ieee80211_hw *hw, | |||
2931 | /* Back pointer to parent config block */ | 2911 | /* Back pointer to parent config block */ |
2932 | mwl8k_vif->priv = priv; | 2912 | mwl8k_vif->priv = priv; |
2933 | 2913 | ||
2934 | /* Setup initial PHY parameters */ | ||
2935 | memcpy(mwl8k_vif->legacy_rates, | ||
2936 | priv->rates, sizeof(mwl8k_vif->legacy_rates)); | ||
2937 | mwl8k_vif->legacy_nrates = ARRAY_SIZE(priv->rates); | ||
2938 | |||
2939 | /* Set Initial sequence number to zero */ | 2914 | /* Set Initial sequence number to zero */ |
2940 | mwl8k_vif->seqno = 0; | 2915 | mwl8k_vif->seqno = 0; |
2941 | 2916 | ||