Search Linux Wireless

re: iwlagn: use 6 Mbps rate for no-CCK scans

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Johannes Berg,

This is a semi-automatic email about new static checker warnings.

The patch 3a8aea098c8e: "iwlagn: use 6 Mbps rate for no-CCK scans" 
from Oct 14, 2011, leads to the following Smatch complaint:

drivers/net/wireless/iwlwifi/iwl-scan.c +782 iwlagn_request_scan()
	 error: we previously assumed 'priv->scan_request' could be null (see line 681)

drivers/net/wireless/iwlwifi/iwl-scan.c
   680					       >> RXON_FLG_CHANNEL_MODE_POS;
   681			if ((priv->scan_request && priv->scan_request->no_cck) ||
                             ^^^^^^^^^^^^^^^^^^
newly introduced check.  (Probably not needed.  Nothing else in this
function checks this).

   682			    chan_mod == CHANNEL_MODE_PURE_40) {
   683				rate = IWL_RATE_6M_PLCP;
   684			} else {
   685				rate = IWL_RATE_1M_PLCP;
   686				rate_flags = RATE_MCS_CCK_MSK;
   687			}
   688			/*
   689			 * Internal scans are passive, so we can indiscriminately set
   690			 * the BT ignore flag on 2.4 GHz since it applies to TX only.
   691			 */
   692			if (priv->cfg->bt_params &&
   693			    priv->cfg->bt_params->advanced_bt_coexist)
   694				scan->tx_cmd.tx_flags |= TX_CMD_FLG_IGNORE_BT;
   695			break;
   696		case IEEE80211_BAND_5GHZ:
   697			rate = IWL_RATE_6M_PLCP;
   698			break;
   699		default:
   700			IWL_WARN(priv, "Invalid scan band\n");
   701			return -EIO;
   702		}
   703	
   704		/*
   705		 * If active scanning is requested but a certain channel is
   706		 * marked passive, we can do active scanning if we detect
   707		 * transmissions.
   708		 *
   709		 * There is an issue with some firmware versions that triggers
   710		 * a sysassert on a "good CRC threshold" of zero (== disabled),
   711		 * on a radar channel even though this means that we should NOT
   712		 * send probes.
   713		 *
   714		 * The "good CRC threshold" is the number of frames that we
   715		 * need to receive during our dwell time on a channel before
   716		 * sending out probes -- setting this to a huge value will
   717		 * mean we never reach it, but at the same time work around
   718		 * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER
   719		 * here instead of IWL_GOOD_CRC_TH_DISABLED.
   720		 *
   721		 * This was fixed in later versions along with some other
   722		 * scan changes, and the threshold behaves as a flag in those
   723		 * versions.
   724		 */
   725		if (priv->new_scan_threshold_behaviour)
   726			scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
   727							IWL_GOOD_CRC_TH_DISABLED;
   728		else
   729			scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
   730							IWL_GOOD_CRC_TH_NEVER;
   731	
   732		band = priv->scan_band;
   733	
   734		if (priv->cfg->scan_rx_antennas[band])
   735			rx_ant = priv->cfg->scan_rx_antennas[band];
   736	
   737		if (band == IEEE80211_BAND_2GHZ &&
   738		    priv->cfg->bt_params &&
   739		    priv->cfg->bt_params->advanced_bt_coexist) {
   740			/* transmit 2.4 GHz probes only on first antenna */
   741			scan_tx_antennas = first_antenna(scan_tx_antennas);
   742		}
   743	
   744		priv->scan_tx_ant[band] = iwl_toggle_tx_ant(priv,
   745							    priv->scan_tx_ant[band],
   746							    scan_tx_antennas);
   747		rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
   748		scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags);
   749	
   750		/* In power save mode use one chain, otherwise use all chains */
   751		if (test_bit(STATUS_POWER_PMI, &priv->shrd->status)) {
   752			/* rx_ant has been set to all valid chains previously */
   753			active_chains = rx_ant &
   754					((u8)(priv->chain_noise_data.active_chains));
   755			if (!active_chains)
   756				active_chains = rx_ant;
   757	
   758			IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n",
   759					priv->chain_noise_data.active_chains);
   760	
   761			rx_ant = first_antenna(active_chains);
   762		}
   763		if (priv->cfg->bt_params &&
   764		    priv->cfg->bt_params->advanced_bt_coexist &&
   765		    priv->bt_full_concurrent) {
   766			/* operated as 1x1 in full concurrency mode */
   767			rx_ant = first_antenna(rx_ant);
   768		}
   769	
   770		/* MIMO is not used here, but value is required */
   771		rx_chain |=
   772			hw_params(priv).valid_rx_ant << RXON_RX_CHAIN_VALID_POS;
   773		rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
   774		rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
   775		rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
   776		scan->rx_chain = cpu_to_le16(rx_chain);
   777		switch (priv->scan_type) {
   778		case IWL_SCAN_NORMAL:
   779			cmd_len = iwl_fill_probe_req(priv,
   780						(struct ieee80211_mgmt *)scan->data,
   781						vif->addr,
   782						priv->scan_request->ie,
                                                ^^^^^^^^^^^^^^^^^^^^
unchecked dereference.

   783						priv->scan_request->ie_len,
   784						IWL_MAX_SCAN_SIZE - sizeof(*scan));

regards,
dan carpenter

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux