Was this really tested on QCN9074 as the commit text suggests...? > const struct ath11k_hw_ops ipq6018_ops = { > @@ -1132,6 +1147,7 @@ const struct ath11k_hw_ops wcn6750_ops = { > .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, > .reo_setup = ath11k_hw_wcn6855_reo_setup, > .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, > + .mpdu_info_get_mpdu_len = ath11k_hw_qcn9074_mpdu_info_get_mpdu_len, ... > +static u32 ath11k_hal_rx_mpduinfo_get_mpdu_len(struct ath11k_base *ab, > + struct hal_rx_mpdu_info *mpdu_info) > +{ > + return ab->hw_params.hw_ops->mpdu_info_get_mpdu_len(mpdu_info); > +} I think you want to put this under qcn9074_ops. As of now, when QCN9074 is present, it attempts to jump to a NULL pointer as mpdu_info_get_mpdu_len remains uninitialized for qcn9074_ops. And, do you not need to define mpdu_info_get_mpdu_len for all the other hw_ops? If so, please be careful about defining it for WCN6855/WCN6750 as there was a recent regression due to how the RX MPDU info is provided by those firmwares as it differed from IPQ8074/QCN9074. I personally do not have the appropriate literature to determine whether or not this is consequential or not here as well, though it seems like it would be: https://lore.kernel.org/linux-wireless/20230404072234.18503-3-quic_youghand@xxxxxxxxxxx/ Tyler