From patchwork Mon Aug 26 07:26:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 13777328 X-Patchwork-Delegate: kvalo@adurom.com Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7709E139CFC for ; Mon, 26 Aug 2024 07:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657251; cv=none; b=kwE3sw4sYUo3zr0A6rJpo3gsnzWxBXGTy/UuaOuKX9loZ1tHGcP1hFFjxVsI8GrGQ4AvD1/NxT2+QQXrim+NiP9OE+1l9k+5b0oxztZUTLZNtC0xct04AWJJf7g1p+LYaZ1/OHx4FwqKu8dbXFEH4HRJjuiXuwrv3q889qaDMIA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657251; c=relaxed/simple; bh=V9JLhApeG+XLvrXqWH7FiK4Fj8BNjLTSEbWxuakGv24=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NvTnpxcA8Lyez/4ghbz+o4qp0Jv/r8SeIjMguPNVuGzaqWxic0+7rvTAGVU90P8NMJ0DxTMrpitymDF67Thp7uCdzhBOYzwNumrIKEmthjpBG204chGXWCKaJx9yLZENPzvIjqVMUBbbh1DLHxzq5jv1TNrmMhBjn1mv5cc6DQw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1siU7p-0005HQ-SI; Mon, 26 Aug 2024 09:26:53 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1siU7p-0038Ep-2x; Mon, 26 Aug 2024 09:26:53 +0200 Received: from localhost ([::1] helo=dude02.red.stw.pengutronix.de) by dude02.red.stw.pengutronix.de with esmtp (Exim 4.96) (envelope-from ) id 1siU7o-000hSF-38; Mon, 26 Aug 2024 09:26:53 +0200 From: Sascha Hauer To: Francesco Dolcini Cc: Calvin Owens , Brian Norris , Kalle Valo , David Lin , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 1/4] wifi: mwifiex: release firmware at remove time Date: Mon, 26 Aug 2024 09:26:45 +0200 Message-Id: <20240826072648.167004-2-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240826072648.167004-1-s.hauer@pengutronix.de> References: <20240826072648.167004-1-s.hauer@pengutronix.de> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: s.hauer@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org With VDLL support the device will request parts of the firmware during runtime, so instead of releasing the firmware immediately after initial firmware upload, release it during device deregistration. FIXME: I am not sure if we run into trouble with the firmware framework when we don't release the firmware. We might have to copy it over to some private buffer instead of just keeping it around. FIXME: we might want to limit the release firmware at remove time to the devices that actually need it. Signed-off-by: Sascha Hauer --- drivers/net/wireless/marvell/mwifiex/main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 96d1f6039fbca..5d02277d35293 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -695,10 +695,6 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context) release_firmware(adapter->cal_data); adapter->cal_data = NULL; } - if (adapter->firmware) { - release_firmware(adapter->firmware); - adapter->firmware = NULL; - } if (init_failed) { if (adapter->irq_wakeup >= 0) device_init_wakeup(adapter->dev, false); @@ -1836,6 +1832,11 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter) "info: unregister device\n"); if (adapter->if_ops.unregister_dev) adapter->if_ops.unregister_dev(adapter); + if (adapter->firmware) { + release_firmware(adapter->firmware); + adapter->firmware = NULL; + } + /* Free adapter structure */ mwifiex_dbg(adapter, INFO, "info: free adapter\n"); From patchwork Mon Aug 26 07:26:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 13777327 X-Patchwork-Delegate: kvalo@adurom.com Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E3D46129A78 for ; Mon, 26 Aug 2024 07:27:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657243; cv=none; b=CY9uhgYQiH/rS0Yg5LVmjh/8rv3PXQxN+w3vqRftOKwydqz61utWt2e/sdka6yOHhq92Oh1N4cgscEMN8tGeFoGw0cGiZmbWH5xi8LODkxv898ISwc6xdl6AwutbByreSbTpVju/xlHWTU0+nKuBAmLQawwoFXugK8hEql+cBuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657243; c=relaxed/simple; bh=jHg+VcggDx1nltdMvRdfnVKGEWDdYb+i99lhA80F3qw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ONHdJaQeCIe9orLN3JDu+HbXX6wuyBpLMk0mb5jiWhtkx0NPdza/AQDNYuYa8caqSzc6hR+jqFRYvq67puqm/iHQe98R4GpmBFaf7t7RQCjZFChGPiXCclg68JF+B5dPIUfaUKtkRdmVSnYK7qLiP9xmSM0643YK+XvHm6T3J6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1siU7p-0005HR-SJ; Mon, 26 Aug 2024 09:26:53 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1siU7p-0038Es-4c; Mon, 26 Aug 2024 09:26:53 +0200 Received: from localhost ([::1] helo=dude02.red.stw.pengutronix.de) by dude02.red.stw.pengutronix.de with esmtp (Exim 4.96) (envelope-from ) id 1siU7p-000hSF-05; Mon, 26 Aug 2024 09:26:53 +0200 From: Sascha Hauer To: Francesco Dolcini Cc: Calvin Owens , Brian Norris , Kalle Valo , David Lin , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 2/4] wifi: mwifiex: handle VDLL Date: Mon, 26 Aug 2024 09:26:46 +0200 Message-Id: <20240826072648.167004-3-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240826072648.167004-1-s.hauer@pengutronix.de> References: <20240826072648.167004-1-s.hauer@pengutronix.de> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: s.hauer@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org Some adapters send events to the Kernel requesting VDLL images. When we receive such an event we have to upload parts of the firmware image to the device. When the firmware requests a VDLL image then we have to bypass the pending command queue and have to send it immediately. Failing to do so will cause every other command sent from the queue to timeout. There is this check currently in mwifiex_download_vdll_block(): if (adapter->cmd_sent) { mwifiex_dbg(adapter, MSG, "%s: adapter is busy\n", __func__); return -EBUSY; } The downstream driver has this check as well. However, the downstream driver tries to defer sending the VDLL command when this happens. It sets a variable in the private driver struct where the main process picks it up later. I am not sure if this can work, because when adapter->cmd_sent is true then it's already too late, we already missed to send the VDLL image before the next command. In my tests I never saw the above trigger, but this surely a place to have a closer look at. Signed-off-by: Sascha Hauer --- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 86 +++++++++++++++++++ drivers/net/wireless/marvell/mwifiex/fw.h | 16 ++++ drivers/net/wireless/marvell/mwifiex/main.h | 4 + .../net/wireless/marvell/mwifiex/sta_event.c | 4 + .../net/wireless/marvell/mwifiex/uap_event.c | 4 + 5 files changed, 114 insertions(+) diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index 7894102f03eb0..b2535ad458d72 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -1714,3 +1714,89 @@ int mwifiex_ret_wakeup_reason(struct mwifiex_private *priv, return 0; } + +static int mwifiex_download_vdll_block(struct mwifiex_adapter *adapter, u32 offset, + u16 block_len) +{ + int ret; + struct host_cmd_ds_gen *cmd_hdr = NULL; + u16 msg_len = block_len + sizeof(*cmd_hdr); + struct sk_buff *skb; + u32 fw_offset; + + block_len = min(block_len, adapter->vdll_len - offset); + + if (offset > adapter->vdll_len) + return -EINVAL; + + if (adapter->cmd_sent) { + mwifiex_dbg(adapter, MSG, "%s: adapter is busy\n", __func__); + return -EBUSY; + } + + skb = dev_alloc_skb(msg_len + MWIFIEX_TYPE_LEN); + if (!skb) { + mwifiex_dbg(adapter, ERROR, + "SLEEP_CFM: dev_alloc_skb failed\n"); + return -ENOMEM; + } + + skb_put(skb, msg_len); + + cmd_hdr = (void *)skb->data; + cmd_hdr->command = cpu_to_le16(HostCmd_CMD_VDLL); + cmd_hdr->seq_num = cpu_to_le16(0xFF00); + cmd_hdr->size = cpu_to_le16(msg_len); + + fw_offset = adapter->firmware->size - adapter->vdll_len + offset; + memcpy(skb->data + sizeof(*cmd_hdr), adapter->firmware->data + fw_offset, block_len); + + skb_push(skb, adapter->intf_hdr_len); + + ret = adapter->if_ops.host_to_card(adapter, MWIFIEX_TYPE_VDLL, skb, NULL); + if (ret < 0) + mwifiex_dbg(adapter, MSG, "DNLD_VDLL: Host to Card Failed\n"); + + dev_kfree_skb_any(skb); + + return ret; + +} + +int mwifiex_process_vdll_event(struct mwifiex_private *priv, struct sk_buff *event_skb) +{ + int status = 0; + struct mwifiex_vdll_ind *ind; + struct mwifiex_adapter *adapter = priv->adapter; + + ind = (struct mwifiex_vdll_ind *)(event_skb->data + sizeof(u32)); + + switch (le16_to_cpu(ind->type)) { + case VDLL_IND_TYPE_REQ: + mwifiex_download_vdll_block(adapter, le32_to_cpu(ind->offset), + le16_to_cpu(ind->block_len)); + break; + case VDLL_IND_TYPE_OFFSET: + adapter->vdll_len = le32_to_cpu(ind->offset); + mwifiex_dbg(adapter, MSG, "VDLL_IND (OFFSET): offset=0x%x\n", + adapter->vdll_len); + break; + case VDLL_IND_TYPE_ERR_SIG: + mwifiex_dbg(adapter, MSG, "VDLL_IND (SIG ERR).\n"); + break; + case VDLL_IND_TYPE_ERR_ID: + mwifiex_dbg(adapter, MSG, "VDLL_IND (ID ERR).\n"); + break; + case VDLL_IND_TYPE_SEC_ERR_ID: + mwifiex_dbg(adapter, MSG, "VDLL_IND (SECURE ERR).\n"); + break; + case VDLL_IND_TYPE_INTF_RESET: + mwifiex_dbg(adapter, MSG, "VDLL_IND (INTF_RESET)\n"); + break; + default: + mwifiex_dbg(adapter, MSG, "unknown vdll ind type=%d\n", ind->type); + break; + } + + return status; +} diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h index e91def0afa14d..f8312f7ba9ac9 100644 --- a/drivers/net/wireless/marvell/mwifiex/fw.h +++ b/drivers/net/wireless/marvell/mwifiex/fw.h @@ -406,6 +406,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define HostCmd_CMD_FW_DUMP_EVENT 0x0125 #define HostCmd_CMD_SDIO_SP_RX_AGGR_CFG 0x0223 #define HostCmd_CMD_STA_CONFIGURE 0x023f +#define HostCmd_CMD_VDLL 0x0240 #define HostCmd_CMD_CHAN_REGION_CFG 0x0242 #define HostCmd_CMD_PACKET_AGGR_CTRL 0x0251 #define HostCmd_CMD_ADD_NEW_STATION 0x025f @@ -584,6 +585,7 @@ enum mwifiex_channel_flags { #define EVENT_FW_DUMP_INFO 0x00000073 #define EVENT_TX_STATUS_REPORT 0x00000074 #define EVENT_BT_COEX_WLAN_PARA_CHANGE 0X00000076 +#define EVENT_VDLL_IND 0x00000081 #define EVENT_ID_MASK 0xffff #define BSS_NUM_MASK 0xf @@ -2449,4 +2451,18 @@ struct hw_spec_max_conn { u8 max_sta_conn; } __packed; +#define VDLL_IND_TYPE_REQ 0 /* req host side download vdll block */ +#define VDLL_IND_TYPE_OFFSET 1 /* notify vdll start offset in firmware image */ +#define VDLL_IND_TYPE_ERR_SIG 2 /* notify vdll download error: signature error */ +#define VDLL_IND_TYPE_ERR_ID 3 /* notify vdll download error: ID error */ +#define VDLL_IND_TYPE_SEC_ERR_ID 4 /* notify vdll download error: Secure error */ +#define VDLL_IND_TYPE_INTF_RESET 5 /* req host side interface reset */ + +struct mwifiex_vdll_ind { + __le16 type; + __le16 vdllId; + __le32 offset; + __le16 block_len; +} __packed; + #endif /* !_MWIFIEX_FW_H_ */ diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h index 529863edd7a25..8b7edde32bb5d 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h @@ -132,6 +132,7 @@ enum { #define MWIFIEX_TYPE_DATA 0 #define MWIFIEX_TYPE_AGGR_DATA 10 #define MWIFIEX_TYPE_EVENT 3 +#define MWIFIEX_TYPE_VDLL 4 #define MAX_BITMAP_RATES_SIZE 18 @@ -1045,6 +1046,8 @@ struct mwifiex_adapter { struct delayed_work devdump_work; bool ignore_btcoex_events; + + u32 vdll_len; }; void mwifiex_process_tx_queue(struct mwifiex_adapter *adapter); @@ -1256,6 +1259,7 @@ int mwifiex_cmd_802_11_bg_scan_config(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, void *data_buf); int mwifiex_stop_bg_scan(struct mwifiex_private *priv); +int mwifiex_process_vdll_event(struct mwifiex_private *priv, struct sk_buff *event_skb); /* * This function checks if the queuing is RA based or not. diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c index b5f3821a6a8f2..d142e70a7f0e1 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_event.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c @@ -1088,6 +1088,10 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) mwifiex_dbg(adapter, EVENT, "event: firmware debug info\n"); mwifiex_fw_dump_info_event(priv, adapter->event_skb); break; + case EVENT_VDLL_IND: + mwifiex_dbg(adapter, EVENT, "event: VDLL event\n"); + mwifiex_process_vdll_event(priv, adapter->event_skb); + break; /* Debugging event; not used, but let's not print an ERROR for it. */ case EVENT_UNKNOWN_DEBUG: mwifiex_dbg(adapter, EVENT, "event: debug\n"); diff --git a/drivers/net/wireless/marvell/mwifiex/uap_event.c b/drivers/net/wireless/marvell/mwifiex/uap_event.c index 58ef5020a46a7..80a9c433db64a 100644 --- a/drivers/net/wireless/marvell/mwifiex/uap_event.c +++ b/drivers/net/wireless/marvell/mwifiex/uap_event.c @@ -317,6 +317,10 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv) memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg)); break; + case EVENT_VDLL_IND: + mwifiex_dbg(adapter, EVENT, "event: handle VDLL event...\n"); + mwifiex_process_vdll_event(priv, adapter->event_skb); + break; default: mwifiex_dbg(adapter, EVENT, "event: unknown event id: %#x\n", eventcause); From patchwork Mon Aug 26 07:26:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 13777326 X-Patchwork-Delegate: kvalo@adurom.com Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F58612C54D for ; Mon, 26 Aug 2024 07:27:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657235; cv=none; b=rTRjARbZbg7wjHs/6LzByDw17qEsZqugPeZ7Ug/B3UmaPMBVy67rVIISuS9ZBu2cv9puuTVmPchovEJhod0RKrTteA+jQLWI3XSPLfICqxJ86JnyVX3ws/cQTrG+RA74EHJh9Xxqhm4fxrcR93nDaU5w3joCnmr3QCfWXGKvbTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657235; c=relaxed/simple; bh=NtahUHX9CE0RzYfvV3yhtc/blBQY9V1UzWIWs/MxwLw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=It36yhMQwFxJw+UM8eS7B/Oz1w4HtymPYF1D5b4TdO+pGk8rRWssRT/qTF13b02IhwgApe7PaQ2rSpe818f9Rj3A0f3NtLy/gnmK29DswCfFN3Rn0jRuKz7aMMLjmYZs+q8p7+cGzqgqgyTJNugP5mt7DKwS7P/NfRcHCTHMPnQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1siU7p-0005HS-SJ; Mon, 26 Aug 2024 09:26:53 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1siU7p-0038Ev-6C; Mon, 26 Aug 2024 09:26:53 +0200 Received: from localhost ([::1] helo=dude02.red.stw.pengutronix.de) by dude02.red.stw.pengutronix.de with esmtp (Exim 4.96) (envelope-from ) id 1siU7p-000hSF-0G; Mon, 26 Aug 2024 09:26:53 +0200 From: Sascha Hauer To: Francesco Dolcini Cc: Calvin Owens , Brian Norris , Kalle Valo , David Lin , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 3/4] wifi: mwifiex: wait longer for SDIO card status Date: Mon, 26 Aug 2024 09:26:47 +0200 Message-Id: <20240826072648.167004-4-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240826072648.167004-1-s.hauer@pengutronix.de> References: <20240826072648.167004-1-s.hauer@pengutronix.de> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: s.hauer@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org The IW61x needs longer than the currently used MAX_POLL_TRIES for some operations. Increase the value to 10000 * 10us = 100000us as done in the downstream driver as well. Signed-off-by: Sascha Hauer --- drivers/net/wireless/marvell/mwifiex/sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c index 490ffd981164d..cbcb5674b8036 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.c +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c @@ -1265,7 +1265,7 @@ mwifiex_sdio_poll_card_status(struct mwifiex_adapter *adapter, u8 bits) u32 tries; u8 cs; - for (tries = 0; tries < MAX_POLL_TRIES; tries++) { + for (tries = 0; tries < 10000; tries++) { if (mwifiex_read_reg(adapter, card->reg->poll_reg, &cs)) break; else if ((cs & bits) == bits) From patchwork Mon Aug 26 07:26:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 13777325 X-Patchwork-Delegate: kvalo@adurom.com Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C63EB12CDBE for ; Mon, 26 Aug 2024 07:27:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657233; cv=none; b=Y//vcFh0XtqVQMJW8sx+hl0zreR95HEDG2iD1BHYCpVZGXa/tHc2XaYKDf1WY02LGW5+J5OOCsuDnPHD1SvBuG2E6eCkufBf/DmzUNhllnsWbdUduDldEOih0pp6PHijjYy3Jsh/ATROwzPz4nfiQdDTHae2n94Am3rEjjqM4X8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724657233; c=relaxed/simple; bh=NfggcRePv6t1cR7t6EclMmVFevTXn8I9YcDh8D7YkPU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gjhZjLYM8ipeGE7rQalWPGN4tOucaovl15msnffmL1bnMJ+QcCf/hHUAu+rJUgxRoMjurhsqbsOIpDLMmiIcvLXJVjnomOlqIS2jyRnftZONhkePCcK9XMmOtjeA8n/gveb6UUuwr+nzSLc9RI4WPOGHhHgraNDUvOk2AEmZdcI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1siU7p-0005HT-SK; Mon, 26 Aug 2024 09:26:53 +0200 Received: from [2a0a:edc0:0:1101:1d::28] (helo=dude02.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1siU7p-0038Ey-81; Mon, 26 Aug 2024 09:26:53 +0200 Received: from localhost ([::1] helo=dude02.red.stw.pengutronix.de) by dude02.red.stw.pengutronix.de with esmtp (Exim 4.96) (envelope-from ) id 1siU7p-000hSF-0Q; Mon, 26 Aug 2024 09:26:53 +0200 From: Sascha Hauer To: Francesco Dolcini Cc: Calvin Owens , Brian Norris , Kalle Valo , David Lin , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 4/4] mwifiex: add iw61x support Date: Mon, 26 Aug 2024 09:26:48 +0200 Message-Id: <20240826072648.167004-5-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240826072648.167004-1-s.hauer@pengutronix.de> References: <20240826072648.167004-1-s.hauer@pengutronix.de> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: s.hauer@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-wireless@vger.kernel.org This adds iw61x aka SD9177 support to the mwifiex driver. It is named SD9177 in the downstream driver, I deliberately chose the NXP name in the driver. Signed-off-by: Sascha Hauer --- drivers/net/wireless/marvell/mwifiex/sdio.c | 79 +++++++++++++++++++++ drivers/net/wireless/marvell/mwifiex/sdio.h | 3 + include/linux/mmc/sdio_ids.h | 3 + 3 files changed, 85 insertions(+) diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c index cbcb5674b8036..7b4045a40df57 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.c +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c @@ -318,6 +318,62 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd89xx = { 0x68, 0x69, 0x6a}, }; +static const struct mwifiex_sdio_card_reg mwifiex_reg_iw612 = { + .start_rd_port = 0, + .start_wr_port = 0, + .base_0_reg = 0xF8, + .base_1_reg = 0xF9, + .poll_reg = 0x5C, + .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK | + CMD_PORT_UPLD_INT_MASK | CMD_PORT_DNLD_INT_MASK, + .host_int_rsr_reg = 0x4, + .host_int_status_reg = 0x0C, + .host_int_mask_reg = 0x08, + .host_strap_reg = 0xF4, + .host_strap_mask = 0x01, + .host_strap_value = 0x01, + .status_reg_0 = 0xE8, + .status_reg_1 = 0xE9, + .sdio_int_mask = 0xff, + .data_port_mask = 0xffffffff, + .io_port_0_reg = 0xE4, + .io_port_1_reg = 0xE5, + .io_port_2_reg = 0xE6, + .max_mp_regs = 196, + .rd_bitmap_l = 0x10, + .rd_bitmap_u = 0x11, + .rd_bitmap_1l = 0x12, + .rd_bitmap_1u = 0x13, + .wr_bitmap_l = 0x14, + .wr_bitmap_u = 0x15, + .wr_bitmap_1l = 0x16, + .wr_bitmap_1u = 0x17, + .rd_len_p0_l = 0x18, + .rd_len_p0_u = 0x19, + .card_misc_cfg_reg = 0xd8, + .card_cfg_2_1_reg = 0xd9, + .cmd_rd_len_0 = 0xc0, + .cmd_rd_len_1 = 0xc1, + .cmd_rd_len_2 = 0xc2, + .cmd_rd_len_3 = 0xc3, + .cmd_cfg_0 = 0xc4, + .cmd_cfg_1 = 0xc5, + .cmd_cfg_2 = 0xc6, + .cmd_cfg_3 = 0xc7, + .fw_dump_host_ready = 0xcc, + .fw_dump_ctrl = 0xf0, + .fw_dump_start = 0xf1, + .fw_dump_end = 0xf8, + .func1_dump_reg_start = 0x10, + .func1_dump_reg_end = 0x17, + .func1_scratch_reg = 0xe8, + .func1_spec_reg_num = 13, + .func1_spec_reg_table = {0x08, 0x58, 0x5C, 0x5D, + 0x60, 0x61, 0x62, 0x64, + 0x65, 0x66, 0x68, 0x69, + 0x6a}, +}; + static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = { .firmware = SD8786_DEFAULT_FW_NAME, .reg = &mwifiex_reg_sd87xx, @@ -441,6 +497,25 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = { .host_mlme = false, }; +static const struct mwifiex_sdio_device mwifiex_sdio_iw612 = { + .firmware = IW612_DEFAULT_FW_NAME, + .firmware_sdiouart = IW612_SDIOUART_FW_NAME, + .reg = &mwifiex_reg_iw612, + .max_ports = 32, + .mp_agg_pkt_limit = 16, + .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, + .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX, + .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX, + .supports_sdio_new_mode = true, + .has_control_mask = false, + .can_dump_fw = true, + .fw_dump_enh = true, + .can_auto_tdls = false, + .can_ext_scan = true, + .fw_ready_extra_delay = false, + .host_mlme = true, +}; + static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = { .firmware = SD8887_DEFAULT_FW_NAME, .reg = &mwifiex_reg_sd8887, @@ -974,6 +1049,8 @@ static const struct sdio_device_id mwifiex_ids[] = { .driver_data = (unsigned long)&mwifiex_sdio_sd8987}, {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_WLAN), .driver_data = (unsigned long)&mwifiex_sdio_sd8997}, + {SDIO_DEVICE(SDIO_VENDOR_ID_NXP, SDIO_DEVICE_ID_NXP_IW612_WLAN), + .driver_data = (unsigned long)&mwifiex_sdio_iw612}, {}, }; @@ -3212,3 +3289,5 @@ MODULE_FIRMWARE(SD8978_SDIOUART_FW_NAME); MODULE_FIRMWARE(SD8987_DEFAULT_FW_NAME); MODULE_FIRMWARE(SD8997_DEFAULT_FW_NAME); MODULE_FIRMWARE(SD8997_SDIOUART_FW_NAME); +MODULE_FIRMWARE(IW612_DEFAULT_FW_NAME); +MODULE_FIRMWARE(IW612_SDIOUART_FW_NAME); diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.h b/drivers/net/wireless/marvell/mwifiex/sdio.h index 65d142286c46e..97759456314b0 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.h +++ b/drivers/net/wireless/marvell/mwifiex/sdio.h @@ -29,6 +29,9 @@ #define SD8987_DEFAULT_FW_NAME "mrvl/sd8987_uapsta.bin" #define SD8997_DEFAULT_FW_NAME "mrvl/sdsd8997_combo_v4.bin" #define SD8997_SDIOUART_FW_NAME "mrvl/sdiouart8997_combo_v4.bin" +#define IW612_DEFAULT_FW_NAME "nxp/sdsd_nw61x.bin" +#define IW612_SDIOUART_FW_NAME "nxp/sd_w61x.bin" + #define BLOCK_MODE 1 #define BYTE_MODE 0 diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 7cddfdac2f576..a421c58abd331 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h @@ -115,6 +115,9 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 +#define SDIO_VENDOR_ID_NXP 0x0471 +#define SDIO_DEVICE_ID_NXP_IW612_WLAN 0x0205 + #define SDIO_VENDOR_ID_REALTEK 0x024c #define SDIO_DEVICE_ID_REALTEK_RTW8723BS 0xb723 #define SDIO_DEVICE_ID_REALTEK_RTW8821BS 0xb821