Changeset 33583


Ignore:
Timestamp:
2012-09-28T20:28:54+02:00 (5 years ago)
Author:
nbd
Message:

mac80211: fix beacon IE power constraint handling

Location:
trunk/package/mac80211/patches
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-pending_work.patch

    r33572 r33583  
    387387--- a/net/mac80211/mlme.c 
    388388+++ b/net/mac80211/mlme.c 
    389 @@ -1390,7 +1390,7 @@ static void ieee80211_set_disassoc(struc 
     389@@ -818,23 +818,71 @@ void ieee80211_sta_process_chanswitch(st 
     390 } 
     391  
     392 static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, 
     393-                                       u16 capab_info, u8 *pwr_constr_elem, 
     394-                                       u8 pwr_constr_elem_len) 
     395+                                       struct ieee80211_channel *channel, 
     396+                                       const u8 *country_ie, u8 country_ie_len, 
     397+                                       const u8 *pwr_constr_elem) 
     398 { 
     399-       struct ieee80211_conf *conf = &sdata->local->hw.conf; 
     400+       struct ieee80211_country_ie_triplet *triplet; 
     401+       int chan = ieee80211_frequency_to_channel(channel->center_freq); 
     402+       int i, chan_pwr, chan_increment, new_ap_level; 
     403+       bool have_chan_pwr = false; 
     404  
     405-       if (!(capab_info & WLAN_CAPABILITY_SPECTRUM_MGMT)) 
     406+       /* Invalid IE */ 
     407+       if (country_ie_len % 2 || country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN) 
     408                return; 
     409  
     410-       /* Power constraint IE length should be 1 octet */ 
     411-       if (pwr_constr_elem_len != 1) 
     412-               return; 
     413+       triplet = (void *)(country_ie + 3); 
     414+       country_ie_len -= 3; 
     415  
     416-       if ((*pwr_constr_elem <= conf->channel->max_reg_power) && 
     417-           (*pwr_constr_elem != sdata->local->power_constr_level)) { 
     418-               sdata->local->power_constr_level = *pwr_constr_elem; 
     419-               ieee80211_hw_config(sdata->local, 0); 
     420+       switch (channel->band) { 
     421+       default: 
     422+               WARN_ON_ONCE(1); 
     423+               /* fall through */ 
     424+       case IEEE80211_BAND_2GHZ: 
     425+       case IEEE80211_BAND_60GHZ: 
     426+               chan_increment = 1; 
     427+               break; 
     428+       case IEEE80211_BAND_5GHZ: 
     429+               chan_increment = 4; 
     430+               break; 
     431        } 
     432+ 
     433+       /* find channel */ 
     434+       while (country_ie_len >= 3) { 
     435+               u8 first_channel = triplet->chans.first_channel; 
     436+ 
     437+               if (first_channel >= IEEE80211_COUNTRY_EXTENSION_ID) 
     438+                       goto next; 
     439+ 
     440+               for (i = 0; i < triplet->chans.num_channels; i++) { 
     441+                       if (first_channel + i * chan_increment == chan) { 
     442+                               have_chan_pwr = true; 
     443+                               chan_pwr = triplet->chans.max_power; 
     444+                               break; 
     445+                       } 
     446+               } 
     447+               if (have_chan_pwr) 
     448+                       break; 
     449+ 
     450+ next: 
     451+               triplet++; 
     452+               country_ie_len -= 3; 
     453+       } 
     454+ 
     455+       if (!have_chan_pwr) 
     456+               return; 
     457+ 
     458+       new_ap_level = max_t(int, 0, chan_pwr - *pwr_constr_elem); 
     459+ 
     460+       if (sdata->local->ap_power_level == new_ap_level) 
     461+               return; 
     462+ 
     463+       sdata_info(sdata, 
     464+                  "Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n", 
     465+                  new_ap_level, chan_pwr, *pwr_constr_elem, 
     466+                  sdata->u.mgd.bssid); 
     467+       sdata->local->ap_power_level = new_ap_level; 
     468+       ieee80211_hw_config(sdata->local, 0); 
     469 } 
     470  
     471 void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif) 
     472@@ -1390,7 +1438,7 @@ static void ieee80211_set_disassoc(struc 
    390473        sta = sta_info_get(sdata, ifmgd->bssid); 
    391474        if (sta) { 
     
    396479        mutex_unlock(&local->sta_mtx); 
    397480  
     481@@ -1438,7 +1486,7 @@ static void ieee80211_set_disassoc(struc 
     482        memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa)); 
     483        memset(&ifmgd->ht_capa_mask, 0, sizeof(ifmgd->ht_capa_mask)); 
     484  
     485-       local->power_constr_level = 0; 
     486+       local->ap_power_level = 0; 
     487  
     488        del_timer_sync(&local->dynamic_ps_timer); 
     489        cancel_work_sync(&local->dynamic_ps_enable_work); 
     490@@ -2530,15 +2578,13 @@ static void ieee80211_rx_mgmt_beacon(str 
     491                                                  bssid, true); 
     492        } 
     493  
     494-       /* Note: country IE parsing is done for us by cfg80211 */ 
     495-       if (elems.country_elem) { 
     496-               /* TODO: IBSS also needs this */ 
     497-               if (elems.pwr_constr_elem) 
     498-                       ieee80211_handle_pwr_constr(sdata, 
     499-                               le16_to_cpu(mgmt->u.probe_resp.capab_info), 
     500-                               elems.pwr_constr_elem, 
     501-                               elems.pwr_constr_elem_len); 
     502-       } 
     503+       if (elems.country_elem && elems.pwr_constr_elem && 
     504+           mgmt->u.probe_resp.capab_info & 
     505+                               cpu_to_le16(WLAN_CAPABILITY_SPECTRUM_MGMT)) 
     506+               ieee80211_handle_pwr_constr(sdata, local->oper_channel, 
     507+                                           elems.country_elem, 
     508+                                           elems.country_elem_len, 
     509+                                           elems.pwr_constr_elem); 
     510  
     511        ieee80211_bss_info_change_notify(sdata, changed); 
     512 } 
    398513--- a/net/mac80211/sta_info.c 
    399514+++ b/net/mac80211/sta_info.c 
     
    423538                        if (channel->band == IEEE80211_BAND_5GHZ) { 
    424539                                /* Both sample_freq and chip_freq are 40MHz */ 
     540--- a/net/mac80211/ieee80211_i.h 
     541+++ b/net/mac80211/ieee80211_i.h 
     542@@ -1062,7 +1062,7 @@ struct ieee80211_local { 
     543        bool disable_dynamic_ps; 
     544  
     545        int user_power_level; /* in dBm */ 
     546-       int power_constr_level; /* in dBm */ 
     547+       int ap_power_level; /* in dBm */ 
     548  
     549        enum ieee80211_smps_mode smps_mode; 
     550  
     551@@ -1170,7 +1170,6 @@ struct ieee802_11_elems { 
     552        u8 prep_len; 
     553        u8 perr_len; 
     554        u8 country_elem_len; 
     555-       u8 pwr_constr_elem_len; 
     556        u8 quiet_elem_len; 
     557        u8 num_of_quiet_elem;   /* can be more the one */ 
     558        u8 timeout_int_len; 
     559--- a/net/mac80211/util.c 
     560+++ b/net/mac80211/util.c 
     561@@ -792,8 +792,11 @@ u32 ieee802_11_parse_elems_crc(u8 *start 
     562                        elems->country_elem_len = elen; 
     563                        break; 
     564                case WLAN_EID_PWR_CONSTRAINT: 
     565+                       if (elen != 1) { 
     566+                               elem_parse_failed = true; 
     567+                               break; 
     568+                       } 
     569                        elems->pwr_constr_elem = pos; 
     570-                       elems->pwr_constr_elem_len = elen; 
     571                        break; 
     572                case WLAN_EID_TIMEOUT_INTERVAL: 
     573                        elems->timeout_int = pos; 
     574--- a/net/mac80211/main.c 
     575+++ b/net/mac80211/main.c 
     576@@ -154,13 +154,11 @@ int ieee80211_hw_config(struct ieee80211 
     577  
     578        if (test_bit(SCAN_SW_SCANNING, &local->scanning) || 
     579            test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning) || 
     580-           test_bit(SCAN_HW_SCANNING, &local->scanning)) 
     581+           test_bit(SCAN_HW_SCANNING, &local->scanning) || 
     582+           !local->ap_power_level) 
     583                power = chan->max_power; 
     584        else 
     585-               power = local->power_constr_level ? 
     586-                       min(chan->max_power, 
     587-                               (chan->max_reg_power  - local->power_constr_level)) : 
     588-                       chan->max_power; 
     589+               power = min(chan->max_power, local->ap_power_level); 
     590  
     591        if (local->user_power_level >= 0) 
     592                power = min(power, local->user_power_level); 
  • trunk/package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch

    r33557 r33583  
    99  
    1010 #include "hw.h" 
    11 @@ -523,8 +524,16 @@ static int ath9k_hw_init_macaddr(struct 
     11@@ -523,8 +524,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • trunk/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r33557 r33583  
    11--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    22+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    3 @@ -89,13 +89,8 @@ ath5k_add_interface(struct ieee80211_hw 
     3@@ -89,13 +89,8 @@ ath5k_add_interface(struct ieee80211_hw  
    44                goto end; 
    55        } 
  • trunk/package/mac80211/patches/412-mac80211_allow_adhoc_and_ap.patch

    r33331 r33583  
    11--- a/net/mac80211/main.c 
    22+++ b/net/mac80211/main.c 
    3 @@ -794,17 +794,11 @@ int ieee80211_register_hw(struct ieee802 
     3@@ -792,17 +792,11 @@ int ieee80211_register_hw(struct ieee802 
    44         */ 
    55        for (i = 0; i < hw->wiphy->n_iface_combinations; i++) { 
  • trunk/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch

    r33557 r33583  
    1818 static bool 
    1919 ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data) 
    20 @@ -82,6 +83,19 @@ ath5k_pci_eeprom_read(struct ath_common 
     20@@ -82,6 +83,19 @@ ath5k_pci_eeprom_read(struct ath_common  
    2121        struct ath5k_hw *ah = (struct ath5k_hw *) common->ah; 
    2222        u32 status, timeout; 
  • trunk/package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch

    r33557 r33583  
    102102 /* debugfs: queues etc */ 
    103103  
    104 @@ -904,6 +987,9 @@ ath5k_debug_init_device(struct ath5k_hw 
     104@@ -904,6 +987,9 @@ ath5k_debug_init_device(struct ath5k_hw  
    105105        debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah, 
    106106                            &fops_beacon); 
  • trunk/package/mac80211/patches/520-mac80211_cur_txpower.patch

    r33331 r33583  
    2323--- a/net/mac80211/main.c 
    2424+++ b/net/mac80211/main.c 
    25 @@ -167,6 +167,7 @@ int ieee80211_hw_config(struct ieee80211 
     25@@ -165,6 +165,7 @@ int ieee80211_hw_config(struct ieee80211 
    2626  
    2727        if (local->hw.conf.power_level != power) { 
  • trunk/package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

    r33557 r33583  
    167167--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    168168+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    169 @@ -458,12 +458,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
     169@@ -458,12 +458,12 @@ int ath9k_hw_process_rxdesc_edma(struct  
    170170  
    171171        /* XXX: Keycache */ 
     
    228228--- a/drivers/net/wireless/ath/ath9k/debug.c 
    229229+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    230 @@ -997,12 +997,12 @@ void ath_debug_stat_rx(struct ath_softc 
     230@@ -997,12 +997,12 @@ void ath_debug_stat_rx(struct ath_softc  
    231231 #ifdef CONFIG_ATH9K_MAC_DEBUG 
    232232        spin_lock(&sc->debug.samp_lock); 
     
    364364--- a/drivers/net/wireless/ath/ath9k/antenna.c 
    365365+++ b/drivers/net/wireless/ath/ath9k/antenna.c 
    366 @@ -529,14 +529,14 @@ void ath_ant_comb_scan(struct ath_softc 
     366@@ -529,14 +529,14 @@ void ath_ant_comb_scan(struct ath_softc  
    367367        struct ath_ant_comb *antcomb = &sc->ant_comb; 
    368368        int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; 
  • trunk/package/mac80211/patches/540-ath9k_extra_leds.patch

    r33557 r33583  
    172172--- a/drivers/net/wireless/ath/ath9k/init.c 
    173173+++ b/drivers/net/wireless/ath/ath9k/init.c 
    174 @@ -811,7 +811,7 @@ int ath9k_init_device(u16 devid, struct 
     174@@ -811,7 +811,7 @@ int ath9k_init_device(u16 devid, struct  
    175175  
    176176 #ifdef CONFIG_MAC80211_LEDS 
  • trunk/package/mac80211/patches/563-ath9k_rx_dma_stop_check.patch

    r33557 r33583  
    11--- a/drivers/net/wireless/ath/ath9k/mac.c 
    22+++ b/drivers/net/wireless/ath/ath9k/mac.c 
    3 @@ -689,7 +689,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
     3@@ -689,7 +689,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw  
    44 { 
    55 #define AH_RX_STOP_DMA_TIMEOUT 10000   /* usec */ 
     
    1010  
    1111        /* Enable access to the DMA observation bus */ 
    12 @@ -719,6 +719,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
     12@@ -719,6 +719,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw  
    1313        } 
    1414  
  • trunk/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

    r33557 r33583  
    187187--- a/drivers/net/wireless/rt2x00/rt2800pci.c 
    188188+++ b/drivers/net/wireless/rt2x00/rt2800pci.c 
    189 @@ -89,20 +89,10 @@ static void rt2800pci_mcu_status(struct 
     189@@ -89,20 +89,10 @@ static void rt2800pci_mcu_status(struct  
    190190        rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); 
    191191 } 
     
    199199- 
    200200-       iounmap(base_addr); 
    201 -} 
     201+       memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE); 
     202 } 
    202203-#else 
    203204-static inline void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev) 
    204205-{ 
    205 +       memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE); 
    206  } 
     206-} 
    207207-#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */ 
    208208  
  • trunk/package/mac80211/patches/605-rt2x00-pci-eeprom.patch

    r33557 r33583  
    11--- a/drivers/net/wireless/rt2x00/rt2800pci.c 
    22+++ b/drivers/net/wireless/rt2x00/rt2800pci.c 
    3 @@ -89,7 +89,7 @@ static void rt2800pci_mcu_status(struct 
     3@@ -89,7 +89,7 @@ static void rt2800pci_mcu_status(struct  
    44        rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); 
    55 } 
  • trunk/package/mac80211/patches/620-rt2x00-support-rt3352.patch

    r33557 r33583  
    128128  
    129129 static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev) 
    130 @@ -2961,11 +3038,15 @@ static int rt2800_init_registers(struct 
     130@@ -2961,11 +3038,15 @@ static int rt2800_init_registers(struct  
    131131        if (rt2x00_rt(rt2x00dev, RT3071) || 
    132132            rt2x00_rt(rt2x00dev, RT3090) || 
  • trunk/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch

    r33557 r33583  
    1111--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c 
    1212+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c 
    13 @@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct 
     13@@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct  
    1414        brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs); 
    1515  
     
    2020                        brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16); 
    2121                else 
    22 @@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct 
     22@@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct  
    2323        if (wlc_hw->ucode_loaded) 
    2424                return; 
  • trunk/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch

    r33557 r33583  
    1111--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c 
    1212+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c 
    13 @@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct 
     13@@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct  
    1414        brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs); 
    1515  
     
    2020                        brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16); 
    2121                else 
    22 @@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct 
     22@@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct  
    2323        if (wlc_hw->ucode_loaded) 
    2424                return; 
Note: See TracChangeset for help on using the changeset viewer.