qcacmn: Send ring sel cfg to configure rx pkt tlvs offset
Currently the FW configures the mac with appropriate offsets for rx pkt tlvs using the structure defined in te FW and the host does not send the ring selction config HTT message. This can create a problem when FW stops subscribing to tlvs or changes its rx pkt tlvs offset. Fix this by configuring the rx pkt tlv offsets via HTT ring selection config message. Change-Id: I1a2865f91b34dd7bda1af8651d7831097dac0bee CRs-Fixed: 2860504
This commit is contained in:
@@ -4968,6 +4968,18 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef QCA_HOST2FW_RXBUF_RING
|
||||
static struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id)
|
||||
{
|
||||
return &pdev->rx_mac_buf_ring[lmac_id];
|
||||
}
|
||||
#else
|
||||
static struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id)
|
||||
{
|
||||
return &pdev->soc->rx_refill_buf_ring[lmac_id];
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* dp_rxdma_ring_config() - configure the RX DMA rings
|
||||
*
|
||||
@@ -5221,10 +5233,86 @@ dp_rxdma_ring_sel_cfg(struct dp_soc *soc)
|
||||
return status;
|
||||
}
|
||||
#else
|
||||
|
||||
static QDF_STATUS
|
||||
dp_rxdma_ring_sel_cfg(struct dp_soc *soc)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
int i;
|
||||
int mac_id;
|
||||
struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
|
||||
struct dp_srng *rx_mac_srng;
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
|
||||
htt_tlv_filter.mpdu_start = 1;
|
||||
htt_tlv_filter.msdu_start = 1;
|
||||
htt_tlv_filter.mpdu_end = 1;
|
||||
htt_tlv_filter.msdu_end = 1;
|
||||
htt_tlv_filter.attention = 1;
|
||||
htt_tlv_filter.packet = 1;
|
||||
htt_tlv_filter.packet_header = 1;
|
||||
|
||||
htt_tlv_filter.ppdu_start = 0;
|
||||
htt_tlv_filter.ppdu_end = 0;
|
||||
htt_tlv_filter.ppdu_end_user_stats = 0;
|
||||
htt_tlv_filter.ppdu_end_user_stats_ext = 0;
|
||||
htt_tlv_filter.ppdu_end_status_done = 0;
|
||||
htt_tlv_filter.enable_fp = 1;
|
||||
htt_tlv_filter.enable_md = 0;
|
||||
htt_tlv_filter.enable_md = 0;
|
||||
htt_tlv_filter.enable_mo = 0;
|
||||
|
||||
htt_tlv_filter.fp_mgmt_filter = 0;
|
||||
htt_tlv_filter.fp_ctrl_filter = FILTER_CTRL_BA_REQ;
|
||||
htt_tlv_filter.fp_data_filter = (FILTER_DATA_UCAST |
|
||||
FILTER_DATA_MCAST |
|
||||
FILTER_DATA_DATA);
|
||||
htt_tlv_filter.mo_mgmt_filter = 0;
|
||||
htt_tlv_filter.mo_ctrl_filter = 0;
|
||||
htt_tlv_filter.mo_data_filter = 0;
|
||||
htt_tlv_filter.md_data_filter = 0;
|
||||
|
||||
htt_tlv_filter.offset_valid = true;
|
||||
|
||||
htt_tlv_filter.rx_packet_offset = RX_PKT_TLVS_LEN;
|
||||
htt_tlv_filter.rx_header_offset =
|
||||
hal_rx_pkt_tlv_offset_get(soc->hal_soc);
|
||||
htt_tlv_filter.rx_mpdu_start_offset =
|
||||
hal_rx_mpdu_start_offset_get(soc->hal_soc);
|
||||
htt_tlv_filter.rx_mpdu_end_offset =
|
||||
hal_rx_mpdu_end_offset_get(soc->hal_soc);
|
||||
htt_tlv_filter.rx_msdu_start_offset =
|
||||
hal_rx_msdu_start_offset_get(soc->hal_soc);
|
||||
htt_tlv_filter.rx_msdu_end_offset =
|
||||
hal_rx_msdu_end_offset_get(soc->hal_soc);
|
||||
htt_tlv_filter.rx_attn_offset =
|
||||
hal_rx_attn_offset_get(soc->hal_soc);
|
||||
|
||||
for (i = 0; i < MAX_PDEV_CNT; i++) {
|
||||
struct dp_pdev *pdev = soc->pdev_list[i];
|
||||
|
||||
if (!pdev)
|
||||
continue;
|
||||
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
|
||||
int mac_for_pdev =
|
||||
dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id);
|
||||
/*
|
||||
* Obtain lmac id from pdev to access the LMAC ring
|
||||
* in soc context
|
||||
*/
|
||||
int lmac_id =
|
||||
dp_get_lmac_id_for_pdev_id(soc, mac_id,
|
||||
pdev->pdev_id);
|
||||
|
||||
rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
|
||||
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
|
||||
rx_mac_srng->hal_srng,
|
||||
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
|
||||
&htt_tlv_filter);
|
||||
}
|
||||
}
|
||||
return status;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user