Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Mar 2018 05:44:16 +0000 (UTC)
From:      Eitan Adler <eadler@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r330167 - stable/11/sys/dev/iwm
Message-ID:  <201803010544.w215iGSi031292@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: eadler
Date: Thu Mar  1 05:44:16 2018
New Revision: 330167
URL: https://svnweb.freebsd.org/changeset/base/330167

Log:
  MFC r313314:
  
  [iwm] Sync valid_tx_ant and valid_rx_ant mask handling with iwlwifi.
  
  * This fixes the phy_cfg field sent in the iwm_send_phy_cfg_cmd()
    command, which wasn't taking into account the valid_rx_ant and
    valid_tx_ant masks from nvm_data before.
  
  Tested:
  
  * 7260, STA mode, 2G and 5G

Modified:
  stable/11/sys/dev/iwm/if_iwm.c
  stable/11/sys/dev/iwm/if_iwm_phy_ctxt.c
  stable/11/sys/dev/iwm/if_iwm_scan.c
  stable/11/sys/dev/iwm/if_iwm_util.c
  stable/11/sys/dev/iwm/if_iwm_util.h
  stable/11/sys/dev/iwm/if_iwmvar.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/iwm/if_iwm.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm.c	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwm.c	Thu Mar  1 05:44:16 2018	(r330167)
@@ -771,8 +771,14 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
 				    (int) tlv_len);
 				goto parse_out;
 			}
-			sc->sc_fw_phy_config =
+			sc->sc_fw.phy_config =
 			    le32toh(*(const uint32_t *)tlv_data);
+			sc->sc_fw.valid_tx_ant = (sc->sc_fw.phy_config &
+						  IWM_FW_PHY_CFG_TX_CHAIN) >>
+						  IWM_FW_PHY_CFG_TX_CHAIN_POS;
+			sc->sc_fw.valid_rx_ant = (sc->sc_fw.phy_config &
+						  IWM_FW_PHY_CFG_RX_CHAIN) >>
+						  IWM_FW_PHY_CFG_RX_CHAIN_POS;
 			break;
 
 		case IWM_UCODE_TLV_API_CHANGES_SET: {
@@ -1401,12 +1407,13 @@ iwm_mvm_nic_config(struct iwm_softc *sc)
 {
 	uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
 	uint32_t reg_val = 0;
+	uint32_t phy_config = iwm_mvm_get_phy_config(sc);
 
-	radio_cfg_type = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
+	radio_cfg_type = (phy_config & IWM_FW_PHY_CFG_RADIO_TYPE) >>
 	    IWM_FW_PHY_CFG_RADIO_TYPE_POS;
-	radio_cfg_step = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_STEP) >>
+	radio_cfg_step = (phy_config & IWM_FW_PHY_CFG_RADIO_STEP) >>
 	    IWM_FW_PHY_CFG_RADIO_STEP_POS;
-	radio_cfg_dash = (sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RADIO_DASH) >>
+	radio_cfg_dash = (phy_config & IWM_FW_PHY_CFG_RADIO_DASH) >>
 	    IWM_FW_PHY_CFG_RADIO_DASH_POS;
 
 	/* SKU control */
@@ -2696,7 +2703,7 @@ iwm_send_phy_cfg_cmd(struct iwm_softc *sc)
 	enum iwm_ucode_type ucode_type = sc->sc_uc_current;
 
 	/* Set parameters */
-	phy_cfg_cmd.phy_cfg = htole32(sc->sc_fw_phy_config);
+	phy_cfg_cmd.phy_cfg = htole32(iwm_mvm_get_phy_config(sc));
 	phy_cfg_cmd.calib_control.event_trigger =
 	    sc->sc_default_calib[ucode_type].event_trigger;
 	phy_cfg_cmd.calib_control.flow_trigger =
@@ -2783,6 +2790,7 @@ iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justn
 	if (error != 0)
 		return error;
 
+#if 0
 	IWM_DPRINTF(sc, IWM_DEBUG_RESET,
 	    "%s: phy_txant=0x%08x, nvm_valid_tx_ant=0x%02x, valid=0x%02x\n",
 	    __func__,
@@ -2790,10 +2798,11 @@ iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justn
 	      >> IWM_FW_PHY_CFG_TX_CHAIN_POS),
 	    sc->nvm_data->valid_tx_ant,
 	    iwm_fw_valid_tx_ant(sc));
+#endif
 
-
 	/* Send TX valid antennas before triggering calibrations */
