Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 28 Aug 2013 14:36:09 +0000 (10:36 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 28 Aug 2013 14:36:09 +0000 (10:36 -0400)
Conflicts:
drivers/net/wireless/iwlwifi/pcie/trans.c
net/mac80211/ibss.c

12 files changed:
1  2 
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/iwlegacy/4965-mac.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/time-event.c
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/zd1201.c
include/net/mac80211.h
net/mac80211/ibss.c
net/mac80211/rc80211_minstrel_ht.c
net/wireless/nl80211.c

Simple merge
Simple merge
@@@ -162,10 -177,15 +176,15 @@@ static void iwl_mvm_te_handle_notif(str
         * P2P Device discoveribility, while there are other higher priority
         * events in the system).
         */
-       WARN_ONCE(!le32_to_cpu(notif->status),
-                 "Failed to schedule time event\n");
+       if (WARN_ONCE(!le32_to_cpu(notif->status),
+                     "Failed to schedule time event\n")) {
+               if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) {
+                       iwl_mvm_te_clear_data(mvm, te_data);
+                       return;
+               }
+       }
  
 -      if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) {
 +      if (le32_to_cpu(notif->action) & TE_V2_NOTIF_HOST_EVENT_END) {
                IWL_DEBUG_TE(mvm,
                             "TE ended - current time %lu, estimated end %lu\n",
                             jiffies, te_data->end_jiffies);
                 * By now, we should have finished association
                 * and know the dtim period.
                 */
-               if (te_data->vif->type == NL80211_IFTYPE_STATION &&
-                   (!te_data->vif->bss_conf.assoc ||
-                    !te_data->vif->bss_conf.dtim_period)) {
-                       IWL_ERR(mvm,
-                               "No assocation and the time event is over already...\n");
-                       ieee80211_connection_loss(te_data->vif);
-               }
+               iwl_mvm_te_check_disconnect(mvm, te_data->vif,
+                       "No assocation and the time event is over already...");
                iwl_mvm_te_clear_data(mvm, te_data);
 -      } else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) {
 +      } else if (le32_to_cpu(notif->action) & TE_V2_NOTIF_HOST_EVENT_START) {
                te_data->running = true;
 -              te_data->end_jiffies = jiffies +
 -                      TU_TO_JIFFIES(te_data->duration);
 +              te_data->end_jiffies = TU_TO_EXP_TIME(te_data->duration);
  
                if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) {
                        set_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status);
Simple merge
Simple merge
@@@ -191,90 -207,6 +191,93 @@@ ieee80211_ibss_build_presp(struct ieee8
  
        presp->head_len = pos - presp->head;
        if (WARN_ON(presp->head_len > frame_len))
-                                     struct ieee80211_channel *chan,
 +              goto error;
 +
 +      return presp;
 +error:
 +      kfree(presp);
 +      return NULL;
 +}
 +
 +static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 +                                    const u8 *bssid, const int beacon_int,
