mac80211: update brcmsmac ap patches
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 24 Mar 2013 00:53:15 +0000 (00:53 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 24 Mar 2013 00:53:15 +0000 (00:53 +0000)
SVN-Revision: 36113

package/mac80211/patches/862-brcmsmac-remove-brcms_bss_cfg-BSS.patch
package/mac80211/patches/863-brcmsmac-remove-brcms_bss_cfg-associated.patch
package/mac80211/patches/865-brcmsmac-remove-brcms_bss_cfg-up.patch
package/mac80211/patches/869-brcmsmac-add-beacon-template-support.patch
package/mac80211/patches/871-brcmsmac-add-support-for-probe-response-template.patch
package/mac80211/patches/872-brcmsmac-activate-AP-support.patch [deleted file]
package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch [new file with mode: 0644]
package/mac80211/patches/873-brcmsmac-activate-AP-support.patch [new file with mode: 0644]
package/mac80211/patches/873-brcmsmac-remove-extra-regulation-restriction.patch [deleted file]
package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch [new file with mode: 0644]
package/mac80211/patches/875-brcmsmac-remove-extra-regulation-restriction.patch [new file with mode: 0644]

index a7ffcf6a7867388b571c50931b9e7706310b5840..1fafd63a2825f61c112d4d313b6d63ad71e34bbb 100644 (file)
                                        brcms_err(wlc->hw->d11core,
                                                  "wl%d: up: rfdisable -> "
                                                  "bsscfg_disable()\n",
                                        brcms_err(wlc->hw->d11core,
                                                  "wl%d: up: rfdisable -> "
                                                  "bsscfg_disable()\n",
-@@ -7390,7 +7383,7 @@ void brcms_c_update_beacon(struct brcms_
+@@ -7390,7 +7383,8 @@ void brcms_c_update_beacon(struct brcms_
  {
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
 -      if (bsscfg->up && !bsscfg->BSS)
  {
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
 -      if (bsscfg->up && !bsscfg->BSS)
-+      if (bsscfg->up && bsscfg->type == BRCMS_TYPE_AP)
++      if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
++                         bsscfg->type == BRCMS_TYPE_ADHOC))
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
  }
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
  }
-@@ -7465,7 +7458,7 @@ void brcms_c_update_probe_resp(struct br
+@@ -7465,7 +7459,8 @@ void brcms_c_update_probe_resp(struct br
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
        /* update AP or IBSS probe responses */
 -      if (bsscfg->up && !bsscfg->BSS)
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
        /* update AP or IBSS probe responses */
 -      if (bsscfg->up && !bsscfg->BSS)
-+      if (bsscfg->up && bsscfg->type == BRCMS_TYPE_AP)
++      if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
++                         bsscfg->type == BRCMS_TYPE_ADHOC))
                brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
  }
  
                brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
  }
  
index 7f84f00e29f265dedb43ca4945728f1261f62ad8..79a4b688d608b6ebc1afd7b1837135434d122a4a 100644 (file)
@@ -46,7 +46,7 @@
                        mcsset_bss = wlc->bsscfg->current_bss;
                else
                        mcsset_bss = wlc->default_bss;
                        mcsset_bss = wlc->bsscfg->current_bss;
                else
                        mcsset_bss = wlc->default_bss;
-@@ -7498,7 +7493,6 @@ void brcms_c_scan_stop(struct brcms_c_in
+@@ -7500,7 +7495,6 @@ void brcms_c_scan_stop(struct brcms_c_in
  void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state)
  {
        wlc->pub->associated = state;
  void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state)
  {
        wlc->pub->associated = state;
index 40fe6eaf6e92f817333fd683de26e9cee57f1e2e..b596d799f63f4acdf39721ff2064380159efa67a 100644 (file)
@@ -1,24 +1,28 @@
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -7377,7 +7377,7 @@ void brcms_c_update_beacon(struct brcms_
+@@ -7377,8 +7377,8 @@ void brcms_c_update_beacon(struct brcms_
  {
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
  {
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
--      if (bsscfg->up && bsscfg->type == BRCMS_TYPE_AP)
-+      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP)
+-      if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
+-                         bsscfg->type == BRCMS_TYPE_ADHOC))
++      if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
++                           bsscfg->type == BRCMS_TYPE_ADHOC))
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
  }
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
  }
