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, ®);
+- rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
+- rt2x00_set_field32(®, CSR14_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++ if (is_interface_present(&rt2x00dev->interface))
++#endif
++ {
++ rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
++ rt2x00_set_field32(®, CSR14_TBCN, 1);
++ }
+ rt2x00_set_field32(®, 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, ®);
+- rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
+- rt2x00_set_field32(®, CSR14_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++ if (is_interface_present(&rt2x00dev->interface))
++#endif
++ {
++ rt2x00_set_field32(®, CSR14_TSF_COUNT, 1);
++ rt2x00_set_field32(®, CSR14_TBCN, 1);
++ }
+ rt2x00_set_field32(®, 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, ®);
+- rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
+- rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++ if (is_interface_present(&rt2x00dev->interface))
++#endif
++ {
++ rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
++ rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1);
++ }
+ rt2x00_set_field16(®, 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, ®);
+- rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
+- rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1);
++#ifdef RT2X00_ADAPT_OLD_FILTER_API
++ if (is_interface_present(&rt2x00dev->interface))
++#endif
++ {
++ rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 1);
++ rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 1);
++ }
+ rt2x00_set_field32(®, 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, ®);
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_CRC,
+- !(*total_flags & FIF_FCSFAIL));
++ !(flags & FIF_FCSFAIL));
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL,
+- !(*total_flags & FIF_PLCPFAIL));
++ !(flags & FIF_PLCPFAIL));
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL,
+- !(*total_flags & FIF_CONTROL));
++ !(flags & FIF_CONTROL));
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME,
+- !(*total_flags & FIF_PROMISC_IN_BSS));
++ !(flags & FIF_PROMISC_IN_BSS));
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS,
+- !(*total_flags & FIF_PROMISC_IN_BSS));
++ !(flags & FIF_PROMISC_IN_BSS));
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1);
+ rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST,
+- !(*total_flags & FIF_ALLMULTI));
++ !(flags & FIF_ALLMULTI));
+ rt2x00_set_field16(®, 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, ®);
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC,
+- !(*total_flags & FIF_FCSFAIL));
++ !(flags & FIF_FCSFAIL));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL,
+- !(*total_flags & FIF_PLCPFAIL));
++ !(flags & FIF_PLCPFAIL));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL,
+- !(*total_flags & FIF_CONTROL));
++ !(flags & FIF_CONTROL));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME,
+- !(*total_flags & FIF_PROMISC_IN_BSS));
++ !(flags & FIF_PROMISC_IN_BSS));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
+- !(*total_flags & FIF_PROMISC_IN_BSS));
++ !(flags & FIF_PROMISC_IN_BSS));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
+- !(*total_flags & FIF_ALLMULTI));
++ !(flags & FIF_ALLMULTI));
+ rt2x00_set_field32(®, TXRX_CSR0_DROP_BROADCAST, 0);
+ rt2x00_set_field32(®, 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