r32 - tarballs unstable/rt2x00/debian unstable/rt2x00/debian/patches

benh at alioth.debian.org benh at alioth.debian.org
Sun Oct 7 00:05:50 UTC 2007


Author: benh
Date: 2007-10-07 00:05:50 +0000 (Sun, 07 Oct 2007)
New Revision: 32

Added:
   tarballs/rt2x00_2.0.9.orig.tar.gz
   unstable/rt2x00/debian/patches/004_fix_filter_flags.diff
Removed:
   tarballs/rt2x00_2.0.8+git20070918.orig.tar.gz
Modified:
   unstable/rt2x00/debian/changelog
   unstable/rt2x00/debian/patches/003_workaround_mac80211_changes.diff
   unstable/rt2x00/debian/patches/series
Log:
Pulled a new version from git.
Updated version compatibility workarounds.
Added fix for some bugs in filter changes.


Deleted: tarballs/rt2x00_2.0.8+git20070918.orig.tar.gz
===================================================================
(Binary files differ)

Added: tarballs/rt2x00_2.0.9.orig.tar.gz
===================================================================
(Binary files differ)


Property changes on: tarballs/rt2x00_2.0.9.orig.tar.gz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: unstable/rt2x00/debian/changelog
===================================================================
--- unstable/rt2x00/debian/changelog	2007-10-06 23:39:31 UTC (rev 31)
+++ unstable/rt2x00/debian/changelog	2007-10-07 00:05:50 UTC (rev 32)
@@ -1,3 +1,9 @@
+rt2x00 (2.0.9-1) unstable; urgency=low
+
+  * New version from git
+
+ -- Ben Hutchings <ben at decadent.org.uk>  Sun,  7 Oct 2007 01:01:44 +0100
+
 rt2x00 (2.0.8+git20070918-2) unstable; urgency=low
 
   * Fixed unversioned import of symbols from eeprom_93cx6 in PCI drivers

Modified: unstable/rt2x00/debian/patches/003_workaround_mac80211_changes.diff
===================================================================
--- unstable/rt2x00/debian/patches/003_workaround_mac80211_changes.diff	2007-10-06 23:39:31 UTC (rev 31)
+++ unstable/rt2x00/debian/patches/003_workaround_mac80211_changes.diff	2007-10-07 00:05:50 UTC (rev 32)
@@ -1,9 +1,19 @@
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00.h
 +++ rt2x00/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -806,4 +807,30 @@
- int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev);
- #endif /* CONFIG_PM */
+@@ -31,6 +31,7 @@
+ #include <linux/skbuff.h>
+ #include <linux/workqueue.h>
+ #include <linux/firmware.h>
++#include <linux/version.h>
  
