Skip to contentSkip to conversation

Please pull 'upstream' branch of rt2x00

PATCH New Ivo van Doorn 1 participant 13 messages Sep 25, 2007 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

Hi John,

(Finally) the rt2x00 2.0.9 release containing the patches for the API changes from the mac80211-misc git tree.

NOTE: currently rt2x00.git is branched off from the mac80211-misc tree to make the porting easier and to allow early testing. So you might want to pull that tree before pulling rt2x00.

This release contains several bug fixes especially some kernel panics during rmmod have been fixed by Modestas Vainius.

---

The following changes since commit 4cceb887147261d7fd9fe7ce3b6d6f236c8300bc:
Michael Wu (1):
adm8211: Adapt to filter configuration API

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ upstream

Ivo van Doorn (11):
rt2x00: Correct error in calculating rssi for link tuner
rt2x00: Make *_beacon_update static
rt2x00: Increase rt2x00usb_vendor_request timeout.
rt2x00: Correctly identify rt2561turbo
rt2x00: adapt to filter configuration API
rt2x00: Reorganize rt2x00dev->flags
rt2x00: Add rt2x00dev->flags to debugfs
rt2x00: Stop link tuning when radio is down
rt2x00: Fix obvious typo in comment
rt2x00: Fix panic on rmmod with rfkill enabled
rt2x00: Release rt2x00 2.0.9

Modestas Vainius (1):
rt2x00: make rt2x00lib_stop_link_tuner() reentrant with link_tuner work

 drivers/net/wireless/rt2x00/rt2400pci.c    |  159 +++++++++++++-----------
 drivers/net/wireless/rt2x00/rt2500pci.c    |  171 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2500usb.c    |  181 ++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2x00.h       |   70 ++++-------
 drivers/net/wireless/rt2x00/rt2x00config.c |   75 +-----------
 drivers/net/wireless/rt2x00/rt2x00debug.c  |   37 ++++++
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  109 +++++++++++++-----
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    4 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c    |  155 ++++++++----------------
 drivers/net/wireless/rt2x00/rt2x00pci.c    |   31 ++---
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |   14 +--
 drivers/net/wireless/rt2x00/rt2x00ring.h   |   17 +++-
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   26 ++---
 drivers/net/wireless/rt2x00/rt2x00usb.h    |    8 +-
 drivers/net/wireless/rt2x00/rt61pci.c      |  172 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.c      |  179 ++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.h      |    2 +-
 17 files changed, 728 insertions(+), 682 deletions(-)
#1 lore raw

PATCH 1/12 rt2x00: Correct error in calculating rssi for link tuner

The call to rt2x00lib_precalculate_link_signal resets link.rx_success which is needed when calculating the average rssi for the link tuner. Change the call order so the link tuner runs first as it doesn't need the result of the precalculate.

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +6 -2
index cd82eef..5780d6a 100644
@@ -240,8 +240,6 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 	rt2x00dev->low_level_stats.dot11FCSErrorCount +=
 	    rt2x00dev->link.rx_failed;
 
-	rt2x00lib_precalculate_link_signal(&rt2x00dev->link);
-
 	/*
 	 * Only perform the link tuning when Link tuning
 	 * has been enabled (This could have been disabled from the EEPROM).
@@ -250,6 +248,12 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
 
 	/*
+	 * Precalculate a portion of the link signal which is
+	 * in based on the tx/rx success/failure counters.
+	 */
+	rt2x00lib_precalculate_link_signal(&rt2x00dev->link);
+
+	/*
 	 * Increase tuner counter, and reschedule the next link tuner run.
 	 */
 	rt2x00dev->link.count++;
Signature · 1 line
1.5.3.2
#2 lore raw

PATCH 2/12 rt2x00: Make *_beacon_update static

In reply to Ivo van Doorn

Make rt61pci_beacon_update and rt73usb_beacon_update static, they are only used inside their own source file and then only for setting it as callback funtion for mac80211.

---
 drivers/net/wireless/rt2x00/rt61pci.c |    2 +-
 drivers/net/wireless/rt2x00/rt73usb.c |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt61pci.c +1 -1
index 09c8c96..69ed178 100644
@@ -2462,7 +2462,7 @@ static void rt61pci_reset_tsf(struct ieee80211_hw *hw)
 	rt2x00pci_register_write(rt2x00dev, TXRX_CSR13, 0);
 }
 
-int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
+static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
 			  struct ieee80211_tx_control *control)
 {
 	struct rt2x00_dev *rt2x00dev = hw->priv;
drivers/net/wireless/rt2x00/rt73usb.c +1 -1
index 3397881..890b449 100644
@@ -1939,7 +1939,7 @@ static void rt73usb_reset_tsf(struct ieee80211_hw *hw)
 	rt73usb_register_write(rt2x00dev, TXRX_CSR13, 0);
 }
 
-int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
+static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
 			  struct ieee80211_tx_control *control)
 {
 	struct rt2x00_dev *rt2x00dev = hw->priv;
Signature · 1 line
1.5.3.2
#3 lore raw

PATCH 3/12 rt2x00: Increase rt2x00usb_vendor_request timeout.

In reply to Ivo van Doorn

By increasing the timeout for rt2x00usb_vendor_request, we should limit the number of loops required to send a signal to the device succefully.
500ms timeout is specified by the Ralink legacy drivers for rt2500usb. For rt73usb 1000ms is specified, but that includes the timeout for the firmware which is already specified in a different define.

---
 drivers/net/wireless/rt2x00/rt2x00usb.c |   10 ++++------
 drivers/net/wireless/rt2x00/rt2x00usb.h |    8 ++++----
 2 files changed, 8 insertions(+), 10 deletions(-)
drivers/net/wireless/rt2x00/rt2x00usb.c +4 -6
index a0f05ca..248144f 100644
@@ -42,7 +42,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 			     const u8 request, const u8 requesttype,
 			     const u16 offset, const u16 value,
 			     void *buffer, const u16 buffer_length,
-			     u16 timeout)
+			     const int timeout)
 {
 	struct usb_device *usb_dev =
 	    interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
@@ -60,12 +60,10 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 			return 0;
 
 		/*
-		 * Check for errors,
-		 * -ETIMEDOUT: We need a bit more time to complete.
+		 * Check for errors
 		 * -ENODEV: Device has disappeared, no point continuing.
+		 * All other errors: Try again.
 		 */
-		if (status == -ETIMEDOUT)
-			timeout *= 2;
 		else if (status == -ENODEV)
 			break;
 	}
