summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Cooper <elicooper@gmx.com>2016-01-18 06:30:19 -0500
committerKalle Valo <kvalo@codeaurora.org>2016-01-25 08:19:48 -0500
commit262c741e0825b29447a9e53b6582afd6b14c3706 (patch)
treedc819eeec0178daf1a7eb5e4598a28c31ff53a18
parente0045bf80f62779ba75ba04513020d60e59f5298 (diff)
rt2x00: fix monitor mode regression
Since commit df1404650ccb ("mac80211: remove support for IFF_PROMISC") monitor mode for rt2x00 has been made effectively useless because the hardware filter is configured to drop packets whose intended recipient is not the device, regardless of the presence of monitor mode interfaces. This patch fixes this regression by adding explicit monitor mode support, and by configuring the hardware filter accordingly. Signed-off-by: Eli Cooper <elicooper@gmx.com> Acked-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2400pci.c4
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2500pci.c4
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2500usb.c4
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2800lib.c3
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2x00.h1
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2x00config.c5
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2x00mac.c5
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt61pci.c4
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt73usb.c4
9 files changed, 23 insertions, 11 deletions
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
index 9a3966cd6fbe..155f343981fe 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
@@ -273,8 +273,10 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
273 !(filter_flags & FIF_PLCPFAIL)); 273 !(filter_flags & FIF_PLCPFAIL));
274 rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 274 rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
275 !(filter_flags & FIF_CONTROL)); 275 !(filter_flags & FIF_CONTROL));
276 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 1); 276 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
277 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
277 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 278 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
279 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
278 !rt2x00dev->intf_ap_count); 280 !rt2x00dev->intf_ap_count);
279 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1); 281 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
280 rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg); 282 rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
index 1a6740b4d396..2553cdd74066 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
@@ -274,8 +274,10 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
274 !(filter_flags & FIF_PLCPFAIL)); 274 !(filter_flags & FIF_PLCPFAIL));
275 rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 275 rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
276 !(filter_flags & FIF_CONTROL)); 276 !(filter_flags & FIF_CONTROL));
277 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 1); 277 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
278 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
278 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 279 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
280 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
279 !rt2x00dev->intf_ap_count); 281 !rt2x00dev->intf_ap_count);
280 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1); 282 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
281 rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST, 283 rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST,
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
index d26018f30b7d..2d64611de300 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
@@ -437,8 +437,10 @@ static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev,
437 !(filter_flags & FIF_PLCPFAIL)); 437 !(filter_flags & FIF_PLCPFAIL));
438 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL, 438 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL,
439 !(filter_flags & FIF_CONTROL)); 439 !(filter_flags & FIF_CONTROL));
440 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME, 1); 440 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
441 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
441 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS, 442 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
443 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
442 !rt2x00dev->intf_ap_count); 444 !rt2x00dev->intf_ap_count);
443 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1); 445 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
444 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST, 446 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 9733b31a780d..a26afcab03ed 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -1490,7 +1490,8 @@ void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
1490 !(filter_flags & FIF_FCSFAIL)); 1490 !(filter_flags & FIF_FCSFAIL));
1491 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR, 1491 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
1492 !(filter_flags & FIF_PLCPFAIL)); 1492 !(filter_flags & FIF_PLCPFAIL));
1493 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME, 1); 1493 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME,
1494 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
1494 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0); 1495 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
1495 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1); 1496 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
1496 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST, 1497 rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 3282ddb766f4..26427140a963 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -669,6 +669,7 @@ enum rt2x00_state_flags {
669 CONFIG_POWERSAVING, 669 CONFIG_POWERSAVING,
670 CONFIG_HT_DISABLED, 670 CONFIG_HT_DISABLED,
671 CONFIG_QOS_DISABLED, 671 CONFIG_QOS_DISABLED,
672 CONFIG_MONITORING,
672 673
673 /* 674 /*
674 * Mark we currently are sequentially reading TX_STA_FIFO register 675 * Mark we currently are sequentially reading TX_STA_FIFO register
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00config.c b/drivers/net/wireless/ralink/rt2x00/rt2x00config.c
index 7e8bb1198ae9..6a1f508d472f 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00config.c
@@ -277,6 +277,11 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
277 else 277 else
278 clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags); 278 clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
279 279
280 if (conf->flags & IEEE80211_CONF_MONITOR)
281 set_bit(CONFIG_MONITORING, &rt2x00dev->flags);
282 else
283 clear_bit(CONFIG_MONITORING, &rt2x00dev->flags);
284
280 rt2x00dev->curr_band = conf->chandef.chan->band; 285 rt2x00dev->curr_band = conf->chandef.chan->band;
281 rt2x00dev->curr_freq = conf->chandef.chan->center_freq; 286 rt2x00dev->curr_freq = conf->chandef.chan->center_freq;
282 rt2x00dev->tx_power = conf->power_level; 287 rt2x00dev->tx_power = conf->power_level;
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
index 3c26ee65a415..13da95a24cf7 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
@@ -385,11 +385,6 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
385 *total_flags |= FIF_PSPOLL; 385 *total_flags |= FIF_PSPOLL;
386 } 386 }
387 387
388 /*
389 * Check if there is any work left for us.
390 */
391 if (rt2x00dev->packet_filter == *total_flags)
392 return;
393 rt2x00dev->packet_filter = *total_flags; 388 rt2x00dev->packet_filter = *total_flags;
394 389
395 rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); 390 rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
index c0e730ea1b69..24a3436ef952 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
@@ -530,8 +530,10 @@ static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev,
530 !(filter_flags & FIF_PLCPFAIL)); 530 !(filter_flags & FIF_PLCPFAIL));
531 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 531 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
532 !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); 532 !(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
533 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 1); 533 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
534 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
534 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 535 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
536 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
535 !rt2x00dev->intf_ap_count); 537 !rt2x00dev->intf_ap_count);
536 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1); 538 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
537 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST, 539 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
diff --git a/drivers/net/wireless/ralink/rt2x00/rt73usb.c b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
index 7081e13b4fd6..7bbc86931168 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
@@ -480,8 +480,10 @@ static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev,
480 !(filter_flags & FIF_PLCPFAIL)); 480 !(filter_flags & FIF_PLCPFAIL));
481 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 481 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
482 !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); 482 !(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
483 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 1); 483 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
484 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
484 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 485 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
486 !test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
485 !rt2x00dev->intf_ap_count); 487 !rt2x00dev->intf_ap_count);
486 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1); 488 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
487 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST, 489 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,