Merge tag 'wireless-drivers-next-for-davem-2016-06-21' of git://git.kernel.org/pub...
authorDavid S. Miller <davem@davemloft.net>
Thu, 23 Jun 2016 19:40:31 +0000 (15:40 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Jun 2016 19:40:31 +0000 (15:40 -0400)
Kalle Valo says:

====================
wireless-drivers patches for 4.8

Major changes:

ath10k

* enable btcoex support without restarting firmware
* enable ipq4019 support using AHB bus
* add QCA9887 chipset support
* retrieve calibration data from EEPROM, currently only for QCA9887

wil6210

* add pm_notify handling

brcmfmac

* add support for the PCIE devices 43525 and 43465
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
MAINTAINERS
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

diff --combined MAINTAINERS
@@@ -2454,14 -2454,6 +2454,14 @@@ L:    netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/broadcom/b44.*
  
 +BROADCOM B53 ETHERNET SWITCH DRIVER
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +L:    netdev@vger.kernel.org
 +L:    openwrt-devel@lists.openwrt.org (subscribers-only)
 +S:    Supported
 +F:    drivers/net/dsa/b53/*
 +F:    include/linux/platform_data/b53.h
 +
  BROADCOM GENET ETHERNET DRIVER
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    netdev@vger.kernel.org
@@@ -2578,12 -2570,11 +2578,11 @@@ S:   Supporte
  F:    drivers/net/ethernet/broadcom/tg3.*
  
  BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
- M:    Brett Rudley <brudley@broadcom.com>
- M:    Arend van Spriel <arend@broadcom.com>
- M:    Franky (Zhenhui) Lin <frankyl@broadcom.com>
- M:    Hante Meuleman <meuleman@broadcom.com>
+ M:    Arend van Spriel <arend.vanspriel@broadcom.com>
+ M:    Franky Lin <franky.lin@broadcom.com>
+ M:    Hante Meuleman <hante.meuleman@broadcom.com>
  L:    linux-wireless@vger.kernel.org
- L:    brcm80211-dev-list@broadcom.com
+ L:    brcm80211-dev-list.pdl@broadcom.com
  S:    Supported
  F:    drivers/net/wireless/broadcom/brcm80211/
  
@@@ -2814,7 -2805,6 +2813,7 @@@ W:      https://github.com/linux-ca
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/net/can/
  F:    drivers/net/can/
  F:    include/linux/can/dev.h
  F:    include/linux/can/platform/
@@@ -3095,7 -3085,6 +3094,7 @@@ M:      Stephen Boyd <sboyd@codeaurora.org
  L:    linux-clk@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/clock/
  F:    drivers/clk/
  X:    drivers/clk/clkdev.c
  F:    include/linux/clk-pr*
@@@ -4880,13 -4869,6 +4879,13 @@@ F:    drivers/net/ethernet/freescale/gianf
  X:    drivers/net/ethernet/freescale/gianfar_ptp.c
  F:    Documentation/devicetree/bindings/net/fsl-tsec-phy.txt
  
 +FREESCALE QUICC ENGINE UCC HDLC DRIVER
 +M:    Zhao Qiang <qiang.zhao@nxp.com>
 +L:    netdev@vger.kernel.org
 +L:    linuxppc-dev@lists.ozlabs.org
 +S:    Maintained
 +F:    drivers/net/wan/fsl_ucc_hdlc*
 +
  FREESCALE QUICC ENGINE UCC UART DRIVER
  M:    Timur Tabi <timur@tabi.org>
  L:    linuxppc-dev@lists.ozlabs.org
@@@ -8025,7 -8007,6 +8024,7 @@@ Q:      http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/net/wireless/
  F:    drivers/net/wireless/
  
  NETXEN (1/10) GbE SUPPORT
@@@ -8963,7 -8944,6 +8962,7 @@@ M:      Linus Walleij <linus.walleij@linaro.
  L:    linux-gpio@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/pinctrl/
  F:    drivers/pinctrl/
  F:    include/linux/pinctrl/
  
@@@ -541,6 -541,21 +541,21 @@@ brcmf_cfg80211_update_proto_addr_mode(s
                                                ADDR_INDIRECT);
  }
  
+ static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
+ {
+       int bsscfgidx;
+       for (bsscfgidx = 0; bsscfgidx < BRCMF_MAX_IFS; bsscfgidx++) {
+               /* bsscfgidx 1 is reserved for legacy P2P */
+               if (bsscfgidx == 1)
+                       continue;
+               if (!drvr->iflist[bsscfgidx])
+                       return bsscfgidx;
+       }
+       return -ENOMEM;
+ }
  static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
  {
        struct brcmf_mbss_ssid_le mbss_ssid_le;
        int err;
  
        memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le));
