All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] mwifiex: fix RX data stall issue on USB interface
@ 2018-01-22 15:04 Ganapathi Bhat
  2018-01-22 15:04 ` [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB Ganapathi Bhat
  2018-01-22 15:04 ` [PATCH 2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall Ganapathi Bhat
  0 siblings, 2 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-22 15:04 UTC (permalink / raw)
  To: linux-wireless
  Cc: Brian Norris, Cathy Luo, Xinming Hu, Zhiyuan Yang, James Cao,
	Mangesh Malusare, Ganapathi Bhat

This patch series contains 2 fixes to avoid RX data stall on
observed on high through put scenarios on some slower platforms.

Shrenik Shikhare (2):
  mwifiex: schedule rx_work on RX interrupt for USB
  mwifiex: use more_rx_task_flag to avoid USB RX stall

 drivers/net/wireless/marvell/mwifiex/main.c | 17 +++++++++++++----
 drivers/net/wireless/marvell/mwifiex/main.h |  2 ++
 drivers/net/wireless/marvell/mwifiex/usb.c  |  2 ++
 3 files changed, 17 insertions(+), 4 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB
  2018-01-22 15:04 [PATCH 0/2] mwifiex: fix RX data stall issue on USB interface Ganapathi Bhat
@ 2018-01-22 15:04 ` Ganapathi Bhat
  2018-01-25  7:10   ` [1/2] " Kalle Valo
                     ` (2 more replies)
  2018-01-22 15:04 ` [PATCH 2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall Ganapathi Bhat
  1 sibling, 3 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-22 15:04 UTC (permalink / raw)
  To: linux-wireless
  Cc: Brian Norris, Cathy Luo, Xinming Hu, Zhiyuan Yang, James Cao,
	Mangesh Malusare, Shrenik Shikhare, Ganapathi Bhat

From: Shrenik Shikhare <shrenik@marvell.com>

There is race for data_received flag between main thread and
RX data interrupt(mwifiex_usb_rx_complete()):
1. USB received an RX data interrupt, set data_received flag
2. main thread checks data_received, if set queues rx_work
3. rx worker thread independently start processing rx_data_q
4. rx work exits (once rx_data_q is empty)
5. main thread resets the data_received flag(after #2)
6. Now at the corner case there will be high RX data interrupts
between #4 and #5
7. Driver stops submitting URBs to firmware, once rx_pending
exceeds HIGH_RX_PENDING
8. The flag data_received(cleared in #5) will remain unset since
there will be no interrupts from firmware to set it(after #7)

Above scenario causes RX stall in driver, which will finally
result in command/TX timeouts in firmware.

As a fix, queue rx_work directly in mwifiex_usb_rx_complete()
callback, instead in the main thread. This removes dependency
of RX processing on data_received flag.

Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
---
 drivers/net/wireless/marvell/mwifiex/main.c | 7 ++++---
 drivers/net/wireless/marvell/mwifiex/main.h | 1 +
 drivers/net/wireless/marvell/mwifiex/usb.c  | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index 12e7399..6e6e1a7 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -171,7 +171,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
 }
 EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
 
-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
 {
 	unsigned long flags;
 
@@ -183,6 +183,7 @@ static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
 		queue_work(adapter->rx_workqueue, &adapter->rx_work);
 	}
 }
+EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
 
 static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
 {
@@ -283,10 +284,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
 				mwifiex_process_hs_config(adapter);
 			if (adapter->if_ops.process_int_status)
 				adapter->if_ops.process_int_status(adapter);
+			if (adapter->rx_work_enabled && adapter->data_received)
+				mwifiex_queue_rx_work(adapter);
 		}
 
-		if (adapter->rx_work_enabled && adapter->data_received)
-			mwifiex_queue_rx_work(adapter);
 
 		/* Need to wake up the card ? */
 		if ((adapter->ps_state == PS_STATE_SLEEP) &&
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
index 6b5539b..66ba95c 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -1667,6 +1667,7 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv,
 void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter);
 void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
 void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
 int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
 			      int cmd_type,
 			      struct mwifiex_ds_wakeup_reason *wakeup_reason);
diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
index 4bc2448..d20fda1 100644
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
 		skb_queue_tail(&adapter->rx_data_q, skb);
 		adapter->data_received = true;
 		atomic_inc(&adapter->rx_pending);
+		if (adapter->rx_work_enabled)
+			mwifiex_queue_rx_work(adapter);
 		break;
 	default:
 		mwifiex_dbg(adapter, ERROR,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-22 15:04 [PATCH 0/2] mwifiex: fix RX data stall issue on USB interface Ganapathi Bhat
  2018-01-22 15:04 ` [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB Ganapathi Bhat
@ 2018-01-22 15:04 ` Ganapathi Bhat
  2018-01-25  7:12   ` [2/2] " Kalle Valo
       [not found]   ` <20180125071202.0F39560A60@smtp.codeaurora.org>
  1 sibling, 2 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-22 15:04 UTC (permalink / raw)
  To: linux-wireless
  Cc: Brian Norris, Cathy Luo, Xinming Hu, Zhiyuan Yang, James Cao,
	Mangesh Malusare, Shrenik Shikhare, Ganapathi Bhat

From: Shrenik Shikhare <shrenik@marvell.com>

There is a race condition for acquiring rx_proc_lock between
rx worker thread and USB RX data interrupt
(mwifiex_usb_rx_complete):

1. USB receives an RX data interrupt, queues rx_work
2. rx_work empties rx_data_q, tries to acquire rx_proc_lock (to
clear rx_processing flag)
3. While #2 is yet to acquire rx_proc_lock, driver receives
continuous RX data interupts(mwifiex_usb_rx_complete)
3. For each interrupt at #3, driver acquires rx_proc_lock(it gets
the lock since it is in interrupt context), tries to queue
rx_work, but fails to do so since rx_processing is still set(#2)
4. When rx_pending exceeds HIGH_RX_PENDING, driver stops
submitting URBs back to USB subsystem and thus firmware stops
uploading RX data to driver
5. Now finally #2 will acquire rx_proc_lock, but because of #4,
there are no further triggers to schedule rx_work again

The above scenario occurs in some platforms where the RX
processing is comparitively slower. This results in RX stall in
driver, command/TX timeouts in firmware. The above scenario is
introduced after commit c7dbdcb2a4e1
("mwifiex: schedule rx_work on RX interrupt for USB")

To fix this set a new more_rx_task_flag whenever RX data callback
is trying to schedule rx_work but rx_processing is not yet
cleared. This will let the current rx_work(which was waiting for
rx_proc_lock) to loopback and process newly arrived RX packets.

Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
---
 drivers/net/wireless/marvell/mwifiex/main.c | 10 +++++++++-
 drivers/net/wireless/marvell/mwifiex/main.h |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index 6e6e1a7..ea87c7c 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -163,6 +163,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
 	spin_lock_irqsave(&adapter->main_proc_lock, flags);
 	if (adapter->mwifiex_processing) {
 		adapter->more_task_flag = true;
+		adapter->more_rx_task_flag = true;
 		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
 	} else {
 		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
@@ -177,6 +178,7 @@ void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
 
 	spin_lock_irqsave(&adapter->rx_proc_lock, flags);
 	if (adapter->rx_processing) {
+		adapter->more_rx_task_flag = true;
 		spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
 	} else {
 		spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
@@ -193,13 +195,14 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
 
 	spin_lock_irqsave(&adapter->rx_proc_lock, flags);
 	if (adapter->rx_processing || adapter->rx_locked) {
+		adapter->more_rx_task_flag = true;
 		spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
 		goto exit_rx_proc;
 	} else {
 		adapter->rx_processing = true;
 		spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
 	}
-
+rx_process_start:
 	/* Check for Rx data */
 	while ((skb = skb_dequeue(&adapter->rx_data_q))) {
 		atomic_dec(&adapter->rx_pending);
@@ -221,6 +224,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
 		}
 	}
 	spin_lock_irqsave(&adapter->rx_proc_lock, flags);
+	if (adapter->more_rx_task_flag) {
+		adapter->more_rx_task_flag = false;
+		spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
+		goto rx_process_start;
+	}
 	adapter->rx_processing = false;
 	spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
 
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
index 66ba95c..242e05e 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -891,6 +891,7 @@ struct mwifiex_adapter {
 	spinlock_t main_proc_lock;
 	u32 mwifiex_processing;
 	u8 more_task_flag;
+	u8 more_rx_task_flag;
 	u16 tx_buf_size;
 	u16 curr_tx_buf_size;
 	/* sdio single port rx aggregation capability */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [1/2] mwifiex: schedule rx_work on RX interrupt for USB
  2018-01-22 15:04 ` [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB Ganapathi Bhat
@ 2018-01-25  7:10   ` Kalle Valo
       [not found]   ` <20180125071052.E370660A4E@smtp.codeaurora.org>
  2018-01-25 18:59   ` [PATCH 1/2] " Brian Norris
  2 siblings, 0 replies; 19+ messages in thread
From: Kalle Valo @ 2018-01-25  7:10 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare,
	Ganapathi Bhat

Ganapathi Bhat <gbhat@marvell.com> wrote:

> From: Shrenik Shikhare <shrenik@marvell.com>
> 
> There is race for data_received flag between main thread and
> RX data interrupt(mwifiex_usb_rx_complete()):
> 1. USB received an RX data interrupt, set data_received flag
> 2. main thread checks data_received, if set queues rx_work
> 3. rx worker thread independently start processing rx_data_q
> 4. rx work exits (once rx_data_q is empty)
> 5. main thread resets the data_received flag(after #2)
> 6. Now at the corner case there will be high RX data interrupts
> between #4 and #5
> 7. Driver stops submitting URBs to firmware, once rx_pending
> exceeds HIGH_RX_PENDING
> 8. The flag data_received(cleared in #5) will remain unset since
> there will be no interrupts from firmware to set it(after #7)
> 
> Above scenario causes RX stall in driver, which will finally
> result in command/TX timeouts in firmware.
> 
> As a fix, queue rx_work directly in mwifiex_usb_rx_complete()
> callback, instead in the main thread. This removes dependency
> of RX processing on data_received flag.
> 
> Signed-off-by: Cathy Luo <cluo@marvell.com>
> Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>

Brian, did you have a chance to review these two?

-- 
https://patchwork.kernel.org/patch/10178731/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-22 15:04 ` [PATCH 2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall Ganapathi Bhat
@ 2018-01-25  7:12   ` Kalle Valo
  2018-01-25  7:13     ` Kalle Valo
       [not found]   ` <20180125071202.0F39560A60@smtp.codeaurora.org>
  1 sibling, 1 reply; 19+ messages in thread
From: Kalle Valo @ 2018-01-25  7:12 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare,
	Ganapathi Bhat

Ganapathi Bhat <gbhat@marvell.com> wrote:

> From: Shrenik Shikhare <shrenik@marvell.com>
> 
> There is a race condition for acquiring rx_proc_lock between
> rx worker thread and USB RX data interrupt
> (mwifiex_usb_rx_complete):
> 
> 1. USB receives an RX data interrupt, queues rx_work
> 2. rx_work empties rx_data_q, tries to acquire rx_proc_lock (to
> clear rx_processing flag)
> 3. While #2 is yet to acquire rx_proc_lock, driver receives
> continuous RX data interupts(mwifiex_usb_rx_complete)
> 3. For each interrupt at #3, driver acquires rx_proc_lock(it gets
> the lock since it is in interrupt context), tries to queue
> rx_work, but fails to do so since rx_processing is still set(#2)
> 4. When rx_pending exceeds HIGH_RX_PENDING, driver stops
> submitting URBs back to USB subsystem and thus firmware stops
> uploading RX data to driver
> 5. Now finally #2 will acquire rx_proc_lock, but because of #4,
> there are no further triggers to schedule rx_work again
> 
> The above scenario occurs in some platforms where the RX
> processing is comparitively slower. This results in RX stall in
> driver, command/TX timeouts in firmware. The above scenario is
> introduced after commit c7dbdcb2a4e1
> ("mwifiex: schedule rx_work on RX interrupt for USB")
> 
> To fix this set a new more_rx_task_flag whenever RX data callback
> is trying to schedule rx_work but rx_processing is not yet
> cleared. This will let the current rx_work(which was waiting for
> rx_proc_lock) to loopback and process newly arrived RX packets.
> 
> Signed-off-by: Cathy Luo <cluo@marvell.com>
> Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>

I can't find any commit with id c7dbdcb2a4e1, is it correct?

-- 
https://patchwork.kernel.org/patch/10178729/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25  7:12   ` [2/2] " Kalle Valo
@ 2018-01-25  7:13     ` Kalle Valo
  2018-01-25 10:02       ` [EXT] " Ganapathi Bhat
  0 siblings, 1 reply; 19+ messages in thread
From: Kalle Valo @ 2018-01-25  7:13 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

Kalle Valo <kvalo@codeaurora.org> writes:

> Ganapathi Bhat <gbhat@marvell.com> wrote:
>
>> From: Shrenik Shikhare <shrenik@marvell.com>
>> 
>> There is a race condition for acquiring rx_proc_lock between
>> rx worker thread and USB RX data interrupt
>> (mwifiex_usb_rx_complete):
>> 
>> 1. USB receives an RX data interrupt, queues rx_work
>> 2. rx_work empties rx_data_q, tries to acquire rx_proc_lock (to
>> clear rx_processing flag)
>> 3. While #2 is yet to acquire rx_proc_lock, driver receives
>> continuous RX data interupts(mwifiex_usb_rx_complete)
>> 3. For each interrupt at #3, driver acquires rx_proc_lock(it gets
>> the lock since it is in interrupt context), tries to queue
>> rx_work, but fails to do so since rx_processing is still set(#2)
>> 4. When rx_pending exceeds HIGH_RX_PENDING, driver stops
>> submitting URBs back to USB subsystem and thus firmware stops
>> uploading RX data to driver
>> 5. Now finally #2 will acquire rx_proc_lock, but because of #4,
>> there are no further triggers to schedule rx_work again
>> 
>> The above scenario occurs in some platforms where the RX
>> processing is comparitively slower. This results in RX stall in
>> driver, command/TX timeouts in firmware. The above scenario is
>> introduced after commit c7dbdcb2a4e1
>> ("mwifiex: schedule rx_work on RX interrupt for USB")
>> 
>> To fix this set a new more_rx_task_flag whenever RX data callback
>> is trying to schedule rx_work but rx_processing is not yet
>> cleared. This will let the current rx_work(which was waiting for
>> rx_proc_lock) to loopback and process newly arrived RX packets.
>> 
>> Signed-off-by: Cathy Luo <cluo@marvell.com>
>> Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
>
> I can't find any commit with id c7dbdcb2a4e1, is it correct?

Oh, and please use Fixes line to mark the commit which broke this.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
       [not found]   ` <20180125071202.0F39560A60@smtp.codeaurora.org>
@ 2018-01-25  9:59     ` Ganapathi Bhat
  2018-01-25 12:59       ` Kalle Valo
  2018-01-25 18:33       ` Brian Norris
  0 siblings, 2 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-25  9:59 UTC (permalink / raw)
  To: Kalle Valo
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

SGkgS2FsbGUsDQo+DQo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gR2FuYXBhdGhpIEJoYXQgPGdiaGF0QG1h
cnZlbGwuY29tPiB3cm90ZToNCj4NCj4gPiBGcm9tOiBTaHJlbmlrIFNoaWtoYXJlIDxzaHJlbmlr
QG1hcnZlbGwuY29tPg0KPiA+DQo+ID4gVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBmb3IgYWNx
dWlyaW5nIHJ4X3Byb2NfbG9jayBiZXR3ZWVuIHJ4IHdvcmtlcg0KPiA+IHRocmVhZCBhbmQgVVNC
IFJYIGRhdGEgaW50ZXJydXB0DQo+ID4gKG13aWZpZXhfdXNiX3J4X2NvbXBsZXRlKToNCj4gPg0K
PiA+IDEuIFVTQiByZWNlaXZlcyBhbiBSWCBkYXRhIGludGVycnVwdCwgcXVldWVzIHJ4X3dvcmsg
Mi4gcnhfd29yaw0KPiA+IGVtcHRpZXMgcnhfZGF0YV9xLCB0cmllcyB0byBhY3F1aXJlIHJ4X3By
b2NfbG9jayAodG8gY2xlYXINCj4gPiByeF9wcm9jZXNzaW5nIGZsYWcpIDMuIFdoaWxlICMyIGlz
IHlldCB0byBhY3F1aXJlIHJ4X3Byb2NfbG9jaywgZHJpdmVyDQo+ID4gcmVjZWl2ZXMgY29udGlu
dW91cyBSWCBkYXRhIGludGVydXB0cyhtd2lmaWV4X3VzYl9yeF9jb21wbGV0ZSkNCj4gPiAzLiBG
b3IgZWFjaCBpbnRlcnJ1cHQgYXQgIzMsIGRyaXZlciBhY3F1aXJlcyByeF9wcm9jX2xvY2soaXQg
Z2V0cyB0aGUNCj4gPiBsb2NrIHNpbmNlIGl0IGlzIGluIGludGVycnVwdCBjb250ZXh0KSwgdHJp
ZXMgdG8gcXVldWUgcnhfd29yaywgYnV0DQo+ID4gZmFpbHMgdG8gZG8gc28gc2luY2UgcnhfcHJv
Y2Vzc2luZyBpcyBzdGlsbCBzZXQoIzIpIDQuIFdoZW4gcnhfcGVuZGluZw0KPiA+IGV4Y2VlZHMg
SElHSF9SWF9QRU5ESU5HLCBkcml2ZXIgc3RvcHMgc3VibWl0dGluZyBVUkJzIGJhY2sgdG8gVVNC
DQo+ID4gc3Vic3lzdGVtIGFuZCB0aHVzIGZpcm13YXJlIHN0b3BzIHVwbG9hZGluZyBSWCBkYXRh
IHRvIGRyaXZlciA1LiBOb3cNCj4gPiBmaW5hbGx5ICMyIHdpbGwgYWNxdWlyZSByeF9wcm9jX2xv
Y2ssIGJ1dCBiZWNhdXNlIG9mICM0LCB0aGVyZSBhcmUgbm8NCj4gPiBmdXJ0aGVyIHRyaWdnZXJz
IHRvIHNjaGVkdWxlIHJ4X3dvcmsgYWdhaW4NCj4gPg0KPiA+IFRoZSBhYm92ZSBzY2VuYXJpbyBv
Y2N1cnMgaW4gc29tZSBwbGF0Zm9ybXMgd2hlcmUgdGhlIFJYIHByb2Nlc3NpbmcgaXMNCj4gPiBj
b21wYXJpdGl2ZWx5IHNsb3dlci4gVGhpcyByZXN1bHRzIGluIFJYIHN0YWxsIGluIGRyaXZlciwg
Y29tbWFuZC9UWA0KPiA+IHRpbWVvdXRzIGluIGZpcm13YXJlLiBUaGUgYWJvdmUgc2NlbmFyaW8g
aXMgaW50cm9kdWNlZCBhZnRlciBjb21taXQNCj4gPiBjN2RiZGNiMmE0ZTENCj4gPiAoIm13aWZp
ZXg6IHNjaGVkdWxlIHJ4X3dvcmsgb24gUlggaW50ZXJydXB0IGZvciBVU0IiKQ0KPiA+DQo+ID4g
VG8gZml4IHRoaXMgc2V0IGEgbmV3IG1vcmVfcnhfdGFza19mbGFnIHdoZW5ldmVyIFJYIGRhdGEg
Y2FsbGJhY2sgaXMNCj4gPiB0cnlpbmcgdG8gc2NoZWR1bGUgcnhfd29yayBidXQgcnhfcHJvY2Vz
c2luZyBpcyBub3QgeWV0IGNsZWFyZWQuIFRoaXMNCj4gPiB3aWxsIGxldCB0aGUgY3VycmVudCBy
eF93b3JrKHdoaWNoIHdhcyB3YWl0aW5nIGZvcg0KPiA+IHJ4X3Byb2NfbG9jaykgdG8gbG9vcGJh
Y2sgYW5kIHByb2Nlc3MgbmV3bHkgYXJyaXZlZCBSWCBwYWNrZXRzLg0KPiA+DQo+ID4gU2lnbmVk
LW9mZi1ieTogQ2F0aHkgTHVvIDxjbHVvQG1hcnZlbGwuY29tPg0KPiA+IFNpZ25lZC1vZmYtYnk6
IEdhbmFwYXRoaSBCaGF0IDxnYmhhdEBtYXJ2ZWxsLmNvbT4NCj4NCj4gSSBjYW4ndCBmaW5kIGFu
eSBjb21taXQgd2l0aCBpZCBjN2RiZGNiMmE0ZTEsIGlzIGl0IGNvcnJlY3Q/DQpDb3JyZWN0LiBB
Y3R1YWxseSB0aGUgY29tbWl0IGlkIGM3ZGJkY2IyYTRlMSBpcyB0aGUgUEFUQ0ggWzEvMl0gc2Vu
dCBpbiB0aGlzIHNlcmllcy4NCj4NCj4gLS0NCj4gaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9y
Zy9wYXRjaC8xMDE3ODcyOS8NCj4NCj4gaHR0cHM6Ly93aXJlbGVzcy53aWtpLmtlcm5lbC5vcmcv
ZW4vZGV2ZWxvcGVycy9kb2N1bWVudGF0aW9uL3N1Ym1pdHRpbmdwDQo+IGF0Y2hlcw0KUmVnYXJk
cywNCkdhbmFwYXRoaQ0K

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25  7:13     ` Kalle Valo
@ 2018-01-25 10:02       ` Ganapathi Bhat
  0 siblings, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-25 10:02 UTC (permalink / raw)
  To: Kalle Valo
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

Hi Kalle,

> ----------------------------------------------------------------------
> Kalle Valo <kvalo@codeaurora.org> writes:
>
> > Ganapathi Bhat <gbhat@marvell.com> wrote:
> >
> >> From: Shrenik Shikhare <shrenik@marvell.com>
> >>
> >> There is a race condition for acquiring rx_proc_lock between rx
> >> worker thread and USB RX data interrupt
> >> (mwifiex_usb_rx_complete):
> >>
> >> 1. USB receives an RX data interrupt, queues rx_work 2. rx_work
> >> empties rx_data_q, tries to acquire rx_proc_lock (to clear
> >> rx_processing flag) 3. While #2 is yet to acquire rx_proc_lock,
> >> driver receives continuous RX data interupts(mwifiex_usb_rx_complete)
> >> 3. For each interrupt at #3, driver acquires rx_proc_lock(it gets the
> >> lock since it is in interrupt context), tries to queue rx_work, but
> >> fails to do so since rx_processing is still set(#2) 4. When
> >> rx_pending exceeds HIGH_RX_PENDING, driver stops submitting URBs
> back
> >> to USB subsystem and thus firmware stops uploading RX data to driver
> >> 5. Now finally #2 will acquire rx_proc_lock, but because of #4, there
> >> are no further triggers to schedule rx_work again
> >>
> >> The above scenario occurs in some platforms where the RX processing
> >> is comparitively slower. This results in RX stall in driver,
> >> command/TX timeouts in firmware. The above scenario is introduced
> >> after commit c7dbdcb2a4e1
> >> ("mwifiex: schedule rx_work on RX interrupt for USB")
> >>
> >> To fix this set a new more_rx_task_flag whenever RX data callback is
> >> trying to schedule rx_work but rx_processing is not yet cleared. This
> >> will let the current rx_work(which was waiting for
> >> rx_proc_lock) to loopback and process newly arrived RX packets.
> >>
> >> Signed-off-by: Cathy Luo <cluo@marvell.com>
> >> Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
> >
> > I can't find any commit with id c7dbdcb2a4e1, is it correct?
>
> Oh, and please use Fixes line to mark the commit which broke this.
Ok Sure.  I will do that and send v2.
>
> --
> Kalle Valo
Regards,
Ganapathi

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25  9:59     ` Ganapathi Bhat
@ 2018-01-25 12:59       ` Kalle Valo
  2018-01-25 13:26         ` Ganapathi Bhat
  2018-01-25 18:33       ` Brian Norris
  1 sibling, 1 reply; 19+ messages in thread
From: Kalle Valo @ 2018-01-25 12:59 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

Ganapathi Bhat <gbhat@marvell.com> writes:

>> > The above scenario occurs in some platforms where the RX processing is
>> > comparitively slower. This results in RX stall in driver, command/TX
>> > timeouts in firmware. The above scenario is introduced after commit
>> > c7dbdcb2a4e1
>> > ("mwifiex: schedule rx_work on RX interrupt for USB")
>> >
>> > To fix this set a new more_rx_task_flag whenever RX data callback is
>> > trying to schedule rx_work but rx_processing is not yet cleared. This
>> > will let the current rx_work(which was waiting for
>> > rx_proc_lock) to loopback and process newly arrived RX packets.
>> >
>> > Signed-off-by: Cathy Luo <cluo@marvell.com>
>> > Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
>>
>> I can't find any commit with id c7dbdcb2a4e1, is it correct?
>
> Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent in this series.

Actually the commit id will be different, I just tested it to be sure:

$ git reset --hard master
HEAD is now at b69c1df47281 brcmfmac: separate firmware errors from i/o errors
$ git am -s -3 1.patch
Applying: mwifiex: schedule rx_work on RX interrupt for USB
$ git log --oneline -1 | cat
676bc4833907 mwifiex: schedule rx_work on RX interrupt for USB
$ git reset --hard master
HEAD is now at b69c1df47281 brcmfmac: separate firmware errors from i/o errors
$ git am -s -3 1.patch
Applying: mwifiex: schedule rx_work on RX interrupt for USB
$ git log --oneline -1 | cat
74c5fc1d45b4 mwifiex: schedule rx_work on RX interrupt for USB
$ 

So the date, and most likely also the commiter, is included when
calculating the hash. So you can't really refer to uncommited patches
using a commit id as the id is determined only once the maintainer
applies the patch.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25 12:59       ` Kalle Valo
@ 2018-01-25 13:26         ` Ganapathi Bhat
  0 siblings, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-25 13:26 UTC (permalink / raw)
  To: Kalle Valo
  Cc: linux-wireless, Brian Norris, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

Hi Kalle,

> -----Original Message-----
> From: Kalle Valo [mailto:kvalo@codeaurora.org]
> Sent: Thursday, January 25, 2018 6:29 PM
> To: Ganapathi Bhat
> Cc: linux-wireless@vger.kernel.org; Brian Norris; Cathy Luo; Xinming Hu;
> Zhiyuan Yang; James Cao; Mangesh Malusare; Shrenik Shikhare
> Subject: Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX
> stall
>
> Ganapathi Bhat <gbhat@marvell.com> writes:
>
> >> > The above scenario occurs in some platforms where the RX processing
> >> > is comparitively slower. This results in RX stall in driver,
> >> > command/TX timeouts in firmware. The above scenario is introduced
> >> > after commit
> >> > c7dbdcb2a4e1
> >> > ("mwifiex: schedule rx_work on RX interrupt for USB")
> >> >
> >> > To fix this set a new more_rx_task_flag whenever RX data callback
> >> > is trying to schedule rx_work but rx_processing is not yet cleared.
> >> > This will let the current rx_work(which was waiting for
> >> > rx_proc_lock) to loopback and process newly arrived RX packets.
> >> >
> >> > Signed-off-by: Cathy Luo <cluo@marvell.com>
> >> > Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
> >>
> >> I can't find any commit with id c7dbdcb2a4e1, is it correct?
> >
> > Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent in this
> series.
>
> Actually the commit id will be different, I just tested it to be sure:
>
> $ git reset --hard master
> HEAD is now at b69c1df47281 brcmfmac: separate firmware errors from i/o
> errors $ git am -s -3 1.patch
> Applying: mwifiex: schedule rx_work on RX interrupt for USB $ git log --
> oneline -1 | cat
> 676bc4833907 mwifiex: schedule rx_work on RX interrupt for USB $ git reset -
> -hard master HEAD is now at b69c1df47281 brcmfmac: separate firmware
> errors from i/o errors $ git am -s -3 1.patch
> Applying: mwifiex: schedule rx_work on RX interrupt for USB $ git log --
> oneline -1 | cat
> 74c5fc1d45b4 mwifiex: schedule rx_work on RX interrupt for USB $
>
> So the date, and most likely also the commiter, is included when calculating
> the hash. So you can't really refer to uncommited patches using a commit id
> as the id is determined only once the maintainer applies the patch.
Ok. So, what can be done in this case. Should we wait for 1st patch to be committed and then send v3 of second patch?
>
> --
> Kalle Valo
Regards,
Ganapathi

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [1/2] mwifiex: schedule rx_work on RX interrupt for USB
       [not found]   ` <20180125071052.E370660A4E@smtp.codeaurora.org>
@ 2018-01-25 18:32     ` Brian Norris
  0 siblings, 0 replies; 19+ messages in thread
From: Brian Norris @ 2018-01-25 18:32 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Ganapathi Bhat, linux-wireless, Cathy Luo, Xinming Hu,
	Zhiyuan Yang, James Cao, Mangesh Malusare, Shrenik Shikhare

On Thu, Jan 25, 2018 at 07:10:52AM +0000, Kalle Valo wrote:
> Ganapathi Bhat <gbhat@marvell.com> wrote:
> 
> > From: Shrenik Shikhare <shrenik@marvell.com>
> > 
> > There is race for data_received flag between main thread and
> > RX data interrupt(mwifiex_usb_rx_complete()):
> > 1. USB received an RX data interrupt, set data_received flag
> > 2. main thread checks data_received, if set queues rx_work
> > 3. rx worker thread independently start processing rx_data_q
> > 4. rx work exits (once rx_data_q is empty)
> > 5. main thread resets the data_received flag(after #2)
> > 6. Now at the corner case there will be high RX data interrupts
> > between #4 and #5
> > 7. Driver stops submitting URBs to firmware, once rx_pending
> > exceeds HIGH_RX_PENDING
> > 8. The flag data_received(cleared in #5) will remain unset since
> > there will be no interrupts from firmware to set it(after #7)
> > 
> > Above scenario causes RX stall in driver, which will finally
> > result in command/TX timeouts in firmware.
> > 
> > As a fix, queue rx_work directly in mwifiex_usb_rx_complete()
> > callback, instead in the main thread. This removes dependency
> > of RX processing on data_received flag.
> > 
> > Signed-off-by: Cathy Luo <cluo@marvell.com>
> > Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
> 
> Brian, did you have a chance to review these two?

Not really. I don't generally make a lot of time to review the USB
driver unless it's really screwing around with the main driver, since I
don't use the USB driver. But I'll try to give it a few glances.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25  9:59     ` Ganapathi Bhat
  2018-01-25 12:59       ` Kalle Valo
@ 2018-01-25 18:33       ` Brian Norris
  2018-01-29  7:17         ` Ganapathi Bhat
  2018-01-29  7:19         ` Ganapathi Bhat
  1 sibling, 2 replies; 19+ messages in thread
From: Brian Norris @ 2018-01-25 18:33 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

On Thu, Jan 25, 2018 at 09:59:04AM +0000, Ganapathi Bhat wrote:
> > I can't find any commit with id c7dbdcb2a4e1, is it correct?
> Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent in this series.

What? Why would you introduce a bug and only fix it in the next patch?
Does that mean you should just combine the two? Or reverse the order, if
patch 2 doesn't cause problems on its own?

Brian

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB
  2018-01-22 15:04 ` [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB Ganapathi Bhat
  2018-01-25  7:10   ` [1/2] " Kalle Valo
       [not found]   ` <20180125071052.E370660A4E@smtp.codeaurora.org>
@ 2018-01-25 18:59   ` Brian Norris
  2018-01-29  7:21     ` [EXT] " Ganapathi Bhat
  2 siblings, 1 reply; 19+ messages in thread
From: Brian Norris @ 2018-01-25 18:59 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang, James Cao,
	Mangesh Malusare, Shrenik Shikhare

On Mon, Jan 22, 2018 at 08:34:56PM +0530, Ganapathi Bhat wrote:
> From: Shrenik Shikhare <shrenik@marvell.com>
> 
> There is race for data_received flag between main thread and
> RX data interrupt(mwifiex_usb_rx_complete()):
> 1. USB received an RX data interrupt, set data_received flag
> 2. main thread checks data_received, if set queues rx_work

Stop right there.

There is a flag, data_received, and as you say, you are setting it one
thread, and reading it in another thread (and later clearing it; step
#5). Where is the locking? There is none. Therefore, you have a data
race.

You are not resolving any locking problems here, so you're not really
solving the entire problem.

Brian

> 3. rx worker thread independently start processing rx_data_q
> 4. rx work exits (once rx_data_q is empty)
> 5. main thread resets the data_received flag(after #2)
> 6. Now at the corner case there will be high RX data interrupts
> between #4 and #5
> 7. Driver stops submitting URBs to firmware, once rx_pending
> exceeds HIGH_RX_PENDING
> 8. The flag data_received(cleared in #5) will remain unset since
> there will be no interrupts from firmware to set it(after #7)
> 
> Above scenario causes RX stall in driver, which will finally
> result in command/TX timeouts in firmware.
> 
> As a fix, queue rx_work directly in mwifiex_usb_rx_complete()
> callback, instead in the main thread. This removes dependency
> of RX processing on data_received flag.
> 
> Signed-off-by: Cathy Luo <cluo@marvell.com>
> Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
> ---
>  drivers/net/wireless/marvell/mwifiex/main.c | 7 ++++---
>  drivers/net/wireless/marvell/mwifiex/main.h | 1 +
>  drivers/net/wireless/marvell/mwifiex/usb.c  | 2 ++
>  3 files changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
> index 12e7399..6e6e1a7 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.c
> +++ b/drivers/net/wireless/marvell/mwifiex/main.c
> @@ -171,7 +171,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
>  }
>  EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
>  
> -static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
> +void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
>  {
>  	unsigned long flags;
>  
> @@ -183,6 +183,7 @@ static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
>  		queue_work(adapter->rx_workqueue, &adapter->rx_work);
>  	}
>  }
> +EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
>  
>  static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
>  {
> @@ -283,10 +284,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
>  				mwifiex_process_hs_config(adapter);
>  			if (adapter->if_ops.process_int_status)
>  				adapter->if_ops.process_int_status(adapter);
> +			if (adapter->rx_work_enabled && adapter->data_received)
> +				mwifiex_queue_rx_work(adapter);
>  		}
>  
> -		if (adapter->rx_work_enabled && adapter->data_received)
> -			mwifiex_queue_rx_work(adapter);
>  
>  		/* Need to wake up the card ? */
>  		if ((adapter->ps_state == PS_STATE_SLEEP) &&
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
> index 6b5539b..66ba95c 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.h
> +++ b/drivers/net/wireless/marvell/mwifiex/main.h
> @@ -1667,6 +1667,7 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv,
>  void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter);
>  void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
>  void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
> +void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
>  int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
>  			      int cmd_type,
>  			      struct mwifiex_ds_wakeup_reason *wakeup_reason);
> diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
> index 4bc2448..d20fda1 100644
> --- a/drivers/net/wireless/marvell/mwifiex/usb.c
> +++ b/drivers/net/wireless/marvell/mwifiex/usb.c
> @@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
>  		skb_queue_tail(&adapter->rx_data_q, skb);
>  		adapter->data_received = true;
>  		atomic_inc(&adapter->rx_pending);
> +		if (adapter->rx_work_enabled)
> +			mwifiex_queue_rx_work(adapter);
>  		break;
>  	default:
>  		mwifiex_dbg(adapter, ERROR,
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25 18:33       ` Brian Norris
@ 2018-01-29  7:17         ` Ganapathi Bhat
  2018-01-29  7:19         ` Ganapathi Bhat
  1 sibling, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-29  7:17 UTC (permalink / raw)
  To: Brian Norris
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

Hi Brian,

> -----Original Message-----
> From: Brian Norris [mailto:briannorris@chromium.org]
> Sent: Friday, January 26, 2018 12:04 AM
> To: Ganapathi Bhat
> Cc: Kalle Valo; linux-wireless@vger.kernel.org; Cathy Luo; Xinming Hu;
> Zhiyuan Yang; James Cao; Mangesh Malusare; Shrenik Shikhare
> Subject: Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX
> stall
>
> On Thu, Jan 25, 2018 at 09:59:04AM +0000, Ganapathi Bhat wrote:
> > > I can't find any commit with id c7dbdcb2a4e1, is it correct?
> > Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent in this
> series.
>
> What? Why would you introduce a bug and only fix it in the next patch?
With the first patch the original issue took considerably longer time to recreate. Also it followed a different path to get recreated(shared in commit message).
> Does that mean you should just combine the two?
Let us know if that is fine to merge them. We can modify the commit message accordingly.
> Or reverse the order, if patch 2 doesn't cause problems on its own?
Patch 2 has a dependency on patch 1.
>
> Brian

Regards,
Ganapathi

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-25 18:33       ` Brian Norris
  2018-01-29  7:17         ` Ganapathi Bhat
@ 2018-01-29  7:19         ` Ganapathi Bhat
  2018-01-29 22:08           ` Brian Norris
  1 sibling, 1 reply; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-29  7:19 UTC (permalink / raw)
  To: Brian Norris
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

Hi Brian,

> -----Original Message-----
> From: Ganapathi Bhat
> Sent: Monday, January 29, 2018 12:47 PM
> To: 'Brian Norris'
> Cc: Kalle Valo; linux-wireless@vger.kernel.org; Cathy Luo; Xinming Hu;
> Zhiyuan Yang; James Cao; Mangesh Malusare; Shrenik Shikhare
> Subject: RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX
> stall
>
> Hi Brian,
>
> > -----Original Message-----
> > From: Brian Norris [mailto:briannorris@chromium.org]
> > Sent: Friday, January 26, 2018 12:04 AM
> > To: Ganapathi Bhat
> > Cc: Kalle Valo; linux-wireless@vger.kernel.org; Cathy Luo; Xinming Hu;
> > Zhiyuan Yang; James Cao; Mangesh Malusare; Shrenik Shikhare
> > Subject: Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid
> > USB RX stall
> >
> > On Thu, Jan 25, 2018 at 09:59:04AM +0000, Ganapathi Bhat wrote:
> > > > I can't find any commit with id c7dbdcb2a4e1, is it correct?
> > > Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent
> > > in this
> > series.
> >
> > What? Why would you introduce a bug and only fix it in the next patch?
> With the first patch the original issue took considerably longer time to
> recreate. Also it followed a different path to get recreated(shared in commit
> message).
> > Does that mean you should just combine the two?
> Let us know if that is fine to merge them. We can modify the commit
> message accordingly.
> > Or reverse the order, if patch 2 doesn't cause problems on its own?
> Patch 2 has a dependency on patch 1.
One correction. There is no commit dependency between patch 1 and 2(they can be applied in any order). But the result would be same. We need both fixes. Let us know if we can combine them.
> >
> > Brian
>
> Regards,
> Ganapathi

Regards,
Ganapathi

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB
  2018-01-25 18:59   ` [PATCH 1/2] " Brian Norris
@ 2018-01-29  7:21     ` Ganapathi Bhat
  0 siblings, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-29  7:21 UTC (permalink / raw)
  To: Brian Norris
  Cc: linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang, James Cao,
	Mangesh Malusare, Shrenik Shikhare

Hi Brian,
> -----Original Message-----
> From: Brian Norris [mailto:briannorris@chromium.org]
> Sent: Friday, January 26, 2018 12:30 AM
> To: Ganapathi Bhat
> Cc: linux-wireless@vger.kernel.org; Cathy Luo; Xinming Hu; Zhiyuan Yang;
> James Cao; Mangesh Malusare; Shrenik Shikhare
> Subject: [EXT] Re: [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for
> USB
>
> External Email
>
> ----------------------------------------------------------------------
> On Mon, Jan 22, 2018 at 08:34:56PM +0530, Ganapathi Bhat wrote:
> > From: Shrenik Shikhare <shrenik@marvell.com>
> >
> > There is race for data_received flag between main thread and RX data
> > interrupt(mwifiex_usb_rx_complete()):
> > 1. USB received an RX data interrupt, set data_received flag 2. main
> > thread checks data_received, if set queues rx_work
>
> Stop right there.
>
> There is a flag, data_received, and as you say, you are setting it one thread,
> and reading it in another thread (and later clearing it; step #5). Where is the
> locking? There is none. Therefore, you have a data race.
Yes. We missed it. We will add the locking and send it in v3.
>
> You are not resolving any locking problems here, so you're not really solving
> the entire problem.
>
> Brian
>
> > 3. rx worker thread independently start processing rx_data_q 4. rx
> > work exits (once rx_data_q is empty) 5. main thread resets the
> > data_received flag(after #2) 6. Now at the corner case there will be
> > high RX data interrupts between #4 and #5 7. Driver stops submitting
> > URBs to firmware, once rx_pending exceeds HIGH_RX_PENDING 8. The
> flag
> > data_received(cleared in #5) will remain unset since there will be no
> > interrupts from firmware to set it(after #7)
> >
> > Above scenario causes RX stall in driver, which will finally result in
> > command/TX timeouts in firmware.
> >
> > As a fix, queue rx_work directly in mwifiex_usb_rx_complete()
> > callback, instead in the main thread. This removes dependency of RX
> > processing on data_received flag.
> >
> > Signed-off-by: Cathy Luo <cluo@marvell.com>
> > Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
> > ---
> >  drivers/net/wireless/marvell/mwifiex/main.c | 7 ++++---
> > drivers/net/wireless/marvell/mwifiex/main.h | 1 +
> > drivers/net/wireless/marvell/mwifiex/usb.c  | 2 ++
> >  3 files changed, 7 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/net/wireless/marvell/mwifiex/main.c
> > b/drivers/net/wireless/marvell/mwifiex/main.c
> > index 12e7399..6e6e1a7 100644
> > --- a/drivers/net/wireless/marvell/mwifiex/main.c
> > +++ b/drivers/net/wireless/marvell/mwifiex/main.c
> > @@ -171,7 +171,7 @@ void mwifiex_queue_main_work(struct
> > mwifiex_adapter *adapter)  }
> > EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
> >
> > -static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
> > +void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
> >  {
> >     unsigned long flags;
> >
> > @@ -183,6 +183,7 @@ static void mwifiex_queue_rx_work(struct
> mwifiex_adapter *adapter)
> >             queue_work(adapter->rx_workqueue, &adapter->rx_work);
> >     }
> >  }
> > +EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
> >
> >  static int mwifiex_process_rx(struct mwifiex_adapter *adapter)  { @@
> > -283,10 +284,10 @@ int mwifiex_main_process(struct mwifiex_adapter
> *adapter)
> >                             mwifiex_process_hs_config(adapter);
> >                     if (adapter->if_ops.process_int_status)
> >                             adapter-
> >if_ops.process_int_status(adapter);
> > +                   if (adapter->rx_work_enabled && adapter-
> >data_received)
> > +                           mwifiex_queue_rx_work(adapter);
> >             }
> >
> > -           if (adapter->rx_work_enabled && adapter->data_received)
> > -                   mwifiex_queue_rx_work(adapter);
> >
> >             /* Need to wake up the card ? */
> >             if ((adapter->ps_state == PS_STATE_SLEEP) && diff --git
> > a/drivers/net/wireless/marvell/mwifiex/main.h
> > b/drivers/net/wireless/marvell/mwifiex/main.h
> > index 6b5539b..66ba95c 100644
> > --- a/drivers/net/wireless/marvell/mwifiex/main.h
> > +++ b/drivers/net/wireless/marvell/mwifiex/main.h
> > @@ -1667,6 +1667,7 @@ u8 mwifiex_adjust_data_rate(struct
> > mwifiex_private *priv,  void mwifiex_upload_device_dump(struct
> > mwifiex_adapter *adapter);  void *mwifiex_alloc_dma_align_buf(int
> > rx_len, gfp_t flags);  void mwifiex_queue_main_work(struct
> > mwifiex_adapter *adapter);
> > +void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
> >  int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
> >                           int cmd_type,
> >                           struct mwifiex_ds_wakeup_reason
> *wakeup_reason); diff --git
> > a/drivers/net/wireless/marvell/mwifiex/usb.c
> > b/drivers/net/wireless/marvell/mwifiex/usb.c
> > index 4bc2448..d20fda1 100644
> > --- a/drivers/net/wireless/marvell/mwifiex/usb.c
> > +++ b/drivers/net/wireless/marvell/mwifiex/usb.c
> > @@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter
> *adapter,
> >             skb_queue_tail(&adapter->rx_data_q, skb);
> >             adapter->data_received = true;
> >             atomic_inc(&adapter->rx_pending);
> > +           if (adapter->rx_work_enabled)
> > +                   mwifiex_queue_rx_work(adapter);
> >             break;
> >     default:
> >             mwifiex_dbg(adapter, ERROR,
> > --
> > 1.9.1
> >
Regards,
Ganapathi

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-29  7:19         ` Ganapathi Bhat
@ 2018-01-29 22:08           ` Brian Norris
  2018-01-30 15:25             ` Ganapathi Bhat
  2018-01-31  6:59             ` Ganapathi Bhat
  0 siblings, 2 replies; 19+ messages in thread
From: Brian Norris @ 2018-01-29 22:08 UTC (permalink / raw)
  To: Ganapathi Bhat
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

Hi,

On Sun, Jan 28, 2018 at 11:19 PM, Ganapathi Bhat <gbhat@marvell.com> wrote:
>> From: Ganapathi Bhat
>> > From: Brian Norris [mailto:briannorris@chromium.org]
>> > On Thu, Jan 25, 2018 at 09:59:04AM +0000, Ganapathi Bhat wrote:
>> > > > I can't find any commit with id c7dbdcb2a4e1, is it correct?
>> > > Correct. Actually the commit id c7dbdcb2a4e1 is the PATCH [1/2] sent
>> > > in this
>> > series.
>> >
>> > What? Why would you introduce a bug and only fix it in the next patch?
>> With the first patch the original issue took considerably longer time to
>> recreate. Also it followed a different path to get recreated(shared in commit
>> message).
>> > Does that mean you should just combine the two?
>> Let us know if that is fine to merge them. We can modify the commit
>> message accordingly.
>> > Or reverse the order, if patch 2 doesn't cause problems on its own?
>> Patch 2 has a dependency on patch 1.
> One correction. There is no commit dependency between patch 1 and 2(they can be applied in any order). But the result would be same. We need both fixes. Let us know if we can combine them.

I haven't closely looked at patch 2 yet. My only statement was that it
makes no sense to have 2 commits, with the second one labeled as
"Fixing" the first one. From your descriptions, it sounds like patch 2
should actually come first, but I'm not really sure. I only looked far
enough to say that I didn't like patch 1 as-is :)

Brian

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-29 22:08           ` Brian Norris
@ 2018-01-30 15:25             ` Ganapathi Bhat
  2018-01-31  6:59             ` Ganapathi Bhat
  1 sibling, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-30 15:25 UTC (permalink / raw)
  To: Brian Norris
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnJpYW4g
Tm9ycmlzIFttYWlsdG86YnJpYW5ub3JyaXNAY2hyb21pdW0ub3JnXQ0KPiBTZW50OiBUdWVzZGF5
LCBKYW51YXJ5IDMwLCAyMDE4IDM6MzggQU0NCj4gVG86IEdhbmFwYXRoaSBCaGF0DQo+IENjOiBL
YWxsZSBWYWxvOyBsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmc7IENhdGh5IEx1bzsgWGlu
bWluZyBIdTsNCj4gWmhpeXVhbiBZYW5nOyBKYW1lcyBDYW87IE1hbmdlc2ggTWFsdXNhcmU7IFNo
cmVuaWsgU2hpa2hhcmUNCj4gU3ViamVjdDogUmU6IFtFWFRdIFJlOiBbMi8yXSBtd2lmaWV4OiB1
c2UgbW9yZV9yeF90YXNrX2ZsYWcgdG8gYXZvaWQgVVNCIFJYDQo+IHN0YWxsDQo+DQo+IEhpLA0K
Pg0KPiBPbiBTdW4sIEphbiAyOCwgMjAxOCBhdCAxMToxOSBQTSwgR2FuYXBhdGhpIEJoYXQgPGdi
aGF0QG1hcnZlbGwuY29tPg0KPiB3cm90ZToNCj4gPj4gRnJvbTogR2FuYXBhdGhpIEJoYXQNCj4g
Pj4gPiBGcm9tOiBCcmlhbiBOb3JyaXMgW21haWx0bzpicmlhbm5vcnJpc0BjaHJvbWl1bS5vcmdd
IE9uIFRodSwgSmFuDQo+ID4+ID4gMjUsIDIwMTggYXQgMDk6NTk6MDRBTSArMDAwMCwgR2FuYXBh
dGhpIEJoYXQgd3JvdGU6DQo+ID4+ID4gPiA+IEkgY2FuJ3QgZmluZCBhbnkgY29tbWl0IHdpdGgg
aWQgYzdkYmRjYjJhNGUxLCBpcyBpdCBjb3JyZWN0Pw0KPiA+PiA+ID4gQ29ycmVjdC4gQWN0dWFs
bHkgdGhlIGNvbW1pdCBpZCBjN2RiZGNiMmE0ZTEgaXMgdGhlIFBBVENIIFsxLzJdDQo+ID4+ID4g
PiBzZW50IGluIHRoaXMNCj4gPj4gPiBzZXJpZXMuDQo+ID4+ID4NCj4gPj4gPiBXaGF0PyBXaHkg
d291bGQgeW91IGludHJvZHVjZSBhIGJ1ZyBhbmQgb25seSBmaXggaXQgaW4gdGhlIG5leHQgcGF0
Y2g/DQo+ID4+IFdpdGggdGhlIGZpcnN0IHBhdGNoIHRoZSBvcmlnaW5hbCBpc3N1ZSB0b29rIGNv
bnNpZGVyYWJseSBsb25nZXIgdGltZQ0KPiA+PiB0byByZWNyZWF0ZS4gQWxzbyBpdCBmb2xsb3dl
ZCBhIGRpZmZlcmVudCBwYXRoIHRvIGdldA0KPiA+PiByZWNyZWF0ZWQoc2hhcmVkIGluIGNvbW1p
dCBtZXNzYWdlKS4NCj4gPj4gPiBEb2VzIHRoYXQgbWVhbiB5b3Ugc2hvdWxkIGp1c3QgY29tYmlu
ZSB0aGUgdHdvPw0KPiA+PiBMZXQgdXMga25vdyBpZiB0aGF0IGlzIGZpbmUgdG8gbWVyZ2UgdGhl
bS4gV2UgY2FuIG1vZGlmeSB0aGUgY29tbWl0DQo+ID4+IG1lc3NhZ2UgYWNjb3JkaW5nbHkuDQo+
ID4+ID4gT3IgcmV2ZXJzZSB0aGUgb3JkZXIsIGlmIHBhdGNoIDIgZG9lc24ndCBjYXVzZSBwcm9i
bGVtcyBvbiBpdHMgb3duPw0KPiA+PiBQYXRjaCAyIGhhcyBhIGRlcGVuZGVuY3kgb24gcGF0Y2gg
MS4NCj4gPiBPbmUgY29ycmVjdGlvbi4gVGhlcmUgaXMgbm8gY29tbWl0IGRlcGVuZGVuY3kgYmV0
d2VlbiBwYXRjaCAxIGFuZA0KPiAyKHRoZXkgY2FuIGJlIGFwcGxpZWQgaW4gYW55IG9yZGVyKS4g
QnV0IHRoZSByZXN1bHQgd291bGQgYmUgc2FtZS4gV2UgbmVlZA0KPiBib3RoIGZpeGVzLiBMZXQg
dXMga25vdyBpZiB3ZSBjYW4gY29tYmluZSB0aGVtLg0KPg0KPiBJIGhhdmVuJ3QgY2xvc2VseSBs
b29rZWQgYXQgcGF0Y2ggMiB5ZXQuIE15IG9ubHkgc3RhdGVtZW50IHdhcyB0aGF0IGl0IG1ha2Vz
DQo+IG5vIHNlbnNlIHRvIGhhdmUgMiBjb21taXRzLCB3aXRoIHRoZSBzZWNvbmQgb25lIGxhYmVs
ZWQgYXMgIkZpeGluZyIgdGhlIGZpcnN0DQo+IG9uZS4gRnJvbSB5b3VyIGRlc2NyaXB0aW9ucywg
aXQgc291bmRzIGxpa2UgcGF0Y2ggMiBzaG91bGQgYWN0dWFsbHkgY29tZSBmaXJzdCwNCk9rLiBJ
IHVuZGVyc3RhbmQuIEkgd2lsbCByZW9yZGVyIHRoZW0gYW5kIHNlbmQgdjMoYWxvbmcgd2l0aCBz
cGlubG9jayBjaGFuZ2UpLg0KPiBidXQgSSdtIG5vdCByZWFsbHkgc3VyZS4gSSBvbmx5IGxvb2tl
ZCBmYXIgZW5vdWdoIHRvIHNheSB0aGF0IEkgZGlkbid0IGxpa2UgcGF0Y2gNCj4gMSBhcy1pcyA6
KQ0KPg0KPiBCcmlhbg0KUmVnYXJkcywNCkdhbmFwYXRoaQ0K

^ permalink raw reply	[flat|nested] 19+ messages in thread

* RE: [EXT] Re: [2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall
  2018-01-29 22:08           ` Brian Norris
  2018-01-30 15:25             ` Ganapathi Bhat
@ 2018-01-31  6:59             ` Ganapathi Bhat
  1 sibling, 0 replies; 19+ messages in thread
From: Ganapathi Bhat @ 2018-01-31  6:59 UTC (permalink / raw)
  To: Brian Norris
  Cc: Kalle Valo, linux-wireless, Cathy Luo, Xinming Hu, Zhiyuan Yang,
	James Cao, Mangesh Malusare, Shrenik Shikhare

SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogR2FuYXBh
dGhpIEJoYXQNCj4gU2VudDogVHVlc2RheSwgSmFudWFyeSAzMCwgMjAxOCA4OjU1IFBNDQo+IFRv
OiAnQnJpYW4gTm9ycmlzJw0KPiBDYzogS2FsbGUgVmFsbzsgbGludXgtd2lyZWxlc3NAdmdlci5r
ZXJuZWwub3JnOyBDYXRoeSBMdW87IFhpbm1pbmcgSHU7DQo+IFpoaXl1YW4gWWFuZzsgSmFtZXMg
Q2FvOyBNYW5nZXNoIE1hbHVzYXJlOyBTaHJlbmlrIFNoaWtoYXJlDQo+IFN1YmplY3Q6IFJFOiBb
RVhUXSBSZTogWzIvMl0gbXdpZmlleDogdXNlIG1vcmVfcnhfdGFza19mbGFnIHRvIGF2b2lkIFVT
QiBSWA0KPiBzdGFsbA0KPg0KPiBIaSBCcmlhbiwNCj4NCj4gPiAtLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQ0KPiA+IEZyb206IEJyaWFuIE5vcnJpcyBbbWFpbHRvOmJyaWFubm9ycmlzQGNocm9t
aXVtLm9yZ10NCj4gPiBTZW50OiBUdWVzZGF5LCBKYW51YXJ5IDMwLCAyMDE4IDM6MzggQU0NCj4g
PiBUbzogR2FuYXBhdGhpIEJoYXQNCj4gPiBDYzogS2FsbGUgVmFsbzsgbGludXgtd2lyZWxlc3NA
dmdlci5rZXJuZWwub3JnOyBDYXRoeSBMdW87IFhpbm1pbmcgSHU7DQo+ID4gWmhpeXVhbiBZYW5n
OyBKYW1lcyBDYW87IE1hbmdlc2ggTWFsdXNhcmU7IFNocmVuaWsgU2hpa2hhcmUNCj4gPiBTdWJq
ZWN0OiBSZTogW0VYVF0gUmU6IFsyLzJdIG13aWZpZXg6IHVzZSBtb3JlX3J4X3Rhc2tfZmxhZyB0
byBhdm9pZA0KPiA+IFVTQiBSWCBzdGFsbA0KPiA+DQo+ID4gSGksDQo+ID4NCj4gPiBPbiBTdW4s
IEphbiAyOCwgMjAxOCBhdCAxMToxOSBQTSwgR2FuYXBhdGhpIEJoYXQgPGdiaGF0QG1hcnZlbGwu
Y29tPg0KPiA+IHdyb3RlOg0KPiA+ID4+IEZyb206IEdhbmFwYXRoaSBCaGF0DQo+ID4gPj4gPiBG
cm9tOiBCcmlhbiBOb3JyaXMgW21haWx0bzpicmlhbm5vcnJpc0BjaHJvbWl1bS5vcmddIE9uIFRo
dSwgSmFuDQo+ID4gPj4gPiAyNSwgMjAxOCBhdCAwOTo1OTowNEFNICswMDAwLCBHYW5hcGF0aGkg
QmhhdCB3cm90ZToNCj4gPiA+PiA+ID4gPiBJIGNhbid0IGZpbmQgYW55IGNvbW1pdCB3aXRoIGlk
IGM3ZGJkY2IyYTRlMSwgaXMgaXQgY29ycmVjdD8NCj4gPiA+PiA+ID4gQ29ycmVjdC4gQWN0dWFs
bHkgdGhlIGNvbW1pdCBpZCBjN2RiZGNiMmE0ZTEgaXMgdGhlIFBBVENIIFsxLzJdDQo+ID4gPj4g
PiA+IHNlbnQgaW4gdGhpcw0KPiA+ID4+ID4gc2VyaWVzLg0KPiA+ID4+ID4NCj4gPiA+PiA+IFdo
YXQ/IFdoeSB3b3VsZCB5b3UgaW50cm9kdWNlIGEgYnVnIGFuZCBvbmx5IGZpeCBpdCBpbiB0aGUg
bmV4dA0KPiBwYXRjaD8NCj4gPiA+PiBXaXRoIHRoZSBmaXJzdCBwYXRjaCB0aGUgb3JpZ2luYWwg
aXNzdWUgdG9vayBjb25zaWRlcmFibHkgbG9uZ2VyDQo+ID4gPj4gdGltZSB0byByZWNyZWF0ZS4g
QWxzbyBpdCBmb2xsb3dlZCBhIGRpZmZlcmVudCBwYXRoIHRvIGdldA0KPiA+ID4+IHJlY3JlYXRl
ZChzaGFyZWQgaW4gY29tbWl0IG1lc3NhZ2UpLg0KPiA+ID4+ID4gRG9lcyB0aGF0IG1lYW4geW91
IHNob3VsZCBqdXN0IGNvbWJpbmUgdGhlIHR3bz8NCj4gPiA+PiBMZXQgdXMga25vdyBpZiB0aGF0
IGlzIGZpbmUgdG8gbWVyZ2UgdGhlbS4gV2UgY2FuIG1vZGlmeSB0aGUgY29tbWl0DQo+ID4gPj4g
bWVzc2FnZSBhY2NvcmRpbmdseS4NCj4gPiA+PiA+IE9yIHJldmVyc2UgdGhlIG9yZGVyLCBpZiBw
YXRjaCAyIGRvZXNuJ3QgY2F1c2UgcHJvYmxlbXMgb24gaXRzIG93bj8NCj4gPiA+PiBQYXRjaCAy
IGhhcyBhIGRlcGVuZGVuY3kgb24gcGF0Y2ggMS4NCj4gPiA+IE9uZSBjb3JyZWN0aW9uLiBUaGVy
ZSBpcyBubyBjb21taXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHBhdGNoIDEgYW5kDQo+ID4gMih0aGV5
IGNhbiBiZSBhcHBsaWVkIGluIGFueSBvcmRlcikuIEJ1dCB0aGUgcmVzdWx0IHdvdWxkIGJlIHNh
bWUuIFdlDQo+ID4gbmVlZCBib3RoIGZpeGVzLiBMZXQgdXMga25vdyBpZiB3ZSBjYW4gY29tYmlu
ZSB0aGVtLg0KPiA+DQo+ID4gSSBoYXZlbid0IGNsb3NlbHkgbG9va2VkIGF0IHBhdGNoIDIgeWV0
LiBNeSBvbmx5IHN0YXRlbWVudCB3YXMgdGhhdCBpdA0KPiA+IG1ha2VzIG5vIHNlbnNlIHRvIGhh
dmUgMiBjb21taXRzLCB3aXRoIHRoZSBzZWNvbmQgb25lIGxhYmVsZWQgYXMNCj4gPiAiRml4aW5n
IiB0aGUgZmlyc3Qgb25lLiBGcm9tIHlvdXIgZGVzY3JpcHRpb25zLCBpdCBzb3VuZHMgbGlrZSBw
YXRjaCAyDQo+ID4gc2hvdWxkIGFjdHVhbGx5IGNvbWUgZmlyc3QsDQo+IE9rLiBJIHVuZGVyc3Rh
bmQuIEkgd2lsbCByZW9yZGVyIHRoZW0gYW5kIHNlbmQgdjMoYWxvbmcgd2l0aCBzcGlubG9jaw0K
PiBjaGFuZ2UpLg0KSSB3YXMgdHJ5aW5nIHRvIHJlb3JkZXIgdGhlIHBhdGNoIGJ1dCBmb3VuZCBw
YXRjaCAyIGlzIGluZGVlZCBkZXBlbmRlbnQgb24gcGF0Y2ggMS4gQ29uc2lkZXIgdGhlIGZpcnN0
IHBvaW50IGluIGNvbW1pdCBtZXNzYWdlIG9mIHBhdGNoIDI6DQoxLiBVU0IgcmVjZWl2ZXMgYW4g
UlggZGF0YSBpbnRlcnJ1cHQsIHF1ZXVlcyByeF93b3JrDQpUaGlzIGlzIHRoZSBjaGFuZ2UgYWRk
ZWQgaW4gcGF0Y2ggMS4gRWFybGllciBvbiByZWNlaXZlIG9mIFJYIGRhdGEgaW50ZXJydXB0LCBk
cml2ZXIgd291bGQgcXVldWUgbWFpbl93b3JrLCB3aGljaCBpbiB0dXJuIHF1ZXVlZCByeF93b3Jr
LiBCdXQgYWZ0ZXIgcGF0Y2ggMSBkcml2ZXIgdHJpZXMgdG8gIHF1ZXVlIHJ4X3dvcmsgaW4gaW50
ZXJydXB0IGNvbnRleHQuDQoNCkxldCB1cyBwbGVhc2Uga25vdyB5b3VyIHRob3VnaHRzIG9uIHRo
aXMuDQoNCj4gPiBidXQgSSdtIG5vdCByZWFsbHkgc3VyZS4gSSBvbmx5IGxvb2tlZCBmYXIgZW5v
dWdoIHRvIHNheSB0aGF0IEkgZGlkbid0DQo+ID4gbGlrZSBwYXRjaA0KPiA+IDEgYXMtaXMgOikN
Cj4gPg0KPiA+IEJyaWFuDQo+IFJlZ2FyZHMsDQo+IEdhbmFwYXRoaQ0K

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2018-01-31  6:59 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-22 15:04 [PATCH 0/2] mwifiex: fix RX data stall issue on USB interface Ganapathi Bhat
2018-01-22 15:04 ` [PATCH 1/2] mwifiex: schedule rx_work on RX interrupt for USB Ganapathi Bhat
2018-01-25  7:10   ` [1/2] " Kalle Valo
     [not found]   ` <20180125071052.E370660A4E@smtp.codeaurora.org>
2018-01-25 18:32     ` Brian Norris
2018-01-25 18:59   ` [PATCH 1/2] " Brian Norris
2018-01-29  7:21     ` [EXT] " Ganapathi Bhat
2018-01-22 15:04 ` [PATCH 2/2] mwifiex: use more_rx_task_flag to avoid USB RX stall Ganapathi Bhat
2018-01-25  7:12   ` [2/2] " Kalle Valo
2018-01-25  7:13     ` Kalle Valo
2018-01-25 10:02       ` [EXT] " Ganapathi Bhat
     [not found]   ` <20180125071202.0F39560A60@smtp.codeaurora.org>
2018-01-25  9:59     ` Ganapathi Bhat
2018-01-25 12:59       ` Kalle Valo
2018-01-25 13:26         ` Ganapathi Bhat
2018-01-25 18:33       ` Brian Norris
2018-01-29  7:17         ` Ganapathi Bhat
2018-01-29  7:19         ` Ganapathi Bhat
2018-01-29 22:08           ` Brian Norris
2018-01-30 15:25             ` Ganapathi Bhat
2018-01-31  6:59             ` Ganapathi Bhat

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.