Skip to content

Commit 2db96c3

Browse files
Avinash Patillinvjw
authored andcommitted
mwifiex: enhance RX reordering to avoid packet drop during host sleep
Once hostsleep is activated, this patch takes care of not dropping packets in RX reorder table. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
1 parent ff9bd2d commit 2db96c3

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

drivers/net/wireless/mwifiex/11n_rxreorder.c

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
302302
new_node->start_win = last_seq + 1;
303303

304304
new_node->win_size = win_size;
305+
new_node->flags = 0;
305306

306307
new_node->rx_reorder_ptr = kzalloc(sizeof(void *) * win_size,
307308
GFP_KERNEL);
@@ -457,13 +458,20 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
457458
* If seq_num is less then starting win then ignore and drop the
458459
* packet
459460
*/
460-
if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {/* Wrap */
461-
if (seq_num >= ((start_win + TWOPOW11) &
462-
(MAX_TID_VALUE - 1)) && (seq_num < start_win))
461+
if (tbl->flags & RXREOR_FORCE_NO_DROP) {
462+
dev_dbg(priv->adapter->dev,
463+
"RXREOR_FORCE_NO_DROP when HS is activated\n");
464+
tbl->flags &= ~RXREOR_FORCE_NO_DROP;
465+
} else {
466+
if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {
467+
if (seq_num >= ((start_win + TWOPOW11) &
468+
(MAX_TID_VALUE - 1)) &&
469+
seq_num < start_win)
470+
return -1;
471+
} else if ((seq_num < start_win) ||
472+
(seq_num > (start_win + TWOPOW11))) {
463473
return -1;
464-
} else if ((seq_num < start_win) ||
465-
(seq_num > (start_win + TWOPOW11))) {
466-
return -1;
474+
}
467475
}
468476

469477
/*
@@ -474,8 +482,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
474482
seq_num = ((seq_num + win_size) - 1) & (MAX_TID_VALUE - 1);
475483

476484
if (((end_win < start_win) &&
477-
(seq_num < (TWOPOW11 - (MAX_TID_VALUE - start_win))) &&
478-
(seq_num > end_win)) ||
485+
(seq_num < start_win) && (seq_num > end_win)) ||
479486
((end_win > start_win) && ((seq_num > end_win) ||
480487
(seq_num < start_win)))) {
481488
end_win = seq_num;
@@ -637,3 +644,29 @@ void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv)
637644
INIT_LIST_HEAD(&priv->rx_reorder_tbl_ptr);
638645
mwifiex_reset_11n_rx_seq_num(priv);
639646
}
647+
648+
/*
649+
* This function updates all rx_reorder_tbl's flags.
650+
*/
651+
void mwifiex_update_rxreor_flags(struct mwifiex_adapter *adapter, u8 flags)
652+
{
653+
struct mwifiex_private *priv;
654+
struct mwifiex_rx_reorder_tbl *tbl;
655+
unsigned long lock_flags;
656+
int i;
657+
658+
for (i = 0; i < adapter->priv_num; i++) {
659+
priv = adapter->priv[i];
660+
if (!priv)
661+
continue;
662+
if (list_empty(&priv->rx_reorder_tbl_ptr))
663+
continue;
664+
665+
spin_lock_irqsave(&priv->rx_reorder_tbl_lock, lock_flags);
666+
list_for_each_entry(tbl, &priv->rx_reorder_tbl_ptr, list)
667+
tbl->flags = flags;
668+
spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, lock_flags);
669+
}
670+
671+
return;
672+
}

drivers/net/wireless/mwifiex/11n_rxreorder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
#define BA_SETUP_MAX_PACKET_THRESHOLD 16
4242
#define BA_SETUP_PACKET_OFFSET 16
4343

44+
enum mwifiex_rxreor_flags {
45+
RXREOR_FORCE_NO_DROP = 1<<0,
46+
};
47+
4448
static inline void mwifiex_reset_11n_rx_seq_num(struct mwifiex_private *priv)
4549
{
4650
memset(priv->rx_seq, 0xff, sizeof(priv->rx_seq));
@@ -73,5 +77,6 @@ struct mwifiex_rx_reorder_tbl *mwifiex_11n_get_rxreorder_tbl(struct
7377
struct mwifiex_rx_reorder_tbl *
7478
mwifiex_11n_get_rx_reorder_tbl(struct mwifiex_private *priv, int tid, u8 *ta);
7579
void mwifiex_11n_del_rx_reorder_tbl_by_ta(struct mwifiex_private *priv, u8 *ta);
80+
void mwifiex_update_rxreor_flags(struct mwifiex_adapter *adapter, u8 flags);
7681

7782
#endif /* _MWIFIEX_11N_RXREORDER_H_ */

drivers/net/wireless/mwifiex/cmdevt.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,8 @@ mwifiex_hs_activated_event(struct mwifiex_private *priv, u8 activated)
10881088
if (activated) {
10891089
if (priv->adapter->is_hs_configured) {
10901090
priv->adapter->hs_activated = true;
1091+
mwifiex_update_rxreor_flags(priv->adapter,
1092+
RXREOR_FORCE_NO_DROP);
10911093
dev_dbg(priv->adapter->dev, "event: hs_activated\n");
10921094
priv->adapter->hs_activate_wait_q_woken = true;
10931095
wake_up_interruptible(

drivers/net/wireless/mwifiex/main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ struct mwifiex_rx_reorder_tbl {
535535
int win_size;
536536
void **rx_reorder_ptr;
537537
struct reorder_tmr_cnxt timer_context;
538+
u8 flags;
538539
};
539540

540541
struct mwifiex_bss_prio_node {

0 commit comments

Comments
 (0)