diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-04 15:48:25 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-04 15:48:25 -0500 |
commit | d72751ede1b9bf993d7bd3377305c8e9e36a3cc4 (patch) | |
tree | 27abaa49de7ff666dbf6bbcb0d7bae2b9f029a2d /drivers/net/wireless/p54 | |
parent | 0a0e9ae1bd788bc19adc4d4ae08c98b233697402 (diff) | |
parent | 85a7045a90052749885e166f40af5e9140032287 (diff) |
Merge branch 'for-davem' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r-- | drivers/net/wireless/p54/eeprom.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/p54/fwio.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/p54/lmac.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/p54/main.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/p54/txrx.c | 13 |
6 files changed, 32 insertions, 14 deletions
diff --git a/drivers/net/wireless/p54/eeprom.c b/drivers/net/wireless/p54/eeprom.c index f54e15fcd62..13d750da930 100644 --- a/drivers/net/wireless/p54/eeprom.c +++ b/drivers/net/wireless/p54/eeprom.c | |||
@@ -524,10 +524,13 @@ err_data: | |||
524 | 524 | ||
525 | struct p54_rssi_db_entry *p54_rssi_find(struct p54_common *priv, const u16 freq) | 525 | struct p54_rssi_db_entry *p54_rssi_find(struct p54_common *priv, const u16 freq) |
526 | { | 526 | { |
527 | struct p54_rssi_db_entry *entry = (void *)(priv->rssi_db->data + | 527 | struct p54_rssi_db_entry *entry; |
528 | priv->rssi_db->offset); | ||
529 | int i, found = -1; | 528 | int i, found = -1; |
530 | 529 | ||
530 | if (!priv->rssi_db) | ||
531 | return &p54_rssi_default; | ||
532 | |||
533 | entry = (void *)(priv->rssi_db->data + priv->rssi_db->offset); | ||
531 | for (i = 0; i < priv->rssi_db->entries; i++) { | 534 | for (i = 0; i < priv->rssi_db->entries; i++) { |
532 | if (!same_band(freq, entry[i].freq)) | 535 | if (!same_band(freq, entry[i].freq)) |
533 | continue; | 536 | continue; |
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c index 0d3d108f6fe..2fab7d20ffc 100644 --- a/drivers/net/wireless/p54/fwio.c +++ b/drivers/net/wireless/p54/fwio.c | |||
@@ -559,6 +559,7 @@ int p54_set_edcf(struct p54_common *priv) | |||
559 | { | 559 | { |
560 | struct sk_buff *skb; | 560 | struct sk_buff *skb; |
561 | struct p54_edcf *edcf; | 561 | struct p54_edcf *edcf; |
562 | u8 rtd; | ||
562 | 563 | ||
563 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*edcf), | 564 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*edcf), |
564 | P54_CONTROL_TYPE_DCFINIT, GFP_ATOMIC); | 565 | P54_CONTROL_TYPE_DCFINIT, GFP_ATOMIC); |
@@ -575,9 +576,15 @@ int p54_set_edcf(struct p54_common *priv) | |||
575 | edcf->sifs = 0x0a; | 576 | edcf->sifs = 0x0a; |
576 | edcf->eofpad = 0x06; | 577 | edcf->eofpad = 0x06; |
577 | } | 578 | } |
579 | /* | ||
580 | * calculate the extra round trip delay according to the | ||
581 | * formula from 802.11-2007 17.3.8.6. | ||
582 | */ | ||
583 | rtd = 3 * priv->coverage_class; | ||
584 | edcf->slottime += rtd; | ||
585 | edcf->round_trip_delay = cpu_to_le16(rtd); | ||
578 | /* (see prism54/isl_oid.h for further details) */ | 586 | /* (see prism54/isl_oid.h for further details) */ |
579 | edcf->frameburst = cpu_to_le16(0); | 587 | edcf->frameburst = cpu_to_le16(0); |
580 | edcf->round_trip_delay = cpu_to_le16(0); | ||
581 | edcf->flags = 0; | 588 | edcf->flags = 0; |
582 | memset(edcf->mapping, 0, sizeof(edcf->mapping)); | 589 | memset(edcf->mapping, 0, sizeof(edcf->mapping)); |
583 | memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); | 590 | memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); |
diff --git a/drivers/net/wireless/p54/lmac.h b/drivers/net/wireless/p54/lmac.h index 5ca117e6f95..eb581abc107 100644 --- a/drivers/net/wireless/p54/lmac.h +++ b/drivers/net/wireless/p54/lmac.h | |||
@@ -526,7 +526,7 @@ int p54_init_leds(struct p54_common *priv); | |||
526 | void p54_unregister_leds(struct p54_common *priv); | 526 | void p54_unregister_leds(struct p54_common *priv); |
527 | 527 | ||
528 | /* xmit functions */ | 528 | /* xmit functions */ |
529 | int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb); | 529 | void p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb); |
530 | int p54_tx_cancel(struct p54_common *priv, __le32 req_id); | 530 | int p54_tx_cancel(struct p54_common *priv, __le32 req_id); |
531 | void p54_tx(struct p54_common *priv, struct sk_buff *skb); | 531 | void p54_tx(struct p54_common *priv, struct sk_buff *skb); |
532 | 532 | ||
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c index e14a05bbc48..356e6bb443a 100644 --- a/drivers/net/wireless/p54/main.c +++ b/drivers/net/wireless/p54/main.c | |||
@@ -157,7 +157,7 @@ static int p54_beacon_update(struct p54_common *priv, | |||
157 | * to cancel the old beacon template by hand, instead the firmware | 157 | * to cancel the old beacon template by hand, instead the firmware |
158 | * will release the previous one through the feedback mechanism. | 158 | * will release the previous one through the feedback mechanism. |
159 | */ | 159 | */ |
160 | WARN_ON(p54_tx_80211(priv->hw, beacon)); | 160 | p54_tx_80211(priv->hw, beacon); |
161 | priv->tsf_high32 = 0; | 161 | priv->tsf_high32 = 0; |
162 | priv->tsf_low32 = 0; | 162 | priv->tsf_low32 = 0; |
163 | 163 | ||
@@ -566,6 +566,17 @@ static void p54_flush(struct ieee80211_hw *dev, bool drop) | |||
566 | WARN(total, "tx flush timeout, unresponsive firmware"); | 566 | WARN(total, "tx flush timeout, unresponsive firmware"); |
567 | } | 567 | } |
568 | 568 | ||
569 | static void p54_set_coverage_class(struct ieee80211_hw *dev, u8 coverage_class) | ||
570 | { | ||
571 | struct p54_common *priv = dev->priv; | ||
572 | |||
573 | mutex_lock(&priv->conf_mutex); | ||
574 | /* support all coverage class values as in 802.11-2007 Table 7-27 */ | ||
575 | priv->coverage_class = clamp_t(u8, coverage_class, 0, 31); | ||
576 | p54_set_edcf(priv); | ||
577 | mutex_unlock(&priv->conf_mutex); | ||
578 | } | ||
579 | |||
569 | static const struct ieee80211_ops p54_ops = { | 580 | static const struct ieee80211_ops p54_ops = { |
570 | .tx = p54_tx_80211, | 581 | .tx = p54_tx_80211, |
571 | .start = p54_start, | 582 | .start = p54_start, |
@@ -584,6 +595,7 @@ static const struct ieee80211_ops p54_ops = { | |||
584 | .conf_tx = p54_conf_tx, | 595 | .conf_tx = p54_conf_tx, |
585 | .get_stats = p54_get_stats, | 596 | .get_stats = p54_get_stats, |
586 | .get_survey = p54_get_survey, | 597 | .get_survey = p54_get_survey, |
598 | .set_coverage_class = p54_set_coverage_class, | ||
587 | }; | 599 | }; |
588 | 600 | ||
589 | struct ieee80211_hw *p54_init_common(size_t priv_data_len) | 601 | struct ieee80211_hw *p54_init_common(size_t priv_data_len) |
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h index f951c8f3186..50730fc23fe 100644 --- a/drivers/net/wireless/p54/p54.h +++ b/drivers/net/wireless/p54/p54.h | |||
@@ -217,6 +217,7 @@ struct p54_common { | |||
217 | u32 tsf_low32, tsf_high32; | 217 | u32 tsf_low32, tsf_high32; |
218 | u32 basic_rate_mask; | 218 | u32 basic_rate_mask; |
219 | u16 aid; | 219 | u16 aid; |
220 | u8 coverage_class; | ||
220 | bool powersave_override; | 221 | bool powersave_override; |
221 | __le32 beacon_req_id; | 222 | __le32 beacon_req_id; |
222 | struct completion beacon_comp; | 223 | struct completion beacon_comp; |
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c index 917d5d948e3..7834c26c295 100644 --- a/drivers/net/wireless/p54/txrx.c +++ b/drivers/net/wireless/p54/txrx.c | |||
@@ -367,7 +367,7 @@ static int p54_rx_data(struct p54_common *priv, struct sk_buff *skb) | |||
367 | rx_status->mactime = ((u64)priv->tsf_high32) << 32 | tsf32; | 367 | rx_status->mactime = ((u64)priv->tsf_high32) << 32 | tsf32; |
368 | priv->tsf_low32 = tsf32; | 368 | priv->tsf_low32 = tsf32; |
369 | 369 | ||
370 | rx_status->flag |= RX_FLAG_TSFT; | 370 | rx_status->flag |= RX_FLAG_MACTIME_MPDU; |
371 | 371 | ||
372 | if (hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN)) | 372 | if (hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN)) |
373 | header_len += hdr->align[0]; | 373 | header_len += hdr->align[0]; |
@@ -696,7 +696,7 @@ static u8 p54_convert_algo(u32 cipher) | |||
696 | } | 696 | } |
697 | } | 697 | } |
698 | 698 | ||
699 | int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) | 699 | void p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) |
700 | { | 700 | { |
701 | struct p54_common *priv = dev->priv; | 701 | struct p54_common *priv = dev->priv; |
702 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 702 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
@@ -717,12 +717,8 @@ int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
717 | &hdr_flags, &aid, &burst_allowed); | 717 | &hdr_flags, &aid, &burst_allowed); |
718 | 718 | ||
719 | if (p54_tx_qos_accounting_alloc(priv, skb, queue)) { | 719 | if (p54_tx_qos_accounting_alloc(priv, skb, queue)) { |
720 | if (!IS_QOS_QUEUE(queue)) { | 720 | dev_kfree_skb_any(skb); |
721 | dev_kfree_skb_any(skb); | 721 | return; |
722 | return NETDEV_TX_OK; | ||
723 | } else { | ||
724 | return NETDEV_TX_BUSY; | ||
725 | } | ||
726 | } | 722 | } |
727 | 723 | ||
728 | padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3; | 724 | padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3; |
@@ -865,5 +861,4 @@ int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
865 | p54info->extra_len = extra_len; | 861 | p54info->extra_len = extra_len; |
866 | 862 | ||
867 | p54_tx(priv, skb); | 863 | p54_tx(priv, skb); |
868 | return NETDEV_TX_OK; | ||
869 | } | 864 | } |