Skip to content

Commit

Permalink
iwlagn: fix RXON issues
Browse files Browse the repository at this point in the history
The RXON rework resulted in a massive loss of
throughput because we weren't programming the
device completely correctly -- the BSSID has
to be programmed into the device before the
AP station is uploaded. To fix this, simply
always send the unassoc RXON, i.e. even when
it was already unassoc so that the BSSID and
some other parameters are updated properly.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Nov 15, 2010
1 parent 2e1fea4 commit 52d980c
Showing 1 changed file with 21 additions and 29 deletions.
50 changes: 21 additions & 29 deletions drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
{
/* cast away the const for active_rxon in this function */
struct iwl_rxon_cmd *active = (void *)&ctx->active;
bool old_assoc = !!(ctx->active.filter_flags & RXON_FILTER_ASSOC_MSK);
bool new_assoc = !!(ctx->staging.filter_flags & RXON_FILTER_ASSOC_MSK);
int ret;

Expand Down Expand Up @@ -172,37 +171,30 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
ctx->staging.bssid_addr);

/*
* If we are currently associated and the new config is also
* going to be associated, OR if the new config is simply not
* associated, clear associated.
* Always clear associated first, but with the correct config.
* This is required as for example station addition for the
* AP station must be done after the BSSID is set to correctly
* set up filters in the device.
*/
if ((old_assoc && new_assoc) || !new_assoc) {
struct iwl_rxon_cmd *send = active;

if (!new_assoc)
send = &ctx->staging;

if (ctx->ctxid == IWL_RXON_CTX_BSS)
ret = iwlagn_disable_bss(priv, ctx, send);
else
ret = iwlagn_disable_pan(priv, ctx, send);
if (ret)
return ret;
if (ctx->ctxid == IWL_RXON_CTX_BSS)
ret = iwlagn_disable_bss(priv, ctx, &ctx->staging);
else
ret = iwlagn_disable_pan(priv, ctx, &ctx->staging);
if (ret)
return ret;

if (send != active)
memcpy(active, send, sizeof(*active));
memcpy(active, &ctx->staging, sizeof(*active));

/*
* Un-assoc RXON clears the station table and WEP
* keys, so we have to restore those afterwards.
*/
iwl_clear_ucode_stations(priv, ctx);
iwl_restore_stations(priv, ctx);
ret = iwl_restore_default_wep_keys(priv, ctx);
if (ret) {
IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
return ret;
}
/*
* Un-assoc RXON clears the station table and WEP
* keys, so we have to restore those afterwards.
*/
iwl_clear_ucode_stations(priv, ctx);
iwl_restore_stations(priv, ctx);
ret = iwl_restore_default_wep_keys(priv, ctx);
if (ret) {
IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
return ret;
}

/* RXON timing must be before associated RXON */
Expand Down

0 comments on commit 52d980c

Please sign in to comment.