aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2016-06-21 07:11:48 -0400
committerLuca Coelho <luciano.coelho@intel.com>2016-07-06 03:09:56 -0400
commit21cb3222fe569bd09a42771ffc8da9fb4666bd8a (patch)
tree6a59d2ca3f37396e81021f95ab30d1ef4cf6b503 /drivers/net/wireless
parent0c4cb7314d15d63fbc96e60c57443f3ef83b9c5e (diff)
iwlwifi: decouple PCIe transport from mac80211
The PCIe transport needs to store two pointers in each TX SKB, and currently assumes mac80211's ieee80211_tx_info is present in the CB to do that. In order to remove that assumption, have the opmodes pass in the offset to where the pointers can be stored in the CB and use the offset in the PCIe code. To make the disentanglement complete, remove mac80211.h includes from everywhere in the generic iwlwifi code. This required adding an include of cfg80211.h in one place. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/dvm/main.c2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-modparams.h1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-trans.h9
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/ops.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/internal.h2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/trans.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/tx.c41
8 files changed, 37 insertions, 25 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index 591591418316..b49848683587 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -1337,6 +1337,8 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1337 trans_cfg.command_groups_size = ARRAY_SIZE(iwl_dvm_groups); 1337 trans_cfg.command_groups_size = ARRAY_SIZE(iwl_dvm_groups);
1338 1338
1339 trans_cfg.cmd_fifo = IWLAGN_CMD_FIFO_NUM; 1339 trans_cfg.cmd_fifo = IWLAGN_CMD_FIFO_NUM;
1340 trans_cfg.cb_data_offs = offsetof(struct ieee80211_tx_info,
1341 driver_data[2]);
1340 1342
1341 WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE < 1343 WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
1342 priv->cfg->base_params->num_of_queues); 1344 priv->cfg->base_params->num_of_queues);
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h
index 1f4e50289c14..e04a91d70a15 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h
@@ -66,6 +66,7 @@
66 66
67#include <linux/types.h> 67#include <linux/types.h>
68#include <linux/if_ether.h> 68#include <linux/if_ether.h>
69#include <net/cfg80211.h>
69#include "iwl-trans.h" 70#include "iwl-trans.h"
70 71
71struct iwl_nvm_data { 72struct iwl_nvm_data {
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
index 0379899dc847..4d32b10fe50c 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
@@ -66,7 +66,6 @@
66#include <linux/types.h> 66#include <linux/types.h>
67#include <linux/spinlock.h> 67#include <linux/spinlock.h>
68#include <linux/gfp.h> 68#include <linux/gfp.h>
69#include <net/mac80211.h>
70 69
71extern struct iwl_mod_params iwlwifi_mod_params; 70extern struct iwl_mod_params iwlwifi_mod_params;
72 71
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 57cc67f092ea..9ac47e02ae69 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -392,11 +392,6 @@ static inline void iwl_free_rxb(struct iwl_rx_cmd_buffer *r)
392 392
393#define MAX_NO_RECLAIM_CMDS 6 393#define MAX_NO_RECLAIM_CMDS 6
394 394
395/*
396 * The first entry in driver_data array in ieee80211_tx_info
397 * that can be used by the transport.
398 */
399#define IWL_TRANS_FIRST_DRIVER_DATA 2
400#define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo)))) 395#define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo))))
401 396
402/* 397/*
@@ -500,6 +495,8 @@ struct iwl_hcmd_arr {
500 * @command_groups_size: number of command groups, to avoid illegal access 495 * @command_groups_size: number of command groups, to avoid illegal access
501 * @sdio_adma_addr: the default address to set for the ADMA in SDIO mode until 496 * @sdio_adma_addr: the default address to set for the ADMA in SDIO mode until
502 * we get the ALIVE from the uCode 497 * we get the ALIVE from the uCode
498 * @cb_data_offs: offset inside skb->cb to store transport data at, must have
499 * space for at least two pointers
503 */ 500 */
504struct iwl_trans_config { 501struct iwl_trans_config {
505 struct iwl_op_mode *op_mode; 502 struct iwl_op_mode *op_mode;
@@ -519,6 +516,8 @@ struct iwl_trans_config {
519 int command_groups_size; 516 int command_groups_size;
520 517
521 u32 sdio_adma_addr; 518 u32 sdio_adma_addr;
519
520 u8 cb_data_offs;
522}; 521};
523 522
524struct iwl_trans_dump_data { 523struct iwl_trans_dump_data {
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index a08db009d32a..55d9096da68c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -668,6 +668,9 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
668 trans_cfg.cmd_fifo = IWL_MVM_TX_FIFO_CMD; 668 trans_cfg.cmd_fifo = IWL_MVM_TX_FIFO_CMD;
669 trans_cfg.scd_set_active = true; 669 trans_cfg.scd_set_active = true;
670 670
671 trans_cfg.cb_data_offs = offsetof(struct ieee80211_tx_info,
672 driver_data[2]);
673
671 trans_cfg.sdio_adma_addr = fw->sdio_adma_addr; 674 trans_cfg.sdio_adma_addr = fw->sdio_adma_addr;
672 trans_cfg.sw_csum_tx = IWL_MVM_SW_TX_CSUM_OFFLOAD; 675 trans_cfg.sw_csum_tx = IWL_MVM_SW_TX_CSUM_OFFLOAD;
673 676
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 8bfa9159d27d..f684b9d21912 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -385,6 +385,8 @@ struct iwl_trans_pcie {
385 wait_queue_head_t wait_command_queue; 385 wait_queue_head_t wait_command_queue;
386 wait_queue_head_t d0i3_waitq; 386 wait_queue_head_t d0i3_waitq;
387 387
388 u8 page_offs, dev_cmd_offs;
389
388 u8 cmd_queue; 390 u8 cmd_queue;
389 u8 cmd_fifo; 391 u8 cmd_fifo;
390 unsigned int cmd_q_wdg_timeout; 392 unsigned int cmd_q_wdg_timeout;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index f5ace924e76a..3b7a4146693d 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1650,6 +1650,9 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
1650 trans_pcie->scd_set_active = trans_cfg->scd_set_active; 1650 trans_pcie->scd_set_active = trans_cfg->scd_set_active;
1651 trans_pcie->sw_csum_tx = trans_cfg->sw_csum_tx; 1651 trans_pcie->sw_csum_tx = trans_cfg->sw_csum_tx;
1652 1652
1653 trans_pcie->page_offs = trans_cfg->cb_data_offs;
1654 trans_pcie->dev_cmd_offs = trans_cfg->cb_data_offs + sizeof(void *);
1655
1653 trans->command_groups = trans_cfg->command_groups; 1656 trans->command_groups = trans_cfg->command_groups;
1654 trans->command_groups_size = trans_cfg->command_groups_size; 1657 trans->command_groups_size = trans_cfg->command_groups_size;
1655 1658
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 9b5858bc8ee2..2b688260a6a9 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -584,16 +584,16 @@ static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq,
584 return 0; 584 return 0;
585} 585}
586 586
587static void iwl_pcie_free_tso_page(struct sk_buff *skb) 587static void iwl_pcie_free_tso_page(struct iwl_trans_pcie *trans_pcie,
588 struct sk_buff *skb)
588{ 589{
589 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 590 struct page **page_ptr;
590 591
591 if (info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA]) { 592 page_ptr = (void *)((u8 *)skb->cb + trans_pcie->page_offs);
592 struct page *page =
593 info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA];
594 593
595 __free_page(page); 594 if (*page_ptr) {
596 info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA] = NULL; 595 __free_page(*page_ptr);
596 *page_ptr = NULL;
597 } 597 }
598} 598}
599 599
@@ -639,7 +639,7 @@ static void iwl_pcie_txq_unmap(struct iwl_trans *trans, int txq_id)
639 if (WARN_ON_ONCE(!skb)) 639 if (WARN_ON_ONCE(!skb))
640 continue; 640 continue;
641 641
642 iwl_pcie_free_tso_page(skb); 642 iwl_pcie_free_tso_page(trans_pcie, skb);
643 } 643 }
644 iwl_pcie_txq_free_tfd(trans, txq); 644 iwl_pcie_txq_free_tfd(trans, txq);
645 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr); 645 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr);
@@ -1084,7 +1084,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
1084 if (WARN_ON_ONCE(!skb)) 1084 if (WARN_ON_ONCE(!skb))
1085 continue; 1085 continue;
1086 1086
1087 iwl_pcie_free_tso_page(skb); 1087 iwl_pcie_free_tso_page(trans_pcie, skb);
1088 1088
1089 __skb_queue_tail(skbs, skb); 1089 __skb_queue_tail(skbs, skb);
1090 1090
@@ -1115,17 +1115,17 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
1115 1115
1116 while (!skb_queue_empty(&overflow_skbs)) { 1116 while (!skb_queue_empty(&overflow_skbs)) {
1117 struct sk_buff *skb = __skb_dequeue(&overflow_skbs); 1117 struct sk_buff *skb = __skb_dequeue(&overflow_skbs);
1118 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1118 struct iwl_device_cmd *dev_cmd_ptr;
1119 u8 dev_cmd_idx = IWL_TRANS_FIRST_DRIVER_DATA + 1; 1119
1120 struct iwl_device_cmd *dev_cmd = 1120 dev_cmd_ptr = *(void **)((u8 *)skb->cb +
1121 info->driver_data[dev_cmd_idx]; 1121 trans_pcie->dev_cmd_offs);
1122 1122
1123 /* 1123 /*
1124 * Note that we can very well be overflowing again. 1124 * Note that we can very well be overflowing again.
1125 * In that case, iwl_queue_space will be small again 1125 * In that case, iwl_queue_space will be small again
1126 * and we won't wake mac80211's queue. 1126 * and we won't wake mac80211's queue.
1127 */ 1127 */
1128 iwl_trans_pcie_tx(trans, skb, dev_cmd, txq_id); 1128 iwl_trans_pcie_tx(trans, skb, dev_cmd_ptr, txq_id);
1129 } 1129 }
1130 spin_lock_bh(&txq->lock); 1130 spin_lock_bh(&txq->lock);
1131 1131
@@ -2024,7 +2024,6 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
2024 struct iwl_cmd_meta *out_meta, 2024 struct iwl_cmd_meta *out_meta,
2025 struct iwl_device_cmd *dev_cmd, u16 tb1_len) 2025 struct iwl_device_cmd *dev_cmd, u16 tb1_len)
2026{ 2026{
2027 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2028 struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; 2027 struct iwl_trans_pcie *trans_pcie = txq->trans_pcie;
2029 struct ieee80211_hdr *hdr = (void *)skb->data; 2028 struct ieee80211_hdr *hdr = (void *)skb->data;
2030 unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room; 2029 unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room;
@@ -2033,6 +2032,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
2033 u16 length, iv_len, amsdu_pad; 2032 u16 length, iv_len, amsdu_pad;
2034 u8 *start_hdr; 2033 u8 *start_hdr;
2035 struct iwl_tso_hdr_page *hdr_page; 2034 struct iwl_tso_hdr_page *hdr_page;
2035 struct page **page_ptr;
2036 int ret; 2036 int ret;
2037 struct tso_t tso; 2037 struct tso_t tso;
2038 2038
@@ -2063,7 +2063,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
2063 2063
2064 get_page(hdr_page->page); 2064 get_page(hdr_page->page);
2065 start_hdr = hdr_page->pos; 2065 start_hdr = hdr_page->pos;
2066 info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA] = hdr_page->page; 2066 page_ptr = (void *)((u8 *)skb->cb + trans_pcie->page_offs);
2067 *page_ptr = hdr_page->page;
2067 memcpy(hdr_page->pos, skb->data + hdr_len, iv_len); 2068 memcpy(hdr_page->pos, skb->data + hdr_len, iv_len);
2068 hdr_page->pos += iv_len; 2069 hdr_page->pos += iv_len;
2069 2070
@@ -2273,10 +2274,12 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
2273 2274
2274 /* don't put the packet on the ring, if there is no room */ 2275 /* don't put the packet on the ring, if there is no room */
2275 if (unlikely(iwl_queue_space(q) < 3)) { 2276 if (unlikely(iwl_queue_space(q) < 3)) {
2276 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 2277 struct iwl_device_cmd **dev_cmd_ptr;
2278
2279 dev_cmd_ptr = (void *)((u8 *)skb->cb +
2280 trans_pcie->dev_cmd_offs);
2277 2281
2278 info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA + 1] = 2282 *dev_cmd_ptr = dev_cmd;
2279 dev_cmd;
2280 __skb_queue_tail(&txq->overflow_q, skb); 2283 __skb_queue_tail(&txq->overflow_q, skb);
2281 2284
2282 spin_unlock(&txq->lock); 2285 spin_unlock(&txq->lock);