ath5k: enable support for 5 MHz and 10 MHz channels
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>
Wed, 14 Aug 2013 06:01:37 +0000 (08:01 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 16 Aug 2013 18:17:50 +0000 (14:17 -0400)
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/base.h
drivers/net/wireless/ath/ath5k/mac80211-ops.c

index 2d691b8b95b94bb3e57aedd26af2972cc128f683..74bd54d6acebaeb2052d0184898a6b7e13f27a49 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/average.h>
 #include <linux/leds.h>
 #include <net/mac80211.h>
+#include <net/cfg80211.h>
 
 /* RX/TX descriptor hw structs
  * TODO: Driver part should only see sw structs */
index 7c298af35d42f664620ea376108c07b50d71b095..48161edec8de84769fd9f3db92fa1c4aa165d70b 100644 (file)
@@ -56,6 +56,7 @@
 #include <linux/etherdevice.h>
 #include <linux/nl80211.h>
 
+#include <net/cfg80211.h>
 #include <net/ieee80211_radiotap.h>
 
 #include <asm/unaligned.h>
@@ -443,11 +444,27 @@ ath5k_setup_bands(struct ieee80211_hw *hw)
  * Called with ah->lock.
  */
 int
-ath5k_chan_set(struct ath5k_hw *ah, struct ieee80211_channel *chan)
+ath5k_chan_set(struct ath5k_hw *ah, struct cfg80211_chan_def *chandef)
 {
        ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
                  "channel set, resetting (%u -> %u MHz)\n",
-                 ah->curchan->center_freq, chan->center_freq);
+                 ah->curchan->center_freq, chandef->chan->center_freq);
+
+       switch (chandef->width) {
+       case NL80211_CHAN_WIDTH_20:
+       case NL80211_CHAN_WIDTH_20_NOHT:
+               ah->ah_bwmode = AR5K_BWMODE_DEFAULT;
+               break;
+       case NL80211_CHAN_WIDTH_5:
+               ah->ah_bwmode = AR5K_BWMODE_5MHZ;
+               break;
+       case NL80211_CHAN_WIDTH_10:
+               ah->ah_bwmode = AR5K_BWMODE_10MHZ;
+               break;
+       default:
+               WARN_ON(1);
+               return -EINVAL;
+       }
 
        /*
         * To switch channels clear any pending DMA operations;
@@ -455,7 +472,7 @@ ath5k_chan_set(struct ath5k_hw *ah, struct ieee80211_channel *chan)
         * hardware at the new frequency, and then re-enable
         * the relevant bits of the h/w.
         */
-       return ath5k_reset(ah, chan, true);
+       return ath5k_reset(ah, chandef->chan, true);
 }
 
 void ath5k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
@@ -2525,6 +2542,8 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)
        /* SW support for IBSS_RSN is provided by mac80211 */
        hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
 
+       hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ;
+
        /* both antennas can be configured as RX or TX */
        hw->wiphy->available_antennas_tx = 0x3;
        hw->wiphy->available_antennas_rx = 0x3;
index ca9a83ceeee1d430364a690c5b10703b14fc27d9..97469d0fbad7676ad9d68a81e7d5c86eff43074a 100644 (file)
@@ -101,7 +101,7 @@ void ath5k_set_beacon_filter(struct ieee80211_hw *hw, bool enable);
 
 void ath5k_update_bssid_mask_and_opmode(struct ath5k_hw *ah,
                                        struct ieee80211_vif *vif);
-int ath5k_chan_set(struct ath5k_hw *ah, struct ieee80211_channel *chan);
+int ath5k_chan_set(struct ath5k_hw *ah, struct cfg80211_chan_def *chandef);
 void ath5k_txbuf_free_skb(struct ath5k_hw *ah, struct ath5k_buf *bf);
 void ath5k_rxbuf_free_skb(struct ath5k_hw *ah, struct ath5k_buf *bf);
 void ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb,
index 40825d43322edb511862c90bd2587395745852e7..4ee01f654235478ea3510847d6f207593541573f 100644 (file)
@@ -202,7 +202,7 @@ ath5k_config(struct ieee80211_hw *hw, u32 changed)
        mutex_lock(&ah->lock);
 
        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
-               ret = ath5k_chan_set(ah, conf->chandef.chan);
+               ret = ath5k_chan_set(ah, &conf->chandef);
                if (ret < 0)
                        goto unlock;
        }