Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
authorKalle Valo <kvalo@codeaurora.org>
Mon, 27 May 2019 12:15:29 +0000 (15:15 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 27 May 2019 12:15:29 +0000 (15:15 +0300)
ath.git patches for 5.3. Major changes:

ath10k

* enable SDIO support, first one being QCA6174 hw3.2

1  2 
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/coredump.c
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/wil6210/cfg80211.c

index aff585658fc0f6d1d542e7111c6ce1ef566167f8,a934e941760a5085a85b8c65a4954a7785bee1f2..61ef90329788769f9a8842ca90adacec7840f91c
@@@ -153,6 -153,33 +153,33 @@@ static const struct ath10k_hw_params at
                .hw_filter_reset_required = true,
                .fw_diag_ce_download = false,
        },
+       {
+               .id = QCA6174_HW_3_2_VERSION,
+               .dev_id = QCA6174_3_2_DEVICE_ID,
+               .bus = ATH10K_BUS_SDIO,
+               .name = "qca6174 hw3.2 sdio",
+               .patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
+               .uart_pin = 19,
+               .otp_exe_param = 0,
+               .channel_counters_freq_hz = 88000,
+               .max_probe_resp_desc_thres = 0,
+               .cal_data_len = 0,
+               .fw = {
+                       .dir = QCA6174_HW_3_0_FW_DIR,
+                       .board = QCA6174_HW_3_0_BOARD_DATA_FILE,
+                       .board_size = QCA6174_BOARD_DATA_SZ,
+                       .board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
+               },
+               .hw_ops = &qca6174_ops,
+               .hw_clk = qca6174_clk,
+               .target_cpu_freq = 176000000,
+               .decap_align_bytes = 4,
+               .n_cipher_suites = 8,
+               .num_peers = 10,
+               .ast_skid_limit = 0x10,
+               .num_wds_entries = 0x20,
+               .uart_pin_workaround = true,
+       },
        {
                .id = QCA6174_HW_2_1_VERSION,
                .dev_id = QCA6164_2_1_DEVICE_ID,
@@@ -629,7 -656,7 +656,7 @@@ static void ath10k_send_suspend_complet
        complete(&ar->target_suspend);
  }
  