@@ -81,7 +79,7 @@ EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request);
 int rt2x00usb_vendor_request_buff(const struct rt2x00_dev *rt2x00dev,
 				  const u8 request, const u8 requesttype,
 				  const u16 offset, void *buffer,
-				  const u16 buffer_length, u16 timeout)
+				  const u16 buffer_length, const int timeout)
 {
 	int status;
 
drivers/net/wireless/rt2x00/rt2x00usb.h +4 -4
index d4113e5..2681abe 100644
@@ -44,7 +44,7 @@
  */
 #define REGISTER_BUSY_COUNT		5
 #define REGISTER_BUSY_DELAY		100
-#define REGISTER_TIMEOUT		20
+#define REGISTER_TIMEOUT		500
 #define REGISTER_TIMEOUT_FIRMWARE	1000
 
 /*
@@ -95,7 +95,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 			     const u8 request, const u8 requesttype,
 			     const u16 offset, const u16 value,
 			     void *buffer, const u16 buffer_length,
-			     u16 timeout);
+			     const int timeout);
 
 /*
  * Used to read/write from/to the device.
@@ -110,7 +110,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 int rt2x00usb_vendor_request_buff(const struct rt2x00_dev *rt2x00dev,
 				  const u8 request, const u8 requesttype,
 				  const u16 offset, void *buffer,
-				  const u16 buffer_length, u16 timeout);
+				  const u16 buffer_length, const int timeout);
 
 /*
  * Simple wrapper around rt2x00usb_vendor_request to write a single
@@ -122,7 +122,7 @@ static inline int rt2x00usb_vendor_request_sw(const struct rt2x00_dev
 					      const u8 request,
 					      const u16 offset,
 					      const u16 value,
-					      int timeout)
+					      const int timeout)
 {
 	return rt2x00usb_vendor_request(rt2x00dev, request,
 					USB_VENDOR_REQUEST_OUT, offset,
Signature · 1 line
1.5.3.2
#4 lore raw

PATCH 4/12 rt2x00: Correctly identify rt2561turbo

In reply to Ivo van Doorn

Apparently rt2561s actually has PCI ID 0x0301
and rt2561 actually has PCI ID 0x0302.
Where rt2561s supports Turbo.

---
 drivers/net/wireless/rt2x00/rt2x00.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00.h +2 -2
index 80b079d..2609d4a 100644
@@ -159,8 +159,8 @@ struct rt2x00_chip {
 #define RT2460		0x0101
 #define RT2560		0x0201
 #define RT2570		0x1201
-#define RT2561		0x0301
-#define RT2561s		0x0302
+#define RT2561s		0x0301	/* Turbo */
+#define RT2561		0x0302
 #define RT2661		0x0401
 #define RT2571		0x1300
 
Signature · 1 line
1.5.3.2
#5 lore raw

PATCH 5/12 rt2x00: adapt to filter configuration API

In reply to Ivo van Doorn

This will make sure rt2x00 will follow the new mac80211 API concerning the packet filter.
This new API cleans up quite a lot of code in rt2x00.

---
 drivers/net/wireless/rt2x00/rt2400pci.c    |  155 +++++++++++++-----------
 drivers/net/wireless/rt2x00/rt2500pci.c    |  165 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2500usb.c    |  179 ++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2x00.h       |   37 ++----
 drivers/net/wireless/rt2x00/rt2x00config.c |   60 +---------
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   33 ++++--
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    1 -
 drivers/net/wireless/rt2x00/rt2x00mac.c    |  104 ++--------------
 drivers/net/wireless/rt2x00/rt2x00pci.c    |   31 ++---
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |    6 +-
 drivers/net/wireless/rt2x00/rt2x00ring.h   |   17 +++-
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   16 +--
 drivers/net/wireless/rt2x00/rt61pci.c      |  164 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.c      |  175 +++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.h      |    2 +-
 15 files changed, 556 insertions(+), 589 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +85 -70
index 398c201..03a94a3 100644
@@ -277,55 +277,14 @@ static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 	rt2x00pci_register_multiwrite(rt2x00dev, CSR5, &reg, sizeof(reg));
 }
 
-static void rt2400pci_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					   const unsigned int filter)
-{
-	int promisc = !!(filter & IFF_PROMISC);
-	u32 reg;
-
-	rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
-	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, !promisc);
-	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
-}
-
 static void rt2400pci_config_type(struct rt2x00_dev *rt2x00dev, int type)
 {
+	struct interface *intf = &rt2x00dev->interface;
 	u32 reg;
 
 	rt2x00pci_register_write(rt2x00dev, CSR14, 0);
 
 	/*
-	 * Apply hardware packet filter.
-	 */
-	rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
-
-	if (!is_monitor_present(&rt2x00dev->interface) &&
-	    (type == IEEE80211_IF_TYPE_IBSS || type == IEEE80211_IF_TYPE_STA))
-		rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 1);
-	else
-		rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 0);
-
-	/*
-	 * If there is a non-monitor interface present
-	 * the packet should be strict (even if a monitor interface is present!).
-	 * When there is only 1 interface present which is in monitor mode
-	 * we should start accepting _all_ frames.
-	 */
-	if (is_interface_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 1);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 1);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 1);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
-	} else if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 0);
-	}
-
-	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
-
-	/*
 	 * Enable beacon config
 	 */
 	rt2x00pci_register_read(rt2x00dev, BCNCSR1, &reg);
@@ -337,20 +296,16 @@ static void rt2400pci_config_type(struct rt2x00_dev *rt2x00dev, int type)
 	 * Enable synchronisation.
 	 */
 	rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
-	if (is_interface_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
-		rt2x00_set_field32(&reg, CSR14_TBCN, 1);
-	}
-
+	rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
+	rt2x00_set_field32(&reg, CSR14_TBCN, 1);
 	rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
