53 lines
1.8 KiB
Diff
53 lines
1.8 KiB
Diff
diff -r 0de05c2ae1be drivers/net/wireless/rtl818x/rtl8187/dev.c
|
|
--- a/drivers/net/wireless/rtl818x/rtl8187/dev.c Sat Sep 29 20:29:54 2012 -0400
|
|
+++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c Sat Sep 29 20:37:29 2012 -0400
|
|
@@ -252,8 +252,18 @@
|
|
flags |= RTL818X_TX_DESC_FLAG_NO_ENC;
|
|
|
|
flags |= ieee80211_get_tx_rate(dev, info)->hw_value << 24;
|
|
+
|
|
+ // When this flag is set the firmware waits untill ALL fragments have
|
|
+ // reached the USB device. Then it sends the first fragment and waits
|
|
+ // for ACKS's. Of course in monitor mode it won't detect these ACK's.
|
|
if (ieee80211_has_morefrags(tx_hdr->frame_control))
|
|
- flags |= RTL818X_TX_DESC_FLAG_MOREFRAG;
|
|
+ {
|
|
+ // If info->control.vif is NULL it's most likely in monitor mode
|
|
+ if (info->control.vif != NULL && info->control.vif->type != NL80211_IFTYPE_MONITOR) {
|
|
+ flags |= RTL818X_TX_DESC_FLAG_MOREFRAG;
|
|
+ }
|
|
+ }
|
|
+
|
|
if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) {
|
|
flags |= RTL818X_TX_DESC_FLAG_RTS;
|
|
flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19;
|
|
diff -r 0de05c2ae1be net/mac80211/tx.c
|
|
--- a/net/mac80211/tx.c Sat Sep 29 20:29:54 2012 -0400
|
|
+++ b/net/mac80211/tx.c Sat Sep 29 20:37:29 2012 -0400
|
|
@@ -1508,7 +1508,10 @@
|
|
}
|
|
}
|
|
|
|
- ieee80211_set_qos_hdr(sdata, skb);
|
|
+ // Don't overwrite QoS header in monitor mode
|
|
+ if (likely(info->control.vif->type != NL80211_IFTYPE_MONITOR)) {
|
|
+ ieee80211_set_qos_hdr(sdata, skb);
|
|
+ }
|
|
ieee80211_tx(sdata, skb, false, band);
|
|
}
|
|
|
|
diff -r 0de05c2ae1be net/wireless/chan.c
|
|
--- a/net/wireless/chan.c Sat Sep 29 20:29:54 2012 -0400
|
|
+++ b/net/wireless/chan.c Sat Sep 29 20:37:29 2012 -0400
|
|
@@ -439,8 +439,8 @@
|
|
{
|
|
if (!rdev->ops->set_monitor_channel)
|
|
return -EOPNOTSUPP;
|
|
- if (!cfg80211_has_monitors_only(rdev))
|
|
- return -EBUSY;
|
|
+ //if (!cfg80211_has_monitors_only(rdev))
|
|
+ // return -EBUSY;
|
|
|
|
return rdev_set_monitor_channel(rdev, chandef);
|
|
}
|