+ #include <net/mac80211.h>
+ 
+@@ -40,6 +41,76 @@
+ 
+ #include "config.h"
+ 
++/* Version compatibility workarounds */
++
 +#ifndef IEEE80211_TXCTL_LONG_RETRY_LIMIT
 +#define IEEE80211_TXCTL_LONG_RETRY_LIMIT 0
 +/* These were changed around the same time as
@@ -30,66 +40,649 @@
 +#define IEEE80211_HW_NO_TKIP_WMM_HWACCEL 0
 +#endif
 +
- #endif /* RT2X00_H */
++/* The filter interface has been changed in wireless-dev */
++#ifdef IEEE80211_HW_MONITOR_DURING_OPER
++#define RT2X00_ADAPT_OLD_FILTER_API
++enum ieee80211_filter_flags {
++	FIF_PROMISC_IN_BSS      = 1<<0,
++	FIF_ALLMULTI            = 1<<1,
++	FIF_FCSFAIL             = 1<<2,
++	FIF_PLCPFAIL            = 1<<3,
++	FIF_BCN_PRBRESP_PROMISC = 1<<4,
++	FIF_CONTROL             = 1<<5,
++	FIF_OTHER_BSS           = 1<<6,
++};
++enum {
++	RX_FLAG_FAILED_FCS_CRC  = 0,
++	RX_FLAG_FAILED_PLCP_CRC = 0,
++};
++struct dev_addr_list;
++#else
++#define IEEE80211_HW_MONITOR_DURING_OPER 0
++#define IEEE80211_HW_NO_PROBE_FILTERING 0
++#endif
++
++#ifndef DECLARE_MAC_BUF
++#define DECLARE_MAC_BUF(var) char var[18] __maybe_unused
++static inline
++char *print_mac(char *buf, const u8 *addr)
++{
++	sprintf(buf, MAC_FMT,
++		addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
++	return buf;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
++static inline
++void cancel_delayed_work_sync(struct delayed_work *work)
++{
++	if (cancel_delayed_work(work))
++		cancel_work_sync(&work->work);
++}
++#endif
++
+ /*
+  * Module information.
+  * DRV_NAME should be set within the individual module source files.
+@@ -315,6 +386,19 @@
+ 	 * Store the packet filter mode for the current interface.
+ 	 */
+ 	unsigned int filter;
++
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	/*
++	 * Monitor mode count, the number of interfaces
++	 * in monitor mode that that have been added.
++	 */
++	unsigned short monitor_count;
++
++	/*
++	 * Interface filter passed to config_packet_filter.
++	 */
++	unsigned int iff_filter;
++#endif
+ };
+ 
+ /* Magic filter for configure_filter to apply existing filter */
+@@ -332,6 +416,13 @@
+ 	return intf->type == type;
+ }
+ 
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++static inline int is_monitor_present(struct interface *intf)
++{
++	return !!intf->monitor_count;
++}
++#endif
++
+ /*
+  * Details about the supported modes, rates and channels
+  * of a particular chipset. This is used by rt2x00lib
+@@ -417,8 +508,12 @@
+ 	 */
+ 	void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, u8 *mac);
+ 	void (*config_bssid) (struct rt2x00_dev *rt2x00dev, u8 *bssid);
+-	void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
+-				      const unsigned int filter);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	void (*configure_filter) (struct ieee80211_hw *hw,
++				  unsigned int changed_flags,
++				  unsigned int *total_flags,
++				  int mc_count, struct dev_addr_list *mc_list);
++#endif
+ 	void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
+ 	void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
+ 			struct ieee80211_conf *conf);
+@@ -768,7 +863,11 @@
+ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
+ 		 struct ieee80211_tx_control *control);
+ int rt2x00mac_start(struct ieee80211_hw *hw);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++int rt2x00mac_stop(struct ieee80211_hw *hw);
++#else
+ void rt2x00mac_stop(struct ieee80211_hw *hw);
++#endif
+ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
+ 			    struct ieee80211_if_init_conf *conf);
+ void rt2x00mac_remove_interface(struct ieee80211_hw *hw,
+@@ -776,6 +875,10 @@
+ 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);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++void rt2x00mac_set_multicast_list(struct ieee80211_hw *hw,
++				  unsigned short flags, int mc_count);
++#endif
+ int rt2x00mac_get_stats(struct ieee80211_hw *hw,
+ 			struct ieee80211_low_level_stats *stats);
+ int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw,
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt2400pci.c
 +++ rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c