-	if (type == IEEE80211_IF_TYPE_IBSS || type == IEEE80211_IF_TYPE_AP)
+	if (is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
+	    is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		rt2x00_set_field32(&reg, CSR14_TSF_SYNC, 2);
-	else if (type == IEEE80211_IF_TYPE_STA)
+	else if (is_interface_type(intf, IEEE80211_IF_TYPE_STA))
 		rt2x00_set_field32(&reg, CSR14_TSF_SYNC, 1);
-	else if (is_monitor_present(&rt2x00dev->interface) &&
-		 !is_interface_present(&rt2x00dev->interface))
+	else
 		rt2x00_set_field32(&reg, CSR14_TSF_SYNC, 0);
-
 	rt2x00pci_register_write(rt2x00dev, CSR14, reg);
 }
 
@@ -1104,7 +1059,7 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev,
  */
 static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 				    struct data_desc *txd,
-				    struct data_entry_desc *desc,
+				    struct txdata_entry_desc *desc,
 				    struct ieee80211_hdr *ieee80211hdr,
 				    unsigned int length,
 				    struct ieee80211_tx_control *control)
@@ -1200,8 +1155,8 @@ static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
 /*
  * RX control handlers
  */
-static int rt2400pci_fill_rxdone(struct data_entry *entry,
-				 int *signal, int *rssi, int *ofdm, int *size)
+static void rt2400pci_fill_rxdone(struct data_entry *entry,
+				  struct rxdata_entry_desc *desc)
 {
 	struct data_desc *rxd = entry->priv;
 	u32 word0;
@@ -1210,20 +1165,20 @@ static int rt2400pci_fill_rxdone(struct data_entry *entry,
 	rt2x00_desc_read(rxd, 0, &word0);
 	rt2x00_desc_read(rxd, 2, &word2);
 
-	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR))
-		return -EINVAL;
+	desc->flags = 0;
+	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
+		desc->flags |= RX_FLAG_FAILED_FCS_CRC;
+	if (rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR))
+		desc->flags |= RX_FLAG_FAILED_PLCP_CRC;
 
 	/*
 	 * Obtain the status about this packet.
 	 */
-	*signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL);
-	*rssi = rt2x00_get_field32(word2, RXD_W2_RSSI) -
+	desc->signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL);
+	desc->rssi = rt2x00_get_field32(word2, RXD_W2_RSSI) -
 	    entry->ring->rt2x00dev->rssi_offset;
-	*ofdm = 0;
-	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
-
-	return 0;
+	desc->ofdm = 0;
+	desc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 }
 
 /*
@@ -1460,10 +1415,7 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Initialize all hw fields.
 	 */
-	rt2x00dev->hw->flags =
-	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_MONITOR_DURING_OPER |
-	    IEEE80211_HW_NO_PROBE_FILTERING;
+	rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
 	rt2x00dev->hw->extra_tx_headroom = 0;
 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
@@ -1530,6 +1482,68 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 /*
  * IEEE80211 stack callback functions.
  */
