diff options
author | David S. Miller <davem@davemloft.net> | 2018-01-10 15:08:46 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-10 15:08:46 -0500 |
commit | 6ade262b77f4285f7ba9216d5831093d7766304a (patch) | |
tree | 68806cefbf782587356864fbca95fff9998062cb | |
parent | 95f566de0269a0c59fd6a737a147731302136429 (diff) | |
parent | 49fdde89e2b8574cb55f99b57b7798f44567bc4b (diff) |
Merge tag 'wireless-drivers-for-davem-2018-01-09' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
Kalle Valo says:
====================
wireless-drivers fixes for 4.15
Hopefully the last set of fixes for 4.15.
iwlwifi
* fix DMA mapping regression since v4.14
wcn36xx
* fix dynamic power save which has been broken since the driver was commited
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/main.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/pmc.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 10 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 8 |
5 files changed, 30 insertions, 28 deletions
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index f7d228b5ba93..987f1252a3cf 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c | |||
@@ -384,6 +384,18 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) | |||
384 | } | 384 | } |
385 | } | 385 | } |
386 | 386 | ||
387 | if (changed & IEEE80211_CONF_CHANGE_PS) { | ||
388 | list_for_each_entry(tmp, &wcn->vif_list, list) { | ||
389 | vif = wcn36xx_priv_to_vif(tmp); | ||
390 | if (hw->conf.flags & IEEE80211_CONF_PS) { | ||
391 | if (vif->bss_conf.ps) /* ps allowed ? */ | ||
392 | wcn36xx_pmc_enter_bmps_state(wcn, vif); | ||
393 | } else { | ||
394 | wcn36xx_pmc_exit_bmps_state(wcn, vif); | ||
395 | } | ||
396 | } | ||
397 | } | ||
398 | |||
387 | mutex_unlock(&wcn->conf_mutex); | 399 | mutex_unlock(&wcn->conf_mutex); |
388 | 400 | ||
389 | return 0; | 401 | return 0; |
@@ -747,17 +759,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw, | |||
747 | vif_priv->dtim_period = bss_conf->dtim_period; | 759 | vif_priv->dtim_period = bss_conf->dtim_period; |
748 | } | 760 | } |
749 | 761 | ||
750 | if (changed & BSS_CHANGED_PS) { | ||
751 | wcn36xx_dbg(WCN36XX_DBG_MAC, | ||
752 | "mac bss PS set %d\n", | ||
753 | bss_conf->ps); | ||
754 | if (bss_conf->ps) { | ||
755 | wcn36xx_pmc_enter_bmps_state(wcn, vif); | ||
756 | } else { | ||
757 | wcn36xx_pmc_exit_bmps_state(wcn, vif); | ||
758 | } | ||
759 | } | ||
760 | |||
761 | if (changed & BSS_CHANGED_BSSID) { | 762 | if (changed & BSS_CHANGED_BSSID) { |
762 | wcn36xx_dbg(WCN36XX_DBG_MAC, "mac bss changed_bssid %pM\n", | 763 | wcn36xx_dbg(WCN36XX_DBG_MAC, "mac bss changed_bssid %pM\n", |
763 | bss_conf->bssid); | 764 | bss_conf->bssid); |
diff --git a/drivers/net/wireless/ath/wcn36xx/pmc.c b/drivers/net/wireless/ath/wcn36xx/pmc.c index 589fe5f70971..1976b80c235f 100644 --- a/drivers/net/wireless/ath/wcn36xx/pmc.c +++ b/drivers/net/wireless/ath/wcn36xx/pmc.c | |||
@@ -45,8 +45,10 @@ int wcn36xx_pmc_exit_bmps_state(struct wcn36xx *wcn, | |||
45 | struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); | 45 | struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); |
46 | 46 | ||
47 | if (WCN36XX_BMPS != vif_priv->pw_state) { | 47 | if (WCN36XX_BMPS != vif_priv->pw_state) { |
48 | wcn36xx_err("Not in BMPS mode, no need to exit from BMPS mode!\n"); | 48 | /* Unbalanced call or last BMPS enter failed */ |
49 | return -EINVAL; | 49 | wcn36xx_dbg(WCN36XX_DBG_PMC, |
50 | "Not in BMPS mode, no need to exit\n"); | ||
51 | return -EALREADY; | ||
50 | } | 52 | } |
51 | wcn36xx_smd_exit_bmps(wcn, vif); | 53 | wcn36xx_smd_exit_bmps(wcn, vif); |
52 | vif_priv->pw_state = WCN36XX_FULL_POWER; | 54 | vif_priv->pw_state = WCN36XX_FULL_POWER; |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h index d749abeca3ae..403e65c309d0 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h | |||
@@ -670,11 +670,15 @@ static inline u8 iwl_pcie_get_cmd_index(struct iwl_txq *q, u32 index) | |||
670 | return index & (q->n_window - 1); | 670 | return index & (q->n_window - 1); |
671 | } | 671 | } |
672 | 672 | ||
673 | static inline void *iwl_pcie_get_tfd(struct iwl_trans_pcie *trans_pcie, | 673 | static inline void *iwl_pcie_get_tfd(struct iwl_trans *trans, |
674 | struct iwl_txq *txq, int idx) | 674 | struct iwl_txq *txq, int idx) |
675 | { | 675 | { |
676 | return txq->tfds + trans_pcie->tfd_size * iwl_pcie_get_cmd_index(txq, | 676 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
677 | idx); | 677 | |
678 | if (trans->cfg->use_tfh) | ||
679 | idx = iwl_pcie_get_cmd_index(txq, idx); | ||
680 | |||
681 | return txq->tfds + trans_pcie->tfd_size * idx; | ||
678 | } | 682 | } |
679 | 683 | ||
680 | static inline void iwl_enable_rfkill_int(struct iwl_trans *trans) | 684 | static inline void iwl_enable_rfkill_int(struct iwl_trans *trans) |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c index 16b345f54ff0..6d0a907d5ba5 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c | |||
@@ -171,8 +171,6 @@ static void iwl_pcie_gen2_tfd_unmap(struct iwl_trans *trans, | |||
171 | 171 | ||
172 | static void iwl_pcie_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) | 172 | static void iwl_pcie_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) |
173 | { | 173 | { |
174 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
175 | |||
176 | /* rd_ptr is bounded by TFD_QUEUE_SIZE_MAX and | 174 | /* rd_ptr is bounded by TFD_QUEUE_SIZE_MAX and |
177 | * idx is bounded by n_window | 175 | * idx is bounded by n_window |
178 | */ | 176 | */ |
@@ -181,7 +179,7 @@ static void iwl_pcie_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) | |||
181 | lockdep_assert_held(&txq->lock); | 179 | lockdep_assert_held(&txq->lock); |
182 | 180 | ||
183 | iwl_pcie_gen2_tfd_unmap(trans, &txq->entries[idx].meta, | 181 | iwl_pcie_gen2_tfd_unmap(trans, &txq->entries[idx].meta, |
184 | iwl_pcie_get_tfd(trans_pcie, txq, idx)); | 182 | iwl_pcie_get_tfd(trans, txq, idx)); |
185 | 183 | ||
186 | /* free SKB */ | 184 | /* free SKB */ |
187 | if (txq->entries) { | 185 | if (txq->entries) { |
@@ -364,11 +362,9 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, | |||
364 | struct sk_buff *skb, | 362 | struct sk_buff *skb, |
365 | struct iwl_cmd_meta *out_meta) | 363 | struct iwl_cmd_meta *out_meta) |
366 | { | 364 | { |
367 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
368 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 365 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
369 | int idx = iwl_pcie_get_cmd_index(txq, txq->write_ptr); | 366 | int idx = iwl_pcie_get_cmd_index(txq, txq->write_ptr); |
370 | struct iwl_tfh_tfd *tfd = | 367 | struct iwl_tfh_tfd *tfd = iwl_pcie_get_tfd(trans, txq, idx); |
371 | iwl_pcie_get_tfd(trans_pcie, txq, idx); | ||
372 | dma_addr_t tb_phys; | 368 | dma_addr_t tb_phys; |
373 | bool amsdu; | 369 | bool amsdu; |
374 | int i, len, tb1_len, tb2_len, hdr_len; | 370 | int i, len, tb1_len, tb2_len, hdr_len; |
@@ -565,8 +561,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans, | |||
565 | u8 group_id = iwl_cmd_groupid(cmd->id); | 561 | u8 group_id = iwl_cmd_groupid(cmd->id); |
566 | const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD]; | 562 | const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD]; |
567 | u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD]; | 563 | u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD]; |
568 | struct iwl_tfh_tfd *tfd = | 564 | struct iwl_tfh_tfd *tfd = iwl_pcie_get_tfd(trans, txq, txq->write_ptr); |
569 | iwl_pcie_get_tfd(trans_pcie, txq, txq->write_ptr); | ||
570 | 565 | ||
571 | memset(tfd, 0, sizeof(*tfd)); | 566 | memset(tfd, 0, sizeof(*tfd)); |
572 | 567 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c index fed6d842a5e1..3f85713c41dc 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c | |||
@@ -373,7 +373,7 @@ static void iwl_pcie_tfd_unmap(struct iwl_trans *trans, | |||
373 | { | 373 | { |
374 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 374 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
375 | int i, num_tbs; | 375 | int i, num_tbs; |
376 | void *tfd = iwl_pcie_get_tfd(trans_pcie, txq, index); | 376 | void *tfd = iwl_pcie_get_tfd(trans, txq, index); |
377 | 377 | ||
378 | /* Sanity check on number of chunks */ | 378 | /* Sanity check on number of chunks */ |
379 | num_tbs = iwl_pcie_tfd_get_num_tbs(trans, tfd); | 379 | num_tbs = iwl_pcie_tfd_get_num_tbs(trans, tfd); |
@@ -2018,7 +2018,7 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb, | |||
2018 | } | 2018 | } |
2019 | 2019 | ||
2020 | trace_iwlwifi_dev_tx(trans->dev, skb, | 2020 | trace_iwlwifi_dev_tx(trans->dev, skb, |
2021 | iwl_pcie_get_tfd(trans_pcie, txq, txq->write_ptr), | 2021 | iwl_pcie_get_tfd(trans, txq, txq->write_ptr), |
2022 | trans_pcie->tfd_size, | 2022 | trans_pcie->tfd_size, |
2023 | &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, | 2023 | &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, |
2024 | hdr_len); | 2024 | hdr_len); |
@@ -2092,7 +2092,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, | |||
2092 | IEEE80211_CCMP_HDR_LEN : 0; | 2092 | IEEE80211_CCMP_HDR_LEN : 0; |
2093 | 2093 | ||
2094 | trace_iwlwifi_dev_tx(trans->dev, skb, | 2094 | trace_iwlwifi_dev_tx(trans->dev, skb, |
2095 | iwl_pcie_get_tfd(trans_pcie, txq, txq->write_ptr), | 2095 | iwl_pcie_get_tfd(trans, txq, txq->write_ptr), |
2096 | trans_pcie->tfd_size, | 2096 | trans_pcie->tfd_size, |
2097 | &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, 0); | 2097 | &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, 0); |
2098 | 2098 | ||
@@ -2425,7 +2425,7 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, | |||
2425 | memcpy(&txq->first_tb_bufs[txq->write_ptr], &dev_cmd->hdr, | 2425 | memcpy(&txq->first_tb_bufs[txq->write_ptr], &dev_cmd->hdr, |
2426 | IWL_FIRST_TB_SIZE); | 2426 | IWL_FIRST_TB_SIZE); |
2427 | 2427 | ||
2428 | tfd = iwl_pcie_get_tfd(trans_pcie, txq, txq->write_ptr); | 2428 | tfd = iwl_pcie_get_tfd(trans, txq, txq->write_ptr); |
2429 | /* Set up entry for this TFD in Tx byte-count array */ | 2429 | /* Set up entry for this TFD in Tx byte-count array */ |
2430 | iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len), | 2430 | iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len), |
2431 | iwl_pcie_tfd_get_num_tbs(trans, tfd)); | 2431 | iwl_pcie_tfd_get_num_tbs(trans, tfd)); |