-@@ -1459,6 +1459,10 @@
+@@ -296,8 +296,13 @@
+ 	 * Enable synchronisation.
+ 	 */
+ 	rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
+-	rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
+-	rt2x00_set_field32(&reg, CSR14_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	if (is_interface_present(&rt2x00dev->interface))
++#endif
++	{
++		rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
++		rt2x00_set_field32(&reg, CSR14_TBCN, 1);
++	}
+ 	rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
+ 	if (is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
+ 	    is_interface_type(intf, IEEE80211_IF_TYPE_AP))
+@@ -1415,7 +1420,14 @@
+ 	/*
  	 * Initialize all hw fields.
  	 */
- 	rt2x00dev->hw->flags =
+-	rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
++	rt2x00dev->hw->flags =
 +	    IEEE80211_HW_HOST_GEN_BEACON |
++	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
 +	    IEEE80211_HW_WEP_INCLUDE_IV |
 +	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 +	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
- 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
- 	    IEEE80211_HW_MONITOR_DURING_OPER |
- 	    IEEE80211_HW_NO_PROBE_FILTERING;
++	    IEEE80211_HW_MONITOR_DURING_OPER |
++	    IEEE80211_HW_NO_PROBE_FILTERING;
+ 	rt2x00dev->hw->extra_tx_headroom = 0;
+ 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
+ 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
+@@ -1616,13 +1628,19 @@
+ 
+ static const struct ieee80211_ops rt2400pci_mac80211_ops = {
+ 	.tx			= rt2x00mac_tx,
++#ifndef RT2X00_ADAPT_OLD_FILTER_API
+ 	.start			= rt2x00mac_start,
++#endif
+ 	.stop			= rt2x00mac_stop,
+ 	.add_interface		= rt2x00mac_add_interface,
+ 	.remove_interface	= rt2x00mac_remove_interface,
+ 	.config			= rt2x00mac_config,
+ 	.config_interface	= rt2x00mac_config_interface,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.set_multicast_list	= rt2x00mac_set_multicast_list,
++#else
+ 	.configure_filter	= rt2400pci_configure_filter,
++#endif
+ 	.get_stats		= rt2x00mac_get_stats,
+ 	.set_retry_limit	= rt2400pci_set_retry_limit,
+ 	.conf_tx		= rt2400pci_conf_tx,
+@@ -1651,6 +1669,9 @@
+ 	.fill_rxdone		= rt2400pci_fill_rxdone,
+ 	.config_mac_addr	= rt2400pci_config_mac_addr,
+ 	.config_bssid		= rt2400pci_config_bssid,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.configure_filter	= rt2400pci_configure_filter,
++#endif
+ 	.config_type		= rt2400pci_config_type,
+ 	.config			= rt2400pci_config,
+ };
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt2500pci.c
 +++ rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c
-@@ -1777,6 +1777,10 @@
+@@ -300,8 +300,13 @@
+ 	 * Enable synchronisation.
+ 	 */
+ 	rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
+-	rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
+-	rt2x00_set_field32(&reg, CSR14_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	if (is_interface_present(&rt2x00dev->interface))
++#endif
++	{
++		rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
++		rt2x00_set_field32(&reg, CSR14_TBCN, 1);
++	}
+ 	rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
+ 	if (is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
+ 	    is_interface_type(intf, IEEE80211_IF_TYPE_AP))
+@@ -1729,7 +1734,14 @@
+ 	/*
  	 * Initialize all hw fields.
  	 */
- 	rt2x00dev->hw->flags =
+-	rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
++	rt2x00dev->hw->flags =
 +	    IEEE80211_HW_HOST_GEN_BEACON |
++	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
 +	    IEEE80211_HW_WEP_INCLUDE_IV |
 +	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 +	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
- 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
- 	    IEEE80211_HW_MONITOR_DURING_OPER |
- 	    IEEE80211_HW_NO_PROBE_FILTERING;
++	    IEEE80211_HW_MONITOR_DURING_OPER |
++	    IEEE80211_HW_NO_PROBE_FILTERING;
+ 	rt2x00dev->hw->extra_tx_headroom = 0;
+ 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
+ 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
+@@ -1928,13 +1940,19 @@
+ 
+ static const struct ieee80211_ops rt2500pci_mac80211_ops = {
+ 	.tx			= rt2x00mac_tx,
++#ifndef RT2X00_ADAPT_OLD_FILTER_API
+ 	.start			= rt2x00mac_start,
++#endif
+ 	.stop			= rt2x00mac_stop,
+ 	.add_interface		= rt2x00mac_add_interface,
+ 	.remove_interface	= rt2x00mac_remove_interface,
+ 	.config			= rt2x00mac_config,
+ 	.config_interface	= rt2x00mac_config_interface,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.set_multicast_list	= rt2x00mac_set_multicast_list,
++#else
+ 	.configure_filter	= rt2500pci_configure_filter,
++#endif
+ 	.get_stats		= rt2x00mac_get_stats,
+ 	.set_retry_limit	= rt2500pci_set_retry_limit,
+ 	.conf_tx		= rt2x00mac_conf_tx,
+@@ -1963,6 +1981,9 @@
+ 	.fill_rxdone		= rt2500pci_fill_rxdone,
+ 	.config_mac_addr	= rt2500pci_config_mac_addr,
+ 	.config_bssid		= rt2500pci_config_bssid,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.configure_filter	= rt2500pci_configure_filter,
++#endif
+ 	.config_type		= rt2500pci_config_type,
+ 	.config			= rt2500pci_config,
+ };
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt2500usb.c
 +++ rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c
-@@ -1545,6 +1545,9 @@
- 	 * Initialize all hw fields.
- 	 */
+@@ -309,8 +309,13 @@
+ 	rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
+ 
+ 	rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
+-	rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
+-	rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	if (is_interface_present(&rt2x00dev->interface))
++#endif
++	{
++	       rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
++	       rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
++	}
+ 	rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
+ 	if (is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
+ 	    is_interface_type(intf, IEEE80211_IF_TYPE_AP))
+@@ -1501,7 +1506,12 @@
  	rt2x00dev->hw->flags =
+ 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
+ 	    IEEE80211_HW_RX_INCLUDES_FCS |
+-	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
++	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
 +	    IEEE80211_HW_WEP_INCLUDE_IV |
 +	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 +	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
- 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
- 	    IEEE80211_HW_RX_INCLUDES_FCS |
- 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
++ 	    IEEE80211_HW_MONITOR_DURING_OPER |
++ 	    IEEE80211_HW_NO_PROBE_FILTERING;
+ 	rt2x00dev->hw->extra_tx_headroom = TXD_DESC_SIZE;
+ 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
+ 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
+@@ -1746,13 +1756,19 @@
+ 
+ static const struct ieee80211_ops rt2500usb_mac80211_ops = {
+ 	.tx			= rt2x00mac_tx,
++#ifndef RT2X00_ADAPT_OLD_FILTER_API
+ 	.start			= rt2x00mac_start,
++#endif
+ 	.stop			= rt2x00mac_stop,
+ 	.add_interface		= rt2x00mac_add_interface,
+ 	.remove_interface	= rt2x00mac_remove_interface,
+ 	.config			= rt2x00mac_config,
+ 	.config_interface	= rt2x00mac_config_interface,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.set_multicast_list	= rt2x00mac_set_multicast_list,
++#else
+ 	.configure_filter	= rt2500usb_configure_filter,
++#endif
+ 	.get_stats		= rt2x00mac_get_stats,
+ 	.conf_tx		= rt2x00mac_conf_tx,
+ 	.get_tx_stats		= rt2x00mac_get_tx_stats,
+@@ -1773,6 +1789,9 @@
+ 	.fill_rxdone		= rt2500usb_fill_rxdone,
+ 	.config_mac_addr	= rt2500usb_config_mac_addr,
+ 	.config_bssid		= rt2500usb_config_bssid,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.configure_filter	= rt2500usb_configure_filter,
++#endif
+ 	.config_type		= rt2500usb_config_type,
+ 	.config			= rt2500usb_config,
+ };
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt61pci.c
 +++ rt2x00/drivers/net/wireless/rt2x00/rt61pci.c
-@@ -2337,6 +2337,9 @@
- 	 * Initialize all hw fields.
+@@ -2289,7 +2289,12 @@
  	 */
  	rt2x00dev->hw->flags =
+ 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
+-	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
++	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
 +	    IEEE80211_HW_WEP_INCLUDE_IV |
 +	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 +	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
- 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
- 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
- 	    IEEE80211_HW_MONITOR_DURING_OPER |
++ 	    IEEE80211_HW_MONITOR_DURING_OPER |
++ 	    IEEE80211_HW_NO_PROBE_FILTERING;
+ 	rt2x00dev->hw->extra_tx_headroom = 0;
+ 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
+ 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
+@@ -2521,13 +2526,19 @@
+ 
+ static const struct ieee80211_ops rt61pci_mac80211_ops = {
+ 	.tx			= rt2x00mac_tx,
++#ifndef RT2X00_ADAPT_OLD_FILTER_API
+ 	.start			= rt2x00mac_start,
++#endif
+ 	.stop			= rt2x00mac_stop,
+ 	.add_interface		= rt2x00mac_add_interface,
+ 	.remove_interface	= rt2x00mac_remove_interface,
+ 	.config			= rt2x00mac_config,
+ 	.config_interface	= rt2x00mac_config_interface,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.set_multicast_list	= rt2x00mac_set_multicast_list,
++#else
+ 	.configure_filter	= rt61pci_configure_filter,
++#endif
+ 	.get_stats		= rt2x00mac_get_stats,
+ 	.set_retry_limit	= rt61pci_set_retry_limit,
+ 	.conf_tx		= rt2x00mac_conf_tx,
+@@ -2557,6 +2568,9 @@
+ 	.fill_rxdone		= rt61pci_fill_rxdone,
+ 	.config_mac_addr	= rt61pci_config_mac_addr,
+ 	.config_bssid		= rt61pci_config_bssid,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.configure_filter	= rt61pci_configure_filter,
++#endif
+ 	.config_type		= rt61pci_config_type,
+ 	.config			= rt61pci_config,
+ };
 --- rt2x00.orig/drivers/net/wireless/rt2x00/rt73usb.c
 +++ rt2x00/drivers/net/wireless/rt2x00/rt73usb.c
-@@ -1799,6 +1799,9 @@
- 	 * Initialize all hw fields.
+@@ -314,8 +314,13 @@
+ 	 * Enable synchronisation.
  	 */
+ 	rt73usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
+-	rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 1);
+-	rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	if (is_interface_present(&rt2x00dev->interface))
++#endif
++	{
++	    rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 1);
++	    rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 1);
++	}
+ 	rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
+ 	if (is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
+ 	    is_interface_type(intf, IEEE80211_IF_TYPE_AP))
+@@ -1751,7 +1756,12 @@
+ 	 */
  	rt2x00dev->hw->flags =
