linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] Bluetooth: btmrvl: Fix concurrent FW download
@ 2013-04-22  9:10 Andreas Fenkart
  2013-04-22  9:10 ` [PATCH v3 1/2] Bluetooth: btmrvl: release lock while waiting for fw download complete Andreas Fenkart
  2013-04-22  9:10 ` [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out Andreas Fenkart
  0 siblings, 2 replies; 4+ messages in thread
From: Andreas Fenkart @ 2013-04-22  9:10 UTC (permalink / raw)
  To: marcel
  Cc: gustavo, johan.hedberg, linux-bluetooth, andrei.emeltchenko,
	akarwar, bzhao, zonque, Andreas Fenkart

This is a resend.

Andreas Fenkart (2):
  Bluetooth: btmrvl: release lock while waiting for fw download
    complete.
  Bluetooth: btmrvl: report error if verify_fw_download times out.

 drivers/bluetooth/btmrvl_sdio.c |   39 ++++++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 17 deletions(-)

-- 
1.7.10.4

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

* [PATCH v3 1/2] Bluetooth: btmrvl: release lock while waiting for fw download complete.
  2013-04-22  9:10 [PATCH v3 0/2] Bluetooth: btmrvl: Fix concurrent FW download Andreas Fenkart
@ 2013-04-22  9:10 ` Andreas Fenkart
  2013-04-22  9:10 ` [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out Andreas Fenkart
  1 sibling, 0 replies; 4+ messages in thread
From: Andreas Fenkart @ 2013-04-22  9:10 UTC (permalink / raw)
  To: marcel
  Cc: gustavo, johan.hedberg, linux-bluetooth, andrei.emeltchenko,
	akarwar, bzhao, zonque, Andreas Fenkart

If not winner, driver must release the sdio host lock, so the fw
download can progress. While holding the lock fw download is stalled
and the following error is produced:

[  235.746015] Bluetooth: FW failed to be active in time!
[  235.752799] Bluetooth: Downloading firmware failed!

Signed-off-by: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
---
 drivers/bluetooth/btmrvl_sdio.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 9959d4c..c7ec727 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -234,7 +234,10 @@ static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card,
 
 	 /* Wait for firmware to become ready */
 	for (tries = 0; tries < pollnum; tries++) {
-		if (btmrvl_sdio_read_fw_status(card, &firmwarestat) < 0)
+		sdio_claim_host(card->func);
+		ret = btmrvl_sdio_read_fw_status(card, &firmwarestat);
+		sdio_release_host(card->func);
+		if (ret < 0)
 			continue;
 
 		if (firmwarestat == FIRMWARE_READY) {
@@ -882,13 +885,14 @@ static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card)
 		BT_ERR("card or function is NULL!");
 		return -EINVAL;
 	}
-	sdio_claim_host(card->func);
 
 	if (!btmrvl_sdio_verify_fw_download(card, 1)) {
 		BT_DBG("Firmware already downloaded!");
-		goto done;
+		return 0;
 	}
 
+	sdio_claim_host(card->func);
+
 	/* Check if other function driver is downloading the firmware */
 	fws0 = sdio_readb(card->func, card->reg->card_fw_status0, &ret);
 	if (ret) {
@@ -918,15 +922,17 @@ static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card)
 		}
 	}
 
+	sdio_release_host(card->func);
+
 	if (btmrvl_sdio_verify_fw_download(card, pollnum)) {
 		BT_ERR("FW failed to be active in time!");
-		ret = -ETIMEDOUT;
-		goto done;
+		return -ETIMEDOUT;
 	}
 
+	return 0;
+
 done:
 	sdio_release_host(card->func);
-
 	return ret;
 }
 
-- 
1.7.10.4

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

