diff options
| author | David S. Miller <davem@davemloft.net> | 2009-01-26 00:36:34 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-01-26 00:36:34 -0500 |
| commit | 71be7a36026b25e17657ff8e4317837176bf8cfd (patch) | |
| tree | 16d78281a13c1c70b79a4420d882cbd1ea86ecea | |
| parent | a8d694c651356ec89452e15b0189c061fb7e1cf1 (diff) | |
| parent | 2fcbab044a3faf4d4a6e269148dd1f188303b206 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-rs.c | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/p54/p54usb.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_dev.c | 1 |
4 files changed, 29 insertions, 7 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index 9b60a0c5de5f..21c841847d88 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c | |||
| @@ -638,12 +638,16 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, | |||
| 638 | s8 scale_action = 0; | 638 | s8 scale_action = 0; |
| 639 | unsigned long flags; | 639 | unsigned long flags; |
| 640 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 640 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
| 641 | u16 fc, rate_mask; | 641 | u16 fc; |
| 642 | u16 rate_mask = 0; | ||
| 642 | struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_r; | 643 | struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_r; |
| 643 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 644 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| 644 | 645 | ||
| 645 | IWL_DEBUG_RATE("enter\n"); | 646 | IWL_DEBUG_RATE("enter\n"); |
| 646 | 647 | ||
| 648 | if (sta) | ||
| 649 | rate_mask = sta->supp_rates[sband->band]; | ||
| 650 | |||
| 647 | /* Send management frames and broadcast/multicast data using lowest | 651 | /* Send management frames and broadcast/multicast data using lowest |
| 648 | * rate. */ | 652 | * rate. */ |
| 649 | fc = le16_to_cpu(hdr->frame_control); | 653 | fc = le16_to_cpu(hdr->frame_control); |
| @@ -651,11 +655,15 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, | |||
| 651 | is_multicast_ether_addr(hdr->addr1) || | 655 | is_multicast_ether_addr(hdr->addr1) || |
| 652 | !sta || !priv_sta) { | 656 | !sta || !priv_sta) { |
| 653 | IWL_DEBUG_RATE("leave: No STA priv data to update!\n"); | 657 | IWL_DEBUG_RATE("leave: No STA priv data to update!\n"); |
| 654 | info->control.rates[0].idx = rate_lowest_index(sband, sta); | 658 | if (!rate_mask) |
| 659 | info->control.rates[0].idx = | ||
| 660 | rate_lowest_index(sband, NULL); | ||
| 661 | else | ||
| 662 | info->control.rates[0].idx = | ||
| 663 | rate_lowest_index(sband, sta); | ||
| 655 | return; | 664 | return; |
| 656 | } | 665 | } |
| 657 | 666 | ||
| 658 | rate_mask = sta->supp_rates[sband->band]; | ||
| 659 | index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT - 1); | 667 | index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT - 1); |
| 660 | 668 | ||
| 661 | if (sband->band == IEEE80211_BAND_5GHZ) | 669 | if (sband->band == IEEE80211_BAND_5GHZ) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index f3f17929ca0b..27f50471aed8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
| @@ -944,7 +944,8 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband, | |||
| 944 | } | 944 | } |
| 945 | 945 | ||
| 946 | /* See if there's a better rate or modulation mode to try. */ | 946 | /* See if there's a better rate or modulation mode to try. */ |
| 947 | rs_rate_scale_perform(priv, hdr, sta, lq_sta); | 947 | if (sta && sta->supp_rates[sband->band]) |
| 948 | rs_rate_scale_perform(priv, hdr, sta, lq_sta); | ||
| 948 | out: | 949 | out: |
| 949 | return; | 950 | return; |
| 950 | } | 951 | } |
| @@ -2101,14 +2102,23 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta, | |||
| 2101 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 2102 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| 2102 | struct iwl_lq_sta *lq_sta = priv_sta; | 2103 | struct iwl_lq_sta *lq_sta = priv_sta; |
| 2103 | int rate_idx; | 2104 | int rate_idx; |
| 2105 | u64 mask_bit = 0; | ||
| 2104 | 2106 | ||
| 2105 | IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); | 2107 | IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); |
| 2106 | 2108 | ||
| 2109 | if (sta) | ||
| 2110 | mask_bit = sta->supp_rates[sband->band]; | ||
| 2111 | |||
| 2107 | /* Send management frames and broadcast/multicast data using lowest | 2112 | /* Send management frames and broadcast/multicast data using lowest |
| 2108 | * rate. */ | 2113 | * rate. */ |
| 2109 | if (!ieee80211_is_data(hdr->frame_control) || | 2114 | if (!ieee80211_is_data(hdr->frame_control) || |
| 2110 | is_multicast_ether_addr(hdr->addr1) || !sta || !lq_sta) { | 2115 | is_multicast_ether_addr(hdr->addr1) || !sta || !lq_sta) { |
| 2111 | info->control.rates[0].idx = rate_lowest_index(sband, sta); | 2116 | if (!mask_bit) |
| 2117 | info->control.rates[0].idx = | ||
| 2118 | rate_lowest_index(sband, NULL); | ||
| 2119 | else | ||
| 2120 | info->control.rates[0].idx = | ||
| 2121 | rate_lowest_index(sband, sta); | ||
| 2112 | return; | 2122 | return; |
| 2113 | } | 2123 | } |
| 2114 | 2124 | ||
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 4487cc5c928b..5de2ebfb28c7 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
| @@ -229,6 +229,8 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
| 229 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), | 229 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), |
| 230 | skb->data, skb->len, FREE_AFTER_TX(skb) ? | 230 | skb->data, skb->len, FREE_AFTER_TX(skb) ? |
| 231 | p54u_tx_cb : p54u_tx_dummy_cb, skb); | 231 | p54u_tx_cb : p54u_tx_dummy_cb, skb); |
| 232 | addr_urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 233 | data_urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 232 | 234 | ||
| 233 | usb_anchor_urb(addr_urb, &priv->submitted); | 235 | usb_anchor_urb(addr_urb, &priv->submitted); |
| 234 | err = usb_submit_urb(addr_urb, GFP_ATOMIC); | 236 | err = usb_submit_urb(addr_urb, GFP_ATOMIC); |
| @@ -237,7 +239,7 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
| 237 | goto out; | 239 | goto out; |
| 238 | } | 240 | } |
| 239 | 241 | ||
| 240 | usb_anchor_urb(addr_urb, &priv->submitted); | 242 | usb_anchor_urb(data_urb, &priv->submitted); |
| 241 | err = usb_submit_urb(data_urb, GFP_ATOMIC); | 243 | err = usb_submit_urb(data_urb, GFP_ATOMIC); |
| 242 | if (err) | 244 | if (err) |
| 243 | usb_unanchor_urb(data_urb); | 245 | usb_unanchor_urb(data_urb); |
| @@ -332,12 +334,13 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
| 332 | * free what's inside the transfer_buffer after the callback routine | 334 | * free what's inside the transfer_buffer after the callback routine |
| 333 | * has completed. | 335 | * has completed. |
| 334 | */ | 336 | */ |
| 335 | int_urb->transfer_flags |= URB_FREE_BUFFER; | 337 | int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET; |
| 336 | 338 | ||
| 337 | usb_fill_bulk_urb(data_urb, priv->udev, | 339 | usb_fill_bulk_urb(data_urb, priv->udev, |
| 338 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), | 340 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), |
| 339 | hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ? | 341 | hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ? |
| 340 | p54u_tx_cb : p54u_tx_dummy_cb, skb); | 342 | p54u_tx_cb : p54u_tx_dummy_cb, skb); |
| 343 | data_urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 341 | 344 | ||
| 342 | usb_anchor_urb(int_urb, &priv->submitted); | 345 | usb_anchor_urb(int_urb, &priv->submitted); |
| 343 | err = usb_submit_urb(int_urb, GFP_ATOMIC); | 346 | err = usb_submit_urb(int_urb, GFP_ATOMIC); |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 6ad6bac37706..22bc07ef2f37 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
| @@ -273,6 +273,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
| 273 | 273 | ||
| 274 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), | 274 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), |
| 275 | buf, skb->len, rtl8187_tx_cb, skb); | 275 | buf, skb->len, rtl8187_tx_cb, skb); |
| 276 | urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 276 | usb_anchor_urb(urb, &priv->anchored); | 277 | usb_anchor_urb(urb, &priv->anchored); |
| 277 | rc = usb_submit_urb(urb, GFP_ATOMIC); | 278 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
| 278 | if (rc < 0) { | 279 | if (rc < 0) { |
