* [PATCH v3 0/3] Add support for Qualcomm WCN3610
@ 2026-03-06 0:43 Kerigan Creighton
2026-03-06 0:43 ` [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible Kerigan Creighton
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Kerigan Creighton @ 2026-03-06 0:43 UTC (permalink / raw)
To: linux-wireless
Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier,
linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt,
devicetree, linux-kernel, Kerigan Creighton
The WCN3610 is a 2.4GHz-only WLAN/BT combo chip used in some
cheaper Android and Windows phones such as the Lumia 550, and
IoT devices like the Anki Vector robot. It shares a lot in
common with the WCN3620.
This series adds support for the WCN3610 across the necessary
subsystems:
* Document the new compatible string (patch 1).
* Add compatible string in qcom_wcnss_iris (patch 2).
* Add rf_id and CFGs for the WCN3610 in wcn36xx, disable
powersave for this specific chip, ensure it is 2.4GHz-only
(patch 3).
Tested on an Anki Vector 1.0 and 2.0 robot. Support for other
WCN36xx chips has not been affected.
Changes in v2:
- Move the Documentation patch to the beginning of the patch set.
- Move remoteproc compatible string addition to the middle of
the patch set.
- Add Reviewed-by Dmitry (thanks!) to remoteproc compatible patch.
- Move wcn36xx driver changes to the end of the patch set.
Changes in v3:
- Describe the hardware rather than the driver in the
dt-bindings patch [Krzysztof].
- Describe why we need a new compatible in the remoteproc
patch [Krzysztof].
- Describe where the CFG values came from in the wcn36xx
driver patch [Konrad].
Kerigan Creighton (3):
dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible
remoteproc: qcom_wcnss_iris: Add support for WCN3610
wifi: wcn36xx: Add support for WCN3610
.../bindings/remoteproc/qcom,wcnss-pil.yaml | 1 +
drivers/net/wireless/ath/wcn36xx/main.c | 4 +-
drivers/net/wireless/ath/wcn36xx/smd.c | 61 ++++++++++++++++++-
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 +
drivers/remoteproc/qcom_wcnss_iris.c | 1 +
5 files changed, 66 insertions(+), 2 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible 2026-03-06 0:43 [PATCH v3 0/3] Add support for Qualcomm WCN3610 Kerigan Creighton @ 2026-03-06 0:43 ` Kerigan Creighton 2026-03-06 7:26 ` Krzysztof Kozlowski 2026-03-06 0:43 ` [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 Kerigan Creighton 2026-03-06 0:43 ` [PATCH v3 3/3] wifi: wcn36xx: " Kerigan Creighton 2 siblings, 1 reply; 8+ messages in thread From: Kerigan Creighton @ 2026-03-06 0:43 UTC (permalink / raw) To: linux-wireless Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel, Kerigan Creighton The Qualcomm WCN3610 is a 2.4GHz-only WLAN/BT combo chip. It's similar to the WCN3620, though more basic. Add a wcn3610 compatible for use in device trees. It needs its own compatible because of chip-specific configuration done in wcn36xx. Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> --- Changes in v2: - Move the Documentation patch to the beginning of the patch set. Changes in v3: - Describe the hardware rather than the driver in the dt-bindings patch [Krzysztof]. --- Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml index 117fb4d0c4..018cdf5177 100644 --- a/Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml +++ b/Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml @@ -109,6 +109,7 @@ properties: properties: compatible: enum: + - qcom,wcn3610 - qcom,wcn3620 - qcom,wcn3660 - qcom,wcn3660b -- 2.53.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible 2026-03-06 0:43 ` [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible Kerigan Creighton @ 2026-03-06 7:26 ` Krzysztof Kozlowski 0 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2026-03-06 7:26 UTC (permalink / raw) To: Kerigan Creighton, linux-wireless Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel On 06/03/2026 01:43, Kerigan Creighton wrote: > The Qualcomm WCN3610 is a 2.4GHz-only WLAN/BT combo chip. > It's similar to the WCN3620, though more basic. Add a > wcn3610 compatible for use in device trees. > > It needs its own compatible because of chip-specific > configuration done in wcn36xx. Please wrap commit message according to Linux coding style / submission process (neither too early nor over the limit): https://elixir.bootlin.com/linux/v6.4-rc1/source/Documentation/process/submitting-patches.rst#L597 With the changes from patch 2: Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 2026-03-06 0:43 [PATCH v3 0/3] Add support for Qualcomm WCN3610 Kerigan Creighton 2026-03-06 0:43 ` [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible Kerigan Creighton @ 2026-03-06 0:43 ` Kerigan Creighton 2026-03-06 7:25 ` Krzysztof Kozlowski 2026-03-06 0:43 ` [PATCH v3 3/3] wifi: wcn36xx: " Kerigan Creighton 2 siblings, 1 reply; 8+ messages in thread From: Kerigan Creighton @ 2026-03-06 0:43 UTC (permalink / raw) To: linux-wireless Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel, Kerigan Creighton, Dmitry Baryshkov WCN3610 has the same regulator requirements as WCN3620, so in qcom_wcnss_iris, we can use wcn3620_data. A separate compatible is needed for WCN3610 because the wcn36xx driver uses it for chip-specific configuration. Specifically, it sets BTC (Bluetooth Coexistence) CFGs, disables ENABLE_DYNAMIC_RA_START_RATE, and disables STA_POWERSAVE for this specific chip for stable functionality. Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> --- Changes in v2: - Move remoteproc compatible string addition to the middle of the patch set. - Add Reviewed-by Dmitry (thanks!) Changes in v3: - Describe why we need a new compatible in the remoteproc patch [Krzysztof]. --- drivers/remoteproc/qcom_wcnss_iris.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/remoteproc/qcom_wcnss_iris.c b/drivers/remoteproc/qcom_wcnss_iris.c index 2b89b4db6c..e58b59355f 100644 --- a/drivers/remoteproc/qcom_wcnss_iris.c +++ b/drivers/remoteproc/qcom_wcnss_iris.c @@ -95,6 +95,7 @@ void qcom_iris_disable(struct qcom_iris *iris) } static const struct of_device_id iris_of_match[] = { + { .compatible = "qcom,wcn3610", .data = &wcn3620_data }, { .compatible = "qcom,wcn3620", .data = &wcn3620_data }, { .compatible = "qcom,wcn3660", .data = &wcn3660_data }, { .compatible = "qcom,wcn3660b", .data = &wcn3680_data }, -- 2.53.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 2026-03-06 0:43 ` [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 Kerigan Creighton @ 2026-03-06 7:25 ` Krzysztof Kozlowski 0 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2026-03-06 7:25 UTC (permalink / raw) To: Kerigan Creighton, linux-wireless Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel, Dmitry Baryshkov On 06/03/2026 01:43, Kerigan Creighton wrote: > WCN3610 has the same regulator requirements as > WCN3620, so in qcom_wcnss_iris, we can use wcn3620_data. > > A separate compatible is needed for WCN3610 because the > wcn36xx driver uses it for chip-specific configuration. > Specifically, it sets BTC (Bluetooth Coexistence) CFGs, > disables ENABLE_DYNAMIC_RA_START_RATE, and disables > STA_POWERSAVE for this specific chip for stable > functionality. This goes to the binding description where you describe the hardware, how I asked. Please wrap commit message according to Linux coding style / submission process (neither too early nor over the limit): https://elixir.bootlin.com/linux/v6.4-rc1/source/Documentation/process/submitting-patches.rst#L597 Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 3/3] wifi: wcn36xx: Add support for WCN3610 2026-03-06 0:43 [PATCH v3 0/3] Add support for Qualcomm WCN3610 Kerigan Creighton 2026-03-06 0:43 ` [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible Kerigan Creighton 2026-03-06 0:43 ` [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 Kerigan Creighton @ 2026-03-06 0:43 ` Kerigan Creighton 2026-03-06 8:41 ` Loic Poulain 2 siblings, 1 reply; 8+ messages in thread From: Kerigan Creighton @ 2026-03-06 0:43 UTC (permalink / raw) To: linux-wireless Cc: loic.poulain, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel, Kerigan Creighton The WCN3610 has a lot in common with the other wcn36xx chips, so much of that code was reused. The WCN3610 requires specific configuration values for stable Wi-Fi. Without these values, there's packet loss. An extra CFG table was made so other chips are not affected. ENABLE_DYNAMIC_RA_START_RATE=0 was discovered from the downstream prima driver. That brought it from 95% to 5% packet loss. The rest of the CFG values came from my own observations and experimentation. The current settings allow for 0% packet loss. STA_POWERSAVE resulted in BMPS errors and unstable functionality, thus it has been disabled for just this chip. Tested on an Anki Vector 1.0 and 2.0 robot with 3 different APs. Support for other WCN36xx chips has not been affected. Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> --- Changes in v2: - Move wcn36xx driver changes to the end of the patch set. Changes in v3: - Describe where the CFG values came from in the wcn36xx driver patch [Konrad]. --- drivers/net/wireless/ath/wcn36xx/main.c | 4 +- drivers/net/wireless/ath/wcn36xx/smd.c | 61 +++++++++++++++++++++- drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index c3f0860873..6c90c13251 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -1438,7 +1438,7 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) BIT(NL80211_IFTYPE_MESH_POINT); wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; - if (wcn->rf_id != RF_IRIS_WCN3620) + if (wcn->rf_id != RF_IRIS_WCN3620 && wcn->rf_id != RF_IRIS_WCN3610) wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; if (wcn->rf_id == RF_IRIS_WCN3680) @@ -1535,6 +1535,8 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, /* External RF module */ iris_node = of_get_child_by_name(mmio_node, "iris"); if (iris_node) { + if (of_device_is_compatible(iris_node, "qcom,wcn3610")) + wcn->rf_id = RF_IRIS_WCN3610; if (of_device_is_compatible(iris_node, "qcom,wcn3620")) wcn->rf_id = RF_IRIS_WCN3620; if (of_device_is_compatible(iris_node, "qcom,wcn3660") || diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c index 813553edcb..8d5a746de7 100644 --- a/drivers/net/wireless/ath/wcn36xx/smd.c +++ b/drivers/net/wireless/ath/wcn36xx/smd.c @@ -83,6 +83,61 @@ static struct wcn36xx_cfg_val wcn36xx_cfg_vals[] = { WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), }; +static struct wcn36xx_cfg_val wcn3610_cfg_vals[] = { + WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), + WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), + WCN36XX_CFG_VAL(LOW_GAIN_OVERRIDE, 0), + WCN36XX_CFG_VAL(POWER_STATE_PER_CHAIN, 785), + WCN36XX_CFG_VAL(CAL_PERIOD, 5), + WCN36XX_CFG_VAL(CAL_CONTROL, 1), + WCN36XX_CFG_VAL(PROXIMITY, 0), + WCN36XX_CFG_VAL(NETWORK_DENSITY, 3), + WCN36XX_CFG_VAL(MAX_MEDIUM_TIME, 6000), + WCN36XX_CFG_VAL(MAX_MPDUS_IN_AMPDU, 64), + WCN36XX_CFG_VAL(RTS_THRESHOLD, 2347), + WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 15), + WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 15), + WCN36XX_CFG_VAL(FRAGMENTATION_THRESHOLD, 8000), + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ZERO, 5), + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ONE, 10), + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_TWO, 15), + WCN36XX_CFG_VAL(FIXED_RATE, 0), + WCN36XX_CFG_VAL(RETRYRATE_POLICY, 4), + WCN36XX_CFG_VAL(RETRYRATE_SECONDARY, 131), + WCN36XX_CFG_VAL(RETRYRATE_TERTIARY, 129), + WCN36XX_CFG_VAL(FORCE_POLICY_PROTECTION, 5), + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_24GHZ, 1), + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_5GHZ, 5), + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_5GHZ, 5), + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_24GHZ, 6), + WCN36XX_CFG_VAL(MAX_BA_SESSIONS, 40), + WCN36XX_CFG_VAL(PS_DATA_INACTIVITY_TIMEOUT, 200), + WCN36XX_CFG_VAL(PS_ENABLE_BCN_FILTER, 1), + WCN36XX_CFG_VAL(PS_ENABLE_RSSI_MONITOR, 1), + WCN36XX_CFG_VAL(NUM_BEACON_PER_RSSI_AVERAGE, 20), + WCN36XX_CFG_VAL(STATS_PERIOD, 10), + WCN36XX_CFG_VAL(CFP_MAX_DURATION, 30000), + WCN36XX_CFG_VAL(FRAME_TRANS_ENABLED, 0), + WCN36XX_CFG_VAL(BA_THRESHOLD_HIGH, 128), + WCN36XX_CFG_VAL(MAX_BA_BUFFERS, 2560), + WCN36XX_CFG_VAL(DYNAMIC_PS_POLL_VALUE, 0), + WCN36XX_CFG_VAL(TX_PWR_CTRL_ENABLE, 1), + WCN36XX_CFG_VAL(ENABLE_CLOSE_LOOP, 1), + WCN36XX_CFG_VAL(ENABLE_LPWR_IMG_TRANSITION, 0), + WCN36XX_CFG_VAL(BTC_EXECUTION_MODE, 2), + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_WLAN_LEN, 90000), + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_BT_LEN, 60000), + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_WLAN_LEN, 30000), + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_BT_LEN, 120000), + WCN36XX_CFG_VAL(BTC_FAST_WLAN_CONN_PREF, 1), + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_BT, 120000), + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_WLAN, 30000), + WCN36XX_CFG_VAL(MAX_ASSOC_LIMIT, 10), + WCN36XX_CFG_VAL(ENABLE_MCC_ADAPTIVE_SCHEDULER, 0), + WCN36XX_CFG_VAL(ENABLE_DYNAMIC_RA_START_RATE, 0), + WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), +}; + static struct wcn36xx_cfg_val wcn3680_cfg_vals[] = { WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), @@ -632,6 +687,9 @@ int wcn36xx_smd_start(struct wcn36xx *wcn) if (wcn->rf_id == RF_IRIS_WCN3680) { cfg_vals = wcn3680_cfg_vals; cfg_elements = ARRAY_SIZE(wcn3680_cfg_vals); + } else if (wcn->rf_id == RF_IRIS_WCN3610) { + cfg_vals = wcn3610_cfg_vals; + cfg_elements = ARRAY_SIZE(wcn3610_cfg_vals); } else { cfg_vals = wcn36xx_cfg_vals; cfg_elements = ARRAY_SIZE(wcn36xx_cfg_vals); @@ -2380,7 +2438,8 @@ int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn) mutex_lock(&wcn->hal_mutex); INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ); - wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); + if (wcn->rf_id != RF_IRIS_WCN3610) + wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); if (wcn->rf_id == RF_IRIS_WCN3680) { wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, DOT11AC); wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, WLAN_CH144); diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h index 7ee79593cd..cb409d48f7 100644 --- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h @@ -96,6 +96,7 @@ enum wcn36xx_ampdu_state { #define WCN36XX_MAX_POWER(__wcn) (__wcn->hw->conf.chandef.chan->max_power) #define RF_UNKNOWN 0x0000 +#define RF_IRIS_WCN3610 0x3610 #define RF_IRIS_WCN3620 0x3620 #define RF_IRIS_WCN3660 0x3660 #define RF_IRIS_WCN3680 0x3680 -- 2.53.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 3/3] wifi: wcn36xx: Add support for WCN3610 2026-03-06 0:43 ` [PATCH v3 3/3] wifi: wcn36xx: " Kerigan Creighton @ 2026-03-06 8:41 ` Loic Poulain 2026-03-06 18:05 ` Kerigan Creighton 0 siblings, 1 reply; 8+ messages in thread From: Loic Poulain @ 2026-03-06 8:41 UTC (permalink / raw) To: Kerigan Creighton Cc: linux-wireless, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel On Fri, Mar 6, 2026 at 1:44 AM Kerigan Creighton <kerigancreighton@gmail.com> wrote: > > The WCN3610 has a lot in common with the other wcn36xx > chips, so much of that code was reused. > > The WCN3610 requires specific configuration values for > stable Wi-Fi. Without these values, there's packet loss. > An extra CFG table was made so other chips are not affected. > > ENABLE_DYNAMIC_RA_START_RATE=0 was discovered from the > downstream prima driver. That brought it from 95% to 5% > packet loss. The rest of the CFG values came from my own > observations and experimentation. The current settings > allow for 0% packet loss. > > STA_POWERSAVE resulted in BMPS errors and unstable > functionality, thus it has been disabled for just this > chip. > > Tested on an Anki Vector 1.0 and 2.0 robot with 3 > different APs. Support for other WCN36xx chips has not > been affected. > > Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> STA_POWERSAVE is disabled, but the interface still enters BMPS mode as controlled by mac80211. If you get the opportunity, It would be useful to air-capture the power‑save entry and exit events when this occurs, so we can verify that the transitions behave as expected. Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com> > --- > Changes in v2: > - Move wcn36xx driver changes to the end of the patch set. > > Changes in v3: > - Describe where the CFG values came from in the wcn36xx > driver patch [Konrad]. > --- > drivers/net/wireless/ath/wcn36xx/main.c | 4 +- > drivers/net/wireless/ath/wcn36xx/smd.c | 61 +++++++++++++++++++++- > drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + > 3 files changed, 64 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c > index c3f0860873..6c90c13251 100644 > --- a/drivers/net/wireless/ath/wcn36xx/main.c > +++ b/drivers/net/wireless/ath/wcn36xx/main.c > @@ -1438,7 +1438,7 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) > BIT(NL80211_IFTYPE_MESH_POINT); > > wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; > - if (wcn->rf_id != RF_IRIS_WCN3620) > + if (wcn->rf_id != RF_IRIS_WCN3620 && wcn->rf_id != RF_IRIS_WCN3610) > wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; > > if (wcn->rf_id == RF_IRIS_WCN3680) > @@ -1535,6 +1535,8 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, > /* External RF module */ > iris_node = of_get_child_by_name(mmio_node, "iris"); > if (iris_node) { > + if (of_device_is_compatible(iris_node, "qcom,wcn3610")) > + wcn->rf_id = RF_IRIS_WCN3610; > if (of_device_is_compatible(iris_node, "qcom,wcn3620")) > wcn->rf_id = RF_IRIS_WCN3620; > if (of_device_is_compatible(iris_node, "qcom,wcn3660") || > diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c > index 813553edcb..8d5a746de7 100644 > --- a/drivers/net/wireless/ath/wcn36xx/smd.c > +++ b/drivers/net/wireless/ath/wcn36xx/smd.c > @@ -83,6 +83,61 @@ static struct wcn36xx_cfg_val wcn36xx_cfg_vals[] = { > WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), > }; > > +static struct wcn36xx_cfg_val wcn3610_cfg_vals[] = { > + WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), > + WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), > + WCN36XX_CFG_VAL(LOW_GAIN_OVERRIDE, 0), > + WCN36XX_CFG_VAL(POWER_STATE_PER_CHAIN, 785), > + WCN36XX_CFG_VAL(CAL_PERIOD, 5), > + WCN36XX_CFG_VAL(CAL_CONTROL, 1), > + WCN36XX_CFG_VAL(PROXIMITY, 0), > + WCN36XX_CFG_VAL(NETWORK_DENSITY, 3), > + WCN36XX_CFG_VAL(MAX_MEDIUM_TIME, 6000), > + WCN36XX_CFG_VAL(MAX_MPDUS_IN_AMPDU, 64), > + WCN36XX_CFG_VAL(RTS_THRESHOLD, 2347), > + WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 15), > + WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 15), > + WCN36XX_CFG_VAL(FRAGMENTATION_THRESHOLD, 8000), > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ZERO, 5), > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ONE, 10), > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_TWO, 15), > + WCN36XX_CFG_VAL(FIXED_RATE, 0), > + WCN36XX_CFG_VAL(RETRYRATE_POLICY, 4), > + WCN36XX_CFG_VAL(RETRYRATE_SECONDARY, 131), > + WCN36XX_CFG_VAL(RETRYRATE_TERTIARY, 129), > + WCN36XX_CFG_VAL(FORCE_POLICY_PROTECTION, 5), > + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_24GHZ, 1), > + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_5GHZ, 5), > + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_5GHZ, 5), > + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_24GHZ, 6), > + WCN36XX_CFG_VAL(MAX_BA_SESSIONS, 40), > + WCN36XX_CFG_VAL(PS_DATA_INACTIVITY_TIMEOUT, 200), > + WCN36XX_CFG_VAL(PS_ENABLE_BCN_FILTER, 1), > + WCN36XX_CFG_VAL(PS_ENABLE_RSSI_MONITOR, 1), > + WCN36XX_CFG_VAL(NUM_BEACON_PER_RSSI_AVERAGE, 20), > + WCN36XX_CFG_VAL(STATS_PERIOD, 10), > + WCN36XX_CFG_VAL(CFP_MAX_DURATION, 30000), > + WCN36XX_CFG_VAL(FRAME_TRANS_ENABLED, 0), > + WCN36XX_CFG_VAL(BA_THRESHOLD_HIGH, 128), > + WCN36XX_CFG_VAL(MAX_BA_BUFFERS, 2560), > + WCN36XX_CFG_VAL(DYNAMIC_PS_POLL_VALUE, 0), > + WCN36XX_CFG_VAL(TX_PWR_CTRL_ENABLE, 1), > + WCN36XX_CFG_VAL(ENABLE_CLOSE_LOOP, 1), > + WCN36XX_CFG_VAL(ENABLE_LPWR_IMG_TRANSITION, 0), > + WCN36XX_CFG_VAL(BTC_EXECUTION_MODE, 2), > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_WLAN_LEN, 90000), > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_BT_LEN, 60000), > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_WLAN_LEN, 30000), > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_BT_LEN, 120000), > + WCN36XX_CFG_VAL(BTC_FAST_WLAN_CONN_PREF, 1), > + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_BT, 120000), > + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_WLAN, 30000), > + WCN36XX_CFG_VAL(MAX_ASSOC_LIMIT, 10), > + WCN36XX_CFG_VAL(ENABLE_MCC_ADAPTIVE_SCHEDULER, 0), > + WCN36XX_CFG_VAL(ENABLE_DYNAMIC_RA_START_RATE, 0), > + WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), > +}; > + > static struct wcn36xx_cfg_val wcn3680_cfg_vals[] = { > WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), > WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), > @@ -632,6 +687,9 @@ int wcn36xx_smd_start(struct wcn36xx *wcn) > if (wcn->rf_id == RF_IRIS_WCN3680) { > cfg_vals = wcn3680_cfg_vals; > cfg_elements = ARRAY_SIZE(wcn3680_cfg_vals); > + } else if (wcn->rf_id == RF_IRIS_WCN3610) { > + cfg_vals = wcn3610_cfg_vals; > + cfg_elements = ARRAY_SIZE(wcn3610_cfg_vals); > } else { > cfg_vals = wcn36xx_cfg_vals; > cfg_elements = ARRAY_SIZE(wcn36xx_cfg_vals); > @@ -2380,7 +2438,8 @@ int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn) > mutex_lock(&wcn->hal_mutex); > INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ); > > - wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); > + if (wcn->rf_id != RF_IRIS_WCN3610) > + wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); > if (wcn->rf_id == RF_IRIS_WCN3680) { > wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, DOT11AC); > wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, WLAN_CH144); > diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > index 7ee79593cd..cb409d48f7 100644 > --- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > +++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > @@ -96,6 +96,7 @@ enum wcn36xx_ampdu_state { > #define WCN36XX_MAX_POWER(__wcn) (__wcn->hw->conf.chandef.chan->max_power) > > #define RF_UNKNOWN 0x0000 > +#define RF_IRIS_WCN3610 0x3610 > #define RF_IRIS_WCN3620 0x3620 > #define RF_IRIS_WCN3660 0x3660 > #define RF_IRIS_WCN3680 0x3680 > -- > 2.53.0 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 3/3] wifi: wcn36xx: Add support for WCN3610 2026-03-06 8:41 ` Loic Poulain @ 2026-03-06 18:05 ` Kerigan Creighton 0 siblings, 0 replies; 8+ messages in thread From: Kerigan Creighton @ 2026-03-06 18:05 UTC (permalink / raw) To: Loic Poulain Cc: linux-wireless, wcn36xx, andersson, mathieu.poirier, linux-remoteproc, linux-arm-msm, robh, krzk+dt, conor+dt, devicetree, linux-kernel On Fri, Mar 6, 2026 at 2:41 AM Loic Poulain <loic.poulain@oss.qualcomm.com> wrote: > > > STA_POWERSAVE resulted in BMPS errors and unstable > > functionality, thus it has been disabled for just this > > chip. > > > > Tested on an Anki Vector 1.0 and 2.0 robot with 3 > > different APs. Support for other WCN36xx chips has not > > been affected. > > > > Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> > > STA_POWERSAVE is disabled, but the interface still enters BMPS mode as > controlled by mac80211. If you get the opportunity, It would be useful > to air-capture the power‑save entry and exit events when this occurs, > so we can verify that the transitions behave as expected. > > Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com> [re-sent with full cc list] I only had the chance to test it with one AP, but wireshark does show clean power-save entry and exit transitions. Once I do more testing, I will make a v4 which: - Adds these power-save findings to the patch 3 commit message - Amends all commit messages so they are wrapped better - Amends patch 1 to include a better description of the hardware Thanks for the review, - Kerigan On Fri, Mar 6, 2026 at 2:41 AM Loic Poulain <loic.poulain@oss.qualcomm.com> wrote: > > On Fri, Mar 6, 2026 at 1:44 AM Kerigan Creighton > <kerigancreighton@gmail.com> wrote: > > > > The WCN3610 has a lot in common with the other wcn36xx > > chips, so much of that code was reused. > > > > The WCN3610 requires specific configuration values for > > stable Wi-Fi. Without these values, there's packet loss. > > An extra CFG table was made so other chips are not affected. > > > > ENABLE_DYNAMIC_RA_START_RATE=0 was discovered from the > > downstream prima driver. That brought it from 95% to 5% > > packet loss. The rest of the CFG values came from my own > > observations and experimentation. The current settings > > allow for 0% packet loss. > > > > STA_POWERSAVE resulted in BMPS errors and unstable > > functionality, thus it has been disabled for just this > > chip. > > > > Tested on an Anki Vector 1.0 and 2.0 robot with 3 > > different APs. Support for other WCN36xx chips has not > > been affected. > > > > Signed-off-by: Kerigan Creighton <kerigancreighton@gmail.com> > > STA_POWERSAVE is disabled, but the interface still enters BMPS mode as > controlled by mac80211. If you get the opportunity, It would be useful > to air-capture the power‑save entry and exit events when this occurs, > so we can verify that the transitions behave as expected. > > Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com> > > > > > --- > > Changes in v2: > > - Move wcn36xx driver changes to the end of the patch set. > > > > Changes in v3: > > - Describe where the CFG values came from in the wcn36xx > > driver patch [Konrad]. > > --- > > drivers/net/wireless/ath/wcn36xx/main.c | 4 +- > > drivers/net/wireless/ath/wcn36xx/smd.c | 61 +++++++++++++++++++++- > > drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + > > 3 files changed, 64 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c > > index c3f0860873..6c90c13251 100644 > > --- a/drivers/net/wireless/ath/wcn36xx/main.c > > +++ b/drivers/net/wireless/ath/wcn36xx/main.c > > @@ -1438,7 +1438,7 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) > > BIT(NL80211_IFTYPE_MESH_POINT); > > > > wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz; > > - if (wcn->rf_id != RF_IRIS_WCN3620) > > + if (wcn->rf_id != RF_IRIS_WCN3620 && wcn->rf_id != RF_IRIS_WCN3610) > > wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz; > > > > if (wcn->rf_id == RF_IRIS_WCN3680) > > @@ -1535,6 +1535,8 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn, > > /* External RF module */ > > iris_node = of_get_child_by_name(mmio_node, "iris"); > > if (iris_node) { > > + if (of_device_is_compatible(iris_node, "qcom,wcn3610")) > > + wcn->rf_id = RF_IRIS_WCN3610; > > if (of_device_is_compatible(iris_node, "qcom,wcn3620")) > > wcn->rf_id = RF_IRIS_WCN3620; > > if (of_device_is_compatible(iris_node, "qcom,wcn3660") || > > diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c > > index 813553edcb..8d5a746de7 100644 > > --- a/drivers/net/wireless/ath/wcn36xx/smd.c > > +++ b/drivers/net/wireless/ath/wcn36xx/smd.c > > @@ -83,6 +83,61 @@ static struct wcn36xx_cfg_val wcn36xx_cfg_vals[] = { > > WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), > > }; > > > > +static struct wcn36xx_cfg_val wcn3610_cfg_vals[] = { > > + WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), > > + WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), > > + WCN36XX_CFG_VAL(LOW_GAIN_OVERRIDE, 0), > > + WCN36XX_CFG_VAL(POWER_STATE_PER_CHAIN, 785), > > + WCN36XX_CFG_VAL(CAL_PERIOD, 5), > > + WCN36XX_CFG_VAL(CAL_CONTROL, 1), > > + WCN36XX_CFG_VAL(PROXIMITY, 0), > > + WCN36XX_CFG_VAL(NETWORK_DENSITY, 3), > > + WCN36XX_CFG_VAL(MAX_MEDIUM_TIME, 6000), > > + WCN36XX_CFG_VAL(MAX_MPDUS_IN_AMPDU, 64), > > + WCN36XX_CFG_VAL(RTS_THRESHOLD, 2347), > > + WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 15), > > + WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 15), > > + WCN36XX_CFG_VAL(FRAGMENTATION_THRESHOLD, 8000), > > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ZERO, 5), > > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ONE, 10), > > + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_TWO, 15), > > + WCN36XX_CFG_VAL(FIXED_RATE, 0), > > + WCN36XX_CFG_VAL(RETRYRATE_POLICY, 4), > > + WCN36XX_CFG_VAL(RETRYRATE_SECONDARY, 131), > > + WCN36XX_CFG_VAL(RETRYRATE_TERTIARY, 129), > > + WCN36XX_CFG_VAL(FORCE_POLICY_PROTECTION, 5), > > + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_24GHZ, 1), > > + WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_5GHZ, 5), > > + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_5GHZ, 5), > > + WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_24GHZ, 6), > > + WCN36XX_CFG_VAL(MAX_BA_SESSIONS, 40), > > + WCN36XX_CFG_VAL(PS_DATA_INACTIVITY_TIMEOUT, 200), > > + WCN36XX_CFG_VAL(PS_ENABLE_BCN_FILTER, 1), > > + WCN36XX_CFG_VAL(PS_ENABLE_RSSI_MONITOR, 1), > > + WCN36XX_CFG_VAL(NUM_BEACON_PER_RSSI_AVERAGE, 20), > > + WCN36XX_CFG_VAL(STATS_PERIOD, 10), > > + WCN36XX_CFG_VAL(CFP_MAX_DURATION, 30000), > > + WCN36XX_CFG_VAL(FRAME_TRANS_ENABLED, 0), > > + WCN36XX_CFG_VAL(BA_THRESHOLD_HIGH, 128), > > + WCN36XX_CFG_VAL(MAX_BA_BUFFERS, 2560), > > + WCN36XX_CFG_VAL(DYNAMIC_PS_POLL_VALUE, 0), > > + WCN36XX_CFG_VAL(TX_PWR_CTRL_ENABLE, 1), > > + WCN36XX_CFG_VAL(ENABLE_CLOSE_LOOP, 1), > > + WCN36XX_CFG_VAL(ENABLE_LPWR_IMG_TRANSITION, 0), > > + WCN36XX_CFG_VAL(BTC_EXECUTION_MODE, 2), > > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_WLAN_LEN, 90000), > > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_ACTIVE_BT_LEN, 60000), > > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_WLAN_LEN, 30000), > > + WCN36XX_CFG_VAL(BTC_STATIC_OPP_WLAN_IDLE_BT_LEN, 120000), > > + WCN36XX_CFG_VAL(BTC_FAST_WLAN_CONN_PREF, 1), > > + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_BT, 120000), > > + WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_WLAN, 30000), > > + WCN36XX_CFG_VAL(MAX_ASSOC_LIMIT, 10), > > + WCN36XX_CFG_VAL(ENABLE_MCC_ADAPTIVE_SCHEDULER, 0), > > + WCN36XX_CFG_VAL(ENABLE_DYNAMIC_RA_START_RATE, 0), > > + WCN36XX_CFG_VAL(LINK_FAIL_TX_CNT, 1000), > > +}; > > + > > static struct wcn36xx_cfg_val wcn3680_cfg_vals[] = { > > WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1), > > WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1), > > @@ -632,6 +687,9 @@ int wcn36xx_smd_start(struct wcn36xx *wcn) > > if (wcn->rf_id == RF_IRIS_WCN3680) { > > cfg_vals = wcn3680_cfg_vals; > > cfg_elements = ARRAY_SIZE(wcn3680_cfg_vals); > > + } else if (wcn->rf_id == RF_IRIS_WCN3610) { > > + cfg_vals = wcn3610_cfg_vals; > > + cfg_elements = ARRAY_SIZE(wcn3610_cfg_vals); > > } else { > > cfg_vals = wcn36xx_cfg_vals; > > cfg_elements = ARRAY_SIZE(wcn36xx_cfg_vals); > > @@ -2380,7 +2438,8 @@ int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn) > > mutex_lock(&wcn->hal_mutex); > > INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ); > > > > - wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); > > + if (wcn->rf_id != RF_IRIS_WCN3610) > > + wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, STA_POWERSAVE); > > if (wcn->rf_id == RF_IRIS_WCN3680) { > > wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, DOT11AC); > > wcn36xx_firmware_set_feat_caps(msg_body.feat_caps, WLAN_CH144); > > diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > > index 7ee79593cd..cb409d48f7 100644 > > --- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > > +++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h > > @@ -96,6 +96,7 @@ enum wcn36xx_ampdu_state { > > #define WCN36XX_MAX_POWER(__wcn) (__wcn->hw->conf.chandef.chan->max_power) > > > > #define RF_UNKNOWN 0x0000 > > +#define RF_IRIS_WCN3610 0x3610 > > #define RF_IRIS_WCN3620 0x3620 > > #define RF_IRIS_WCN3660 0x3660 > > #define RF_IRIS_WCN3680 0x3680 > > -- > > 2.53.0 > > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-03-06 18:06 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-06 0:43 [PATCH v3 0/3] Add support for Qualcomm WCN3610 Kerigan Creighton 2026-03-06 0:43 ` [PATCH v3 1/3] dt-bindings: remoteproc: qcom,wcnss-pil: Add wcn3610 compatible Kerigan Creighton 2026-03-06 7:26 ` Krzysztof Kozlowski 2026-03-06 0:43 ` [PATCH v3 2/3] remoteproc: qcom_wcnss_iris: Add support for WCN3610 Kerigan Creighton 2026-03-06 7:25 ` Krzysztof Kozlowski 2026-03-06 0:43 ` [PATCH v3 3/3] wifi: wcn36xx: " Kerigan Creighton 2026-03-06 8:41 ` Loic Poulain 2026-03-06 18:05 ` Kerigan Creighton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox