mirror of https://gitee.com/openkylin/linux.git
ath10k: fix possible bmi crash
While testing other things I've found that CE items aren't cleared properly. This could lead to null dereferences in BMI. To prevent that make sure CE revoking clears the nbytes value (which is used as a buffer completion indication) and memset the entire CE ring data shared between host and target when (re)initializing. Also make sure to check BMI xfer pointer and print a splat instead of crashing the kernel. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
c011b28159
commit
04ed9dfe49
|
@ -558,6 +558,7 @@ int ath10k_ce_revoke_recv_next(struct ath10k_ce_pipe *ce_state,
|
||||||
|
|
||||||
/* sanity */
|
/* sanity */
|
||||||
dest_ring->per_transfer_context[sw_index] = NULL;
|
dest_ring->per_transfer_context[sw_index] = NULL;
|
||||||
|
desc->nbytes = 0;
|
||||||
|
|
||||||
/* Update sw_index */
|
/* Update sw_index */
|
||||||
sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index);
|
sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index);
|
||||||
|
@ -835,6 +836,9 @@ static int ath10k_ce_init_src_ring(struct ath10k *ar,
|
||||||
|
|
||||||
nentries = roundup_pow_of_two(attr->src_nentries);
|
nentries = roundup_pow_of_two(attr->src_nentries);
|
||||||
|
|
||||||
|
memset(src_ring->base_addr_owner_space, 0,
|
||||||
|
nentries * sizeof(struct ce_desc));
|
||||||
|
|
||||||
src_ring->sw_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr);
|
src_ring->sw_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr);
|
||||||
src_ring->sw_index &= src_ring->nentries_mask;
|
src_ring->sw_index &= src_ring->nentries_mask;
|
||||||
src_ring->hw_index = src_ring->sw_index;
|
src_ring->hw_index = src_ring->sw_index;
|
||||||
|
@ -869,6 +873,9 @@ static int ath10k_ce_init_dest_ring(struct ath10k *ar,
|
||||||
|
|
||||||
nentries = roundup_pow_of_two(attr->dest_nentries);
|
nentries = roundup_pow_of_two(attr->dest_nentries);
|
||||||
|
|
||||||
|
memset(dest_ring->base_addr_owner_space, 0,
|
||||||
|
nentries * sizeof(struct ce_desc));
|
||||||
|
|
||||||
dest_ring->sw_index = ath10k_ce_dest_ring_read_index_get(ar, ctrl_addr);
|
dest_ring->sw_index = ath10k_ce_dest_ring_read_index_get(ar, ctrl_addr);
|
||||||
dest_ring->sw_index &= dest_ring->nentries_mask;
|
dest_ring->sw_index &= dest_ring->nentries_mask;
|
||||||
dest_ring->write_index =
|
dest_ring->write_index =
|
||||||
|
|
|
@ -1442,6 +1442,9 @@ static void ath10k_pci_bmi_recv_data(struct ath10k_ce_pipe *ce_state)
|
||||||
&nbytes, &transfer_id, &flags))
|
&nbytes, &transfer_id, &flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(!xfer))
|
||||||
|
return;
|
||||||
|
|
||||||
if (!xfer->wait_for_resp) {
|
if (!xfer->wait_for_resp) {
|
||||||
ath10k_warn(ar, "unexpected: BMI data received; ignoring\n");
|
ath10k_warn(ar, "unexpected: BMI data received; ignoring\n");
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue