lkml.org 
[lkml]   [2012]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 41/68] mwifiex: fix 11n rx packet drop issue
    Date
    From: Greg KH <gregkh@linuxfoundation.org>

    3.0-stable review patch. If anyone has any objections, please let me know.

    ------------------

    From: Stone Piao <piaoyun@marvell.com>

    commit 925839243dc9aa4ef25305f5afd10ed18258a4ac upstream.

    Currently we check the sequence number of last packet received
    against start_win. If a sequence hole is detected, start_win is
    updated to next sequence number.

    Since the rx sequence number is initialized to 0, a corner case
    exists when BA setup happens immediately after association. As
    0 is a valid sequence number, start_win gets increased to 1
    incorrectly. This causes the first packet with sequence number 0
    being dropped.

    Initialize rx sequence number as 0xffff and skip adjusting
    start_win if the sequence number remains 0xffff. The sequence
    number will be updated once the first packet is received.

    Signed-off-by: Stone Piao <piaoyun@marvell.com>
    Signed-off-by: Avinash Patil <patila@marvell.com>
    Signed-off-by: Kiran Divekar <dkiran@marvell.com>
    Signed-off-by: Bing Zhao <bzhao@marvell.com>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/wireless/mwifiex/11n_rxreorder.c | 5 +++--
    drivers/net/wireless/mwifiex/11n_rxreorder.h | 7 +++++++
    drivers/net/wireless/mwifiex/wmm.c | 2 ++
    3 files changed, 12 insertions(+), 2 deletions(-)

    --- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
    +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
    @@ -267,7 +267,8 @@ mwifiex_11n_create_rx_reorder_tbl(struct
    else
    last_seq = priv->rx_seq[tid];

    - if (last_seq >= new_node->start_win)
    + if (last_seq != MWIFIEX_DEF_11N_RX_SEQ_NUM &&
    + last_seq >= new_node->start_win)
    new_node->start_win = last_seq + 1;

    new_node->win_size = win_size;
    @@ -612,5 +613,5 @@ void mwifiex_11n_cleanup_reorder_tbl(str
    spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);

    INIT_LIST_HEAD(&priv->rx_reorder_tbl_ptr);
    - memset(priv->rx_seq, 0, sizeof(priv->rx_seq));
    + mwifiex_reset_11n_rx_seq_num(priv);
    }
    --- a/drivers/net/wireless/mwifiex/11n_rxreorder.h
    +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.h
    @@ -37,6 +37,13 @@

    #define ADDBA_RSP_STATUS_ACCEPT 0

    +#define MWIFIEX_DEF_11N_RX_SEQ_NUM 0xffff
    +
    +static inline void mwifiex_reset_11n_rx_seq_num(struct mwifiex_private *priv)
    +{
    + memset(priv->rx_seq, 0xff, sizeof(priv->rx_seq));
    +}
    +
    int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *,
    u16 seqNum,
    u16 tid, u8 *ta,
    --- a/drivers/net/wireless/mwifiex/wmm.c
    +++ b/drivers/net/wireless/mwifiex/wmm.c
    @@ -406,6 +406,8 @@ mwifiex_wmm_init(struct mwifiex_adapter
    priv->add_ba_param.tx_win_size = MWIFIEX_AMPDU_DEF_TXWINSIZE;
    priv->add_ba_param.rx_win_size = MWIFIEX_AMPDU_DEF_RXWINSIZE;

    + mwifiex_reset_11n_rx_seq_num(priv);
    +
    atomic_set(&priv->wmm.tx_pkts_queued, 0);
    atomic_set(&priv->wmm.highest_queued_prio, HIGH_PRIO_TID);
    }



    \
     
     \ /
      Last update: 2012-07-13 02:01    [W:4.997 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site