* [PATCH 2/3] compat-wireless: make compat-2.6.37.c build
From: Hauke Mehrtens @ 2010-08-17 18:31 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
In-Reply-To: <1282069869-22300-1-git-send-email-hauke@hauke-m.de>
This is needed to set CONFIG_COMPAT_KERNEL_37
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
config.mk | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/config.mk b/config.mk
index 777ebd3..edfeca2 100644
--- a/config.mk
+++ b/config.mk
@@ -20,7 +20,7 @@ endif
# as I suspect all users of this package want 802.11e (WME) and
# 802.11n (HT) support.
ifneq ($(wildcard $(KLIB_BUILD)/Makefile),)
-COMPAT_LATEST_VERSION = 35
+COMPAT_LATEST_VERSION = 37
KERNEL_SUBLEVEL := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
COMPAT_VERSIONS := $(shell I=$(COMPAT_LATEST_VERSION); while [ "$$I" -gt $(KERNEL_SUBLEVEL) ]; do echo $$I; I=$$(($$I - 1)); done)
$(foreach ver,$(COMPAT_VERSIONS),$(eval CONFIG_COMPAT_KERNEL_$(ver)=y))
--
1.7.0.4
^ permalink raw reply related
* [PATCH 3/3] compat-wireless: fix hidp_output_raw_report
From: Hauke Mehrtens @ 2010-08-17 18:31 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
In-Reply-To: <1282069869-22300-1-git-send-email-hauke@hauke-m.de>
The report_type parameter was added with kenrel 2.6.34
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
patches/16-bluetooth.patch | 37 +++++++++++++++++++++++--------------
1 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/patches/16-bluetooth.patch b/patches/16-bluetooth.patch
index 522b680..29d990a 100644
--- a/patches/16-bluetooth.patch
+++ b/patches/16-bluetooth.patch
@@ -180,19 +180,28 @@ here still, but for now we keep this here.
return hidp_queue_report(session, buf, rsize);
}
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27))
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count,
unsigned char report_type)
{
-@@ -332,6 +333,7 @@ static int hidp_output_raw_report(struct
+@@ -332,6 +333,16 @@ static int hidp_output_raw_report(struct
return -ENOMEM;
return count;
}
++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27))
++static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count)
++{
++ if (hidp_send_ctrl_message(hid->driver_data,
++ HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE,
++ data, count))
++ return -ENOMEM;
++ return count;
++}
+#endif
static void hidp_idle_timeout(unsigned long arg)
{
-@@ -596,10 +598,16 @@ static int hidp_session(void *arg)
+@@ -596,10 +607,16 @@ static int hidp_session(void *arg)
session->input = NULL;
}
@@ -213,7 +222,7 @@ here still, but for now we keep this here.
/* Wakeup user-space polling for socket errors */
session->intr_sock->sk->sk_err = EUNATCH;
-@@ -711,6 +719,70 @@ static void hidp_close(struct hid_device
+@@ -711,6 +728,70 @@ static void hidp_close(struct hid_device
{
}
@@ -284,7 +293,7 @@ here still, but for now we keep this here.
static int hidp_parse(struct hid_device *hid)
{
struct hidp_session *session = hid->driver_data;
-@@ -815,6 +887,7 @@ fault:
+@@ -815,6 +896,7 @@ fault:
return err;
}
@@ -292,7 +301,7 @@ here still, but for now we keep this here.
int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock)
{
-@@ -833,6 +906,39 @@ int hidp_add_connection(struct hidp_conn
+@@ -833,6 +915,39 @@ int hidp_add_connection(struct hidp_conn
BT_DBG("rd_data %p rd_size %d", req->rd_data, req->rd_size);
@@ -332,7 +341,7 @@ here still, but for now we keep this here.
down_write(&hidp_session_sem);
s = __hidp_get_session(&bt_sk(ctrl_sock->sk)->dst);
-@@ -860,6 +966,7 @@ int hidp_add_connection(struct hidp_conn
+@@ -860,6 +975,7 @@ int hidp_add_connection(struct hidp_conn
session->flags = req->flags & (1 << HIDP_BLUETOOTH_VENDOR_ID);
session->idle_to = req->idle_to;
@@ -340,7 +349,7 @@ here still, but for now we keep this here.
if (req->rd_size > 0) {
err = hidp_setup_hid(session, req);
if (err && err != -ENODEV)
-@@ -871,6 +978,16 @@ int hidp_add_connection(struct hidp_conn
+@@ -871,6 +987,16 @@ int hidp_add_connection(struct hidp_conn
if (err < 0)
goto purge;
}
@@ -357,7 +366,7 @@ here still, but for now we keep this here.
__hidp_link_session(session);
-@@ -902,6 +1019,7 @@ unlink:
+@@ -902,6 +1028,7 @@ unlink:
session->input = NULL;
}
@@ -365,7 +374,7 @@ here still, but for now we keep this here.
if (session->hid) {
hid_destroy_device(session->hid);
session->hid = NULL;
-@@ -913,10 +1031,15 @@ unlink:
+@@ -913,10 +1040,15 @@ unlink:
purge:
skb_queue_purge(&session->ctrl_transmit);
skb_queue_purge(&session->intr_transmit);
@@ -381,7 +390,7 @@ here still, but for now we keep this here.
input_free_device(session->input);
kfree(session);
return err;
-@@ -1006,6 +1129,7 @@ int hidp_get_conninfo(struct hidp_connin
+@@ -1006,6 +1138,7 @@ int hidp_get_conninfo(struct hidp_connin
return err;
}
@@ -389,7 +398,7 @@ here still, but for now we keep this here.
static const struct hid_device_id hidp_table[] = {
{ HID_BLUETOOTH_DEVICE(HID_ANY_ID, HID_ANY_ID) },
{ }
-@@ -1015,6 +1139,7 @@ static struct hid_driver hidp_driver = {
+@@ -1015,6 +1148,7 @@ static struct hid_driver hidp_driver = {
.name = "generic-bluetooth",
.id_table = hidp_table,
};
@@ -397,7 +406,7 @@ here still, but for now we keep this here.
static int __init hidp_init(void)
{
-@@ -1024,11 +1149,14 @@ static int __init hidp_init(void)
+@@ -1024,11 +1158,14 @@ static int __init hidp_init(void)
BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION);
@@ -412,7 +421,7 @@ here still, but for now we keep this here.
if (ret)
goto err_drv;
-@@ -1036,13 +1164,16 @@ static int __init hidp_init(void)
+@@ -1036,13 +1173,16 @@ static int __init hidp_init(void)
err_drv:
hid_unregister_driver(&hidp_driver);
err:
--
1.7.0.4
^ permalink raw reply related
* [PATCH 0/3] compat: miscellaneous fixes
From: Hauke Mehrtens @ 2010-08-17 18:32 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
This was build tested in combination with the patches to compat-wireless.
Hauke Mehrtens (3):
compat: backport init_dummy_netdev
compat: backport net_ns_type_operations
compat: fix warning in device_rename
compat/Makefile | 1 +
compat/compat-2.6.29.c | 40 ++++++++++++++++++++++++++++++++++++
compat/compat-2.6.37.c | 45 +++++++++++++++++++++++++++++++++++++++++
include/linux/compat-2.6.29.h | 2 +
include/linux/compat-2.6.36.h | 2 +
include/linux/compat-2.6.37.h | 2 +
6 files changed, 92 insertions(+), 0 deletions(-)
create mode 100644 compat/compat-2.6.37.c
^ permalink raw reply
* [PATCH 1/3] compat: backport init_dummy_netdev
From: Hauke Mehrtens @ 2010-08-17 18:32 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
In-Reply-To: <1282069953-22360-1-git-send-email-hauke@hauke-m.de>
NETREG_DUMMY is not available for older kernels, it should be set to
something not normal. NETREG_DUMMY is set to 5 in new kernel versions.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
compat/compat-2.6.29.c | 40 ++++++++++++++++++++++++++++++++++++++++
include/linux/compat-2.6.29.h | 2 ++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/compat/compat-2.6.29.c b/compat/compat-2.6.29.c
index 2e7e623..a2354f9 100644
--- a/compat/compat-2.6.29.c
+++ b/compat/compat-2.6.29.c
@@ -124,6 +124,46 @@ int eth_validate_addr(struct net_device *dev)
EXPORT_SYMBOL(eth_validate_addr);
/* Source: net/ethernet/eth.c */
+#define NETREG_DUMMY 5
+/**
+ * init_dummy_netdev - init a dummy network device for NAPI
+ * @dev: device to init
+ *
+ * This takes a network device structure and initialize the minimum
+ * amount of fields so it can be used to schedule NAPI polls without
+ * registering a full blown interface. This is to be used by drivers
+ * that need to tie several hardware interfaces to a single NAPI
+ * poll scheduler due to HW limitations.
+ */
+int init_dummy_netdev(struct net_device *dev)
+{
+ /* Clear everything. Note we don't initialize spinlocks
+ * are they aren't supposed to be taken by any of the
+ * NAPI code and this dummy netdev is supposed to be
+ * only ever used for NAPI polls
+ */
+ memset(dev, 0, sizeof(struct net_device));
+
+ /* make sure we BUG if trying to hit standard
+ * register/unregister code path
+ */
+ dev->reg_state = NETREG_DUMMY;
+
+ /* initialize the ref count */
+ atomic_set(&dev->refcnt, 1);
+
+ /* NAPI wants this */
+ INIT_LIST_HEAD(&dev->napi_list);
+
+ /* a dummy interface is started by default */
+ set_bit(__LINK_STATE_PRESENT, &dev->state);
+ set_bit(__LINK_STATE_START, &dev->state);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(init_dummy_netdev);
+/* Source: net/core/dev.c */
+
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */
diff --git a/include/linux/compat-2.6.29.h b/include/linux/compat-2.6.29.h
index a1a989c..cce678f 100644
--- a/include/linux/compat-2.6.29.h
+++ b/include/linux/compat-2.6.29.h
@@ -274,6 +274,8 @@ static inline struct net *read_pnet(struct net * const *pnet)
#endif
+extern int init_dummy_netdev(struct net_device *dev);
+
#else
static inline void netdev_attach_ops(struct net_device *dev,
--
1.7.0.4
^ permalink raw reply related
* [PATCH 3/3] compat: fix warning in device_rename
From: Hauke Mehrtens @ 2010-08-17 18:32 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
In-Reply-To: <1282069953-22360-1-git-send-email-hauke@hauke-m.de>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
include/linux/compat-2.6.36.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/include/linux/compat-2.6.36.h b/include/linux/compat-2.6.36.h
index b14c772..5b48215 100644
--- a/include/linux/compat-2.6.36.h
+++ b/include/linux/compat-2.6.36.h
@@ -13,6 +13,8 @@ struct va_format {
va_list *va;
};
+#define device_rename(dev, new_name) device_rename(dev, (char *)new_name)
+
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) */
#endif /* LINUX_26_36_COMPAT_H */
--
1.7.0.4
^ permalink raw reply related
* [PATCH 2/3] compat: backport net_ns_type_operations
From: Hauke Mehrtens @ 2010-08-17 18:32 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, Hauke Mehrtens
In-Reply-To: <1282069953-22360-1-git-send-email-hauke@hauke-m.de>
net_ns_type_operations needs to be exported. This only works for kernel
>= 2.6.35 because struct kobj_ns_type_operations was introduced in
kernel 2.6.35.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
compat/Makefile | 1 +
compat/compat-2.6.37.c | 45 +++++++++++++++++++++++++++++++++++++++++
include/linux/compat-2.6.37.h | 2 +
3 files changed, 48 insertions(+), 0 deletions(-)
create mode 100644 compat/compat-2.6.37.c
diff --git a/compat/Makefile b/compat/Makefile
index bcd8fe7..b067be2 100644
--- a/compat/Makefile
+++ b/compat/Makefile
@@ -27,3 +27,4 @@ compat-$(CONFIG_COMPAT_KERNEL_31) += compat-2.6.31.o
compat-$(CONFIG_COMPAT_KERNEL_32) += compat-2.6.32.o
compat-$(CONFIG_COMPAT_KERNEL_33) += compat-2.6.33.o
compat-$(CONFIG_COMPAT_KERNEL_35) += compat-2.6.35.o
+compat-$(CONFIG_COMPAT_KERNEL_37) += compat-2.6.37.o
diff --git a/compat/compat-2.6.37.c b/compat/compat-2.6.37.c
new file mode 100644
index 0000000..655b92f
--- /dev/null
+++ b/compat/compat-2.6.37.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010 Hauke Mehrtens <hauke@hauke-m.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.37.
+ */
+
+#include <linux/compat.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+
+#include <linux/netdevice.h>
+#include <net/sock.h>
+#include <linux/nsproxy.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
+static const void *net_current_ns(void)
+{
+ return current->nsproxy->net_ns;
+}
+
+static const void *net_initial_ns(void)
+{
+ return &init_net;
+}
+
+static const void *net_netlink_ns(struct sock *sk)
+{
+ return sock_net(sk);
+}
+
+struct kobj_ns_type_operations net_ns_type_operations = {
+ .type = KOBJ_NS_TYPE_NET,
+ .current_ns = net_current_ns,
+ .netlink_ns = net_netlink_ns,
+ .initial_ns = net_initial_ns,
+};
+EXPORT_SYMBOL_GPL(net_ns_type_operations);
+
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)*/
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) */
diff --git a/include/linux/compat-2.6.37.h b/include/linux/compat-2.6.37.h
index cf0279e..5bd6edb 100644
--- a/include/linux/compat-2.6.37.h
+++ b/include/linux/compat-2.6.37.h
@@ -24,6 +24,8 @@
#define SDIO_CLASS_BT_AMP 0x09 /* Type-A Bluetooth AMP interface */
+extern struct kobj_ns_type_operations net_ns_type_operations;
+
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) */
#endif /* LINUX_26_37_COMPAT_H */
--
1.7.0.4
^ permalink raw reply related
* Filesystem corruption with 2.6.36-rc1-wl+ and ecryptfs
From: Kalle Valo @ 2010-08-17 18:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linux-kernel
Hi,
I just installed my first 2.6.36 kernel, 2.6.36-rc1-wl+ from
wireless-testing, and immeadialy (during first boot) got major
corruption in the filesystem. For example, gnome lost it's settings,
~/.ssh was empty etc. Now, with an older kernel, my directory
structure has duplicate entries, like this:
$ ls -ald D*
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Desktop/
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Desktop/
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Documents/
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Documents/
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Downloads/
drwxr-xr-x 2 kvalo kvalo 4096 2010-08-17 19:21 Downloads/
I'm using ecryptfs and that's my major suspect for the corruption, but
naturally I can't be sure because I'm just guessing here.
Some info about my system:
Samsung X120 laptop
Ubuntu 10.04
amd64, 2 CPUs
ext4, /home/kvalo encrypted with ecryptfs
ath9k
--
Kalle Valo
^ permalink raw reply
* Compat-wireless release for 2010-08-17 is baked
From: Compat-wireless cronjob account @ 2010-08-17 19:03 UTC (permalink / raw)
To: linux-wireless
>From git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/compat-wireless-2.6
* [new branch] linux-2.6.36.y -> origin/linux-2.6.36.y
7746bc0..4c0ceee master -> origin/master
* [new tag] compat-wireless-2010-08-16 -> compat-wireless-2010-08-16
* [new tag] compat-wireless-master-2010-08-05 -> compat-wireless-master-2010-08-05
* [new tag] compat-wireless-v2.6.36-rc1 -> compat-wireless-v2.6.36-rc1
>From git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/compat
* [new branch] linux-2.6.36.y -> origin/linux-2.6.36.y
>From git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next
3639a89..ffefdc0 history -> origin/history
+ f74eac3...ef937c2 master -> origin/master (forced update)
* [new tag] next-20100817 -> next-20100817
cat: /var/opt/compat/compat-wireless-2.6/compat_version: No such file or directory
cat: compat_base_tree: No such file or directory
cat: compat_base_tree_version: No such file or directory
cat: compat_version: No such file or directory
cat: /var/opt/compat/compat-wireless-2.6/compat_version: No such file or directory
scripts/Makefile.clean:17: /var/opt/compat/compat-wireless-2.6/drivers/net/wireless/hostap/Makefile: No such file or directory
make[4]: *** No rule to make target `/var/opt/compat/compat-wireless-2.6/drivers/net/wireless/hostap/Makefile'. Stop.
make[3]: *** [/var/opt/compat/compat-wireless-2.6/drivers/net/wireless/hostap] Error 2
make[2]: *** [/var/opt/compat/compat-wireless-2.6/drivers/net/wireless] Error 2
make[1]: *** [_clean_/var/opt/compat/compat-wireless-2.6] Error 2
make: *** [clean] Error 2
compat-wireless code metrics
495649 - Total upstream lines of code being pulled
1699 - backport code changes
1460 - backport code additions
239 - backport code deletions
5979 - backport from compat module
7678 - total backport code
1.5491 - % of code consists of backport work
1218 - Crap changes not yet posted
1179 - Crap additions not yet posted
39 - Crap deletions not yet posted
0.2457 - % of crap code
Base tree: linux-next.git
Base tree version: next-20100817
compat-wireless release: compat-wireless-2010-08-16
^ permalink raw reply
* [PATCH 0/4] wl1271 -> wl1251 port patches
From: Grazvydas Ignotas @ 2010-08-17 19:46 UTC (permalink / raw)
To: John W. Linville
Cc: linux-wireless, Kalle Valo, Grazvydas Ignotas, Luciano Coelho
Hi,
I've been looking at wl1271 changelog and found several patches that
seem to be also applicable to wl1251. I'm not that sure about patches
2 and 4, but 1 and 3 should be correct (I've verified 3 with TI driver).
I've been running these on pandora for several days now without problems.
It's a shame wl12xx drivers were completely split, it would look like
they could share fair bit of code. Now wl1251 does not benefit from more
actively developed wl1271 fixes.
There are even more wl1271 patches that could be applicable to wl1251.
Kalle, could you take a look at the list below? I could try porting if
you think any of those make sense.
Adding disconnect command, it seems to be also used by TI driver:
25a7dc6d22adda590be4932ebc772ea35914880c
c7f43e451ba40e66a89d51e63bc21a57824592f2
powersave fail handling:
19ad0715d8d9acc259ef02f83df767df2cf1eafe
not masking interrupts while processing:
4aa05917051b01da037a80c3207b48aee252eed2
connection monitoring control:
6ccbb92ead9379d7de2cc25cd950d15a8d22e0c9
a9af092b524614dd3fc7b52bde7c87f8b82cd2a6
broken ps-poll handling:
90494a90bea010af47547880634e0f1c52824a7d
improved queue stopping:
06f7bc7db79fabe6b2ec16eff0f59e4acc21eb72
probably more..
Grazvydas Ignotas (4):
wl1251: add missing __packed modifier for some structs
wl1251: fix event handling mechanism
wl1251: fix beacon filter table structure
wl1251: wait for join command complete event
drivers/net/wireless/wl12xx/wl1251_acx.h | 8 +++---
drivers/net/wireless/wl12xx/wl1251_boot.c | 2 +-
drivers/net/wireless/wl12xx/wl1251_cmd.h | 6 ++--
drivers/net/wireless/wl12xx/wl1251_event.c | 29 ++++++++++++++++++++++++++++
drivers/net/wireless/wl12xx/wl1251_event.h | 1 +
drivers/net/wireless/wl12xx/wl1251_main.c | 24 ++++++++++------------
6 files changed, 49 insertions(+), 21 deletions(-)
^ permalink raw reply
* [PATCH 1/4] wl1251: add missing __packed modifier for some structs
From: Grazvydas Ignotas @ 2010-08-17 19:46 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Kalle Valo, Grazvydas Ignotas
In-Reply-To: <1282074415-6168-1-git-send-email-notasas@gmail.com>
Several acx and cmd structures are missing __packed modifier, add it.
This was noticed while comparing them with corresponding wl1271 code.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
---
drivers/net/wireless/wl12xx/wl1251_acx.h | 6 +++---
drivers/net/wireless/wl12xx/wl1251_cmd.h | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1251_acx.h b/drivers/net/wireless/wl12xx/wl1251_acx.h
index 842df31..9864124 100644
--- a/drivers/net/wireless/wl12xx/wl1251_acx.h
+++ b/drivers/net/wireless/wl12xx/wl1251_acx.h
@@ -37,7 +37,7 @@ struct acx_header {
/* payload length (not including headers */
u16 len;
-};
+} __packed;
struct acx_error_counter {
struct acx_header header;
@@ -471,7 +471,7 @@ struct acx_conn_monit_params {
u32 synch_fail_thold; /* number of beacons missed */
u32 bss_lose_timeout; /* number of TU's from synch fail */
-};
+} __packed;
enum {
SG_ENABLE = 0,
@@ -1056,7 +1056,7 @@ struct acx_rate_class {
u8 long_retry_limit;
u8 aflags;
u8 reserved;
-};
+} __packed;
struct acx_rate_policy {
struct acx_header header;
diff --git a/drivers/net/wireless/wl12xx/wl1251_cmd.h b/drivers/net/wireless/wl12xx/wl1251_cmd.h
index a9e4991..60d7e52 100644
--- a/drivers/net/wireless/wl12xx/wl1251_cmd.h
+++ b/drivers/net/wireless/wl12xx/wl1251_cmd.h
@@ -111,7 +111,7 @@ struct wl1251_cmd_header {
struct wl1251_command {
struct wl1251_cmd_header header;
u8 parameters[MAX_CMD_PARAMS];
-};
+} __packed;
enum {
CMD_MAILBOX_IDLE = 0,
@@ -164,7 +164,7 @@ struct cmd_read_write_memory {
of this field is the Host in WRITE command or the Wilink in READ
command. */
u8 value[MAX_READ_SIZE];
-};
+} __packed;
#define CMDMBOX_HEADER_LEN 4
#define CMDMBOX_INFO_ELEM_HEADER_LEN 4
@@ -339,7 +339,7 @@ struct wl1251_cmd_trigger_scan_to {
struct wl1251_cmd_header header;
u32 timeout;
-};
+} __packed;
/* HW encryption keys */
#define NUM_ACCESS_CATEGORIES_COPY 4
--
1.5.6.3
^ permalink raw reply related
* [PATCH 2/4] wl1251: fix event handling mechanism
From: Grazvydas Ignotas @ 2010-08-17 19:46 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Kalle Valo, Grazvydas Ignotas
In-Reply-To: <1282074415-6168-1-git-send-email-notasas@gmail.com>
In case both A and B events occured simultaneously, current code
would only process A and clear both interrupts. Make it process both
events instead.
Based on wl1271 patches by Juuso Oikarinen:
1fd2794f36913992798184c464fe8f85753b13e0
13f2dc52c69bcca074cd12d4806953b2af45c386
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
---
drivers/net/wireless/wl12xx/wl1251_main.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index 6d31c85..51474b6 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -293,14 +293,14 @@ static void wl1251_irq_work(struct work_struct *work)
wl1251_tx_complete(wl);
}
- if (intr & (WL1251_ACX_INTR_EVENT_A |
- WL1251_ACX_INTR_EVENT_B)) {
- wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_EVENT (0x%x)",
- intr);
- if (intr & WL1251_ACX_INTR_EVENT_A)
- wl1251_event_handle(wl, 0);
- else
- wl1251_event_handle(wl, 1);
+ if (intr & WL1251_ACX_INTR_EVENT_A) {
+ wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_EVENT_A");
+ wl1251_event_handle(wl, 0);
+ }
+
+ if (intr & WL1251_ACX_INTR_EVENT_B) {
+ wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_EVENT_B");
+ wl1251_event_handle(wl, 1);
}
if (intr & WL1251_ACX_INTR_INIT_COMPLETE)
--
1.5.6.3
^ permalink raw reply related
* [PATCH 3/4] wl1251: fix beacon filter table structure
From: Grazvydas Ignotas @ 2010-08-17 19:46 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Kalle Valo, Grazvydas Ignotas
In-Reply-To: <1282074415-6168-1-git-send-email-notasas@gmail.com>
The beacon filter table configuration ACX structure had certain elements
reversed, fix it to match TI driver.
Based on wl1271 patch 1937e742639c03a6fe77239c3003ce9602302117 by
Juuso Oikarinen.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
---
drivers/net/wireless/wl12xx/wl1251_acx.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1251_acx.h b/drivers/net/wireless/wl12xx/wl1251_acx.h
index 9864124..a8845b8 100644
--- a/drivers/net/wireless/wl12xx/wl1251_acx.h
+++ b/drivers/net/wireless/wl12xx/wl1251_acx.h
@@ -459,8 +459,8 @@ struct acx_beacon_filter_ie_table {
struct acx_header header;
u8 num_ie;
- u8 table[BEACON_FILTER_TABLE_MAX_SIZE];
u8 pad[3];
+ u8 table[BEACON_FILTER_TABLE_MAX_SIZE];
} __packed;
#define SYNCH_FAIL_DEFAULT_THRESHOLD 10 /* number of beacons */
--
1.5.6.3
^ permalink raw reply related
* [PATCH 4/4] wl1251: wait for join command complete event
From: Grazvydas Ignotas @ 2010-08-17 19:46 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, Kalle Valo, Grazvydas Ignotas
In-Reply-To: <1282074415-6168-1-git-send-email-notasas@gmail.com>
Poll for join command completion instead of waiting blindly for 10
msecs. There is a timeout of 100 msecs, if the command doesn't complete
by then, we return an error code.
Based on wl1271 patch 99d84c1de8fdf5f9b09f07fdbc628857a040bf8b
by Luciano Coelho.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
---
drivers/net/wireless/wl12xx/wl1251_boot.c | 2 +-
drivers/net/wireless/wl12xx/wl1251_event.c | 29 ++++++++++++++++++++++++++++
drivers/net/wireless/wl12xx/wl1251_event.h | 1 +
drivers/net/wireless/wl12xx/wl1251_main.c | 8 ++----
4 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1251_boot.c b/drivers/net/wireless/wl12xx/wl1251_boot.c
index 65e0416..5e65f47 100644
--- a/drivers/net/wireless/wl12xx/wl1251_boot.c
+++ b/drivers/net/wireless/wl12xx/wl1251_boot.c
@@ -302,7 +302,7 @@ int wl1251_boot_run_firmware(struct wl1251 *wl)
ROAMING_TRIGGER_LOW_RSSI_EVENT_ID |
ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID |
REGAINED_BSS_EVENT_ID | BT_PTA_SENSE_EVENT_ID |
- BT_PTA_PREDICTION_EVENT_ID;
+ BT_PTA_PREDICTION_EVENT_ID | JOIN_EVENT_COMPLETE_ID;
ret = wl1251_event_unmask(wl);
if (ret < 0) {
diff --git a/drivers/net/wireless/wl12xx/wl1251_event.c b/drivers/net/wireless/wl12xx/wl1251_event.c
index 020d764..e093a1c 100644
--- a/drivers/net/wireless/wl12xx/wl1251_event.c
+++ b/drivers/net/wireless/wl12xx/wl1251_event.c
@@ -97,6 +97,35 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
return 0;
}
+/*
+ * Poll the mailbox event field until any of the bits in the mask is set or a
+ * timeout occurs (WL1251_EVENT_TIMEOUT in msecs)
+ */
+int wl1251_event_wait(struct wl1251 *wl, u32 mask, int timeout_ms)
+{
+ u32 events_vector, event;
+ unsigned long timeout;
+
+ timeout = jiffies + msecs_to_jiffies(timeout_ms);
+
+ do {
+ if (time_after(jiffies, timeout))
+ return -ETIMEDOUT;
+
+ msleep(1);
+
+ /* read from both event fields */
+ wl1251_mem_read(wl, wl->mbox_ptr[0], &events_vector,
+ sizeof(events_vector));
+ event = events_vector & mask;
+ wl1251_mem_read(wl, wl->mbox_ptr[1], &events_vector,
+ sizeof(events_vector));
+ event |= events_vector & mask;
+ } while (!event);
+
+ return 0;
+}
+
int wl1251_event_unmask(struct wl1251 *wl)
{
int ret;
diff --git a/drivers/net/wireless/wl12xx/wl1251_event.h b/drivers/net/wireless/wl12xx/wl1251_event.h
index f48a2b6..ec45647 100644
--- a/drivers/net/wireless/wl12xx/wl1251_event.h
+++ b/drivers/net/wireless/wl12xx/wl1251_event.h
@@ -117,5 +117,6 @@ struct event_mailbox {
int wl1251_event_unmask(struct wl1251 *wl);
void wl1251_event_mbox_config(struct wl1251 *wl);
int wl1251_event_handle(struct wl1251 *wl, u8 mbox);
+int wl1251_event_wait(struct wl1251 *wl, u32 mask, int timeout_ms);
#endif
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index 51474b6..c81e95b 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -339,11 +339,9 @@ static int wl1251_join(struct wl1251 *wl, u8 bss_type, u8 channel,
if (ret < 0)
goto out;
- /*
- * FIXME: we should wait for JOIN_EVENT_COMPLETE_ID but to simplify
- * locking we just sleep instead, for now
- */
- msleep(10);
+ ret = wl1251_event_wait(wl, JOIN_EVENT_COMPLETE_ID, 100);
+ if (ret < 0)
+ wl1251_warning("join timeout");
out:
return ret;
--
1.5.6.3
^ permalink raw reply related
* Re: [RFT] BCM4312 users with DMA errors, please test!
From: Chris Vine @ 2010-08-17 20:28 UTC (permalink / raw)
To: b43-dev; +Cc: Larry Finger, linux-wireless
In-Reply-To: <20100817132337.01392797@boulder.homenet>
On Tue, 17 Aug 2010 13:23:37 +0100
Chris Vine <chris@cvine.freeserve.co.uk> wrote:
> Reverting to 2.6.35.1 solves this. Probably 2.6.36-rc1 would be OK as
> well. I might later today try the ssb patch on the 2.6.35.1 kernel,
> but it doesn't look as if it solves the DMA errors. However,
> yesterday's tests clearly aren't conclusive about anything.
I have applied the patch to 2.6.35.1, and it does not appear to have
any effect on the DMA errors.
Chris
^ permalink raw reply
* Re: [RFT] BCM4312 users with DMA errors, please test!
From: Gábor Stefanik @ 2010-08-17 20:38 UTC (permalink / raw)
To: Chris Vine; +Cc: b43-dev, linux-wireless, Larry Finger
In-Reply-To: <20100817212825.6f5ecb66@boulder.homenet>
On Tue, Aug 17, 2010 at 10:28 PM, Chris Vine
<chris@cvine.freeserve.co.uk> wrote:
> On Tue, 17 Aug 2010 13:23:37 +0100
> Chris Vine <chris@cvine.freeserve.co.uk> wrote:
>> Reverting to 2.6.35.1 solves this. Probably 2.6.36-rc1 would be OK as
>> well. I might later today try the ssb patch on the 2.6.35.1 kernel,
>> but it doesn't look as if it solves the DMA errors. However,
>> yesterday's tests clearly aren't conclusive about anything.
>
> I have applied the patch to 2.6.35.1, and it does not appear to have
> any effect on the DMA errors.
>
> Chris
>
>
>
Thanks! That's what I was ultimately interested in. So, we now know
it's not the SERDES workaround. (Or maybe it needs to be performed at
a different time.)
^ permalink raw reply
* Re: [PATCH 0/3] compat-wireless: miscellaneous fixes
From: Luis R. Rodriguez @ 2010-08-17 22:02 UTC (permalink / raw)
To: Hauke Mehrtens; +Cc: linux-wireless, mcgrof
In-Reply-To: <1282069869-22300-1-git-send-email-hauke@hauke-m.de>
On Tue, Aug 17, 2010 at 11:31 AM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> This was build tested in combination with the patches to compat.
>
> Hauke Mehrtens (3):
> compat-wireless: deactivate namespace
> compat-wireless: make compat-2.6.37.c build
> compat-wireless: fix hidp_output_raw_report
Great thanks! Applied and pushed all out. Are any of these stable
fixes into the respective stable branches of compat-wireless.git? How
about the compat.git ones?
Luis
^ permalink raw reply
* Re: [PATCH 0/3] compat: miscellaneous fixes
From: Luis R. Rodriguez @ 2010-08-17 22:02 UTC (permalink / raw)
To: Hauke Mehrtens; +Cc: linux-wireless, mcgrof
In-Reply-To: <1282069953-22360-1-git-send-email-hauke@hauke-m.de>
On Tue, Aug 17, 2010 at 11:32 AM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> This was build tested in combination with the patches to compat-wireless.
>
> Hauke Mehrtens (3):
> compat: backport init_dummy_netdev
> compat: backport net_ns_type_operations
> compat: fix warning in device_rename
All applied and pushed out, thanks!
Luis
^ permalink raw reply
* Re: [PATCH 0/3] compat-wireless: miscellaneous fixes
From: Hauke Mehrtens @ 2010-08-17 22:56 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linux-wireless, mcgrof
In-Reply-To: <AANLkTinS=nXje5hJ=Eq4AuXvMUEhDbquB=C_oDXA+pHk@mail.gmail.com>
Am 18.08.2010 00:02, schrieb Luis R. Rodriguez:
> On Tue, Aug 17, 2010 at 11:31 AM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
>> This was build tested in combination with the patches to compat.
>>
>> Hauke Mehrtens (3):
>> compat-wireless: deactivate namespace
>> compat-wireless: make compat-2.6.37.c build
>> compat-wireless: fix hidp_output_raw_report
>
> Great thanks! Applied and pushed all out. Are any of these stable
> fixes into the respective stable branches of compat-wireless.git? How
> about the compat.git ones?
>
> Luis
Thanks for applying.
Only compat-wireless: fix hidp_output_raw_report is needed in stable.
The other patches are not needed in stable for now, they are for some
changes made after 2.6.36.
Hauke
^ permalink raw reply
* Re: [PATCH 0/3] compat-wireless: miscellaneous fixes
From: Luis R. Rodriguez @ 2010-08-17 23:48 UTC (permalink / raw)
To: Hauke Mehrtens; +Cc: linux-wireless, mcgrof
In-Reply-To: <4C6B1395.2030208@hauke-m.de>
On Tue, Aug 17, 2010 at 3:56 PM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> Am 18.08.2010 00:02, schrieb Luis R. Rodriguez:
>> On Tue, Aug 17, 2010 at 11:31 AM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
>>> This was build tested in combination with the patches to compat.
>>>
>>> Hauke Mehrtens (3):
>>> compat-wireless: deactivate namespace
>>> compat-wireless: make compat-2.6.37.c build
>>> compat-wireless: fix hidp_output_raw_report
>>
>> Great thanks! Applied and pushed all out. Are any of these stable
>> fixes into the respective stable branches of compat-wireless.git? How
>> about the compat.git ones?
>>
>> Luis
>
> Thanks for applying.
>
> Only compat-wireless: fix hidp_output_raw_report is needed in stable.
> The other patches are not needed in stable for now, they are for some
> changes made after 2.6.36.
OK cool, pushed this in for a new stable release for 2.6.36-rc1 so we
get a -2 now:
http://www.orbit-lab.org/kernel/compat-wireless-2.6-stable/v2.6.36/compat-wireless-2.6.36-rc1-2.tar.bz2
Luis
^ permalink raw reply
* [PATCH] mac80211: fix docbook
From: Johannes Berg @ 2010-08-18 11:27 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless
From: Johannes Berg <johannes.berg@intel.com>
Fix a small problem in the documentation for
ieee80211_request_smps.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/net/mac80211.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- wireless-testing.orig/include/net/mac80211.h 2010-08-18 13:26:33.000000000 +0200
+++ wireless-testing/include/net/mac80211.h 2010-08-18 13:26:43.000000000 +0200
@@ -2546,7 +2546,7 @@ void ieee80211_chswitch_done(struct ieee
/**
* ieee80211_request_smps - request SM PS transition
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
- * @mode: new SM PS mode
+ * @smps_mode: new SM PS mode
*
* This allows the driver to request an SM PS transition in managed
* mode. This is useful when the driver has more information than
^ permalink raw reply
* [PATCH v2] mac80211: fix docbook
From: Johannes Berg @ 2010-08-18 13:01 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless
In-Reply-To: <1282130871.3664.5.camel@jlt3.sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
Fix a small problem in the documentation for
ieee80211_request_smps, and a now erroneous
inclusion of enum ieee80211_key_alg, which no
longer exists after the change to ciphers.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
Documentation/DocBook/80211.tmpl | 1 -
include/net/mac80211.h | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
--- wireless-testing.orig/include/net/mac80211.h 2010-08-18 13:26:33.000000000 +0200
+++ wireless-testing/include/net/mac80211.h 2010-08-18 13:26:43.000000000 +0200
@@ -2546,7 +2546,7 @@ void ieee80211_chswitch_done(struct ieee
/**
* ieee80211_request_smps - request SM PS transition
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
- * @mode: new SM PS mode
+ * @smps_mode: new SM PS mode
*
* This allows the driver to request an SM PS transition in managed
* mode. This is useful when the driver has more information than
--- wireless-testing.orig/Documentation/DocBook/80211.tmpl 2010-08-18 14:53:44.000000000 +0200
+++ wireless-testing/Documentation/DocBook/80211.tmpl 2010-08-18 14:54:25.000000000 +0200
@@ -248,7 +248,6 @@ MISSING
<!-- intentionally multiple !F lines to get proper order -->
!Finclude/net/mac80211.h set_key_cmd
!Finclude/net/mac80211.h ieee80211_key_conf
-!Finclude/net/mac80211.h ieee80211_key_alg
!Finclude/net/mac80211.h ieee80211_key_flags
</chapter>
^ permalink raw reply
* [PATCH] nl80211: some documentation fixes
From: Johannes Berg @ 2010-08-18 13:30 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless
From: Johannes Berg <johannes.berg@intel.com>
The nl80211 documentation is currently never
generated, so problems have accumulated. Fix
most of the trivial ones.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/linux/nl80211.h | 57 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 46 insertions(+), 11 deletions(-)
--- wireless-testing.orig/include/linux/nl80211.h 2010-08-18 15:14:08.000000000 +0200
+++ wireless-testing/include/linux/nl80211.h 2010-08-18 15:28:23.000000000 +0200
@@ -347,6 +347,8 @@
* four bytes for vendor frames including the OUI. The registration
* cannot be dropped, but is removed automatically when the netlink
* socket is closed. Multiple registrations can be made.
+ * @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for
+ * backward compatibility
* @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
* command is used both as a request to transmit a management frame and
* as an event indicating reception of a frame that was not processed in
@@ -359,11 +361,14 @@
* operational channel). When called, this operation returns a cookie
* (%NL80211_ATTR_COOKIE) that will be included with the TX status event
* pertaining to the TX request.
+ * @NL80211_CMD_ACTION: Alias for @NL80211_CMD_FRAME for backward compatibility.
* @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame
* transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies
* the TX command and %NL80211_ATTR_FRAME includes the contents of the
* frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged
* the frame.
+ * @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for
+ * backward compatibility.
* @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command
* is used to configure connection quality monitoring notification trigger
* levels.
@@ -1034,11 +1039,14 @@ enum nl80211_iftype {
* Station flags. When a station is added to an AP interface, it is
* assumed to be already associated (and hence authenticated.)
*
+ * @__NL80211_STA_FLAG_INVALID: attribute number 0 is reserved
* @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X)
* @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames
* with short barker preamble
* @NL80211_STA_FLAG_WME: station is WME/QoS capable
* @NL80211_STA_FLAG_MFP: station uses management frame protection
+ * @NL80211_STA_FLAG_MAX: highest station flag number currently defined
+ * @__NL80211_STA_FLAG_AFTER_LAST: internal use
*/
enum nl80211_sta_flags {
__NL80211_STA_FLAG_INVALID,
@@ -1151,14 +1159,17 @@ enum nl80211_mpath_flags {
* information about a mesh path.
*
* @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved
- * @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination
- * @NL80211_ATTR_MPATH_SN: destination sequence number
- * @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path
- * @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now
- * @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in
+ * @NL80211_MPATH_INFO_FRAME_QLEN: number of queued frames for this destination
+ * @NL80211_MPATH_INFO_SN: destination sequence number
+ * @NL80211_MPATH_INFO_METRIC: metric (cost) of this mesh path
+ * @NL80211_MPATH_INFO_EXPTIME: expiration time for the path, in msec from now
+ * @NL80211_MPATH_INFO_FLAGS: mesh path flags, enumerated in
* &enum nl80211_mpath_flags;
- * @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
- * @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries
+ * @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
+ * @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
+ * @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number
+ * currently defind
+ * @__NL80211_MPATH_INFO_AFTER_LAST: internal use
*/
enum nl80211_mpath_info {
__NL80211_MPATH_INFO_INVALID,
@@ -1187,6 +1198,8 @@ enum nl80211_mpath_info {
* @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE
* @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n
* @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n
+ * @NL80211_BAND_ATTR_MAX: highest band attribute currently defined
+ * @__NL80211_BAND_ATTR_AFTER_LAST: internal use
*/
enum nl80211_band_attr {
__NL80211_BAND_ATTR_INVALID,
@@ -1207,6 +1220,7 @@ enum nl80211_band_attr {
/**
* enum nl80211_frequency_attr - frequency attributes
+ * @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
* @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
* regulatory domain.
@@ -1218,6 +1232,9 @@ enum nl80211_band_attr {
* on this channel in current regulatory domain.
* @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm
* (100 * dBm).
+ * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
+ * currently defined
+ * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
*/
enum nl80211_frequency_attr {
__NL80211_FREQUENCY_ATTR_INVALID,
@@ -1237,9 +1254,13 @@ enum nl80211_frequency_attr {
/**
* enum nl80211_bitrate_attr - bitrate attributes
+ * @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps
* @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported
* in 2.4 GHz band.
+ * @NL80211_BITRATE_ATTR_MAX: highest bitrate attribute number
+ * currently defined
+ * @__NL80211_BITRATE_ATTR_AFTER_LAST: internal use
*/
enum nl80211_bitrate_attr {
__NL80211_BITRATE_ATTR_INVALID,
@@ -1295,6 +1316,7 @@ enum nl80211_reg_type {
/**
* enum nl80211_reg_rule_attr - regulatory rule attributes
+ * @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional
* considerations for a given frequency range. These are the
* &enum nl80211_reg_rule_flags.
@@ -1311,6 +1333,9 @@ enum nl80211_reg_type {
* If you don't have one then don't send this.
* @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for
* a given frequency range. The value is in mBm (100 * dBm).
+ * @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number
+ * currently defined
+ * @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use
*/
enum nl80211_reg_rule_attr {
__NL80211_REG_RULE_ATTR_INVALID,
@@ -1362,6 +1387,9 @@ enum nl80211_reg_rule_flags {
* @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved
* @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel
* @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm)
+ * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
+ * currently defined
+ * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
*/
enum nl80211_survey_info {
__NL80211_SURVEY_INFO_INVALID,
@@ -1526,6 +1554,7 @@ enum nl80211_channel_type {
* enum nl80211_bss - netlink attributes for a BSS
*
* @__NL80211_BSS_INVALID: invalid
+ * @NL80211_BSS_BSSID: BSSID of the BSS (6 octets)
* @NL80211_BSS_FREQUENCY: frequency in MHz (u32)
* @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64)
* @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16)
@@ -1569,6 +1598,12 @@ enum nl80211_bss {
/**
* enum nl80211_bss_status - BSS "status"
+ * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS.
+ * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS.
+ * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS.
+ *
+ * The BSS status is a BSS attribute in scan dumps, which
+ * indicates the status the interface has wrt. this BSS.
*/
enum nl80211_bss_status {
NL80211_BSS_STATUS_AUTHENTICATED,
@@ -1686,8 +1721,8 @@ enum nl80211_tx_rate_attributes {
/**
* enum nl80211_band - Frequency band
- * @NL80211_BAND_2GHZ - 2.4 GHz ISM band
- * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz)
+ * @NL80211_BAND_2GHZ: 2.4 GHz ISM band
+ * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
*/
enum nl80211_band {
NL80211_BAND_2GHZ,
@@ -1725,9 +1760,9 @@ enum nl80211_attr_cqm {
/**
* enum nl80211_cqm_rssi_threshold_event - RSSI threshold event
- * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the
+ * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the
* configured threshold
- * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the
+ * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the
* configured threshold
*/
enum nl80211_cqm_rssi_threshold_event {
^ permalink raw reply
* [PATCH 1/2] ath9k_common: Move bt_stomp to common for sharing with ath9k_htc.
From: Vivek Natarajan @ 2010-08-18 14:27 UTC (permalink / raw)
To: linville; +Cc: linux-wireless
Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
---
drivers/net/wireless/ath/ath9k/ath9k.h | 8 ------
drivers/net/wireless/ath/ath9k/common.c | 31 ++++++++++++++++++++++++
drivers/net/wireless/ath/ath9k/common.h | 11 ++++++++
drivers/net/wireless/ath/ath9k/gpio.c | 40 ++++--------------------------
4 files changed, 48 insertions(+), 42 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index def0cd3..f0197a6 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -437,14 +437,6 @@ void ath_ani_calibrate(unsigned long data);
/* BTCOEX */
/**********/
-/* Defines the BT AR_BT_COEX_WGHT used */
-enum ath_stomp_type {
- ATH_BTCOEX_NO_STOMP,
- ATH_BTCOEX_STOMP_ALL,
- ATH_BTCOEX_STOMP_LOW,
- ATH_BTCOEX_STOMP_NONE
-};
-
struct ath_btcoex {
bool hw_timer_enabled;
spinlock_t btcoex_lock;
diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
index 3100c87..31cfe46 100644
--- a/drivers/net/wireless/ath/ath9k/common.c
+++ b/drivers/net/wireless/ath/ath9k/common.c
@@ -420,6 +420,37 @@ int ath9k_cmn_count_streams(unsigned int chainmask, int max)
}
EXPORT_SYMBOL(ath9k_cmn_count_streams);
+/*
+ * Configures appropriate weight based on stomp type.
+ */
+void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common,
+ enum ath_stomp_type stomp_type)
+{
+ struct ath_hw *ah = common->ah;
+
+ switch (stomp_type) {
+ case ATH_BTCOEX_STOMP_ALL:
+ ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+ AR_STOMP_ALL_WLAN_WGHT);
+ break;
+ case ATH_BTCOEX_STOMP_LOW:
+ ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+ AR_STOMP_LOW_WLAN_WGHT);
+ break;
+ case ATH_BTCOEX_STOMP_NONE:
+ ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+ AR_STOMP_NONE_WLAN_WGHT);
+ break;
+ default:
+ ath_print(common, ATH_DBG_BTCOEX,
+ "Invalid Stomptype\n");
+ break;
+ }
+
+ ath9k_hw_btcoex_enable(ah);
+}
+EXPORT_SYMBOL(ath9k_cmn_btcoex_bt_stomp);
+
static int __init ath9k_cmn_init(void)
{
return 0;
diff --git a/drivers/net/wireless/ath/ath9k/common.h b/drivers/net/wireless/ath/ath9k/common.h
index 97809d3..fcc3f9a 100644
--- a/drivers/net/wireless/ath/ath9k/common.h
+++ b/drivers/net/wireless/ath/ath9k/common.h
@@ -52,6 +52,14 @@
#define ATH_EP_RND(x, mul) \
((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
+/* Defines the BT AR_BT_COEX_WGHT used */
+enum ath_stomp_type {
+ ATH_BTCOEX_NO_STOMP,
+ ATH_BTCOEX_STOMP_ALL,
+ ATH_BTCOEX_STOMP_LOW,
+ ATH_BTCOEX_STOMP_NONE
+};
+
int ath9k_cmn_padpos(__le16 frame_control);
int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
void ath9k_cmn_update_ichannel(struct ieee80211_hw *hw,
@@ -65,3 +73,6 @@ int ath9k_cmn_key_config(struct ath_common *common,
void ath9k_cmn_key_delete(struct ath_common *common,
struct ieee80211_key_conf *key);
int ath9k_cmn_count_streams(unsigned int chainmask, int max);
+void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common,
+ enum ath_stomp_type stomp_type);
+
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c
index 3a8ee99..4a9a68b 100644
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
@@ -251,36 +251,6 @@ static void ath_detect_bt_priority(struct ath_softc *sc)
}
}
-/*
- * Configures appropriate weight based on stomp type.
- */
-static void ath9k_btcoex_bt_stomp(struct ath_softc *sc,
- enum ath_stomp_type stomp_type)
-{
- struct ath_hw *ah = sc->sc_ah;
-
- switch (stomp_type) {
- case ATH_BTCOEX_STOMP_ALL:
- ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
- AR_STOMP_ALL_WLAN_WGHT);
- break;
- case ATH_BTCOEX_STOMP_LOW:
- ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
- AR_STOMP_LOW_WLAN_WGHT);
- break;
- case ATH_BTCOEX_STOMP_NONE:
- ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
- AR_STOMP_NONE_WLAN_WGHT);
- break;
- default:
- ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
- "Invalid Stomptype\n");
- break;
- }
-
- ath9k_hw_btcoex_enable(ah);
-}
-
static void ath9k_gen_timer_start(struct ath_hw *ah,
struct ath_gen_timer *timer,
u32 timer_next,
@@ -319,6 +289,7 @@ static void ath_btcoex_period_timer(unsigned long data)
struct ath_softc *sc = (struct ath_softc *) data;
struct ath_hw *ah = sc->sc_ah;
struct ath_btcoex *btcoex = &sc->btcoex;
+ struct ath_common *common = ath9k_hw_common(ah);
u32 timer_period;
bool is_btscan;
@@ -328,7 +299,7 @@ static void ath_btcoex_period_timer(unsigned long data)
spin_lock_bh(&btcoex->btcoex_lock);
- ath9k_btcoex_bt_stomp(sc, is_btscan ? ATH_BTCOEX_STOMP_ALL :
+ ath9k_cmn_btcoex_bt_stomp(common, is_btscan ? ATH_BTCOEX_STOMP_ALL :
btcoex->bt_stomp_type);
spin_unlock_bh(&btcoex->btcoex_lock);
@@ -359,17 +330,18 @@ static void ath_btcoex_no_stomp_timer(void *arg)
struct ath_softc *sc = (struct ath_softc *)arg;
struct ath_hw *ah = sc->sc_ah;
struct ath_btcoex *btcoex = &sc->btcoex;
+ struct ath_common *common = ath9k_hw_common(ah);
bool is_btscan = sc->sc_flags & SC_OP_BT_SCAN;
- ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
+ ath_print(common, ATH_DBG_BTCOEX,
"no stomp timer running\n");
spin_lock_bh(&btcoex->btcoex_lock);
if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan)
- ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_NONE);
+ ath9k_cmn_btcoex_bt_stomp(common, ATH_BTCOEX_STOMP_NONE);
else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)
- ath9k_btcoex_bt_stomp(sc, ATH_BTCOEX_STOMP_LOW);
+ ath9k_cmn_btcoex_bt_stomp(common, ATH_BTCOEX_STOMP_LOW);
spin_unlock_bh(&btcoex->btcoex_lock);
}
--
1.6.3.3
^ permalink raw reply related
* [PATCH 2/2] ath9k_htc: Add support for bluetooth coexistence.
From: Vivek Natarajan @ 2010-08-18 14:27 UTC (permalink / raw)
To: linville; +Cc: linux-wireless
In-Reply-To: <1282141669-9823-1-git-send-email-vnatarajan@atheros.com>
Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
---
drivers/net/wireless/ath/ath9k/Makefile | 3 +-
drivers/net/wireless/ath/ath9k/btcoex.c | 7 ++
drivers/net/wireless/ath/ath9k/hif_usb.c | 3 +-
drivers/net/wireless/ath/ath9k/htc.h | 42 ++++++--
drivers/net/wireless/ath/ath9k/htc_drv_gpio.c | 136 +++++++++++++++++++++++++
drivers/net/wireless/ath/ath9k/htc_drv_init.c | 42 +++++++-
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 12 ++
drivers/net/wireless/ath/ath9k/htc_hst.c | 4 +-
drivers/net/wireless/ath/ath9k/htc_hst.h | 2 +-
drivers/net/wireless/ath/ath9k/wmi.c | 2 +
drivers/net/wireless/ath/ath9k/wmi.h | 1 +
11 files changed, 232 insertions(+), 22 deletions(-)
create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile
index 973ae4f..4555e99 100644
--- a/drivers/net/wireless/ath/ath9k/Makefile
+++ b/drivers/net/wireless/ath/ath9k/Makefile
@@ -46,6 +46,7 @@ ath9k_htc-y += htc_hst.o \
htc_drv_txrx.o \
htc_drv_main.o \
htc_drv_beacon.o \
- htc_drv_init.o
+ htc_drv_init.o \
+ htc_drv_gpio.o
obj-$(CONFIG_ATH9K_HTC) += ath9k_htc.o
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c
index fb4ac15..6a92e57 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.c
+++ b/drivers/net/wireless/ath/ath9k/btcoex.c
@@ -168,6 +168,7 @@ EXPORT_SYMBOL(ath9k_hw_btcoex_set_weight);
static void ath9k_hw_btcoex_enable_3wire(struct ath_hw *ah)
{
struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
+ u32 val;
/*
* Program coex mode and weight registers to
@@ -177,6 +178,12 @@ static void ath9k_hw_btcoex_enable_3wire(struct ath_hw *ah)
REG_WRITE(ah, AR_BT_COEX_WEIGHT, btcoex_hw->bt_coex_weights);
REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex_hw->bt_coex_mode2);
+ if (AR_SREV_9271(ah)) {
+ val = REG_READ(ah, 0x50040);
+ val &= 0xFFFFFEFF;
+ REG_WRITE(ah, 0x50040, val);
+ }
+
REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1);
REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0);
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index 17e7a9a..495f189 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -920,7 +920,8 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
}
ret = ath9k_htc_hw_init(hif_dev->htc_handle,
- &hif_dev->udev->dev, hif_dev->device_id);
+ &hif_dev->udev->dev, hif_dev->device_id,
+ hif_dev->udev->product);
if (ret) {
ret = -EINVAL;
goto err_htc_hw_init;
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
index 43b9e21..75ecf6a 100644
--- a/drivers/net/wireless/ath/ath9k/htc.h
+++ b/drivers/net/wireless/ath/ath9k/htc.h
@@ -316,17 +316,32 @@ struct htc_beacon_config {
u8 dtim_count;
};
-#define OP_INVALID BIT(0)
-#define OP_SCANNING BIT(1)
-#define OP_FULL_RESET BIT(2)
-#define OP_LED_ASSOCIATED BIT(3)
-#define OP_LED_ON BIT(4)
-#define OP_PREAMBLE_SHORT BIT(5)
-#define OP_PROTECT_ENABLE BIT(6)
-#define OP_ASSOCIATED BIT(7)
-#define OP_ENABLE_BEACON BIT(8)
-#define OP_LED_DEINIT BIT(9)
-#define OP_UNPLUGGED BIT(10)
+struct ath_btcoex {
+ u32 bt_priority_cnt;
+ unsigned long bt_priority_time;
+ int bt_stomp_type; /* Types of BT stomping */
+ u32 btcoex_no_stomp;
+ u32 btcoex_period;
+ u32 btscan_no_stomp;
+};
+
+void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv);
+void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv);
+void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);
+
+#define OP_INVALID BIT(0)
+#define OP_SCANNING BIT(1)
+#define OP_FULL_RESET BIT(2)
+#define OP_LED_ASSOCIATED BIT(3)
+#define OP_LED_ON BIT(4)
+#define OP_PREAMBLE_SHORT BIT(5)
+#define OP_PROTECT_ENABLE BIT(6)
+#define OP_ASSOCIATED BIT(7)
+#define OP_ENABLE_BEACON BIT(8)
+#define OP_LED_DEINIT BIT(9)
+#define OP_UNPLUGGED BIT(10)
+#define OP_BT_PRIORITY_DETECTED BIT(11)
+#define OP_BT_SCAN BIT(12)
struct ath9k_htc_priv {
struct device *dev;
@@ -391,6 +406,9 @@ struct ath9k_htc_priv {
int cabq;
int hwq_map[WME_NUM_AC];
+ struct ath_btcoex btcoex;
+ struct delayed_work coex_period_work;
+ struct delayed_work duty_cycle_work;
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
struct ath9k_debug debug;
#endif
@@ -443,7 +461,7 @@ void ath9k_init_leds(struct ath9k_htc_priv *priv);
void ath9k_deinit_leds(struct ath9k_htc_priv *priv);
int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
- u16 devid);
+ u16 devid, char *product);
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
#ifdef CONFIG_PM
int ath9k_htc_resume(struct htc_target *htc_handle);
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
new file mode 100644
index 0000000..429715b
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
@@ -0,0 +1,136 @@
+#include "htc.h"
+
+/******************/
+/* BTCOEX */
+/******************/
+
+/*
+ * Detects if there is any priority bt traffic
+ */
+static void ath_detect_bt_priority(struct ath9k_htc_priv *priv)
+{
+ struct ath_btcoex *btcoex = &priv->btcoex;
+ struct ath_hw *ah = priv->ah;
+
+ if (ath9k_hw_gpio_get(ah, ah->btcoex_hw.btpriority_gpio))
+ btcoex->bt_priority_cnt++;
+
+ if (time_after(jiffies, btcoex->bt_priority_time +
+ msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) {
+ priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN);
+ /* Detect if colocated bt started scanning */
+ if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) {
+ ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
+ "BT scan detected");
+ priv->op_flags |= (OP_BT_SCAN |
+ OP_BT_PRIORITY_DETECTED);
+ } else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) {
+ ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
+ "BT priority traffic detected");
+ priv->op_flags |= OP_BT_PRIORITY_DETECTED;
+ }
+
+ btcoex->bt_priority_cnt = 0;
+ btcoex->bt_priority_time = jiffies;
+ }
+}
+
+/*
+ * This is the master bt coex work which runs for every
+ * 45ms, bt traffic will be given priority during 55% of this
+ * period while wlan gets remaining 45%
+ */
+static void ath_btcoex_period_work(struct work_struct *work)
+{
+ struct ath9k_htc_priv *priv = container_of(work, struct ath9k_htc_priv,
+ coex_period_work.work);
+ struct ath_btcoex *btcoex = &priv->btcoex;
+ struct ath_common *common = ath9k_hw_common(priv->ah);
+ u32 timer_period;
+ bool is_btscan;
+ int ret;
+ u8 cmd_rsp, aggr;
+
+ ath_detect_bt_priority(priv);
+
+ is_btscan = !!(priv->op_flags & OP_BT_SCAN);
+
+ aggr = priv->op_flags & OP_BT_PRIORITY_DETECTED;
+
+ WMI_CMD_BUF(WMI_AGGR_LIMIT_CMD, &aggr);
+
+ ath9k_cmn_btcoex_bt_stomp(common, is_btscan ? ATH_BTCOEX_STOMP_ALL :
+ btcoex->bt_stomp_type);
+
+ timer_period = is_btscan ? btcoex->btscan_no_stomp :
+ btcoex->btcoex_no_stomp;
+ ieee80211_queue_delayed_work(priv->hw, &priv->duty_cycle_work,
+ msecs_to_jiffies(timer_period));
+ ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work,
+ msecs_to_jiffies(btcoex->btcoex_period));
+}
+
+/*
+ * Work to time slice between wlan and bt traffic and
+ * configure weight registers
+ */
+static void ath_btcoex_duty_cycle_work(struct work_struct *work)
+{
+ struct ath9k_htc_priv *priv = container_of(work, struct ath9k_htc_priv,
+ duty_cycle_work.work);
+ struct ath_hw *ah = priv->ah;
+ struct ath_btcoex *btcoex = &priv->btcoex;
+ struct ath_common *common = ath9k_hw_common(ah);
+ bool is_btscan = priv->op_flags & OP_BT_SCAN;
+
+ ath_print(common, ATH_DBG_BTCOEX,
+ "time slice work for bt and wlan\n");
+
+ if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan)
+ ath9k_cmn_btcoex_bt_stomp(common, ATH_BTCOEX_STOMP_NONE);
+ else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)
+ ath9k_cmn_btcoex_bt_stomp(common, ATH_BTCOEX_STOMP_LOW);
+}
+
+void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv)
+{
+ struct ath_btcoex *btcoex = &priv->btcoex;
+
+ btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD;
+ btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *
+ btcoex->btcoex_period / 100;
+ btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) *
+ btcoex->btcoex_period / 100;
+ INIT_DELAYED_WORK(&priv->coex_period_work, ath_btcoex_period_work);
+ INIT_DELAYED_WORK(&priv->duty_cycle_work, ath_btcoex_duty_cycle_work);
+}
+
+/*
+ * (Re)start btcoex work
+ */
+
+void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)
+{
+ struct ath_btcoex *btcoex = &priv->btcoex;
+ struct ath_hw *ah = priv->ah;
+
+ ath_print(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
+ "Starting btcoex work");
+
+ btcoex->bt_priority_cnt = 0;
+ btcoex->bt_priority_time = jiffies;
+ priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN);
+ ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work, 0);
+}
+
+
+/*
+ * Cancel btcoex and bt duty cycle work.
+ */
+void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv)
+{
+ cancel_delayed_work_sync(&priv->coex_period_work);
+ cancel_delayed_work_sync(&priv->duty_cycle_work);
+
+}
+
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index 2d42791..695e2b0 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -41,6 +41,8 @@ MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
.max_power = 20, \
}
+#define ATH_HTC_BTCOEX_PRODUCT_ID "wb193"
+
static struct ieee80211_channel ath9k_2ghz_channels[] = {
CHAN2G(2412, 0), /* Channel 1 */
CHAN2G(2417, 1), /* Channel 2 */
@@ -605,7 +607,31 @@ static void ath9k_init_misc(struct ath9k_htc_priv *priv)
priv->ah->opmode = NL80211_IFTYPE_STATION;
}
-static int ath9k_init_priv(struct ath9k_htc_priv *priv, u16 devid)
+static void ath9k_init_btcoex(struct ath9k_htc_priv *priv)
+{
+ int qnum;
+
+ switch (priv->ah->btcoex_hw.scheme) {
+ case ATH_BTCOEX_CFG_NONE:
+ break;
+ case ATH_BTCOEX_CFG_3WIRE:
+ priv->ah->btcoex_hw.btactive_gpio = 7;
+ priv->ah->btcoex_hw.btpriority_gpio = 6;
+ priv->ah->btcoex_hw.wlanactive_gpio = 8;
+ priv->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
+ ath9k_hw_btcoex_init_3wire(priv->ah);
+ ath_htc_init_btcoex_work(priv);
+ qnum = priv->hwq_map[WME_AC_BE];
+ ath9k_hw_init_btcoex_hw(priv->ah, qnum);
+ break;
+ default:
+ WARN_ON(1);
+ break;
+ }
+}
+
+static int ath9k_init_priv(struct ath9k_htc_priv *priv,
+ u16 devid, char *product)
{
struct ath_hw *ah = NULL;
struct ath_common *common;
@@ -672,6 +698,11 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv, u16 devid)
ath9k_init_channels_rates(priv);
ath9k_init_misc(priv);
+ if (product && strncmp(product, ATH_HTC_BTCOEX_PRODUCT_ID, 5) == 0) {
+ ah->btcoex_hw.scheme = ATH_BTCOEX_CFG_3WIRE;
+ ath9k_init_btcoex(priv);
+ }
+
return 0;
err_queues:
@@ -734,7 +765,8 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
}
-static int ath9k_init_device(struct ath9k_htc_priv *priv, u16 devid)
+static int ath9k_init_device(struct ath9k_htc_priv *priv,
+ u16 devid, char *product)
{
struct ieee80211_hw *hw = priv->hw;
struct ath_common *common;
@@ -743,7 +775,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv, u16 devid)
struct ath_regulatory *reg;
/* Bring up device */
- error = ath9k_init_priv(priv, devid);
+ error = ath9k_init_priv(priv, devid, product);
if (error != 0)
goto err_init;
@@ -801,7 +833,7 @@ err_init:
}
int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
- u16 devid)
+ u16 devid, char *product)
{
struct ieee80211_hw *hw;
struct ath9k_htc_priv *priv;
@@ -835,7 +867,7 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
/* The device may have been unplugged earlier. */
priv->op_flags &= ~OP_UNPLUGGED;
- ret = ath9k_init_device(priv, devid);
+ ret = ath9k_init_device(priv, devid, product);
if (ret)
goto err_init;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index 4e345be..5e318cb 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1210,6 +1210,12 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
ieee80211_wake_queues(hw);
+ if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
+ ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+ AR_STOMP_LOW_WLAN_WGHT);
+ ath9k_hw_btcoex_enable(ah);
+ ath_htc_resume_btcoex_work(priv);
+ }
mutex_unlock(&priv->mutex);
return ret;
@@ -1254,6 +1260,12 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
"Monitor interface removed\n");
}
+ if (ah->btcoex_hw.enabled) {
+ ath9k_hw_btcoex_disable(ah);
+ if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
+ ath_htc_cancel_btcoex_work(priv);
+ }
+
ath9k_hw_phy_disable(ah);
ath9k_hw_disable(ah);
ath9k_hw_configpcipowersave(ah, 1, 1);
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c
index 705c0f3..861ec92 100644
--- a/drivers/net/wireless/ath/ath9k/htc_hst.c
+++ b/drivers/net/wireless/ath/ath9k/htc_hst.c
@@ -462,9 +462,9 @@ void ath9k_htc_hw_free(struct htc_target *htc)
}
int ath9k_htc_hw_init(struct htc_target *target,
- struct device *dev, u16 devid)
+ struct device *dev, u16 devid, char *product)
{
- if (ath9k_htc_probe_device(target, dev, devid)) {
+ if (ath9k_htc_probe_device(target, dev, devid, product)) {
printk(KERN_ERR "Failed to initialize the device\n");
return -ENODEV;
}
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.h b/drivers/net/wireless/ath/ath9k/htc_hst.h
index faba679..07b6509 100644
--- a/drivers/net/wireless/ath/ath9k/htc_hst.h
+++ b/drivers/net/wireless/ath/ath9k/htc_hst.h
@@ -239,7 +239,7 @@ struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
struct device *dev);
void ath9k_htc_hw_free(struct htc_target *htc);
int ath9k_htc_hw_init(struct htc_target *target,
- struct device *dev, u16 devid);
+ struct device *dev, u16 devid, char *product);
void ath9k_htc_hw_deinit(struct htc_target *target, bool hot_unplug);
#endif /* HTC_HST_H */
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
index 6260faa..45fe9ca 100644
--- a/drivers/net/wireless/ath/ath9k/wmi.c
+++ b/drivers/net/wireless/ath/ath9k/wmi.c
@@ -85,6 +85,8 @@ static const char *wmi_cmd_to_name(enum wmi_cmd_id wmi_cmd)
return "WMI_TGT_DETACH_CMDID";
case WMI_TGT_TXQ_ENABLE_CMDID:
return "WMI_TGT_TXQ_ENABLE_CMDID";
+ case WMI_AGGR_LIMIT_CMD:
+ return "WMI_AGGR_LIMIT_CMD";
}
return "Bogus";
diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
index 765db5f..a0bf857 100644
--- a/drivers/net/wireless/ath/ath9k/wmi.h
+++ b/drivers/net/wireless/ath/ath9k/wmi.h
@@ -71,6 +71,7 @@ enum wmi_cmd_id {
WMI_TX_AGGR_ENABLE_CMDID,
WMI_TGT_DETACH_CMDID,
WMI_TGT_TXQ_ENABLE_CMDID,
+ WMI_AGGR_LIMIT_CMD = 0x0026,
};
enum wmi_event_id {
--
1.6.3.3
^ permalink raw reply related
* [PATCH] Update ar9271.fw
From: Vivek Natarajan @ 2010-08-18 14:29 UTC (permalink / raw)
To: David.Woodhouse; +Cc: linux-wireless
* Enable bluetooth coexistence.
* Fix disconnection issue with WEP and TKIP noticed in some APs.
Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
---
ar9271.fw | Bin 51280 -> 51312 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/ar9271.fw b/ar9271.fw
index 0ec953b404c1912dc64fa3b0171cffae82b0f375..d0ee74a1c8dccb7cc21f5be90f1d4048fa9dbf9e 100644
GIT binary patch
delta 11372
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
delta 10631
zcmZvC30PCd7Vy0xDul3w5FrbMuw{jS$|l&LxZxJ5TJ+jBEnwAW74OA;3F5{ofpKF|
zBU%u(6@*q>ZF_MmwLB{>t%9gsUTbTgwNFA3!Te_eYXATH`M$Yl=FFLM&YU@O=FEi0
z7N@HgCrd%p{wl&!d4sTgu!XSf>mgqJSq?k^+|N*Y2un>c6h2|8#W1Zj(9gqC3*@zZ
zgyl#Al%~=^o!L^G;TUYGT2EN2fMZoXa8yDuzF<1gzaMb>f!qFAD953k{lEJU0Lufd
zgvFW$WfGKZC`E+jAn-eQny?(!L)i<OCA=I5GCf}j#KQL(O9S<dSIHAYy^MtMcI-g8
z<)|ZzbAX$Xu*B{pET00S&-S9T&M|QbMCz(O2OVcMaJ~)f!|xMD4nbH>f#}cgK*@t5
zCoE?{#j`@fa%Lp7Taeb}^&uIA@zz4L#brd~62j=sCyd{u0USvXq9TCM>wTCY6srL?
zLAjFy63lkHov>`0g&w%XxaAN=;rhQFn5kP(EKlR7^mNP*Xb5=%^j10Jwk2Z;TF)yX
za}eJ(BGH+!Z0R8^n*nYH3v346HY=g%p-du-tvQ6Hd<kKhU?D8IN1${;dlo>LPswVu
z+Es?iU4szo>f=3xFu)8fL!VAG5X2M^<m_9<S5F6-#(!H0qh}WM?j$VrAnhbbYXS>2
zwGft%r$T|n`h-tdszFjUxJ+F(l#ztxSS(>V-b7eFd`wtA@&y_r+QOeg3ei>m|Dr#^
zgZ=>1CPP^WWi_;a1|fT)TqTSy(0>X{=Sz^p7@{us=wiUnLOpIVnR2MX<XpO;^g!u_
z!otF70iOc(2LSIAgn<Kf;OKInuzUfY%W?_Jmn;-MwELhf1lUDbnnC&nQ1Jp7={!v7
z0yxR7?8bxcZ+n&M$Ct_b-Q;3ACe3M{n2t>gT!?sq#T>=X#`3`T-N#;Tsb=ME9)9%d
zyu@~+gkIy4NA68b3w*E515CKYliMy&^S-B6Oh^k{(B?7N{tb5y)_+8k^b{v>D*8Y#
zANHP@Hm3!SZ*0|jlg_*j0}LMGg?^2UAwO>ni291daejy%jO^x+zoGl1N}RuJmv<P`
zh@To)MXw~u2J|RK<oZ$OjPZchr#Wp$9<edx7Bn%|AgOGZ7seHh(Iw1ce_$V{IlFY|
zfj7An6hWdmMeO#L>SKyF4?GpDm=7IlB0SsmR3CH4s!ZM9VJJ|z<`5Y1AoIj8cp^jF
zJ*mDQP*$9h%tPgI6Wlu6O;rEA>sA1Lm(U+^o#bwGIo{vrpenw;PNgU_Use|e7J((V
z_|y5QKVIiu_QFQN^O_C^w;QPbB9u5<PM$(<jUFz}aY!jh?C@-oQvF$5<F+LgByRDf
z`m0dM=y?GJ+K-*o(Vloz)=jH=<Ro>1lIl;R`og!z1<-}aIU$%_fpiH;@_VYNVDoz>
z30>q`$<agy7bLRH+EFP~|69RU!j~>aI}%bPJ6tQtbbF;LQqfeNZeI`ZG{9_tXVH^{
zx49*0yk%%kqKcHGoWzCW?-q`_V`Z<xx>C>H9IzRd-**czg`-%OdNyxxazeFKexBVL
z$C^4!yM<I=hgxc6>(8@P-)*ED6XOzPB4Fw|;Y>7UjD!#P93@^ps^1Ik9HVwU&~DIR
z22_q8`g+Wwl;)e(;KPM}biT4WIA~tep&;-#Wlb<%nY@<ywQ5auSmn%}#$ELxHDMUJ
z<%Ny6jR-O=2+@(5`Xxao#*el%u7Ayg6o$7O*wa)mZ6cgCQoU9>lIl~T1BT(|pzYFj
zxyD3L&qY{WwaB0rjR_ScsHFy~FG4NNV(Tx$By{R|O-I#g(I~1fFf=N;H4_%3cTAf{
zu_^zZ5Yfoi8>;B>CW0()+h@^0_oouN6ijqXL-hrz1u#g|o)sZTj93t+&Eo2^$P4%R
ze1m%@sWXe>w4xZQ&ws0o=bYp`o39kasYTIhK|<@cuMVh0qfG=)Z5`4yn>ZS!7LCSc
z&%9$`uTs4mcfPM)qU<n)h~lYd-64v)lJwS@>GnPy?{S1EN+n2OkB4UwDvJ}liDm1{
zU5aA0qSttTkZT`sOyt<`*1n9N5+YiodNTiaTqTHC3iL`*Qd7A~G?ulhMX~B7v)D7N
zL93T*g@$0^IE^srJgWhlJo^P1$3|(&PDC8BYafRx<9(f5rM~p`<Ju#wTG1F2!Hp0Y
zN}ehOF)G2B@<kcBS?I&DmF7H-i6~a{?7Uun=E1d~=EZuqKgo4ZBh`YD9Y(DnUZ<Cb
z3tnpi9%Iv74)97Q@|-8KZS2qCq9mOt);Z71+0KbrL8d=HsNz}HJRQa!REv^KM7V}`
zb=}k9T7e<6xz(2rEl?<Pw`&B6cMPzP+dMYl$u3p(CEw2|U5F=^q!Gk7ozaNKrazy>
z>RDDRii{A9iTH~=-(kK!BwRGkL=1`GB|s%ykfh@g8lIC6jZ}isYQZ?PZJf$;tg<>t
zBZ$%oqCtR05Qn}Tmq?C9{o{rU-1ZwHCXgW$oKzFI!Bd4=K`aVN4)UVfJovp{Fu9}i
zBCOhs`#aDZ$&u!<fJk$RIdq79nEw2{QZQEgm)GjcN$hz3J+BjQM?8*5?>B1%1}%@!
zemq?J3E%ZIj^^yhH17CtK|Fg^2W#~x9A?q?of6vri-2~X61Ok0N$LG#BSeww4TV7m
zebepRJJ|LttssGVej)w&I7hG^x@`onV3a1o_lAjjx*OS(8_1tf!}u}eP4swtvfvyJ
znpFR9*u|UMJf!qaG+{!u^RDvOAm;TV^mxKN*~kvPPLUn1Slcdd=xlft9=cW+noafN
zsMxy-y*DvMR-}sZsV`SW`{Yf^D7p1wd$!Bjda7??<CTeWl3a@ZoD>e>(|@vtOhYM?
zr%V#C&AY_SIhsgrr=ei<4f#I5@2swp8S4s3mSyE^R)vUt%wF}U_pla~$aBB{zJLgk
zmyF)q{8#wm)gMjge;Ic`x?lF;H1wazN^?QLw;zN=2{rEqYsc1A`M5qbW;CR+zq8N4
zei>_Y8Sm>d-qB^e5s@(~JY%+rEMqO~CKuj}3je(UA@3+u0xz|IA2OdiWXOz+EZ02$
z>hij|YYM=hIBRL}<~~i7PrJVUj3(Nr!<0rW&VQ%CRP4t-Zaq|<fFr>{^ihhpd{_Rm
z)=SE<*$sKh3E68)IpF!KcN9wC&FgEbJd%cfNKu-j7a?G{ZP8Abvvn@+6ZcEPGo}o2
zO=1tb9_6!5)cTtIrNt7hz%x|j$?N2~xy{gtyjst1O*awZt?4CKcAp!vLm1NK6yC*g
z-ysa|A{}311sYx;Q&*dn)gstorYYdBg-b)`d#*V1>$cIEOLr8B6c@w7E=*-n-jrCg
zp~Fb^&W8<=u|}KmzBc0>6CrB{B-^}WxK8TH{&m3ffY(0n{Q~wXn6QiLomuE}+a#v<
zgbTPz9{2r%IIU&2&NA!r6@I7Jho9@NhAh0{&z5FBO3vJ$l<%u5Gb?9`c;(S9E;F1D
zL_0r?OMkA_mWg<mqtBMJmh@rvo1fLCKfi)TPTk_6(Im`*P%Jg8k9$#1!_Ze#-y_RW
z#I$sB5<=68NG~LxF8BEQ6;&YBa}mv$z6|n(FQ*5+Ykk$@MfL2{L<KWn1UpWfJ|C@O
z6?X52R&D4i>e=r)<0SL<({X-5JuPbUxD0;1B?`R%*-zoA-t~{d=XihnLx(ZKIH_H(
z<UMz`lM%BfQ9U1`<QeD4ZD^P=j68@UjK7d2NHjAa4o&OKAepkwLlYSUg4#{4Q)W0M
zr4de!P4#RPx<50EtUxnU#pFG-By~Jlhfb!3k~`7u)G+eDh<u%TBS&MHWd3p}PK&6&
z599Peq?YQHiadN2fg^?HQS0`HO;xg`Do6~nDBE4F)O^$0@Xg1q)ZdxyMvWklvNeSY
z<S;GR!o}@bFuT9sMUAhI4K0KeNAF8ls*|U+%T-ar^2vK=P`%3v#%refQnv5gjhn|&
z-3la`wQyLVN~#yrRj6QA961bKn3YRLqlvRa<(+LFp=Ui|qjx_YP|+XPyYT#Wy+%Dv
zN5!+l$bIPJ+4|A@n^|gYidyO^p%38dq&&r<ZM=4UhbOeUAt<!#HBv|YCJqpgk=-#k
z>}0D$@;Nc)+H2O<gRo^<lHfzxcD3LJSjDyte{wslUnHzQ<_=+BnJW;}R`77>zh=ZH
zbKV{Y@yoX7JF6qHvfnu^F7#xtQ1-j+CiV-e>u1(fBv(fAo7<a}8@KZ$^g)#uZ(S+L
zzBBY%-1<wy8WkJ``fiRyPz_w!z%~!cw(*7)a)_?8$mtCY+0YpA#(t8+|F-elv<1$b
zRoupycWRu-L+EbC1kOqq6q+d~4>wNCEGE?-bjX26zGrzBR*ah$){fhbx`5tY9kmm(
zQNTkTJzr2JuTk-~We4(C1iJXrwW|Z2aI(54N~q>-XR0Lv`Ut9jPh_rZ^AONS>8N-{
z9VMWT(eXHdFlzWV3h3i)9?d~?l%7$G&H)_8D4GTIhk(4iKI&9+Cv)wjfc^+GI6+4x
zGV00xbp6J-{U*Yt`7d*nrFkqfwp2hjw0T?%qodpywU094NM^}K0euos3OZ^6qt-$o
zTPmO%F_R`b${!@B+uuyL*9z#5G42zGW`LV4piiOY3q{J)uqhI5XMPzbpg+ZD%4hrp
ze&)A+0{Tpwhm1b!mdMY%=PIB-M<*8gaGdX=OAG(YSs_3lFAAHs!nwoBOL0{n_n}q{
zQSvPOLtaNlq}vaEy>EG~#4X-S6aRq9w!fsw?z<4{bjUT`p5s2)*Ym2+hE$8gln-Aa
z9yCWg9pa_iBVQ2z{HpH<w0g0U`~n?ZJZVIfI+<`>8~*90kB1MsEx6<31=p;ObsTiz
z$BU8lU;D@}(P#gX3EjUD)1#;*LNOhk=CuKCS=8fG=;6QQB#Zb<!pUYdddWQU9NN8P
zI_cT?pCvpFbUa=f;(OkYW{ZaFl7cmcImho*4bMFJHrz-4T!M7VvdK17y)2QO*?521
z4w7pDN<=SDB}>u8<<rUYNJwXsJ5W9?BQKy@ddc{UaDrY<Bl=#P#05bTdJy;b3)~Bc
z`z{U8KmI4~E0o3rlGD*zCV<qV3dSG&{ZmFC*mCj6q1Sok(spCrh$ADYzvgsU|9#9G
zwq+D-%daK$WyH(&_XQ7ZH&R`zFh{spImL5G35WV`4>Dwn$)kwMjwOQ|cV<&0w^dAk
zgPyFIHtF9Tp0HIkT2HN*tWe14D`05*kC3oywOTPpMt_U<GqfgY#ZEH%DrN7$tqiT0
zE2G;e`}gf~t$3J_zJ~HvrZ`<ccMaWKNs(t!<f;VnL$q|&Lg9^0gC^zbu_;vFL-p7R
zBKoEeU5b8RC5`+JI_Al7$35tf(%)mk$GF|$Xy3x^`?&qRqkS92tR6M#7+f<>ra9FC
zXiRge1@Lj2Qw@Mm(wq(hIF;s94d8T|leOL8Pq&9pm`wE$>IsuFtoy>^eSPRVLA)*z
z-GQ1`k0cAxZ>zZYSxNm^Qtw;R%&k}ijX1)gQJc@!8R?6HkfSoOEoRFj>ET$>@j
zt4gV=Q>n|k3(H%KMMm=_uG<+-Wx0&Lhs<mBarg5UwVTT4f<;@8_|ZS)&2`D+?41jD
z3b@awxnEblo78S9#NF713xeRJzfal4uw1BXt&;RWvUO^~j}rPPpfC{<wUKjip%48t
zn!8RO)6?d$@z?)?xq1B(dOQCQQadY0O1H3W$DSQuLfOuy+pj{16Vw0cFg9N}s-~X(
zQ9M&h|AOk*Nz6YDI0RQ`Bt-PD;k?!Eow5&gHQy=U&1u;L0bNX&br{dJ9&M+d-Nrhx
z4O*Q-drqKTVAd?i8PJt_ehqKFp&dpMy*<n*gnP*zPv=$A3m0m`YF5Gl_3Rrd{Xk6r
zc6_~xT_K~(G`!WW<x&k>P=`|1`zwEkyT<+Si^<^^Cx%}N)?Mm2wvOtiVBDj5|1ie$
zlgP3@bm$Sso<PD4A;b0v=s&#ahsdxYM7dEdkW1+QO6f;%KYR9e>+ykuslzCy{{)i_
z^isXqsCa|gyy%{_(=*+Et>8(gXShH?Jzon<;n><G+$p#xFY{LEoOk==`XDb=nQU=j
zs*wImL_cP;$~~_eeds-hHWXehYFkHzSJm&h8et$-{-(Op?GP8E=B)r>j=ES(|4%|c
zfhMF1$*^YJ0#B-U(&<$+t@ymeyU?o$XLI)po>0%>lHxdh!{dF~$A0v$V!8{pY>XgN
zP|wCdxZjA)GUsQ(>iJ6QVJLdd?9X|wM{k?u?#usaoe)%PW;l;Th?Aq?Jeq<ca{S0{
zG&#qge1sO}gmNC~kR?Y5dCvzqWurbDTy=P#Asom4pu_byISj#NA-S|^0`~@|+<^
zGWM6FpHa)SjY~EuNHP<Z<OY!$s4;f|r#A{oHp}5{CSh|vr(cA=+8hwy?>@*ID+lun
zQtF04&c97f^*iHvI<w8E6Ey;_UHVEd*MBKt1GuhJR*p>L*CP2Av9GQ5Xn`kN-`qky
z?FaX}qpuLcrR8ZaO5GCd`BUbJbLcHJ3%!nw@%t3CZA;>q-(SnHPRDoi6?Y8O(=YIw
zl8O3_#cxW7*v0~U+ymnGQShdOHaO_0-`Wb+pfxQAsfULUxz#)A>o$-44H*ZnzvNO^
zAa{%|+5n@|?WY|#H)kQu<{5S*Ey{6XE6WXw?mMv$_b0W>Wpp>1y>%bFf<4)~okRbP
z)^8gvq<g}7hjqL>%{<F7%|5UFo-+C=`es`=nU8w6<#|5UX?S+6m{6;az=nLPMrGS)
za{4^bf3|BmbT9JG8?U6FIb?qft`VYh4oQ{a@cR)2@xQPBW8I%UKsk95*$)Fo7j8?0
zY*j+{U1Y;js%pbR=x*x$R&+XV7TJj0@<)<2Xl#C3P+7hwJZ&gxK?fw6{UAnbA(mdm
z_algpO;rNw!5irF{1E3g@Ql?&J%~lW=ZCm#b=+F12ZhMDU@C`xjusSzn0J85a17T_
zJ&vOV?;<7dct}cBXi9xp%5ew)p&x_<rFJ9lpwy5f%Duu2{k`JXwj{c_88WWk%$V^f
zB*-SJC#6_l6xn)1I|tqb$*Q(}aBaruiR`Zt`V=;2Z=(5rq$A<&-JJhghv}=2c;zHq
ziOpG5PeOYZ%W6_XD<iA)s6J>;C>|IG($eh+E>ZYpuSW;zXpgeO>)dIm{Q6^sK$BoN
z*FyEg6bj(cvVpRn%@^FkLA|oH!lKO0FHo?JV3s1G_FO=rAp26Grru|Vkni@!x;9^a
z@x+EsH@AtppEoWuUk9TtgN5lIpKgDzL<nK5Ya=9M%9NI%lnaM~+Vw{i9dfG2JI|YK
zE}Yw*qs&d>!>NGde1{y~&U!rX!r|omuBp>_2W}l~1NF>va0@|5H<B775y4wsJk#Th
zG=MHU{njzfi8IubT89sq2hNFS-2Zn#yzk(E?JoxG{)f}_!inJ!3M>9HrNYt3k5&}~
z`O>}0-KA9TpFs4|`6RR*T(A3P%keyGOCElOE@7J~kM1k~Wcw3ZTr7tRR$;N!`}&{=
z3@{sShCmy4giK)v@oMoMs=Ep97&WY-EDL9Mz6?jgkXo^+B8Te!d}j~}+@%mR&VG!G
zgc&AfhRT>B{tP#Oabiuw8CPG1haT++@D_*}FA3u*WjthzyFcR=!0?g0L}upX0!xSF
zfs;VYc)LO*kV_aL)tw7pB9hBCe|3*&6}z=M@sE?Rirs7QWdmzFNVnQSgo#_l{No%<
zvfM%P51M7XV-8-WM7h{J(V2H>vJ<>0ptB`jb3sxj43;t?f5vBMqL)Joyga(Ka^Qe_
zA!})z(^nCYo`Gt^sqVR0WFVms6M8PEn&fc&URZEYCnIn~p%#U?dm=y4)0^=VGQNOv
zI!<ysVG<7BiI`SQb&vVZ3J|NE01!xqPMZrPZ*usZo<QxOg&Vhokx<<uFs%gBMgsi*
z(}oS26uYX~aaruH#F@9l&X|vs>JGdCd~mSp4!CBxjynhKDWkf@4q|AtaAB1&{#3VU
zZ4JL+1bdXJ9s-SY`>z-uAZ1`Ue~_;)6X-N#1~I|Qc>y_eHYX%>g@b3NW04e6CWz{W
zmC-6zNSI*CW`A{25HcYliSTqaWNfVCgoVv@ma_G}RQL`kfieFZ6olInCX}*0!W&V-
zgi*GK=vb-P43%GX3HJd*v~h{~V(trvvE7ASY;e$BSU4E{e|3NNVvRx2>2oY)yM`<5
z1;|mlPhF|T4a#=)x>dr!gFI!sB4JcgMt#@X37Sy0-|$p`14=F%j&*2$rNh)gceH(K
zB76rG_-s&tmwhK+Ne2OxtwG9Ypfcd=wqvhWMypF9ocI&5JJ>#08N)qifGErwR>i=E
z)43;ubtPsd9FAAp{;$Wi%g;AaHh5Av-!!l#Y~|Q_F|z#9w-|}Hk_};_4lF&MF=Z<m
zv@+Hfl-Y5Pb?5@jDO=t@`XVUXc2>U7%H3E?zM6np!a&C+*08Y_o>nA`9-ahv&f^y4
z^5N3KV=3FZo7P2E*PVK7vz_{D2Kc><iFBzW%k`^k0x?Z1WusTuxJc=uLOqVb`ZYB!
z{`3#UdiPGwK0Pxh2ov3+YzuE#K_z>NI+Vug(WBK9;Vqy7-9l=<E$zBh!)w7B&q3}x
z73L_)HubudtzT#zrskO#E6Fx2YS68X;b9d=NSTq8Eq%>EYm}p98t^d~HyV=wOu%!5
z9idRnb-+-?+~M@9m04iYb4~Cgk1Y~cC|i_}iB!&Gxg*InF&yV)j+luyC&h5tJub-{
zA9^=q9U@_3T$4H3(cljn9{5$LmX`yS!9@xflFY$wt>IZI8~)h^Lm7I!(^qK|4v6r<
zDv8;1l+6*0B)H~=aj{Y+j<WHPepf2_2im-ACE0;`cg2u5P}J^g=6JA2*Uo`0Gn(ou
z9T4AD7VHqub%f2XBFra&>MF+0o`6Rb0OTcbxUJX&y0*yZ-C6|%C(sN0P#Zdz>M{@R
zTF1bRF9)vI_JTJg@DoVK)P_@C5D>tET18fn*mx+Y^)i-~h${B@D-)&67)Y>9ghH!W
z4o`9{W&g&}3zmI8hixzst^>sP_xSn%@oUucDe3kfUz{6a#(>=RzQO4-papxQI9+h>
z-s?ZJOY<s(fJNO$ducv*rn(e^D+vtg634*-rv}v}edWXsN*>iE;c=608~#1PK}mHD
zM=s_5lecT*?NpaTog}J@FJ;C`n52Ql>l%WUR8n0-rOddOyQYi4*kr1Ul+wGQGC=#J
z7iE<T&CeP}tcd%=L~vHbIUcbZk{3;e`#G?rp8O?c#yfc9jr!#G0p3p@N|^}`-VW@4
z26#XDMM`gR@OEJD0hZnlwtLd)nAPA0zk#tYXZ++lMSQ>mI2{a>{d7y6nwLR6`MzF}
z8S${)FgW@OQdCSMC!(y1D7a%Esu%;0%Rg3(CnqCiWfWP2sLEvgo?96Uy|*h3fDu=P
zapgWt3>sghfab!grQ{U!eN`A-lI&Fzxl{d_X((l1qWARX5^f%U^_z}KyXXuOW*n;6
zmrc$<9{cl2BP!p&fSg%&U=x|zn0sI}Nxt6rg>{&dD8`RTZCDqs`ow9y*Li!*BacVX
z0n9AaaYz<D4u1Udc*MDt#eLi0aVzd#mW+|}4#aU&41RRc%RY~RK5n7``uv!wDE#nn
zavGX&I5ePw8({Ef<hQe6nYbGax3b(?;yiwfbFGal@f9;OP~qVq@^y6L@EhbfH0%SJ
z&M0DLlw{?uC|*n0z4!`G=T6U|3R1+RK<2Q+Jk(BdK%q`f05eleKSMJ=h=`nBxX!uN
z)2)@1F>~^l6KA~K&X5q|idM>)H(XpMI=6a3AHSUATFz0894=+jP{RlN$h&Ap%_t6S
zN84&f1kB|g^-|FS_oJlSQ4aqoN6O4|g$m`#KSN3x3f-y+bDxm@+zCf??ywnt%zWfl
zt0Lb-F}0(}x6u2w8gf1=uMHyKMxQ${Pim8gO@-rHMDIXjjzj@|`4IzYLMM+T;md>V
z$Rsiqjj5B8?;xs99J0WV$rLjg5++^Byz9-phXVJ8lm}M?RVu0=pkt{5W+AGm3nmw$
zFY8j_D>ym=z7vjy`Yy`L8GO}s_@j_nEM*q?G5<naj?OhNfvnGujv7v@_#8s1P^nfT
zz$g_;_==g-^9@2K(1#8a(bK)@X+WY%-M}p;dF32jpR)lEdKbZWuONVVA0YgY*^S%b
z?^eTizqgE83Q)HIx3p24;9KPbp9&#-@`Y>A{9`HPGE{p^ZuV!gB+POtL$jsOrvo{i
zB%D3C?vRrwfU0r<W?teApNIw30Sp6`a3Fm|f)C>QoDJ+XfV!2KiIOgbXCz#4G}S9h
zBX}${{pl&X`#Zr&Fy+rX;j6mjvmJv^wmBMK!B?r!l%GP(@%dynx_Ufl_=??Dz`|=q
zaNfF@Ay5qq&J!~$5%0s;sjJk%$CRm%Yp)L7MS$ft#BeD4ob@qcHScfCP<{+9WVkX&
zwgzY%L0L@Ww@6=lihx$J^=zp>vli|6aM8SVK%j~z@Q_f8GD<9F)(^av3}ynX(T{;w
z?`gxC4H9OtH?y`W`}9hnR+bV$`h<e4%Q?Qx;=CN-QjrysNn}{Fq|C;AE6}2uAH73v
zM2#OQUN`$OIm%6hs+3r?iQif-W;Ur060HX*dpDMXor;=&+n32z<_z<rr?eDcZ7iGD
z9Dun!hMBX0W!6D;M9dZ+X0tbNSDx5Su0>y-m@p+*8R_JlH*ry}Uczh@GTY9#7S=<|
z%XnL>ALh?&mobYJ>dg^riHMsL#ZABPn=)3exar?|$wUmL=BME!M9k!A+FYbeJ~GzJ
zqH~p-IBfZve3j$E5&~26W0s4-T>?QbMGam)#csTOiW<CpWqaUvkvF5zq59AO3Z9S#
zCge!U?>>2XKtY7RCu@9A55Jt=EkY?L-{s#Mal`s`4L5~D-HSq}Pfm8b=klGk!iU9I
z<GU1cZ;X-sc@thpsk?u}KiU9zG$fPnG@HNT*ihVhh~90qM;CZAMPjB*!jwuGi;OAp
zXLbZI#lB48-rx#lWmr|<zR>-O13~3-6ynS5+^hCxcKI==aZi(+!?_!bKK*1or}M3{
zQ#qW@RFr$_EwUZ`aB4B9GXPCHJxj71$#E73%j3=LX60r2!90Mv8{K&J^j1z|z59I*
zN;*^K0{?6^4gN=LnhD)GQ)8~M!oP75@Slc4f`egkE8&D;0hi!9pn({QVcA(?2!<sI
z#4rbZK)`>X0ltcGakQlb55pZJ30DU+5qu0Se8LUGvNXaS!{R>(Y<0_S1A+gG&Wr_n
zVMO6^LV#hBmhi@~IFArI@Cyka4EM|;M2`Mh#BfJHpYX-7qKWWxz@G^*hU;b#5)3P)
xgcQTVk%SDxf+E7-0Z$VF81B&%asqU+RK^m47*V;9P&9t@`4>Fy-w791{2wTs@`3;W
--
1.7.2.1
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox