qcacmn: Handle BAR OOR/2K_JUMP REO errors

Currently in dp_rx_wbm_err_process, we donot handle
HAL_REO_ERR_BAR_FRAME_2K_JUMP and HAL_REO_ERR_BAR_FRAME_OOR REO errors.
Add support for the same.

Change-Id: I22147fcd2d531c1e08214626796994593ffeb3a6
CRs-Fixed: 2580876
This commit is contained in:
Mohit Khanna
2019-12-09 19:15:27 -08:00
committed by nshrivas
parent 63055510e0
commit 82382b32e9
3 changed files with 73 additions and 14 deletions

View File

@@ -1669,4 +1669,16 @@ dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
return soc->pdev_list[pdev_id]; return soc->pdev_list[pdev_id];
} }
/*
* dp_rx_tid_update_wifi3() Update receive TID state
* @peer: Datapath peer handle
* @tid: TID
* @ba_window_size: BlockAck window size
* @start_seq: Starting sequence number
*
* Return: QDF_STATUS code
*/
QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
ba_window_size, uint32_t start_seq);
#endif /* #ifndef _DP_INTERNAL_H_ */ #endif /* #ifndef _DP_INTERNAL_H_ */

View File

@@ -1726,16 +1726,7 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer)
return is_roaming; return is_roaming;
} }
/* QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
* dp_rx_tid_update_wifi3() Update receive TID state
* @peer: Datapath peer handle
* @tid: TID
* @ba_window_size: BlockAck window size
* @start_seq: Starting sequence number
*
* Return: QDF_STATUS code
*/
static QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
ba_window_size, uint32_t start_seq) ba_window_size, uint32_t start_seq)
{ {
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];

View File

@@ -498,6 +498,49 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr,
return mpdu_done; return mpdu_done;
} }
static
void dp_rx_wbm_err_handle_bar(struct dp_soc *soc,
struct dp_peer *peer,
qdf_nbuf_t nbuf)
{
uint8_t *rx_tlv_hdr;
unsigned char type, subtype;
uint16_t start_seq_num;
uint32_t tid;
struct ieee80211_frame_bar *bar;
/*
* 1. Is this a BAR frame. If not Discard it.
* 2. If it is, get the peer id, tid, ssn
* 2a Do a tid update
*/
rx_tlv_hdr = qdf_nbuf_data(nbuf);
bar = (struct ieee80211_frame_bar *)(rx_tlv_hdr +
sizeof(struct rx_pkt_tlvs));
type = bar->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
subtype = bar->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
if (!(type == IEEE80211_FC0_TYPE_CTL &&
subtype == QDF_IEEE80211_FC0_SUBTYPE_BAR)) {
dp_err_rl("Not a BAR frame!");
return;
}
tid = hal_rx_mpdu_start_tid_get(soc->hal_soc, rx_tlv_hdr);
qdf_assert_always(tid < DP_MAX_TIDS);
start_seq_num = le16toh(bar->i_seq) >> IEEE80211_SEQ_SEQ_SHIFT;
dp_info_rl("tid %u window_size %u start_seq_num %u",
tid, peer->rx_tid[tid].ba_win_size, start_seq_num);
dp_rx_tid_update_wifi3(peer, tid,
peer->rx_tid[tid].ba_win_size,
start_seq_num);
}
/** /**
* dp_2k_jump_handle() - Function to handle 2k jump exception * dp_2k_jump_handle() - Function to handle 2k jump exception
* on WBM ring * on WBM ring
@@ -1462,16 +1505,21 @@ done:
uint8_t *tlv_hdr; uint8_t *tlv_hdr;
rx_tlv_hdr = qdf_nbuf_data(nbuf); rx_tlv_hdr = qdf_nbuf_data(nbuf);
peer_id = hal_rx_mpdu_start_sw_peer_id_get(soc->hal_soc,
rx_tlv_hdr);
peer = dp_peer_find_by_id(soc, peer_id);
/* /*
* retrieve the wbm desc info from nbuf TLV, so we can * retrieve the wbm desc info from nbuf TLV, so we can
* handle error cases appropriately * handle error cases appropriately
*/ */
hal_rx_wbm_err_info_get_from_tlv(rx_tlv_hdr, &wbm_err_info); hal_rx_wbm_err_info_get_from_tlv(rx_tlv_hdr, &wbm_err_info);
peer_id = hal_rx_mpdu_start_sw_peer_id_get(soc->hal_soc,
rx_tlv_hdr);
peer = dp_peer_find_by_id(soc, peer_id);
if (!peer)
dp_err_rl("peer is null! peer_id %u err_src %u err_rsn %u",
peer_id, wbm_err_info.wbm_err_src,
wbm_err_info.reo_psh_rsn);
/* Set queue_mapping in nbuf to 0 */ /* Set queue_mapping in nbuf to 0 */
dp_set_rx_queue(nbuf, 0); dp_set_rx_queue(nbuf, 0);
@@ -1526,6 +1574,14 @@ done:
dp_peer_unref_del_find_by_id( dp_peer_unref_del_find_by_id(
peer); peer);
continue; continue;
case HAL_REO_ERR_BAR_FRAME_2K_JUMP:
case HAL_REO_ERR_BAR_FRAME_OOR:
if (peer)
dp_rx_wbm_err_handle_bar(soc,
peer,
nbuf);
break;
default: default:
dp_err_rl("Got pkt with REO ERROR: %d", dp_err_rl("Got pkt with REO ERROR: %d",
wbm_err_info.reo_err_code); wbm_err_info.reo_err_code);