qcacld-3.0: Add update_seq_num flag to htt_rx_mpdu_desc_seq_num

In case of partial reorder, seq number is sent by FW
when first_msdu bit is set in msdu. For all other msdus host
maintain copy of cur_seq_num_hl in pdev.
cur_seq_num_hl gets updated when htt_rx_mpdu_desc_seq_num API
is called. Currently htt_rx_mpdu_desc_seq_num API is called
from multiple functions. Add update_seq_num flag to make sure that
cur_seq_num_hl updates only during store function.

Change-Id: Ie3178ee6d1642dbeaf0cea032dc80e0ecccc1dc2
CRs-Fixed: 2683869
This commit is contained in:
Nirav Shah
2020-05-06 16:33:46 +05:30
committed by nshrivas
父節點 2721fcec48
當前提交 cf164af18d
共有 8 個文件被更改,包括 35 次插入23 次删除

查看文件

@@ -186,7 +186,8 @@ void * (*htt_rx_mpdu_desc_list_next)(htt_pdev_handle pdev,
bool (*htt_rx_mpdu_desc_retry)(htt_pdev_handle pdev, void *mpdu_desc); bool (*htt_rx_mpdu_desc_retry)(htt_pdev_handle pdev, void *mpdu_desc);
uint16_t (*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc); uint16_t (*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc,
bool update_seq_num);
void (*htt_rx_mpdu_desc_pn)(htt_pdev_handle pdev, void (*htt_rx_mpdu_desc_pn)(htt_pdev_handle pdev,
void *mpdu_desc, void *mpdu_desc,

查看文件

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -385,12 +385,17 @@ htt_rx_offload_msdu_pop_hl(htt_pdev_handle pdev,
} }
static uint16_t static uint16_t
htt_rx_mpdu_desc_seq_num_hl(htt_pdev_handle pdev, void *mpdu_desc) htt_rx_mpdu_desc_seq_num_hl(htt_pdev_handle pdev, void *mpdu_desc,
bool update_seq_num)
{ {
if (pdev->rx_desc_size_hl) { if (pdev->rx_desc_size_hl) {
return pdev->cur_seq_num_hl = if (update_seq_num)
(u_int16_t)(HTT_WORD_GET(*(u_int32_t *)mpdu_desc, return pdev->cur_seq_num_hl =
HTT_HL_RX_DESC_MPDU_SEQ_NUM)); (u_int16_t)(HTT_WORD_GET(*(u_int32_t *)mpdu_desc,
HTT_HL_RX_DESC_MPDU_SEQ_NUM));
else
return (u_int16_t)(HTT_WORD_GET(*(u_int32_t *)mpdu_desc,
HTT_HL_RX_DESC_MPDU_SEQ_NUM));
} else { } else {
return (u_int16_t)(pdev->cur_seq_num_hl); return (u_int16_t)(pdev->cur_seq_num_hl);
} }

查看文件

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -767,7 +767,8 @@ htt_rx_mpdu_desc_retry_ll(htt_pdev_handle pdev, void *mpdu_desc)
} }
static uint16_t htt_rx_mpdu_desc_seq_num_ll(htt_pdev_handle pdev, static uint16_t htt_rx_mpdu_desc_seq_num_ll(htt_pdev_handle pdev,
void *mpdu_desc) void *mpdu_desc,
bool update_seq_num)
{ {
struct htt_host_rx_desc_base *rx_desc = struct htt_host_rx_desc_base *rx_desc =
(struct htt_host_rx_desc_base *)mpdu_desc; (struct htt_host_rx_desc_base *)mpdu_desc;

查看文件

@@ -380,7 +380,8 @@ bool (*htt_rx_mpdu_desc_retry)(
* @return the LSBs of the sequence number for the MPDU * @return the LSBs of the sequence number for the MPDU
*/ */
extern uint16_t extern uint16_t
(*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc); (*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc,
bool update_seq_num);
/** /**
* @brief Return a rx MPDU's rx reorder array index, based on sequence number. * @brief Return a rx MPDU's rx reorder array index, based on sequence number.

查看文件

@@ -416,11 +416,12 @@ static void process_reorder(ol_txrx_pdev_handle pdev,
enum htt_rx_status mpdu_status; enum htt_rx_status mpdu_status;
int reorder_idx; int reorder_idx;
reorder_idx = htt_rx_mpdu_desc_reorder_idx(htt_pdev, rx_mpdu_desc); reorder_idx = htt_rx_mpdu_desc_reorder_idx(htt_pdev, rx_mpdu_desc,
true);
OL_RX_REORDER_TRACE_ADD(pdev, tid, OL_RX_REORDER_TRACE_ADD(pdev, tid,
reorder_idx, reorder_idx,
htt_rx_mpdu_desc_seq_num(htt_pdev, htt_rx_mpdu_desc_seq_num(htt_pdev,
rx_mpdu_desc), rx_mpdu_desc, false),
1); 1);
ol_rx_mpdu_rssi_update(peer, rx_mpdu_desc); ol_rx_mpdu_rssi_update(peer, rx_mpdu_desc);
/* /*
@@ -476,7 +477,7 @@ static void process_reorder(ol_txrx_pdev_handle pdev,
if (peer->tids_rx_reorder[tid].win_sz_mask == 0) { if (peer->tids_rx_reorder[tid].win_sz_mask == 0) {
peer->tids_last_seq[tid] = htt_rx_mpdu_desc_seq_num( peer->tids_last_seq[tid] = htt_rx_mpdu_desc_seq_num(
htt_pdev, htt_pdev,
rx_mpdu_desc); rx_mpdu_desc, false);
} }
} }
} /* process_reorder */ } /* process_reorder */

查看文件

@@ -357,7 +357,8 @@ ol_rx_frag_indication_handler(ol_txrx_pdev_handle pdev,
htt_rx_mpdu_desc_list_next(htt_pdev, htt_rx_mpdu_desc_list_next(htt_pdev,
rx_frag_ind_msg); rx_frag_ind_msg);
} }
seq_num = htt_rx_mpdu_desc_seq_num(htt_pdev, rx_mpdu_desc); seq_num = htt_rx_mpdu_desc_seq_num(htt_pdev,
rx_mpdu_desc, true);
OL_RX_ERR_STATISTICS_1(pdev, peer->vdev, peer, rx_mpdu_desc, OL_RX_ERR_STATISTICS_1(pdev, peer->vdev, peer, rx_mpdu_desc,
OL_RX_ERR_NONE_FRAG); OL_RX_ERR_NONE_FRAG);
ol_rx_send_pktlog_event(pdev, peer, head_msdu, pktlog_bit); ol_rx_send_pktlog_event(pdev, peer, head_msdu, pktlog_bit);

查看文件

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2013-2017, 2019 The Linux Foundation. All rights reserved. * Copyright (c) 2011, 2013-2017, 2019-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -171,7 +171,7 @@ ol_rx_pn_check_base(struct ol_txrx_vdev_t *vdev,
new_pn.pn128[1], new_pn.pn128[0], new_pn.pn128[1], new_pn.pn128[0],
new_pn.pn128[0] & 0xffffffffffffULL, new_pn.pn128[0] & 0xffffffffffffULL,
htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, htt_rx_mpdu_desc_seq_num(pdev->htt_pdev,
rx_desc)); rx_desc, false));
} else { } else {
ol_txrx_dbg( ol_txrx_dbg(
"PN check failed - TID %d, peer %pK " "PN check failed - TID %d, peer %pK "
@@ -190,7 +190,7 @@ ol_rx_pn_check_base(struct ol_txrx_vdev_t *vdev,
new_pn.pn128[1], new_pn.pn128[0], new_pn.pn128[1], new_pn.pn128[0],
new_pn.pn128[0] & 0xffffffffffffULL, new_pn.pn128[0] & 0xffffffffffffULL,
htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, htt_rx_mpdu_desc_seq_num(pdev->htt_pdev,
rx_desc)); rx_desc, false));
} }
#if defined(ENABLE_RX_PN_TRACE) #if defined(ENABLE_RX_PN_TRACE)
ol_rx_pn_trace_display(pdev, 1); ol_rx_pn_trace_display(pdev, 1);
@@ -300,7 +300,7 @@ ol_rx_pn_trace_add(struct ol_txrx_pdev_t *pdev,
htt_rx_mpdu_desc_pn(pdev->htt_pdev, rx_desc, &pn, 48); htt_rx_mpdu_desc_pn(pdev->htt_pdev, rx_desc, &pn, 48);
pn32 = pn.pn48 & 0xffffffff; pn32 = pn.pn48 & 0xffffffff;
seq_num = htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_desc); seq_num = htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_desc, false);
unicast = !htt_rx_msdu_is_wlan_mcast(pdev->htt_pdev, rx_desc); unicast = !htt_rx_msdu_is_wlan_mcast(pdev->htt_pdev, rx_desc);
pdev->rx_pn_trace.data[idx].peer = peer; pdev->rx_pn_trace.data[idx].peer = peer;

