]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/ath/ath9k/common.c
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
[~andy/linux] / drivers / net / wireless / ath / ath9k / common.c
index 344fdde1d7a36f39823606c1bf64cda5adb87188..d3063c21e16c7efbd67d073c756de2198e5794e5 100644 (file)
@@ -49,37 +49,40 @@ int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb)
 }
 EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_keytype);
 
-static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan,
-                                enum nl80211_channel_type channel_type)
+static u32 ath9k_get_extchanmode(struct cfg80211_chan_def *chandef)
 {
        u32 chanmode = 0;
 
-       switch (chan->band) {
+       switch (chandef->chan->band) {
        case IEEE80211_BAND_2GHZ:
-               switch (channel_type) {
-               case NL80211_CHAN_NO_HT:
-               case NL80211_CHAN_HT20:
+               switch (chandef->width) {
+               case NL80211_CHAN_WIDTH_20_NOHT:
+               case NL80211_CHAN_WIDTH_20:
                        chanmode = CHANNEL_G_HT20;
                        break;
-               case NL80211_CHAN_HT40PLUS:
-                       chanmode = CHANNEL_G_HT40PLUS;
+               case NL80211_CHAN_WIDTH_40:
+                       if (chandef->center_freq1 > chandef->chan->center_freq)
+                               chanmode = CHANNEL_G_HT40PLUS;
+                       else
+                               chanmode = CHANNEL_G_HT40MINUS;
                        break;
-               case NL80211_CHAN_HT40MINUS:
-                       chanmode = CHANNEL_G_HT40MINUS;
+               default:
                        break;
                }
                break;
        case IEEE80211_BAND_5GHZ:
-               switch (channel_type) {
-               case NL80211_CHAN_NO_HT:
-               case NL80211_CHAN_HT20:
+               switch (chandef->width) {
+               case NL80211_CHAN_WIDTH_20_NOHT:
+               case NL80211_CHAN_WIDTH_20:
                        chanmode = CHANNEL_A_HT20;
                        break;
-               case NL80211_CHAN_HT40PLUS:
-                       chanmode = CHANNEL_A_HT40PLUS;
+               case NL80211_CHAN_WIDTH_40:
+                       if (chandef->center_freq1 > chandef->chan->center_freq)
+                               chanmode = CHANNEL_A_HT40PLUS;
+                       else
+                               chanmode = CHANNEL_A_HT40MINUS;
                        break;
-               case NL80211_CHAN_HT40MINUS:
-                       chanmode = CHANNEL_A_HT40MINUS;
+               default:
                        break;
                }
                break;
@@ -94,13 +97,12 @@ static u32 ath9k_get_extchanmode(struct ieee80211_channel *chan,
  * Update internal channel flags.
  */
 void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
-                              struct ieee80211_channel *chan,
-                              enum nl80211_channel_type channel_type)
+                              struct cfg80211_chan_def *chandef)
 {
-       ichan->channel = chan->center_freq;
-       ichan->chan = chan;
+       ichan->channel = chandef->chan->center_freq;
+       ichan->chan = chandef->chan;
 
-       if (chan->band == IEEE80211_BAND_2GHZ) {
+       if (chandef->chan->band == IEEE80211_BAND_2GHZ) {
                ichan->chanmode = CHANNEL_G;
                ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM;
        } else {
@@ -108,8 +110,22 @@ void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
                ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
        }
 
-       if (channel_type != NL80211_CHAN_NO_HT)
-               ichan->chanmode = ath9k_get_extchanmode(chan, channel_type);
+       switch (chandef->width) {
+       case NL80211_CHAN_WIDTH_5:
+               ichan->channelFlags |= CHANNEL_QUARTER;
+               break;
+       case NL80211_CHAN_WIDTH_10:
+               ichan->channelFlags |= CHANNEL_HALF;
+               break;
+       case NL80211_CHAN_WIDTH_20_NOHT:
+               break;
+       case NL80211_CHAN_WIDTH_20:
+       case NL80211_CHAN_WIDTH_40:
+               ichan->chanmode = ath9k_get_extchanmode(chandef);
+               break;
+       default:
+               WARN_ON(1);
+       }
 }
 EXPORT_SYMBOL(ath9k_cmn_update_ichannel);
 
@@ -125,8 +141,7 @@ struct ath9k_channel *ath9k_cmn_get_curchannel(struct ieee80211_hw *hw,
 
        chan_idx = curchan->hw_value;
        channel = &ah->channels[chan_idx];
-       ath9k_cmn_update_ichannel(channel, curchan,
-                                 cfg80211_get_chandef_type(&hw->conf.chandef));
+       ath9k_cmn_update_ichannel(channel, &hw->conf.chandef);
 
        return channel;
 }