|
@@ -3383,137 +3383,6 @@ static void iwl3945_init_hw_rates(struct iwl_priv *priv,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * iwl3945_init_geos - Initialize mac80211's geo/channel info based from eeprom
|
|
|
- */
|
|
|
-#define IEEE80211_24GHZ_MAX_CHANNEL 14
|
|
|
-static int iwl3945_init_geos(struct iwl_priv *priv)
|
|
|
-{
|
|
|
- struct iwl_channel_info *ch;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
- struct ieee80211_channel *channels;
|
|
|
- struct ieee80211_channel *geo_ch;
|
|
|
- struct ieee80211_rate *rates;
|
|
|
- int i = 0;
|
|
|
-
|
|
|
- if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates ||
|
|
|
- priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) {
|
|
|
- IWL_DEBUG_INFO("Geography modes already initialized.\n");
|
|
|
- set_bit(STATUS_GEO_CONFIGURED, &priv->status);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- channels = kzalloc(sizeof(struct ieee80211_channel) *
|
|
|
- priv->channel_count, GFP_KERNEL);
|
|
|
- if (!channels)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- rates = kzalloc((sizeof(struct ieee80211_rate) * (IWL_RATE_COUNT + 1)),
|
|
|
- GFP_KERNEL);
|
|
|
- if (!rates) {
|
|
|
- kfree(channels);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- /* 5.2GHz channels start after the 2.4GHz channels */
|
|
|
- sband = &priv->bands[IEEE80211_BAND_5GHZ];
|
|
|
- sband->channels = &channels[IEEE80211_24GHZ_MAX_CHANNEL];
|
|
|
- /* just OFDM */
|
|
|
- sband->bitrates = &rates[IWL_FIRST_OFDM_RATE];
|
|
|
- sband->n_bitrates = IWL_RATE_COUNT - IWL_FIRST_OFDM_RATE;
|
|
|
-
|
|
|
- sband = &priv->bands[IEEE80211_BAND_2GHZ];
|
|
|
- sband->channels = channels;
|
|
|
- /* OFDM & CCK */
|
|
|
- sband->bitrates = rates;
|
|
|
- sband->n_bitrates = IWL_RATE_COUNT;
|
|
|
-
|
|
|
- priv->ieee_channels = channels;
|
|
|
- priv->ieee_rates = rates;
|
|
|
-
|
|
|
- iwl3945_init_hw_rates(priv, rates);
|
|
|
-
|
|
|
- for (i = 0; i < priv->channel_count; i++) {
|
|
|
- ch = &priv->channel_info[i];
|
|
|
-
|
|
|
- /* FIXME: might be removed if scan is OK*/
|
|
|
- if (!is_channel_valid(ch))
|
|
|
- continue;
|
|
|
-
|
|
|
- if (is_channel_a_band(ch))
|
|
|
- sband = &priv->bands[IEEE80211_BAND_5GHZ];
|
|
|
- else
|
|
|
- sband = &priv->bands[IEEE80211_BAND_2GHZ];
|
|
|
-
|
|
|
- geo_ch = &sband->channels[sband->n_channels++];
|
|
|
-
|
|
|
- geo_ch->center_freq = ieee80211_channel_to_frequency(ch->channel);
|
|
|
- geo_ch->max_power = ch->max_power_avg;
|
|
|
- geo_ch->max_antenna_gain = 0xff;
|
|
|
- geo_ch->hw_value = ch->channel;
|
|
|
-
|
|
|
- if (is_channel_valid(ch)) {
|
|
|
- if (!(ch->flags & EEPROM_CHANNEL_IBSS))
|
|
|
- geo_ch->flags |= IEEE80211_CHAN_NO_IBSS;
|
|
|
-
|
|
|
- if (!(ch->flags & EEPROM_CHANNEL_ACTIVE))
|
|
|
- geo_ch->flags |= IEEE80211_CHAN_PASSIVE_SCAN;
|
|
|
-
|
|
|
- if (ch->flags & EEPROM_CHANNEL_RADAR)
|
|
|
- geo_ch->flags |= IEEE80211_CHAN_RADAR;
|
|
|
-
|
|
|
- if (ch->max_power_avg > priv->tx_power_channel_lmt)
|
|
|
- priv->tx_power_channel_lmt =
|
|
|
- ch->max_power_avg;
|
|
|
- } else {
|
|
|
- geo_ch->flags |= IEEE80211_CHAN_DISABLED;
|
|
|
- }
|
|
|
-
|
|
|
- /* Save flags for reg domain usage */
|
|
|
- geo_ch->orig_flags = geo_ch->flags;
|
|
|
-
|
|
|
- IWL_DEBUG_INFO("Channel %d Freq=%d[%sGHz] %s flag=0%X\n",
|
|
|
- ch->channel, geo_ch->center_freq,
|
|
|
- is_channel_a_band(ch) ? "5.2" : "2.4",
|
|
|
- geo_ch->flags & IEEE80211_CHAN_DISABLED ?
|
|
|
- "restricted" : "valid",
|
|
|
- geo_ch->flags);
|
|
|
- }
|
|
|
-
|
|
|
- if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
|
|
|
- priv->cfg->sku & IWL_SKU_A) {
|
|
|
- IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
|
|
|
- "Please send your PCI ID 0x%04X:0x%04X to maintainer.\n",
|
|
|
- priv->pci_dev->device, priv->pci_dev->subsystem_device);
|
|
|
- priv->cfg->sku &= ~IWL_SKU_A;
|
|
|
- }
|
|
|
-
|
|
|
- IWL_INFO(priv, "Tunable channels: %d 802.11bg, %d 802.11a channels\n",
|
|
|
- priv->bands[IEEE80211_BAND_2GHZ].n_channels,
|
|
|
- priv->bands[IEEE80211_BAND_5GHZ].n_channels);
|
|
|
-
|
|
|
- if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
|
|
|
- priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
|
|
|
- &priv->bands[IEEE80211_BAND_2GHZ];
|
|
|
- if (priv->bands[IEEE80211_BAND_5GHZ].n_channels)
|
|
|
- priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
|
|
|
- &priv->bands[IEEE80211_BAND_5GHZ];
|
|
|
-
|
|
|
- set_bit(STATUS_GEO_CONFIGURED, &priv->status);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * iwl3945_free_geos - undo allocations in iwl3945_init_geos
|
|
|
- */
|
|
|
-static void iwl3945_free_geos(struct iwl_priv *priv)
|
|
|
-{
|
|
|
- kfree(priv->ieee_channels);
|
|
|
- kfree(priv->ieee_rates);
|
|
|
- clear_bit(STATUS_GEO_CONFIGURED, &priv->status);
|
|
|
-}
|
|
|
-
|
|
|
/******************************************************************************
|
|
|
*
|
|
|
* uCode download functions
|
|
@@ -6144,11 +6013,19 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
|
|
|
goto err_free_channel_map;
|
|
|
}
|
|
|
|
|
|
- ret = iwl3945_init_geos(priv);
|
|
|
+ ret = iwlcore_init_geos(priv);
|
|
|
if (ret) {
|
|
|
IWL_ERR(priv, "initializing geos failed: %d\n", ret);
|
|
|
goto err_free_channel_map;
|
|
|
}
|
|
|
+ iwl3945_init_hw_rates(priv, priv->ieee_rates);
|
|
|
+
|
|
|
+ if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
|
|
|
+ priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
|
|
|
+ &priv->bands[IEEE80211_BAND_2GHZ];
|
|
|
+ if (priv->bands[IEEE80211_BAND_5GHZ].n_channels)
|
|
|
+ priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
|
|
|
+ &priv->bands[IEEE80211_BAND_5GHZ];
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -6379,7 +6256,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|
|
out_remove_sysfs:
|
|
|
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
|
|
|
out_free_geos:
|
|
|
- iwl3945_free_geos(priv);
|
|
|
+ iwlcore_free_geos(priv);
|
|
|
|
|
|
out_release_irq:
|
|
|
free_irq(priv->pci_dev->irq, priv);
|
|
@@ -6461,7 +6338,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
|
|
pci_set_drvdata(pdev, NULL);
|
|
|
|
|
|
iwl_free_channel_map(priv);
|
|
|
- iwl3945_free_geos(priv);
|
|
|
+ iwlcore_free_geos(priv);
|
|
|
kfree(priv->scan);
|
|
|
if (priv->ibss_beacon)
|
|
|
dev_kfree_skb(priv->ibss_beacon);
|