aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/p54
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r--drivers/net/wireless/p54/eeprom.c7
-rw-r--r--drivers/net/wireless/p54/fwio.c9
-rw-r--r--drivers/net/wireless/p54/lmac.h2
-rw-r--r--drivers/net/wireless/p54/main.c14
-rw-r--r--drivers/net/wireless/p54/p54.h1
-rw-r--r--drivers/net/wireless/p54/txrx.c13
6 files changed, 32 insertions, 14 deletions
diff --git a/drivers/net/wireless/p54/eeprom.c b/drivers/net/wireless/p54/eeprom.c
index f54e15fcd623..13d750da9301 100644
--- a/drivers/net/wireless/p54/eeprom.c
+++ b/drivers/net/wireless/p54/eeprom.c
@@ -524,10 +524,13 @@ err_data:
524 524
525struct p54_rssi_db_entry *p54_rssi_find(struct p54_common *priv, const u16 freq) 525struct 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 0d3d108f6fe2..2fab7d20ffc2 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 5ca117e6f95b..eb581abc1079 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);
526void p54_unregister_leds(struct p54_common *priv); 526void p54_unregister_leds(struct p54_common *priv);
527 527
528/* xmit functions */ 528/* xmit functions */
529int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb); 529void p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb);
530int p54_tx_cancel(struct p54_common *priv, __le32 req_id); 530int p54_tx_cancel(struct p54_common *priv, __le32 req_id);
531void p54_tx(struct p54_common *priv, struct sk_buff *skb); 531void 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 e14a05bbc485..356e6bb443a6 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
569static 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
569static const struct ieee80211_ops p54_ops = { 580static 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
589struct ieee80211_hw *p54_init_common(size_t priv_data_len) 601struct 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 f951c8f31863..50730fc23fe5 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 917d5d948e3c..7834c26c2954 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
699int p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) 699void 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}