From: Karthik Ananthapadmanabha <karthida@xxxxxxxxxxx> Fix the incorrect usage of rx_pkt_lock spinlock. Realsing the spinlock while the element is still in process is unsafe. The lock must be released only after the element processing is complete. Signed-off-by: Karthik Ananthapadmanabha <karthida@xxxxxxxxxxx> Signed-off-by: Ganapathi Bhat <gbhat@xxxxxxxxxxx> --- drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c b/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c index 1edcdda..0149c4a 100644 --- a/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c +++ b/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c @@ -124,9 +124,10 @@ static int mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv, void *payload) rx_tmp_ptr = tbl->rx_reorder_ptr[i]; tbl->rx_reorder_ptr[i] = NULL; } - spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); if (rx_tmp_ptr) mwifiex_11n_dispatch_pkt(priv, rx_tmp_ptr); + + spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); } spin_lock_irqsave(&priv->rx_pkt_lock, flags); @@ -167,8 +168,8 @@ static int mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv, void *payload) } rx_tmp_ptr = tbl->rx_reorder_ptr[i]; tbl->rx_reorder_ptr[i] = NULL; - spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); mwifiex_11n_dispatch_pkt(priv, rx_tmp_ptr); + spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); } spin_lock_irqsave(&priv->rx_pkt_lock, flags); -- 1.9.1