diff options
Diffstat (limited to 'drivers/net/wireless/ipw2200.c')
-rw-r--r-- | drivers/net/wireless/ipw2200.c | 279 |
1 files changed, 259 insertions, 20 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 073721f10577..6e79ae24ee1c 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -10374,28 +10374,256 @@ static int ipw_config(struct ipw_priv *priv) | |||
10374 | return -EIO; | 10374 | return -EIO; |
10375 | } | 10375 | } |
10376 | 10376 | ||
10377 | static const struct ieee80211_geo ipw_geo = { | 10377 | /* |
10378 | "---", | 10378 | * NOTE: |
10379 | .bg_channels = 11, | 10379 | * |
10380 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | 10380 | * These tables have been tested in conjunction with the |
10381 | {2427, 4}, {2432, 5}, {2437, 6}, | 10381 | * Intel PRO/Wireless 2200BG and 2915ABG Network Connection Adapters. |
10382 | {2442, 7}, {2447, 8}, {2452, 9}, | 10382 | * |
10383 | {2457, 10}, {2462, 11}}, | 10383 | * Altering this values, using it on other hardware, or in geographies |
10384 | .a_channels = 8, | 10384 | * not intended for resale of the above mentioned Intel adapters has |
10385 | .a = {{5180, 36}, | 10385 | * not been tested. |
10386 | {5200, 40}, | 10386 | * |
10387 | {5220, 44}, | 10387 | */ |
10388 | {5240, 48}, | 10388 | static const struct ieee80211_geo ipw_geos[] = { |
10389 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | 10389 | { /* Restricted */ |
10390 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | 10390 | "---", |
10391 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | 10391 | .bg_channels = 11, |
10392 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}}, | 10392 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, |
10393 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10394 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10395 | {2457, 10}, {2462, 11}}, | ||
10396 | }, | ||
10397 | |||
10398 | { /* Custom US/Canada */ | ||
10399 | "ZZF", | ||
10400 | .bg_channels = 11, | ||
10401 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10402 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10403 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10404 | {2457, 10}, {2462, 11}}, | ||
10405 | .a_channels = 8, | ||
10406 | .a = {{5180, 36}, | ||
10407 | {5200, 40}, | ||
10408 | {5220, 44}, | ||
10409 | {5240, 48}, | ||
10410 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10411 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10412 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10413 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10414 | }, | ||
10415 | |||
10416 | { /* Rest of World */ | ||
10417 | "ZZD", | ||
10418 | .bg_channels = 13, | ||
10419 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10420 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10421 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10422 | {2457, 10}, {2462, 11}, {2467, 12}, | ||
10423 | {2472, 13}}, | ||
10424 | }, | ||
10425 | |||
10426 | { /* Custom USA & Europe & High */ | ||
10427 | "ZZA", | ||
10428 | .bg_channels = 11, | ||
10429 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10430 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10431 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10432 | {2457, 10}, {2462, 11}}, | ||
10433 | .a_channels = 13, | ||
10434 | .a = {{5180, 36}, | ||
10435 | {5200, 40}, | ||
10436 | {5220, 44}, | ||
10437 | {5240, 48}, | ||
10438 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10439 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10440 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10441 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, | ||
10442 | {5745, 149}, | ||
10443 | {5765, 153}, | ||
10444 | {5785, 157}, | ||
10445 | {5805, 161}, | ||
10446 | {5825, 165}}, | ||
10447 | }, | ||
10448 | |||
10449 | { /* Custom NA & Europe */ | ||
10450 | "ZZB", | ||
10451 | .bg_channels = 11, | ||
10452 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10453 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10454 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10455 | {2457, 10}, {2462, 11}}, | ||
10456 | .a_channels = 13, | ||
10457 | .a = {{5180, 36}, | ||
10458 | {5200, 40}, | ||
10459 | {5220, 44}, | ||
10460 | {5240, 48}, | ||
10461 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10462 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10463 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10464 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, | ||
10465 | {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, | ||
10466 | {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, | ||
10467 | {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, | ||
10468 | {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, | ||
10469 | {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10470 | }, | ||
10471 | |||
10472 | { /* Custom Japan */ | ||
10473 | "ZZC", | ||
10474 | .bg_channels = 11, | ||
10475 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10476 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10477 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10478 | {2457, 10}, {2462, 11}}, | ||
10479 | .a_channels = 4, | ||
10480 | .a = {{5170, 34}, {5190, 38}, | ||
10481 | {5210, 42}, {5230, 46}}, | ||
10482 | }, | ||
10483 | |||
10484 | { /* Custom */ | ||
10485 | "ZZM", | ||
10486 | .bg_channels = 11, | ||
10487 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10488 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10489 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10490 | {2457, 10}, {2462, 11}}, | ||
10491 | }, | ||
10492 | |||
10493 | { /* Europe */ | ||
10494 | "ZZE", | ||
10495 | .bg_channels = 13, | ||
10496 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10497 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10498 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10499 | {2457, 10}, {2462, 11}, {2467, 12}, | ||
10500 | {2472, 13}}, | ||
10501 | .a_channels = 19, | ||
10502 | .a = {{5180, 36}, | ||
10503 | {5200, 40}, | ||
10504 | {5220, 44}, | ||
10505 | {5240, 48}, | ||
10506 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10507 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10508 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10509 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, | ||
10510 | {5500, 100, IEEE80211_CH_PASSIVE_ONLY}, | ||
10511 | {5520, 104, IEEE80211_CH_PASSIVE_ONLY}, | ||
10512 | {5540, 108, IEEE80211_CH_PASSIVE_ONLY}, | ||
10513 | {5560, 112, IEEE80211_CH_PASSIVE_ONLY}, | ||
10514 | {5580, 116, IEEE80211_CH_PASSIVE_ONLY}, | ||
10515 | {5600, 120, IEEE80211_CH_PASSIVE_ONLY}, | ||
10516 | {5620, 124, IEEE80211_CH_PASSIVE_ONLY}, | ||
10517 | {5640, 128, IEEE80211_CH_PASSIVE_ONLY}, | ||
10518 | {5660, 132, IEEE80211_CH_PASSIVE_ONLY}, | ||
10519 | {5680, 136, IEEE80211_CH_PASSIVE_ONLY}, | ||
10520 | {5700, 140, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10521 | }, | ||
10522 | |||
10523 | { /* Custom Japan */ | ||
10524 | "ZZJ", | ||
10525 | .bg_channels = 14, | ||
10526 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10527 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10528 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10529 | {2457, 10}, {2462, 11}, {2467, 12}, | ||
10530 | {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY}}, | ||
10531 | .a_channels = 4, | ||
10532 | .a = {{5170, 34}, {5190, 38}, | ||
10533 | {5210, 42}, {5230, 46}}, | ||
10534 | }, | ||
10535 | |||
10536 | { /* High Band */ | ||
10537 | "ZZH", | ||
10538 | .bg_channels = 13, | ||
10539 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10540 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10541 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10542 | {2457, 10}, {2462, 11}, | ||
10543 | {2467, 12, IEEE80211_CH_PASSIVE_ONLY}, | ||
10544 | {2472, 13, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10545 | .a_channels = 4, | ||
10546 | .a = {{5745, 149}, {5765, 153}, | ||
10547 | {5785, 157}, {5805, 161}}, | ||
10548 | }, | ||
10549 | |||
10550 | { /* Custom Europe */ | ||
10551 | "ZZG", | ||
10552 | .bg_channels = 13, | ||
10553 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10554 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10555 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10556 | {2457, 10}, {2462, 11}, | ||
10557 | {2467, 12}, {2472, 13}}, | ||
10558 | .a_channels = 4, | ||
10559 | .a = {{5180, 36}, {5200, 40}, | ||
10560 | {5220, 44}, {5240, 48}}, | ||
10561 | }, | ||
10562 | |||
10563 | { /* Europe */ | ||
10564 | "ZZK", | ||
10565 | .bg_channels = 13, | ||
10566 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10567 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10568 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10569 | {2457, 10}, {2462, 11}, | ||
10570 | {2467, 12, IEEE80211_CH_PASSIVE_ONLY}, | ||
10571 | {2472, 13, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10572 | .a_channels = 24, | ||
10573 | .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY}, | ||
10574 | {5200, 40, IEEE80211_CH_PASSIVE_ONLY}, | ||
10575 | {5220, 44, IEEE80211_CH_PASSIVE_ONLY}, | ||
10576 | {5240, 48, IEEE80211_CH_PASSIVE_ONLY}, | ||
10577 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10578 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10579 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10580 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, | ||
10581 | {5500, 100, IEEE80211_CH_PASSIVE_ONLY}, | ||
10582 | {5520, 104, IEEE80211_CH_PASSIVE_ONLY}, | ||
10583 | {5540, 108, IEEE80211_CH_PASSIVE_ONLY}, | ||
10584 | {5560, 112, IEEE80211_CH_PASSIVE_ONLY}, | ||
10585 | {5580, 116, IEEE80211_CH_PASSIVE_ONLY}, | ||
10586 | {5600, 120, IEEE80211_CH_PASSIVE_ONLY}, | ||
10587 | {5620, 124, IEEE80211_CH_PASSIVE_ONLY}, | ||
10588 | {5640, 128, IEEE80211_CH_PASSIVE_ONLY}, | ||
10589 | {5660, 132, IEEE80211_CH_PASSIVE_ONLY}, | ||
10590 | {5680, 136, IEEE80211_CH_PASSIVE_ONLY}, | ||
10591 | {5700, 140, IEEE80211_CH_PASSIVE_ONLY}, | ||
10592 | {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, | ||
10593 | {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, | ||
10594 | {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, | ||
10595 | {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, | ||
10596 | {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10597 | }, | ||
10598 | |||
10599 | { /* Europe */ | ||
10600 | "ZZL", | ||
10601 | .bg_channels = 11, | ||
10602 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
10603 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
10604 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
10605 | {2457, 10}, {2462, 11}}, | ||
10606 | .a_channels = 13, | ||
10607 | .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY}, | ||
10608 | {5200, 40, IEEE80211_CH_PASSIVE_ONLY}, | ||
10609 | {5220, 44, IEEE80211_CH_PASSIVE_ONLY}, | ||
10610 | {5240, 48, IEEE80211_CH_PASSIVE_ONLY}, | ||
10611 | {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, | ||
10612 | {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, | ||
10613 | {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, | ||
10614 | {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, | ||
10615 | {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, | ||
10616 | {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, | ||
10617 | {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, | ||
10618 | {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, | ||
10619 | {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, | ||
10620 | } | ||
10393 | }; | 10621 | }; |
10394 | 10622 | ||
10395 | #define MAX_HW_RESTARTS 5 | 10623 | #define MAX_HW_RESTARTS 5 |
10396 | static int ipw_up(struct ipw_priv *priv) | 10624 | static int ipw_up(struct ipw_priv *priv) |
10397 | { | 10625 | { |
10398 | int rc, i; | 10626 | int rc, i, j; |
10399 | 10627 | ||
10400 | if (priv->status & STATUS_EXIT_PENDING) | 10628 | if (priv->status & STATUS_EXIT_PENDING) |
10401 | return -EIO; | 10629 | return -EIO; |
@@ -10414,9 +10642,20 @@ static int ipw_up(struct ipw_priv *priv) | |||
10414 | eeprom_parse_mac(priv, priv->mac_addr); | 10642 | eeprom_parse_mac(priv, priv->mac_addr); |
10415 | memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); | 10643 | memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); |
10416 | 10644 | ||
10417 | memcpy(priv->country, &priv->eeprom[EEPROM_COUNTRY_CODE], 3); | 10645 | for (j = 0; j < ARRAY_SIZE(ipw_geos); j++) { |
10418 | priv->country[3] = '\0'; | 10646 | if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE], |
10419 | ieee80211_set_geo(priv->ieee, &ipw_geo); | 10647 | ipw_geos[j].name, 3)) |
10648 | break; | ||
10649 | } | ||
10650 | if (j == ARRAY_SIZE(ipw_geos)) | ||
10651 | j = 0; | ||
10652 | if (ieee80211_set_geo(priv->ieee, &ipw_geos[j])) { | ||
10653 | IPW_WARNING("Could not set geography."); | ||
10654 | return 0; | ||
10655 | } | ||
10656 | |||
10657 | IPW_DEBUG_INFO("Geography %03d [%s] detected.\n", | ||
10658 | j, priv->ieee->geo.name); | ||
10420 | 10659 | ||
10421 | if (priv->status & STATUS_RF_KILL_SW) { | 10660 | if (priv->status & STATUS_RF_KILL_SW) { |
10422 | IPW_WARNING("Radio disabled by module parameter.\n"); | 10661 | IPW_WARNING("Radio disabled by module parameter.\n"); |