linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jerome Pouiller <Jerome.Pouiller@silabs.com>
To: devel@driverdev.osuosl.org, linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Kalle Valo" <kvalo@codeaurora.org>,
	"David S . Miller" <davem@davemloft.net>,
	"Jérôme Pouiller" <jerome.pouiller@silabs.com>
Subject: [PATCH v2 32/33] staging: wfx: ensure IRQ is ready before enabling it
Date: Mon, 13 Sep 2021 10:30:44 +0200	[thread overview]
Message-ID: <20210913083045.1881321-33-Jerome.Pouiller@silabs.com> (raw)
In-Reply-To: <20210913083045.1881321-1-Jerome.Pouiller@silabs.com>

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Since commit 5561770f80b1 ("staging: wfx: repair external IRQ for
SDIO"), wfx_sdio_irq_subscribe() enforce the device to use IRQs.
However, there is currently a race in this code. An IRQ may happen
before the IRQ has been registered.

The problem has observed during debug session when the device crashes
before the IRQ set up:

    [ 1.546] wfx-sdio mmc0:0001:1: started firmware 3.12.2 "WF200_ASIC_WFM_(Jenkins)_FW3.12.2" (API: 3.7, keyset: C0, caps: 0x00000002)
    [ 2.559] wfx-sdio mmc0:0001:1: time out while polling control register
    [ 3.565] wfx-sdio mmc0:0001:1: chip is abnormally long to answer
    [ 6.563] wfx-sdio mmc0:0001:1: chip did not answer
    [ 6.568] wfx-sdio mmc0:0001:1: hardware request CONFIGURATION (0x09) on vif 2 returned error -110
    [ 6.577] wfx-sdio mmc0:0001:1: PDS bytes 0 to 12: chip didn't reply (corrupted file?)
    [ 6.585] Unable to handle kernel NULL pointer dereference at virtual address 00000000
    [ 6.592] pgd = c0004000
    [ 6.595] [00000000] *pgd=00000000
    [ 6.598] Internal error: Oops - BUG: 17 [#1] THUMB2
    [ 6.603] Modules linked in:
    [ 6.606] CPU: 0 PID: 23 Comm: kworker/u2:1 Not tainted 3.18.19 #78
    [ 6.612] Workqueue: kmmcd mmc_rescan
    [ 6.616] task: c176d100 ti: c0e50000 task.ti: c0e50000
    [ 6.621] PC is at wake_up_process+0xa/0x14
    [ 6.625] LR is at sdio_irq+0x61/0x250
    [ 6.629] pc : [<c001e8ae>] lr : [<c00ec5bd>] psr: 600001b3
    [ 6.629] sp : c0e51bd8 ip : c0e51cc8 fp : 00000001
    [ 6.640] r10: 00000003 r9 : 00000000 r8 : c0003c34
    [ 6.644] r7 : c0e51bd8 r6 : c0003c30 r5 : 00000001 r4 : c0e78c00
    [ 6.651] r3 : 00000000 r2 : 00000000 r1 : 00000003 r0 : 00000000
    [ 6.657] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA Thumb Segment kernel
    [ 6.664] Control: 50c53c7d Table: 11fd8059 DAC: 00000015
    [ 6.670] Process kworker/u2:1 (pid: 23, stack limit = 0xc0e501b0)
    [ 6.676] Stack: (0xc0e51bd8 to 0xc0e52000)
    [...]
    [ 6.949] [<c001e8ae>] (wake_up_process) from [<c00ec5bd>] (sdio_irq+0x61/0x250)
    [ 6.956] [<c00ec5bd>] (sdio_irq) from [<c0025099>] (handle_irq_event_percpu+0x17/0x92)
    [ 6.964] [<c0025099>] (handle_irq_event_percpu) from [<c002512f>] (handle_irq_event+0x1b/0x24)
    [ 6.973] [<c002512f>] (handle_irq_event) from [<c0026577>] (handle_level_irq+0x5d/0x76)
    [ 6.981] [<c0026577>] (handle_level_irq) from [<c0024cc3>] (generic_handle_irq+0x13/0x1c)
    [ 6.989] [<c0024cc3>] (generic_handle_irq) from [<c0024dd9>] (__handle_domain_irq+0x31/0x48)
    [ 6.997] [<c0024dd9>] (__handle_domain_irq) from [<c0008359>] (ov_handle_irq+0x31/0xe0)
    [ 7.005] [<c0008359>] (ov_handle_irq) from [<c000af5b>] (__irq_svc+0x3b/0x5c)
    [ 7.013] Exception stack(0xc0e51c68 to 0xc0e51cb0)
    [...]
    [ 7.038] [<c000af5b>] (__irq_svc) from [<c01775aa>] (wait_for_common+0x9e/0xc4)
    [ 7.045] [<c01775aa>] (wait_for_common) from [<c00e1dc3>] (mmc_wait_for_req+0x4b/0xdc)
    [ 7.053] [<c00e1dc3>] (mmc_wait_for_req) from [<c00e1e83>] (mmc_wait_for_cmd+0x2f/0x34)
    [ 7.061] [<c00e1e83>] (mmc_wait_for_cmd) from [<c00e7b2b>] (mmc_io_rw_direct_host+0x71/0xac)
    [ 7.070] [<c00e7b2b>] (mmc_io_rw_direct_host) from [<c00e8f79>] (sdio_claim_irq+0x6b/0x116)
    [ 7.078] [<c00e8f79>] (sdio_claim_irq) from [<c00d8415>] (wfx_sdio_irq_subscribe+0x19/0x94)
    [ 7.086] [<c00d8415>] (wfx_sdio_irq_subscribe) from [<c00d5229>] (wfx_probe+0x189/0x2ac)
    [ 7.095] [<c00d5229>] (wfx_probe) from [<c00d83bf>] (wfx_sdio_probe+0x8f/0xcc)
    [ 7.102] [<c00d83bf>] (wfx_sdio_probe) from [<c00e7fbb>] (sdio_bus_probe+0x5f/0xa8)
    [ 7.109] [<c00e7fbb>] (sdio_bus_probe) from [<c00be229>] (driver_probe_device+0x59/0x134)
    [ 7.118] [<c00be229>] (driver_probe_device) from [<c00bd4d7>] (bus_for_each_drv+0x3f/0x4a)
    [ 7.126] [<c00bd4d7>] (bus_for_each_drv) from [<c00be1a5>] (device_attach+0x3b/0x52)
    [ 7.134] [<c00be1a5>] (device_attach) from [<c00bdc2b>] (bus_probe_device+0x17/0x4c)
    [ 7.141] [<c00bdc2b>] (bus_probe_device) from [<c00bcd69>] (device_add+0x2c5/0x334)
    [ 7.149] [<c00bcd69>] (device_add) from [<c00e80bf>] (sdio_add_func+0x23/0x44)
    [ 7.156] [<c00e80bf>] (sdio_add_func) from [<c00e79eb>] (mmc_attach_sdio+0x187/0x1ec)
    [ 7.164] [<c00e79eb>] (mmc_attach_sdio) from [<c00e31bd>] (mmc_rescan+0x18d/0x1fc)
    [ 7.172] [<c00e31bd>] (mmc_rescan) from [<c001a14f>] (process_one_work+0xd7/0x170)
    [ 7.179] [<c001a14f>] (process_one_work) from [<c001a59b>] (worker_thread+0x103/0x1bc)
    [ 7.187] [<c001a59b>] (worker_thread) from [<c001c731>] (kthread+0x7d/0x90)
    [ 7.194] [<c001c731>] (kthread) from [<c0008ce1>] (ret_from_fork+0x11/0x30)
    [ 7.201] Code: 2103 b580 2200 af00 (681b) 46bd
    [ 7.206] ---[ end trace 3ab50aced42eedb4 ]---

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/bus_sdio.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/wfx/bus_sdio.c b/drivers/staging/wfx/bus_sdio.c
index eb70bef6bd6e..a670176ba06f 100644
--- a/drivers/staging/wfx/bus_sdio.c
+++ b/drivers/staging/wfx/bus_sdio.c
@@ -120,19 +120,22 @@ static int wfx_sdio_irq_subscribe(void *priv)
 		return ret;
 	}
 
-	sdio_claim_host(bus->func);
-	cccr = sdio_f0_readb(bus->func, SDIO_CCCR_IENx, NULL);
-	cccr |= BIT(0);
-	cccr |= BIT(bus->func->num);
-	sdio_f0_writeb(bus->func, cccr, SDIO_CCCR_IENx, NULL);
-	sdio_release_host(bus->func);
 	flags = irq_get_trigger_type(bus->of_irq);
 	if (!flags)
 		flags = IRQF_TRIGGER_HIGH;
 	flags |= IRQF_ONESHOT;
-	return devm_request_threaded_irq(&bus->func->dev, bus->of_irq, NULL,
-					 wfx_sdio_irq_handler_ext, flags,
-					 "wfx", bus);
+	ret = devm_request_threaded_irq(&bus->func->dev, bus->of_irq, NULL,
+					wfx_sdio_irq_handler_ext, flags,
+					"wfx", bus);
+	if (ret)
+		return ret;
+	sdio_claim_host(bus->func);
+	cccr = sdio_f0_readb(bus->func, SDIO_CCCR_IENx, NULL);
+	cccr |= BIT(0);
+	cccr |= BIT(bus->func->num);
+	sdio_f0_writeb(bus->func, cccr, SDIO_CCCR_IENx, NULL);
+	sdio_release_host(bus->func);
+	return 0;
 }
 
 static int wfx_sdio_irq_unsubscribe(void *priv)
