2015-01-23 07:16:46

by James Cameron

[permalink] [raw]
Subject: [RFC PATCH] mwifiex: handle command response in aggregation

Firmware does occasionally pass a command response to the host on the
data port. Ensure it is processed.

http://dev.laptop.org/ticket/12749
---
Seen on device firmwares:

14.66.9.p96
14.66.35.p52

Others not tested.

drivers/net/wireless/mwifiex/sdio.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 933dae1..8fe6147 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -1240,8 +1240,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
/* copy pkt to deaggr buf */
skb_deaggr = card->mpa_rx.skb_arr[pind];

- if ((pkt_type == MWIFIEX_TYPE_DATA) && (pkt_len <=
- card->mpa_rx.len_arr[pind])) {
+ if (pkt_len <= card->mpa_rx.len_arr[pind]) {

memcpy(skb_deaggr->data, curr_ptr, pkt_len);

@@ -1251,7 +1250,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
mwifiex_decode_rx_packet(adapter, skb_deaggr,
pkt_type);
} else {
- dev_err(adapter->dev, "wrong aggr pkt:"
+ dev_err(adapter->dev, "bad aggr pkt:"
" type=%d len=%d max_len=%d\n",
pkt_type, pkt_len,
card->mpa_rx.len_arr[pind]);
--
1.9.1


--
James Cameron
http://quozl.linux.org.au/


2015-02-03 08:59:24

by Amitkumar Karwar

[permalink] [raw]
Subject: RE: [RFC PATCH] mwifiex: handle command response in aggregation

Hi James,

>From: [email protected] [mailto:[email protected]]
>Sent: 23 January 2015 12:46
>To: Amitkumar Karwar; Avinash Patil
>Cc: [email protected]
>Subject: [RFC PATCH] mwifiex: handle command response in aggregation
>
>Firmware does occasionally pass a command response to the host on the
>data port. Ensure it is processed.
>
>http://dev.laptop.org/ticket/12749
>---
>Seen on device firmwares:
>
> 14.66.9.p96
> 14.66.35.p52
>
>Others not tested.
>
> drivers/net/wireless/mwifiex/sdio.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/net/wireless/mwifiex/sdio.c
>b/drivers/net/wireless/mwifiex/sdio.c
>index 933dae1..8fe6147 100644
>--- a/drivers/net/wireless/mwifiex/sdio.c
>+++ b/drivers/net/wireless/mwifiex/sdio.c
>@@ -1240,8 +1240,7 @@ static int
>mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
> /* copy pkt to deaggr buf */
> skb_deaggr = card->mpa_rx.skb_arr[pind];
>
>- if ((pkt_type == MWIFIEX_TYPE_DATA) && (pkt_len <=
>- card->mpa_rx.len_arr[pind])) {
>+ if (pkt_len <= card->mpa_rx.len_arr[pind]) {
>
> memcpy(skb_deaggr->data, curr_ptr, pkt_len);
>
>@@ -1251,7 +1250,7 @@ static int
>mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
> mwifiex_decode_rx_packet(adapter, skb_deaggr,
> pkt_type);
> } else {
>- dev_err(adapter->dev, "wrong aggr pkt:"
>+ dev_err(adapter->dev, "bad aggr pkt:"
> " type=%d len=%d max_len=%d\n",
> pkt_type, pkt_len,
> card->mpa_rx.len_arr[pind]);
>--
>1.9.1
>
>

We checked with our firmware engineer. There is no possibility of receiving command response on data port. Probably this is a corrupted data received on SDIO. If possible, could you print this data and share log?

Regards,
Amit