+static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
+				       unsigned int changed_flags,
+				       unsigned int *total_flags,
+				       int mc_count,
+				       struct dev_addr_list *mc_list)
+{
+	struct rt2x00_dev *rt2x00dev = hw->priv;
+	struct interface *intf = &rt2x00dev->interface;
+	u32 reg;
+
+	/*
+	 * Mask off any flags we are going to ignore from
+	 * the total_flags field.
+	 */
+	*total_flags &=
+	    FIF_ALLMULTI |
+	    FIF_FCSFAIL |
+	    FIF_PLCPFAIL |
+	    FIF_CONTROL |
+	    FIF_OTHER_BSS |
+	    FIF_PROMISC_IN_BSS;
+
+	/*
+	 * Apply some rules to the filters:
+	 * - Some filters imply different filters to be set.
+	 * - Some things we can't filter out at all.
+	 * - Some filters are set based on interface type.
+	 */
+	*total_flags |= FIF_ALLMULTI;
+	if (changed_flags & FIF_OTHER_BSS ||
+	    changed_flags & FIF_PROMISC_IN_BSS)
+		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
+	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
+		*total_flags |= FIF_PROMISC_IN_BSS;
+
+	/*
+	 * Check if there is any work left for us.
+	 */
+	if (intf->filter == *total_flags)
+		return;
+	intf->filter = *total_flags;
+
+	/*
+	 * Start configuration steps.
+	 * Note that the version error will always be dropped
+	 * since there is no filter for it at this time.
+	 */
+	rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
+	rt2x00_set_field32(&reg, RXCSR0_DROP_CRC,
+			   !(*total_flags & FIF_FCSFAIL));
+	rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL,
+			   !(*total_flags & FIF_PLCPFAIL));
+	rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
+			   !(*total_flags & FIF_CONTROL));
+	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
+			   !(*total_flags & FIF_PROMISC_IN_BSS));
+	rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
+			   !(*total_flags & FIF_PROMISC_IN_BSS));
+	rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
+	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
+}
+
 static int rt2400pci_set_retry_limit(struct ieee80211_hw *hw,
 				     u32 short_retry, u32 long_retry)
 {
@@ -1602,11 +1616,13 @@ static int rt2400pci_tx_last_beacon(struct ieee80211_hw *hw)
 
 static const struct ieee80211_ops rt2400pci_mac80211_ops = {
 	.tx			= rt2x00mac_tx,
+	.start			= rt2x00mac_start,
+	.stop			= rt2x00mac_stop,
 	.add_interface		= rt2x00mac_add_interface,
 	.remove_interface	= rt2x00mac_remove_interface,
 	.config			= rt2x00mac_config,
 	.config_interface	= rt2x00mac_config_interface,
-	.set_multicast_list	= rt2x00mac_set_multicast_list,
+	.configure_filter	= rt2400pci_configure_filter,
 	.get_stats		= rt2x00mac_get_stats,
 	.set_retry_limit	= rt2400pci_set_retry_limit,
 	.conf_tx		= rt2400pci_conf_tx,
@@ -1635,7 +1651,6 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
 	.fill_rxdone		= rt2400pci_fill_rxdone,
 	.config_mac_addr	= rt2400pci_config_mac_addr,
 	.config_bssid		= rt2400pci_config_bssid,
-	.config_packet_filter	= rt2400pci_config_packet_filter,
 	.config_type		= rt2400pci_config_type,
 	.config			= rt2400pci_config,
 };
drivers/net/wireless/rt2x00/rt2500pci.c +90 -75

236 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2500usb.c +102 -77

266 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00.h +11 -26
index 2609d4a..5f05c7e 100644
@@ -294,9 +294,6 @@ struct interface {
 
 	/*
 	 * Current working type (IEEE80211_IF_TYPE_*).
-	 * This excludes the type IEEE80211_IF_TYPE_MNTR
-	 * since that is counted seperately in the monitor_count
-	 * field.
 	 * When set to INVALID_INTERFACE, no interface is configured.
 	 */
 	int type;
@@ -314,18 +311,8 @@ struct interface {
 
 	/*
 	 * Store the packet filter mode for the current interface.
-	 * monitor mode always disabled filtering. But in such
-	 * cases we still need to store the value here in case
-	 * the monitor mode interfaces are removed, while a
-	 * non-monitor mode interface remains.
 	 */
-	unsigned short filter;
-
-	/*
-	 * Monitor mode count, the number of interfaces
-	 * in monitor mode that that have been added.
-	 */
-	unsigned short monitor_count;
+	unsigned int filter;
 };
 
 static inline int is_interface_present(struct interface *intf)
@@ -333,9 +320,9 @@ static inline int is_interface_present(struct interface *intf)
 	return !!intf->id;
 }
 
-static inline int is_monitor_present(struct interface *intf)
+static inline int is_interface_type(struct interface *intf, int type)
 {
-	return !!intf->monitor_count;
+	return intf->type == type;
 }
 
 /*
@@ -402,7 +389,7 @@ struct rt2x00lib_ops {
 	 */
 	void (*write_tx_desc) (struct rt2x00_dev *rt2x00dev,
 			       struct data_desc *txd,
-			       struct data_entry_desc *desc,
+			       struct txdata_entry_desc *desc,
 			       struct ieee80211_hdr *ieee80211hdr,
 			       unsigned int length,
 			       struct ieee80211_tx_control *control);
@@ -415,8 +402,8 @@ struct rt2x00lib_ops {
 	/*
 	 * RX control handlers
 	 */
-	int (*fill_rxdone) (struct data_entry *entry,
-			    int *signal, int *rssi, int *ofdm, int *size);
+	void (*fill_rxdone) (struct data_entry *entry,
+			     struct rxdata_entry_desc *desc);
 
 	/*
 	 * Configuration handlers.
@@ -511,11 +498,10 @@ struct rt2x00_dev {
 #define DEVICE_INITIALIZED		3
 #define DEVICE_INITIALIZED_HW		4
 #define REQUIRE_FIRMWARE		5
-#define PACKET_FILTER_SCHEDULED		6
-#define PACKET_FILTER_PENDING		7
+/* Hole: Add new Flag here */
 #define INTERFACE_RESUME		8
 #define INTERFACE_ENABLED		9
-#define INTERFACE_ENABLED_MONITOR	10
+/* Hole: Add new Flag here */
 #define REQUIRE_BEACON_RING		11
 #define DEVICE_SUPPORT_HW_BUTTON	12
 #define CONFIG_FRAME_TYPE		13
@@ -606,9 +592,10 @@ struct rt2x00_dev {
 	struct ieee80211_rx_status rx_status;
 
 	/*
-	 * Beacon scheduled work.
+	 * Scheduled work.
 	 */
 	struct work_struct beacon_work;
+	struct work_struct filter_work;
 
 	/*
 	 * Data ring arrays for RX, TX and Beacon.
@@ -760,7 +747,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_txdone(struct data_entry *entry,
 		      const int status, const int retry);
 void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb,
-		      const int signal, const int rssi, const int ofdm);
+		      struct rxdata_entry_desc *desc);
 
 /*
  * TX descriptor initializer
@@ -785,8 +772,6 @@ void rt2x00mac_remove_interface(struct ieee80211_hw *hw,
 int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
 int rt2x00mac_config_interface(struct ieee80211_hw *hw, int if_id,
 			       struct ieee80211_if_conf *conf);
-void rt2x00mac_set_multicast_list(struct ieee80211_hw *hw,
-				  unsigned short flags, int mc_count);
 int rt2x00mac_get_stats(struct ieee80211_hw *hw,
 			struct ieee80211_low_level_stats *stats);
 int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw,
drivers/net/wireless/rt2x00/rt2x00config.c +6 -54

78 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00dev.c +24 -9
index 5780d6a..4f66adc 100644
@@ -135,10 +135,12 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
 		return;
 
 	/*
-	 * Stop beacon generation.
+	 * Stop all scheduled work.
 	 */
 	if (work_pending(&rt2x00dev->beacon_work))
 		cancel_work_sync(&rt2x00dev->beacon_work);
+	if (work_pending(&rt2x00dev->filter_work))
+		cancel_work_sync(&rt2x00dev->filter_work);
 
 	/*
 	 * Stop the TX queues.
@@ -261,6 +263,17 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 			   LINK_TUNE_INTERVAL);
 }
 
+static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
+{
+	struct rt2x00_dev *rt2x00dev =
+	    container_of(work, struct rt2x00_dev, filter_work);
+
+	rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
+					     rt2x00dev->interface.filter,
+					     &rt2x00dev->interface.filter,
+					     0, NULL);
+}
+
 /*
  * Interrupt context handlers.
  */
@@ -341,7 +354,7 @@ void rt2x00lib_txdone(struct data_entry *entry,
 EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
 
 void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb,
-		      const int signal, const int rssi, const int ofdm)
+		      struct rxdata_entry_desc *desc)
 {
 	struct rt2x00_dev *rt2x00dev = entry->ring->rt2x00dev;
 	struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
@@ -362,22 +375,24 @@ void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb,
 		 * the signal is the PLCP value. If it was received with
 		 * a CCK bitrate the signal is the rate in 0.5kbit/s.
 		 */
-		if (!ofdm)
+		if (!desc->ofdm)
 			val = DEVICE_GET_RATE_FIELD(rate->val, RATE);
 		else
 			val = DEVICE_GET_RATE_FIELD(rate->val, PLCP);
 
-		if (val == signal) {
+		if (val == desc->signal) {
 			val = rate->val;
 			break;
 		}
 	}
 
-	rt2x00_update_link_rssi(&rt2x00dev->link, rssi);
+	rt2x00_update_link_rssi(&rt2x00dev->link, desc->rssi);
 	rt2x00dev->link.rx_success++;
 	rx_status->rate = val;
-	rx_status->signal = rt2x00lib_calculate_link_signal(rt2x00dev, rssi);
-	rx_status->ssi = rssi;
+	rx_status->signal =
+	    rt2x00lib_calculate_link_signal(rt2x00dev, desc->rssi);
+	rx_status->ssi = desc->rssi;
+	rx_status->flag = desc->flags;
 
 	/*
 	 * Send frame to mac80211
@@ -395,7 +410,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 			     unsigned int length,
 			     struct ieee80211_tx_control *control)
 {
-	struct data_entry_desc desc;
+	struct txdata_entry_desc desc;
 	struct data_ring *ring;
 	int tx_rate;
 	int bitrate;
@@ -960,6 +975,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	 * Initialize configuration work.
 	 */
 	INIT_WORK(&rt2x00dev->beacon_work, rt2x00lib_beacondone_scheduled);
+	INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);
 	INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner);
 
 	/*
@@ -1102,7 +1118,6 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
 	rt2x00lib_config_mac_addr(rt2x00dev, intf->mac);
 	rt2x00lib_config_bssid(rt2x00dev, intf->bssid);
 	rt2x00lib_config_type(rt2x00dev, intf->type);
-	rt2x00lib_config_packet_filter(rt2x00dev, intf->filter);
 
 	/*
 	 * When in Master or Ad-hoc mode,
drivers/net/wireless/rt2x00/rt2x00lib.h +0 -1
index 3324090..fcc2ffd 100644
@@ -51,7 +51,6 @@ void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev);
  */
 void rt2x00lib_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *mac);
 void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid);
