diff options
Diffstat (limited to 'drivers/net/wireless/rtl818x/rtl8187/dev.c')
-rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187/dev.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/net/wireless/rtl818x/rtl8187/dev.c b/drivers/net/wireless/rtl818x/rtl8187/dev.c index 6b82cac37ee3..1e0be14d10d4 100644 --- a/drivers/net/wireless/rtl818x/rtl8187/dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c | |||
@@ -227,7 +227,7 @@ static void rtl8187_tx_cb(struct urb *urb) | |||
227 | } | 227 | } |
228 | } | 228 | } |
229 | 229 | ||
230 | static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | 230 | static void rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) |
231 | { | 231 | { |
232 | struct rtl8187_priv *priv = dev->priv; | 232 | struct rtl8187_priv *priv = dev->priv; |
233 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 233 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
@@ -241,7 +241,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
241 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 241 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
242 | if (!urb) { | 242 | if (!urb) { |
243 | kfree_skb(skb); | 243 | kfree_skb(skb); |
244 | return NETDEV_TX_OK; | 244 | return; |
245 | } | 245 | } |
246 | 246 | ||
247 | flags = skb->len; | 247 | flags = skb->len; |
@@ -309,8 +309,6 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
309 | kfree_skb(skb); | 309 | kfree_skb(skb); |
310 | } | 310 | } |
311 | usb_free_urb(urb); | 311 | usb_free_urb(urb); |
312 | |||
313 | return NETDEV_TX_OK; | ||
314 | } | 312 | } |
315 | 313 | ||
316 | static void rtl8187_rx_cb(struct urb *urb) | 314 | static void rtl8187_rx_cb(struct urb *urb) |
@@ -373,7 +371,7 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
373 | rx_status.rate_idx = rate; | 371 | rx_status.rate_idx = rate; |
374 | rx_status.freq = dev->conf.channel->center_freq; | 372 | rx_status.freq = dev->conf.channel->center_freq; |
375 | rx_status.band = dev->conf.channel->band; | 373 | rx_status.band = dev->conf.channel->band; |
376 | rx_status.flag |= RX_FLAG_TSFT; | 374 | rx_status.flag |= RX_FLAG_MACTIME_MPDU; |
377 | if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR) | 375 | if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR) |
378 | rx_status.flag |= RX_FLAG_FAILED_FCS_CRC; | 376 | rx_status.flag |= RX_FLAG_FAILED_FCS_CRC; |
379 | memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); | 377 | memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); |
@@ -871,23 +869,35 @@ static void rtl8187_work(struct work_struct *work) | |||
871 | /* The RTL8187 returns the retry count through register 0xFFFA. In | 869 | /* The RTL8187 returns the retry count through register 0xFFFA. In |
872 | * addition, it appears to be a cumulative retry count, not the | 870 | * addition, it appears to be a cumulative retry count, not the |
873 | * value for the current TX packet. When multiple TX entries are | 871 | * value for the current TX packet. When multiple TX entries are |
874 | * queued, the retry count will be valid for the last one in the queue. | 872 | * waiting in the queue, the retry count will be the total for all. |
875 | * The "error" should not matter for purposes of rate setting. */ | 873 | * The "error" may matter for purposes of rate setting, but there is |
874 | * no other choice with this hardware. | ||
875 | */ | ||
876 | struct rtl8187_priv *priv = container_of(work, struct rtl8187_priv, | 876 | struct rtl8187_priv *priv = container_of(work, struct rtl8187_priv, |
877 | work.work); | 877 | work.work); |
878 | struct ieee80211_tx_info *info; | 878 | struct ieee80211_tx_info *info; |
879 | struct ieee80211_hw *dev = priv->dev; | 879 | struct ieee80211_hw *dev = priv->dev; |
880 | static u16 retry; | 880 | static u16 retry; |
881 | u16 tmp; | 881 | u16 tmp; |
882 | u16 avg_retry; | ||
883 | int length; | ||
882 | 884 | ||
883 | mutex_lock(&priv->conf_mutex); | 885 | mutex_lock(&priv->conf_mutex); |
884 | tmp = rtl818x_ioread16(priv, (__le16 *)0xFFFA); | 886 | tmp = rtl818x_ioread16(priv, (__le16 *)0xFFFA); |
887 | length = skb_queue_len(&priv->b_tx_status.queue); | ||
888 | if (unlikely(!length)) | ||
889 | length = 1; | ||
890 | if (unlikely(tmp < retry)) | ||
891 | tmp = retry; | ||
892 | avg_retry = (tmp - retry) / length; | ||
885 | while (skb_queue_len(&priv->b_tx_status.queue) > 0) { | 893 | while (skb_queue_len(&priv->b_tx_status.queue) > 0) { |
886 | struct sk_buff *old_skb; | 894 | struct sk_buff *old_skb; |
887 | 895 | ||
888 | old_skb = skb_dequeue(&priv->b_tx_status.queue); | 896 | old_skb = skb_dequeue(&priv->b_tx_status.queue); |
889 | info = IEEE80211_SKB_CB(old_skb); | 897 | info = IEEE80211_SKB_CB(old_skb); |
890 | info->status.rates[0].count = tmp - retry + 1; | 898 | info->status.rates[0].count = avg_retry + 1; |
899 | if (info->status.rates[0].count > RETRY_COUNT) | ||
900 | info->flags &= ~IEEE80211_TX_STAT_ACK; | ||
891 | ieee80211_tx_status_irqsafe(dev, old_skb); | 901 | ieee80211_tx_status_irqsafe(dev, old_skb); |
892 | } | 902 | } |
893 | retry = tmp; | 903 | retry = tmp; |
@@ -933,8 +943,8 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
933 | rtl818x_iowrite32(priv, &priv->map->TX_CONF, | 943 | rtl818x_iowrite32(priv, &priv->map->TX_CONF, |
934 | RTL818X_TX_CONF_HW_SEQNUM | | 944 | RTL818X_TX_CONF_HW_SEQNUM | |
935 | RTL818X_TX_CONF_DISREQQSIZE | | 945 | RTL818X_TX_CONF_DISREQQSIZE | |
936 | (7 << 8 /* short retry limit */) | | 946 | (RETRY_COUNT << 8 /* short retry limit */) | |
937 | (7 << 0 /* long retry limit */) | | 947 | (RETRY_COUNT << 0 /* long retry limit */) | |
938 | (7 << 21 /* MAX TX DMA */)); | 948 | (7 << 21 /* MAX TX DMA */)); |
939 | rtl8187_init_urbs(dev); | 949 | rtl8187_init_urbs(dev); |
940 | rtl8187b_init_status_urb(dev); | 950 | rtl8187b_init_status_urb(dev); |
@@ -1378,6 +1388,9 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1378 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | 1388 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
1379 | IEEE80211_HW_SIGNAL_DBM | | 1389 | IEEE80211_HW_SIGNAL_DBM | |
1380 | IEEE80211_HW_RX_INCLUDES_FCS; | 1390 | IEEE80211_HW_RX_INCLUDES_FCS; |
1391 | /* Initialize rate-control variables */ | ||
1392 | dev->max_rates = 1; | ||
1393 | dev->max_rate_tries = RETRY_COUNT; | ||
1381 | 1394 | ||
1382 | eeprom.data = dev; | 1395 | eeprom.data = dev; |
1383 | eeprom.register_read = rtl8187_eeprom_register_read; | 1396 | eeprom.register_read = rtl8187_eeprom_register_read; |