Changeset 38354


Ignore:
Timestamp:
2013-10-10T16:31:22+02:00 (4 years ago)
Author:
nbd
Message:

ath9k: add some cleanups and minor fixes

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
16 edited

Legend:

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

    r38304 r38354  
    10161016+ 
    10171017+       INIT_LIST_HEAD(&bf_q); 
    1018 + 
     1018  
     1019-               ath_tx_fill_desc(sc, bf, txq, aggr_len); 
     1020-               ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
     1021-       } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
     1022-                status != ATH_AGGR_BAW_CLOSED); 
    10191023+       bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); 
    10201024+       if (!bf) 
     
    10281032+               return false; 
    10291033+       } 
    1030   
    1031 -               ath_tx_fill_desc(sc, bf, txq, aggr_len); 
    1032 -               ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    1033 -       } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
    1034 -                status != ATH_AGGR_BAW_CLOSED); 
     1034+ 
    10351035+       ath_set_rates(tid->an->vif, tid->an->sta, bf); 
    10361036+       if (aggr) 
     
    11671167                } 
    11681168                ath_txq_unlock_complete(sc, tid->ac->txq); 
    1169 @@ -1571,7 +1733,7 @@ static void ath_drain_txq_list(struct at 
     1169@@ -1542,16 +1704,9 @@ int ath_cabq_update(struct ath_softc *sc 
     1170        int qnum = sc->beacon.cabq->axq_qnum; 
     1171  
     1172        ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi); 
     1173-       /* 
     1174-        * Ensure the readytime % is within the bounds. 
     1175-        */ 
     1176-       if (sc->config.cabqReadytime < ATH9K_READY_TIME_LO_BOUND) 
     1177-               sc->config.cabqReadytime = ATH9K_READY_TIME_LO_BOUND; 
     1178-       else if (sc->config.cabqReadytime > ATH9K_READY_TIME_HI_BOUND) 
     1179-               sc->config.cabqReadytime = ATH9K_READY_TIME_HI_BOUND; 
     1180  
     1181        qi.tqi_readyTime = (cur_conf->beacon_interval * 
     1182-                           sc->config.cabqReadytime) / 100; 
     1183+                           ATH_CABQ_READY_TIME) / 100; 
     1184        ath_txq_update(sc, qnum, &qi); 
     1185  
     1186        return 0; 
     1187@@ -1571,7 +1726,7 @@ static void ath_drain_txq_list(struct at 
    11701188        while (!list_empty(list)) { 
    11711189                bf = list_first_entry(list, struct ath_buf, list); 
     
    11761194  
    11771195                        ath_tx_return_buffer(sc, bf); 
    1178 @@ -1665,25 +1827,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
     1196@@ -1665,25 +1820,27 @@ void ath_tx_cleanupq(struct ath_softc *s 
    11791197  */ 
    11801198 void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) 
     
    12091227                                               list); 
    12101228                        list_del(&tid->list); 
    1211 @@ -1692,17 +1856,17 @@ void ath_txq_schedule(struct ath_softc * 
     1229@@ -1692,17 +1849,17 @@ void ath_txq_schedule(struct ath_softc * 
    12121230                        if (tid->paused) 
    12131231                                continue; 
     
    12311249                } 
    12321250  
    1233 @@ -1711,9 +1875,17 @@ void ath_txq_schedule(struct ath_softc * 
     1251@@ -1711,9 +1868,17 @@ void ath_txq_schedule(struct ath_softc * 
    12341252                        list_add_tail(&ac->list, &txq->axq_acq); 
    12351253                } 
     
    12511269  
    12521270        rcu_read_unlock(); 
    1253 @@ -1787,74 +1959,28 @@ static void ath_tx_txqaddbuf(struct ath_ 
     1271@@ -1787,74 +1952,28 @@ static void ath_tx_txqaddbuf(struct ath_ 
    12541272                        if (bf_is_ampdu_not_probing(bf)) 
    12551273                                txq->axq_ampdu_depth++; 
     
    13351353        bf->bf_next = NULL; 
    13361354        bf->bf_lastbf = bf; 
    1337 @@ -1985,6 +2111,7 @@ static int ath_tx_prepare(struct ieee802 
     1355@@ -1911,8 +2030,7 @@ u8 ath_txchainmask_reduction(struct ath_ 
     1356        struct ath_hw *ah = sc->sc_ah; 
     1357        struct ath9k_channel *curchan = ah->curchan; 
     1358  
     1359-       if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && 
     1360-           (curchan->channelFlags & CHANNEL_5GHZ) && 
     1361+       if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && IS_CHAN_5GHZ(curchan) && 
     1362            (chainmask == 0x7) && (rate < 0x90)) 
     1363                return 0x3; 
     1364        else if (AR_SREV_9462(ah) && ath9k_hw_btcoex_is_enabled(ah) && 
     1365@@ -1985,6 +2103,7 @@ static int ath_tx_prepare(struct ieee802 
    13381366        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    13391367        struct ieee80211_sta *sta = txctl->sta; 
     
    13431371        int frmlen = skb->len + FCS_LEN; 
    13441372        int padpos, padsize; 
    1345 @@ -1992,6 +2119,10 @@ static int ath_tx_prepare(struct ieee802 
     1373@@ -1992,6 +2111,10 @@ static int ath_tx_prepare(struct ieee802 
    13461374        /* NOTE:  sta can be NULL according to net/mac80211.h */ 
    13471375        if (sta) 
     
    13541382        if (info->control.hw_key) 
    13551383                frmlen += info->control.hw_key->icv_len; 
    1356 @@ -2041,7 +2172,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1384@@ -2041,7 +2164,6 @@ int ath_tx_start(struct ieee80211_hw *hw 
    13571385        struct ath_txq *txq = txctl->txq; 
    13581386        struct ath_atx_tid *tid = NULL; 
     
    13621390        int ret; 
    13631391  
    1364 @@ -2069,27 +2199,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
     1392@@ -2069,27 +2191,31 @@ int ath_tx_start(struct ieee80211_hw *hw 
    13651393                ath_txq_unlock(sc, txq); 
    13661394                txq = sc->tx.uapsdq; 
     
    14051433                        dev_kfree_skb_any(skb); 
    14061434                else 
    1407 @@ -2142,7 +2276,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
     1435@@ -2142,7 +2268,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw 
    14081436  
    14091437                bf->bf_lastbf = bf; 
     
    14141442                if (bf_tail) 
    14151443                        bf_tail->bf_next = bf; 
    1416 @@ -2189,7 +2323,7 @@ static void ath_tx_complete(struct ath_s 
     1444@@ -2189,7 +2315,7 @@ static void ath_tx_complete(struct ath_s 
    14171445        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    14181446        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     
    14231451  
    14241452        ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 
    1425 @@ -2225,21 +2359,7 @@ static void ath_tx_complete(struct ath_s 
     1453@@ -2225,21 +2351,7 @@ static void ath_tx_complete(struct ath_s 
    14261454        spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    14271455  
     
    14461474  
    14471475 static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 
    1448 @@ -2360,8 +2480,7 @@ static void ath_tx_processq(struct ath_s 
     1476@@ -2360,8 +2472,7 @@ static void ath_tx_processq(struct ath_s 
    14491477  
    14501478                if (list_empty(&txq->axq_q)) { 
     
    14561484                } 
    14571485                bf = list_first_entry(&txq->axq_q, struct ath_buf, list); 
    1458 @@ -2375,7 +2494,7 @@ static void ath_tx_processq(struct ath_s 
     1486@@ -2375,7 +2486,7 @@ static void ath_tx_processq(struct ath_s 
    14591487                 * it with the STALE flag. 
    14601488                 */ 
     
    14651493                        if (list_is_last(&bf_held->list, &txq->axq_q)) 
    14661494                                break; 
    1467 @@ -2399,7 +2518,7 @@ static void ath_tx_processq(struct ath_s 
     1495@@ -2399,7 +2510,7 @@ static void ath_tx_processq(struct ath_s 
    14681496                 * however leave the last descriptor back as the holding 
    14691497                 * descriptor for hw. 
     
    14741502                if (!list_is_singular(&lastbf->list)) 
    14751503                        list_cut_position(&bf_head, 
    1476 @@ -2470,7 +2589,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1504@@ -2470,7 +2581,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14771505                } 
    14781506  
     
    14831511                        ath_tx_return_buffer(sc, bf); 
    14841512                        bf = list_first_entry(fifo_list, struct ath_buf, list); 
    1485 @@ -2492,7 +2611,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1513@@ -2492,7 +2603,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
    14861514                                ath_tx_txqaddbuf(sc, txq, &bf_q, true); 
    14871515                        } 
     
    14921520                                list_cut_position(&bf_head, fifo_list, 
    14931521                                                  lastbf->list.prev); 
    1494 @@ -2583,6 +2702,7 @@ void ath_tx_node_init(struct ath_softc * 
     1522@@ -2583,6 +2694,7 @@ void ath_tx_node_init(struct ath_softc * 
    14951523                tid->paused    = false; 
    14961524                tid->active        = false; 
     
    15001528                tid->ac = &an->ac[acno]; 
    15011529        } 
    1502 @@ -2590,6 +2710,7 @@ void ath_tx_node_init(struct ath_softc * 
     1530@@ -2590,6 +2702,7 @@ void ath_tx_node_init(struct ath_softc * 
    15031531        for (acno = 0, ac = &an->ac[acno]; 
    15041532             acno < IEEE80211_NUM_ACS; acno++, ac++) { 
     
    15481576        ieee80211_wake_queues(sc->hw); 
    15491577  
    1550 @@ -543,21 +549,10 @@ chip_reset: 
     1578@@ -306,17 +312,91 @@ out: 
     1579  * by reseting the chip.  To accomplish this we must first cleanup any pending 
     1580  * DMA, then restart stuff. 
     1581 */ 
     1582-static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, 
     1583-                   struct ath9k_channel *hchan) 
     1584+static int ath_set_channel(struct ath_softc *sc, struct cfg80211_chan_def *chandef) 
     1585 { 
     1586+       struct ath_hw *ah = sc->sc_ah; 
     1587+       struct ath_common *common = ath9k_hw_common(ah); 
     1588+       struct ieee80211_hw *hw = sc->hw; 
     1589+       struct ath9k_channel *hchan; 
     1590+       struct ieee80211_channel *chan = chandef->chan; 
     1591+       unsigned long flags; 
     1592+       bool offchannel; 
     1593+       int pos = chan->hw_value; 
     1594+       int old_pos = -1; 
     1595        int r; 
     1596  
     1597        if (test_bit(SC_OP_INVALID, &sc->sc_flags)) 
     1598                return -EIO; 
     1599  
     1600+       offchannel = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL); 
     1601+ 
     1602+       if (ah->curchan) 
     1603+               old_pos = ah->curchan - &ah->channels[0]; 
     1604+ 
     1605+       ath_dbg(common, CONFIG, "Set channel: %d MHz width: %d\n", 
     1606+               chan->center_freq, chandef->width); 
     1607+ 
     1608+       /* update survey stats for the old channel before switching */ 
     1609+       spin_lock_irqsave(&common->cc_lock, flags); 
     1610+       ath_update_survey_stats(sc); 
     1611+       spin_unlock_irqrestore(&common->cc_lock, flags); 
     1612+ 
     1613+       ath9k_cmn_get_channel(hw, ah, chandef); 
     1614+ 
     1615+       /* 
     1616+        * If the operating channel changes, change the survey in-use flags 
     1617+        * along with it. 
     1618+        * Reset the survey data for the new channel, unless we're switching 
     1619+        * back to the operating channel from an off-channel operation. 
     1620+        */ 
     1621+       if (!offchannel && sc->cur_survey != &sc->survey[pos]) { 
     1622+               if (sc->cur_survey) 
     1623+                       sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE; 
     1624+ 
     1625+               sc->cur_survey = &sc->survey[pos]; 
     1626+ 
     1627+               memset(sc->cur_survey, 0, sizeof(struct survey_info)); 
     1628+               sc->cur_survey->filled |= SURVEY_INFO_IN_USE; 
     1629+       } else if (!(sc->survey[pos].filled & SURVEY_INFO_IN_USE)) { 
     1630+               memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
     1631+       } 
     1632+ 
     1633+       hchan = &sc->sc_ah->channels[pos]; 
     1634        r = ath_reset_internal(sc, hchan); 
     1635+       if (r) 
     1636+               return r; 
     1637  
     1638-       return r; 
     1639+       /* 
     1640+        * The most recent snapshot of channel->noisefloor for the old 
     1641+        * channel is only available after the hardware reset. Copy it to 
     1642+        * the survey stats now. 
     1643+        */ 
     1644+       if (old_pos >= 0) 
     1645+               ath_update_survey_nf(sc, old_pos); 
     1646+ 
     1647+       /* 
     1648+        * Enable radar pulse detection if on a DFS channel. Spectral 
     1649+        * scanning and radar detection can not be used concurrently. 
     1650+        */ 
     1651+       if (hw->conf.radar_enabled) { 
     1652+               u32 rxfilter; 
     1653+ 
     1654+               /* set HW specific DFS configuration */ 
     1655+               ath9k_hw_set_radar_params(ah); 
     1656+               rxfilter = ath9k_hw_getrxfilter(ah); 
     1657+               rxfilter |= ATH9K_RX_FILTER_PHYRADAR | 
     1658+                               ATH9K_RX_FILTER_PHYERR; 
     1659+               ath9k_hw_setrxfilter(ah, rxfilter); 
     1660+               ath_dbg(common, DFS, "DFS enabled at freq %d\n", 
     1661+                       chan->center_freq); 
     1662+       } else { 
     1663+               /* perform spectral scan if requested. */ 
     1664+               if (test_bit(SC_OP_SCANNING, &sc->sc_flags) && 
     1665+                       sc->spectral_mode == SPECTRAL_CHANSCAN) 
     1666+                       ath9k_spectral_scan_trigger(hw); 
     1667+       } 
     1668+ 
     1669+       return 0; 
     1670 } 
     1671  
     1672 static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta, 
     1673@@ -543,21 +623,10 @@ chip_reset: 
    15511674  
    15521675 static int ath_reset(struct ath_softc *sc) 
     
    15711694  
    15721695        return r; 
    1573 @@ -966,6 +961,8 @@ static int ath9k_add_interface(struct ie 
     1696@@ -599,7 +668,7 @@ static int ath9k_start(struct ieee80211_ 
     1697        ath9k_ps_wakeup(sc); 
     1698        mutex_lock(&sc->mutex); 
     1699  
     1700-       init_channel = ath9k_cmn_get_curchannel(hw, ah); 
     1701+       init_channel = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef); 
     1702  
     1703        /* Reset SERDES registers */ 
     1704        ath9k_hw_configpcipowersave(ah, false); 
     1705@@ -802,7 +871,7 @@ static void ath9k_stop(struct ieee80211_ 
     1706        } 
     1707  
     1708        if (!ah->curchan) 
     1709-               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
     1710+               ah->curchan = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef); 
     1711  
     1712        ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
     1713        ath9k_hw_phy_disable(ah); 
     1714@@ -821,7 +890,7 @@ static void ath9k_stop(struct ieee80211_ 
     1715        ath_dbg(common, CONFIG, "Driver halt\n"); 
     1716 } 
     1717  
     1718-bool ath9k_uses_beacons(int type) 
     1719+static bool ath9k_uses_beacons(int type) 
     1720 { 
     1721        switch (type) { 
     1722        case NL80211_IFTYPE_AP: 
     1723@@ -966,6 +1035,8 @@ static int ath9k_add_interface(struct ie 
    15741724        struct ath_softc *sc = hw->priv; 
    15751725        struct ath_hw *ah = sc->sc_ah; 
     
    15801730        mutex_lock(&sc->mutex); 
    15811731  
    1582 @@ -979,6 +976,12 @@ static int ath9k_add_interface(struct ie 
     1732@@ -979,6 +1050,12 @@ static int ath9k_add_interface(struct ie 
    15831733        if (ath9k_uses_beacons(vif->type)) 
    15841734                ath9k_beacon_assign_slot(sc, vif); 
     
    15931743        return 0; 
    15941744 } 
    1595 @@ -1016,6 +1019,7 @@ static void ath9k_remove_interface(struc 
     1745@@ -1016,6 +1093,7 @@ static void ath9k_remove_interface(struc 
    15961746 { 
    15971747        struct ath_softc *sc = hw->priv; 
     
    16011751        ath_dbg(common, CONFIG, "Detach Interface\n"); 
    16021752  
    1603 @@ -1030,6 +1034,8 @@ static void ath9k_remove_interface(struc 
     1753@@ -1030,6 +1108,8 @@ static void ath9k_remove_interface(struc 
    16041754        ath9k_calculate_summary_state(hw, NULL); 
    16051755        ath9k_ps_restore(sc); 
     
    16101760 } 
    16111761  
    1612 @@ -1193,8 +1199,6 @@ static int ath9k_config(struct ieee80211 
     1762@@ -1192,83 +1272,12 @@ static int ath9k_config(struct ieee80211 
     1763        } 
    16131764  
    16141765        if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) { 
    1615                 struct ieee80211_channel *curchan = hw->conf.chandef.chan; 
     1766-               struct ieee80211_channel *curchan = hw->conf.chandef.chan; 
    16161767-               enum nl80211_channel_type channel_type = 
    16171768-                       cfg80211_get_chandef_type(&conf->chandef); 
    1618                 int pos = curchan->hw_value; 
    1619                 int old_pos = -1; 
    1620                 unsigned long flags; 
    1621 @@ -1202,8 +1206,8 @@ static int ath9k_config(struct ieee80211 
    1622                 if (ah->curchan) 
    1623                         old_pos = ah->curchan - &ah->channels[0]; 
    1624   
     1769-               int pos = curchan->hw_value; 
     1770-               int old_pos = -1; 
     1771-               unsigned long flags; 
     1772- 
     1773-               if (ah->curchan) 
     1774-                       old_pos = ah->curchan - &ah->channels[0]; 
     1775- 
    16251776-               ath_dbg(common, CONFIG, "Set channel: %d MHz type: %d\n", 
    16261777-                       curchan->center_freq, channel_type); 
    1627 +               ath_dbg(common, CONFIG, "Set channel: %d MHz width: %d\n", 
    1628 +                       curchan->center_freq, hw->conf.chandef.width); 
    1629   
    1630                 /* update survey stats for the old channel before switching */ 
    1631                 spin_lock_irqsave(&common->cc_lock, flags); 
    1632 @@ -1211,7 +1215,7 @@ static int ath9k_config(struct ieee80211 
    1633                 spin_unlock_irqrestore(&common->cc_lock, flags); 
    1634   
    1635                 ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos], 
     1778- 
     1779-               /* update survey stats for the old channel before switching */ 
     1780-               spin_lock_irqsave(&common->cc_lock, flags); 
     1781-               ath_update_survey_stats(sc); 
     1782-               spin_unlock_irqrestore(&common->cc_lock, flags); 
     1783- 
     1784-               ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos], 
    16361785-                                         curchan, channel_type); 
    1637 +                                         &conf->chandef); 
    1638   
    1639                 /* 
    1640                  * If the operating channel changes, change the survey in-use flags 
    1641 @@ -1374,9 +1378,6 @@ static void ath9k_sta_notify(struct ieee 
     1786- 
     1787-               /* 
     1788-                * If the operating channel changes, change the survey in-use flags 
     1789-                * along with it. 
     1790-                * Reset the survey data for the new channel, unless we're switching 
     1791-                * back to the operating channel from an off-channel operation. 
     1792-                */ 
     1793-               if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && 
     1794-                   sc->cur_survey != &sc->survey[pos]) { 
     1795- 
     1796-                       if (sc->cur_survey) 
     1797-                               sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE; 
     1798- 
     1799-                       sc->cur_survey = &sc->survey[pos]; 
     1800- 
     1801-                       memset(sc->cur_survey, 0, sizeof(struct survey_info)); 
     1802-                       sc->cur_survey->filled |= SURVEY_INFO_IN_USE; 
     1803-               } else if (!(sc->survey[pos].filled & SURVEY_INFO_IN_USE)) { 
     1804-                       memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
     1805-               } 
     1806- 
     1807-               if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) { 
     1808+               if (ath_set_channel(sc, &hw->conf.chandef) < 0) { 
     1809                        ath_err(common, "Unable to set channel\n"); 
     1810                        mutex_unlock(&sc->mutex); 
     1811                        ath9k_ps_restore(sc); 
     1812                        return -EINVAL; 
     1813                } 
     1814- 
     1815-               /* 
     1816-                * The most recent snapshot of channel->noisefloor for the old 
     1817-                * channel is only available after the hardware reset. Copy it to 
     1818-                * the survey stats now. 
     1819-                */ 
     1820-               if (old_pos >= 0) 
     1821-                       ath_update_survey_nf(sc, old_pos); 
     1822- 
     1823-               /* 
     1824-                * Enable radar pulse detection if on a DFS channel. Spectral 
     1825-                * scanning and radar detection can not be used concurrently. 
     1826-                */ 
     1827-               if (hw->conf.radar_enabled) { 
     1828-                       u32 rxfilter; 
     1829- 
     1830-                       /* set HW specific DFS configuration */ 
     1831-                       ath9k_hw_set_radar_params(ah); 
     1832-                       rxfilter = ath9k_hw_getrxfilter(ah); 
     1833-                       rxfilter |= ATH9K_RX_FILTER_PHYRADAR | 
     1834-                                   ATH9K_RX_FILTER_PHYERR; 
     1835-                       ath9k_hw_setrxfilter(ah, rxfilter); 
     1836-                       ath_dbg(common, DFS, "DFS enabled at freq %d\n", 
     1837-                               curchan->center_freq); 
     1838-               } else { 
     1839-                       /* perform spectral scan if requested. */ 
     1840-                       if (test_bit(SC_OP_SCANNING, &sc->sc_flags) && 
     1841-                           sc->spectral_mode == SPECTRAL_CHANSCAN) 
     1842-                               ath9k_spectral_scan_trigger(hw); 
     1843-               } 
     1844        } 
     1845  
     1846        if (changed & IEEE80211_CONF_CHANGE_POWER) { 
     1847@@ -1374,9 +1383,6 @@ static void ath9k_sta_notify(struct ieee 
    16421848        struct ath_softc *sc = hw->priv; 
    16431849        struct ath_node *an = (struct ath_node *) sta->drv_priv; 
     
    16491855        case STA_NOTIFY_SLEEP: 
    16501856                an->sleeping = true; 
    1651 @@ -2094,7 +2095,7 @@ static void ath9k_wow_add_pattern(struct 
     1857@@ -2094,7 +2100,7 @@ static void ath9k_wow_add_pattern(struct 
    16521858 { 
    16531859        struct ath_hw *ah = sc->sc_ah; 
     
    31653371--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    31663372+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3167 @@ -72,17 +72,12 @@ struct ath_config { 
     3373@@ -64,7 +64,6 @@ struct ath_node; 
     3374  
     3375 struct ath_config { 
     3376        u16 txpowlimit; 
     3377-       u8 cabqReadytime; 
     3378 }; 
     3379  
     3380 /*************************/ 
     3381@@ -72,17 +71,12 @@ struct ath_config { 
    31683382 /*************************/ 
    31693383  
     
    31833397  * enum buffer_type - Buffer type flags 
    31843398  * 
    3185 @@ -137,7 +132,8 @@ int ath_descdma_setup(struct ath_softc * 
     3399@@ -137,7 +131,8 @@ int ath_descdma_setup(struct ath_softc * 
    31863400 #define ATH_AGGR_ENCRYPTDELIM      10 
    31873401 /* minimum h/w qdepth to be sustained to maximize aggregation */ 
     
    31933407 #define IEEE80211_SEQ_SEQ_SHIFT    4 
    31943408 #define IEEE80211_SEQ_MAX          4096 
    3195 @@ -174,12 +170,6 @@ int ath_descdma_setup(struct ath_softc * 
     3409@@ -174,12 +169,6 @@ int ath_descdma_setup(struct ath_softc * 
    31963410  
    31973411 #define ATH_TX_COMPLETE_POLL_INT       1000 
     
    32063420 struct ath_txq { 
    32073421        int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */ 
    3208 @@ -201,10 +191,10 @@ struct ath_txq { 
     3422@@ -201,10 +190,10 @@ struct ath_txq { 
    32093423  
    32103424 struct ath_atx_ac { 
     
    32183432  
    32193433 struct ath_frame_info { 
    3220 @@ -212,14 +202,16 @@ struct ath_frame_info { 
     3434@@ -212,14 +201,24 @@ struct ath_frame_info { 
    32213435        int framelen; 
    32223436        enum ath9k_key_type keytype; 
     
    32263440+       u8 retries : 7; 
    32273441+       u8 baw_tracked : 1; 
     3442+}; 
     3443+ 
     3444+struct ath_rxbuf { 
     3445+       struct list_head list; 
     3446+       struct sk_buff *bf_mpdu; 
     3447+       void *bf_desc; 
     3448+       dma_addr_t bf_daddr; 
     3449+       dma_addr_t bf_buf_addr; 
    32283450 }; 
    32293451  
     
    32363458        unsigned long bfs_paprd_timestamp; 
    32373459 }; 
    3238 @@ -233,7 +225,6 @@ struct ath_buf { 
     3460@@ -233,7 +232,6 @@ struct ath_buf { 
    32393461        void *bf_desc;                  /* virtual addr of desc */ 
    32403462        dma_addr_t bf_daddr;            /* physical addr of desc */ 
     
    32443466        struct ath_buf_state bf_state; 
    32453467 }; 
    3246 @@ -241,16 +232,18 @@ struct ath_buf { 
     3468@@ -241,16 +239,18 @@ struct ath_buf { 
    32473469 struct ath_atx_tid { 
    32483470        struct list_head list; 
     
    32653487        bool paused; 
    32663488        bool active; 
    3267 @@ -262,12 +255,13 @@ struct ath_node { 
     3489@@ -262,12 +262,13 @@ struct ath_node { 
    32683490        struct ieee80211_vif *vif; /* interface with which we're associated */ 
    32693491        struct ath_atx_tid tid[IEEE80211_NUM_TIDS]; 
     
    32803502 #if defined(CPTCFG_MAC80211_DEBUGFS) && defined(CPTCFG_ATH9K_DEBUGFS) 
    32813503        struct dentry *node_stat; 
    3282 @@ -317,6 +311,7 @@ struct ath_rx { 
     3504@@ -317,6 +318,7 @@ struct ath_rx { 
    32833505        struct ath_descdma rxdma; 
    32843506        struct ath_rx_edma rx_edma[ATH9K_RX_QUEUE_MAX]; 
    32853507  
    3286 +       struct ath_buf *buf_hold; 
     3508+       struct ath_rxbuf *buf_hold; 
    32873509        struct sk_buff *frag; 
    32883510  
    32893511        u32 ampdu_ref; 
    3290 @@ -367,6 +362,7 @@ void ath9k_release_buffered_frames(struc 
     3512@@ -367,6 +369,7 @@ void ath9k_release_buffered_frames(struc 
    32913513 /********/ 
    32923514  
     
    32963518        bool primary_sta_vif; 
    32973519        __le64 tsf_adjust; /* TSF adjustment for staggered beacons */ 
    3298 @@ -585,19 +581,14 @@ static inline void ath_fill_led_pin(stru 
     3520@@ -585,19 +588,14 @@ static inline void ath_fill_led_pin(stru 
    32993521 #define ATH_ANT_DIV_COMB_MAX_COUNT 100 
    33003522 #define ATH_ANT_DIV_COMB_ALT_ANT_RATIO 30 
     
    33183540        u16 count; 
    33193541        u16 total_pkt_count; 
    3320 @@ -614,27 +605,36 @@ struct ath_ant_comb { 
     3542@@ -614,27 +612,36 @@ struct ath_ant_comb { 
    33213543        int rssi_first; 
    33223544        int rssi_second; 
     
    33613583 /* 
    33623584  * Default cache line size, in bytes. 
     3585@@ -926,7 +933,6 @@ void ath9k_deinit_device(struct ath_soft 
     3586 void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw); 
     3587 void ath9k_reload_chainmask_settings(struct ath_softc *sc); 
     3588  
     3589-bool ath9k_uses_beacons(int type); 
     3590 void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw); 
     3591 int ath9k_spectral_scan_config(struct ieee80211_hw *hw, 
     3592                               enum spectral_mode spectral_mode); 
    33633593--- a/drivers/net/wireless/ath/ath9k/debug.c 
    33643594+++ b/drivers/net/wireless/ath/ath9k/debug.c 
     
    37964026--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    37974027+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    3798 @@ -632,6 +632,22 @@ static void ar9003_hw_override_ini(struc 
     4028@@ -551,8 +551,7 @@ static void ar9003_hw_set_channel_regs(s 
     4029        if (IS_CHAN_HT40(chan)) { 
     4030                phymode |= AR_PHY_GC_DYN2040_EN; 
     4031                /* Configure control (primary) channel at +-10MHz */ 
     4032-               if ((chan->chanmode == CHANNEL_A_HT40PLUS) || 
     4033-                   (chan->chanmode == CHANNEL_G_HT40PLUS)) 
     4034+               if (IS_CHAN_HT40PLUS(chan)) 
     4035                        phymode |= AR_PHY_GC_DYN2040_PRI_CH; 
     4036  
     4037        } 
     4038@@ -565,7 +564,7 @@ static void ar9003_hw_set_channel_regs(s 
     4039        REG_WRITE(ah, AR_PHY_GEN_CTRL, phymode); 
     4040  
     4041        /* Configure MAC for 20/40 operation */ 
     4042-       ath9k_hw_set11nmac2040(ah); 
     4043+       ath9k_hw_set11nmac2040(ah, chan); 
     4044  
     4045        /* global transmit timeout (25 TUs default)*/ 
     4046        REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S); 
     4047@@ -632,6 +631,22 @@ static void ar9003_hw_override_ini(struc 
    37994048  
    38004049        REG_SET_BIT(ah, AR_PHY_CCK_DETECT, 
     
    38194068  
    38204069 static void ar9003_hw_prog_ini(struct ath_hw *ah, 
    3821 @@ -814,29 +830,12 @@ static int ar9003_hw_process_ini(struct  
     4070@@ -667,41 +682,22 @@ static int ar9550_hw_get_modes_txgain_in 
     4071 { 
     4072        int ret; 
     4073  
     4074-       switch (chan->chanmode) { 
     4075-       case CHANNEL_A: 
     4076-       case CHANNEL_A_HT20: 
     4077-               if (chan->channel <= 5350) 
     4078-                       ret = 1; 
     4079-               else if ((chan->channel > 5350) && (chan->channel <= 5600)) 
     4080-                       ret = 3; 
     4081+       if (IS_CHAN_2GHZ(chan)) { 
     4082+               if (IS_CHAN_HT40(chan)) 
     4083+                       return 7; 
     4084                else 
     4085-                       ret = 5; 
     4086-               break; 
     4087- 
     4088-       case CHANNEL_A_HT40PLUS: 
     4089-       case CHANNEL_A_HT40MINUS: 
     4090-               if (chan->channel <= 5350) 
     4091-                       ret = 2; 
     4092-               else if ((chan->channel > 5350) && (chan->channel <= 5600)) 
     4093-                       ret = 4; 
     4094-               else 
     4095-                       ret = 6; 
     4096-               break; 
     4097+                       return 8; 
     4098+       } 
     4099  
     4100-       case CHANNEL_G: 
     4101-       case CHANNEL_G_HT20: 
     4102-       case CHANNEL_B: 
     4103-               ret = 8; 
     4104-               break; 
     4105+       if (chan->channel <= 5350) 
     4106+               ret = 1; 
     4107+       else if ((chan->channel > 5350) && (chan->channel <= 5600)) 
     4108+               ret = 3; 
     4109+       else 
     4110+               ret = 5; 
     4111  
     4112-       case CHANNEL_G_HT40PLUS: 
     4113-       case CHANNEL_G_HT40MINUS: 
     4114-               ret = 7; 
     4115-               break; 
     4116- 
     4117-       default: 
     4118-               ret = -EINVAL; 
     4119-       } 
     4120+       if (IS_CHAN_HT40(chan)) 
     4121+               ret++; 
     4122  
     4123        return ret; 
     4124 } 
     4125@@ -712,28 +708,10 @@ static int ar9003_hw_process_ini(struct  
     4126        unsigned int regWrites = 0, i; 
     4127        u32 modesIndex; 
     4128  
     4129-       switch (chan->chanmode) { 
     4130-       case CHANNEL_A: 
     4131-       case CHANNEL_A_HT20: 
     4132-               modesIndex = 1; 
     4133-               break; 
     4134-       case CHANNEL_A_HT40PLUS: 
     4135-       case CHANNEL_A_HT40MINUS: 
     4136-               modesIndex = 2; 
     4137-               break; 
     4138-       case CHANNEL_G: 
     4139-       case CHANNEL_G_HT20: 
     4140-       case CHANNEL_B: 
     4141-               modesIndex = 4; 
     4142-               break; 
     4143-       case CHANNEL_G_HT40PLUS: 
     4144-       case CHANNEL_G_HT40MINUS: 
     4145-               modesIndex = 3; 
     4146-               break; 
     4147- 
     4148-       default: 
     4149-               return -EINVAL; 
     4150-       } 
     4151+       if (IS_CHAN_5GHZ(chan)) 
     4152+               modesIndex = IS_CHAN_HT40(chan) ? 2 : 1; 
     4153+       else 
     4154+               modesIndex = IS_CHAN_HT40(chan) ? 3 : 4; 
     4155  
     4156        /* 
     4157         * SOC, MAC, BB, RADIO initvals. 
     4158@@ -814,29 +792,12 @@ static int ar9003_hw_process_ini(struct  
    38224159        if (chan->channel == 2484) 
    38234160                ar9003_hw_prog_ini(ah, &ah->iniCckfirJapan2484, 1); 
     
    38494186 } 
    38504187  
    3851 @@ -1173,6 +1172,10 @@ skip_ws_det: 
     4188@@ -848,8 +809,10 @@ static void ar9003_hw_set_rfmode(struct  
     4189        if (chan == NULL) 
     4190                return; 
     4191  
     4192-       rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) 
     4193-               ? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; 
     4194+       if (IS_CHAN_2GHZ(chan)) 
     4195+               rfMode |= AR_PHY_MODE_DYNAMIC; 
     4196+       else 
     4197+               rfMode |= AR_PHY_MODE_OFDM; 
     4198  
     4199        if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
     4200                rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE); 
     4201@@ -1173,6 +1136,10 @@ skip_ws_det: 
    38524202                 * is_on == 0 means MRC CCK is OFF (more noise imm) 
    38534203                 */ 
     
    38604210                              AR_PHY_MRC_CCK_ENABLE, is_on); 
    38614211                REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL, 
    3862 @@ -1413,65 +1416,111 @@ static void ar9003_hw_antdiv_comb_conf_s 
     4212@@ -1273,12 +1240,11 @@ static void ar9003_hw_ani_cache_ini_regs 
     4213        aniState = &ah->ani; 
     4214        iniDef = &aniState->iniDef; 
     4215  
     4216-       ath_dbg(common, ANI, "ver %d.%d opmode %u chan %d Mhz/0x%x\n", 
     4217+       ath_dbg(common, ANI, "ver %d.%d opmode %u chan %d Mhz\n", 
     4218                ah->hw_version.macVersion, 
     4219                ah->hw_version.macRev, 
     4220                ah->opmode, 
     4221-               chan->channel, 
     4222-               chan->channelFlags); 
     4223+               chan->channel); 
     4224  
     4225        val = REG_READ(ah, AR_PHY_SFCORR); 
     4226        iniDef->m1Thresh = MS(val, AR_PHY_SFCORR_M1_THRESH); 
     4227@@ -1413,65 +1379,111 @@ static void ar9003_hw_antdiv_comb_conf_s 
    38634228        REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); 
    38644229 } 
     
    40134378                                      struct ath9k_channel *chan, 
    40144379                                      u8 *ini_reloaded) 
    4015 @@ -1518,6 +1567,18 @@ static int ar9003_hw_fast_chan_change(st 
     4380@@ -1479,28 +1491,10 @@ static int ar9003_hw_fast_chan_change(st 
     4381        unsigned int regWrites = 0; 
     4382        u32 modesIndex; 
     4383  
     4384-       switch (chan->chanmode) { 
     4385-       case CHANNEL_A: 
     4386-       case CHANNEL_A_HT20: 
     4387-               modesIndex = 1; 
     4388-               break; 
     4389-       case CHANNEL_A_HT40PLUS: 
     4390-       case CHANNEL_A_HT40MINUS: 
     4391-               modesIndex = 2; 
     4392-               break; 
     4393-       case CHANNEL_G: 
     4394-       case CHANNEL_G_HT20: 
     4395-       case CHANNEL_B: 
     4396-               modesIndex = 4; 
     4397-               break; 
     4398-       case CHANNEL_G_HT40PLUS: 
     4399-       case CHANNEL_G_HT40MINUS: 
     4400-               modesIndex = 3; 
     4401-               break; 
     4402- 
     4403-       default: 
     4404-               return -EINVAL; 
     4405-       } 
     4406+       if (IS_CHAN_5GHZ(chan)) 
     4407+               modesIndex = IS_CHAN_HT40(chan) ? 2 : 1; 
     4408+       else 
     4409+               modesIndex = IS_CHAN_HT40(chan) ? 3 : 4; 
     4410  
     4411        if (modesIndex == ah->modes_index) { 
     4412                *ini_reloaded = false; 
     4413@@ -1518,6 +1512,18 @@ static int ar9003_hw_fast_chan_change(st 
    40164414  
    40174415        REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); 
     
    40324430         * For 5GHz channels requiring Fast Clock, apply 
    40334431         * different modal values. 
    4034 @@ -1528,7 +1589,11 @@ static int ar9003_hw_fast_chan_change(st 
     4432@@ -1528,7 +1534,11 @@ static int ar9003_hw_fast_chan_change(st 
    40354433        if (AR_SREV_9565(ah)) 
    40364434                REG_WRITE_ARRAY(&ah->iniModesFastClock, 1, regWrites); 
     
    40454443        ah->modes_index = modesIndex; 
    40464444        *ini_reloaded = true; 
    4047 @@ -1631,11 +1696,14 @@ void ar9003_hw_attach_phy_ops(struct ath 
     4445@@ -1631,11 +1641,14 @@ void ar9003_hw_attach_phy_ops(struct ath 
    40484446  
    40494447        ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get; 
     
    40634461--- a/drivers/net/wireless/ath/ath9k/recv.c 
    40644462+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    4065 @@ -42,8 +42,6 @@ static void ath_rx_buf_link(struct ath_s 
     4463@@ -19,7 +19,7 @@ 
     4464 #include "ath9k.h" 
     4465 #include "ar9003_mac.h" 
     4466  
     4467-#define SKB_CB_ATHBUF(__skb)   (*((struct ath_buf **)__skb->cb)) 
     4468+#define SKB_CB_ATHBUF(__skb)   (*((struct ath_rxbuf **)__skb->cb)) 
     4469  
     4470 static inline bool ath9k_check_auto_sleep(struct ath_softc *sc) 
     4471 { 
     4472@@ -35,15 +35,13 @@ static inline bool ath9k_check_auto_slee 
     4473  * buffer (or rx fifo). This can incorrectly acknowledge packets 
     4474  * to a sender if last desc is self-linked. 
     4475  */ 
     4476-static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf) 
     4477+static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf) 
     4478 { 
     4479        struct ath_hw *ah = sc->sc_ah; 
     4480        struct ath_common *common = ath9k_hw_common(ah); 
    40664481        struct ath_desc *ds; 
    40674482        struct sk_buff *skb; 
     
    40764491 } 
    40774492  
    4078 +static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_buf *bf) 
     4493+static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf) 
    40794494+{ 
    40804495+       if (sc->rx.buf_hold) 
     
    40874502 { 
    40884503        /* XXX block beacon interrupts */ 
    4089 @@ -117,7 +123,6 @@ static bool ath_rx_edma_buf_link(struct  
     4504@@ -106,18 +112,17 @@ static bool ath_rx_edma_buf_link(struct  
     4505        struct ath_hw *ah = sc->sc_ah; 
     4506        struct ath_rx_edma *rx_edma; 
     4507        struct sk_buff *skb; 
     4508-       struct ath_buf *bf; 
     4509+       struct ath_rxbuf *bf; 
     4510  
     4511        rx_edma = &sc->rx.rx_edma[qtype]; 
     4512        if (skb_queue_len(&rx_edma->rx_fifo) >= rx_edma->rx_fifo_hwsize) 
     4513                return false; 
     4514  
     4515-       bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); 
     4516+       bf = list_first_entry(&sc->rx.rxbuf, struct ath_rxbuf, list); 
     4517        list_del_init(&bf->list); 
    40904518  
    40914519        skb = bf->bf_mpdu; 
     
    40954523        dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, 
    40964524                                ah->caps.rx_status_len, DMA_TO_DEVICE); 
     4525@@ -133,7 +138,7 @@ static void ath_rx_addbuffer_edma(struct 
     4526                                  enum ath9k_rx_qtype qtype) 
     4527 { 
     4528        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     4529-       struct ath_buf *bf, *tbf; 
     4530+       struct ath_rxbuf *bf, *tbf; 
     4531  
     4532        if (list_empty(&sc->rx.rxbuf)) { 
     4533                ath_dbg(common, QUEUE, "No free rx buf available\n"); 
     4534@@ -149,7 +154,7 @@ static void ath_rx_addbuffer_edma(struct 
     4535 static void ath_rx_remove_buffer(struct ath_softc *sc, 
     4536                                 enum ath9k_rx_qtype qtype) 
     4537 { 
     4538-       struct ath_buf *bf; 
     4539+       struct ath_rxbuf *bf; 
     4540        struct ath_rx_edma *rx_edma; 
     4541        struct sk_buff *skb; 
     4542  
     4543@@ -166,7 +171,7 @@ static void ath_rx_edma_cleanup(struct a 
     4544 { 
     4545        struct ath_hw *ah = sc->sc_ah; 
     4546        struct ath_common *common = ath9k_hw_common(ah); 
     4547-       struct ath_buf *bf; 
     4548+       struct ath_rxbuf *bf; 
     4549  
     4550        ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP); 
     4551        ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP); 
    40974552@@ -185,7 +190,7 @@ static void ath_rx_edma_cleanup(struct a 
    40984553  
     
    41044559 } 
    41054560  
     4561@@ -194,7 +199,7 @@ static int ath_rx_edma_init(struct ath_s 
     4562        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     4563        struct ath_hw *ah = sc->sc_ah; 
     4564        struct sk_buff *skb; 
     4565-       struct ath_buf *bf; 
     4566+       struct ath_rxbuf *bf; 
     4567        int error = 0, i; 
     4568        u32 size; 
     4569  
     4570@@ -206,7 +211,7 @@ static int ath_rx_edma_init(struct ath_s 
     4571        ath_rx_edma_init_queue(&sc->rx.rx_edma[ATH9K_RX_QUEUE_HP], 
     4572                               ah->caps.rx_hp_qdepth); 
     4573  
     4574-       size = sizeof(struct ath_buf) * nbufs; 
     4575+       size = sizeof(struct ath_rxbuf) * nbufs; 
     4576        bf = devm_kzalloc(sc->dev, size, GFP_KERNEL); 
     4577        if (!bf) 
     4578                return -ENOMEM; 
     4579@@ -266,7 +271,7 @@ int ath_rx_init(struct ath_softc *sc, in 
     4580 { 
     4581        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     4582        struct sk_buff *skb; 
     4583-       struct ath_buf *bf; 
     4584+       struct ath_rxbuf *bf; 
     4585        int error = 0; 
     4586  
     4587        spin_lock_init(&sc->sc_pcu_lock); 
     4588@@ -327,7 +332,7 @@ void ath_rx_cleanup(struct ath_softc *sc 
     4589        struct ath_hw *ah = sc->sc_ah; 
     4590        struct ath_common *common = ath9k_hw_common(ah); 
     4591        struct sk_buff *skb; 
     4592-       struct ath_buf *bf; 
     4593+       struct ath_rxbuf *bf; 
     4594  
     4595        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
     4596                ath_rx_edma_cleanup(sc); 
     4597@@ -422,7 +427,7 @@ u32 ath_calcrxfilter(struct ath_softc *s 
     4598 int ath_startrecv(struct ath_softc *sc) 
     4599 { 
     4600        struct ath_hw *ah = sc->sc_ah; 
     4601-       struct ath_buf *bf, *tbf; 
     4602+       struct ath_rxbuf *bf, *tbf; 
     4603  
     4604        if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
     4605                ath_edma_start_recv(sc); 
    41064606@@ -432,6 +437,7 @@ int ath_startrecv(struct ath_softc *sc) 
    41074607        if (list_empty(&sc->rx.rxbuf)) 
     
    41124612        list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) { 
    41134613                ath_rx_buf_link(sc, bf); 
    4114 @@ -677,6 +683,9 @@ static struct ath_buf *ath_get_next_rx_b 
     4614@@ -441,7 +447,7 @@ int ath_startrecv(struct ath_softc *sc) 
     4615        if (list_empty(&sc->rx.rxbuf)) 
     4616                goto start_recv; 
     4617  
     4618-       bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); 
     4619+       bf = list_first_entry(&sc->rx.rxbuf, struct ath_rxbuf, list); 
     4620        ath9k_hw_putrxbuf(ah, bf->bf_daddr); 
     4621        ath9k_hw_rxena(ah); 
     4622  
     4623@@ -597,13 +603,13 @@ static void ath_rx_ps(struct ath_softc * 
     4624 static bool ath_edma_get_buffers(struct ath_softc *sc, 
     4625                                 enum ath9k_rx_qtype qtype, 
     4626                                 struct ath_rx_status *rs, 
     4627-                                struct ath_buf **dest) 
     4628+                                struct ath_rxbuf **dest) 
     4629 { 
     4630        struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype]; 
     4631        struct ath_hw *ah = sc->sc_ah; 
     4632        struct ath_common *common = ath9k_hw_common(ah); 
     4633        struct sk_buff *skb; 
     4634-       struct ath_buf *bf; 
     4635+       struct ath_rxbuf *bf; 
     4636        int ret; 
     4637  
     4638        skb = skb_peek(&rx_edma->rx_fifo); 
     4639@@ -647,11 +653,11 @@ static bool ath_edma_get_buffers(struct  
     4640        return true; 
     4641 } 
     4642  
     4643-static struct ath_buf *ath_edma_get_next_rx_buf(struct ath_softc *sc, 
     4644+static struct ath_rxbuf *ath_edma_get_next_rx_buf(struct ath_softc *sc, 
     4645                                                struct ath_rx_status *rs, 
     4646                                                enum ath9k_rx_qtype qtype) 
     4647 { 
     4648-       struct ath_buf *bf = NULL; 
     4649+       struct ath_rxbuf *bf = NULL; 
     4650  
     4651        while (ath_edma_get_buffers(sc, qtype, rs, &bf)) { 
     4652                if (!bf) 
     4653@@ -662,13 +668,13 @@ static struct ath_buf *ath_edma_get_next 
     4654        return NULL; 
     4655 } 
     4656  
     4657-static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, 
     4658+static struct ath_rxbuf *ath_get_next_rx_buf(struct ath_softc *sc, 
     4659                                           struct ath_rx_status *rs) 
     4660 { 
     4661        struct ath_hw *ah = sc->sc_ah; 
     4662        struct ath_common *common = ath9k_hw_common(ah); 
     4663        struct ath_desc *ds; 
     4664-       struct ath_buf *bf; 
     4665+       struct ath_rxbuf *bf; 
     4666        int ret; 
     4667  
     4668        if (list_empty(&sc->rx.rxbuf)) { 
     4669@@ -676,7 +682,10 @@ static struct ath_buf *ath_get_next_rx_b 
     4670                return NULL; 
    41154671        } 
    41164672  
    4117         bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); 
     4673-       bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); 
     4674+       bf = list_first_entry(&sc->rx.rxbuf, struct ath_rxbuf, list); 
    41184675+       if (bf == sc->rx.buf_hold) 
    41194676+               return NULL; 
     
    41224679  
    41234680        /* 
     4681@@ -693,7 +702,7 @@ static struct ath_buf *ath_get_next_rx_b 
     4682        ret = ath9k_hw_rxprocdesc(ah, ds, rs); 
     4683        if (ret == -EINPROGRESS) { 
     4684                struct ath_rx_status trs; 
     4685-               struct ath_buf *tbf; 
     4686+               struct ath_rxbuf *tbf; 
     4687                struct ath_desc *tds; 
     4688  
     4689                memset(&trs, 0, sizeof(trs)); 
     4690@@ -702,7 +711,7 @@ static struct ath_buf *ath_get_next_rx_b 
     4691                        return NULL; 
     4692                } 
     4693  
     4694-               tbf = list_entry(bf->list.next, struct ath_buf, list); 
     4695+               tbf = list_entry(bf->list.next, struct ath_rxbuf, list); 
     4696  
     4697                /* 
     4698                 * On some hardware the descriptor status words could 
    41244699@@ -755,7 +764,6 @@ static bool ath9k_rx_accept(struct ath_c 
    41254700        bool is_mc, is_valid_tkip, strip_mic, mic_error; 
     
    45705145        struct ath_rx_status *rs, struct ieee80211_rx_status *rxs) 
    45715146 { 
    4572 @@ -1159,15 +1310,12 @@ int ath_rx_tasklet(struct ath_softc *sc, 
     5147@@ -1153,21 +1304,18 @@ static void ath9k_apply_ampdu_details(st 
     5148  
     5149 int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) 
     5150 { 
     5151-       struct ath_buf *bf; 
     5152+       struct ath_rxbuf *bf; 
     5153        struct sk_buff *skb = NULL, *requeue_skb, *hdr_skb; 
     5154        struct ieee80211_rx_status *rxs; 
    45735155        struct ath_hw *ah = sc->sc_ah; 
    45745156        struct ath_common *common = ath9k_hw_common(ah); 
     
    47185300 bool is_ath9k_unloaded; 
    47195301 /* We use the hw_value as an index into our private channel structure */ 
    4720 @@ -516,6 +516,7 @@ static void ath9k_init_misc(struct ath_s 
     5302@@ -429,7 +429,6 @@ static int ath9k_init_queues(struct ath_ 
     5303        sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah); 
     5304        sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); 
     5305  
     5306-       sc->config.cabqReadytime = ATH_CABQ_READY_TIME; 
     5307        ath_cabq_update(sc); 
     5308  
     5309        sc->tx.uapsdq = ath_txq_setup(sc, ATH9K_TX_QUEUE_UAPSD, 0); 
     5310@@ -516,6 +515,7 @@ static void ath9k_init_misc(struct ath_s 
    47215311 static void ath9k_init_platform(struct ath_softc *sc) 
    47225312 { 
     
    47265316  
    47275317        if (common->bus_ops->ath_bus_type != ATH_PCI) 
    4728 @@ -525,12 +526,27 @@ static void ath9k_init_platform(struct a 
     5318@@ -525,12 +525,27 @@ static void ath9k_init_platform(struct a 
    47295319                               ATH9K_PCI_CUS230)) { 
    47305320                ah->config.xlna_gpio = 9; 
     
    47555345 } 
    47565346  
    4757 @@ -584,6 +600,7 @@ static int ath9k_init_softc(u16 devid, s 
     5347@@ -584,6 +599,7 @@ static int ath9k_init_softc(u16 devid, s 
    47585348 { 
    47595349        struct ath9k_platform_data *pdata = sc->dev->platform_data; 
     
    47635353        int ret = 0, i; 
    47645354        int csz = 0; 
    4765 @@ -600,6 +617,7 @@ static int ath9k_init_softc(u16 devid, s 
     5355@@ -600,6 +616,7 @@ static int ath9k_init_softc(u16 devid, s 
    47665356        ah->reg_ops.rmw = ath9k_reg_rmw; 
    47675357        atomic_set(&ah->intr_ref_cnt, -1); 
     
    47715361        sc->dfs_detector = dfs_pattern_detector_init(ah, NL80211_DFS_UNSET); 
    47725362  
    4773 @@ -631,11 +649,15 @@ static int ath9k_init_softc(u16 devid, s 
     5363@@ -631,11 +648,15 @@ static int ath9k_init_softc(u16 devid, s 
    47745364        ath9k_init_platform(sc); 
    47755365  
     
    47915381        spin_lock_init(&common->cc_lock); 
    47925382  
    4793 @@ -710,13 +732,15 @@ static void ath9k_init_band_txpower(stru 
     5383@@ -710,13 +731,15 @@ static void ath9k_init_band_txpower(stru 
    47945384        struct ieee80211_supported_band *sband; 
    47955385        struct ieee80211_channel *chan; 
     
    48045394-               ath9k_cmn_update_ichannel(ah->curchan, chan, NL80211_CHAN_HT20); 
    48055395+               cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20); 
    4806 +               ath9k_cmn_update_ichannel(ah->curchan, &chandef); 
     5396+               ath9k_cmn_get_channel(sc->hw, ah, &chandef); 
    48075397                ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true); 
    48085398        } 
    48095399 } 
    4810 @@ -802,7 +826,8 @@ void ath9k_set_hw_capab(struct ath_softc 
     5400@@ -802,7 +825,8 @@ void ath9k_set_hw_capab(struct ath_softc 
    48115401                IEEE80211_HW_PS_NULLFUNC_STACK | 
    48125402                IEEE80211_HW_SPECTRUM_MGMT | 
     
    64227012                if (!AR_SREV_9271(ah)) 
    64237013                        val &= ~AR_PCU_MISC_MODE2_HWWAR1; 
     7014@@ -659,14 +667,13 @@ static void ar5008_hw_set_channel_regs(s 
     7015        if (IS_CHAN_HT40(chan)) { 
     7016                phymode |= AR_PHY_FC_DYN2040_EN; 
     7017  
     7018-               if ((chan->chanmode == CHANNEL_A_HT40PLUS) || 
     7019-                   (chan->chanmode == CHANNEL_G_HT40PLUS)) 
     7020+               if (IS_CHAN_HT40PLUS(chan)) 
     7021                        phymode |= AR_PHY_FC_DYN2040_PRI_CH; 
     7022  
     7023        } 
     7024        REG_WRITE(ah, AR_PHY_TURBO, phymode); 
     7025  
     7026-       ath9k_hw_set11nmac2040(ah); 
     7027+       ath9k_hw_set11nmac2040(ah, chan); 
     7028  
     7029        ENABLE_REGWRITE_BUFFER(ah); 
     7030  
     7031@@ -684,31 +691,12 @@ static int ar5008_hw_process_ini(struct  
     7032        int i, regWrites = 0; 
     7033        u32 modesIndex, freqIndex; 
     7034  
     7035-       switch (chan->chanmode) { 
     7036-       case CHANNEL_A: 
     7037-       case CHANNEL_A_HT20: 
     7038-               modesIndex = 1; 
     7039-               freqIndex = 1; 
     7040-               break; 
     7041-       case CHANNEL_A_HT40PLUS: 
     7042-       case CHANNEL_A_HT40MINUS: 
     7043-               modesIndex = 2; 
     7044+       if (IS_CHAN_5GHZ(chan)) { 
     7045                freqIndex = 1; 
     7046-               break; 
     7047-       case CHANNEL_G: 
     7048-       case CHANNEL_G_HT20: 
     7049-       case CHANNEL_B: 
     7050-               modesIndex = 4; 
     7051+               modesIndex = IS_CHAN_HT40(chan) ? 2 : 1; 
     7052+       } else { 
     7053                freqIndex = 2; 
     7054-               break; 
     7055-       case CHANNEL_G_HT40PLUS: 
     7056-       case CHANNEL_G_HT40MINUS: 
     7057-               modesIndex = 3; 
     7058-               freqIndex = 2; 
     7059-               break; 
     7060- 
     7061-       default: 
     7062-               return -EINVAL; 
     7063+               modesIndex = IS_CHAN_HT40(chan) ? 3 : 4; 
     7064        } 
     7065  
     7066        /* 
     7067@@ -807,8 +795,10 @@ static void ar5008_hw_set_rfmode(struct  
     7068        if (chan == NULL) 
     7069                return; 
     7070  
     7071-       rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) 
     7072-               ? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; 
     7073+       if (IS_CHAN_2GHZ(chan)) 
     7074+               rfMode |= AR_PHY_MODE_DYNAMIC; 
     7075+       else 
     7076+               rfMode |= AR_PHY_MODE_OFDM; 
     7077  
     7078        if (!AR_SREV_9280_20_OR_LATER(ah)) 
     7079                rfMode |= (IS_CHAN_5GHZ(chan)) ? 
     7080@@ -1213,12 +1203,11 @@ static void ar5008_hw_ani_cache_ini_regs 
     7081  
     7082        iniDef = &aniState->iniDef; 
     7083  
     7084-       ath_dbg(common, ANI, "ver %d.%d opmode %u chan %d Mhz/0x%x\n", 
     7085+       ath_dbg(common, ANI, "ver %d.%d opmode %u chan %d Mhz\n", 
     7086                ah->hw_version.macVersion, 
     7087                ah->hw_version.macRev, 
     7088                ah->opmode, 
     7089-               chan->channel, 
     7090-               chan->channelFlags); 
     7091+               chan->channel); 
     7092  
     7093        val = REG_READ(ah, AR_PHY_SFCORR); 
     7094        iniDef->m1Thresh = MS(val, AR_PHY_SFCORR_M1_THRESH); 
    64247095--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c 
    64257096+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c 
     
    67957466--- a/drivers/net/wireless/ath/ath9k/hw.c 
    67967467+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    6797 @@ -450,7 +450,6 @@ static void ath9k_hw_init_config(struct  
     7468@@ -130,29 +130,29 @@ void ath9k_debug_sync_cause(struct ath_c 
     7469  
     7470 static void ath9k_hw_set_clockrate(struct ath_hw *ah) 
     7471 { 
     7472-       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; 
     7473        struct ath_common *common = ath9k_hw_common(ah); 
     7474+       struct ath9k_channel *chan = ah->curchan; 
     7475        unsigned int clockrate; 
     7476  
     7477        /* AR9287 v1.3+ uses async FIFO and runs the MAC at 117 MHz */ 
     7478        if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) 
     7479                clockrate = 117; 
     7480-       else if (!ah->curchan) /* should really check for CCK instead */ 
     7481+       else if (!chan) /* should really check for CCK instead */ 
     7482                clockrate = ATH9K_CLOCK_RATE_CCK; 
     7483-       else if (conf->chandef.chan->band == IEEE80211_BAND_2GHZ) 
     7484+       else if (IS_CHAN_2GHZ(chan)) 
     7485                clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM; 
     7486        else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK) 
     7487                clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM; 
     7488        else 
     7489                clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM; 
     7490  
     7491-       if (conf_is_ht40(conf)) 
     7492+       if (IS_CHAN_HT40(chan)) 
     7493                clockrate *= 2; 
     7494  
     7495        if (ah->curchan) { 
     7496-               if (IS_CHAN_HALF_RATE(ah->curchan)) 
     7497+               if (IS_CHAN_HALF_RATE(chan)) 
     7498                        clockrate /= 2; 
     7499-               if (IS_CHAN_QUARTER_RATE(ah->curchan)) 
     7500+               if (IS_CHAN_QUARTER_RATE(chan)) 
     7501                        clockrate /= 4; 
     7502        } 
     7503  
     7504@@ -190,10 +190,7 @@ EXPORT_SYMBOL(ath9k_hw_wait); 
     7505 void ath9k_hw_synth_delay(struct ath_hw *ah, struct ath9k_channel *chan, 
     7506                          int hw_delay) 
     7507 { 
     7508-       if (IS_CHAN_B(chan)) 
     7509-               hw_delay = (4 * hw_delay) / 22; 
     7510-       else 
     7511-               hw_delay /= 10; 
     7512+       hw_delay /= 10; 
     7513  
     7514        if (IS_CHAN_HALF_RATE(chan)) 
     7515                hw_delay *= 2; 
     7516@@ -294,8 +291,7 @@ void ath9k_hw_get_channel_centers(struct 
     7517                return; 
     7518        } 
     7519  
     7520-       if ((chan->chanmode == CHANNEL_A_HT40PLUS) || 
     7521-           (chan->chanmode == CHANNEL_G_HT40PLUS)) { 
     7522+       if (IS_CHAN_HT40PLUS(chan)) { 
     7523                centers->synth_center = 
     7524                        chan->channel + HT40_CHANNEL_CENTER_SHIFT; 
     7525                extoff = 1; 
     7526@@ -450,7 +446,6 @@ static void ath9k_hw_init_config(struct  
    67987527        ah->config.ack_6mb = 0x0; 
    67997528        ah->config.cwm_ignore_extcca = 0; 
     
    68037532  
    68047533        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { 
    6805 @@ -1069,7 +1068,7 @@ void ath9k_hw_init_global_settings(struc 
     7534@@ -1034,7 +1029,6 @@ static bool ath9k_hw_set_global_txtimeou 
     7535 void ath9k_hw_init_global_settings(struct ath_hw *ah) 
     7536 { 
     7537        struct ath_common *common = ath9k_hw_common(ah); 
     7538-       struct ieee80211_conf *conf = &common->hw->conf; 
     7539        const struct ath9k_channel *chan = ah->curchan; 
     7540        int acktimeout, ctstimeout, ack_offset = 0; 
     7541        int slottime; 
     7542@@ -1069,7 +1063,7 @@ void ath9k_hw_init_global_settings(struc 
    68067543                if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
    68077544                    tx_lat += 11; 
     
    68127549                slottime = 13; 
    68137550        } else if (IS_CHAN_QUARTER_RATE(chan)) { 
    6814 @@ -1079,7 +1078,7 @@ void ath9k_hw_init_global_settings(struc 
     7551@@ -1079,7 +1073,7 @@ void ath9k_hw_init_global_settings(struc 
    68157552                if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
    68167553                    tx_lat += 22; 
     
    68217558                slottime = 21; 
    68227559        } else { 
    6823 @@ -1116,7 +1115,6 @@ void ath9k_hw_init_global_settings(struc 
     7560@@ -1109,14 +1103,12 @@ void ath9k_hw_init_global_settings(struc 
     7561         * BA frames in some implementations, but it has been found to fix ACK 
     7562         * timeout issues in other cases as well. 
     7563         */ 
     7564-       if (conf->chandef.chan && 
     7565-           conf->chandef.chan->band == IEEE80211_BAND_2GHZ && 
     7566+       if (IS_CHAN_2GHZ(chan) && 
     7567            !IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) { 
     7568                acktimeout += 64 - sifstime - ah->slottime; 
    68247569                ctstimeout += 48 - sifstime - ah->slottime; 
    68257570        } 
     
    68297574        ath9k_hw_setslottime(ah, slottime); 
    68307575        ath9k_hw_set_ack_timeout(ah, acktimeout); 
    6831 @@ -1496,16 +1494,18 @@ static bool ath9k_hw_channel_change(stru 
     7576@@ -1153,9 +1145,7 @@ u32 ath9k_regd_get_ctl(struct ath_regula 
     7577 { 
     7578        u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band); 
     7579  
     7580-       if (IS_CHAN_B(chan)) 
     7581-               ctl |= CTL_11B; 
     7582-       else if (IS_CHAN_G(chan)) 
     7583+       if (IS_CHAN_2GHZ(chan)) 
     7584                ctl |= CTL_11G; 
     7585        else 
     7586                ctl |= CTL_11A; 
     7587@@ -1496,16 +1486,16 @@ static bool ath9k_hw_channel_change(stru 
    68327588                                    struct ath9k_channel *chan) 
    68337589 { 
     
    68487604+ 
    68497605+       if (pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) { 
    6850 +               u32 cur = ah->curchan->channelFlags & (CHANNEL_2GHZ | CHANNEL_5GHZ); 
    6851 +               u32 new = chan->channelFlags & (CHANNEL_2GHZ | CHANNEL_5GHZ); 
    6852 +               band_switch = (cur != new); 
    6853 +               mode_diff = (chan->chanmode != ah->curchan->chanmode); 
     7606+               band_switch = IS_CHAN_5GHZ(ah->curchan) != IS_CHAN_5GHZ(chan); 
     7607+               mode_diff = (chan->channelFlags != ah->curchan->channelFlags); 
    68547608+       } 
    68557609  
    68567610        for (qnum = 0; qnum < AR_NUM_QCU; qnum++) { 
    68577611                if (ath9k_hw_numtxpending(ah, qnum)) { 
    6858 @@ -1520,11 +1520,12 @@ static bool ath9k_hw_channel_change(stru 
     7612@@ -1520,11 +1510,12 @@ static bool ath9k_hw_channel_change(stru 
    68597613                return false; 
    68607614        } 
     
    68717625                if (ath9k_hw_fast_chan_change(ah, chan, &ini_reloaded)) { 
    68727626                        ath_err(common, "Failed to do fast channel change\n"); 
    6873 @@ -1541,22 +1542,21 @@ static bool ath9k_hw_channel_change(stru 
     7627@@ -1541,22 +1532,19 @@ static bool ath9k_hw_channel_change(stru 
    68747628        } 
    68757629        ath9k_hw_set_clockrate(ah); 
    68767630        ath9k_hw_apply_txpower(ah, chan, false); 
    68777631-       ath9k_hw_rfbus_done(ah); 
    6878   
    6879         if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) 
    6880                 ath9k_hw_set_delta_slope(ah, chan); 
    6881   
     7632- 
     7633-       if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) 
     7634-               ath9k_hw_set_delta_slope(ah, chan); 
     7635  
     7636+       ath9k_hw_set_delta_slope(ah, chan); 
    68827637        ath9k_hw_spur_mitigate_freq(ah, chan); 
    68837638  
     
    69017656        } 
    69027657  
    6903 @@ -1778,16 +1778,11 @@ static void ath9k_hw_init_desc(struct at 
     7658@@ -1778,16 +1766,11 @@ static void ath9k_hw_init_desc(struct at 
    69047659 /* 
    69057660  * Fast channel change: 
     
    69197674  
    69207675        if (AR_SREV_9280(ah) && common->bus_ops->ath_bus_type == ATH_PCI) 
    6921 @@ -1806,9 +1801,21 @@ static int ath9k_hw_do_fastcc(struct ath 
     7676@@ -1806,8 +1789,11 @@ static int ath9k_hw_do_fastcc(struct ath 
    69227677            (CHANNEL_HALF | CHANNEL_QUARTER)) 
    69237678                goto fail; 
     
    69257680-       if ((chan->channelFlags & CHANNEL_ALL) != 
    69267681-           (ah->curchan->channelFlags & CHANNEL_ALL)) 
    6927 -               goto fail; 
    69287682+       /* 
    6929 +        * If cross-band fcc is not supoprted, bail out if 
    6930 +        * either channelFlags or chanmode differ. 
    6931 +        * 
    6932 +        * chanmode will be different if the HT operating mode 
    6933 +        * changes because of CSA. 
     7683+        * If cross-band fcc is not supoprted, bail out if channelFlags differ. 
    69347684+        */ 
    6935 +       if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH)) { 
    6936 +               if ((chan->channelFlags & CHANNEL_ALL) != 
    6937 +                   (ah->curchan->channelFlags & CHANNEL_ALL)) 
    6938 +                       goto fail; 
    6939 + 
    6940 +               if (chan->chanmode != ah->curchan->chanmode) 
    6941 +                       goto fail; 
    6942 +       } 
     7685+       if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) && 
     7686+           chan->channelFlags != ah->curchan->channelFlags) 
     7687                goto fail; 
    69437688  
    69447689        if (!ath9k_hw_check_alive(ah)) 
    6945                 goto fail; 
    6946 @@ -2047,7 +2054,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     7690@@ -1870,8 +1856,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     7691  
     7692        ah->caldata = caldata; 
     7693        if (caldata && (chan->channel != caldata->channel || 
     7694-                       chan->channelFlags != caldata->channelFlags || 
     7695-                       chan->chanmode != caldata->chanmode)) { 
     7696+                       chan->channelFlags != caldata->channelFlags)) { 
     7697                /* Operating channel changed, reset channel calibration data */ 
     7698                memset(caldata, 0, sizeof(*caldata)); 
     7699                ath9k_init_nfcal_hist_buffer(ah, chan); 
     7700@@ -1960,9 +1945,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     7701  
     7702        ath9k_hw_init_mfp(ah); 
     7703  
     7704-       if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) 
     7705-               ath9k_hw_set_delta_slope(ah, chan); 
     7706- 
     7707+       ath9k_hw_set_delta_slope(ah, chan); 
     7708        ath9k_hw_spur_mitigate_freq(ah, chan); 
     7709        ah->eep_ops->set_board_values(ah, chan); 
     7710  
     7711@@ -2047,7 +2030,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    69477712  
    69487713        ath9k_hw_apply_gpio_override(ah); 
     
    69537718  
    69547719        return 0; 
    6955 @@ -2550,34 +2557,28 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
     7720@@ -2550,34 +2533,28 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    69567721        if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah)) 
    69577722                pCap->hw_caps |= ATH9K_HW_CAP_SGI_20; 
     
    69977762  
    69987763        if (ath9k_hw_dfs_tested(ah)) 
    6999 @@ -2610,6 +2611,13 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
     7764@@ -2610,6 +2587,13 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    70007765            ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) 
    70017766                        pCap->hw_caps |= ATH9K_HW_CAP_PAPRD; 
     
    70117776 } 
    70127777  
     7778@@ -2938,12 +2922,11 @@ void ath9k_hw_set_tsfadjust(struct ath_h 
     7779 } 
     7780 EXPORT_SYMBOL(ath9k_hw_set_tsfadjust); 
     7781  
     7782-void ath9k_hw_set11nmac2040(struct ath_hw *ah) 
     7783+void ath9k_hw_set11nmac2040(struct ath_hw *ah, struct ath9k_channel *chan) 
     7784 { 
     7785-       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; 
     7786        u32 macmode; 
     7787  
     7788-       if (conf_is_ht40(conf) && !ah->config.cwm_ignore_extcca) 
     7789+       if (IS_CHAN_HT40(chan) && !ah->config.cwm_ignore_extcca) 
     7790                macmode = AR_2040_JOINED_RX_CLEAR; 
     7791        else 
     7792                macmode = 0; 
    70137793--- a/drivers/net/wireless/ath/ath9k/hw.h 
    70147794+++ b/drivers/net/wireless/ath/ath9k/hw.h 
     
    70347814  
    70357815 enum ath9k_int { 
    7036 @@ -716,11 +721,14 @@ struct ath_hw_ops { 
     7816@@ -364,36 +369,6 @@ enum ath9k_int { 
     7817        ATH9K_INT_NOCARD = 0xffffffff 
     7818 }; 
     7819  
     7820-#define CHANNEL_CCK       0x00020 
     7821-#define CHANNEL_OFDM      0x00040 
     7822-#define CHANNEL_2GHZ      0x00080 
     7823-#define CHANNEL_5GHZ      0x00100 
     7824-#define CHANNEL_PASSIVE   0x00200 
     7825-#define CHANNEL_DYN       0x00400 
     7826-#define CHANNEL_HALF      0x04000 
     7827-#define CHANNEL_QUARTER   0x08000 
     7828-#define CHANNEL_HT20      0x10000 
     7829-#define CHANNEL_HT40PLUS  0x20000 
     7830-#define CHANNEL_HT40MINUS 0x40000 
     7831- 
     7832-#define CHANNEL_A           (CHANNEL_5GHZ|CHANNEL_OFDM) 
     7833-#define CHANNEL_B           (CHANNEL_2GHZ|CHANNEL_CCK) 
     7834-#define CHANNEL_G           (CHANNEL_2GHZ|CHANNEL_OFDM) 
     7835-#define CHANNEL_G_HT20      (CHANNEL_2GHZ|CHANNEL_HT20) 
     7836-#define CHANNEL_A_HT20      (CHANNEL_5GHZ|CHANNEL_HT20) 
     7837-#define CHANNEL_G_HT40PLUS  (CHANNEL_2GHZ|CHANNEL_HT40PLUS) 
     7838-#define CHANNEL_G_HT40MINUS (CHANNEL_2GHZ|CHANNEL_HT40MINUS) 
     7839-#define CHANNEL_A_HT40PLUS  (CHANNEL_5GHZ|CHANNEL_HT40PLUS) 
     7840-#define CHANNEL_A_HT40MINUS (CHANNEL_5GHZ|CHANNEL_HT40MINUS) 
     7841-#define CHANNEL_ALL                            \ 
     7842-       (CHANNEL_OFDM|                          \ 
     7843-        CHANNEL_CCK|                           \ 
     7844-        CHANNEL_2GHZ |                         \ 
     7845-        CHANNEL_5GHZ |                         \ 
     7846-        CHANNEL_HT20 |                         \ 
     7847-        CHANNEL_HT40PLUS |                     \ 
     7848-        CHANNEL_HT40MINUS) 
     7849- 
     7850 #define MAX_RTT_TABLE_ENTRY     6 
     7851 #define MAX_IQCAL_MEASUREMENT  8 
     7852 #define MAX_CL_TAB_ENTRY       16 
     7853@@ -401,8 +376,7 @@ enum ath9k_int { 
     7854  
     7855 struct ath9k_hw_cal_data { 
     7856        u16 channel; 
     7857-       u32 channelFlags; 
     7858-       u32 chanmode; 
     7859+       u16 channelFlags; 
     7860        int32_t CalValid; 
     7861        int8_t iCoff; 
     7862        int8_t qCoff; 
     7863@@ -425,33 +399,34 @@ struct ath9k_hw_cal_data { 
     7864 struct ath9k_channel { 
     7865        struct ieee80211_channel *chan; 
     7866        u16 channel; 
     7867-       u32 channelFlags; 
     7868-       u32 chanmode; 
     7869+       u16 channelFlags; 
     7870        s16 noisefloor; 
     7871 }; 
     7872  
     7873-#define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \ 
     7874-       (((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \ 
     7875-       (((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \ 
     7876-       (((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS)) 
     7877-#define IS_CHAN_OFDM(_c) (((_c)->channelFlags & CHANNEL_OFDM) != 0) 
     7878-#define IS_CHAN_5GHZ(_c) (((_c)->channelFlags & CHANNEL_5GHZ) != 0) 
     7879-#define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0) 
     7880-#define IS_CHAN_HALF_RATE(_c) (((_c)->channelFlags & CHANNEL_HALF) != 0) 
     7881-#define IS_CHAN_QUARTER_RATE(_c) (((_c)->channelFlags & CHANNEL_QUARTER) != 0) 
     7882+#define CHANNEL_5GHZ           BIT(0) 
     7883+#define CHANNEL_HALF           BIT(1) 
     7884+#define CHANNEL_QUARTER                BIT(2) 
     7885+#define CHANNEL_HT             BIT(3) 
     7886+#define CHANNEL_HT40PLUS       BIT(4) 
     7887+#define CHANNEL_HT40MINUS      BIT(5) 
     7888+ 
     7889+#define IS_CHAN_5GHZ(_c) (!!((_c)->channelFlags & CHANNEL_5GHZ)) 
     7890+#define IS_CHAN_2GHZ(_c) (!IS_CHAN_5GHZ(_c)) 
     7891+ 
     7892+#define IS_CHAN_HALF_RATE(_c) (!!((_c)->channelFlags & CHANNEL_HALF)) 
     7893+#define IS_CHAN_QUARTER_RATE(_c) (!!((_c)->channelFlags & CHANNEL_QUARTER)) 
     7894 #define IS_CHAN_A_FAST_CLOCK(_ah, _c)                  \ 
     7895-       ((((_c)->channelFlags & CHANNEL_5GHZ) != 0) &&  \ 
     7896-        ((_ah)->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)) 
     7897+       (IS_CHAN_5GHZ(_c) && ((_ah)->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)) 
     7898+ 
     7899+#define IS_CHAN_HT(_c) ((_c)->channelFlags & CHANNEL_HT) 
     7900+ 
     7901+#define IS_CHAN_HT20(_c) (IS_CHAN_HT(_c) && !IS_CHAN_HT40(_c)) 
     7902  
     7903-/* These macros check chanmode and not channelFlags */ 
     7904-#define IS_CHAN_B(_c) ((_c)->chanmode == CHANNEL_B) 
     7905-#define IS_CHAN_HT20(_c) (((_c)->chanmode == CHANNEL_A_HT20) ||        \ 
     7906-                         ((_c)->chanmode == CHANNEL_G_HT20)) 
     7907-#define IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) ||    \ 
     7908-                         ((_c)->chanmode == CHANNEL_A_HT40MINUS) ||    \ 
     7909-                         ((_c)->chanmode == CHANNEL_G_HT40PLUS) ||     \ 
     7910-                         ((_c)->chanmode == CHANNEL_G_HT40MINUS)) 
     7911-#define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c))) 
     7912+#define IS_CHAN_HT40(_c) \ 
     7913+       (!!((_c)->channelFlags & (CHANNEL_HT40PLUS | CHANNEL_HT40MINUS))) 
     7914+ 
     7915+#define IS_CHAN_HT40PLUS(_c) ((_c)->channelFlags & CHANNEL_HT40PLUS) 
     7916+#define IS_CHAN_HT40MINUS(_c) ((_c)->channelFlags & CHANNEL_HT40MINUS) 
     7917  
     7918 enum ath9k_power_mode { 
     7919        ATH9K_PM_AWAKE = 0, 
     7920@@ -716,11 +691,14 @@ struct ath_hw_ops { 
    70377921                        struct ath_hw_antcomb_conf *antconf); 
    70387922        void (*antdiv_comb_conf_set)(struct ath_hw *ah, 
     
    70507934  
    70517935 struct ath_nf_limits { 
    7052 @@ -765,7 +773,6 @@ struct ath_hw { 
     7936@@ -765,7 +743,6 @@ struct ath_hw { 
    70537937        bool aspm_enabled; 
    70547938        bool is_monitoring; 
     
    70587942  
    70597943        u32 nf_regs[6]; 
     7944@@ -1019,7 +996,7 @@ void ath9k_hw_reset_tsf(struct ath_hw *a 
     7945 void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set); 
     7946 void ath9k_hw_init_global_settings(struct ath_hw *ah); 
     7947 u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah); 
     7948-void ath9k_hw_set11nmac2040(struct ath_hw *ah); 
     7949+void ath9k_hw_set11nmac2040(struct ath_hw *ah, struct ath9k_channel *chan); 
     7950 void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period); 
     7951 void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, 
     7952                                    const struct ath9k_beacon_state *bs); 
    70607953--- a/drivers/net/wireless/ath/ath9k/pci.c 
    70617954+++ b/drivers/net/wireless/ath/ath9k/pci.c 
     
    74298322                                val = AR_WA_DEFAULT; 
    74308323                        } 
     8324@@ -426,28 +419,10 @@ void ar9002_hw_load_ani_reg(struct ath_h 
     8325        u32 modesIndex; 
     8326        int i; 
     8327  
     8328-       switch (chan->chanmode) { 
     8329-       case CHANNEL_A: 
     8330-       case CHANNEL_A_HT20: 
     8331-               modesIndex = 1; 
     8332-               break; 
     8333-       case CHANNEL_A_HT40PLUS: 
     8334-       case CHANNEL_A_HT40MINUS: 
     8335-               modesIndex = 2; 
     8336-               break; 
     8337-       case CHANNEL_G: 
     8338-       case CHANNEL_G_HT20: 
     8339-       case CHANNEL_B: 
     8340-               modesIndex = 4; 
     8341-               break; 
     8342-       case CHANNEL_G_HT40PLUS: 
     8343-       case CHANNEL_G_HT40MINUS: 
     8344-               modesIndex = 3; 
     8345-               break; 
     8346- 
     8347-       default: 
     8348-               return; 
     8349-       } 
     8350+       if (IS_CHAN_5GHZ(chan)) 
     8351+               modesIndex = IS_CHAN_HT40(chan) ? 2 : 1; 
     8352+       else 
     8353+               modesIndex = IS_CHAN_HT40(chan) ? 3 : 4; 
     8354  
     8355        ENABLE_REGWRITE_BUFFER(ah); 
     8356  
    74318357--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
    74328358+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
     
    75568482--- a/drivers/net/wireless/ath/ath9k/common.c 
    75578483+++ b/drivers/net/wireless/ath/ath9k/common.c 
    7558 @@ -49,37 +49,40 @@ int ath9k_cmn_get_hw_crypto_keytype(stru 
     8484@@ -49,88 +49,64 @@ int ath9k_cmn_get_hw_crypto_keytype(stru 
    75598485 } 
    75608486 EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype); 
     
    75628488-static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan, 
    75638489-                                enum nl80211_channel_type channel_type) 
    7564 +static u32 ath9k_get_extchanmode(struct cfg80211_chan_def *chandef) 
    7565  { 
    7566         u32 chanmode = 0; 
    7567   
     8490-{ 
     8491-       u32 chanmode = 0; 
     8492- 
    75688493-       switch (chan->band) { 
    7569 +       switch (chandef->chan->band) { 
    7570         case IEEE80211_BAND_2GHZ: 
     8494-       case IEEE80211_BAND_2GHZ: 
    75718495-               switch (channel_type) { 
    75728496-               case NL80211_CHAN_NO_HT: 
    75738497-               case NL80211_CHAN_HT20: 
    7574 +               switch (chandef->width) { 
    7575 +               case NL80211_CHAN_WIDTH_20_NOHT: 
    7576 +               case NL80211_CHAN_WIDTH_20: 
    7577                         chanmode = CHANNEL_G_HT20; 
    7578                         break; 
     8498-                       chanmode = CHANNEL_G_HT20; 
     8499-                       break; 
    75798500-               case NL80211_CHAN_HT40PLUS: 
    75808501-                       chanmode = CHANNEL_G_HT40PLUS; 
    7581 +               case NL80211_CHAN_WIDTH_40: 
    7582 +                       if (chandef->center_freq1 > chandef->chan->center_freq) 
    7583 +                               chanmode = CHANNEL_G_HT40PLUS; 
    7584 +                       else 
    7585 +                               chanmode = CHANNEL_G_HT40MINUS; 
    7586                         break; 
     8502-                       break; 
    75878503-               case NL80211_CHAN_HT40MINUS: 
    75888504-                       chanmode = CHANNEL_G_HT40MINUS; 
    7589 +               default: 
    7590                         break; 
    7591                 } 
    7592                 break; 
    7593         case IEEE80211_BAND_5GHZ: 
     8505-                       break; 
     8506-               } 
     8507-               break; 
     8508-       case IEEE80211_BAND_5GHZ: 
    75948509-               switch (channel_type) { 
    75958510-               case NL80211_CHAN_NO_HT: 
    75968511-               case NL80211_CHAN_HT20: 
    7597 +               switch (chandef->width) { 
    7598 +               case NL80211_CHAN_WIDTH_20_NOHT: 
    7599 +               case NL80211_CHAN_WIDTH_20: 
    7600                         chanmode = CHANNEL_A_HT20; 
    7601                         break; 
     8512-                       chanmode = CHANNEL_A_HT20; 
     8513-                       break; 
    76028514-               case NL80211_CHAN_HT40PLUS: 
    76038515-                       chanmode = CHANNEL_A_HT40PLUS; 
    7604 +               case NL80211_CHAN_WIDTH_40: 
    7605 +                       if (chandef->center_freq1 > chandef->chan->center_freq) 
    7606 +                               chanmode = CHANNEL_A_HT40PLUS; 
    7607 +                       else 
    7608 +                               chanmode = CHANNEL_A_HT40MINUS; 
    7609                         break; 
     8516-                       break; 
    76108517-               case NL80211_CHAN_HT40MINUS: 
    76118518-                       chanmode = CHANNEL_A_HT40MINUS; 
    7612 +               default: 
    7613                         break; 
    7614                 } 
    7615                 break; 
    7616 @@ -94,13 +97,12 @@ static u32 ath9k_get_extchanmode(struct  
     8519-                       break; 
     8520-               } 
     8521-               break; 
     8522-       default: 
     8523-               break; 
     8524-       } 
     8525- 
     8526-       return chanmode; 
     8527-} 
     8528- 
     8529 /* 
    76178530  * Update internal channel flags. 
    76188531  */ 
    7619  void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
     8532-void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
    76208533-                              struct ieee80211_channel *chan, 
    76218534-                              enum nl80211_channel_type channel_type) 
    7622 +                              struct cfg80211_chan_def *chandef) 
    7623  { 
    7624 -       ichan->channel = chan->center_freq; 
    7625 -       ichan->chan = chan; 
    7626 +       ichan->channel = chandef->chan->center_freq; 
    7627 +       ichan->chan = chandef->chan; 
     8535+static void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
     8536+                                     struct cfg80211_chan_def *chandef) 
     8537 { 
     8538+       struct ieee80211_channel *chan = chandef->chan; 
     8539+       u16 flags = 0; 
     8540+ 
     8541        ichan->channel = chan->center_freq; 
     8542        ichan->chan = chan; 
    76288543  
    76298544-       if (chan->band == IEEE80211_BAND_2GHZ) { 
    7630 +       if (chandef->chan->band == IEEE80211_BAND_2GHZ) { 
    7631                 ichan->chanmode = CHANNEL_G; 
    7632                 ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM; 
    7633         } else { 
    7634 @@ -108,8 +110,22 @@ void ath9k_cmn_update_ichannel(struct at 
    7635                 ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM; 
    7636         } 
    7637   
    7638 -       if (channel_type != NL80211_CHAN_NO_HT) 
    7639 -               ichan->chanmode = ath9k_get_extchanmode(chan, channel_type); 
     8545-               ichan->chanmode = CHANNEL_G; 
     8546-               ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM; 
     8547-       } else { 
     8548-               ichan->chanmode = CHANNEL_A; 
     8549-               ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM; 
     8550+       if (chan->band == IEEE80211_BAND_5GHZ) 
     8551+               flags |= CHANNEL_5GHZ; 
     8552+ 
    76408553+       switch (chandef->width) { 
    76418554+       case NL80211_CHAN_WIDTH_5: 
    7642 +               ichan->channelFlags |= CHANNEL_QUARTER; 
     8555+               flags |= CHANNEL_QUARTER; 
    76438556+               break; 
    76448557+       case NL80211_CHAN_WIDTH_10: 
    7645 +               ichan->channelFlags |= CHANNEL_HALF; 
     8558+               flags |= CHANNEL_HALF; 
    76468559+               break; 
    76478560+       case NL80211_CHAN_WIDTH_20_NOHT: 
    76488561+               break; 
    76498562+       case NL80211_CHAN_WIDTH_20: 
     8563+               flags |= CHANNEL_HT; 
     8564+               break; 
    76508565+       case NL80211_CHAN_WIDTH_40: 
    7651 +               ichan->chanmode = ath9k_get_extchanmode(chandef); 
     8566+               if (chandef->center_freq1 > chandef->chan->center_freq) 
     8567+                       flags |= CHANNEL_HT40PLUS | CHANNEL_HT; 
     8568+               else 
     8569+                       flags |= CHANNEL_HT40MINUS | CHANNEL_HT; 
    76528570+               break; 
    76538571+       default: 
    76548572+               WARN_ON(1); 
    7655 +       } 
    7656  } 
    7657  EXPORT_SYMBOL(ath9k_cmn_update_ichannel); 
    7658   
    7659 @@ -125,8 +141,7 @@ struct ath9k_channel *ath9k_cmn_get_curc 
     8573        } 
     8574  
     8575-       if (channel_type != NL80211_CHAN_NO_HT) 
     8576-               ichan->chanmode = ath9k_get_extchanmode(chan, channel_type); 
     8577+       ichan->channelFlags = flags; 
     8578 } 
     8579-EXPORT_SYMBOL(ath9k_cmn_update_ichannel); 
     8580  
     8581 /* 
     8582  * Get the internal channel reference. 
     8583  */ 
     8584-struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw, 
     8585-                                              struct ath_hw *ah) 
     8586+struct ath9k_channel *ath9k_cmn_get_channel(struct ieee80211_hw *hw, 
     8587+                                           struct ath_hw *ah, 
     8588+                                           struct cfg80211_chan_def *chandef) 
     8589 { 
     8590-       struct ieee80211_channel *curchan = hw->conf.chandef.chan; 
     8591+       struct ieee80211_channel *curchan = chandef->chan; 
     8592        struct ath9k_channel *channel; 
     8593        u8 chan_idx; 
    76608594  
    76618595        chan_idx = curchan->hw_value; 
     
    76638597-       ath9k_cmn_update_ichannel(channel, curchan, 
    76648598-                                 cfg80211_get_chandef_type(&hw->conf.chandef)); 
    7665 +       ath9k_cmn_update_ichannel(channel, &hw->conf.chandef); 
     8599+       ath9k_cmn_update_ichannel(channel, chandef); 
    76668600  
    76678601        return channel; 
    76688602 } 
     8603-EXPORT_SYMBOL(ath9k_cmn_get_curchannel); 
     8604+EXPORT_SYMBOL(ath9k_cmn_get_channel); 
     8605  
     8606 int ath9k_cmn_count_streams(unsigned int chainmask, int max) 
     8607 { 
    76698608--- a/drivers/net/wireless/ath/ath9k/common.h 
    76708609+++ b/drivers/net/wireless/ath/ath9k/common.h 
    7671 @@ -44,8 +44,7 @@ 
     8610@@ -43,11 +43,9 @@ 
     8611        (((x) + ((mul)/2)) / (mul)) 
    76728612  
    76738613 int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb); 
    7674  void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
     8614-void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
    76758615-                              struct ieee80211_channel *chan, 
    76768616-                              enum nl80211_channel_type channel_type); 
    7677 +                              struct cfg80211_chan_def *chandef); 
    7678  struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw, 
    7679                                                struct ath_hw *ah); 
     8617-struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw, 
     8618-                                              struct ath_hw *ah); 
     8619+struct ath9k_channel *ath9k_cmn_get_channel(struct ieee80211_hw *hw, 
     8620+                                           struct ath_hw *ah, 
     8621+                                           struct cfg80211_chan_def *chandef); 
    76808622 int ath9k_cmn_count_streams(unsigned int chainmask, int max); 
     8623 void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common, 
     8624                                  enum ath_stomp_type stomp_type); 
    76818625--- a/drivers/net/wireless/ath/ath9k/hif_usb.c 
    76828626+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c 
     
    77688712--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
    77698713+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
    7770 @@ -1203,16 +1203,13 @@ static int ath9k_htc_config(struct ieee8 
     8714@@ -24,30 +24,10 @@ 
     8715 static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv, 
     8716                                              struct ath9k_channel *ichan) 
     8717 { 
     8718-       enum htc_phymode mode; 
     8719- 
     8720-       mode = -EINVAL; 
     8721- 
     8722-       switch (ichan->chanmode) { 
     8723-       case CHANNEL_G: 
     8724-       case CHANNEL_G_HT20: 
     8725-       case CHANNEL_G_HT40PLUS: 
     8726-       case CHANNEL_G_HT40MINUS: 
     8727-               mode = HTC_MODE_11NG; 
     8728-               break; 
     8729-       case CHANNEL_A: 
     8730-       case CHANNEL_A_HT20: 
     8731-       case CHANNEL_A_HT40PLUS: 
     8732-       case CHANNEL_A_HT40MINUS: 
     8733-               mode = HTC_MODE_11NA; 
     8734-               break; 
     8735-       default: 
     8736-               break; 
     8737-       } 
     8738+       if (IS_CHAN_5GHZ(ichan)) 
     8739+               return HTC_MODE_11NA; 
     8740  
     8741-       WARN_ON(mode < 0); 
     8742- 
     8743-       return mode; 
     8744+       return HTC_MODE_11NG; 
     8745 } 
     8746  
     8747 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv, 
     8748@@ -926,7 +906,7 @@ static int ath9k_htc_start(struct ieee80 
     8749        WMI_CMD(WMI_FLUSH_RECV_CMDID); 
     8750  
     8751        /* setup initial channel */ 
     8752-       init_channel = ath9k_cmn_get_curchannel(hw, ah); 
     8753+       init_channel = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef); 
     8754  
     8755        ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false); 
     8756        if (ret) { 
     8757@@ -1203,17 +1183,12 @@ static int ath9k_htc_config(struct ieee8 
    77718758  
    77728759        if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) { 
     
    77798766                        curchan->center_freq); 
    77808767  
    7781                 ath9k_cmn_update_ichannel(&priv->ah->channels[pos], 
     8768-               ath9k_cmn_update_ichannel(&priv->ah->channels[pos], 
    77828769-                                         hw->conf.chandef.chan, 
    77838770-                                         channel_type); 
    7784 +                                         &hw->conf.chandef); 
    7785   
     8771- 
     8772+               ath9k_cmn_get_channel(hw, priv->ah, &hw->conf.chandef); 
    77868773                if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) { 
    77878774                        ath_err(common, "Unable to set channel\n"); 
     8775                        ret = -EINVAL; 
    77888776--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
    77898777+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
     
    78258813--- a/drivers/net/wireless/ath/ath9k/mac.c 
    78268814+++ b/drivers/net/wireless/ath/ath9k/mac.c 
    7827 @@ -583,9 +583,9 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
     8815@@ -374,7 +374,6 @@ EXPORT_SYMBOL(ath9k_hw_releasetxqueue); 
     8816 bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) 
     8817 { 
     8818        struct ath_common *common = ath9k_hw_common(ah); 
     8819-       struct ath9k_channel *chan = ah->curchan; 
     8820        struct ath9k_tx_queue_info *qi; 
     8821        u32 cwMin, chanCwMin, value; 
     8822  
     8823@@ -387,10 +386,7 @@ bool ath9k_hw_resettxqueue(struct ath_hw 
     8824        ath_dbg(common, QUEUE, "Reset TX queue: %u\n", q); 
     8825  
     8826        if (qi->tqi_cwmin == ATH9K_TXQ_USEDEFAULT) { 
     8827-               if (chan && IS_CHAN_B(chan)) 
     8828-                       chanCwMin = INIT_CWMIN_11B; 
     8829-               else 
     8830-                       chanCwMin = INIT_CWMIN; 
     8831+               chanCwMin = INIT_CWMIN; 
     8832  
     8833                for (cwMin = 1; cwMin < chanCwMin; cwMin = (cwMin << 1) | 1); 
     8834        } else 
     8835@@ -583,9 +579,9 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
    78288836        rs->rs_rate = MS(ads.ds_rxstatus0, AR_RxRate); 
    78298837        rs->rs_more = (ads.ds_rxstatus1 & AR_RxMore) ? 1 : 0; 
     
    78558863 #define AR_KeyMiss          0x80000000 
    78568864  
     8865@@ -601,8 +603,6 @@ enum ath9k_tx_queue_flags { 
     8866 #define ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS 0x00000001 
     8867  
     8868 #define ATH9K_DECOMP_MASK_SIZE     128 
     8869-#define ATH9K_READY_TIME_LO_BOUND  50 
     8870-#define ATH9K_READY_TIME_HI_BOUND  96 
     8871  
     8872 enum ath9k_pkt_type { 
     8873        ATH9K_PKT_TYPE_NORMAL = 0, 
    78578874--- a/drivers/net/wireless/ath/ath9k/rc.c 
    78588875+++ b/drivers/net/wireless/ath/ath9k/rc.c 
     
    79268943                struct ieee80211_hdr *hdr = (void *) skb->data; 
    79278944                u8 *qc = ieee80211_get_qos_ctl(hdr); 
     8945--- a/drivers/net/wireless/ath/ath9k/ani.c 
     8946+++ b/drivers/net/wireless/ath/ath9k/ani.c 
     8947@@ -341,10 +341,9 @@ void ath9k_ani_reset(struct ath_hw *ah,  
     8948                    aniState->cckNoiseImmunityLevel != 
     8949                    ATH9K_ANI_CCK_DEF_LEVEL) { 
     8950                        ath_dbg(common, ANI, 
     8951-                               "Restore defaults: opmode %u chan %d Mhz/0x%x is_scanning=%d ofdm:%d cck:%d\n", 
     8952+                               "Restore defaults: opmode %u chan %d Mhz is_scanning=%d ofdm:%d cck:%d\n", 
     8953                                ah->opmode, 
     8954                                chan->channel, 
     8955-                               chan->channelFlags, 
     8956                                is_scanning, 
     8957                                aniState->ofdmNoiseImmunityLevel, 
     8958                                aniState->cckNoiseImmunityLevel); 
     8959@@ -357,10 +356,9 @@ void ath9k_ani_reset(struct ath_hw *ah,  
     8960                 * restore historical levels for this channel 
     8961                 */ 
     8962                ath_dbg(common, ANI, 
     8963-                       "Restore history: opmode %u chan %d Mhz/0x%x is_scanning=%d ofdm:%d cck:%d\n", 
     8964+                       "Restore history: opmode %u chan %d Mhz is_scanning=%d ofdm:%d cck:%d\n", 
     8965                        ah->opmode, 
     8966                        chan->channel, 
     8967-                       chan->channelFlags, 
     8968                        is_scanning, 
     8969                        aniState->ofdmNoiseImmunityLevel, 
     8970                        aniState->cckNoiseImmunityLevel); 
     8971--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
     8972+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
     8973@@ -33,15 +33,12 @@ static bool ar9002_hw_is_cal_supported(s 
     8974        bool supported = false; 
     8975        switch (ah->supp_cals & cal_type) { 
     8976        case IQ_MISMATCH_CAL: 
     8977-               /* Run IQ Mismatch for non-CCK only */ 
     8978-               if (!IS_CHAN_B(chan)) 
     8979-                       supported = true; 
     8980+               supported = true; 
     8981                break; 
     8982        case ADC_GAIN_CAL: 
     8983        case ADC_DC_CAL: 
     8984                /* Run ADC Gain Cal for non-CCK & non 2GHz-HT20 only */ 
     8985-               if (!IS_CHAN_B(chan) && 
     8986-                   !((IS_CHAN_2GHZ(chan) || IS_CHAN_A_FAST_CLOCK(ah, chan)) && 
     8987+               if (!((IS_CHAN_2GHZ(chan) || IS_CHAN_A_FAST_CLOCK(ah, chan)) && 
     8988                      IS_CHAN_HT20(chan))) 
     8989                        supported = true; 
     8990                break; 
     8991--- a/drivers/net/wireless/ath/ath9k/calib.c 
     8992+++ b/drivers/net/wireless/ath/ath9k/calib.c 
     8993@@ -186,7 +186,6 @@ void ath9k_hw_reset_calibration(struct a 
     8994 bool ath9k_hw_reset_calvalid(struct ath_hw *ah) 
     8995 { 
     8996        struct ath_common *common = ath9k_hw_common(ah); 
     8997-       struct ieee80211_conf *conf = &common->hw->conf; 
     8998        struct ath9k_cal_list *currCal = ah->cal_list_curr; 
     8999  
     9000        if (!ah->caldata) 
     9001@@ -208,7 +207,7 @@ bool ath9k_hw_reset_calvalid(struct ath_ 
     9002                return true; 
     9003  
     9004        ath_dbg(common, CALIBRATE, "Resetting Cal %d state for channel %u\n", 
     9005-               currCal->calData->calType, conf->chandef.chan->center_freq); 
     9006+               currCal->calData->calType, ah->curchan->chan->center_freq); 
     9007  
     9008        ah->caldata->CalValid &= ~currCal->calData->calType; 
     9009        currCal->calState = CAL_WAITING; 
     9010@@ -242,7 +241,6 @@ void ath9k_hw_loadnf(struct ath_hw *ah,  
     9011        int32_t val; 
     9012        u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; 
     9013        struct ath_common *common = ath9k_hw_common(ah); 
     9014-       struct ieee80211_conf *conf = &common->hw->conf; 
     9015        s16 default_nf = ath9k_hw_get_default_nf(ah, chan); 
     9016  
     9017        if (ah->caldata) 
     9018@@ -252,7 +250,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah,  
     9019                if (chainmask & (1 << i)) { 
     9020                        s16 nfval; 
     9021  
     9022-                       if ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf)) 
     9023+                       if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan)) 
     9024                                continue; 
     9025  
     9026                        if (h) 
     9027@@ -314,7 +312,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah,  
     9028        ENABLE_REGWRITE_BUFFER(ah); 
     9029        for (i = 0; i < NUM_NF_READINGS; i++) { 
     9030                if (chainmask & (1 << i)) { 
     9031-                       if ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf)) 
     9032+                       if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan)) 
     9033                                continue; 
     9034  
     9035                        val = REG_READ(ah, ah->nf_regs[i]); 
     9036@@ -408,7 +406,6 @@ void ath9k_init_nfcal_hist_buffer(struct 
     9037  
     9038        ah->caldata->channel = chan->channel; 
     9039        ah->caldata->channelFlags = chan->channelFlags; 
     9040-       ah->caldata->chanmode = chan->chanmode; 
     9041        h = ah->caldata->nfCalHist; 
     9042        default_nf = ath9k_hw_get_default_nf(ah, chan); 
     9043        for (i = 0; i < NUM_NF_READINGS; i++) { 
     9044--- a/drivers/net/wireless/ath/ath9k/mci.c 
     9045+++ b/drivers/net/wireless/ath/ath9k/mci.c 
     9046@@ -661,9 +661,9 @@ void ath9k_mci_update_wlan_channels(stru 
     9047        chan_start = wlan_chan - 10; 
     9048        chan_end = wlan_chan + 10; 
     9049  
     9050-       if (chan->chanmode == CHANNEL_G_HT40PLUS) 
     9051+       if (IS_CHAN_HT40PLUS(chan)) 
     9052                chan_end += 20; 
     9053-       else if (chan->chanmode == CHANNEL_G_HT40MINUS) 
     9054+       else if (IS_CHAN_HT40MINUS(chan)) 
     9055                chan_start -= 20; 
     9056  
     9057        /* adjust side band */ 
     9058@@ -707,11 +707,11 @@ void ath9k_mci_set_txpower(struct ath_so 
     9059  
     9060        if (setchannel) { 
     9061                struct ath9k_hw_cal_data *caldata = &sc->caldata; 
     9062-               if ((caldata->chanmode == CHANNEL_G_HT40PLUS) && 
     9063+               if (IS_CHAN_HT40PLUS(ah->curchan) && 
     9064                    (ah->curchan->channel > caldata->channel) && 
     9065                    (ah->curchan->channel <= caldata->channel + 20)) 
     9066                        return; 
     9067-               if ((caldata->chanmode == CHANNEL_G_HT40MINUS) && 
     9068+               if (IS_CHAN_HT40MINUS(ah->curchan) && 
     9069                    (ah->curchan->channel < caldata->channel) && 
     9070                    (ah->curchan->channel >= caldata->channel - 20)) 
     9071                        return; 
  • trunk/package/kernel/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch

    r37918 r38354  
    99  
    1010 #include "hw.h" 
    11 @@ -517,8 +518,16 @@ static int ath9k_hw_init_macaddr(struct  
     11@@ -513,8 +514,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/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r37918 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -779,6 +779,7 @@ static const struct ieee80211_iface_limi 
     3@@ -778,6 +778,7 @@ static const struct ieee80211_iface_limi 
    44 #endif 
    55                                 BIT(NL80211_IFTYPE_AP) | 
  • trunk/package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch

    r37918 r38354  
    7272--- a/drivers/net/wireless/ath/ath9k/hw.h 
    7373+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    74 @@ -747,6 +747,7 @@ enum ath_cal_list { 
     74@@ -717,6 +717,7 @@ enum ath_cal_list { 
    7575 #define AH_USE_EEPROM   0x1 
    7676 #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */ 
     
    8282--- a/drivers/net/wireless/ath/ath9k/init.c 
    8383+++ b/drivers/net/wireless/ath/ath9k/init.c 
    84 @@ -631,6 +631,8 @@ static int ath9k_init_softc(u16 devid, s 
     84@@ -630,6 +630,8 @@ static int ath9k_init_softc(u16 devid, s 
    8585                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    8686                ah->get_mac_revision = pdata->get_mac_revision; 
  • trunk/package/kernel/mac80211/patches/502-ath9k_ahb_init.patch

    r37918 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -1036,23 +1036,23 @@ static int __init ath9k_init(void) 
     3@@ -1035,23 +1035,23 @@ static int __init ath9k_init(void) 
    44                goto err_out; 
    55        } 
  • trunk/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r37918 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -2017,8 +2017,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1993,8 +1993,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44                REG_WRITE(ah, AR_OBS, 8); 
    55  
  • trunk/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch

    r37767 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -114,7 +114,7 @@ int ath_descdma_setup(struct ath_softc * 
     3@@ -113,7 +113,7 @@ int ath_descdma_setup(struct ath_softc * 
    44 /* RX / TX */ 
    55 /***********/ 
  • trunk/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch

    r38304 r38354  
    1 --- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    2 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -701,6 +701,7 @@ struct ath_softc { 
    4         struct ieee80211_hw *hw; 
    5         struct device *dev; 
    6   
    7 +       u32 chan_bw; 
    8         struct survey_info *cur_survey; 
    9         struct survey_info survey[ATH9K_NUM_CHANNELS]; 
    10   
    111--- a/drivers/net/wireless/ath/ath9k/debug.c 
    122+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    13 @@ -1918,6 +1918,50 @@ static const struct file_operations fops 
     3@@ -1918,6 +1918,52 @@ static const struct file_operations fops 
    144        .owner = THIS_MODULE 
    155 }; 
     
    2010+{ 
    2111+       struct ath_softc *sc = file->private_data; 
     12+       struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
    2213+       char buf[32]; 
    2314+       unsigned int len; 
    2415+ 
    25 +       len = sprintf(buf, "0x%08x\n", sc->chan_bw); 
     16+       len = sprintf(buf, "0x%08x\n", common->chan_bw); 
    2617+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
    2718+} 
     
    3122+{ 
    3223+       struct ath_softc *sc = file->private_data; 
     24+       struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
    3325+       unsigned long chan_bw; 
    3426+       char buf[32]; 
     
    4335+               return -EINVAL; 
    4436+ 
    45 +       sc->chan_bw = chan_bw; 
     37+       common->chan_bw = chan_bw; 
    4638+       if (!test_bit(SC_OP_INVALID, &sc->sc_flags)) 
    4739+               ath9k_ops.config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL); 
     
    6254 { 
    6355        struct ath_common *common = ath9k_hw_common(ah); 
    64 @@ -1937,6 +1981,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     56@@ -1937,6 +1983,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    6557  
    6658        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
     
    7163                            &fops_dma); 
    7264        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, 
    73 --- a/drivers/net/wireless/ath/ath9k/main.c 
    74 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    75 @@ -1199,8 +1199,10 @@ static int ath9k_config(struct ieee80211 
     65--- a/drivers/net/wireless/ath/ath.h 
     66+++ b/drivers/net/wireless/ath/ath.h 
     67@@ -129,6 +129,7 @@ struct ath_common { 
     68        struct ieee80211_hw *hw; 
     69        int debug_mask; 
     70        enum ath_device_state state; 
     71+       u32 chan_bw; 
    7672  
    77         if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) { 
    78                 struct ieee80211_channel *curchan = hw->conf.chandef.chan; 
    79 +               struct ath9k_channel *hchan; 
    80                 int pos = curchan->hw_value; 
    81                 int old_pos = -1; 
    82 +               u32 oldflags; 
    83                 unsigned long flags; 
     73        struct ath_ani ani; 
    8474  
    85                 if (ah->curchan) 
    86 @@ -1237,7 +1239,23 @@ static int ath9k_config(struct ieee80211 
    87                         memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
    88                 } 
     75--- a/drivers/net/wireless/ath/ath9k/common.c 
     76+++ b/drivers/net/wireless/ath/ath9k/common.c 
     77@@ -52,11 +52,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke 
     78 /* 
     79  * Update internal channel flags. 
     80  */ 
     81-static void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan, 
     82+static void ath9k_cmn_update_ichannel(struct ath_common *common, 
     83+                                     struct ath9k_channel *ichan, 
     84                                      struct cfg80211_chan_def *chandef) 
     85 { 
     86        struct ieee80211_channel *chan = chandef->chan; 
     87        u16 flags = 0; 
     88+       int width; 
    8989  
    90 -               if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) { 
    91 +               hchan = &sc->sc_ah->channels[pos]; 
    92 +               oldflags = hchan->channelFlags; 
    93 +               switch (sc->chan_bw) { 
    94 +               case 5: 
    95 +                       hchan->channelFlags &= ~CHANNEL_HALF; 
    96 +                       hchan->channelFlags |= CHANNEL_QUARTER; 
    97 +                       break; 
    98 +               case 10: 
    99 +                       hchan->channelFlags &= ~CHANNEL_QUARTER; 
    100 +                       hchan->channelFlags |= CHANNEL_HALF; 
    101 +                       break; 
    102 +               default: 
    103 +                       hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER); 
    104 +                       break; 
    105 +               } 
     90        ichan->channel = chan->center_freq; 
     91        ichan->chan = chan; 
     92@@ -64,7 +66,19 @@ static void ath9k_cmn_update_ichannel(st 
     93        if (chan->band == IEEE80211_BAND_5GHZ) 
     94                flags |= CHANNEL_5GHZ; 
     95  
     96-       switch (chandef->width) { 
     97+       switch (common->chan_bw) { 
     98+       case 5: 
     99+               width = NL80211_CHAN_WIDTH_5; 
     100+               break; 
     101+       case 10: 
     102+               width = NL80211_CHAN_WIDTH_10; 
     103+               break; 
     104+       default: 
     105+               width = chandef->width; 
     106+               break; 
     107+       } 
    106108+ 
    107 +               if (ath_set_channel(sc, hw, hchan) < 0) { 
    108                         ath_err(common, "Unable to set channel\n"); 
    109                         mutex_unlock(&sc->mutex); 
    110                         ath9k_ps_restore(sc); 
     109+       switch (width) { 
     110        case NL80211_CHAN_WIDTH_5: 
     111                flags |= CHANNEL_QUARTER; 
     112                break; 
     113@@ -97,12 +111,13 @@ struct ath9k_channel *ath9k_cmn_get_chan 
     114                                            struct cfg80211_chan_def *chandef) 
     115 { 
     116        struct ieee80211_channel *curchan = chandef->chan; 
     117+       struct ath_common *common = ath9k_hw_common(ah); 
     118        struct ath9k_channel *channel; 
     119        u8 chan_idx; 
     120  
     121        chan_idx = curchan->hw_value; 
     122        channel = &ah->channels[chan_idx]; 
     123-       ath9k_cmn_update_ichannel(channel, chandef); 
     124+       ath9k_cmn_update_ichannel(common, channel, chandef); 
     125  
     126        return channel; 
     127 } 
  • trunk/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch

    r37918 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -728,6 +728,7 @@ int ath9k_hw_init(struct ath_hw *ah) 
     3@@ -724,6 +724,7 @@ int ath9k_hw_init(struct ath_hw *ah) 
    44        case AR9300_DEVID_AR9462: 
    55        case AR9485_DEVID_AR1111: 
  • trunk/package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch

    r38304 r38354  
    1515 out: 
    1616        spin_unlock_bh(&sc->sc_pcu_lock); 
    17 @@ -1298,6 +1302,7 @@ static int ath9k_config(struct ieee80211 
     17@@ -1285,6 +1289,7 @@ static int ath9k_config(struct ieee80211 
    1818                sc->config.txpowlimit = 2 * conf->power_level; 
    1919                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
  • trunk/package/kernel/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

    r37918 r38354  
    7979--- a/drivers/net/wireless/ath/ath9k/mac.c 
    8080+++ b/drivers/net/wireless/ath/ath9k/mac.c 
    81 @@ -554,25 +554,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
     81@@ -550,25 +550,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
    8282  
    8383        if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { 
  • trunk/package/kernel/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch

    r38304 r38354  
    1111--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1212+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    13 @@ -2856,7 +2856,7 @@ void ath9k_hw_apply_txpower(struct ath_h 
     13@@ -2832,7 +2832,7 @@ void ath9k_hw_apply_txpower(struct ath_h 
    1414        channel = chan->chan; 
    1515        chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); 
     
    2222--- a/drivers/net/wireless/ath/ath9k/main.c 
    2323+++ b/drivers/net/wireless/ath/ath9k/main.c 
    24 @@ -1298,7 +1298,10 @@ static int ath9k_config(struct ieee80211 
     24@@ -1285,7 +1285,10 @@ static int ath9k_config(struct ieee80211 
    2525        } 
    2626  
  • trunk/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch

    r37918 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -553,6 +553,9 @@ struct ath9k_wow_pattern { 
     3@@ -560,6 +560,9 @@ struct ath9k_wow_pattern { 
    44 void ath_init_leds(struct ath_softc *sc); 
    55 void ath_deinit_leds(struct ath_softc *sc); 
     
    1111 static inline void ath_init_leds(struct ath_softc *sc) 
    1212 { 
    13 @@ -697,6 +700,13 @@ enum spectral_mode { 
     13@@ -704,6 +707,13 @@ enum spectral_mode { 
    1414        SPECTRAL_CHANSCAN, 
    1515 }; 
     
    2525        struct ieee80211_hw *hw; 
    2626        struct device *dev; 
    27 @@ -739,9 +749,8 @@ struct ath_softc { 
     27@@ -745,9 +755,8 @@ struct ath_softc { 
    2828        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 
    2929  
     
    163163--- a/drivers/net/wireless/ath/ath9k/init.c 
    164164+++ b/drivers/net/wireless/ath/ath9k/init.c 
    165 @@ -943,7 +943,7 @@ int ath9k_init_device(u16 devid, struct  
     165@@ -942,7 +942,7 @@ int ath9k_init_device(u16 devid, struct  
    166166  
    167167 #ifdef CPTCFG_MAC80211_LEDS 
     
    174174--- a/drivers/net/wireless/ath/ath9k/debug.c 
    175175+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    176 @@ -1961,6 +1961,61 @@ static const struct file_operations fops 
     176@@ -1963,6 +1963,61 @@ static const struct file_operations fops 
    177177        .llseek = default_llseek, 
    178178 }; 
     
    236236 int ath9k_init_debug(struct ath_hw *ah) 
    237237 { 
    238 @@ -1983,6 +2038,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
     238@@ -1985,6 +2040,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
    239239                            &fops_eeprom); 
    240240        debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
  • trunk/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch

    r37766 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/mac.c 
    22+++ b/drivers/net/wireless/ath/ath9k/mac.c 
    3 @@ -705,7 +705,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw  
     3@@ -701,7 +701,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 @@ -735,6 +735,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw  
     12@@ -731,6 +731,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw  
    1313        } 
    1414  
  • trunk/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

    r38304 r38354  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -2017,6 +2017,50 @@ static const struct file_operations fops 
     3@@ -2019,6 +2019,50 @@ static const struct file_operations fops 
    44 #endif 
    55  
     
    5252 { 
    5353        struct ath_common *common = ath9k_hw_common(ah); 
    54 @@ -2042,6 +2086,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     54@@ -2044,6 +2088,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5555        debugfs_create_file("gpio_led", S_IWUSR, 
    5656                           sc->debug.debugfs_phy, sc, &fops_gpio_led); 
     
    6363--- a/drivers/net/wireless/ath/ath9k/hw.h 
    6464+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    65 @@ -505,6 +505,12 @@ enum { 
     65@@ -475,6 +475,12 @@ enum { 
    6666        ATH9K_RESET_COLD, 
    6767 }; 
     
    7676        u32 magic; 
    7777        u16 devid; 
    78 @@ -785,6 +791,8 @@ struct ath_hw { 
     78@@ -755,6 +761,8 @@ struct ath_hw { 
    7979        u32 rfkill_polarity; 
    8080        u32 ah_flags; 
     
    8585        bool htc_reset_init; 
    8686  
    87 @@ -1035,6 +1043,7 @@ void ath9k_hw_set_sta_beacon_timers(stru 
     87@@ -1005,6 +1013,7 @@ void ath9k_hw_set_sta_beacon_timers(stru 
    8888 bool ath9k_hw_check_alive(struct ath_hw *ah); 
    8989  
     
    9595--- a/drivers/net/wireless/ath/ath9k/hw.c 
    9696+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    97 @@ -1861,6 +1861,20 @@ fail: 
     97@@ -1840,6 +1840,20 @@ fail: 
    9898        return -EINVAL; 
    9999 } 
     
    116116                   struct ath9k_hw_cal_data *caldata, bool fastcc) 
    117117 { 
    118 @@ -2063,6 +2077,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     118@@ -2039,6 +2053,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    119119        } 
    120120  
     
    126126--- a/drivers/net/wireless/ath/ath9k/main.c 
    127127+++ b/drivers/net/wireless/ath/ath9k/main.c 
    128 @@ -472,6 +472,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
     128@@ -546,6 +546,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
    129129        ath9k_hw_getisr(ah, &status);   /* NB: clears ISR too */ 
    130130        status &= ah->imask;    /* discard unasked-for bits */ 
  • trunk/package/kernel/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch

    r37918 r38354  
    1313--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1414+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    15 @@ -2456,17 +2456,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
     15@@ -2432,17 +2432,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1616        } 
    1717  
     
    4949--- a/drivers/net/wireless/ath/ath9k/hw.h 
    5050+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    51 @@ -955,6 +955,8 @@ struct ath_hw { 
     51@@ -925,6 +925,8 @@ struct ath_hw { 
    5252        bool is_clk_25mhz; 
    5353        int (*get_mac_revision)(void); 
     
    6060--- a/drivers/net/wireless/ath/ath9k/init.c 
    6161+++ b/drivers/net/wireless/ath/ath9k/init.c 
    62 @@ -631,6 +631,8 @@ static int ath9k_init_softc(u16 devid, s 
     62@@ -630,6 +630,8 @@ static int ath9k_init_softc(u16 devid, s 
    6363                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    6464                ah->get_mac_revision = pdata->get_mac_revision; 
Note: See TracChangeset for help on using the changeset viewer.