aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2009-03-17 18:04:31 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-17 18:04:31 -0400
commitaf4330631cd48987755f1a8d324dc318f60cf16b (patch)
tree3c9233e81b450921326da13a7f8abacb58ab1f5e /net/mac80211/mlme.c
parent2d6a5e9500103680464a723a4564961675652680 (diff)
parent808ff697b357cee54e214efd27921a9ec6461a94 (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.c38
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(&params, 0, sizeof(params)); 418 memset(&params, 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, &params)) {
465 if (local->ops->conf_tx(local_to_hw(local), queue, &params)) {
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