|
@@ -166,6 +166,8 @@ int iwl_commit_rxon(struct iwl_priv *priv)
|
|
IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret);
|
|
IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
+ iwl_clear_ucode_stations(priv, false);
|
|
|
|
+ iwl_restore_stations(priv);
|
|
}
|
|
}
|
|
|
|
|
|
IWL_DEBUG_INFO(priv, "Sending RXON\n"
|
|
IWL_DEBUG_INFO(priv, "Sending RXON\n"
|
|
@@ -179,9 +181,8 @@ int iwl_commit_rxon(struct iwl_priv *priv)
|
|
iwl_set_rxon_hwcrypto(priv, !priv->cfg->mod_params->sw_crypto);
|
|
iwl_set_rxon_hwcrypto(priv, !priv->cfg->mod_params->sw_crypto);
|
|
|
|
|
|
/* Apply the new configuration
|
|
/* Apply the new configuration
|
|
- * RXON unassoc clears the station table in uCode, send it before
|
|
|
|
- * we add the bcast station. If assoc bit is set, we will send RXON
|
|
|
|
- * after having added the bcast and bssid station.
|
|
|
|
|
|
+ * RXON unassoc clears the station table in uCode so restoration of
|
|
|
|
+ * stations is needed after it (the RXON command) completes
|
|
*/
|
|
*/
|
|
if (!new_assoc) {
|
|
if (!new_assoc) {
|
|
ret = iwl_send_cmd_pdu(priv, REPLY_RXON,
|
|
ret = iwl_send_cmd_pdu(priv, REPLY_RXON,
|
|
@@ -190,17 +191,14 @@ int iwl_commit_rxon(struct iwl_priv *priv)
|
|
IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
|
|
IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
+ IWL_DEBUG_INFO(priv, "Return from !new_assoc RXON. \n");
|
|
memcpy(active_rxon, &priv->staging_rxon, sizeof(*active_rxon));
|
|
memcpy(active_rxon, &priv->staging_rxon, sizeof(*active_rxon));
|
|
|
|
+ iwl_clear_ucode_stations(priv, false);
|
|
|
|
+ iwl_restore_stations(priv);
|
|
}
|
|
}
|
|
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
-
|
|
|
|
priv->start_calib = 0;
|
|
priv->start_calib = 0;
|
|
|
|
|
|
- /* Add the broadcast address so we can send broadcast frames */
|
|
|
|
- priv->cfg->ops->lib->add_bcast_station(priv);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
/* If we have set the ASSOC_MSK and we are in BSS mode then
|
|
/* If we have set the ASSOC_MSK and we are in BSS mode then
|
|
* add the IWL_AP_ID to the station rate table */
|
|
* add the IWL_AP_ID to the station rate table */
|
|
if (new_assoc) {
|
|
if (new_assoc) {
|
|
@@ -2087,7 +2085,6 @@ static void iwl_alive_start(struct iwl_priv *priv)
|
|
goto restart;
|
|
goto restart;
|
|
}
|
|
}
|
|
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
ret = priv->cfg->ops->lib->alive_notify(priv);
|
|
ret = priv->cfg->ops->lib->alive_notify(priv);
|
|
if (ret) {
|
|
if (ret) {
|
|
IWL_WARN(priv,
|
|
IWL_WARN(priv,
|
|
@@ -2143,6 +2140,8 @@ static void iwl_alive_start(struct iwl_priv *priv)
|
|
wake_up_interruptible(&priv->wait_command_queue);
|
|
wake_up_interruptible(&priv->wait_command_queue);
|
|
|
|
|
|
iwl_power_update_mode(priv, true);
|
|
iwl_power_update_mode(priv, true);
|
|
|
|
+ IWL_DEBUG_INFO(priv, "Updated power mode\n");
|
|
|
|
+
|
|
|
|
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -2162,7 +2161,7 @@ static void __iwl_down(struct iwl_priv *priv)
|
|
if (!exit_pending)
|
|
if (!exit_pending)
|
|
set_bit(STATUS_EXIT_PENDING, &priv->status);
|
|
set_bit(STATUS_EXIT_PENDING, &priv->status);
|
|
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
|
|
+ iwl_clear_ucode_stations(priv, true);
|
|
|
|
|
|
/* Unblock any waiting calls */
|
|
/* Unblock any waiting calls */
|
|
wake_up_interruptible_all(&priv->wait_command_queue);
|
|
wake_up_interruptible_all(&priv->wait_command_queue);
|
|
@@ -2359,8 +2358,6 @@ static int __iwl_up(struct iwl_priv *priv)
|
|
|
|
|
|
for (i = 0; i < MAX_HW_RESTARTS; i++) {
|
|
for (i = 0; i < MAX_HW_RESTARTS; i++) {
|
|
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
-
|
|
|
|
/* load bootstrap state machine,
|
|
/* load bootstrap state machine,
|
|
* load bootstrap program into processor's memory,
|
|
* load bootstrap program into processor's memory,
|
|
* prepare to load the "initialize" uCode */
|
|
* prepare to load the "initialize" uCode */
|
|
@@ -3270,9 +3267,6 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
|
mutex_init(&priv->mutex);
|
|
mutex_init(&priv->mutex);
|
|
mutex_init(&priv->sync_cmd_mutex);
|
|
mutex_init(&priv->sync_cmd_mutex);
|
|
|
|
|
|
- /* Clear the driver's (not device's) station table */
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
-
|
|
|
|
priv->ieee_channels = NULL;
|
|
priv->ieee_channels = NULL;
|
|
priv->ieee_rates = NULL;
|
|
priv->ieee_rates = NULL;
|
|
priv->band = IEEE80211_BAND_2GHZ;
|
|
priv->band = IEEE80211_BAND_2GHZ;
|
|
@@ -3649,7 +3643,6 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
|
|
iwl_rx_queue_free(priv, &priv->rxq);
|
|
iwl_rx_queue_free(priv, &priv->rxq);
|
|
iwl_hw_txq_ctx_free(priv);
|
|
iwl_hw_txq_ctx_free(priv);
|
|
|
|
|
|
- iwl_clear_stations_table(priv);
|
|
|
|
iwl_eeprom_free(priv);
|
|
iwl_eeprom_free(priv);
|
|
|
|
|
|
|
|
|