qcacmn: Tx capture/Mcopy mode changes
The following changes are added for Tx capture/Mcopy mode 1. Append ppduid for FW generated mgmt. frames 2. Append ppduid received in mgmt. TX completion for host generated mgmt. frames 3. Reuse nbuf received in HTT msg to send mgmt. payload to upper layers Change-Id: I073cafa6389ed1ed835cc3ba4b9421b7a4b97d7f CRs-Fixed: 2185543
This commit is contained in:
@@ -2176,35 +2176,27 @@ static void dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev,
|
||||
*
|
||||
* return:void
|
||||
*/
|
||||
static void dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(
|
||||
struct dp_pdev *pdev, uint32_t *tag_buf, uint32_t length)
|
||||
static void
|
||||
dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev,
|
||||
qdf_nbuf_t tag_buf,
|
||||
uint32_t length,
|
||||
uint32_t ppdu_id)
|
||||
{
|
||||
htt_ppdu_stats_tx_mgmtctrl_payload_tlv *dp_stats_buf;
|
||||
qdf_nbuf_t nbuf;
|
||||
uint32_t payload_size;
|
||||
uint32_t *nbuf_ptr;
|
||||
|
||||
if ((!pdev->tx_sniffer_enable) && (!pdev->mcopy_mode))
|
||||
return;
|
||||
|
||||
payload_size = length - HTT_MGMT_CTRL_TLV_RESERVERD_LEN;
|
||||
nbuf = NULL;
|
||||
dp_stats_buf = (htt_ppdu_stats_tx_mgmtctrl_payload_tlv *)tag_buf;
|
||||
|
||||
|
||||
nbuf = qdf_nbuf_alloc(pdev->soc->osdev, payload_size, 0, 4, true);
|
||||
|
||||
if (!nbuf) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
"Nbuf Allocation failed for Mgmt. payload");
|
||||
qdf_assert(0);
|
||||
if (qdf_nbuf_pull_head(tag_buf, HTT_MGMT_CTRL_TLV_RESERVERD_LEN + 4)
|
||||
== NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
qdf_nbuf_put_tail(nbuf, payload_size);
|
||||
qdf_mem_copy(qdf_nbuf_data(nbuf), dp_stats_buf->payload, payload_size);
|
||||
nbuf_ptr = (uint32_t *)qdf_nbuf_push_head(
|
||||
tag_buf, sizeof(ppdu_id));
|
||||
*nbuf_ptr = ppdu_id;
|
||||
|
||||
dp_wdi_event_handler(WDI_EVENT_TX_MGMT_CTRL, pdev->soc,
|
||||
nbuf, HTT_INVALID_PEER,
|
||||
tag_buf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
}
|
||||
|
||||
@@ -2287,10 +2279,6 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
|
||||
dp_process_ppdu_stats_user_compltn_flush_tlv(
|
||||
pdev, tag_buf);
|
||||
break;
|
||||
case HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV:
|
||||
dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(
|
||||
pdev, tag_buf, tlv_len);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2471,7 +2459,7 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id,
|
||||
*/
|
||||
|
||||
static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
||||
qdf_nbuf_t htt_t2h_msg)
|
||||
qdf_nbuf_t htt_t2h_msg, bool *free_buf)
|
||||
{
|
||||
uint32_t length;
|
||||
uint32_t ppdu_id;
|
||||
@@ -2507,10 +2495,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
||||
* doesn't contain any ppdu information
|
||||
*/
|
||||
if (tlv_type == HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) {
|
||||
dp_process_ppdu_tag(pdev, msg_word, tlv_length, NULL);
|
||||
msg_word = (uint32_t *)((uint8_t *)tlv_buf + tlv_length);
|
||||
dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(pdev,
|
||||
htt_t2h_msg, tlv_length, ppdu_id);
|
||||
msg_word =
|
||||
(uint32_t *)((uint8_t *)tlv_buf + tlv_length);
|
||||
length -= (tlv_length);
|
||||
continue;
|
||||
*free_buf = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ppdu_info = dp_get_ppdu_desc(pdev, ppdu_id, tlv_type);
|
||||
@@ -2532,6 +2523,9 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
||||
length -= (tlv_length);
|
||||
}
|
||||
|
||||
if (!ppdu_info)
|
||||
return NULL;
|
||||
|
||||
pdev->last_ppdu_id = ppdu_id;
|
||||
|
||||
tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP;
|
||||
@@ -2562,25 +2556,28 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
||||
*/
|
||||
#if defined(WDI_EVENT_ENABLE)
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
|
||||
static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
|
||||
{
|
||||
struct dp_pdev *pdev = soc->pdev_list[pdev_id];
|
||||
struct ppdu_info *ppdu_info = NULL;
|
||||
bool free_buf = true;
|
||||
|
||||
if (!pdev->enhanced_stats_en && !pdev->tx_sniffer_enable &&
|
||||
!pdev->mcopy_mode)
|
||||
return;
|
||||
return free_buf;
|
||||
|
||||
ppdu_info = dp_htt_process_tlv(pdev, htt_t2h_msg);
|
||||
ppdu_info = dp_htt_process_tlv(pdev, htt_t2h_msg, &free_buf);
|
||||
if (ppdu_info)
|
||||
dp_ppdu_desc_deliver(pdev, ppdu_info);
|
||||
|
||||
return free_buf;
|
||||
}
|
||||
#else
|
||||
static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
|
||||
static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -2672,22 +2669,24 @@ int htt_soc_attach_target(void *htt_soc)
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
static bool
|
||||
dp_ppdu_stats_ind_handler(struct htt_soc *soc,
|
||||
uint32_t *msg_word,
|
||||
qdf_nbuf_t htt_t2h_msg)
|
||||
{
|
||||
u_int8_t pdev_id;
|
||||
bool free_buf;
|
||||
qdf_nbuf_set_pktlen(htt_t2h_msg, HTT_T2H_MAX_MSG_SIZE);
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
||||
"received HTT_T2H_MSG_TYPE_PPDU_STATS_IND\n");
|
||||
pdev_id = HTT_T2H_PPDU_STATS_PDEV_ID_GET(*msg_word);
|
||||
pdev_id = DP_HW2SW_MACID(pdev_id);
|
||||
dp_txrx_ppdu_stats_handler(soc->dp_soc, pdev_id,
|
||||
htt_t2h_msg);
|
||||
free_buf = dp_txrx_ppdu_stats_handler(soc->dp_soc, pdev_id,
|
||||
htt_t2h_msg);
|
||||
dp_wdi_event_handler(WDI_EVENT_LITE_T2H, soc->dp_soc,
|
||||
htt_t2h_msg, HTT_INVALID_PEER, WDI_NO_VAL,
|
||||
pdev_id);
|
||||
return free_buf;
|
||||
}
|
||||
#else
|
||||
dp_ppdu_stats_ind_handler(struct htt_soc *soc,
|
||||
@@ -2739,6 +2738,7 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
|
||||
qdf_nbuf_t htt_t2h_msg = (qdf_nbuf_t) pkt->pPktContext;
|
||||
u_int32_t *msg_word;
|
||||
enum htt_t2h_msg_type msg_type;
|
||||
bool free_buf = true;
|
||||
|
||||
/* check for successful message reception */
|
||||
if (pkt->Status != QDF_STATUS_SUCCESS) {
|
||||
@@ -2805,7 +2805,8 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
|
||||
|
||||
case HTT_T2H_MSG_TYPE_PPDU_STATS_IND:
|
||||
{
|
||||
dp_ppdu_stats_ind_handler(soc, msg_word, htt_t2h_msg);
|
||||
free_buf = dp_ppdu_stats_ind_handler(soc, msg_word,
|
||||
htt_t2h_msg);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2888,7 +2889,8 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
|
||||
};
|
||||
|
||||
/* Free the indication buffer */
|
||||
qdf_nbuf_free(htt_t2h_msg);
|
||||
if (free_buf)
|
||||
qdf_nbuf_free(htt_t2h_msg);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user