-@@ -7452,7 +7452,7 @@ void brcms_c_update_probe_resp(struct br
+@@ -7453,8 +7453,8 @@ void brcms_c_update_probe_resp(struct br
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
        /* update AP or IBSS probe responses */
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
        /* update AP or IBSS probe responses */
--      if (bsscfg->up && bsscfg->type == BRCMS_TYPE_AP)
-+      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP)
+-      if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
+-                         bsscfg->type == BRCMS_TYPE_ADHOC))
++      if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
++                           bsscfg->type == BRCMS_TYPE_ADHOC))
                brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
  }
  
                brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
  }
  
-@@ -7805,7 +7805,7 @@ void brcms_c_init(struct brcms_c_info *w
+@@ -7807,7 +7807,7 @@ void brcms_c_init(struct brcms_c_info *w
        brcms_c_set_bssid(wlc->bsscfg);
  
        /* Update tsf_cfprep if associated and up */
        brcms_c_set_bssid(wlc->bsscfg);
  
        /* Update tsf_cfprep if associated and up */
index ab864a3dbf66b9041e75ef419ab59e9a696d0ab1..7ea09a85404afa35bf02de69dcd0c8aab9ef7afb 100644 (file)
  /*
   * Update all beacons for the system.
   */
  /*
   * Update all beacons for the system.
   */
-@@ -7386,9 +7494,31 @@ void brcms_c_update_beacon(struct brcms_
- {
+@@ -7387,9 +7495,31 @@ void brcms_c_update_beacon(struct brcms_
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
        struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
  
--      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP)
-+      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP) {
+       if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
+-                           bsscfg->type == BRCMS_TYPE_ADHOC))
++                           bsscfg->type == BRCMS_TYPE_ADHOC)) {
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
 +              if (!wlc->beacon)
                /* Clear the soft intmask */
                wlc->defmacintmask &= ~MI_BCNTPL;
 +              if (!wlc->beacon)
  }
  
  /* Write ssid into shared memory */
  }
  
  /* Write ssid into shared memory */
-@@ -7786,6 +7916,10 @@ bool brcms_c_dpc(struct brcms_c_info *wl
+@@ -7788,6 +7918,10 @@ bool brcms_c_dpc(struct brcms_c_info *wl
                brcms_rfkill_set_hw_state(wlc->wl);
        }
  
                brcms_rfkill_set_hw_state(wlc->wl);
        }
  
        /* it isn't done and needs to be resched if macintstatus is non-zero */
        return wlc->macintstatus != 0;
  
        /* it isn't done and needs to be resched if macintstatus is non-zero */
        return wlc->macintstatus != 0;
  
