diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-04-21 13:57:23 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-04-30 11:57:22 -0400 |
commit | c914ac26caf462567078f9615ffcedf1962087f2 (patch) | |
tree | 5ad48e9d361f8e38f8f37ab49bbd1b215d67d789 /drivers/net/wireless/iwlwifi | |
parent | bbf18ff1be8a3c6567bc052e690189b55e16b8eb (diff) |
iwlagn: improve RXON checking
The current RXON checking doesn't verify that
the channel is valid (or at least non-zero),
so add that. Also, add a WARN() so we get a
stacktrace, and capture a bitmask of errors
in order to capture all necessary information
in the warning itself (in case the previous
messages are snipped off.)
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 1b2a7d9141c6..98cfbb6d2369 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -416,72 +416,72 @@ void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | |||
416 | int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | 416 | int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
417 | { | 417 | { |
418 | struct iwl_rxon_cmd *rxon = &ctx->staging; | 418 | struct iwl_rxon_cmd *rxon = &ctx->staging; |
419 | bool error = false; | 419 | u32 errors = 0; |
420 | 420 | ||
421 | if (rxon->flags & RXON_FLG_BAND_24G_MSK) { | 421 | if (rxon->flags & RXON_FLG_BAND_24G_MSK) { |
422 | if (rxon->flags & RXON_FLG_TGJ_NARROW_BAND_MSK) { | 422 | if (rxon->flags & RXON_FLG_TGJ_NARROW_BAND_MSK) { |
423 | IWL_WARN(priv, "check 2.4G: wrong narrow\n"); | 423 | IWL_WARN(priv, "check 2.4G: wrong narrow\n"); |
424 | error = true; | 424 | errors |= BIT(0); |
425 | } | 425 | } |
426 | if (rxon->flags & RXON_FLG_RADAR_DETECT_MSK) { | 426 | if (rxon->flags & RXON_FLG_RADAR_DETECT_MSK) { |
427 | IWL_WARN(priv, "check 2.4G: wrong radar\n"); | 427 | IWL_WARN(priv, "check 2.4G: wrong radar\n"); |
428 | error = true; | 428 | errors |= BIT(1); |
429 | } | 429 | } |
430 | } else { | 430 | } else { |
431 | if (!(rxon->flags & RXON_FLG_SHORT_SLOT_MSK)) { | 431 | if (!(rxon->flags & RXON_FLG_SHORT_SLOT_MSK)) { |
432 | IWL_WARN(priv, "check 5.2G: not short slot!\n"); | 432 | IWL_WARN(priv, "check 5.2G: not short slot!\n"); |
433 | error = true; | 433 | errors |= BIT(2); |
434 | } | 434 | } |
435 | if (rxon->flags & RXON_FLG_CCK_MSK) { | 435 | if (rxon->flags & RXON_FLG_CCK_MSK) { |
436 | IWL_WARN(priv, "check 5.2G: CCK!\n"); | 436 | IWL_WARN(priv, "check 5.2G: CCK!\n"); |
437 | error = true; | 437 | errors |= BIT(3); |
438 | } | 438 | } |
439 | } | 439 | } |
440 | if ((rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1) { | 440 | if ((rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1) { |
441 | IWL_WARN(priv, "mac/bssid mcast!\n"); | 441 | IWL_WARN(priv, "mac/bssid mcast!\n"); |
442 | error = true; | 442 | errors |= BIT(4); |
443 | } | 443 | } |
444 | 444 | ||
445 | /* make sure basic rates 6Mbps and 1Mbps are supported */ | 445 | /* make sure basic rates 6Mbps and 1Mbps are supported */ |
446 | if ((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0 && | 446 | if ((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0 && |
447 | (rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0) { | 447 | (rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0) { |
448 | IWL_WARN(priv, "neither 1 nor 6 are basic\n"); | 448 | IWL_WARN(priv, "neither 1 nor 6 are basic\n"); |
449 | error = true; | 449 | errors |= BIT(5); |
450 | } | 450 | } |
451 | 451 | ||
452 | if (le16_to_cpu(rxon->assoc_id) > 2007) { | 452 | if (le16_to_cpu(rxon->assoc_id) > 2007) { |
453 | IWL_WARN(priv, "aid > 2007\n"); | 453 | IWL_WARN(priv, "aid > 2007\n"); |
454 | error = true; | 454 | errors |= BIT(6); |
455 | } | 455 | } |
456 | 456 | ||
457 | if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) | 457 | if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) |
458 | == (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) { | 458 | == (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) { |
459 | IWL_WARN(priv, "CCK and short slot\n"); | 459 | IWL_WARN(priv, "CCK and short slot\n"); |
460 | error = true; | 460 | errors |= BIT(7); |
461 | } | 461 | } |
462 | 462 | ||
463 | if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) | 463 | if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) |
464 | == (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) { | 464 | == (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) { |
465 | IWL_WARN(priv, "CCK and auto detect"); | 465 | IWL_WARN(priv, "CCK and auto detect"); |
466 | error = true; | 466 | errors |= BIT(8); |
467 | } | 467 | } |
468 | 468 | ||
469 | if ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK | | 469 | if ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK | |
470 | RXON_FLG_TGG_PROTECT_MSK)) == | 470 | RXON_FLG_TGG_PROTECT_MSK)) == |
471 | RXON_FLG_TGG_PROTECT_MSK) { | 471 | RXON_FLG_TGG_PROTECT_MSK) { |
472 | IWL_WARN(priv, "TGg but no auto-detect\n"); | 472 | IWL_WARN(priv, "TGg but no auto-detect\n"); |
473 | error = true; | 473 | errors |= BIT(9); |
474 | } | 474 | } |
475 | 475 | ||
476 | if (error) | 476 | if (rxon->channel == 0) { |
477 | IWL_WARN(priv, "Tuning to channel %d\n", | 477 | IWL_WARN(priv, "zero channel is invalid\n"); |
478 | le16_to_cpu(rxon->channel)); | 478 | errors |= BIT(10); |
479 | |||
480 | if (error) { | ||
481 | IWL_ERR(priv, "Invalid RXON\n"); | ||
482 | return -EINVAL; | ||
483 | } | 479 | } |
484 | return 0; | 480 | |
481 | WARN(errors, "Invalid RXON (%#x), channel %d", | ||
482 | errors, le16_to_cpu(rxon->channel)); | ||
483 | |||
484 | return errors ? -EINVAL : 0; | ||
485 | } | 485 | } |
486 | 486 | ||
487 | /** | 487 | /** |