On 10/31/2023 6:23 AM, Jeff Johnson wrote: > On 10/30/2023 3:26 PM, Raj Kumar Bhagat wrote: >> From: Karthikeyan Kathirvel <quic_kathirve@xxxxxxxxxxx> >> >> Most of the RX descriptors fields are currently not used in the >> ath12k driver. Hence add support to selectively subscribe to the >> required quad words (64 bits) within msdu_end and mpdu_start of >> rx_desc. >> >> Add compact rx_desc structures and configure the bit mask for Rx TLVs >> (msdu_end, mpdu_start, mpdu_end) via registers. With these registers >> SW can configure to DMA the partial TLV struct to Rx buffer. >> >> Each TLV type has its own register to configure the mask value. >> The mask value configured in register will indicate if a particular >> QWORD has to be written to rx buffer or not i.e., if Nth bit is enabled >> in the mask Nth QWORD will be written and it will not be written if the >> bit is disabled in mask. While 0th bit indicates whether TLV tag will be >> written or not. >> >> Advantages of Qword subscription of TLVs >> - Avoid multiple cache-line misses as the all the required fields >> of the TLV are within 128 bytes. >> - Memory optimization as TLVs + DATA + SHINFO can fit in 2k buffer >> even for 64 bit kernel. >> >> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00188-QCAHKSWPL_SILICONZ-1 >> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1 >> >> Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@xxxxxxxxxxx> >> Co-developed-by: Raj Kumar Bhagat <quic_rajkbhag@xxxxxxxxxxx> >> Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@xxxxxxxxxxx> >> --- >> drivers/net/wireless/ath/ath12k/dp.c | 9 + >> drivers/net/wireless/ath/ath12k/dp.h | 13 + >> drivers/net/wireless/ath/ath12k/dp_rx.c | 16 +- >> drivers/net/wireless/ath/ath12k/dp_tx.c | 20 ++ >> drivers/net/wireless/ath/ath12k/hal.c | 352 ++++++++++++++++++++++ >> drivers/net/wireless/ath/ath12k/hal.h | 3 + >> drivers/net/wireless/ath/ath12k/rx_desc.h | 112 ++++++- >> drivers/net/wireless/ath/ath12k/wmi.h | 2 + >> 8 files changed, 519 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/net/wireless/ath/ath12k/dp.c b/drivers/net/wireless/ath/ath12k/dp.c >> index 80d7ce44d..faeef965e 100644 >> --- a/drivers/net/wireless/ath/ath12k/dp.c >> +++ b/drivers/net/wireless/ath/ath12k/dp.c >> @@ -1001,6 +1001,15 @@ void ath12k_dp_pdev_pre_alloc(struct ath12k_base *ab) >> void ath12k_dp_hal_rx_desc_init(struct ath12k_base *ab) >> { >> + if (test_bit(WMI_TLV_SERVICE_WMSK_COMPACTION_RX_TLVS, ab->wmi_ab.svc_map) && >> + ab->hw_params->hal_ops->rxdma_ring_wmask_rx_mpdu_start && >> + ab->hw_params->hal_ops->rxdma_ring_wmask_rx_msdu_end) { >> + /* RX TLVS compaction is supported, hence change the hal_rx_ops >> + * based on device. >> + */ >> + if (ab->hal_rx_ops == &hal_rx_qcn9274_ops) >> + ab->hal_rx_ops = &hal_rx_qcn9274_compact_ops; > > I only have one comment on this patch. > > in order to avoid chipset-specific logic here suggest that there should be an abstraction. > > several ideas come to mind: > 1) have a hal_ops callback to retrieve it > 2) have a pointer to the compact ops in the hw_params > > since we are already using hal_ops to get the masks, suggest that is where we should get the pointer to the compact ops > Thanks Jeff for the suggestion, will implement hal_ops to retrieve the corresponding compact ops. >> + } >> ab->hal.hal_desc_sz = >> ab->hal_rx_ops->rx_desc_get_desc_size(); >> } >