查看文件

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -162,7 +162,7 @@ ol_rx_seq_num_check(struct ol_txrx_pdev_t *pdev,
uint16_t seq_num = IEEE80211_SEQ_MAX; uint16_t seq_num = IEEE80211_SEQ_MAX;
bool retry = 0; bool retry = 0;
seq_num = htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_mpdu_desc); seq_num = htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_mpdu_desc, false);
/* For mcast packets, we only the dup-detection, not re-order check */ /* For mcast packets, we only the dup-detection, not re-order check */
@@ -294,7 +294,7 @@ ol_rx_reorder_release(struct ol_txrx_vdev_t *vdev,
seq_num = htt_rx_mpdu_desc_seq_num( seq_num = htt_rx_mpdu_desc_seq_num(
htt_pdev, htt_pdev,
htt_rx_msdu_desc_retrieve(htt_pdev, htt_rx_msdu_desc_retrieve(htt_pdev,
head_msdu)); head_msdu), false);
peer->tids_last_seq[tid] = seq_num; peer->tids_last_seq[tid] = seq_num;
/* rx_opt_proc takes a NULL-terminated list of msdu netbufs */ /* rx_opt_proc takes a NULL-terminated list of msdu netbufs */
qdf_nbuf_set_next(tail_msdu, NULL); qdf_nbuf_set_next(tail_msdu, NULL);
@@ -379,7 +379,7 @@ ol_rx_reorder_flush(struct ol_txrx_vdev_t *vdev,
seq_num = htt_rx_mpdu_desc_seq_num( seq_num = htt_rx_mpdu_desc_seq_num(
htt_pdev, htt_pdev,
htt_rx_msdu_desc_retrieve(htt_pdev, head_msdu)); htt_rx_msdu_desc_retrieve(htt_pdev, head_msdu), false);
peer->tids_last_seq[tid] = seq_num; peer->tids_last_seq[tid] = seq_num;
/* rx_opt_proc takes a NULL-terminated list of msdu netbufs */ /* rx_opt_proc takes a NULL-terminated list of msdu netbufs */
qdf_nbuf_set_next(tail_msdu, NULL); qdf_nbuf_set_next(tail_msdu, NULL);
@@ -770,7 +770,8 @@ ol_rx_pn_ind_handler(ol_txrx_pdev_handle pdev,
pn.pn128[0], pn.pn128[0],
pn.pn128[0] & 0xffffffffffffULL, pn.pn128[0] & 0xffffffffffffULL,
htt_rx_mpdu_desc_seq_num(htt_pdev, htt_rx_mpdu_desc_seq_num(htt_pdev,
rx_desc)); rx_desc,
false));
} else { } else {
ol_txrx_dbg( ol_txrx_dbg(
"Tgt PN check failed - TID %d, peer %pK " "Tgt PN check failed - TID %d, peer %pK "
@@ -783,7 +784,8 @@ ol_rx_pn_ind_handler(ol_txrx_pdev_handle pdev,
pn.pn128[0], pn.pn128[0],
pn.pn128[0] & 0xffffffffffffULL, pn.pn128[0] & 0xffffffffffffULL,
htt_rx_mpdu_desc_seq_num(htt_pdev, htt_rx_mpdu_desc_seq_num(htt_pdev,
rx_desc)); rx_desc,
false));
} }
ol_rx_err(pdev->ctrl_pdev, vdev->vdev_id, ol_rx_err(pdev->ctrl_pdev, vdev->vdev_id,
peer->mac_addr.raw, tid, peer->mac_addr.raw, tid,