Commit a77029ee authored by Johannes Berg's avatar Johannes Berg Committed by Wey-Yi Guy

iwlwifi: introduce post_scan hook

The different drivers need to do different things
after a scan, so create a post_scan hook to allow
them to do this.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
parent 7314c2b3
...@@ -2713,6 +2713,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = { ...@@ -2713,6 +2713,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
.build_addsta_hcmd = iwl3945_build_addsta_hcmd, .build_addsta_hcmd = iwl3945_build_addsta_hcmd,
.tx_cmd_protection = iwlcore_tx_cmd_protection, .tx_cmd_protection = iwlcore_tx_cmd_protection,
.request_scan = iwl3945_request_scan, .request_scan = iwl3945_request_scan,
.post_scan = iwl3945_post_scan,
}; };
static const struct iwl_ops iwl3945_ops = { static const struct iwl_ops iwl3945_ops = {
......
...@@ -296,6 +296,7 @@ extern int iwl3945_rs_next_rate(struct iwl_priv *priv, int rate); ...@@ -296,6 +296,7 @@ extern int iwl3945_rs_next_rate(struct iwl_priv *priv, int rate);
/* scanning */ /* scanning */
int iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif); int iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif);
void iwl3945_post_scan(struct iwl_priv *priv);
/* Requires full declaration of iwl_priv before including */ /* Requires full declaration of iwl_priv before including */
#include "iwl-io.h" #include "iwl-io.h"
......
...@@ -2221,6 +2221,18 @@ static struct iwl_hcmd_ops iwl4965_hcmd = { ...@@ -2221,6 +2221,18 @@ static struct iwl_hcmd_ops iwl4965_hcmd = {
.send_bt_config = iwl_send_bt_config, .send_bt_config = iwl_send_bt_config,
}; };
static void iwl4965_post_scan(struct iwl_priv *priv)
{
struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
/*
* Since setting the RXON may have been deferred while
* performing the scan, fire one off if needed
*/
if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
iwlcore_commit_rxon(priv, ctx);
}
static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
.get_hcmd_size = iwl4965_get_hcmd_size, .get_hcmd_size = iwl4965_get_hcmd_size,
.build_addsta_hcmd = iwl4965_build_addsta_hcmd, .build_addsta_hcmd = iwl4965_build_addsta_hcmd,
...@@ -2229,6 +2241,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { ...@@ -2229,6 +2241,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
.tx_cmd_protection = iwlcore_tx_cmd_protection, .tx_cmd_protection = iwlcore_tx_cmd_protection,
.calc_rssi = iwl4965_calc_rssi, .calc_rssi = iwl4965_calc_rssi,
.request_scan = iwlagn_request_scan, .request_scan = iwlagn_request_scan,
.post_scan = iwl4965_post_scan,
}; };
static struct iwl_lib_ops iwl4965_lib = { static struct iwl_lib_ops iwl4965_lib = {
......
...@@ -384,4 +384,5 @@ struct iwl_hcmd_utils_ops iwlagn_hcmd_utils = { ...@@ -384,4 +384,5 @@ struct iwl_hcmd_utils_ops iwlagn_hcmd_utils = {
.tx_cmd_protection = iwlagn_tx_cmd_protection, .tx_cmd_protection = iwlagn_tx_cmd_protection,
.calc_rssi = iwlagn_calc_rssi, .calc_rssi = iwlagn_calc_rssi,
.request_scan = iwlagn_request_scan, .request_scan = iwlagn_request_scan,
.post_scan = iwlagn_post_scan,
}; };
...@@ -1565,6 +1565,22 @@ int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) ...@@ -1565,6 +1565,22 @@ int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
return ret; return ret;
} }
void iwlagn_post_scan(struct iwl_priv *priv)
{
struct iwl_rxon_context *ctx;
/*
* Since setting the RXON may have been deferred while
* performing the scan, fire one off if needed
*/
for_each_context(priv, ctx)
if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
iwlagn_commit_rxon(priv, ctx);
if (priv->cfg->ops->hcmd->set_pan_params)
priv->cfg->ops->hcmd->set_pan_params(priv);
}
int iwlagn_manage_ibss_station(struct iwl_priv *priv, int iwlagn_manage_ibss_station(struct iwl_priv *priv,
struct ieee80211_vif *vif, bool add) struct ieee80211_vif *vif, bool add)
{ {
......
...@@ -227,6 +227,7 @@ void iwl_reply_statistics(struct iwl_priv *priv, ...@@ -227,6 +227,7 @@ void iwl_reply_statistics(struct iwl_priv *priv,
/* scan */ /* scan */
int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif); int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif);
void iwlagn_post_scan(struct iwl_priv *priv);
/* station mgmt */ /* station mgmt */
int iwlagn_manage_ibss_station(struct iwl_priv *priv, int iwlagn_manage_ibss_station(struct iwl_priv *priv,
......
...@@ -112,6 +112,7 @@ struct iwl_hcmd_utils_ops { ...@@ -112,6 +112,7 @@ struct iwl_hcmd_utils_ops {
int (*calc_rssi)(struct iwl_priv *priv, int (*calc_rssi)(struct iwl_priv *priv,
struct iwl_rx_phy_res *rx_resp); struct iwl_rx_phy_res *rx_resp);
int (*request_scan)(struct iwl_priv *priv, struct ieee80211_vif *vif); int (*request_scan)(struct iwl_priv *priv, struct ieee80211_vif *vif);
void (*post_scan)(struct iwl_priv *priv);
}; };
struct iwl_apm_ops { struct iwl_apm_ops {
......
...@@ -559,7 +559,6 @@ static void iwl_bg_scan_completed(struct work_struct *work) ...@@ -559,7 +559,6 @@ static void iwl_bg_scan_completed(struct work_struct *work)
struct iwl_priv *priv = struct iwl_priv *priv =
container_of(work, struct iwl_priv, scan_completed); container_of(work, struct iwl_priv, scan_completed);
bool aborted; bool aborted;
struct iwl_rxon_context *ctx;
IWL_DEBUG_SCAN(priv, "Completed %sscan.\n", IWL_DEBUG_SCAN(priv, "Completed %sscan.\n",
priv->is_internal_short_scan ? "internal short " : ""); priv->is_internal_short_scan ? "internal short " : "");
...@@ -609,15 +608,7 @@ static void iwl_bg_scan_completed(struct work_struct *work) ...@@ -609,15 +608,7 @@ static void iwl_bg_scan_completed(struct work_struct *work)
* performing the scan, fire one off */ * performing the scan, fire one off */
iwl_set_tx_power(priv, priv->tx_power_user_lmt, true); iwl_set_tx_power(priv, priv->tx_power_user_lmt, true);
/* priv->cfg->ops->utils->post_scan(priv);
* Since setting the RXON may have been deferred while
* performing the scan, fire one off if needed
*/
for_each_context(priv, ctx)
iwlcore_commit_rxon(priv, ctx);
if (priv->cfg->ops->hcmd->set_pan_params)
priv->cfg->ops->hcmd->set_pan_params(priv);
out: out:
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
......
...@@ -2983,6 +2983,18 @@ int iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) ...@@ -2983,6 +2983,18 @@ int iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
return ret; return ret;
} }
void iwl3945_post_scan(struct iwl_priv *priv)
{
struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
/*
* Since setting the RXON may have been deferred while
* performing the scan, fire one off if needed
*/
if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
iwlcore_commit_rxon(priv, ctx);
}
static void iwl3945_bg_restart(struct work_struct *data) static void iwl3945_bg_restart(struct work_struct *data)
{ {
struct iwl_priv *priv = container_of(data, struct iwl_priv, restart); struct iwl_priv *priv = container_of(data, struct iwl_priv, restart);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment