diff options
author | Helmut Schaa <helmut.schaa@googlemail.com> | 2010-10-02 05:31:33 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-10-05 13:35:27 -0400 |
commit | 5a5b6ed6ce46be128f2a5a9e56f47193c3ac3e32 (patch) | |
tree | 7b2798a71a4f0c92ad1e12d31f260707c2070ef3 | |
parent | c4c18a9dc16095fc8ada423f1e6ff3830d56d37c (diff) |
rt2x00: Don't enable broad- and multicast buffering on USB devices
Since rt2x00 USB devices have no chance to know when a beacon was sent
out in AP mode currently all broad- and multicast traffic is buffered in
mac80211 but never sent out at all.
Unfortunately we have no chance in sending the traffic out after a
DTIM beacon due to hw limitations. Hence, instead of never sending the
buffered traffic out better send it out immediately.
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Reported-by: Lauri Hintsala <lauri.hintsala@bluegiga.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 7 |
3 files changed, 22 insertions, 3 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 5843a6d8b627..103396495065 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1674,10 +1674,15 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
1674 | 1674 | ||
1675 | /* | 1675 | /* |
1676 | * Initialize all hw fields. | 1676 | * Initialize all hw fields. |
1677 | * | ||
1678 | * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING unless we are | ||
1679 | * capable of sending the buffered frames out after the DTIM | ||
1680 | * transmission using rt2x00lib_beacondone. This will send out | ||
1681 | * multicast and broadcast traffic immediately instead of buffering it | ||
1682 | * infinitly and thus dropping it after some time. | ||
1677 | */ | 1683 | */ |
1678 | rt2x00dev->hw->flags = | 1684 | rt2x00dev->hw->flags = |
1679 | IEEE80211_HW_RX_INCLUDES_FCS | | 1685 | IEEE80211_HW_RX_INCLUDES_FCS | |
1680 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | ||
1681 | IEEE80211_HW_SIGNAL_DBM | | 1686 | IEEE80211_HW_SIGNAL_DBM | |
1682 | IEEE80211_HW_SUPPORTS_PS | | 1687 | IEEE80211_HW_SUPPORTS_PS | |
1683 | IEEE80211_HW_PS_NULLFUNC_STACK; | 1688 | IEEE80211_HW_PS_NULLFUNC_STACK; |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 76b8783c5639..99b505f8e717 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -3164,11 +3164,20 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
3164 | * Initialize all hw fields. | 3164 | * Initialize all hw fields. |
3165 | */ | 3165 | */ |
3166 | rt2x00dev->hw->flags = | 3166 | rt2x00dev->hw->flags = |
3167 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | ||
3168 | IEEE80211_HW_SIGNAL_DBM | | 3167 | IEEE80211_HW_SIGNAL_DBM | |
3169 | IEEE80211_HW_SUPPORTS_PS | | 3168 | IEEE80211_HW_SUPPORTS_PS | |
3170 | IEEE80211_HW_PS_NULLFUNC_STACK | | 3169 | IEEE80211_HW_PS_NULLFUNC_STACK | |
3171 | IEEE80211_HW_AMPDU_AGGREGATION; | 3170 | IEEE80211_HW_AMPDU_AGGREGATION; |
3171 | /* | ||
3172 | * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices | ||
3173 | * unless we are capable of sending the buffered frames out after the | ||
3174 | * DTIM transmission using rt2x00lib_beacondone. This will send out | ||
3175 | * multicast and broadcast traffic immediately instead of buffering it | ||
3176 | * infinitly and thus dropping it after some time. | ||
3177 | */ | ||
3178 | if (!rt2x00_is_usb(rt2x00dev)) | ||
3179 | rt2x00dev->hw->flags |= | ||
3180 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; | ||
3172 | 3181 | ||
3173 | SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); | 3182 | SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev); |
3174 | SET_IEEE80211_PERM_ADDR(rt2x00dev->hw, | 3183 | SET_IEEE80211_PERM_ADDR(rt2x00dev->hw, |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index f78bc2a29328..66939fd8689d 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -2063,9 +2063,14 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
2063 | 2063 | ||
2064 | /* | 2064 | /* |
2065 | * Initialize all hw fields. | 2065 | * Initialize all hw fields. |
2066 | * | ||
2067 | * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING unless we are | ||
2068 | * capable of sending the buffered frames out after the DTIM | ||
2069 | * transmission using rt2x00lib_beacondone. This will send out | ||
2070 | * multicast and broadcast traffic immediately instead of buffering it | ||
2071 | * infinitly and thus dropping it after some time. | ||
2066 | */ | 2072 | */ |
2067 | rt2x00dev->hw->flags = | 2073 | rt2x00dev->hw->flags = |
2068 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | ||
2069 | IEEE80211_HW_SIGNAL_DBM | | 2074 | IEEE80211_HW_SIGNAL_DBM | |
2070 | IEEE80211_HW_SUPPORTS_PS | | 2075 | IEEE80211_HW_SUPPORTS_PS | |
2071 | IEEE80211_HW_PS_NULLFUNC_STACK; | 2076 | IEEE80211_HW_PS_NULLFUNC_STACK; |