+ 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
+-	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
++	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
 +	    IEEE80211_HW_WEP_INCLUDE_IV |
 +	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 +	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
- 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
- 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
- 	    IEEE80211_HW_MONITOR_DURING_OPER |
++ 	    IEEE80211_HW_MONITOR_DURING_OPER |
++ 	    IEEE80211_HW_NO_PROBE_FILTERING;
+ 	rt2x00dev->hw->extra_tx_headroom = TXD_DESC_SIZE;
+ 	rt2x00dev->hw->max_signal = MAX_SIGNAL;
+ 	rt2x00dev->hw->max_rssi = MAX_RX_SSI;
+@@ -2007,13 +2017,19 @@
+ 
+ static const struct ieee80211_ops rt73usb_mac80211_ops = {
+ 	.tx			= rt2x00mac_tx,
++#ifndef RT2X00_ADAPT_OLD_FILTER_API
+ 	.start			= rt2x00mac_start,
++#endif
+ 	.stop			= rt2x00mac_stop,
+ 	.add_interface		= rt2x00mac_add_interface,
+ 	.remove_interface	= rt2x00mac_remove_interface,
+ 	.config			= rt2x00mac_config,
+ 	.config_interface	= rt2x00mac_config_interface,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.set_multicast_list	= rt2x00mac_set_multicast_list,
++#else
+ 	.configure_filter	= rt73usb_configure_filter,
++#endif
+ 	.get_stats		= rt2x00mac_get_stats,
+ 	.set_retry_limit	= rt73usb_set_retry_limit,
+ 	.conf_tx		= rt2x00mac_conf_tx,
+@@ -2044,6 +2060,9 @@
+ 	.fill_rxdone		= rt73usb_fill_rxdone,
+ 	.config_mac_addr	= rt73usb_config_mac_addr,
+ 	.config_bssid		= rt73usb_config_bssid,
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	.configure_filter	= rt73usb_configure_filter,
++#endif
+ 	.config_type		= rt73usb_config_type,
+ 	.config			= rt73usb_config,
+ };
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00config.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2x00config.c
+@@ -50,6 +50,11 @@
+ {
+ 	if (type != INVALID_INTERFACE)
+ 		rt2x00dev->ops->lib->config_type(rt2x00dev, type);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	else if (is_monitor_present(&rt2x00dev->interface))
++		rt2x00dev->ops->lib->config_type(rt2x00dev,
++						 IEEE80211_IF_TYPE_MNTR);
++#endif
+ }
+ 
+ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00mac.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2x00mac.c
+@@ -34,6 +34,28 @@
+ #include "rt2x00.h"
+ #include "rt2x00lib.h"
+ 
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++static void rt2x00mac_configure_filter(struct rt2x00_dev *rt2x00dev)
++{
++	struct interface *intf = &rt2x00dev->interface;
++	unsigned int filter = 0;
++
++	if (intf->iff_filter & IFF_PROMISC ||
++	    is_monitor_present(intf) ||
++	    !(is_interface_type(intf, IEEE80211_IF_TYPE_IBSS) ||
++	      is_interface_type(intf, IEEE80211_IF_TYPE_STA)))
++		filter |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
++	if (intf->iff_filter & IFF_MULTICAST)
++		filter |= FIF_ALLMULTI;
++	if (!is_interface_present(intf) && is_monitor_present(intf))
++		filter |= FIF_FCSFAIL | FIF_PLCPFAIL | FIF_CONTROL;
++
++	rt2x00dev->ops->lib->configure_filter(rt2x00dev->hw,
++					      intf->filter ^ filter, &filter,
++					      0, NULL);
++}
++#endif
++
+ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
+ 				struct data_ring *ring,
+ 				struct sk_buff *frag_skb,
+@@ -173,12 +195,20 @@
+ }
+ EXPORT_SYMBOL_GPL(rt2x00mac_start);
+ 
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++int rt2x00mac_stop(struct ieee80211_hw *hw)
++#else
+ void rt2x00mac_stop(struct ieee80211_hw *hw)
++#endif
+ {
+ 	struct rt2x00_dev *rt2x00dev = hw->priv;
+ 
+ 	if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++		return 0;
++#else
+ 		return;
++#endif
+ 
+ 	/*
+ 	 * Perhaps we can add something smarter here,
+@@ -187,6 +217,10 @@
+ 	rt2x00lib_disable_radio(rt2x00dev);
+ 
+ 	__clear_bit(DEVICE_STARTED, &rt2x00dev->flags);
++
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	return 0;
++#endif
+ }
+ EXPORT_SYMBOL_GPL(rt2x00mac_stop);
+ 
+@@ -202,14 +236,37 @@
+ 	 * another interface is already present.
+ 	 */
+ 	if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags) ||
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	    conf->type != IEEE80211_IF_TYPE_MNTR &&
++#endif
+ 	    is_interface_present(intf))
+ 		return -ENOBUFS;
+ 
+-	intf->id = conf->if_id;
+-	intf->type = conf->type;
+-	if (conf->type == IEEE80211_IF_TYPE_AP)
+-		memcpy(&intf->bssid, conf->mac_addr, ETH_ALEN);
+-	memcpy(&intf->mac, conf->mac_addr, ETH_ALEN);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	{
++		int retval = rt2x00mac_start(hw);
++		if (retval)
++			return retval;
++	}
++
++	/*
++	 * We support muliple monitor mode interfaces.
++	 * All we need to do is increase the monitor_count.
++	 */
++	if (conf->type == IEEE80211_IF_TYPE_MNTR) {
++		intf->monitor_count++;
++	} else
++#endif
++	{
++		intf->id = conf->if_id;
++		intf->type = conf->type;
++		if (conf->type == IEEE80211_IF_TYPE_AP)
++			memcpy(&intf->bssid, conf->mac_addr, ETH_ALEN);
++		memcpy(&intf->mac, conf->mac_addr, ETH_ALEN);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++		intf->iff_filter = 0;
++#endif
++	}
+ 
+ 	/*
+ 	 * The MAC adddress must be configured after the device
+@@ -218,6 +275,9 @@
+ 	 */
+ 	rt2x00lib_config_mac_addr(rt2x00dev, intf->mac);
+ 	rt2x00lib_config_type(rt2x00dev, conf->type);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	rt2x00mac_configure_filter(rt2x00dev);
++#endif
+ 
+ 	return 0;
+ }
+@@ -235,13 +295,30 @@
+ 	 * no interface is present.
+ 	 */
+ 	if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags) ||
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	    conf->type != IEEE80211_IF_TYPE_MNTR &&
++#endif
+ 	    !is_interface_present(intf))
+ 		return;
+ 
+-	intf->id = 0;
+-	intf->type = INVALID_INTERFACE;
+-	memset(&intf->bssid, 0x00, ETH_ALEN);
+-	memset(&intf->mac, 0x00, ETH_ALEN);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	/*
++	 * When removing an monitor interface, decrease monitor_count.
++	 * For non-monitor interfaces, all interface data needs to be reset.
++	 */
++	if (conf->type == IEEE80211_IF_TYPE_MNTR) {
++		intf->monitor_count--;
++	} else if (intf->type == conf->type)
++#endif
++	{
++		intf->id = 0;
++		intf->type = INVALID_INTERFACE;
++		memset(&intf->bssid, 0x00, ETH_ALEN);
++		memset(&intf->mac, 0x00, ETH_ALEN);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++		intf->iff_filter = 0;
++#endif
++	}
+ 
+ 	/*
+ 	 * Make sure the bssid and mac address registers
+@@ -250,6 +327,11 @@
+ 	rt2x00lib_config_mac_addr(rt2x00dev, intf->mac);
+ 	rt2x00lib_config_bssid(rt2x00dev, intf->bssid);
+ 	rt2x00lib_config_type(rt2x00dev, intf->type);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	rt2x00mac_configure_filter(rt2x00dev);
++	if (!is_monitor_present(intf))
++		rt2x00mac_stop(hw);
++#endif
+ }
+ EXPORT_SYMBOL_GPL(rt2x00mac_remove_interface);
+ 
+@@ -303,6 +385,14 @@
+ 	if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
+ 		return 0;
+ 
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++        /*
++	 * Monitor mode does not need configuring.
++         */
++	if (conf->type == IEEE80211_IF_TYPE_MNTR)
++		return 0;
++#endif
++
+ 	/*
+ 	 * If the given type does not match the configured type,
+ 	 * there has been a problem.
+@@ -335,6 +425,18 @@
+ }
+ EXPORT_SYMBOL_GPL(rt2x00mac_config_interface);
+ 
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++void rt2x00mac_set_multicast_list(struct ieee80211_hw *hw,
++				  unsigned short iff_filter, int mc_count)
++{
++	struct rt2x00_dev *rt2x00dev = hw->priv;
++
++	rt2x00dev->interface.iff_filter = iff_filter;
++	rt2x00mac_configure_filter(rt2x00dev);
++}
++EXPORT_SYMBOL_GPL(rt2x00mac_set_multicast_list);
++#endif
++
+ int rt2x00mac_get_stats(struct ieee80211_hw *hw,
+ 			struct ieee80211_low_level_stats *stats)
+ {
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -280,9 +280,14 @@
+ 	struct rt2x00_dev *rt2x00dev =
+ 	    container_of(work, struct rt2x00_dev, filter_work);
+ 
+-	rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
+-					     FIF_RT2X00_USE_CURRENT, NULL,
+-					     0, NULL);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++	rt2x00dev->ops->lib
++#else
++	rt2x00dev->ops->hw
++#endif
++	    ->configure_filter(rt2x00dev->hw,
++			       FIF_RT2X00_USE_CURRENT, NULL,
++			       0, NULL);
+ }
+ 
+ /*

Added: unstable/rt2x00/debian/patches/004_fix_filter_flags.diff
===================================================================
--- unstable/rt2x00/debian/patches/004_fix_filter_flags.diff	                        (rev 0)
+++ unstable/rt2x00/debian/patches/004_fix_filter_flags.diff	2007-10-07 00:05:50 UTC (rev 32)
@@ -0,0 +1,207 @@
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2400pci.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c
+@@ -1511,8 +1511,8 @@
+ 	 * - Some filters are set based on interface type.
+ 	 */
+ 	*total_flags |= FIF_ALLMULTI;
+-	if (changed_flags & FIF_OTHER_BSS ||
+-	    changed_flags & FIF_PROMISC_IN_BSS)
++	if (*total_flags & FIF_OTHER_BSS ||
++	    *total_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;
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2500pci.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c
+@@ -1844,8 +1844,8 @@
+ 	 */
+ 	if (mc_count)
+ 		*total_flags |= FIF_ALLMULTI;
+-	if (changed_flags & FIF_OTHER_BSS ||
+-	    changed_flags & FIF_PROMISC_IN_BSS)
++	if (*total_flags & FIF_OTHER_BSS ||
++	    *total_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;
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2500usb.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c
+@@ -1594,8 +1594,14 @@
+ {
+ 	struct rt2x00_dev *rt2x00dev = hw->priv;
+ 	struct interface *intf = &rt2x00dev->interface;
++	unsigned int flags;
+ 	u16 reg;
+ 
++	if (changed_flags & FIF_RT2X00_USE_CURRENT) {
++		flags = *(volatile unsigned int *)&intf->filter;
++		goto configure;
++	}
++
+ 	/*
+ 	 * Mask off any flags we are going to ignore from
+ 	 * the total_flags field.
+@@ -1616,8 +1622,8 @@
+ 	 */
+ 	if (mc_count)
+ 		*total_flags |= FIF_ALLMULTI;
+-	if (changed_flags & FIF_OTHER_BSS ||
+-	    changed_flags & FIF_PROMISC_IN_BSS)
++	if (*total_flags & FIF_OTHER_BSS ||
++	    *total_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;
+@@ -1627,7 +1633,8 @@
+ 	 */
+ 	if (intf->filter == *total_flags)
+ 		return;
+-	intf->filter = *total_flags;
++	flags = *total_flags;
++	*(volatile unsigned int *)&intf->filter = flags;
+ 
+ 	/*
+ 	 * When in atomic context, reschedule and let rt2x00lib
+@@ -1638,6 +1645,7 @@
+ 		return;
+ 	}
+ 
++configure:
+ 	/*
+ 	 * Start configuration steps.
+ 	 * Note that the version error will always be dropped
+@@ -1646,18 +1654,18 @@
+ 	 */
+ 	rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CRC,
+-			   !(*total_flags & FIF_FCSFAIL));
++			   !(flags & FIF_FCSFAIL));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_PHYSICAL,
+-			   !(*total_flags & FIF_PLCPFAIL));
++			   !(flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL,
+-			   !(*total_flags & FIF_CONTROL));
++			   !(flags & FIF_CONTROL));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
+-			   !(*total_flags & FIF_PROMISC_IN_BSS));
++			   !(flags & FIF_PROMISC_IN_BSS));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
+-			   !(*total_flags & FIF_PROMISC_IN_BSS));
++			   !(flags & FIF_PROMISC_IN_BSS));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,
+-			   !(*total_flags & FIF_ALLMULTI));
++			   !(flags & FIF_ALLMULTI));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_BROADCAST, 0);
+ 	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);
+ }
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt61pci.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt61pci.c
+@@ -2403,8 +2403,8 @@
+ 	 */
+ 	if (mc_count)
+ 		*total_flags |= FIF_ALLMULTI;
+-	if (changed_flags & FIF_OTHER_BSS ||
+-	    changed_flags & FIF_PROMISC_IN_BSS)
++	if (*total_flags & FIF_OTHER_BSS ||
++	    *total_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;
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt73usb.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt73usb.c
+@@ -1848,8 +1848,14 @@
+ {
+ 	struct rt2x00_dev *rt2x00dev = hw->priv;
+ 	struct interface *intf = &rt2x00dev->interface;
++	unsigned int flags;
+ 	u32 reg;
+ 
++	if (changed_flags & FIF_RT2X00_USE_CURRENT) {
++		flags = *(volatile unsigned int *)&intf->filter;
++		goto configure;
++	}
++
+ 	/*
+ 	 * Mask off any flags we are going to ignore from
+ 	 * the total_flags field.
+@@ -1870,8 +1876,8 @@
+ 	 */
+ 	if (mc_count)
+ 		*total_flags |= FIF_ALLMULTI;
+-	if (changed_flags & FIF_OTHER_BSS ||
+-	    changed_flags & FIF_PROMISC_IN_BSS)
++	if (*total_flags & FIF_OTHER_BSS ||
++	    *total_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;
+@@ -1881,7 +1887,8 @@
+ 	 */
+ 	if (intf->filter == *total_flags)
+ 		return;
+-	intf->filter = *total_flags;
++	flags = *total_flags;
++	*(volatile unsigned int *)&intf->filter = flags;
+ 
+ 	/*
+ 	 * When in atomic context, reschedule and let rt2x00lib
+@@ -1892,6 +1899,7 @@
+ 		return;
+ 	}
+ 
++configure:
+ 	/*
+ 	 * Start configuration steps.
+ 	 * Note that the version error will always be dropped
+@@ -1900,18 +1908,18 @@
+ 	 */
+ 	rt73usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC,
+-			   !(*total_flags & FIF_FCSFAIL));
++			   !(flags & FIF_FCSFAIL));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL,
+-			   !(*total_flags & FIF_PLCPFAIL));
++			   !(flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
+-			   !(*total_flags & FIF_CONTROL));
++			   !(flags & FIF_CONTROL));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
+-			   !(*total_flags & FIF_PROMISC_IN_BSS));
++			   !(flags & FIF_PROMISC_IN_BSS));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
+-			   !(*total_flags & FIF_PROMISC_IN_BSS));
++			   !(flags & FIF_PROMISC_IN_BSS));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
+-			   !(*total_flags & FIF_ALLMULTI));
++			   !(flags & FIF_ALLMULTI));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_BROADCAST, 0);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 1);
+ 	rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg);
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ rt2x00/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -281,8 +281,7 @@
+ 	    container_of(work, struct rt2x00_dev, filter_work);
+ 
+ 	rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
+-					     rt2x00dev->interface.filter,
+-					     &rt2x00dev->interface.filter,
++					     FIF_RT2X00_USE_CURRENT, NULL,
+ 					     0, NULL);
+ }
+ 
+--- rt2x00.orig/drivers/net/wireless/rt2x00/rt2x00.h
++++ rt2x00/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -315,6 +315,11 @@
+ 	unsigned int filter;
+ };
+ 
++/* Magic filter for configure_filter to apply existing filter */
++enum {
++	FIF_RT2X00_USE_CURRENT	= 1<<30
++};
++
+ static inline int is_interface_present(struct interface *intf)
+ {
+ 	return !!intf->id;

Modified: unstable/rt2x00/debian/patches/series
===================================================================
--- unstable/rt2x00/debian/patches/series	2007-10-06 23:39:31 UTC (rev 31)
+++ unstable/rt2x00/debian/patches/series	2007-10-07 00:05:50 UTC (rev 32)
@@ -1,2 +1,3 @@
 002_out_of_tree.diff
+004_fix_filter_flags.diff
 003_workaround_mac80211_changes.diff




More information about the Pkg-ralink-commits mailing list