From eb0145c95b2374dd0aa35b5af781013c454ec41b Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 2 Apr 2024 00:00:07 +0530 Subject: [PATCH 1/6] manfiest: nrfxlib: Pull new atomic API changes This pulls in newly added atomic API to de-initialize the driver (and RPU). Fixes SHEL-2436. Signed-off-by: Chaitanya Tata --- west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/west.yml b/west.yml index 8bc6f51ed5f6..5f77fab4f689 100644 --- a/west.yml +++ b/west.yml @@ -148,7 +148,7 @@ manifest: - name: nrfxlib repo-path: sdk-nrfxlib path: nrfxlib - revision: 9837d3bfacabf06d888ac12765c3868c251a58c2 + revision: 589238f61085c510a603245428d136b36110cfb4 - name: trusted-firmware-m repo-path: sdk-trusted-firmware-m path: modules/tee/tf-m/trusted-firmware-m From 4bc7e3f32791fc97061871ff798d712bdafd1d61 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Sun, 25 Feb 2024 22:27:18 +0530 Subject: [PATCH 2/6] drivers: wifi: Fix formatting Improves readability esp. for init. Signed-off-by: Chaitanya Tata --- drivers/wifi/nrf700x/src/qspi/src/device.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/drivers/wifi/nrf700x/src/qspi/src/device.c b/drivers/wifi/nrf700x/src/qspi/src/device.c index c68c1ee89e63..242591fa3165 100644 --- a/drivers/wifi/nrf700x/src/qspi/src/device.c +++ b/drivers/wifi/nrf700x/src/qspi/src/device.c @@ -21,15 +21,19 @@ static struct qspi_config config; #if defined(CONFIG_NRF700X_ON_QSPI) -static struct qspi_dev qspi = { .init = qspi_init, - .read = qspi_read, - .write = qspi_write, - .hl_read = qspi_hl_read}; +static struct qspi_dev qspi = { + .init = qspi_init, + .read = qspi_read, + .write = qspi_write, + .hl_read = qspi_hl_read +}; #else -static struct qspi_dev spim = { .init = spim_init, - .read = spim_read, - .write = spim_write, - .hl_read = spim_hl_read}; +static struct qspi_dev spim = { + .init = spim_init, + .read = spim_read, + .write = spim_write, + .hl_read = spim_hl_read +}; #endif struct qspi_config *qspi_defconfig(void) From 98a5642df71ec80066227ffa8eb6eead50fe0d68 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Sun, 25 Feb 2024 22:28:38 +0530 Subject: [PATCH 3/6] drivers: wifi: Add de-initialization for SPI Though this is no-op for now, it would lead to crash if BAL de-init is called which will be in the upcoming commits. Signed-off-by: Chaitanya Tata --- drivers/wifi/nrf700x/src/qspi/inc/spi_if.h | 2 ++ drivers/wifi/nrf700x/src/qspi/src/spi_if.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/drivers/wifi/nrf700x/src/qspi/inc/spi_if.h b/drivers/wifi/nrf700x/src/qspi/inc/spi_if.h index f5cce2e50d8b..93ae191d7ea5 100644 --- a/drivers/wifi/nrf700x/src/qspi/inc/spi_if.h +++ b/drivers/wifi/nrf700x/src/qspi/inc/spi_if.h @@ -13,6 +13,8 @@ int spim_init(struct qspi_config *config); +int spim_deinit(void); + int spim_write(unsigned int addr, const void *data, int len); int spim_read(unsigned int addr, void *data, int len); diff --git a/drivers/wifi/nrf700x/src/qspi/src/spi_if.c b/drivers/wifi/nrf700x/src/qspi/src/spi_if.c index 3c569fc57f42..51180ad03287 100644 --- a/drivers/wifi/nrf700x/src/qspi/src/spi_if.c +++ b/drivers/wifi/nrf700x/src/qspi/src/spi_if.c @@ -243,6 +243,13 @@ int spim_init(struct qspi_config *config) return 0; } +int spim_deinit(void) +{ + LOG_DBG("TODO : %s", __func__); + + return 0; +} + static void spim_addr_check(unsigned int addr, const void *data, unsigned int len) { if ((addr % 4 != 0) || (((unsigned int)data) % 4 != 0) || (len % 4 != 0)) { From e905da831880657c491ca934d609e2ac27e22259 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Sun, 25 Feb 2024 22:29:37 +0530 Subject: [PATCH 4/6] drivers: wifi: Assign de-initialization implementation ops BAL de-init was never called, so, these weren't caught. In upcoming commits BAL de-init will be used, so, assign here to avoid crashes. Signed-off-by: Chaitanya Tata --- drivers/wifi/nrf700x/src/qspi/src/device.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/wifi/nrf700x/src/qspi/src/device.c b/drivers/wifi/nrf700x/src/qspi/src/device.c index 242591fa3165..86cd724b0b9e 100644 --- a/drivers/wifi/nrf700x/src/qspi/src/device.c +++ b/drivers/wifi/nrf700x/src/qspi/src/device.c @@ -23,6 +23,7 @@ static struct qspi_config config; #if defined(CONFIG_NRF700X_ON_QSPI) static struct qspi_dev qspi = { .init = qspi_init, + .deinit = qspi_deinit, .read = qspi_read, .write = qspi_write, .hl_read = qspi_hl_read @@ -30,6 +31,7 @@ static struct qspi_dev qspi = { #else static struct qspi_dev spim = { .init = spim_init, + .deinit = spim_deinit, .read = spim_read, .write = spim_write, .hl_read = spim_hl_read From b1d16e7af32c5df1c13b11cdd27b3d8b2fed24b5 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Fri, 31 May 2024 01:24:52 +0530 Subject: [PATCH 5/6] drivers: wifi: Fix de-init handle extraction The QSPI dev context has it's own structure, so, need to be extract the QSPI dev ops from the context, this has been implemented improperly, but as it's not been used till date hadn't caused any problems. Signed-off-by: Chaitanya Tata --- drivers/wifi/nrf700x/src/shim.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/wifi/nrf700x/src/shim.c b/drivers/wifi/nrf700x/src/shim.c index 42bc6bc005f0..79fceb0de861 100644 --- a/drivers/wifi/nrf700x/src/shim.c +++ b/drivers/wifi/nrf700x/src/shim.c @@ -633,11 +633,10 @@ static enum nrf_wifi_status zep_shim_bus_qspi_dev_init(void *os_qspi_dev_ctx) return NRF_WIFI_STATUS_SUCCESS; } -static void zep_shim_bus_qspi_dev_deinit(void *os_qspi_dev_ctx) +static void zep_shim_bus_qspi_dev_deinit(void *priv) { - struct qspi_dev *dev = NULL; - - dev = os_qspi_dev_ctx; + struct zep_shim_bus_qspi_priv *qspi_priv = priv; + volatile struct qspi_dev *dev = qspi_priv->qspi_dev; dev->deinit(); } @@ -645,7 +644,7 @@ static void zep_shim_bus_qspi_dev_deinit(void *os_qspi_dev_ctx) static void *zep_shim_bus_qspi_dev_add(void *os_qspi_priv, void *osal_qspi_dev_ctx) { struct zep_shim_bus_qspi_priv *zep_qspi_priv = os_qspi_priv; - struct qspi_dev *qdev = qspi_dev(); + struct qspi_dev *dev = qspi_dev(); int ret; enum nrf_wifi_status status; @@ -655,7 +654,7 @@ static void *zep_shim_bus_qspi_dev_add(void *os_qspi_priv, void *osal_qspi_dev_c return NULL; } - status = qdev->init(qspi_defconfig()); + status = dev->init(qspi_defconfig()); if (status != NRF_WIFI_STATUS_SUCCESS) { LOG_ERR("%s: QSPI device init failed", __func__); return NULL; @@ -666,17 +665,18 @@ static void *zep_shim_bus_qspi_dev_add(void *os_qspi_priv, void *osal_qspi_dev_c LOG_ERR("%s: RPU enable failed with error %d", __func__, ret); return NULL; } - zep_qspi_priv->qspi_dev = qdev; + zep_qspi_priv->qspi_dev = dev; zep_qspi_priv->dev_added = true; return zep_qspi_priv; } -static void zep_shim_bus_qspi_dev_rem(void *os_qspi_dev_ctx) +static void zep_shim_bus_qspi_dev_rem(void *priv) { - struct qspi_dev *dev = NULL; + struct zep_shim_bus_qspi_priv *qspi_priv = priv; + struct qspi_dev *dev = qspi_priv->qspi_dev; - dev = os_qspi_dev_ctx; + ARG_UNUSED(dev); /* TODO: Make qspi_dev a dynamic instance and remove it here */ rpu_disable(); From 86b11b2b379682b392cc56eaa65be4169fcf62ef Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Fri, 31 May 2024 01:27:55 +0530 Subject: [PATCH 6/6] drivers: wifi: Fix interrupt unregistration During interrupt unregistration we need to remove the interrupt handler first to avoid further interrupts and then wait for any pending items in the workqueue to complete before returning to the caller. Use "sync" variant for waiting till pending work is done and swap the operations to remove the interrupt handler. Also, check for the return value of handler unregistration. Signed-off-by: Chaitanya Tata --- drivers/wifi/nrf700x/src/shim.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/wifi/nrf700x/src/shim.c b/drivers/wifi/nrf700x/src/shim.c index 79fceb0de861..ef548f1afbce 100644 --- a/drivers/wifi/nrf700x/src/shim.c +++ b/drivers/wifi/nrf700x/src/shim.c @@ -796,11 +796,18 @@ static enum nrf_wifi_status zep_shim_bus_qspi_intr_reg(void *os_dev_ctx, void *c static void zep_shim_bus_qspi_intr_unreg(void *os_qspi_dev_ctx) { + struct k_work_sync sync; + int ret; + ARG_UNUSED(os_qspi_dev_ctx); - k_work_cancel_delayable(&intr_priv->work); + ret = rpu_irq_remove(&intr_priv->gpio_cb_data); + if (ret) { + LOG_ERR("%s: rpu_irq_remove failed", __func__); + return; + } - rpu_irq_remove(&intr_priv->gpio_cb_data); + k_work_cancel_delayable_sync(&intr_priv->work, &sync); k_free(intr_priv); intr_priv = NULL;