* [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out.
  2013-04-22  9:10 [PATCH v3 0/2] Bluetooth: btmrvl: Fix concurrent FW download Andreas Fenkart
  2013-04-22  9:10 ` [PATCH v3 1/2] Bluetooth: btmrvl: release lock while waiting for fw download complete Andreas Fenkart
@ 2013-04-22  9:10 ` Andreas Fenkart
  2013-04-23 23:51   ` Gutavo Padovan
  1 sibling, 1 reply; 4+ messages in thread
From: Andreas Fenkart @ 2013-04-22  9:10 UTC (permalink / raw)
  To: marcel
  Cc: gustavo, johan.hedberg, linux-bluetooth, andrei.emeltchenko,
	akarwar, bzhao, zonque, Andreas Fenkart

FW does the synchronization of the different modules during init.
It will report different modules, that it is ready at different times.
The fw download 'winner' will be reported fw ready first. Without this
patch, btmrvl was already continuing before the FW told it too. Probably
on behalf of the 'winner' which then never sees FW ready and times out.

Signed-off-by: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
---
 drivers/bluetooth/btmrvl_sdio.c |   21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index c7ec727..3d8305c 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -228,9 +228,8 @@ failed:
 static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card,
 								int pollnum)
 {
-	int ret = -ETIMEDOUT;
 	u16 firmwarestat;
-	unsigned int tries;
+	int tries, ret;
 
 	 /* Wait for firmware to become ready */
 	for (tries = 0; tries < pollnum; tries++) {
@@ -240,15 +239,13 @@ static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card,
 		if (ret < 0)
 			continue;
 
-		if (firmwarestat == FIRMWARE_READY) {
-			ret = 0;
-			break;
-		} else {
-			msleep(10);
-		}
+		if (firmwarestat == FIRMWARE_READY)
+			return 0;
+
+		msleep(10);
 	}
 
-	return ret;
+	return -ETIMEDOUT;
 }
 
 static int btmrvl_sdio_download_helper(struct btmrvl_sdio_card *card)
@@ -924,6 +921,10 @@ static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card)
 
 	sdio_release_host(card->func);
 
+	/*
+	 * winner or not, with this test the FW synchronizes when the
+	 * module can continue its initialization
+	 */
 	if (btmrvl_sdio_verify_fw_download(card, pollnum)) {
 		BT_ERR("FW failed to be active in time!");
 		return -ETIMEDOUT;
@@ -995,8 +996,6 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
 		goto unreg_dev;
 	}
 
-	msleep(100);
-
 	btmrvl_sdio_enable_host_int(card);
 
 	priv = btmrvl_add_card(card);
-- 
1.7.10.4

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

* Re: [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out.
  2013-04-22  9:10 ` [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out Andreas Fenkart
@ 2013-04-23 23:51   ` Gutavo Padovan
  0 siblings, 0 replies; 4+ messages in thread
From: Gutavo Padovan @ 2013-04-23 23:51 UTC (permalink / raw)
  To: Andreas Fenkart
  Cc: marcel, johan.hedberg, linux-bluetooth, andrei.emeltchenko,
	akarwar, bzhao, zonque

Hi Andreas,

* Andreas Fenkart <andreas.fenkart@streamunlimited.com> [2013-04-22 11:10:23 +0200]:

> FW does the synchronization of the different modules during init.
> It will report different modules, that it is ready at different times.
> The fw download 'winner' will be reported fw ready first. Without this
> patch, btmrvl was already continuing before the FW told it too. Probably
> on behalf of the 'winner' which then never sees FW ready and times out.
> 
> Signed-off-by: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
> ---
>  drivers/bluetooth/btmrvl_sdio.c |   21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)

Patch has been applied to bluetooth-next. Thanks.

	Gustavo

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

end of thread, other threads:[~2013-04-23 23:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-22  9:10 [PATCH v3 0/2] Bluetooth: btmrvl: Fix concurrent FW download Andreas Fenkart
2013-04-22  9:10 ` [PATCH v3 1/2] Bluetooth: btmrvl: release lock while waiting for fw download complete Andreas Fenkart
2013-04-22  9:10 ` [PATCH v3 2/2] Bluetooth: btmrvl: report error if verify_fw_download times out Andreas Fenkart
2013-04-23 23:51   ` Gutavo Padovan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).