-@@ -7917,6 +8051,7 @@ brcms_c_attach(struct brcms_info *wl, st
+@@ -7919,6 +8053,7 @@ brcms_c_attach(struct brcms_info *wl, st
        pub->unit = unit;
        pub->_piomode = piomode;
        wlc->bandinit_pending = false;
        pub->unit = unit;
        pub->_piomode = piomode;
        wlc->bandinit_pending = false;
index 5d022d2b578440471748dec4ab9b9b291b9849a8..38d3648a8dd1a4ac47c9defaa6843910709a8eba 100644 (file)
  int brcms_c_get_header_len(void)
  {
        return TXOFF;
  int brcms_c_get_header_len(void)
  {
        return TXOFF;
-@@ -7530,6 +7469,20 @@ void brcms_c_set_new_beacon(struct brcms
+@@ -7531,6 +7470,20 @@ void brcms_c_set_new_beacon(struct brcms
        brcms_c_update_beacon(wlc);
  }
  
        brcms_c_update_beacon(wlc);
  }
  
  /* Write ssid into shared memory */
  static void
  brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
  /* Write ssid into shared memory */
  static void
  brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
-@@ -7549,30 +7502,19 @@ brcms_c_shm_ssid_upd(struct brcms_c_info
+@@ -7550,30 +7503,19 @@ brcms_c_shm_ssid_upd(struct brcms_c_info
  static void
  brcms_c_bss_update_probe_resp(struct brcms_c_info *wlc,
                              struct brcms_bss_cfg *cfg,
  static void
  brcms_c_bss_update_probe_resp(struct brcms_c_info *wlc,
                              struct brcms_bss_cfg *cfg,
  
        /* write the length of the probe response frame (+PLCP/-FCS) */
        brcms_b_write_shm(wlc->hw, M_PRB_RESP_FRM_LEN, (u16) len);
  
        /* write the length of the probe response frame (+PLCP/-FCS) */
        brcms_b_write_shm(wlc->hw, M_PRB_RESP_FRM_LEN, (u16) len);
-@@ -7586,13 +7528,11 @@ brcms_c_bss_update_probe_resp(struct brc
+@@ -7587,13 +7529,11 @@ brcms_c_bss_update_probe_resp(struct brc
         * PLCP header for the call to brcms_c_mod_prb_rsp_rate_table()
         * by subtracting the PLCP len and adding the FCS.
         */
         * PLCP header for the call to brcms_c_mod_prb_rsp_rate_table()
         * by subtracting the PLCP len and adding the FCS.
         */
  }
  
  void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend)
  }
  
  void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend)
-@@ -7600,8 +7540,12 @@ void brcms_c_update_probe_resp(struct br
-       struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
+@@ -7602,8 +7542,12 @@ void brcms_c_update_probe_resp(struct br
  
        /* update AP or IBSS probe responses */
  
        /* update AP or IBSS probe responses */
--      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP)
+       if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
+-                           bsscfg->type == BRCMS_TYPE_ADHOC))
 -              brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
 -              brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
-+      if (wlc->pub->up && bsscfg->type == BRCMS_TYPE_AP) {
++                           bsscfg->type == BRCMS_TYPE_ADHOC)) {
 +              if (!wlc->probe_resp)
 +                      return;
 +              brcms_c_bss_update_probe_resp(wlc, bsscfg, wlc->probe_resp,
 +              if (!wlc->probe_resp)
 +                      return;
 +              brcms_c_bss_update_probe_resp(wlc, bsscfg, wlc->probe_resp,
diff --git a/package/mac80211/patches/872-brcmsmac-activate-AP-support.patch b/package/mac80211/patches/872-brcmsmac-activate-AP-support.patch
deleted file mode 100644 (file)
index aaf6840..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -360,7 +360,8 @@ brcms_ops_add_interface(struct ieee80211
-       struct brcms_info *wl = hw->priv;
-       /* Just STA for now */
--      if (vif->type != NL80211_IFTYPE_STATION) {
-+      if (vif->type != NL80211_IFTYPE_STATION &&
-+          vif->type != NL80211_IFTYPE_AP) {
-               brcms_err(wl->wlc->hw->d11core,
-                         "%s: Attempt to add type %d, only STA for now\n",
-                         __func__, vif->type);
-@@ -372,6 +373,9 @@ brcms_ops_add_interface(struct ieee80211
-       brcms_c_mute(wl->wlc, false);
-       if (vif->type == NL80211_IFTYPE_STATION)
-               brcms_c_start_station(wl->wlc, vif->addr);
-+      else if (vif->type == NL80211_IFTYPE_AP)
-+              brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
-+                               vif->bss_conf.ssid, vif->bss_conf.ssid_len);
-       spin_unlock_bh(&wl->lock);
-       return 0;
-@@ -1046,7 +1050,8 @@ static int ieee_hw_init(struct ieee80211
-       /* channel change time is dependent on chip and band  */
-       hw->channel_change_time = 7 * 1000;
--      hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-+      hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-+                                   BIT(NL80211_IFTYPE_AP);
-       hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2176,6 +2176,18 @@ void brcms_c_start_station(struct brcms_
-       wlc->bsscfg->type = BRCMS_TYPE_STATION;
- }
-+void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid,
-+                    u8 *ssid, size_t ssid_len)
-+{
-+      brcms_c_set_ssid(wlc, ssid, ssid_len);
-+
-+      memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+      memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID));
-+      wlc->bsscfg->type = BRCMS_TYPE_AP;
-+
-+      brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
-@@ -3064,6 +3076,9 @@ static bool brcms_c_ps_allowed(struct br
-       if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
-               return false;
-+      if (wlc->bsscfg->type == BRCMS_TYPE_AP)
-+              return false;
-+
-       return true;
- }
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -332,6 +332,8 @@ extern bool brcms_c_check_radio_disabled
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-+extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
-+                           const u8 *bssid, u8 *ssid, size_t ssid_len);
- extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
-                                  struct sk_buff *beacon, u16 tim_offset,
diff --git a/package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch b/package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch
new file mode 100644 (file)
index 0000000..9c150b1
--- /dev/null
@@ -0,0 +1,59 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -554,6 +554,12 @@ brcms_ops_bss_info_changed(struct ieee80
+               /* Beaconing should be enabled/disabled (beaconing modes) */
+               brcms_err(core, "%s: Beacon enabled: %s\n", __func__,
+                         info->enable_beacon ? "true" : "false");
++              if (info->enable_beacon &&
++                  hw->wiphy->flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) {
++                      brcms_c_enable_probe_resp(wl->wlc, true);
++              } else {
++                      brcms_c_enable_probe_resp(wl->wlc, false);
++              }
+       }
+       if (changed & BSS_CHANGED_CQM) {
+@@ -1048,7 +1054,12 @@ static int ieee_hw_init(struct ieee80211
+       hw->channel_change_time = 7 * 1000;
+       hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+-      hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
++      /*
++       * deactivate sending probe responses by ucude, because this will
++       * cause problems when WPS is used.
++       *
++       * hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
++       */
+       hw->rate_control_algorithm = "minstrel_ht";
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -7484,6 +7484,17 @@ void brcms_c_set_new_probe_resp(struct b
+       brcms_c_update_probe_resp(wlc, false);
+ }
++void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable)
++{
++      /*
++       * prevent ucode from sending probe responses by setting the timeout
++       * to 1, it can not send it in that time frame.
++       */
++      wlc->prb_resp_timeout = enable ? BRCMS_PRB_RESP_TIMEOUT : 1;
++      brcms_b_write_shm(wlc->hw, M_PRS_MAXTIME, wlc->prb_resp_timeout);
++      /* TODO: if (enable) => also deactivate receiving of probe request */
++}
++
+ /* Write ssid into shared memory */
+ static void
+ brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
+@@ -338,6 +338,7 @@ extern void brcms_c_set_new_beacon(struc
+                                  u16 dtim_period);
+ extern void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
+                                      struct sk_buff *probe_resp);
++extern void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable);
+ extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
+                            size_t ssid_len);
diff --git a/package/mac80211/patches/873-brcmsmac-activate-AP-support.patch b/package/mac80211/patches/873-brcmsmac-activate-AP-support.patch
new file mode 100644 (file)
index 0000000..83b3aa8
--- /dev/null
@@ -0,0 +1,79 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -359,10 +359,11 @@ brcms_ops_add_interface(struct ieee80211
+ {
+       struct brcms_info *wl = hw->priv;
+-      /* Just STA for now */
+-      if (vif->type != NL80211_IFTYPE_STATION) {
++      /* Just STA and AP for now */
++      if (vif->type != NL80211_IFTYPE_STATION &&
++          vif->type != NL80211_IFTYPE_AP) {
+               brcms_err(wl->wlc->hw->d11core,
+-                        "%s: Attempt to add type %d, only STA for now\n",
++                        "%s: Attempt to add type %d, only STA and AP for now\n",
+                         __func__, vif->type);
+               return -EOPNOTSUPP;
+       }
+@@ -372,6 +373,9 @@ brcms_ops_add_interface(struct ieee80211
+       brcms_c_mute(wl->wlc, false);
+       if (vif->type == NL80211_IFTYPE_STATION)
+               brcms_c_start_station(wl->wlc, vif->addr);
++      else if (vif->type == NL80211_IFTYPE_AP)
++              brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
++                               vif->bss_conf.ssid, vif->bss_conf.ssid_len);
+       spin_unlock_bh(&wl->lock);
+       return 0;
+@@ -1052,7 +1056,8 @@ static int ieee_hw_init(struct ieee80211
+       /* channel change time is dependent on chip and band  */
+       hw->channel_change_time = 7 * 1000;
+-      hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
++      hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
++                                   BIT(NL80211_IFTYPE_AP);
+       /*
+        * deactivate sending probe responses by ucude, because this will
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -2176,6 +2176,18 @@ void brcms_c_start_station(struct brcms_
+       wlc->bsscfg->type = BRCMS_TYPE_STATION;
+ }
++void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid,
++                    u8 *ssid, size_t ssid_len)
++{
++      brcms_c_set_ssid(wlc, ssid, ssid_len);
++
++      memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
++      memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID));
++      wlc->bsscfg->type = BRCMS_TYPE_AP;
++
++      brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
++}
++
+ /* Initialize GPIOs that are controlled by D11 core */
+ static void brcms_c_gpio_init(struct brcms_c_info *wlc)
+ {
+@@ -3064,6 +3076,9 @@ static bool brcms_c_ps_allowed(struct br
+       if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
+               return false;
++      if (wlc->bsscfg->type == BRCMS_TYPE_AP)
++              return false;
++
+       return true;
+ }
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
+@@ -332,6 +332,8 @@ extern bool brcms_c_check_radio_disabled
+ extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
+ extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
+ extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
++extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
++                           const u8 *bssid, u8 *ssid, size_t ssid_len);
+ extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
+ extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
+                                  struct sk_buff *beacon, u16 tim_offset,
diff --git a/package/mac80211/patches/873-brcmsmac-remove-extra-regulation-restriction.patch b/package/mac80211/patches/873-brcmsmac-remove-extra-regulation-restriction.patch
deleted file mode 100644 (file)
index dd1393a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-@@ -59,23 +59,16 @@
- #define BRCM_2GHZ_2412_2462   REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
- #define BRCM_2GHZ_2467_2472   REG_RULE(2467-10, 2472+10, 20, 0, 19, \
--                                       NL80211_RRF_PASSIVE_SCAN | \
--                                       NL80211_RRF_NO_IBSS)
-+                                       0)
- #define BRCM_5GHZ_5180_5240   REG_RULE(5180-10, 5240+10, 40, 0, 21, \
--                                       NL80211_RRF_PASSIVE_SCAN | \
--                                       NL80211_RRF_NO_IBSS)
-+                                       0)
- #define BRCM_5GHZ_5260_5320   REG_RULE(5260-10, 5320+10, 40, 0, 21, \
--                                       NL80211_RRF_PASSIVE_SCAN | \
--                                       NL80211_RRF_DFS | \
--                                       NL80211_RRF_NO_IBSS)
-+                                       0)
- #define BRCM_5GHZ_5500_5700   REG_RULE(5500-10, 5700+10, 40, 0, 21, \
--                                       NL80211_RRF_PASSIVE_SCAN | \
--                                       NL80211_RRF_DFS | \
--                                       NL80211_RRF_NO_IBSS)
-+                                       0)
- #define BRCM_5GHZ_5745_5825   REG_RULE(5745-10, 5825+10, 40, 0, 21, \
--                                       NL80211_RRF_PASSIVE_SCAN | \
--                                       NL80211_RRF_NO_IBSS)
-+                                       0)
- static const struct ieee80211_regdomain brcms_regdom_x2 = {
-       .n_reg_rules = 6,
diff --git a/package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch b/package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch
new file mode 100644 (file)
index 0000000..d1c7407
--- /dev/null
@@ -0,0 +1,74 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -359,11 +359,12 @@ brcms_ops_add_interface(struct ieee80211
+ {
+       struct brcms_info *wl = hw->priv;
+-      /* Just STA and AP for now */
++      /* Just STA, AP and ADHOC for now */
+       if (vif->type != NL80211_IFTYPE_STATION &&
+-          vif->type != NL80211_IFTYPE_AP) {
++          vif->type != NL80211_IFTYPE_AP &&
++          vif->type != NL80211_IFTYPE_ADHOC) {
+               brcms_err(wl->wlc->hw->d11core,
+-                        "%s: Attempt to add type %d, only STA and AP for now\n",
++                        "%s: Attempt to add type %d, only STA, AP and AdHoc for now\n",
+                         __func__, vif->type);
+               return -EOPNOTSUPP;
+       }
+@@ -376,6 +377,8 @@ brcms_ops_add_interface(struct ieee80211
+       else if (vif->type == NL80211_IFTYPE_AP)
+               brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
+                                vif->bss_conf.ssid, vif->bss_conf.ssid_len);
++      else if (vif->type == NL80211_IFTYPE_ADHOC)
++              brcms_c_start_adhoc(wl->wlc, vif->addr);
+       spin_unlock_bh(&wl->lock);
+       return 0;
+@@ -1057,7 +1060,8 @@ static int ieee_hw_init(struct ieee80211
+       /* channel change time is dependent on chip and band  */
+       hw->channel_change_time = 7 * 1000;
+       hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+-                                   BIT(NL80211_IFTYPE_AP);
++                                   BIT(NL80211_IFTYPE_AP) |
++                                   BIT(NL80211_IFTYPE_ADHOC);
+       /*
+        * deactivate sending probe responses by ucude, because this will
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -2188,6 +2188,14 @@ void brcms_c_start_ap(struct brcms_c_inf
+       brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
+ }
++void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr)
++{
++      memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
++      wlc->bsscfg->type = BRCMS_TYPE_ADHOC;
++
++      brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, 0);
++}
++
+ /* Initialize GPIOs that are controlled by D11 core */
+ static void brcms_c_gpio_init(struct brcms_c_info *wlc)
+ {
+@@ -3079,6 +3087,9 @@ static bool brcms_c_ps_allowed(struct br
+       if (wlc->bsscfg->type == BRCMS_TYPE_AP)
+               return false;
++      if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC)
++              return false;
++
+       return true;
+ }
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
+@@ -334,6 +334,7 @@ extern bool brcms_c_tx_flush_completed(s
+ extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
+ extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
+                            const u8 *bssid, u8 *ssid, size_t ssid_len);
++extern void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr);
+ extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
+ extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
+                                  struct sk_buff *beacon, u16 tim_offset,
diff --git a/package/mac80211/patches/875-brcmsmac-remove-extra-regulation-restriction.patch b/package/mac80211/patches/875-brcmsmac-remove-extra-regulation-restriction.patch
new file mode 100644 (file)
index 0000000..dd1393a
--- /dev/null
@@ -0,0 +1,31 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+@@ -59,23 +59,16 @@
+ #define BRCM_2GHZ_2412_2462   REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
+ #define BRCM_2GHZ_2467_2472   REG_RULE(2467-10, 2472+10, 20, 0, 19, \
+-                                       NL80211_RRF_PASSIVE_SCAN | \
+-                                       NL80211_RRF_NO_IBSS)
++                                       0)
+ #define BRCM_5GHZ_5180_5240   REG_RULE(5180-10, 5240+10, 40, 0, 21, \
+-                                       NL80211_RRF_PASSIVE_SCAN | \
+-                                       NL80211_RRF_NO_IBSS)
++                                       0)
+ #define BRCM_5GHZ_5260_5320   REG_RULE(5260-10, 5320+10, 40, 0, 21, \
+-                                       NL80211_RRF_PASSIVE_SCAN | \
+-                                       NL80211_RRF_DFS | \
+-                                       NL80211_RRF_NO_IBSS)
++                                       0)
+ #define BRCM_5GHZ_5500_5700   REG_RULE(5500-10, 5700+10, 40, 0, 21, \
+-                                       NL80211_RRF_PASSIVE_SCAN | \
+-                                       NL80211_RRF_DFS | \
+-                                       NL80211_RRF_NO_IBSS)
++                                       0)
+ #define BRCM_5GHZ_5745_5825   REG_RULE(5745-10, 5825+10, 40, 0, 21, \
+-                                       NL80211_RRF_PASSIVE_SCAN | \
+-                                       NL80211_RRF_NO_IBSS)
++                                       0)
+ static const struct ieee80211_regdomain brcms_regdom_x2 = {
+       .n_reg_rules = 6,