|
@@ -1844,6 +1844,49 @@ static void iwl3945_irq_tasklet(struct iwl_priv *priv)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+static int iwl3945_get_single_channel_for_scan(struct iwl_priv *priv,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ enum ieee80211_band band,
|
|
|
+ struct iwl3945_scan_channel *scan_ch)
|
|
|
+{
|
|
|
+ const struct ieee80211_supported_band *sband;
|
|
|
+ u16 passive_dwell = 0;
|
|
|
+ u16 active_dwell = 0;
|
|
|
+ int added = 0;
|
|
|
+ u8 channel = 0;
|
|
|
+
|
|
|
+ sband = iwl_get_hw_mode(priv, band);
|
|
|
+ if (!sband) {
|
|
|
+ IWL_ERR(priv, "invalid band\n");
|
|
|
+ return added;
|
|
|
+ }
|
|
|
+
|
|
|
+ active_dwell = iwl_get_active_dwell_time(priv, band, 0);
|
|
|
+ passive_dwell = iwl_get_passive_dwell_time(priv, band, vif);
|
|
|
+
|
|
|
+ if (passive_dwell <= active_dwell)
|
|
|
+ passive_dwell = active_dwell + 1;
|
|
|
+
|
|
|
+
|
|
|
+ channel = iwl_get_single_channel_number(priv, band);
|
|
|
+
|
|
|
+ if (channel) {
|
|
|
+ scan_ch->channel = channel;
|
|
|
+ scan_ch->type = 0; /* passive */
|
|
|
+ scan_ch->active_dwell = cpu_to_le16(active_dwell);
|
|
|
+ scan_ch->passive_dwell = cpu_to_le16(passive_dwell);
|
|
|
+ /* Set txpower levels to defaults */
|
|
|
+ scan_ch->tpc.dsp_atten = 110;
|
|
|
+ if (band == IEEE80211_BAND_5GHZ)
|
|
|
+ scan_ch->tpc.tx_gain = ((1 << 5) | (3 << 3)) | 3;
|
|
|
+ else
|
|
|
+ scan_ch->tpc.tx_gain = ((1 << 5) | (5 << 3));
|
|
|
+ added++;
|
|
|
+ } else
|
|
|
+ IWL_ERR(priv, "no valid channel found\n");
|
|
|
+ return added;
|
|
|
+}
|
|
|
+
|
|
|
static int iwl3945_get_channels_for_scan(struct iwl_priv *priv,
|
|
|
enum ieee80211_band band,
|
|
|
u8 is_active, u8 n_probes,
|
|
@@ -2992,9 +3035,16 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
|
|
|
/* select Rx antennas */
|
|
|
scan->flags |= iwl3945_get_antenna_flags(priv);
|
|
|
|
|
|
- scan->channel_count =
|
|
|
- iwl3945_get_channels_for_scan(priv, band, is_active, n_probes,
|
|
|
- (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)], vif);
|
|
|
+ if (priv->is_internal_short_scan) {
|
|
|
+ scan->channel_count =
|
|
|
+ iwl3945_get_single_channel_for_scan(priv, vif, band,
|
|
|
+ (void *)&scan->data[le16_to_cpu(
|
|
|
+ scan->tx_cmd.len)]);
|
|
|
+ } else {
|
|
|
+ scan->channel_count =
|
|
|
+ iwl3945_get_channels_for_scan(priv, band, is_active, n_probes,
|
|
|
+ (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)], vif);
|
|
|
+ }
|
|
|
|
|
|
if (scan->channel_count == 0) {
|
|
|
IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count);
|