On 4/30/2024 7:18 PM, Kalle Valo wrote: > Jeff Johnson <quic_jjohnson@xxxxxxxxxxx> writes: > >> On 4/29/2024 12:36 AM, Tamizh Chelvam Raja wrote: >> >>> From: Venkateswara Naralasetty <quic_vnaralas@xxxxxxxxxxx> >>> >>> If STATUS_BUFFER_DONE is not set for a monitor status ring entry, >>> we don't process the status ring until STATUS_BUFFER_DONE set >>> for that status ring entry. >>> >>> During LMAC reset it may happen that hardware will not write >>> STATUS_BUFFER_DONE tlv in status buffer, in that case we end up >>> waiting for STATUS_BUFFER_DONE leading to backpressure on monitor >>> status ring. >>> >>> To fix the issue, when HP(Head Pointer) + 1 entry is peeked and if DMA >>> is not done and if HP + 2 entry's DMA done is set, >>> replenish HP + 1 entry and start processing in next interrupt. >>> If HP + 2 entry's DMA done is not set, poll onto HP + 1 entry DMA >>> done to be set. >>> >>> Also, during monitor attach HP points to the end of the ring and >>> TP(Tail Pointer) points to the start of the ring. >>> Using ath11k_hal_srng_src_peek() may result in processing invalid buffer >>> for the very first interrupt. Since, HW starts writing buffer from TP. >>> >>> To avoid this issue call ath11k_hal_srng_src_next_peek() instead of >>> calling ath11k_hal_srng_src_peek(). >>> >>> Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 >>> >>> Signed-off-by: Venkateswara Naralasetty <quic_vnaralas@xxxxxxxxxxx> >>> Co-developed-by: Tamizh Chelvam Raja <quic_tamizhr@xxxxxxxxxxx> >>> Signed-off-by: Tamizh Chelvam Raja <quic_tamizhr@xxxxxxxxxxx> >> >> Acked-by: Jeff Johnson <quic_jjohnson@xxxxxxxxxxx> >> >> however note... >> >>> + >>> + /* If done status is missing: >>> + * 1. As per MAC team's suggestion, >>> + * when HP + 1 entry is peeked and if DMA >>> + * is not done and if HP + 2 entry's DMA done >>> + * is set. skip HP + 1 entry and >>> + * start processing in next interrupt. >>> + * 2. If HP + 2 entry's DMA done is not set, >>> + * poll onto HP + 1 entry DMA done to be set. >>> + * Check status for same buffer for next time >>> + * dp_rx_mon_status_srng_process >>> + */ >>> + >>> + reap_status = ath11k_dp_rx_mon_handle_status_buf_done(ab, srng, >>> + rx_ring); >> >> ath11k-check reports: >> >> drivers/net/wireless/ath/ath11k/dp_rx.c:3116: line length of 95 exceeds 90 columns >> drivers/net/wireless/ath/ath11k/dp_rx.c:3117: line length of 95 exceeds 90 columns > > Tamizh, please ALWAYS run ath11k-check. We are wasting time for trivial > stuff like this. Sure Kalle. > >> Kalle, in this case we may want to make an exception since I don't think there >> is a clean way to fix this other than refactoring. > > The new function name looked quite long so I shortened it to > ath11k_dp_rx_mon_buf_done() and the warning is now gone. Does that look > reasonable name? > > Also I removed one unrelated change and removed unnecessary else. Please > check my changes: > > https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=6e88d559268779107715008c51e006f7a5f62045 Change looks good! > > But now I noticed that the warning message needs some work: > > ath11k_warn(ab, "mon status DONE not set %lx, buf_id %d\n", > FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl), > buf_id); > > Please use understandable warning and error messages in plain english. > Any suggestions? I can edit the commit in the pending branch. > "hal rx status buffer done is not set in tlv %lx buf_id %d" -> is this fine? >> FWIW I'd like to see this function refactored to avoid the excessive >> indentation, but that should be a separate exercise. > > Indeed, the indentation in this function is getting close to the limit. > Tamizh