-       bsscfgidx = brcmf_get_next_free_bsscfgidx(ifp->drvr);
+       bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr);
        if (bsscfgidx < 0)
                return bsscfgidx;
  
@@@ -586,7 -601,7 +601,7 @@@ struct wireless_dev *brcmf_ap_add_vif(s
  
        brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
  
-       vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP, false);
+       vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP);
        if (IS_ERR(vif))
                return (struct wireless_dev *)vif;
  
@@@ -669,20 -684,24 +684,24 @@@ static struct wireless_dev *brcmf_cfg80
                return ERR_PTR(-EOPNOTSUPP);
        case NL80211_IFTYPE_AP:
                wdev = brcmf_ap_add_vif(wiphy, name, flags, params);
-               if (!IS_ERR(wdev))
-                       brcmf_cfg80211_update_proto_addr_mode(wdev);
-               return wdev;
+               break;
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_P2P_GO:
        case NL80211_IFTYPE_P2P_DEVICE:
                wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params);
-               if (!IS_ERR(wdev))
-                       brcmf_cfg80211_update_proto_addr_mode(wdev);
-               return wdev;
+               break;
        case NL80211_IFTYPE_UNSPECIFIED:
        default:
                return ERR_PTR(-EINVAL);
        }
+       if (IS_ERR(wdev))
+               brcmf_err("add iface %s type %d failed: err=%d\n",
+                         name, type, (int)PTR_ERR(wdev));
+       else
+               brcmf_cfg80211_update_proto_addr_mode(wdev);
+       return wdev;
  }
  
  static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc)
@@@ -2540,14 -2559,12 +2559,14 @@@ brcmf_cfg80211_get_station(struct wiph
                           const u8 *mac, struct station_info *sinfo)
  {
        struct brcmf_if *ifp = netdev_priv(ndev);
 +      struct brcmf_scb_val_le scb_val;
        s32 err = 0;
        struct brcmf_sta_info_le sta_info_le;
        u32 sta_flags;
        u32 is_tdls_peer;
        s32 total_rssi;
        s32 count_rssi;
 +      int rssi;
        u32 i;
  
        brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
                        sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
                        total_rssi /= count_rssi;
                        sinfo->signal = total_rssi;
 +              } else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
 +                      &ifp->vif->sme_state)) {
 +                      memset(&scb_val, 0, sizeof(scb_val));
 +                      err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
 +                                                   &scb_val, sizeof(scb_val));
 +                      if (err) {
 +                              brcmf_err("Could not get rssi (%d)\n", err);
 +                              goto done;
 +                      } else {
 +                              rssi = le32_to_cpu(scb_val.val);
 +                              sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
 +                              sinfo->signal = rssi;
 +                              brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
 +                      }
                }
        }
  done:
@@@ -2750,7 -2753,7 +2769,7 @@@ static s32 brcmf_inform_single_bss(stru
        if (!bi->ctl_ch) {
                ch.chspec = le16_to_cpu(bi->chanspec);
                cfg->d11inf.decchspec(&ch);
-               bi->ctl_ch = ch.chnum;
+               bi->ctl_ch = ch.control_ch_num;
        }
        channel = bi->ctl_ch;
  
@@@ -2868,7 -2871,7 +2887,7 @@@ static s32 brcmf_inform_ibss(struct brc
        else
                band = wiphy->bands[NL80211_BAND_5GHZ];
  
-       freq = ieee80211_channel_to_frequency(ch.chnum, band->band);
+       freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band);
        cfg->channel = freq;
        notify_channel = ieee80211_get_channel(wiphy, freq);
  
        notify_ielen = le32_to_cpu(bi->ie_length);
        notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
  
-       brcmf_dbg(CONN, "channel: %d(%d)\n", ch.chnum, freq);
+       brcmf_dbg(CONN, "channel: %d(%d)\n", ch.control_ch_num, freq);
        brcmf_dbg(CONN, "capability: %X\n", notify_capability);
        brcmf_dbg(CONN, "beacon interval: %d\n", notify_interval);
        brcmf_dbg(CONN, "signal: %d\n", notify_signal);
@@@ -4439,7 -4442,7 +4458,7 @@@ brcmf_cfg80211_start_ap(struct wiphy *w
        struct brcmf_join_params join_params;
        enum nl80211_iftype dev_role;
        struct brcmf_fil_bss_enable_le bss_enable;
-       u16 chanspec;
+       u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef);
        bool mbss;
        int is_11d;
  
  
        brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
  
+       /* Parameters shared by all radio interfaces */
        if (!mbss) {
-               chanspec = chandef_to_chanspec(&cfg->d11inf,
-                                              &settings->chandef);
-               err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
-               if (err < 0) {
-                       brcmf_err("Set Channel failed: chspec=%d, %d\n",
-                                 chanspec, err);
-                       goto exit;
-               }
                if (is_11d != ifp->vif->is_11d) {
                        err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
                                                    is_11d);
                err = -EINVAL;
                goto exit;
        }
+       /* Interface specific setup */
        if (dev_role == NL80211_IFTYPE_AP) {
                if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss))
                        brcmf_fil_iovar_int_set(ifp, "mbss", 1);
                        brcmf_err("setting AP mode failed %d\n", err);
                        goto exit;
                }