- static void ath10k_init_sdio(struct ath10k *ar)
+ static void ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
  {
        u32 param = 0;
  
         * not big enough for mac80211 / native wifi frames. disable it
         */
        param &= ~HI_ACS_FLAGS_ALT_DATA_CREDIT_SIZE;
-       param |= HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
+       if (mode == ATH10K_FIRMWARE_MODE_UTF)
+               param &= ~HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
+       else
+               param |= HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
        ath10k_bmi_write32(ar, hi_acs_flags, param);
  
        /* Explicitly set fwlog prints to zero as target may turn it on
@@@ -2065,8 -2097,16 +2097,16 @@@ static int ath10k_init_uart(struct ath1
                return ret;
        }
  
-       if (!uart_print)
+       if (!uart_print && ar->hw_params.uart_pin_workaround) {
+               ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin,
+                                        ar->hw_params.uart_pin);
+               if (ret) {
+                       ath10k_warn(ar, "failed to set UART TX pin: %d", ret);
+                       return ret;
+               }
                return 0;
+       }
  
        ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin, ar->hw_params.uart_pin);
        if (ret) {
@@@ -2501,7 -2541,7 +2541,7 @@@ int ath10k_core_start(struct ath10k *ar
                        goto err;
  
                if (ar->hif.bus == ATH10K_BUS_SDIO)
-                       ath10k_init_sdio(ar);
+                       ath10k_init_sdio(ar, mode);
        }
  
        ar->htc.htc_ops.target_send_suspend_complete =
@@@ -3119,7 -3159,6 +3159,7 @@@ struct ath10k *ath10k_core_create(size_
                goto err_free_wq;
  
        mutex_init(&ar->conf_mutex);
 +      mutex_init(&ar->dump_mutex);
        spin_lock_init(&ar->data_lock);
  
        INIT_LIST_HEAD(&ar->peers);
index e35aae5146f10615fcba3451713dc1b9a64a8f93,24981d94bbcdeba363ca640b7a25eba7e620f9af..2d109c030ec4180515cf7008f0810befc0d29caf
@@@ -196,7 -196,7 +196,7 @@@ struct ath10k_fw_extd_stats_peer 
        struct list_head list;
  
        u8 peer_macaddr[ETH_ALEN];
-       u32 rx_duration;
+       u64 rx_duration;
  };
  
  struct ath10k_fw_stats_vdev {
@@@ -400,6 -400,14 +400,14 @@@ struct ath10k_peer 
  
        /* protected by ar->data_lock */
        struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
+       union htt_rx_pn_t tids_last_pn[ATH10K_TXRX_NUM_EXT_TIDS];
+       bool tids_last_pn_valid[ATH10K_TXRX_NUM_EXT_TIDS];
+       union htt_rx_pn_t frag_tids_last_pn[ATH10K_TXRX_NUM_EXT_TIDS];
+       u32 frag_tids_seq[ATH10K_TXRX_NUM_EXT_TIDS];
+       struct {
+               enum htt_security_types sec_type;
+               int pn_len;
+       } rx_pn[ATH10K_HTT_TXRX_PEER_SECURITY_MAX];
  };
  
  struct ath10k_txq {
@@@ -614,6 -622,7 +622,7 @@@ struct ath10k_debug 
        bool fw_stats_done;
  
        unsigned long htt_stats_mask;
+       unsigned long reset_htt_stats;
        struct delayed_work htt_stats_dwork;
        struct ath10k_dfs_stats dfs_stats;
        struct ath_dfs_pool_stats dfs_pool_stats;
@@@ -919,6 -928,7 +928,7 @@@ struct ath10k_bus_params 
        u32 chip_id;
        enum ath10k_dev_type dev_type;
        bool link_can_suspend;
+       bool hl_msdu_ids;
  };
  
  struct ath10k {
        /* prevents concurrent FW reconfiguration */
        struct mutex conf_mutex;
  
 +      /* protects coredump data */
 +      struct mutex dump_mutex;
 +
        /* protects shared structure data */
        spinlock_t data_lock;
  
index 45a355fb62b939b966bfcdf580b104646a6ce99d,7825b6a1b1043a29f8820eb57472385e03d39c2b..b6d2932383cf654737a2492ca9fa920ba68a5fa3
@@@ -1102,7 -1102,7 +1102,7 @@@ struct ath10k_fw_crash_data *ath10k_cor
  {
        struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
  
 -      lockdep_assert_held(&ar->data_lock);
 +      lockdep_assert_held(&ar->dump_mutex);
  
        if (ath10k_coredump_mask == 0)
                /* coredump disabled */
@@@ -1146,7 -1146,7 +1146,7 @@@ static struct ath10k_dump_file_data *at
        if (!buf)
                return NULL;
  
 -      spin_lock_bh(&ar->data_lock);
 +      mutex_lock(&ar->dump_mutex);
  
        dump_data = (struct ath10k_dump_file_data *)(buf);
        strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP",
        if (test_bit(ATH10K_FW_CRASH_DUMP_CE_DATA, &ath10k_coredump_mask)) {
                dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
                dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_CE_DATA);
-               dump_tlv->tlv_len = cpu_to_le32(sizeof(*ce_hdr) +
-                                               CE_COUNT * sizeof(ce_hdr->entries[0]));
+               dump_tlv->tlv_len = cpu_to_le32(struct_size(ce_hdr, entries,
+                                                           CE_COUNT));
                ce_hdr = (struct ath10k_ce_crash_hdr *)(dump_tlv->tlv_data);
                ce_hdr->ce_count = cpu_to_le32(CE_COUNT);
                memset(ce_hdr->reserved, 0, sizeof(ce_hdr->reserved));
                sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;
        }
  
 -      spin_unlock_bh(&ar->data_lock);
 +      mutex_unlock(&ar->dump_mutex);
  
        return dump_data;
  }