-       chandef = ifibss->chandef;
++                                    struct cfg80211_chan_def *req_chandef,
 +                                    const u32 basic_rates,
 +                                    const u16 capability, u64 tsf,
 +                                    bool creator)
 +{
 +      struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
 +      struct ieee80211_local *local = sdata->local;
 +      struct ieee80211_supported_band *sband;
 +      struct ieee80211_mgmt *mgmt;
 +      struct cfg80211_bss *bss;
 +      u32 bss_change;
 +      struct cfg80211_chan_def chandef;
++      struct ieee80211_channel *chan;
 +      struct beacon_data *presp;
 +      enum nl80211_bss_scan_width scan_width;
 +      bool have_higher_than_11mbit;
 +
 +      sdata_assert_lock(sdata);
 +
 +      /* Reset own TSF to allow time synchronization work. */
 +      drv_reset_tsf(local, sdata);
 +
 +      if (!ether_addr_equal(ifibss->bssid, bssid))
 +              sta_info_flush(sdata);
 +
 +      /* if merging, indicate to driver that we leave the old IBSS */
 +      if (sdata->vif.bss_conf.ibss_joined) {
 +              sdata->vif.bss_conf.ibss_joined = false;
 +              sdata->vif.bss_conf.ibss_creator = false;
 +              sdata->vif.bss_conf.enable_beacon = false;
 +              netif_carrier_off(sdata->dev);
 +              ieee80211_bss_info_change_notify(sdata,
 +                                               BSS_CHANGED_IBSS |
 +                                               BSS_CHANGED_BEACON_ENABLED);
 +      }
 +
 +      presp = rcu_dereference_protected(ifibss->presp,
 +                                        lockdep_is_held(&sdata->wdev.mtx));
 +      rcu_assign_pointer(ifibss->presp, NULL);
 +      if (presp)
 +              kfree_rcu(presp, rcu_head);
 +
 +      sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
 +
++      /* make a copy of the chandef, it could be modified below. */
++      chandef = *req_chandef;
++      chan = chandef.chan;
 +      if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
 +              if (chandef.width == NL80211_CHAN_WIDTH_5 ||
 +                  chandef.width == NL80211_CHAN_WIDTH_10 ||
 +                  chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
 +                  chandef.width == NL80211_CHAN_WIDTH_20) {
 +                      sdata_info(sdata,
 +                                 "Failed to join IBSS, beacons forbidden\n");
 +                      return;
 +              }
 +              chandef.width = NL80211_CHAN_WIDTH_20;
 +              chandef.center_freq1 = chan->center_freq;
 +      }
 +
 +      ieee80211_vif_release_channel(sdata);
 +      if (ieee80211_vif_use_channel(sdata, &chandef,
 +                                    ifibss->fixed_channel ?
 +                                      IEEE80211_CHANCTX_SHARED :
 +                                      IEEE80211_CHANCTX_EXCLUSIVE)) {
 +              sdata_info(sdata, "Failed to join IBSS, no channel context\n");
 +              return;
 +      }
 +
 +      memcpy(ifibss->bssid, bssid, ETH_ALEN);
 +
 +      sband = local->hw.wiphy->bands[chan->band];
 +
 +      presp = ieee80211_ibss_build_presp(sdata, beacon_int, basic_rates,
 +                                         capability, tsf, &chandef,
 +                                         &have_higher_than_11mbit);
 +      if (!presp)
                return;
  
        rcu_assign_pointer(ifibss->presp, presp);
@@@ -343,18 -267,35 +347,39 @@@ static void ieee80211_sta_join_ibss(str
        int i, j;
        u16 beacon_int = cbss->beacon_interval;
        const struct cfg80211_bss_ies *ies;
+       enum nl80211_channel_type chan_type;
        u64 tsf;
 +      u32 rate_flags;
 +      int shift;
  
        sdata_assert_lock(sdata);
  
        if (beacon_int < 10)
                beacon_int = 10;
  
+       switch (sdata->u.ibss.chandef.width) {
+       case NL80211_CHAN_WIDTH_20_NOHT:
+       case NL80211_CHAN_WIDTH_20:
+       case NL80211_CHAN_WIDTH_40:
+               chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
+               cfg80211_chandef_create(&chandef, cbss->channel, chan_type);
+               break;
+       case NL80211_CHAN_WIDTH_5:
+       case NL80211_CHAN_WIDTH_10:
+               cfg80211_chandef_create(&chandef, cbss->channel,
+                                       NL80211_CHAN_WIDTH_20_NOHT);
+               chandef.width = sdata->u.ibss.chandef.width;
+               break;
+       default:
+               /* fall back to 20 MHz for unsupported modes */
+               cfg80211_chandef_create(&chandef, cbss->channel,
+                                       NL80211_CHAN_WIDTH_20_NOHT);
+               break;
+       }
        sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
 +      rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
 +      shift = ieee80211_vif_get_shift(&sdata->vif);
  
        basic_rates = 0;
  
Simple merge
Simple merge