git: ed92055cb8e7 - main - iwm: bring IWM_CSR_HW_IF_CONFIG_REG programming in line with openbsd

From: Adrian Chadd <adrian_at_FreeBSD.org>
Date: Thu, 15 Oct 2026 02:19:05 UTC
The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=ed92055cb8e72d0a2055dc3e2f8fa96853c71d50

commit ed92055cb8e72d0a2055dc3e2f8fa96853c71d50
Author:     Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2026-10-15 01:49:16 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-10-15 01:49:18 +0000

    iwm: bring IWM_CSR_HW_IF_CONFIG_REG programming in line with openbsd
    
    bring the iwm_nic_config() / IWM_CSR_HW_IF_CONFIG_REG programming
    in line with openbsd.
    
    Locally tested:
    
    * 3160 STA mode
    * 7260 STA mode
    * 8260 STA mode
    * 9260 STA mode
    
    Obtained from: OpenBSD a6e25c727a2214219715b51ba6af2221d7e0d674
    
    Differential Revision:  https://reviews.freebsd.org/D60081
---
 sys/dev/iwm/if_iwm.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/sys/dev/iwm/if_iwm.c b/sys/dev/iwm/if_iwm.c
index 610156681272..dd154e44aa8f 100644
--- a/sys/dev/iwm/if_iwm.c
+++ b/sys/dev/iwm/if_iwm.c
@@ -1469,7 +1469,7 @@ static void
 iwm_nic_config(struct iwm_softc *sc)
 {
 	uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
-	uint32_t reg_val = 0;
+	uint32_t mask, val, reg_val = 0;
 	uint32_t phy_config = iwm_get_phy_config(sc);
 
 	radio_cfg_type = (phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
@@ -1490,15 +1490,18 @@ iwm_nic_config(struct iwm_softc *sc)
 	reg_val |= radio_cfg_step << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
 	reg_val |= radio_cfg_dash << IWM_CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;
 
-	IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG,
-	    IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH |
+	mask = IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH |
 	    IWM_CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP |
 	    IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_STEP |
 	    IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH |
 	    IWM_CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE |
 	    IWM_CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
-	    IWM_CSR_HW_IF_CONFIG_REG_BIT_MAC_SI |
-	    reg_val);
+	    IWM_CSR_HW_IF_CONFIG_REG_BIT_MAC_SI;
+
+	val = IWM_READ(sc, IWM_CSR_HW_IF_CONFIG_REG);
+	val &= ~mask;
+	val |= reg_val;
+	IWM_WRITE(sc, IWM_CSR_HW_IF_CONFIG_REG, val);
 
 	IWM_DPRINTF(sc, IWM_DEBUG_RESET,
 	    "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type,