aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-04-21 13:57:23 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-04-30 11:57:22 -0400
commitc914ac26caf462567078f9615ffcedf1962087f2 (patch)
tree5ad48e9d361f8e38f8f37ab49bbd1b215d67d789 /drivers/net/wireless/iwlwifi
parentbbf18ff1be8a3c6567bc052e690189b55e16b8eb (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.c38
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,
416int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 416int 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/**