@@ -302,6 +302,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
302
302
new_node -> start_win = last_seq + 1 ;
303
303
304
304
new_node -> win_size = win_size ;
305
+ new_node -> flags = 0 ;
305
306
306
307
new_node -> rx_reorder_ptr = kzalloc (sizeof (void * ) * win_size ,
307
308
GFP_KERNEL );
@@ -457,13 +458,20 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
457
458
* If seq_num is less then starting win then ignore and drop the
458
459
* packet
459
460
*/
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 ))) {
463
473
return -1 ;
464
- } else if ((seq_num < start_win ) ||
465
- (seq_num > (start_win + TWOPOW11 ))) {
466
- return -1 ;
474
+ }
467
475
}
468
476
469
477
/*
@@ -474,8 +482,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
474
482
seq_num = ((seq_num + win_size ) - 1 ) & (MAX_TID_VALUE - 1 );
475
483
476
484
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 )) ||
479
486
((end_win > start_win ) && ((seq_num > end_win ) ||
480
487
(seq_num < start_win )))) {
481
488
end_win = seq_num ;
@@ -637,3 +644,29 @@ void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv)
637
644
INIT_LIST_HEAD (& priv -> rx_reorder_tbl_ptr );
638
645
mwifiex_reset_11n_rx_seq_num (priv );
639
646
}
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
+ }
0 commit comments