index 9c703d287333e715349d818028f8db57cbd3dca0,98a7842e09b1fda6e86c0618e8765ab0733a5456..b500fd427595a9d2773d55bf6db9297674f4f472
@@@ -1630,6 -1630,10 +1630,10 @@@ static int ath10k_mac_setup_prb_tmpl(st
        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
                return 0;
  
+        /* For mesh, probe response and beacon share the same template */
+       if (ieee80211_vif_is_mesh(vif))
+               return 0;
        prb = ieee80211_proberesp_get(hw, vif);
        if (!prb) {
                ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
@@@ -5588,8 -5592,8 +5592,8 @@@ static void ath10k_bss_info_changed(str
        struct cfg80211_chan_def def;
        u32 vdev_param, pdev_param, slottime, preamble;
        u16 bitrate, hw_value;
-       u8 rate, basic_rate_idx;
-       int rateidx, ret = 0, hw_rate_code;
+       u8 rate, basic_rate_idx, rateidx;
+       int ret = 0, hw_rate_code, mcast_rate;
        enum nl80211_band band;
        const struct ieee80211_supported_band *sband;
  
        }
  
        if (changed & BSS_CHANGED_MCAST_RATE &&
 -          !WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) {
 +          !ath10k_mac_vif_chan(arvif->vif, &def)) {
                band = def.chan->band;
-               rateidx = vif->bss_conf.mcast_rate[band] - 1;
+               mcast_rate = vif->bss_conf.mcast_rate[band];
+               if (mcast_rate > 0)
+                       rateidx = mcast_rate - 1;
+               else
+                       rateidx = ffs(vif->bss_conf.basic_rates) - 1;
  
                if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
                        rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
        }
  
        if (changed & BSS_CHANGED_BASIC_RATES) {
 -              if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) {
 +              if (ath10k_mac_vif_chan(vif, &def)) {
                        mutex_unlock(&ar->conf_mutex);
                        return;
                }
index 2c27f407a851f869368def6346066b1435362b2c,13c24cd977d2378ec5f3af2dd794426ec3698448..2bd6cbad19e4ce1f06180d955a4fff6d7c777adc
@@@ -1441,7 -1441,7 +1441,7 @@@ static void ath10k_pci_dump_registers(s
        __le32 reg_dump_values[REG_DUMP_COUNT_QCA988X] = {};
        int i, ret;
  
 -      lockdep_assert_held(&ar->data_lock);
 +      lockdep_assert_held(&ar->dump_mutex);
  
        ret = ath10k_pci_diag_read_hi(ar, &reg_dump_values[0],
                                      hi_failure_state,
@@@ -1656,7 -1656,7 +1656,7 @@@ static void ath10k_pci_dump_memory(stru
        int ret, i;
        u8 *buf;
  
 -      lockdep_assert_held(&ar->data_lock);
 +      lockdep_assert_held(&ar->dump_mutex);
  
        if (!crash_data)
                return;
        }
  }
  
 -static void ath10k_pci_fw_crashed_dump(struct ath10k *ar)
 +static void ath10k_pci_fw_dump_work(struct work_struct *work)
  {
 +      struct ath10k_pci *ar_pci = container_of(work, struct ath10k_pci,
 +                                               dump_work);
        struct ath10k_fw_crash_data *crash_data;
 +      struct ath10k *ar = ar_pci->ar;
        char guid[UUID_STRING_LEN + 1];
  
 -      spin_lock_bh(&ar->data_lock);
 +      mutex_lock(&ar->dump_mutex);
  
 +      spin_lock_bh(&ar->data_lock);
        ar->stats.fw_crash_counter++;
 +      spin_unlock_bh(&ar->data_lock);
  
        crash_data = ath10k_coredump_new(ar);
  
        ath10k_ce_dump_registers(ar, crash_data);
        ath10k_pci_dump_memory(ar, crash_data);
  
 -      spin_unlock_bh(&ar->data_lock);
 +      mutex_unlock(&ar->dump_mutex);
  
        queue_work(ar->workqueue, &ar->restart_work);
  }
  
 +static void ath10k_pci_fw_crashed_dump(struct ath10k *ar)
 +{
 +      struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
 +
 +      queue_work(ar->workqueue, &ar_pci->dump_work);
 +}
 +
  void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe,
                                        int force)
  {
@@@ -3454,8 -3442,6 +3454,8 @@@ int ath10k_pci_setup_resource(struct at
        spin_lock_init(&ar_pci->ps_lock);
        mutex_init(&ar_pci->ce_diag_mutex);
  
 +      INIT_WORK(&ar_pci->dump_work, ath10k_pci_fw_dump_work);
 +
        timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0);
  
        if (QCA_REV_6174(ar) || QCA_REV_9377(ar))
@@@ -3492,7 -3478,7 +3492,7 @@@ static int ath10k_pci_probe(struct pci_
        struct ath10k *ar;
        struct ath10k_pci *ar_pci;
        enum ath10k_hw_rev hw_rev;
-       struct ath10k_bus_params bus_params;
+       struct ath10k_bus_params bus_params = {};
        bool pci_ps;
        int (*pci_soft_reset)(struct ath10k *ar);
        int (*pci_hard_reset)(struct ath10k *ar);
index a04d8616fe09f8ea26bea20513e9e80eaf374c1a,043801f773b5970cfa1d50b90a3857dc60488e5c..17c318902cb866e4b8fc36b43c56e02b4fa0d13d
@@@ -642,7 -642,7 +642,7 @@@ static int ath9k_of_init(struct ath_sof
        }
  
        mac = of_get_mac_address(np);
 -      if (mac)
 +      if (!IS_ERR(mac))
                ether_addr_copy(common->macaddr, mac);
  
        return 0;
@@@ -805,7 -805,7 +805,7 @@@ static void ath9k_init_band_txpower(str
                ah->curchan = &ah->channels[chan->hw_value];
                cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20);
                ath9k_cmn_get_channel(sc->hw, ah, &chandef);
-               ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
+               ath9k_hw_set_txpowerlimit(ah, MAX_COMBINED_POWER, true);
        }
  }
  
index 804955d24b3040d946c5fbb24a48bcbadb0b0095,e9780fcde62af925e1b57fe0a0c0856f351a03ea..ca77d7a48f5db7abcbaa1af7fed1dab7330127e6
@@@ -395,7 -395,7 +395,7 @@@ static int wil_find_cid_by_idx(struct w
  {
        int i;
  
-       for (i = 0; i < max_assoc_sta; i++) {
+       for (i = 0; i < wil->max_assoc_sta; i++) {
                if (wil->sta[i].status == wil_sta_unused)
                        continue;
                if (wil->sta[i].mid != mid)
@@@ -2625,8 -2625,8 +2625,8 @@@ static int wil_rf_sector_get_cfg(struc
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
  
 -      rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
 -                     wil_rf_sector_policy, NULL);
 +      rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
 +                                data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
                              QCA_ATTR_PAD))
                goto nla_put_failure;
  
 -      nl_cfgs = nla_nest_start(msg, QCA_ATTR_DMG_RF_SECTOR_CFG);
 +      nl_cfgs = nla_nest_start_noflag(msg, QCA_ATTR_DMG_RF_SECTOR_CFG);
        if (!nl_cfgs)
                goto nla_put_failure;
        for (i = 0; i < WMI_MAX_RF_MODULES_NUM; i++) {
                if (!(rf_modules_vec & BIT(i)))
                        continue;
 -              nl_cfg = nla_nest_start(msg, i);
 +              nl_cfg = nla_nest_start_noflag(msg, i);
                if (!nl_cfg)
                        goto nla_put_failure;
                si = &reply.evt.sectors_info[i];
@@@ -2745,8 -2745,8 +2745,8 @@@ static int wil_rf_sector_set_cfg(struc
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
  
 -      rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
 -                     wil_rf_sector_policy, NULL);
 +      rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
 +                                data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
        cmd.sector_type = sector_type;
        nla_for_each_nested(nl_cfg, tb[QCA_ATTR_DMG_RF_SECTOR_CFG],
                            tmp) {
 -              rc = nla_parse_nested(tb2, QCA_ATTR_DMG_RF_SECTOR_CFG_MAX,
 -                                    nl_cfg, wil_rf_sector_cfg_policy,
 -                                    NULL);
 +              rc = nla_parse_nested_deprecated(tb2,
 +                                               QCA_ATTR_DMG_RF_SECTOR_CFG_MAX,
 +                                               nl_cfg,
 +                                               wil_rf_sector_cfg_policy,
 +                                               NULL);
                if (rc) {
                        wil_err(wil, "invalid sector cfg\n");
                        return -EINVAL;
@@@ -2854,8 -2852,8 +2854,8 @@@ static int wil_rf_sector_get_selected(s
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
  
 -      rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
 -                     wil_rf_sector_policy, NULL);
 +      rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
 +                                data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
@@@ -2962,8 -2960,8 +2962,8 @@@ static int wil_rf_sector_set_selected(s
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
  
 -      rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
 -                     wil_rf_sector_policy, NULL);
 +      rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
 +                                data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
                        wil, vif->mid, WMI_INVALID_RF_SECTOR_INDEX,
                        sector_type, WIL_CID_ALL);
                if (rc == -EINVAL) {
-                       for (i = 0; i < max_assoc_sta; i++) {
+                       for (i = 0; i < wil->max_assoc_sta; i++) {
                                if (wil->sta[i].mid != vif->mid)
                                        continue;
                                rc = wil_rf_sector_wmi_set_selected(