diff options
author | David S. Miller <davem@davemloft.net> | 2009-03-17 18:04:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-17 18:04:31 -0400 |
commit | af4330631cd48987755f1a8d324dc318f60cf16b (patch) | |
tree | 3c9233e81b450921326da13a7f8abacb58ab1f5e /net/mac80211/mlme.c | |
parent | 2d6a5e9500103680464a723a4564961675652680 (diff) | |
parent | 808ff697b357cee54e214efd27921a9ec6461a94 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r-- | net/mac80211/mlme.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 391445c6b892..841b8450b3de 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -417,9 +417,6 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, | |||
417 | 417 | ||
418 | memset(¶ms, 0, sizeof(params)); | 418 | memset(¶ms, 0, sizeof(params)); |
419 | 419 | ||
420 | if (!local->ops->conf_tx) | ||
421 | return; | ||
422 | |||
423 | local->wmm_acm = 0; | 420 | local->wmm_acm = 0; |
424 | for (; left >= 4; left -= 4, pos += 4) { | 421 | for (; left >= 4; left -= 4, pos += 4) { |
425 | int aci = (pos[0] >> 5) & 0x03; | 422 | int aci = (pos[0] >> 5) & 0x03; |
@@ -427,26 +424,26 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, | |||
427 | int queue; | 424 | int queue; |
428 | 425 | ||
429 | switch (aci) { | 426 | switch (aci) { |
430 | case 1: | 427 | case 1: /* AC_BK */ |
431 | queue = 3; | 428 | queue = 3; |
432 | if (acm) | 429 | if (acm) |
433 | local->wmm_acm |= BIT(0) | BIT(3); | 430 | local->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ |
434 | break; | 431 | break; |
435 | case 2: | 432 | case 2: /* AC_VI */ |
436 | queue = 1; | 433 | queue = 1; |
437 | if (acm) | 434 | if (acm) |
438 | local->wmm_acm |= BIT(4) | BIT(5); | 435 | local->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ |
439 | break; | 436 | break; |
440 | case 3: | 437 | case 3: /* AC_VO */ |
441 | queue = 0; | 438 | queue = 0; |
442 | if (acm) | 439 | if (acm) |
443 | local->wmm_acm |= BIT(6) | BIT(7); | 440 | local->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ |
444 | break; | 441 | break; |
445 | case 0: | 442 | case 0: /* AC_BE */ |
446 | default: | 443 | default: |
447 | queue = 2; | 444 | queue = 2; |
448 | if (acm) | 445 | if (acm) |
449 | local->wmm_acm |= BIT(1) | BIT(2); | 446 | local->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ |
450 | break; | 447 | break; |
451 | } | 448 | } |
452 | 449 | ||
@@ -460,9 +457,8 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, | |||
460 | local->mdev->name, queue, aci, acm, params.aifs, params.cw_min, | 457 | local->mdev->name, queue, aci, acm, params.aifs, params.cw_min, |
461 | params.cw_max, params.txop); | 458 | params.cw_max, params.txop); |
462 | #endif | 459 | #endif |
463 | /* TODO: handle ACM (block TX, fallback to next lowest allowed | 460 | if (local->ops->conf_tx && |
464 | * AC for now) */ | 461 | local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) { |
465 | if (local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) { | ||
466 | printk(KERN_DEBUG "%s: failed to set TX queue " | 462 | printk(KERN_DEBUG "%s: failed to set TX queue " |
467 | "parameters for queue %d\n", local->mdev->name, queue); | 463 | "parameters for queue %d\n", local->mdev->name, queue); |
468 | } | 464 | } |
@@ -1724,7 +1720,10 @@ static int ieee80211_sta_config_auth(struct ieee80211_sub_if_data *sdata) | |||
1724 | local->int_scan_req.ssids[0].ssid_len = 0; | 1720 | local->int_scan_req.ssids[0].ssid_len = 0; |
1725 | else | 1721 | else |
1726 | local->int_scan_req.ssids[0].ssid_len = ifmgd->ssid_len; | 1722 | local->int_scan_req.ssids[0].ssid_len = ifmgd->ssid_len; |
1727 | ieee80211_start_scan(sdata, &local->int_scan_req); | 1723 | |
1724 | if (ieee80211_start_scan(sdata, &local->int_scan_req)) | ||
1725 | ieee80211_scan_failed(local); | ||
1726 | |||
1728 | ifmgd->state = IEEE80211_STA_MLME_AUTHENTICATE; | 1727 | ifmgd->state = IEEE80211_STA_MLME_AUTHENTICATE; |
1729 | set_bit(IEEE80211_STA_REQ_AUTH, &ifmgd->request); | 1728 | set_bit(IEEE80211_STA_REQ_AUTH, &ifmgd->request); |
1730 | } else { | 1729 | } else { |
@@ -1761,7 +1760,14 @@ static void ieee80211_sta_work(struct work_struct *work) | |||
1761 | ifmgd->state != IEEE80211_STA_MLME_AUTHENTICATE && | 1760 | ifmgd->state != IEEE80211_STA_MLME_AUTHENTICATE && |
1762 | ifmgd->state != IEEE80211_STA_MLME_ASSOCIATE && | 1761 | ifmgd->state != IEEE80211_STA_MLME_ASSOCIATE && |
1763 | test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request)) { | 1762 | test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request)) { |
1764 | ieee80211_start_scan(sdata, local->scan_req); | 1763 | /* |
1764 | * The call to ieee80211_start_scan can fail but ieee80211_request_scan | ||
1765 | * (which queued ieee80211_sta_work) did not return an error. Thus, call | ||
1766 | * ieee80211_scan_failed here if ieee80211_start_scan fails in order to | ||
1767 | * notify the scan requester. | ||
1768 | */ | ||
1769 | if (ieee80211_start_scan(sdata, local->scan_req)) | ||
1770 | ieee80211_scan_failed(local); | ||
1765 | return; | 1771 | return; |
1766 | } | 1772 | } |
1767 | 1773 | ||