-void rt2x00lib_config_packet_filter(struct rt2x00_dev *rt2x00dev, int filter);
 void rt2x00lib_config_type(struct rt2x00_dev *rt2x00dev, int type);
 void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf);
 
drivers/net/wireless/rt2x00/rt2x00mac.c +14 -90

157 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00pci.c +12 -19
index 85629f1..2780df0 100644
@@ -124,47 +124,40 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
 	struct data_entry *entry;
 	struct data_desc *rxd;
 	struct sk_buff *skb;
-	u32 desc;
-	int retval;
-	int signal;
-	int rssi;
-	int ofdm;
-	int size;
+	struct rxdata_entry_desc desc;
+	u32 word;
 
 	while (1) {
 		entry = rt2x00_get_data_entry(ring);
 		rxd = entry->priv;
-		rt2x00_desc_read(rxd, 0, &desc);
+		rt2x00_desc_read(rxd, 0, &word);
 
-		if (rt2x00_get_field32(desc, RXD_ENTRY_OWNER_NIC))
+		if (rt2x00_get_field32(word, RXD_ENTRY_OWNER_NIC))
 			break;
 
-		retval = rt2x00dev->ops->lib->fill_rxdone(entry, &signal,
-							  &rssi, &ofdm, &size);
-		if (retval)
-			goto skip_entry;
+		memset(&desc, 0x00, sizeof(desc));
+		rt2x00dev->ops->lib->fill_rxdone(entry, &desc);
 
 		/*
 		 * Allocate the sk_buffer, initialize it and copy
 		 * all data into it.
 		 */
-		skb = dev_alloc_skb(size + NET_IP_ALIGN);
+		skb = dev_alloc_skb(desc.size + NET_IP_ALIGN);
 		if (!skb)
 			return;
 
 		skb_reserve(skb, NET_IP_ALIGN);
-		skb_put(skb, size);
-		memcpy(skb->data, entry->data_addr, size);
+		skb_put(skb, desc.size);
+		memcpy(skb->data, entry->data_addr, desc.size);
 
 		/*
 		 * Send the frame to rt2x00lib for further processing.
 		 */
-		rt2x00lib_rxdone(entry, skb, signal, rssi, ofdm);
+		rt2x00lib_rxdone(entry, skb, &desc);
 
-skip_entry:
 		if (test_bit(DEVICE_ENABLED_RADIO, &ring->rt2x00dev->flags)) {
-			rt2x00_set_field32(&desc, RXD_ENTRY_OWNER_NIC, 1);
-			rt2x00_desc_write(rxd, 0, desc);
+			rt2x00_set_field32(&word, RXD_ENTRY_OWNER_NIC, 1);
+			rt2x00_desc_write(rxd, 0, word);
 		}
 
 		rt2x00_ring_index_inc(ring);
drivers/net/wireless/rt2x00/rt2x00rfkill.c +2 -4
index dc5b696..b54457c 100644
@@ -45,11 +45,9 @@ static int rt2x00rfkill_toggle_radio(void *data, enum rfkill_state state)
 		return 0;
 
 	/*
-	 * Only continue if we have an active interface,
-	 * either monitor or non-monitor should be present.
+	 * Only continue if we have an active interface.
 	 */
-	if (!is_interface_present(&rt2x00dev->interface) &&
-	    !is_monitor_present(&rt2x00dev->interface))
+	if (!is_interface_present(&rt2x00dev->interface))
 		return 0;
 
 	if (state == RFKILL_STATE_ON) {
drivers/net/wireless/rt2x00/rt2x00ring.h +15 -2
index 122c752..1a864d3 100644
@@ -41,11 +41,24 @@ struct data_desc {
 };
 
 /*
- * data_entry_desc
+ * rxdata_entry_desc
+ * Summary of information that has been read from the
+ * RX frame descriptor.
+ */
+struct rxdata_entry_desc {
+	int signal;
+	int rssi;
+	int ofdm;
+	int size;
+	int flags;
+};
+
+/*
+ * txdata_entry_desc
  * Summary of information that should be written into the
  * descriptor for sending a TX frame.
  */
-struct data_entry_desc {
+struct txdata_entry_desc {
 	unsigned long flags;
 #define ENTRY_TXDONE		1
 #define ENTRY_TXD_RTS_FRAME	2
drivers/net/wireless/rt2x00/rt2x00usb.c +5 -11
index 248144f..66e4761 100644
@@ -218,11 +218,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
 	struct data_ring *ring = entry->ring;
 	struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
 	struct sk_buff *skb;
-	int retval;
-	int signal;
-	int rssi;
-	int ofdm;
-	int size;
+	struct rxdata_entry_desc desc;
 	int frame_size;
 
 	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
@@ -237,10 +233,8 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
 	if (urb->actual_length < entry->ring->desc_size || urb->status)
 		goto skip_entry;
 
-	retval = rt2x00dev->ops->lib->fill_rxdone(entry, &signal, &rssi,
-						  &ofdm, &size);
-	if (retval)
-		goto skip_entry;
+	memset(&desc, 0x00, sizeof(desc));
+	rt2x00dev->ops->lib->fill_rxdone(entry, &desc);
 
 	/*
 	 * Allocate a new sk buffer to replace the current one.
@@ -259,12 +253,12 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
 	 * Trim the skb_buffer to only contain the valid
 	 * frame data (so ignore the device's descriptor).
 	 */
-	skb_trim(entry->skb, size);
+	skb_trim(entry->skb, desc.size);
 
 	/*
 	 * Send the frame to rt2x00lib for further processing.
 	 */
-	rt2x00lib_rxdone(entry, entry->skb, signal, rssi, ofdm);
+	rt2x00lib_rxdone(entry, entry->skb, &desc);
 
 	/*
 	 * Replace current entry's skb with the newly allocated one,
drivers/net/wireless/rt2x00/rt61pci.c +90 -74

236 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt73usb.c +99 -76

261 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt73usb.h +1 -1
index 5d63a1a..f095151 100644
@@ -290,7 +290,7 @@ struct hw_pairwise_ta_entry {
 #define TXRX_CSR0_DROP_TO_DS		FIELD32(0x00200000)
 #define TXRX_CSR0_DROP_VERSION_ERROR	FIELD32(0x00400000)
 #define TXRX_CSR0_DROP_MULTICAST	FIELD32(0x00800000)
-#define TXRX_CSR0_DROP_BORADCAST	FIELD32(0x01000000)
+#define TXRX_CSR0_DROP_BROADCAST	FIELD32(0x01000000)
 #define TXRX_CSR0_DROP_ACK_CTS		FIELD32(0x02000000)
 #define TXRX_CSR0_TX_WITHOUT_WAITING	FIELD32(0x04000000)
 
Signature · 1 line
1.5.3.2
#6 lore raw

PATCH 6/12 rt2x00: Reorganize rt2x00dev->flags

In reply to Ivo van Doorn

The rt2x00dev->flags has become a chaos over time, this will reorganize the flags by renaming, deleting, adding and properly implement the flags.

---
 drivers/net/wireless/rt2x00/rt2400pci.c    |    4 +-
 drivers/net/wireless/rt2x00/rt2500pci.c    |    4 +-
 drivers/net/wireless/rt2x00/rt2500usb.c    |    2 +-
 drivers/net/wireless/rt2x00/rt2x00.h       |   31 +++++++---------
 drivers/net/wireless/rt2x00/rt2x00config.c |   27 ++++----------
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   55 ++++++++++++++++++++--------
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    3 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   55 +++++++++++++++++++---------
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |   12 +++---
 drivers/net/wireless/rt2x00/rt61pci.c      |    4 +-
 drivers/net/wireless/rt2x00/rt73usb.c      |    2 +-
 11 files changed, 115 insertions(+), 84 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +2 -2
index 03a94a3..faa4711 100644
@@ -1374,7 +1374,7 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * Detect if this device has an hardware controlled radio.
 	 */
 	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
-		__set_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
+		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
 
 	/*
 	 * Check if the BBP tuning should be enabled.
@@ -1469,7 +1469,7 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * This device requires the beacon ring
 	 */
-	__set_bit(REQUIRE_BEACON_RING, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_BEACON_RING, &rt2x00dev->flags);
 
 	/*
 	 * Set the rssi offset.
drivers/net/wireless/rt2x00/rt2500pci.c +2 -2
index 892baa9..929257d 100644
@@ -1545,7 +1545,7 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * Detect if this device has an hardware controlled radio.
 	 */
 	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
-		__set_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
+		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
 
 	/*
 	 * Check if the BBP tuning should be enabled.
@@ -1801,7 +1801,7 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * This device requires the beacon ring
 	 */
-	__set_bit(REQUIRE_BEACON_RING, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_BEACON_RING, &rt2x00dev->flags);
 
 	/*
 	 * Set the rssi offset.
drivers/net/wireless/rt2x00/rt2500usb.c +1 -1
index f4e6f6e..7aacc7b 100644
@@ -1573,7 +1573,7 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * This device requires the beacon ring
 	 */
-	__set_bit(REQUIRE_BEACON_RING, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_BEACON_RING, &rt2x00dev->flags);
 
 	/*
 	 * Set the rssi offset.
drivers/net/wireless/rt2x00/rt2x00.h +14 -17
index 5f05c7e..ea20f3a 100644
@@ -493,24 +493,21 @@ struct rt2x00_dev {
 	 * of the device capabilities are stored.
 	 */
 	unsigned long flags;
-#define DEVICE_ENABLED_RADIO		1
-#define DEVICE_ENABLED_RADIO_HW		2
+#define DEVICE_PRESENT			1
+#define DEVICE_REGISTERED_HW		2
 #define DEVICE_INITIALIZED		3
-#define DEVICE_INITIALIZED_HW		4
-#define REQUIRE_FIRMWARE		5
-/* Hole: Add new Flag here */
-#define INTERFACE_RESUME		8
-#define INTERFACE_ENABLED		9
-/* Hole: Add new Flag here */
-#define REQUIRE_BEACON_RING		11
-#define DEVICE_SUPPORT_HW_BUTTON	12
-#define CONFIG_FRAME_TYPE		13
-#define CONFIG_RF_SEQUENCE		14
-/* Hole: Add new Flag here */
-#define CONFIG_EXTERNAL_LNA_A		16
-#define CONFIG_EXTERNAL_LNA_BG		17
-#define CONFIG_DOUBLE_ANTENNA		18
-#define CONFIG_DISABLE_LINK_TUNING	19
+#define DEVICE_STARTED			4
+#define DEVICE_ENABLED_RADIO		5
+#define DEVICE_ENABLED_RADIO_HW		6
+#define DRIVER_REQUIRE_FIRMWARE		7
+#define DRIVER_REQUIRE_BEACON_RING	8
+#define CONFIG_SUPPORT_HW_BUTTON	9
+#define CONFIG_FRAME_TYPE		10
+#define CONFIG_RF_SEQUENCE		11
+#define CONFIG_EXTERNAL_LNA_A		12
+#define CONFIG_EXTERNAL_LNA_BG		13
+#define CONFIG_DOUBLE_ANTENNA		14
+#define CONFIG_DISABLE_LINK_TUNING	15
 
 	/*
 	 * Chipset identification.
drivers/net/wireless/rt2x00/rt2x00config.c +7 -20
index f962ce4..13b5106 100644
@@ -48,33 +48,20 @@ void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 
 void rt2x00lib_config_type(struct rt2x00_dev *rt2x00dev, int type)
 {
-	struct interface *intf = &rt2x00dev->interface;
-
-	if (!test_bit(INTERFACE_RESUME, &rt2x00dev->flags) &&
-	    (!!test_bit(INTERFACE_ENABLED, &rt2x00dev->flags) ==
-	     !!is_interface_present(intf)))
-		return;
-
-	rt2x00dev->ops->lib->config_type(rt2x00dev, type);
-
-	/*
-	 * Update the configuration flags.
-	 */
-	if (is_interface_present(intf))
-		__set_bit(INTERFACE_ENABLED, &rt2x00dev->flags);
-	else
-		__clear_bit(INTERFACE_ENABLED, &rt2x00dev->flags);
+	if (type != INVALID_INTERFACE)
+		rt2x00dev->ops->lib->config_type(rt2x00dev, type);
 }
 
-void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf)
+void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
+		      struct ieee80211_conf *conf, const int force_config)
 {
 	int flags = 0;
 
 	/*
-	 * If we are in RESUME state we should
-	 * force all configuration options.
+	 * In some situations we want to force all configurations
+	 * to be reloaded (When resuming for instance).
 	 */
-	if (test_bit(INTERFACE_RESUME, &rt2x00dev->flags)) {
+	if (force_config) {
 		flags = CONFIG_UPDATE_ALL;
 		goto config;
 	}
drivers/net/wireless/rt2x00/rt2x00dev.c +40 -15

163 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00lib.h +2 -1
index fcc2ffd..6dd92eb 100644
@@ -52,7 +52,8 @@ void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *mac);
 void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid);
 void rt2x00lib_config_type(struct rt2x00_dev *rt2x00dev, int type);
-void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf);
+void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
+		      struct ieee80211_conf *conf, const int force_config);
 
 /*
  * Firmware handlers.
drivers/net/wireless/rt2x00/rt2x00mac.c +38 -17

124 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00rfkill.c +6 -6
index b54457c..06af014 100644
@@ -45,9 +45,9 @@ static int rt2x00rfkill_toggle_radio(void *data, enum rfkill_state state)
 		return 0;
 
 	/*
-	 * Only continue if we have an active interface.
+	 * Only continue if there are enabled interfaces.
 	 */