+               if (!mbss) {
+                       /* Firmware 10.x requires setting channel after enabling
+                        * AP and before bringing interface up.
+                        */
+                       err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
+                       if (err < 0) {
+                               brcmf_err("Set Channel failed: chspec=%d, %d\n",
+                                         chanspec, err);
+                               goto exit;
+                       }
+               }
                err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
                if (err < 0) {
                        brcmf_err("BRCMF_C_UP error (%d)\n", err);
                        goto exit;
                }
                brcmf_dbg(TRACE, "AP mode configuration complete\n");
-       } else {
+       } else if (dev_role == NL80211_IFTYPE_P2P_GO) {
+               err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
+               if (err < 0) {
+                       brcmf_err("Set Channel failed: chspec=%d, %d\n",
+                                 chanspec, err);
+                       goto exit;
+               }
                err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
                                                sizeof(ssid_le));
                if (err < 0) {
                }
  
                brcmf_dbg(TRACE, "GO mode configuration complete\n");
+       } else {
+               WARN_ON(1);
        }
        set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
        brcmf_net_setcarrier(ifp, true);
  
@@@ -4908,6 -4925,68 +4941,68 @@@ exit
        return err;
  }
  
+ static int brcmf_cfg80211_get_channel(struct wiphy *wiphy,
+                                     struct wireless_dev *wdev,
+                                     struct cfg80211_chan_def *chandef)
+ {
+       struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+       struct net_device *ndev = wdev->netdev;
+       struct brcmf_if *ifp;
+       struct brcmu_chan ch;
+       enum nl80211_band band = 0;
+       enum nl80211_chan_width width = 0;
+       u32 chanspec;
+       int freq, err;
+       if (!ndev)
+               return -ENODEV;
+       ifp = netdev_priv(ndev);
+       err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
+       if (err) {
+               brcmf_err("chanspec failed (%d)\n", err);
+               return err;
+       }
+       ch.chspec = chanspec;
+       cfg->d11inf.decchspec(&ch);
+       switch (ch.band) {
+       case BRCMU_CHAN_BAND_2G:
+               band = NL80211_BAND_2GHZ;
+               break;
+       case BRCMU_CHAN_BAND_5G:
+               band = NL80211_BAND_5GHZ;
+               break;
+       }
+       switch (ch.bw) {
+       case BRCMU_CHAN_BW_80:
+               width = NL80211_CHAN_WIDTH_80;
+               break;
+       case BRCMU_CHAN_BW_40:
+               width = NL80211_CHAN_WIDTH_40;
+               break;
+       case BRCMU_CHAN_BW_20:
+               width = NL80211_CHAN_WIDTH_20;
+               break;
+       case BRCMU_CHAN_BW_80P80:
+               width = NL80211_CHAN_WIDTH_80P80;
+               break;
+       case BRCMU_CHAN_BW_160:
+               width = NL80211_CHAN_WIDTH_160;
+               break;
+       }
+       freq = ieee80211_channel_to_frequency(ch.control_ch_num, band);
+       chandef->chan = ieee80211_get_channel(wiphy, freq);
+       chandef->width = width;
+       chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band);
+       chandef->center_freq2 = 0;
+       return 0;
+ }
  static int brcmf_cfg80211_crit_proto_start(struct wiphy *wiphy,
                                           struct wireless_dev *wdev,
                                           enum nl80211_crit_proto_id proto,
@@@ -5070,6 -5149,7 +5165,7 @@@ static struct cfg80211_ops brcmf_cfg802
        .mgmt_tx = brcmf_cfg80211_mgmt_tx,
        .remain_on_channel = brcmf_p2p_remain_on_channel,
        .cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel,
+       .get_channel = brcmf_cfg80211_get_channel,
        .start_p2p_device = brcmf_p2p_start_device,
        .stop_p2p_device = brcmf_p2p_stop_device,
        .crit_proto_start = brcmf_cfg80211_crit_proto_start,
  };
  
  struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
