| From d76744a93246eccdca1106037e8ee29debf48277 Mon Sep 17 00:00:00 2001 |
| From: Amitkumar Karwar <akarwar@marvell.com> |
| Date: Fri, 20 Jun 2014 11:45:25 -0700 |
| Subject: mwifiex: fix Tx timeout issue |
| |
| From: Amitkumar Karwar <akarwar@marvell.com> |
| |
| commit d76744a93246eccdca1106037e8ee29debf48277 upstream. |
| |
| https://bugzilla.kernel.org/show_bug.cgi?id=70191 |
| https://bugzilla.kernel.org/show_bug.cgi?id=77581 |
| |
| It is observed that sometimes Tx packet is downloaded without |
| adding driver's txpd header. This results in firmware parsing |
| garbage data as packet length. Sometimes firmware is unable |
| to read the packet if length comes out as invalid. This stops |
| further traffic and timeout occurs. |
| |
| The root cause is uninitialized fields in tx_info(skb->cb) of |
| packet used to get garbage values. In this case if |
| MWIFIEX_BUF_FLAG_REQUEUED_PKT flag is mistakenly set, txpd |
| header was skipped. This patch makes sure that tx_info is |
| correctly initialized to fix the problem. |
| |
| Reported-by: Andrew Wiley <wiley.andrew.j@gmail.com> |
| Reported-by: Linus Gasser <list@markas-al-nour.org> |
| Reported-by: Michael Hirsch <hirsch@teufel.de> |
| Tested-by: Xinming Hu <huxm@marvell.com> |
| Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> |
| Signed-off-by: Maithili Hinge <maithili@marvell.com> |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/mwifiex/main.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/net/wireless/mwifiex/main.c |
| +++ b/drivers/net/wireless/mwifiex/main.c |
| @@ -646,6 +646,7 @@ mwifiex_hard_start_xmit(struct sk_buff * |
| } |
| |
| tx_info = MWIFIEX_SKB_TXCB(skb); |
| + memset(tx_info, 0, sizeof(*tx_info)); |
| tx_info->bss_num = priv->bss_num; |
| tx_info->bss_type = priv->bss_type; |
| tx_info->pkt_len = skb->len; |