-- 
2.33.0


  parent reply	other threads:[~2021-09-13  8:34 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-13  8:30 [PATCH v2 00/33] staging/wfx: usual maintenance Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 01/33] staging: wfx: use abbreviated message for "incorrect sequence" Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 02/33] staging: wfx: do not send CAB while scanning Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 03/33] staging: wfx: ignore PS when STA/AP share same channel Jerome Pouiller
2021-09-13  9:33   ` Dan Carpenter
2021-09-13 10:36     ` Jérôme Pouiller
2021-09-13 10:42       ` Dan Carpenter
2021-09-13  8:30 ` [PATCH v2 04/33] staging: wfx: wait for SCAN_CMPL after a SCAN_STOP Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 05/33] staging: wfx: avoid possible lock-up during scan Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 06/33] staging: wfx: drop unused argument from hif_scan() Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 07/33] staging: wfx: fix atomic accesses in wfx_tx_queue_empty() Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 08/33] staging: wfx: take advantage of wfx_tx_queue_empty() Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 09/33] staging: wfx: declare support for TDLS Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 10/33] staging: wfx: fix support for CSA Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 11/33] staging: wfx: relax the PDS existence constraint Jerome Pouiller
2021-09-13  9:58   ` Dan Carpenter
2021-09-13  8:30 ` [PATCH v2 12/33] staging: wfx: simplify API coherency check Jerome Pouiller
2021-09-13 10:02   ` Dan Carpenter
2021-09-13  8:30 ` [PATCH v2 13/33] staging: wfx: update with the firmware API 3.8 Jerome Pouiller
2021-09-13 10:06   ` Dan Carpenter
2021-09-13  8:30 ` [PATCH v2 14/33] staging: wfx: uniformize counter names Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 15/33] staging: wfx: fix misleading 'rate_id' usage Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 16/33] staging: wfx: declare variables at beginning of functions Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 17/33] staging: wfx: simplify hif_join() Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 18/33] staging: wfx: reorder function for slightly better eye candy Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 19/33] staging: wfx: fix error names Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 20/33] staging: wfx: apply naming rules in hif_tx_mib.c Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 21/33] staging: wfx: remove unused definition Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 22/33] staging: wfx: remove useless debug statement Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 23/33] staging: wfx: fix space after cast operator Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 24/33] staging: wfx: remove references to WFxxx in comments Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 25/33] staging: wfx: update files descriptions Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 26/33] staging: wfx: reformat comment Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 27/33] staging: wfx: avoid c99 comments Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 28/33] staging: wfx: fix comments styles Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 29/33] staging: wfx: remove useless comments after #endif Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 30/33] staging: wfx: explain the purpose of wfx_send_pds() Jerome Pouiller
2021-09-13  8:30 ` [PATCH v2 31/33] staging: wfx: indent functions arguments Jerome Pouiller
2021-09-13  8:30 ` Jerome Pouiller [this message]
2021-09-13  8:30 ` [PATCH v2 33/33] staging: wfx: early exit of PDS is not correct Jerome Pouiller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210913083045.1881321-33-Jerome.Pouiller@silabs.com \
    --to=jerome.pouiller@silabs.com \
    --cc=davem@davemloft.net \
    --cc=devel@driverdev.osuosl.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=kvalo@codeaurora.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).