-                                          enum nl80211_iftype type,
-                                          bool pm_block)
+                                          enum nl80211_iftype type)
  {
        struct brcmf_cfg80211_vif *vif_walk;
        struct brcmf_cfg80211_vif *vif;
        vif->wdev.wiphy = cfg->wiphy;
        vif->wdev.iftype = type;
  
-       vif->pm_block = pm_block;
        brcmf_init_prof(&vif->profile);
  
        if (type == NL80211_IFTYPE_AP) {
@@@ -5296,7 -5373,7 +5389,7 @@@ brcmf_bss_roaming_done(struct brcmf_cfg
        else
                band = wiphy->bands[NL80211_BAND_5GHZ];
  
-       freq = ieee80211_channel_to_frequency(ch.chnum, band->band);
+       freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band);
        notify_channel = ieee80211_get_channel(wiphy, freq);
  
  done:
@@@ -5352,7 -5429,6 +5445,6 @@@ brcmf_notify_connect_status_ap(struct b
                               struct net_device *ndev,
                               const struct brcmf_event_msg *e, void *data)
  {
-       struct brcmf_if *ifp = netdev_priv(ndev);
        static int generation;
        u32 event = e->event_code;
        u32 reason = e->reason;
            ndev != cfg_to_ndev(cfg)) {
                brcmf_dbg(CONN, "AP mode link down\n");
                complete(&cfg->vif_disabled);
-               if (ifp->vif->mbss)
-                       brcmf_remove_interface(ifp);
                return 0;
        }
  
@@@ -5818,14 -5892,15 +5908,15 @@@ static int brcmf_construct_chaninfo(str
                channel = band->channels;
                index = band->n_channels;
                for (j = 0; j < band->n_channels; j++) {
-                       if (channel[j].hw_value == ch.chnum) {
+                       if (channel[j].hw_value == ch.control_ch_num) {
                                index = j;
                                break;
                        }
                }
                channel[index].center_freq =
-                       ieee80211_channel_to_frequency(ch.chnum, band->band);
-               channel[index].hw_value = ch.chnum;
+                       ieee80211_channel_to_frequency(ch.control_ch_num,
+                                                      band->band);
+               channel[index].hw_value = ch.control_ch_num;
  
                /* assuming the chanspecs order is HT20,
                 * HT40 upper, HT40 lower, and VHT80.
@@@ -5927,7 -6002,7 +6018,7 @@@ static int brcmf_enable_bw40_2g(struct 
                        if (WARN_ON(ch.bw != BRCMU_CHAN_BW_40))
                                continue;
                        for (j = 0; j < band->n_channels; j++) {
-                               if (band->channels[j].hw_value == ch.chnum)
+                               if (band->channels[j].hw_value == ch.control_ch_num)
                                        break;
                        }
                        if (WARN_ON(j == band->n_channels))
@@@ -6715,11 -6790,10 +6806,10 @@@ struct brcmf_cfg80211_info *brcmf_cfg80
                return NULL;
        }
  
-       ops = kzalloc(sizeof(*ops), GFP_KERNEL);
+       ops = kmemdup(&brcmf_cfg80211_ops, sizeof(*ops), GFP_KERNEL);
        if (!ops)
                return NULL;
  
-       memcpy(ops, &brcmf_cfg80211_ops, sizeof(*ops));
        ifp = netdev_priv(ndev);
  #ifdef CONFIG_PM
        if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
        init_vif_event(&cfg->vif_event);
        INIT_LIST_HEAD(&cfg->vif_list);
  
-       vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION, false);
+       vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION);
        if (IS_ERR(vif))
                goto wiphy_out;