-	if ((error = iwm_send_tx_ant_cfg(sc, iwm_fw_valid_tx_ant(sc))) != 0) {
+	error = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
+	if (error != 0) {
 		device_printf(sc->sc_dev,
 		    "failed to send antennas before calibration: %d\n", error);
 		return error;
@@ -4212,11 +4221,11 @@ iwm_setrates(struct iwm_softc *sc, struct iwm_node *in
 
 #if 0
 		if (txant == 0)
-			txant = iwm_fw_valid_tx_ant(sc);
+			txant = iwm_mvm_get_valid_tx_ant(sc);
 		nextant = 1<<(ffs(txant)-1);
 		txant &= ~nextant;
 #else
-		nextant = iwm_fw_valid_tx_ant(sc);
+		nextant = iwm_mvm_get_valid_tx_ant(sc);
 #endif
 		/*
 		 * Map the rate id into a rate index into
@@ -4682,7 +4691,8 @@ iwm_init_hw(struct iwm_softc *sc)
 		goto error;
 	}
 
-	if ((error = iwm_send_tx_ant_cfg(sc, iwm_fw_valid_tx_ant(sc))) != 0) {
+	error = iwm_send_tx_ant_cfg(sc, iwm_mvm_get_valid_tx_ant(sc));
+	if (error != 0) {
 		device_printf(sc->sc_dev, "antenna config failed\n");
 		goto error;
 	}

Modified: stable/11/sys/dev/iwm/if_iwm_phy_ctxt.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm_phy_ctxt.c	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwm_phy_ctxt.c	Thu Mar  1 05:44:16 2018	(r330167)
@@ -202,8 +202,8 @@ iwm_mvm_phy_ctxt_cmd_data(struct iwm_softc *sc,
 	    ieee80211_chan2ieee(ic, chan),
 	    chains_static,
 	    chains_dynamic,
-	    iwm_fw_valid_rx_ant(sc),
-	    iwm_fw_valid_tx_ant(sc));
+	    iwm_mvm_get_valid_rx_ant(sc),
+	    iwm_mvm_get_valid_tx_ant(sc));
 
 
 	cmd->ci.band = IEEE80211_IS_CHAN_2GHZ(chan) ?
@@ -217,13 +217,13 @@ iwm_mvm_phy_ctxt_cmd_data(struct iwm_softc *sc,
 	idle_cnt = chains_static;
 	active_cnt = chains_dynamic;
 
-	cmd->rxchain_info = htole32(iwm_fw_valid_rx_ant(sc) <<
+	cmd->rxchain_info = htole32(iwm_mvm_get_valid_rx_ant(sc) <<
 					IWM_PHY_RX_CHAIN_VALID_POS);
 	cmd->rxchain_info |= htole32(idle_cnt << IWM_PHY_RX_CHAIN_CNT_POS);
 	cmd->rxchain_info |= htole32(active_cnt <<
 	    IWM_PHY_RX_CHAIN_MIMO_CNT_POS);
 
-	cmd->txchain_info = htole32(iwm_fw_valid_tx_ant(sc));
+	cmd->txchain_info = htole32(iwm_mvm_get_valid_tx_ant(sc));
 }
 
 /*

Modified: stable/11/sys/dev/iwm/if_iwm_scan.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm_scan.c	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwm_scan.c	Thu Mar  1 05:44:16 2018	(r330167)
@@ -172,7 +172,7 @@ iwm_mvm_scan_rx_chain(struct iwm_softc *sc)
 	uint16_t rx_chain;
 	uint8_t rx_ant;
 
-	rx_ant = iwm_fw_valid_rx_ant(sc);
+	rx_ant = iwm_mvm_get_valid_rx_ant(sc);
 	rx_chain = rx_ant << IWM_PHY_RX_CHAIN_VALID_POS;
 	rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_MIMO_SEL_POS;
 	rx_chain |= rx_ant << IWM_PHY_RX_CHAIN_FORCE_SEL_POS;
@@ -209,7 +209,7 @@ iwm_mvm_scan_rate_n_flags(struct iwm_softc *sc, int fl
 	for (i = 0, ind = sc->sc_scan_last_antenna;
 	    i < IWM_RATE_MCS_ANT_NUM; i++) {
 		ind = (ind + 1) % IWM_RATE_MCS_ANT_NUM;
-		if (iwm_fw_valid_tx_ant(sc) & (1 << ind)) {
+		if (iwm_mvm_get_valid_tx_ant(sc) & (1 << ind)) {
 			sc->sc_scan_last_antenna = ind;
 			break;
 		}
@@ -469,8 +469,8 @@ iwm_mvm_config_umac_scan(struct iwm_softc *sc)
 	if (scan_config == NULL)
 		return ENOMEM;
 
-	scan_config->tx_chains = htole32(iwm_fw_valid_tx_ant(sc));
-	scan_config->rx_chains = htole32(iwm_fw_valid_rx_ant(sc));
+	scan_config->tx_chains = htole32(iwm_mvm_get_valid_tx_ant(sc));
+	scan_config->rx_chains = htole32(iwm_mvm_get_valid_rx_ant(sc));
 	scan_config->legacy_rates = htole32(rates |
 	    IWM_SCAN_CONFIG_SUPPORTED_RATE(rates));
 

Modified: stable/11/sys/dev/iwm/if_iwm_util.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm_util.c	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwm_util.c	Thu Mar  1 05:44:16 2018	(r330167)
@@ -428,31 +428,3 @@ iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cm
 	sc->sc_wantresp = -1;
 	wakeup(&sc->sc_wantresp);
 }
-
-uint8_t
-iwm_fw_valid_tx_ant(struct iwm_softc *sc)
-{
-	uint8_t tx_ant;
-
-	tx_ant = ((sc->sc_fw_phy_config & IWM_FW_PHY_CFG_TX_CHAIN)
-	    >> IWM_FW_PHY_CFG_TX_CHAIN_POS);
-
-	if (sc->nvm_data->valid_tx_ant)
-		tx_ant &= sc->nvm_data->valid_tx_ant;
-
-	return tx_ant;
-}
-
-uint8_t
-iwm_fw_valid_rx_ant(struct iwm_softc *sc)
-{
-	uint8_t rx_ant;
-
-	rx_ant = ((sc->sc_fw_phy_config & IWM_FW_PHY_CFG_RX_CHAIN)
-	    >> IWM_FW_PHY_CFG_RX_CHAIN_POS);
-
-	if (sc->nvm_data->valid_rx_ant)
-		rx_ant &= sc->nvm_data->valid_rx_ant;
-
-	return rx_ant;
-}

Modified: stable/11/sys/dev/iwm/if_iwm_util.h
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm_util.h	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwm_util.h	Thu Mar  1 05:44:16 2018	(r330167)
@@ -116,7 +116,34 @@ extern	int iwm_mvm_send_cmd_pdu_status(struct iwm_soft
 	uint16_t len, const void *data, uint32_t *status);
 extern	void iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd);
 
-extern	uint8_t iwm_fw_valid_tx_ant(struct iwm_softc *sc);
-extern	uint8_t iwm_fw_valid_rx_ant(struct iwm_softc *sc);
+static inline uint8_t
+iwm_mvm_get_valid_tx_ant(struct iwm_softc *sc)
+{
+	return sc->nvm_data && sc->nvm_data->valid_tx_ant ?
+	       sc->sc_fw.valid_tx_ant & sc->nvm_data->valid_tx_ant :
+	       sc->sc_fw.valid_tx_ant;
+}
+
+static inline uint8_t
+iwm_mvm_get_valid_rx_ant(struct iwm_softc *sc)
+{
+	return sc->nvm_data && sc->nvm_data->valid_rx_ant ?
+	       sc->sc_fw.valid_rx_ant & sc->nvm_data->valid_rx_ant :
+	       sc->sc_fw.valid_rx_ant;
+}
+
+static inline uint32_t
+iwm_mvm_get_phy_config(struct iwm_softc *sc)
+{
+	uint32_t phy_config = ~(IWM_FW_PHY_CFG_TX_CHAIN |
+				IWM_FW_PHY_CFG_RX_CHAIN);
+	uint32_t valid_rx_ant = iwm_mvm_get_valid_rx_ant(sc);
+	uint32_t valid_tx_ant = iwm_mvm_get_valid_tx_ant(sc);
+
+	phy_config |= valid_tx_ant << IWM_FW_PHY_CFG_TX_CHAIN_POS |
+		      valid_rx_ant << IWM_FW_PHY_CFG_RX_CHAIN_POS;
+
+	return sc->sc_fw.phy_config & phy_config;
+}
 
 #endif	/* __IF_IWM_UTIL_H__ */

Modified: stable/11/sys/dev/iwm/if_iwmvar.h
==============================================================================
--- stable/11/sys/dev/iwm/if_iwmvar.h	Thu Mar  1 05:43:10 2018	(r330166)
+++ stable/11/sys/dev/iwm/if_iwmvar.h	Thu Mar  1 05:44:16 2018	(r330167)
@@ -172,6 +172,10 @@ struct iwm_fw_info {
 		} fw_sect[IWM_UCODE_SECT_MAX];
 		int fw_count;
 	} fw_sects[IWM_UCODE_TYPE_MAX];
+
+	uint32_t phy_config;
+	uint8_t valid_tx_ant;
+	uint8_t valid_rx_ant;
 };
 
 struct iwm_nvm_data {
@@ -464,7 +468,6 @@ struct iwm_softc {
 
 	bus_size_t		sc_fwdmasegsz;
 	struct iwm_fw_info	sc_fw;
-	int			sc_fw_phy_config;
 	struct iwm_tlv_calib_ctrl sc_default_calib[IWM_UCODE_TYPE_MAX];
 
 	const struct iwm_cfg	*cfg;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803010544.w215iGSi031292>