Skip to content

Commit 80c99c2

Browse files
authored
Merge pull request #23 from ekuznetsov139/rt2x00
Monitor mode in rt2x00 Wi-Fi adapters
2 parents ebb3e2c + d3c1e3b commit 80c99c2

9 files changed

Lines changed: 23 additions & 11 deletions

File tree

drivers/net/wireless/rt2x00/rt2400pci.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,10 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
273273
!(filter_flags & FIF_PLCPFAIL));
274274
rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
275275
!(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));
277278
rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
279+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
278280
!rt2x00dev->intf_ap_count);
279281
rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
280282
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);

drivers/net/wireless/rt2x00/rt2500pci.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,10 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
274274
!(filter_flags & FIF_PLCPFAIL));
275275
rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
276276
!(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));
278279
rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
280+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
279281
!rt2x00dev->intf_ap_count);
280282
rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
281283
rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST,

drivers/net/wireless/rt2x00/rt2500usb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,10 @@ static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev,
434434
!(filter_flags & FIF_PLCPFAIL));
435435
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL,
436436
!(filter_flags & FIF_CONTROL));
437-
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME, 1);
437+
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
438+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
438439
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
440+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
439441
!rt2x00dev->intf_ap_count);
440442
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
441443
rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,

drivers/net/wireless/rt2x00/rt2800lib.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1490,7 +1490,8 @@ void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
14901490
!(filter_flags & FIF_FCSFAIL));
14911491
rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
14921492
!(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));
14941495
rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
14951496
rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
14961497
rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,

drivers/net/wireless/rt2x00/rt2x00.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ enum rt2x00_state_flags {
669669
CONFIG_POWERSAVING,
670670
CONFIG_HT_DISABLED,
671671
CONFIG_QOS_DISABLED,
672+
CONFIG_MONITORING,
672673

673674
/*
674675
* Mark we currently are sequentially reading TX_STA_FIFO register

drivers/net/wireless/rt2x00/rt2x00config.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,11 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
277277
else
278278
clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags);
279279

280+
if (conf->flags & IEEE80211_CONF_MONITOR)
281+
set_bit(CONFIG_MONITORING, &rt2x00dev->flags);
282+
else
283+
clear_bit(CONFIG_MONITORING, &rt2x00dev->flags);
284+
280285
rt2x00dev->curr_band = conf->chandef.chan->band;
281286
rt2x00dev->curr_freq = conf->chandef.chan->center_freq;
282287
rt2x00dev->tx_power = conf->power_level;

drivers/net/wireless/rt2x00/rt2x00mac.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -385,11 +385,6 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
385385
*total_flags |= FIF_PSPOLL;
386386
}
387387

388-
/*
389-
* Check if there is any work left for us.
390-
*/
391-
if (rt2x00dev->packet_filter == *total_flags)
392-
return;
393388
rt2x00dev->packet_filter = *total_flags;
394389

395390
rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);

drivers/net/wireless/rt2x00/rt61pci.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,10 @@ static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev,
530530
!(filter_flags & FIF_PLCPFAIL));
531531
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
532532
!(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));
534535
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
536+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
535537
!rt2x00dev->intf_ap_count);
536538
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
537539
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,

drivers/net/wireless/rt2x00/rt73usb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,10 @@ static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev,
480480
!(filter_flags & FIF_PLCPFAIL));
481481
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
482482
!(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));
484485
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
486+
!test_bit(CONFIG_MONITORING, &rt2x00dev->flags) &&
485487
!rt2x00dev->intf_ap_count);
486488
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
487489
rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,

0 commit comments

Comments
 (0)