-	if (!is_interface_present(&rt2x00dev->interface))
+	if (!test_bit(DEVICE_STARTED, &rt2x00dev->flags))
 		return 0;
 
 	if (state == RFKILL_STATE_ON) {
@@ -76,7 +76,7 @@ int rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev)
 {
 	int retval;
 
-	if (!test_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
+	if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
 		return 0;
 
 	retval = rfkill_register(rt2x00dev->rfkill);
@@ -97,7 +97,7 @@ int rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev)
 
 void rt2x00rfkill_unregister(struct rt2x00_dev *rt2x00dev)
 {
-	if (!test_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
+	if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
 		return;
 
 	input_unregister_polled_device(rt2x00dev->poll_dev);
@@ -108,7 +108,7 @@ int rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev)
 {
 	struct device *device = wiphy_dev(rt2x00dev->hw->wiphy);
 
-	if (!test_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
+	if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
 		return 0;
 
 	rt2x00dev->rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN);
@@ -138,7 +138,7 @@ int rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev)
 
 void rt2x00rfkill_free(struct rt2x00_dev *rt2x00dev)
 {
-	if (!test_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
+	if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags))
 		return;
 
 	input_free_polled_device(rt2x00dev->poll_dev);
drivers/net/wireless/rt2x00/rt61pci.c +2 -2
index 3edcd74..4c5e317 100644
@@ -2105,7 +2105,7 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * Detect if this device has an hardware controlled radio.
 	 */
 	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
-		__set_bit(DEVICE_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
+		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
 
 	/*
 	 * Read frequency offset and RF programming sequence.
@@ -2360,7 +2360,7 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * This device requires firmware
 	 */
-	__set_bit(REQUIRE_FIRMWARE, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
 
 	/*
 	 * Set the rssi offset.
drivers/net/wireless/rt2x00/rt73usb.c +1 -1
index b18cc93..ffed3ec 100644
@@ -1827,7 +1827,7 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * This device requires firmware
 	 */
-	__set_bit(REQUIRE_FIRMWARE, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
 
 	/*
 	 * Set the rssi offset.
Signature · 1 line
1.5.3.2
#7 lore raw

PATCH 7/12 rt2x00: Add rt2x00dev->flags to debugfs

In reply to Ivo van Doorn
Quoted 1 line

From aff2d533a74a6346d704321ff87b8874353ed5fa Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Tue, 25 Sep 2007 20:13:51 +0200
Subject: [PATCH] rt2x00: Add rt2x00dev->flags to debugfs

Loosely based on the patch by Matthijs Kooijman, this will add the dev_flags entry into debugfs which will display rt2x00dev->flags.
This will allow easier debugging of flag handling.

---
 drivers/net/wireless/rt2x00/rt2x00debug.c |   37 +++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)
drivers/net/wireless/rt2x00/rt2x00debug.c +37 -0
index 4d2aaec..9275d6f 100644
@@ -57,6 +57,7 @@ struct rt2x00debug_intf {
 	 * - driver folder
 	 * - driver file
 	 * - chipset file
+	 * - device flags file
 	 * - register offset/value files
 	 * - eeprom offset/value files
 	 * - bbp offset/value files
@@ -65,6 +66,7 @@ struct rt2x00debug_intf {
 	struct dentry *driver_folder;
 	struct dentry *driver_entry;
 	struct dentry *chipset_entry;
+	struct dentry *dev_flags;
 	struct dentry *csr_off_entry;
 	struct dentry *csr_val_entry;
 	struct dentry *eeprom_off_entry;
@@ -193,6 +195,34 @@ RT2X00DEBUGFS_OPS(eeprom, "0x%.4x\n", u16);
 RT2X00DEBUGFS_OPS(bbp, "0x%.2x\n", u8);
 RT2X00DEBUGFS_OPS(rf, "0x%.8x\n", u32);
 
+static ssize_t rt2x00debug_read_dev_flags(struct file *file,
+					  char __user *buf,
+					  size_t length,
+					  loff_t *offset)
+{
+	struct rt2x00debug_intf *intf =	file->private_data;
+	char line[16];
+	size_t size;
+
+	if (*offset)
+		return 0;
+
+	size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->flags);
+
+	if (copy_to_user(buf, line, size))
+		return -EFAULT;
+
+	*offset += size;
+	return size;
+}
+
+static const struct file_operations rt2x00debug_fop_dev_flags = {
+	.owner		= THIS_MODULE,
+	.read		= rt2x00debug_read_dev_flags,
+	.open		= rt2x00debug_file_open,
+	.release	= rt2x00debug_file_release,
+};
+
 static struct dentry *rt2x00debug_create_file_driver(const char *name,
 						     struct rt2x00debug_intf
 						     *intf,
@@ -270,6 +300,12 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
 	if (IS_ERR(intf->chipset_entry))
 		goto exit;
 
+	intf->dev_flags = debugfs_create_file("dev_flags", S_IRUGO,
+					      intf->driver_folder, intf,
+					      &rt2x00debug_fop_dev_flags);
+	if (IS_ERR(intf->dev_flags))
+		goto exit;
+
 #define RT2X00DEBUGFS_CREATE_ENTRY(__intf, __name)		\
 ({								\
 	(__intf)->__name##_off_entry =				\
@@ -320,6 +356,7 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)
 	debugfs_remove(intf->eeprom_off_entry);
 	debugfs_remove(intf->csr_val_entry);
 	debugfs_remove(intf->csr_off_entry);
+	debugfs_remove(intf->dev_flags);
 	debugfs_remove(intf->chipset_entry);
 	debugfs_remove(intf->driver_entry);
 	debugfs_remove(intf->driver_folder);
Signature · 1 line
1.5.3.2
#8 lore raw

PATCH 8/12 rt2x00: make rt2x00lib_stop_link_tuner() reentrant with link_tuner work

In reply to Ivo van Doorn

Calling cancel_delayed_work_sync() unconditionally won't hurt and it will avoid race conditions when another CPU is already executing link_tuner work.

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +1 -2
index f8f7e6e..e8c91fb 100644
@@ -80,8 +80,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
 
 static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	if (delayed_work_pending(&rt2x00dev->link.work))
-		cancel_rearming_delayed_work(&rt2x00dev->link.work);
+	cancel_delayed_work_sync(&rt2x00dev->link.work);
 }
 
 void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
Signature · 1 line
1.5.3.2
#9 lore raw

PATCH 9/12 rt2x00: Stop link tuning when radio is down

In reply to Ivo van Doorn

As pointed out by Modestas Vainius the link tuner could continue working while the radio is already down. This because at the start of disable_radio the ENABLED_RADIO flag is cleared and causes the toggle_rx to skip the stop_link_tuner() call. This will add a check to the start of the link tuner which will automatically stop the link tuner when the radio is disabled.

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +7 -0
index e8c91fb..92b7252 100644
@@ -237,6 +237,13 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 	    container_of(work, struct rt2x00_dev, link.work.work);
 
 	/*
+	 * When the radio is shutting down we should
+	 * immediately cease all link tuning.
+	 */
+	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+		return;
+
+	/*
 	 * Update statistics.
 	 */
 	rt2x00dev->ops->lib->link_stats(rt2x00dev);
Signature · 1 line
1.5.3.2
#10 lore raw

PATCH 10/12 rt2x00: Fix obvious typo in comment

In reply to Ivo van Doorn
---
 drivers/net/wireless/rt2x00/rt2500pci.c |    2 +-
 drivers/net/wireless/rt2x00/rt61pci.c   |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2500pci.c +1 -1
index 929257d..842da90 100644
@@ -244,7 +244,7 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
 	rt2x00pci_register_read(rt2x00dev, GPIOCSR, &reg);
 	return rt2x00_get_field32(reg, GPIOCSR_BIT0);
 }
-#endif /* CONFIG_RT2400PCI_RFKILL */
+#endif /* CONFIG_RT2500PCI_RFKILL */
 
 /*
  * Configuration handlers.
drivers/net/wireless/rt2x00/rt61pci.c +1 -1
index 4c5e317..6aa5176 100644
@@ -269,7 +269,7 @@ static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
 	rt2x00pci_register_read(rt2x00dev, MAC_CSR13, &reg);
 	return rt2x00_get_field32(reg, MAC_CSR13_BIT5);;
 }
-#endif /* CONFIG_RT2400PCI_RFKILL */
+#endif /* CONFIG_RT61PCI_RFKILL */
 
 /*
  * Configuration handlers.
Signature · 1 line
1.5.3.2
#11 lore raw

PATCH 11/12 rt2x00: Fix panic on rmmod with rfkill enabled

In reply to Ivo van Doorn

When ieee80211_hw.config indicates that the radio is enabled and is configuring options that require the link tuner to be restarted the link tuner will cause a kernel panic when rfkill has indicated the radio was in fact disabled.

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +3 -0
index 92b7252..0216096 100644
@@ -85,6 +85,9 @@ static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev)
 
 void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
+	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+		return;
+
 	rt2x00lib_stop_link_tuner(rt2x00dev);
 	rt2x00lib_start_link_tuner(rt2x00dev);
 }
Signature · 1 line
1.5.3.2
#12 lore raw

PATCH 12/12 rt2x00: Release rt2x00 2.0.9

In reply to Ivo van Doorn

Version bump

---
 drivers/net/wireless/rt2x00/rt2x00.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2x00/rt2x00.h +1 -1
index ea20f3a..511c11c 100644
@@ -42,7 +42,7 @@
  * Module information.
  * DRV_NAME should be set within the individual module source files.
  */
-#define DRV_VERSION	"2.0.8"
+#define DRV_VERSION	"2.0.9"
 #define DRV_PROJECT	"http://rt2x00.serialmonkey.com"
 
 /*
Signature · 1 line
1.5.3.2