Commit bf77ee2e authored by Sara Sharon's avatar Sara Sharon Committed by Luca Coelho

iwlwifi: trace: change trace to trace one TB at a time

Split TX tracing to be per TB. This is needed now that
AMSDUs can be sent and skb can be larger than trace
limit.
Signed-off-by: default avatarSara Sharon <sara.sharon@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent ea74b19d
...@@ -30,37 +30,19 @@ ...@@ -30,37 +30,19 @@
#undef TRACE_SYSTEM #undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_data #define TRACE_SYSTEM iwlwifi_data
TRACE_EVENT(iwlwifi_dev_tx_data, TRACE_EVENT(iwlwifi_dev_tx_tb,
TP_PROTO(const struct device *dev, TP_PROTO(const struct device *dev, struct sk_buff *skb,
struct sk_buff *skb, u8 hdr_len), u8 *data_src, size_t data_len),
TP_ARGS(dev, skb, hdr_len), TP_ARGS(dev, skb, data_src, data_len),
TP_STRUCT__entry( TP_STRUCT__entry(
DEV_ENTRY DEV_ENTRY
__dynamic_array(u8, data, __dynamic_array(u8, data,
iwl_trace_data(skb) ? skb->len - hdr_len : 0) iwl_trace_data(skb) ? data_len : 0)
), ),
TP_fast_assign( TP_fast_assign(
DEV_ASSIGN; DEV_ASSIGN;
if (iwl_trace_data(skb)) if (iwl_trace_data(skb))
skb_copy_bits(skb, hdr_len,
__get_dynamic_array(data),
skb->len - hdr_len);
),
TP_printk("[%s] TX frame data", __get_str(dev))
);
TRACE_EVENT(iwlwifi_dev_tx_tso_chunk,
TP_PROTO(const struct device *dev,
u8 *data_src, size_t data_len),
TP_ARGS(dev, data_src, data_len),
TP_STRUCT__entry(
DEV_ENTRY
__dynamic_array(u8, data, data_len)
),
TP_fast_assign(
DEV_ASSIGN;
memcpy(__get_dynamic_array(data), data_src, data_len); memcpy(__get_dynamic_array(data), data_src, data_len);
), ),
TP_printk("[%s] TX frame data", __get_str(dev)) TP_printk("[%s] TX frame data", __get_str(dev))
......
...@@ -330,7 +330,7 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans, ...@@ -330,7 +330,7 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans,
goto out_err; goto out_err;
} }
iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb_len); iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb_len);
trace_iwlwifi_dev_tx_tso_chunk(trans->dev, start_hdr, tb_len); trace_iwlwifi_dev_tx_tb(trans->dev, skb, start_hdr, tb_len);
/* add this subframe's headers' length to the tx_cmd */ /* add this subframe's headers' length to the tx_cmd */
le16_add_cpu(&tx_cmd->len, hdr_page->pos - subf_hdrs_start); le16_add_cpu(&tx_cmd->len, hdr_page->pos - subf_hdrs_start);
...@@ -347,7 +347,7 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans, ...@@ -347,7 +347,7 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans,
goto out_err; goto out_err;
} }
iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb_len); iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb_len);
trace_iwlwifi_dev_tx_tso_chunk(trans->dev, tso.data, trace_iwlwifi_dev_tx_tb(trans->dev, skb, tso.data,
tb_len); tb_len);
data_left -= tb_len; data_left -= tb_len;
...@@ -438,6 +438,9 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans *trans, ...@@ -438,6 +438,9 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans *trans,
return -ENOMEM; return -ENOMEM;
tb_idx = iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb_idx = iwl_pcie_gen2_set_tb(trans, tfd, tb_phys,
skb_frag_size(frag)); skb_frag_size(frag));
trace_iwlwifi_dev_tx_tb(trans->dev, skb,
skb_frag_address(frag),
skb_frag_size(frag));
if (tb_idx < 0) if (tb_idx < 0)
return tb_idx; return tb_idx;
...@@ -490,6 +493,8 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, ...@@ -490,6 +493,8 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans,
if (unlikely(dma_mapping_error(trans->dev, tb_phys))) if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
goto out_err; goto out_err;
iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len); iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len);
trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr,
IWL_FIRST_TB_SIZE + tb1_len, hdr_len);
/* set up TFD's third entry to point to remainder of skb's head */ /* set up TFD's third entry to point to remainder of skb's head */
tb2_len = skb_headlen(skb) - hdr_len; tb2_len = skb_headlen(skb) - hdr_len;
...@@ -500,15 +505,14 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, ...@@ -500,15 +505,14 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans,
if (unlikely(dma_mapping_error(trans->dev, tb_phys))) if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
goto out_err; goto out_err;
iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb2_len); iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb2_len);
trace_iwlwifi_dev_tx_tb(trans->dev, skb,
skb->data + hdr_len,
tb2_len);
} }
if (iwl_pcie_gen2_tx_add_frags(trans, skb, tfd, out_meta)) if (iwl_pcie_gen2_tx_add_frags(trans, skb, tfd, out_meta))
goto out_err; goto out_err;
trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr,
IWL_FIRST_TB_SIZE + tb1_len, hdr_len);
trace_iwlwifi_dev_tx_data(trans->dev, skb, hdr_len);
return tfd; return tfd;
out_err: out_err:
......
...@@ -1994,6 +1994,9 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -1994,6 +1994,9 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb,
head_tb_len, DMA_TO_DEVICE); head_tb_len, DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(trans->dev, tb_phys))) if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
return -EINVAL; return -EINVAL;
trace_iwlwifi_dev_tx_tb(trans->dev, skb,
skb->data + hdr_len,
head_tb_len);
iwl_pcie_txq_build_tfd(trans, txq, tb_phys, head_tb_len, false); iwl_pcie_txq_build_tfd(trans, txq, tb_phys, head_tb_len, false);
} }
...@@ -2011,6 +2014,9 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -2011,6 +2014,9 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb,
if (unlikely(dma_mapping_error(trans->dev, tb_phys))) if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
return -EINVAL; return -EINVAL;
trace_iwlwifi_dev_tx_tb(trans->dev, skb,
skb_frag_address(frag),
skb_frag_size(frag));
tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys, tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
skb_frag_size(frag), false); skb_frag_size(frag), false);
if (tb_idx < 0) if (tb_idx < 0)
...@@ -2190,7 +2196,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -2190,7 +2196,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
} }
iwl_pcie_txq_build_tfd(trans, txq, hdr_tb_phys, iwl_pcie_txq_build_tfd(trans, txq, hdr_tb_phys,
hdr_tb_len, false); hdr_tb_len, false);
trace_iwlwifi_dev_tx_tso_chunk(trans->dev, start_hdr, trace_iwlwifi_dev_tx_tb(trans->dev, skb, start_hdr,
hdr_tb_len); hdr_tb_len);
/* add this subframe's headers' length to the tx_cmd */ /* add this subframe's headers' length to the tx_cmd */
le16_add_cpu(&tx_cmd->len, hdr_page->pos - subf_hdrs_start); le16_add_cpu(&tx_cmd->len, hdr_page->pos - subf_hdrs_start);
...@@ -2216,7 +2222,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -2216,7 +2222,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
iwl_pcie_txq_build_tfd(trans, txq, tb_phys, iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
size, false); size, false);
trace_iwlwifi_dev_tx_tso_chunk(trans->dev, tso.data, trace_iwlwifi_dev_tx_tb(trans->dev, skb, tso.data,
size); size);
data_left -= size; data_left -= size;
...@@ -2398,6 +2404,13 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -2398,6 +2404,13 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
goto out_err; goto out_err;
iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false); iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false);
trace_iwlwifi_dev_tx(trans->dev, skb,
iwl_pcie_get_tfd(trans, txq,
txq->write_ptr),
trans_pcie->tfd_size,
&dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len,
hdr_len);
/* /*
* If gso_size wasn't set, don't give the frame "amsdu treatment" * If gso_size wasn't set, don't give the frame "amsdu treatment"
* (adding subframes, etc.). * (adding subframes, etc.).
...@@ -2421,14 +2434,6 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, ...@@ -2421,14 +2434,6 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
out_meta))) out_meta)))
goto out_err; goto out_err;
} }
trace_iwlwifi_dev_tx(trans->dev, skb,
iwl_pcie_get_tfd(trans, txq,
txq->write_ptr),
trans_pcie->tfd_size,
&dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len,
hdr_len);
trace_iwlwifi_dev_tx_data(trans->dev, skb, hdr_len);
} }
/* building the A-MSDU might have changed this data, so memcpy it now */ /* building the A-MSDU might have changed this data, so memcpy it now */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment