* pull request: wireless 2013-10-03
From: John W. Linville @ 2013-10-03 20:10 UTC (permalink / raw)
To: davem; +Cc: linux-wireless, netdev, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 9847 bytes --]
Dave,
Here is another batch of fixes intended for the 3.12 stream...
For the mac80211 bits, Johannes says:
"This time I have two fixes for IBSS (including one for wext, hah), a fix
for extended rates IEs, an active monitor checking fix and a sysfs
registration race fix."
On top of those...
Amitkumar Karwar brings an mwifiex fix for an interrupt loss issue
w/ SDIO devices. The problem was due to a command timeout issue
introduced by an earlier patch.
Felix Fietkau a stall in the ath9k driver. This patch fixes the
regression introduced in the commit "ath9k: use software queues for
un-aggregated data packets".
Stanislaw Gruszka reverts an rt2x00 patch that was found to cause
connection problems with some devices.
Please let me know if there are problems!
John
---
The following changes since commit 569943d0639c85a451ea853087cbd5f738247dd9:
Merge branch 'mv643xx' (2013-10-02 17:11:50 -0400)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git for-davem
for you to fetch changes up to 1eea72f03a139146f341e450cf56934b2e01a4d3:
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem (2013-10-03 16:00:03 -0400)
----------------------------------------------------------------
Amitkumar Karwar (1):
mwifiex: fix SDIO interrupt lost issue
Bruno Randolf (1):
cfg80211: fix warning when using WEXT for IBSS
Chun-Yeow Yeoh (1):
mac80211: fix the setting of extended supported rate IE
Felix Fietkau (2):
mac80211: drop spoofed packets in ad-hoc mode
ath9k: fix powersave response handling for BA session packets
Johannes Berg (1):
cfg80211: fix sysfs registration race
John W. Linville (2):
Merge branch 'for-john' of git://git.kernel.org/.../jberg/mac80211
Merge branch 'master' of git://git.kernel.org/.../linville/wireless into for-davem
Luciano Coelho (1):
cfg80211: use the correct macro to check for active monitor support
Stanislaw Gruszka (1):
Revert "rt2x00pci: Use PCI MSIs whenever possible"
drivers/net/wireless/ath/ath9k/xmit.c | 9 ++++++---
drivers/net/wireless/mwifiex/main.c | 6 ++++--
drivers/net/wireless/rt2x00/rt2x00pci.c | 9 +--------
net/mac80211/rx.c | 3 +++
net/mac80211/util.c | 5 +----
net/wireless/core.c | 21 +++++++++++++--------
net/wireless/ibss.c | 3 +++
net/wireless/nl80211.c | 4 ++--
8 files changed, 33 insertions(+), 27 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 5ac713d..dd30452 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1969,15 +1969,18 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
struct ath_atx_tid *tid, struct sk_buff *skb)
{
+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ath_frame_info *fi = get_frame_info(skb);
struct list_head bf_head;
- struct ath_buf *bf;
-
- bf = fi->bf;
+ struct ath_buf *bf = fi->bf;
INIT_LIST_HEAD(&bf_head);
list_add_tail(&bf->list, &bf_head);
bf->bf_state.bf_type = 0;
+ if (tid && (tx_info->flags & IEEE80211_TX_CTL_AMPDU)) {
+ bf->bf_state.bf_type = BUF_AMPDU;
+ ath_tx_addto_baw(sc, tid, bf);
+ }
bf->bf_next = NULL;
bf->bf_lastbf = bf;
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index fd77833..c2b91f5 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -358,10 +358,12 @@ process_start:
}
} while (true);
- if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter))
+ spin_lock_irqsave(&adapter->main_proc_lock, flags);
+ if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) {
+ spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
goto process_start;
+ }
- spin_lock_irqsave(&adapter->main_proc_lock, flags);
adapter->mwifiex_processing = false;
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
index 76d95de..dc49e52 100644
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
@@ -105,13 +105,11 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
goto exit_release_regions;
}
- pci_enable_msi(pci_dev);
-
hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
if (!hw) {
rt2x00_probe_err("Failed to allocate hardware\n");
retval = -ENOMEM;
- goto exit_disable_msi;
+ goto exit_release_regions;
}
pci_set_drvdata(pci_dev, hw);
@@ -152,9 +150,6 @@ exit_free_reg:
exit_free_device:
ieee80211_free_hw(hw);
-exit_disable_msi:
- pci_disable_msi(pci_dev);
-
exit_release_regions:
pci_release_regions(pci_dev);
@@ -179,8 +174,6 @@ void rt2x00pci_remove(struct pci_dev *pci_dev)
rt2x00pci_free_reg(rt2x00dev);
ieee80211_free_hw(hw);
- pci_disable_msi(pci_dev);
-
/*
* Free the PCI device data.
*/
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 54395d7..674eac1 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -3056,6 +3056,9 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
case NL80211_IFTYPE_ADHOC:
if (!bssid)
return 0;
+ if (ether_addr_equal(sdata->vif.addr, hdr->addr2) ||
+ ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2))
+ return 0;
if (ieee80211_is_beacon(hdr->frame_control)) {
return 1;
} else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) {
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index e1b34a1..9c3200b 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2103,7 +2103,7 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
{
struct ieee80211_local *local = sdata->local;
struct ieee80211_supported_band *sband;
- int rate, skip, shift;
+ int rate, shift;
u8 i, exrates, *pos;
u32 basic_rates = sdata->vif.bss_conf.basic_rates;
u32 rate_flags;
@@ -2131,14 +2131,11 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
pos = skb_put(skb, exrates + 2);
*pos++ = WLAN_EID_EXT_SUPP_RATES;
*pos++ = exrates;
- skip = 0;
for (i = 8; i < sband->n_bitrates; i++) {
u8 basic = 0;
if ((rate_flags & sband->bitrates[i].flags)
!= rate_flags)
continue;
- if (skip++ < 8)
- continue;
if (need_basic && basic_rates & BIT(i))
basic = 0x80;
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 6715396..fe8d4f2 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -566,18 +566,13 @@ int wiphy_register(struct wiphy *wiphy)
/* check and set up bitrates */
ieee80211_set_bitrate_flags(wiphy);
-
+ rtnl_lock();
res = device_add(&rdev->wiphy.dev);
- if (res)
- return res;
-
- res = rfkill_register(rdev->rfkill);
if (res) {
- device_del(&rdev->wiphy.dev);
+ rtnl_unlock();
return res;
}
- rtnl_lock();
/* set up regulatory info */
wiphy_regulatory_register(wiphy);
@@ -606,6 +601,15 @@ int wiphy_register(struct wiphy *wiphy)
rdev->wiphy.registered = true;
rtnl_unlock();
+
+ res = rfkill_register(rdev->rfkill);
+ if (res) {
+ rfkill_destroy(rdev->rfkill);
+ rdev->rfkill = NULL;
+ wiphy_unregister(&rdev->wiphy);
+ return res;
+ }
+
return 0;
}
EXPORT_SYMBOL(wiphy_register);
@@ -640,7 +644,8 @@ void wiphy_unregister(struct wiphy *wiphy)
rtnl_unlock();
__count == 0; }));
- rfkill_unregister(rdev->rfkill);
+ if (rdev->rfkill)
+ rfkill_unregister(rdev->rfkill);
rtnl_lock();
rdev->wiphy.registered = false;
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c
index 39bff7d..403fe29 100644
--- a/net/wireless/ibss.c
+++ b/net/wireless/ibss.c
@@ -263,6 +263,8 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
if (chan->flags & IEEE80211_CHAN_DISABLED)
continue;
wdev->wext.ibss.chandef.chan = chan;
+ wdev->wext.ibss.chandef.center_freq1 =
+ chan->center_freq;
break;
}
@@ -347,6 +349,7 @@ int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
if (chan) {
wdev->wext.ibss.chandef.chan = chan;
wdev->wext.ibss.chandef.width = NL80211_CHAN_WIDTH_20_NOHT;
+ wdev->wext.ibss.chandef.center_freq1 = freq;
wdev->wext.ibss.channel_fixed = true;
} else {
/* cfg80211_ibss_wext_join will pick one if needed */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index af8d84a..626dc3b 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2421,7 +2421,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
change = true;
}
- if (flags && (*flags & NL80211_MNTR_FLAG_ACTIVE) &&
+ if (flags && (*flags & MONITOR_FLAG_ACTIVE) &&
!(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
return -EOPNOTSUPP;
@@ -2483,7 +2483,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
&flags);
- if (!err && (flags & NL80211_MNTR_FLAG_ACTIVE) &&
+ if (!err && (flags & MONITOR_FLAG_ACTIVE) &&
!(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
return -EOPNOTSUPP;
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply related
* Re: Ideas on why using WPA2 encryption speeds up many TCP connections?
From: Ben Greear @ 2013-10-03 19:17 UTC (permalink / raw)
To: Rick Jones; +Cc: netdev, linux-wireless@vger.kernel.org
In-Reply-To: <524DBC93.1070400@hp.com>
On 10/03/2013 11:50 AM, Rick Jones wrote:
> On 10/03/2013 11:27 AM, Ben Greear wrote:
>> I'm seeing something a bit strange and wondering if anyone had an
>> opinion on why...
>>
>> I am testing up to 200 wifi station systems, each with a TCP connection
>> running on them (download only, from VAP to stations).
>>
>> Without encryption (ie, open network), I see total throughput go from
>> about 108Mbps down to 69Mbps as I add more stations (I add 25 at a time,
>> so the 108Mbps is with 25 active, and 69Mbps is with 200 active).
>>
>> However, if I enable encryption, the throughput is actually higher
>> (111Mbps to 71Mbps). I'm doing encryption in software, so it adds a fair
>> bit of CPU load in this test. The numbers bounce around since this is
>> wifi after all, but in general encryption tends to win reliably in this
>> test.
>>
>> When testing with a single station (and 5 tcp streams with jacked up
>> snd/rcv buffers) the open networks perform significantly better at total throughput:
>> 263Mbps vs 246Mbps.
>>
>> Maybe the extra delay for decryption increases odds that GRO will take
>> affect for the many, slower streams (and maybe that will decrease ACK
>> traffic?)
>>
>> Any other ideas?
>
> Fewer times two or more stations step on one another? The recievers will only try to transmit when they receive data. Modulo timing, if the individual
> downloads are a bit slower, less chance of the receivers looking to send ACKs back through at the same time? Got any low-level stats for the health and well
> being of the wireless network?
The tcp connection stats are taken after running for 60 seconds, and I take 3-sec running averages
as well as 60 second averages. So, I think that it would have to be total decrease in ACKs,
not just timing, to make a difference. The 3 and 60 second stats show consistently higher throughput
with encryption when using 25+ stations/connections.
Also, it works out that the sending sockets all sort of send randomly as they
are able, so I don't think there would be any particular ACK flood seen..
I have great quantities of low level stats, but I have not dug into them in detail
just yet. In general, my RF environment in this test is fairly controlled, as
I am cabling the systems using good semi-rigid SMA cables and an RF attenuator.
There will be some external interference of course, as they are not in an
isolation chamber.
As for the difference in 1 stations vs 25+, then it is very likely related to
low level things like MPDU working better with a single station, and probably
better ACK avoidance (I recall about 20kpps download, 4kpps upload in a previous
test with a single station, which indicates to me we must not be acking every
packet-on-the-air..somehow).
(For grins, I played with the delayed-ack-segs from an out-of-tree patch and
can get TCP throughput up to 300Mbps by setting delayed ack segs to 64 in
single station/5 stream, open network test).
Thanks,
Ben
>
> rick jones
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply
* Re: Ideas on why using WPA2 encryption speeds up many TCP connections?
From: Rick Jones @ 2013-10-03 18:50 UTC (permalink / raw)
To: Ben Greear, netdev, linux-wireless@vger.kernel.org
In-Reply-To: <524DB6F6.6020405@candelatech.com>
On 10/03/2013 11:27 AM, Ben Greear wrote:
> I'm seeing something a bit strange and wondering if anyone had an
> opinion on why...
>
> I am testing up to 200 wifi station systems, each with a TCP connection
> running on them (download only, from VAP to stations).
>
> Without encryption (ie, open network), I see total throughput go from
> about 108Mbps down to 69Mbps as I add more stations (I add 25 at a time,
> so the 108Mbps is with 25 active, and 69Mbps is with 200 active).
>
> However, if I enable encryption, the throughput is actually higher
> (111Mbps to 71Mbps). I'm doing encryption in software, so it adds a fair
> bit of CPU load in this test. The numbers bounce around since this is
> wifi after all, but in general encryption tends to win reliably in this
> test.
>
> When testing with a single station (and 5 tcp streams with jacked up
> snd/rcv buffers) the open networks perform significantly better at total throughput:
> 263Mbps vs 246Mbps.
>
> Maybe the extra delay for decryption increases odds that GRO will take
> affect for the many, slower streams (and maybe that will decrease ACK
> traffic?)
>
> Any other ideas?
Fewer times two or more stations step on one another? The recievers
will only try to transmit when they receive data. Modulo timing, if the
individual downloads are a bit slower, less chance of the receivers
looking to send ACKs back through at the same time? Got any low-level
stats for the health and well being of the wireless network?
rick jones
^ permalink raw reply
* Ideas on why using WPA2 encryption speeds up many TCP connections?
From: Ben Greear @ 2013-10-03 18:27 UTC (permalink / raw)
To: netdev, linux-wireless@vger.kernel.org
I'm seeing something a bit strange and wondering if anyone had an opinion on why...
I am testing up to 200 wifi station systems, each with a TCP connection running
on them (download only, from VAP to stations).
Without encryption (ie, open network), I see total throughput go from
about 108Mbps down to 69Mbps as I add more stations (I add 25 at a time,
so the 108Mbps is with 25 active, and 69Mbps is with 200 active).
However, if I enable encryption, the throughput is actually higher
(111Mbps to 71Mbps). I'm doing encryption in software, so it adds a fair
bit of CPU load in this test. The numbers bounce around since this is
wifi after all, but in general encryption tends to win reliably in this
test.
When testing with a single station (and 5 tcp streams with jacked up snd/rcv buffers)
the open networks perform significantly better at total throughput: 263Mbps vs 246Mbps.
Maybe the extra delay for decryption increases odds that GRO will take
affect for the many, slower streams (and maybe that will decrease ACK traffic?)
Any other ideas?
Thanks,
Ben
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply
* [PATCH] Bluetooth: btmrvl: operate on 16-bit opcodes instead of ogf/ocf
From: Bing Zhao @ 2013-10-03 18:23 UTC (permalink / raw)
To: linux-bluetooth
Cc: Marcel Holtmann, Gustavo Padovan, Johan Hedberg, linux-wireless,
Amitkumar Karwar, Bing Zhao
Replace ogf/ocf and its packing with 16-bit opcodes.
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
---
drivers/bluetooth/btmrvl_drv.h | 19 +++++++++++--------
drivers/bluetooth/btmrvl_main.c | 21 +++++++++------------
2 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h
index f9d1833..e3b49c6 100644
--- a/drivers/bluetooth/btmrvl_drv.h
+++ b/drivers/bluetooth/btmrvl_drv.h
@@ -90,12 +90,12 @@ struct btmrvl_private {
#define MRVL_VENDOR_PKT 0xFE
-/* Bluetooth commands */
-#define BT_CMD_AUTO_SLEEP_MODE 0x23
-#define BT_CMD_HOST_SLEEP_CONFIG 0x59
-#define BT_CMD_HOST_SLEEP_ENABLE 0x5A
-#define BT_CMD_MODULE_CFG_REQ 0x5B
-#define BT_CMD_LOAD_CONFIG_DATA 0x61
+/* Vendor specific Bluetooth commands */
+#define BT_CMD_AUTO_SLEEP_MODE 0xFC23
+#define BT_CMD_HOST_SLEEP_CONFIG 0xFC59
+#define BT_CMD_HOST_SLEEP_ENABLE 0xFC5A
+#define BT_CMD_MODULE_CFG_REQ 0xFC5B
+#define BT_CMD_LOAD_CONFIG_DATA 0xFC61
/* Sub-commands: Module Bringup/Shutdown Request/Response */
#define MODULE_BRINGUP_REQ 0xF1
@@ -104,6 +104,11 @@ struct btmrvl_private {
#define MODULE_SHUTDOWN_REQ 0xF2
+/* Vendor specific Bluetooth events */
+#define BT_EVENT_AUTO_SLEEP_MODE 0x23
+#define BT_EVENT_HOST_SLEEP_CONFIG 0x59
+#define BT_EVENT_HOST_SLEEP_ENABLE 0x5A
+#define BT_EVENT_MODULE_CFG_REQ 0x5B
#define BT_EVENT_POWER_STATE 0x20
/* Bluetooth Power States */
@@ -111,8 +116,6 @@ struct btmrvl_private {
#define BT_PS_DISABLE 0x03
#define BT_PS_SLEEP 0x01
-#define OGF 0x3F
-
/* Host Sleep states */
#define HS_ACTIVATED 0x01
#define HS_DEACTIVATED 0x00
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index 6e7bd4e..b3dcb13 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -50,12 +50,10 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
if (hdr->evt == HCI_EV_CMD_COMPLETE) {
struct hci_ev_cmd_complete *ec;
- u16 opcode, ocf, ogf;
+ u16 opcode;
ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
opcode = __le16_to_cpu(ec->opcode);
- ocf = hci_opcode_ocf(opcode);
- ogf = hci_opcode_ogf(opcode);
if (priv->btmrvl_dev.sendcmdflag) {
priv->btmrvl_dev.sendcmdflag = false;
@@ -63,9 +61,8 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
wake_up_interruptible(&priv->adapter->cmd_wait_q);
}
- if (ogf == OGF) {
- BT_DBG("vendor event skipped: ogf 0x%4.4x ocf 0x%4.4x",
- ogf, ocf);
+ if ((opcode & 0xfc00) == 0xfc00) {
+ BT_DBG("vendor event skipped: opcode=%#4.4x", opcode);
kfree_skb(skb);
return false;
}
@@ -89,7 +86,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
}
switch (event->data[0]) {
- case BT_CMD_AUTO_SLEEP_MODE:
+ case BT_EVENT_AUTO_SLEEP_MODE:
if (!event->data[2]) {
if (event->data[1] == BT_PS_ENABLE)
adapter->psmode = 1;
@@ -102,7 +99,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
}
break;
- case BT_CMD_HOST_SLEEP_CONFIG:
+ case BT_EVENT_HOST_SLEEP_CONFIG:
if (!event->data[3])
BT_DBG("gpio=%x, gap=%x", event->data[1],
event->data[2]);
@@ -110,7 +107,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
BT_DBG("HSCFG command failed");
break;
- case BT_CMD_HOST_SLEEP_ENABLE:
+ case BT_EVENT_HOST_SLEEP_ENABLE:
if (!event->data[1]) {
adapter->hs_state = HS_ACTIVATED;
if (adapter->psmode)
@@ -121,7 +118,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
}
break;
- case BT_CMD_MODULE_CFG_REQ:
+ case BT_EVENT_MODULE_CFG_REQ:
if (priv->btmrvl_dev.sendcmdflag &&
event->data[1] == MODULE_BRINGUP_REQ) {
BT_DBG("EVENT:%s",
@@ -166,7 +163,7 @@ exit:
}
EXPORT_SYMBOL_GPL(btmrvl_process_event);
-static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 cmd_no,
+static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode,
const void *param, u8 len)
{
struct sk_buff *skb;
@@ -179,7 +176,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 cmd_no,
}
hdr = (struct hci_command_hdr *)skb_put(skb, HCI_COMMAND_HDR_SIZE);
- hdr->opcode = cpu_to_le16(hci_opcode_pack(OGF, cmd_no));
+ hdr->opcode = cpu_to_le16(opcode);
hdr->plen = len;
if (len)
--
1.8.0
^ permalink raw reply related
* RE: [PATCH v6 0/4] Bluetooth: btmrvl cal data downloading
From: Bing Zhao @ 2013-10-03 18:20 UTC (permalink / raw)
To: Marcel Holtmann
Cc: linux-bluetooth@vger.kernel.org, Gustavo Padovan, Johan Hedberg,
linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
Amitkumar Karwar
In-Reply-To: <1EB87650-8518-47BE-B0D7-4F78E09F8691@holtmann.org>
Hi Marcel,
> I have decided to apply all 4 patches to bluetooth-next. However please send a follow up patch that
> changes the code to operate on 16-bit opcodes and not the OGC/OCF and its packing.
I will send the follow-up patch shortly.
Thanks,
Bing
^ permalink raw reply
* [PATCH v2 4/4] rt2x00: rt2800lib: fix VGC programming for RT3572 and RT3593
From: Gabor Juhos @ 2013-10-03 18:00 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Gabor Juhos
In-Reply-To: <1380823243-11149-1-git-send-email-juhosg@openwrt.org>
According to the DPO_RT5572_LinuxSTA_2.6.1.3_20121022
reference driver, programming of the 'BBP 66' register
on the RT3572 and RT3593 chipsets must be done via the
'rt2800_bbp_write_with_rx_chain' function. This ensures
that value is correclty set for all RX chains.
References:
RT35xx_ChipAGCAdjust and RT35xx_SetAGCInitValue functions
in chips/rt35xx.c
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
drivers/net/wireless/rt2x00/rt2800lib.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 55b421f..f81e943 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4442,11 +4442,17 @@ static inline void rt2800_set_vgc(struct rt2x00_dev *rt2x00dev,
struct link_qual *qual, u8 vgc_level)
{
if (qual->vgc_level != vgc_level) {
- if (rt2x00_rt(rt2x00dev, RT5592)) {
+ if (rt2x00_rt(rt2x00dev, RT3572) ||
+ rt2x00_rt(rt2x00dev, RT3593)) {
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
+ vgc_level);
+ } else if (rt2x00_rt(rt2x00dev, RT5592)) {
rt2800_bbp_write(rt2x00dev, 83, qual->rssi > -65 ? 0x4a : 0x7a);
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level);
- } else
+ } else {
rt2800_bbp_write(rt2x00dev, 66, vgc_level);
+ }
+
qual->vgc_level = vgc_level;
qual->vgc_level_reg = vgc_level;
}
--
1.7.10
^ permalink raw reply related
* [PATCH v2 2/4] rt2x00: rt2800lib: fix VGC adjustment for RT3572 and RT3593
From: Gabor Juhos @ 2013-10-03 18:00 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Gabor Juhos
In-Reply-To: <1380823243-11149-1-git-send-email-juhosg@openwrt.org>
The Ralink DPO_RT5572_LinuxSTA_2.6.1.3_20121022
reference driver uses different RSSI threshold
and VGC adjustment values for the RT3572 and
RT3593 chipsets.
Update the rt2800_link_tuner function to use the
same values. Also change the comment in the function
to make it more generic.
References:
RT35xx_ChipAGCAdjust function in chips/rt35xx.c
RSSI_FOR_MID_LOW_SENSIBILITY constant in include/chip/rtmp_phy.h
RT3593_R66_MID_LOW_SENS_GET macro in include/chip/rt3593.h
RT3593_R66_NON_MID_LOW_SEMS_GET macro in include/chips/rt3593.h
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
drivers/net/wireless/rt2x00/rt2800lib.c | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 2690081..a619f2c 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4462,19 +4462,34 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C))
return;
- /*
- * When RSSI is better then -80 increase VGC level with 0x10, except
- * for rt5592 chip.
+
+ /* When RSSI is better than a certain threshold, increase VGC
+ * with a chip specific value in order to improve the balance
+ * between sensibility and noise isolation.
*/
vgc = rt2800_get_default_vgc(rt2x00dev);
- if (rt2x00_rt(rt2x00dev, RT5592)) {
+ switch (rt2x00dev->chip.rt) {
+ case RT3572:
+ case RT3593:
+ if (qual->rssi > -65) {
+ if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ)
+ vgc += 0x20;
+ else
+ vgc += 0x10;
+ }
+ break;
+
+ case RT5592:
if (qual->rssi > -65)
vgc += 0x20;
- } else {
+ break;
+
+ default:
if (qual->rssi > -80)
vgc += 0x10;
+ break;
}
rt2800_set_vgc(rt2x00dev, qual, vgc);
--
1.7.10
^ permalink raw reply related
* [PATCH v2 3/4] rt2x00: rt2800lib: fix default VGC values for RT3593
From: Gabor Juhos @ 2013-10-03 18:00 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Gabor Juhos
In-Reply-To: <1380823243-11149-1-git-send-email-juhosg@openwrt.org>
Update the rt2800_get_default_vgc function to use the same VGC
values that the DPO_RT5572_LinuxSTA_2.6.1.3_20121022 reference
driver uses.
References:
RT35xx_ChipAGCAdjust in chips/rt35xx.c
RT3593_R66_MID_LOW_SENS_GET macro in include/chip/rt3593.h
RT3593_R66_NON_MID_LOW_SEMS_GET macro in include/chips/rt3593.h
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
drivers/net/wireless/rt2x00/rt2800lib.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index a619f2c..55b421f 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4413,6 +4413,7 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
rt2x00_rt(rt2x00dev, RT3290) ||
rt2x00_rt(rt2x00dev, RT3390) ||
rt2x00_rt(rt2x00dev, RT3572) ||
+ rt2x00_rt(rt2x00dev, RT3593) ||
rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392) ||
rt2x00_rt(rt2x00dev, RT5592))
@@ -4422,6 +4423,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
} else { /* 5GHZ band */
if (rt2x00_rt(rt2x00dev, RT3572))
vgc = 0x22 + (rt2x00dev->lna_gain * 5) / 3;
+ else if (rt2x00_rt(rt2x00dev, RT3593))
+ vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
else if (rt2x00_rt(rt2x00dev, RT5592))
vgc = 0x24 + (2 * rt2x00dev->lna_gain);
else {
--
1.7.10
^ permalink raw reply related
* [PATCH v2 1/4] rt2x00: rt2800lib: fix VGC adjustment for RT5592
From: Gabor Juhos @ 2013-10-03 18:00 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Gabor Juhos, stable
In commit 3d81535ea5940446510a8a5cee1c6ad23c90c753
(rt2800: 5592: add chip specific vgc calculations)
the rt2800_link_tuner function has been modified to
adjust VGC level for the RT5592 chipset.
On the RT5592 chipset, the VGC level must be adjusted
only if rssi is greater than -65. However the current
code adjusts the VGC value by 0x10 regardless of the
actual chipset if the rssi value is between -80 and
-65.
Fix the broken behaviour by reordering the if-else
statements.
Cc: stable@vger.kernel.org
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
drivers/net/wireless/rt2x00/rt2800lib.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index f414978..2690081 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4469,10 +4469,13 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
vgc = rt2800_get_default_vgc(rt2x00dev);
- if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65)
- vgc += 0x20;
- else if (qual->rssi > -80)
- vgc += 0x10;
+ if (rt2x00_rt(rt2x00dev, RT5592)) {
+ if (qual->rssi > -65)
+ vgc += 0x20;
+ } else {
+ if (qual->rssi > -80)
+ vgc += 0x10;
+ }
rt2800_set_vgc(rt2x00dev, qual, vgc);
}
--
1.7.10
^ permalink raw reply related
* Re: pull request: bluetooth-next 2013-10-03
From: Gustavo Padovan @ 2013-10-03 17:48 UTC (permalink / raw)
To: linville, linux-wireless, linux-bluetooth, linux-kernel
In-Reply-To: <20131003174524.GA22728@joana>
[-- Attachment #1: Type: text/plain, Size: 8314 bytes --]
Hi John
I forgot to sign it. Signing now..
Gustavo
2013-10-03 Gustavo Padovan <gustavo@padovan.org>:
> Hi John,
>
> A series of patches for 3.12. The big work here is from Marcel and Johan. They
> did a lot of work in the L2CAP, HCI and MGMT layers. The most important ones
> are the addition of a new MGMT command to enable/disable LE advertisement and
> the introduction of the HCI user channel to allow applications to get directly
> and exclusive access to Bluetooth devices.
>
> Please pull, or let me know of any issues. Thanks!
>
> Gustavo
>
> --
> The following changes since commit f4e1a4d3ecbb9e42bdf8e7869ee8a4ebfa27fb20:
>
> rt2800: change initialization sequence to fix system freeze (2013-09-09 14:44:34 -0400)
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next for-upstream
>
> for you to fetch changes up to 4f3e219d95a3c31b916dcd5e2631c4e440736f79:
>
> Bluetooth: Only one command per L2CAP LE signalling is supported (2013-10-03 16:09:59 +0300)
>
> ----------------------------------------------------------------
> Amitkumar Karwar (4):
> Bluetooth: btmrvl: add btmrvl_send_sync_cmd() function
> Bluetooth: btmrvl: get rid of struct btmrvl_cmd
> Bluetooth: btmrvl: add setup handler
> Bluetooth: btmrvl: add calibration data download support
>
> Andre Guedes (2):
> Bluetooth: Fix security level for peripheral role
> Bluetooth: Fix encryption key size for peripheral role
>
> DoHyun Pyun (8):
> Bluetooth: Add the definition and structure for Set Reserved LT_ADDR
> Bluetooth: Add the definition and structure for Delete Reserved LT_ADDR
> Bluetooth: Add the definition and structure for Set CSB Data
> Bluetooth: Add the structure for Write Sync Train Parameters
> Bluetooth: Add the definition and structure for Set CSB
> Bluetooth: Add the definition for Start Synchronization Train
> Bluetooth: Add the definition and stcuture for Sync Train Complete
> Bluetooth: Add the definition for Slave Page Response Timeout
>
> Gianluca Anzolin (1):
> Bluetooth: don't release the port in rfcomm_dev_state_change()
>
> Gustavo Padovan (1):
> Merge git://git.kernel.org/.../bluetooth/bluetooth
>
> Johan Hedberg (25):
> Bluetooth: Introduce a new HCI_RFKILLED flag
> Bluetooth: Fix rfkill functionality during the HCI setup stage
> Bluetooth: Remove unused event mask struct
> Bluetooth: Fix double error response for l2cap_create_chan_req
> Bluetooth: Fix L2CAP error return used for failed channel lookups
> Bluetooth: Fix L2CAP Disconnect response for unknown CID
> Bluetooth: Fix L2CAP command reject reason
> Bluetooth: Fix sending responses to identified L2CAP response packets
> Bluetooth: Fix responding to invalid L2CAP signaling commands
> Bluetooth: Fix waiting for clearing of BT_SK_SUSPEND flag
> Bluetooth: Add synchronization train parameters reading support
> Bluetooth: Add event mask page 2 setting support
> Bluetooth: Add clarifying comment to bt_sock_wait_state()
> Bluetooth: Clean up socket locking in l2cap_sock_recvmsg
> Bluetooth: Fix busy return for mgmt_set_powered in some cases
> Bluetooth: Move mgmt response convenience functions to a better location
> Bluetooth: Use async request for LE enable/disable
> Bluetooth: Add new mgmt setting for LE advertising
> Bluetooth: Add new mgmt_set_advertising command
> Bluetooth: Refactor hci_dev_open to a separate hci_dev_do_open function
> Bluetooth: Fix workqueue synchronization in hci_dev_open
> Bluetooth: Introduce a new HCI_BREDR_ENABLED flag
> Bluetooth: Add a new mgmt_set_bredr command
> Bluetooth: Fix REJECTED vs NOT_SUPPORTED mgmt responses
> Bluetooth: Fix advertising data flags with disabled BR/EDR
>
> Ken O'Brien (1):
> Bluetooth: btusb: Add support for Belkin F8065bf
>
> Marcel Holtmann (35):
> Bluetooth: Refactor raw socket filter into more readable code
> Bluetooth: Fix handling of getpeername() for HCI sockets
> Bluetooth: Fix handling of getsockname() for HCI sockets
> Bluetooth: Report error for HCI reset ioctl when device is down
> Bluetooth: Fix error handling for HCI socket options
> Bluetooth: Restrict ioctls to HCI raw channel sockets
> Bluetooth: Introduce user channel flag for HCI devices
> Bluetooth: Introduce new HCI socket channel for user operation
> Bluetooth: Use devname:vhci module alias for virtual HCI driver
> Bluetooth: Add support creating virtual AMP controllers
> Bluetooth: Disable upper layer connections when user channel is active
> Bluetooth: Use GFP_KERNEL when cloning SKB in a workqueue
> Bluetooth: Only schedule raw queue when user channel is active
> Bluetooth: Use only 2 bits for controller type information
> Bluetooth: Replace BDADDR_LOCAL with BDADDR_NONE
> Bluetooth: Provide high speed configuration option
> Bluetooth: Send new settings event when changing high speed option
> Bluetooth: Require CAP_NET_ADMIN for HCI User Channel operation
> Bluetooth: Enable -D__CHECK_ENDIAN__ for sparse by default
> Bluetooth: Restrict disabling of HS when controller is powered off
> Bluetooth: Add management command for setting static address
> Bluetooth: Increment management interface revision
> Bluetooth: Fix memory leak with L2CAP signal channels
> Bluetooth: Restrict SSP setting changes to BR/EDR enabled controllers
> Bluetooth: Allow setting static address even if LE is disabled
> Bluetooth: Restrict loading of link keys to BR/EDR capable controllers
> Bluetooth: Restrict loading of long term keys to LE capable controllers
> Bluetooth: Allow changing device class when BR/EDR is disabled
> Bluetooth: Fix switch statement order for L2CAP fixed channels
> Bluetooth: Don't copy L2CAP LE signalling to raw sockets
> Bluetooth: SMP packets are only valid on LE connections
> Bluetooth: L2CAP connectionless channels are only valid for BR/EDR
> Bluetooth: Drop packets on ATT fixed channel on BR/EDR
> Bluetooth: Check minimum length of SMP packets
> Bluetooth: Only one command per L2CAP LE signalling is supported
>
> Peng Chen (1):
> Bluetooth: Add a new PID/VID 0cf3/e005 for AR3012.
>
> Peter Senna Tschudin (1):
> Bluetooth: Fix assignment of 0/1 to bool variables
>
> Raphael Kubo da Costa (1):
> Bluetooth: Add support for BCM20702A0 [0b05, 17cb]
>
> Syam Sidhardhan (1):
> Bluetooth: Fix ACL alive for long in case of non pariable devices
>
> drivers/bluetooth/Makefile | 2 +
> drivers/bluetooth/ath3k.c | 2 +
> drivers/bluetooth/btmrvl_drv.h | 12 +-
> drivers/bluetooth/btmrvl_main.c | 269 +++++++++++++++---------
> drivers/bluetooth/btmrvl_sdio.c | 15 +-
> drivers/bluetooth/btmrvl_sdio.h | 2 +
> drivers/bluetooth/btusb.c | 5 +
> drivers/bluetooth/hci_vhci.c | 170 ++++++++++-----
> include/net/bluetooth/bluetooth.h | 5 +-
> include/net/bluetooth/hci.h | 82 +++++++-
> include/net/bluetooth/hci_core.h | 2 +-
> include/net/bluetooth/l2cap.h | 1 +
> include/net/bluetooth/mgmt.h | 11 +
> net/bluetooth/Makefile | 2 +
> net/bluetooth/af_bluetooth.c | 41 ++++
> net/bluetooth/hci_conn.c | 4 +
> net/bluetooth/hci_core.c | 213 +++++++++++++++----
> net/bluetooth/hci_event.c | 23 ++-
> net/bluetooth/hci_sock.c | 204 ++++++++++++++----
> net/bluetooth/l2cap_core.c | 169 +++++++++------
> net/bluetooth/l2cap_sock.c | 20 +-
> net/bluetooth/mgmt.c | 562 ++++++++++++++++++++++++++++++++++++++++----------
> net/bluetooth/rfcomm/sock.c | 7 +-
> net/bluetooth/rfcomm/tty.c | 35 +---
> net/bluetooth/smp.c | 15 +-
> 25 files changed, 1390 insertions(+), 483 deletions(-)
>
>
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply
* pull request: bluetooth-next 2013-10-03
From: Gustavo Padovan @ 2013-10-03 17:45 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, linux-bluetooth, linux-kernel
Hi John,
A series of patches for 3.12. The big work here is from Marcel and Johan. They
did a lot of work in the L2CAP, HCI and MGMT layers. The most important ones
are the addition of a new MGMT command to enable/disable LE advertisement and
the introduction of the HCI user channel to allow applications to get directly
and exclusive access to Bluetooth devices.
Please pull, or let me know of any issues. Thanks!
Gustavo
--
The following changes since commit f4e1a4d3ecbb9e42bdf8e7869ee8a4ebfa27fb20:
rt2800: change initialization sequence to fix system freeze (2013-09-09 14:44:34 -0400)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next for-upstream
for you to fetch changes up to 4f3e219d95a3c31b916dcd5e2631c4e440736f79:
Bluetooth: Only one command per L2CAP LE signalling is supported (2013-10-03 16:09:59 +0300)
----------------------------------------------------------------
Amitkumar Karwar (4):
Bluetooth: btmrvl: add btmrvl_send_sync_cmd() function
Bluetooth: btmrvl: get rid of struct btmrvl_cmd
Bluetooth: btmrvl: add setup handler
Bluetooth: btmrvl: add calibration data download support
Andre Guedes (2):
Bluetooth: Fix security level for peripheral role
Bluetooth: Fix encryption key size for peripheral role
DoHyun Pyun (8):
Bluetooth: Add the definition and structure for Set Reserved LT_ADDR
Bluetooth: Add the definition and structure for Delete Reserved LT_ADDR
Bluetooth: Add the definition and structure for Set CSB Data
Bluetooth: Add the structure for Write Sync Train Parameters
Bluetooth: Add the definition and structure for Set CSB
Bluetooth: Add the definition for Start Synchronization Train
Bluetooth: Add the definition and stcuture for Sync Train Complete
Bluetooth: Add the definition for Slave Page Response Timeout
Gianluca Anzolin (1):
Bluetooth: don't release the port in rfcomm_dev_state_change()
Gustavo Padovan (1):
Merge git://git.kernel.org/.../bluetooth/bluetooth
Johan Hedberg (25):
Bluetooth: Introduce a new HCI_RFKILLED flag
Bluetooth: Fix rfkill functionality during the HCI setup stage
Bluetooth: Remove unused event mask struct
Bluetooth: Fix double error response for l2cap_create_chan_req
Bluetooth: Fix L2CAP error return used for failed channel lookups
Bluetooth: Fix L2CAP Disconnect response for unknown CID
Bluetooth: Fix L2CAP command reject reason
Bluetooth: Fix sending responses to identified L2CAP response packets
Bluetooth: Fix responding to invalid L2CAP signaling commands
Bluetooth: Fix waiting for clearing of BT_SK_SUSPEND flag
Bluetooth: Add synchronization train parameters reading support
Bluetooth: Add event mask page 2 setting support
Bluetooth: Add clarifying comment to bt_sock_wait_state()
Bluetooth: Clean up socket locking in l2cap_sock_recvmsg
Bluetooth: Fix busy return for mgmt_set_powered in some cases
Bluetooth: Move mgmt response convenience functions to a better location
Bluetooth: Use async request for LE enable/disable
Bluetooth: Add new mgmt setting for LE advertising
Bluetooth: Add new mgmt_set_advertising command
Bluetooth: Refactor hci_dev_open to a separate hci_dev_do_open function
Bluetooth: Fix workqueue synchronization in hci_dev_open
Bluetooth: Introduce a new HCI_BREDR_ENABLED flag
Bluetooth: Add a new mgmt_set_bredr command
Bluetooth: Fix REJECTED vs NOT_SUPPORTED mgmt responses
Bluetooth: Fix advertising data flags with disabled BR/EDR
Ken O'Brien (1):
Bluetooth: btusb: Add support for Belkin F8065bf
Marcel Holtmann (35):
Bluetooth: Refactor raw socket filter into more readable code
Bluetooth: Fix handling of getpeername() for HCI sockets
Bluetooth: Fix handling of getsockname() for HCI sockets
Bluetooth: Report error for HCI reset ioctl when device is down
Bluetooth: Fix error handling for HCI socket options
Bluetooth: Restrict ioctls to HCI raw channel sockets
Bluetooth: Introduce user channel flag for HCI devices
Bluetooth: Introduce new HCI socket channel for user operation
Bluetooth: Use devname:vhci module alias for virtual HCI driver
Bluetooth: Add support creating virtual AMP controllers
Bluetooth: Disable upper layer connections when user channel is active
Bluetooth: Use GFP_KERNEL when cloning SKB in a workqueue
Bluetooth: Only schedule raw queue when user channel is active
Bluetooth: Use only 2 bits for controller type information
Bluetooth: Replace BDADDR_LOCAL with BDADDR_NONE
Bluetooth: Provide high speed configuration option
Bluetooth: Send new settings event when changing high speed option
Bluetooth: Require CAP_NET_ADMIN for HCI User Channel operation
Bluetooth: Enable -D__CHECK_ENDIAN__ for sparse by default
Bluetooth: Restrict disabling of HS when controller is powered off
Bluetooth: Add management command for setting static address
Bluetooth: Increment management interface revision
Bluetooth: Fix memory leak with L2CAP signal channels
Bluetooth: Restrict SSP setting changes to BR/EDR enabled controllers
Bluetooth: Allow setting static address even if LE is disabled
Bluetooth: Restrict loading of link keys to BR/EDR capable controllers
Bluetooth: Restrict loading of long term keys to LE capable controllers
Bluetooth: Allow changing device class when BR/EDR is disabled
Bluetooth: Fix switch statement order for L2CAP fixed channels
Bluetooth: Don't copy L2CAP LE signalling to raw sockets
Bluetooth: SMP packets are only valid on LE connections
Bluetooth: L2CAP connectionless channels are only valid for BR/EDR
Bluetooth: Drop packets on ATT fixed channel on BR/EDR
Bluetooth: Check minimum length of SMP packets
Bluetooth: Only one command per L2CAP LE signalling is supported
Peng Chen (1):
Bluetooth: Add a new PID/VID 0cf3/e005 for AR3012.
Peter Senna Tschudin (1):
Bluetooth: Fix assignment of 0/1 to bool variables
Raphael Kubo da Costa (1):
Bluetooth: Add support for BCM20702A0 [0b05, 17cb]
Syam Sidhardhan (1):
Bluetooth: Fix ACL alive for long in case of non pariable devices
drivers/bluetooth/Makefile | 2 +
drivers/bluetooth/ath3k.c | 2 +
drivers/bluetooth/btmrvl_drv.h | 12 +-
drivers/bluetooth/btmrvl_main.c | 269 +++++++++++++++---------
drivers/bluetooth/btmrvl_sdio.c | 15 +-
drivers/bluetooth/btmrvl_sdio.h | 2 +
drivers/bluetooth/btusb.c | 5 +
drivers/bluetooth/hci_vhci.c | 170 ++++++++++-----
include/net/bluetooth/bluetooth.h | 5 +-
include/net/bluetooth/hci.h | 82 +++++++-
include/net/bluetooth/hci_core.h | 2 +-
include/net/bluetooth/l2cap.h | 1 +
include/net/bluetooth/mgmt.h | 11 +
net/bluetooth/Makefile | 2 +
net/bluetooth/af_bluetooth.c | 41 ++++
net/bluetooth/hci_conn.c | 4 +
net/bluetooth/hci_core.c | 213 +++++++++++++++----
net/bluetooth/hci_event.c | 23 ++-
net/bluetooth/hci_sock.c | 204 ++++++++++++++----
net/bluetooth/l2cap_core.c | 169 +++++++++------
net/bluetooth/l2cap_sock.c | 20 +-
net/bluetooth/mgmt.c | 562 ++++++++++++++++++++++++++++++++++++++++----------
net/bluetooth/rfcomm/sock.c | 7 +-
net/bluetooth/rfcomm/tty.c | 35 +---
net/bluetooth/smp.c | 15 +-
25 files changed, 1390 insertions(+), 483 deletions(-)
^ permalink raw reply
* Re: ath9k AR9287 status?
From: Bruno Randolf @ 2013-10-03 17:05 UTC (permalink / raw)
To: Bruno Randolf, Oleksij Rempel, linux-wireless, nbd, sujith; +Cc: Ingo Randolf
In-Reply-To: <5249A2F7.5090908@einfach.org>
On 09/30/2013 05:12 PM, Bruno Randolf wrote:
> On 09/30/2013 02:27 PM, Oleksij Rempel wrote:
>>>> Check:
>>>> - PCIe related power managment - ASPM.
>
> Hmm, disabling ASPM in the BIOS and per kernel command line
> (pcie_aspm=off) did not help.
>
>> I use 3.11 right now. In case of PCIe issue, backport wont help you.
>> Test completely new kernel.
>
> I'll try 3.11 later.
I just tried current wireless-testing (3.12.0-rc3-wl) and it shows the
same problems.
For reference:
Card: Unex DNXA-97 (AR9287) http://unex.com.tw/product/dnxa-97
Board: Advantech MIO-2261N (Atom N260)
ASPM is disabled in the BIOS and by pcie_aspm=off. Scanning seems to
work, but when I start up hostapd (v2.0, simple AP config) nothing
happens (no AP is found by clients). When I stop hostapd the system
freezes with "BUG: soft lockup - CPU#3 stuck for 23s! (hostapd:2250)"
bruno
^ permalink raw reply
* Re: [PATCH 2/3] rt2x00: rt2800lib: fix VGC level adjustment for RT3572 and RT3593
From: Gabor Juhos @ 2013-10-03 16:40 UTC (permalink / raw)
To: Gabor Juhos; +Cc: John Linville, linux-wireless, users
In-Reply-To: <1380650596-18659-2-git-send-email-juhosg@openwrt.org>
2013.10.01. 20:03 keltezéssel, Gabor Juhos írta:
> The Ralink DPO_RT5572_LinuxSTA_2.6.1.3_20121022
> reference driver uses different RSSI threshold
> and VGC adjustment values for the RT3572 and for
> the RT3593 chipsets.
>
> Update the rt2800_link_tuner function to use the
> same values. Also change the comment in the function
> to make it more generic.
>
> References:
>
> RT35xx_ChipAGCAdjust function in chips/rt35xx.c
> RSSI_FOR_MID_LOW_SENSIBILITY constant in include/chip/rtmp_phy.h
> RT3593_R66_MID_LOW_SENS_GET macro in include/chip/rt3593.h
> RT3593_R66_NON_MID_LOW_SEMS_GET macro in include/chips/rt3593.h
>
> Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
> ---
> drivers/net/wireless/rt2x00/rt2800lib.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 25c550a..0dd15b2 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -4465,17 +4465,25 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
>
> if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C))
> return;
> - /*
> - * When RSSI is better then -80 increase VGC level with 0x10, except
> - * for rt5592 chip.
> +
> + /* When RSSI is better than a certain threshold, increase VGC
> + * with a chip specific value in order to improve the balance
> + * between sensibility and noise isolation.
> */
>
> vgc = rt2800_get_default_vgc(rt2x00dev);
>
> - if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65)
> + if ((rt2x00_rt(rt2x00dev, RT3572) ||
> + rt2x00_rt(rt2x00dev, RT3593)) && qual->rssi > -65) {
> + if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ)
> + vgc += 0x20;
> + else
> + vgc += 0x10;
> + } else if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65) {
> vgc += 0x20;
> - else if (qual->rssi > -80)
> + } else if (qual->rssi > -80) {
> vgc += 0x10;
> + }
Erm, this seems broken even in the original code. If the rssi value is between
-65 and -80, vgc will be increased by 0x10 regardless of the actual chipset.
John, please skip this patch set. I will send a modified version.
-Gabor
^ permalink raw reply
* Re: Idea: wifi-over-ethernet (bear with me)
From: Erik Elmore @ 2013-10-03 16:08 UTC (permalink / raw)
To: Julian Calaby; +Cc: linux-wireless
In-Reply-To: <CA+=D8wnh59iQfmk8nDjnEZUBHpiZBXFBWwtGu_y_Ldy1b06Jnw@mail.gmail.com>
It occurs to me now that latency in the repeated frames may be causing
problems for me, but I'm not really certain. I'm not exactly sure how
best to test this idea, yet (needs more thought). Perhaps I could
have two linux-based devices at either end with debug-level logging
on.
I wonder how these so-called "wifi range extenders" work. I might
guess they're little more than repeater devices. I'll need to do some
research to find out whether or not they do any sort of processing of
the frames. If they do, then they will also need to know the
encryption keys or maybe they'll need to associate with an AP to
function. If that's the case, then it might not work for my needs.
In the end, my goal is to make it possible for Nintendo 3DS game
consoles to be able to "street pass" over the internet (I know this is
silly, but I have some spare time on my hands right now). I believe
that process works like ad-hoc networks, except it doesn't use beacons
to advertise and instead uses probe requests to a certain known value.
I'm guessing that is so the consoles don't appear on lists of
available networks for PC users. I also believe the session is
encrypted, but I have no insight yet as to how to guess the key. I
was hoping that a real-time repeater system would be adequate, so I
didn't have to process the frames.
+=
Erik Elmore
On Mon, Sep 30, 2013 at 11:39 PM, Erik Elmore <erik@erikelmore.com> wrote:
> There are a few big ideas, but the one big idea that got me started on
> this line of thought was to make it possible for devices that only
> support ad-hoc networks to function over great distances.
>
> On Mon, Sep 30, 2013 at 8:42 PM, Julian Calaby <julian.calaby@gmail.com> wrote:
>> Hi Erik,
>>
>> On Tue, Oct 1, 2013 at 5:40 AM, Erik Elmore <erik@erikelmore.com> wrote:
>>> Hello, linux-wireless. I have an idea that I'd like to get some
>>> feedback from you all. I admit this idea is weird/flawed/broken and
>>> seemingly useless, but I do have a practical application in mind, so
>>> please hear me out.
>>>
>>> Imagine two physical locations, site 1 and 2, that are well outside of
>>> normal wifi range of each other. Each site has a device that listens
>>> for a subset of wifi frames and then sends them over a distribution
>>> network to its counterpart at the other site. Each device will also
>>> re-transmit frames received via the distribution network. Let's call
>>> these devices listener1 and listener2.
>>>
>>> Each site also contains one client device that wants to form an ad-hoc
>>> network with the one in the other site. Assuming that listener1 and
>>> listener2 are configured to forward frames having a TA belonging to
>>> the client device in their site, is it feasible for these devices to
>>> form an ad-hoc network with the help of the listener devices?
>>
>> Firstly, what's the big plan? - I can't see any useful reason to
>> "tunnel" ad-hoc networks between two points, assuming that you did
>> have all the hardware and software working properly, what is the end
>> goal here, why do you need to have two devices at remote locations
>> form an ad-hoc network with each other? What goal do you have in mind
>> that wouldn't work with a normal managed network?
>>
>> Just so you know, this sort of setup is almost painfully easy to
>> achieve if you use managed networks. - You could simply have a VPN or
>> tunnelling setup of some type between the two access points and have
>> that bridged into the wireless network. This would be 100% transparent
>> as far as clients on the network would be concerned. My previous job
>> had a network that worked somewhat like that with VPNs connecting
>> three offices with WiFi, two data centres and several remote clients
>> into a "single" big network.
>>
>> Thanks,
>>
>> --
>> Julian Calaby
>>
>> Email: julian.calaby@gmail.com
>> Profile: http://www.google.com/profiles/julian.calaby/
>> .Plan: http://sites.google.com/site/juliancalaby/
^ permalink raw reply
* [PATCH/RFT 3/3] ath10k: fix scheduling while atomic config bug
From: Michal Kazior @ 2013-10-03 13:09 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
In-Reply-To: <1380805765-31521-1-git-send-email-michal.kazior@tieto.com>
Recent HTC/WMI changes introduced the bug. ath10k
was using _atomic iteration function with
sleepable functions.
mac80211 provides another iteration function but
it cannot be safely called in hw_config() callback
due to local->iflist_mtx being possibly acquired
already.
The patch uses internal vif list for iteration
purposes and removes/refactors no longer necessary
_iter functions.
Reported-By: Kalle Valo <kvalo@qca.qualcomm.com>
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 146 ++++++++++++++-------------------
1 file changed, 62 insertions(+), 84 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 292e5cd..df6f973 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -723,35 +723,30 @@ static void ath10k_control_ibss(struct ath10k_vif *arvif,
/*
* Review this when mac80211 gains per-interface powersave support.
*/
-static void ath10k_ps_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
+static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
{
- struct ath10k_generic_iter *ar_iter = data;
- struct ieee80211_conf *conf = &ar_iter->ar->hw->conf;
- struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
+ struct ath10k *ar = arvif->ar;
+ struct ieee80211_conf *conf = &ar->hw->conf;
enum wmi_sta_powersave_param param;
enum wmi_sta_ps_mode psmode;
int ret;
lockdep_assert_held(&arvif->ar->conf_mutex);
- if (vif->type != NL80211_IFTYPE_STATION)
- return;
+ if (arvif->vif->type != NL80211_IFTYPE_STATION)
+ return 0;
if (conf->flags & IEEE80211_CONF_PS) {
psmode = WMI_STA_PS_MODE_ENABLED;
param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
- ret = ath10k_wmi_set_sta_ps_param(ar_iter->ar,
- arvif->vdev_id,
- param,
+ ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
conf->dynamic_ps_timeout);
if (ret) {
ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
arvif->vdev_id);
- return;
+ return ret;
}
-
- ar_iter->ret = ret;
} else {
psmode = WMI_STA_PS_MODE_DISABLED;
}
@@ -759,11 +754,14 @@ static void ath10k_ps_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
arvif->vdev_id, psmode ? "enable" : "disable");
- ar_iter->ret = ath10k_wmi_set_psmode(ar_iter->ar, arvif->vdev_id,
- psmode);
- if (ar_iter->ret)
+ ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
+ if (ret) {
ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
psmode, arvif->vdev_id);
+ return ret;
+ }
+
+ return 0;
}
/**********************/
@@ -1919,9 +1917,10 @@ static void ath10k_stop(struct ieee80211_hw *hw)
cancel_work_sync(&ar->restart_work);
}
-static void ath10k_config_ps(struct ath10k *ar)
+static int ath10k_config_ps(struct ath10k *ar)
{
- struct ath10k_generic_iter ar_iter;
+ struct ath10k_vif *arvif;
+ int ret;
lockdep_assert_held(&ar->conf_mutex);
@@ -1930,17 +1929,17 @@ static void ath10k_config_ps(struct ath10k *ar)
* vdevs at this point we must not iterate over this interface list.
* This setting will be updated upon add_interface(). */
if (ar->state == ATH10K_STATE_RESTARTED)
- return;
-
- memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
- ar_iter.ar = ar;
+ return 0;
- ieee80211_iterate_active_interfaces_atomic(
- ar->hw, IEEE80211_IFACE_ITER_NORMAL,
- ath10k_ps_iter, &ar_iter);
+ list_for_each_entry(arvif, &ar->arvifs, list) {
+ ret = ath10k_mac_vif_setup_ps(arvif);
+ if (ret) {
+ ath10k_warn("could not setup powersave (%d)\n", ret);
+ break;
+ }
+ }
- if (ar_iter.ret)
- ath10k_warn("failed to set ps config (%d)\n", ar_iter.ret);
+ return ret;
}
static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
@@ -2834,86 +2833,65 @@ static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
* Both RTS and Fragmentation threshold are interface-specific
* in ath10k, but device-specific in mac80211.
*/
-static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
-{
- struct ath10k_generic_iter *ar_iter = data;
- struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
- u32 rts = ar_iter->ar->hw->wiphy->rts_threshold;
- lockdep_assert_held(&arvif->ar->conf_mutex);
+static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
+{
+ struct ath10k *ar = hw->priv;
+ struct ath10k_vif *arvif;
+ int ret;
/* During HW reconfiguration mac80211 reports all interfaces that were
* running until reconfiguration was started. Since FW doesn't have any
* vdevs at this point we must not iterate over this interface list.
* This setting will be updated upon add_interface(). */
- if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
- return;
-
- ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts_threshold %d\n",
- arvif->vdev_id, rts);
-
- ar_iter->ret = ath10k_mac_set_rts(arvif, rts);
- if (ar_iter->ret)
- ath10k_warn("Failed to set RTS threshold for VDEV: %d\n",
- arvif->vdev_id);
-}
-
-static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
-{
- struct ath10k_generic_iter ar_iter;
- struct ath10k *ar = hw->priv;
-
- memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
- ar_iter.ar = ar;
+ if (ar->state == ATH10K_STATE_RESTARTED)
+ return 0;
mutex_lock(&ar->conf_mutex);
- ieee80211_iterate_active_interfaces_atomic(
- hw, IEEE80211_IFACE_ITER_NORMAL,
- ath10k_set_rts_iter, &ar_iter);
+ list_for_each_entry(arvif, &ar->arvifs, list) {
+ ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
+ arvif->vdev_id, value);
+
+ ret = ath10k_mac_set_rts(arvif, value);
+ if (ret) {
+ ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
+ arvif->vdev_id, ret);
+ break;
+ }
+ }
mutex_unlock(&ar->conf_mutex);
- return ar_iter.ret;
+ return ret;
}
-static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
+static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
{
- struct ath10k_generic_iter *ar_iter = data;
- struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
- u32 frag = ar_iter->ar->hw->wiphy->frag_threshold;
-
- lockdep_assert_held(&arvif->ar->conf_mutex);
+ struct ath10k *ar = hw->priv;
+ struct ath10k_vif *arvif;
+ int ret;
/* During HW reconfiguration mac80211 reports all interfaces that were
* running until reconfiguration was started. Since FW doesn't have any
* vdevs at this point we must not iterate over this interface list.
* This setting will be updated upon add_interface(). */
- if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
- return;
-
- ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation_threshold %d\n",
- arvif->vdev_id, frag);
-
- ar_iter->ret = ath10k_mac_set_frag(arvif, frag);
- if (ar_iter->ret)
- ath10k_warn("Failed to set frag threshold for VDEV: %d\n",
- arvif->vdev_id);
-}
-
-static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
-{
- struct ath10k_generic_iter ar_iter;
- struct ath10k *ar = hw->priv;
-
- memset(&ar_iter, 0, sizeof(struct ath10k_generic_iter));
- ar_iter.ar = ar;
+ if (ar->state == ATH10K_STATE_RESTARTED)
+ return 0;
mutex_lock(&ar->conf_mutex);
- ieee80211_iterate_active_interfaces_atomic(
- hw, IEEE80211_IFACE_ITER_NORMAL,
- ath10k_set_frag_iter, &ar_iter);
+ list_for_each_entry(arvif, &ar->arvifs, list) {
+ ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
+ arvif->vdev_id, value);
+
+ ret = ath10k_mac_set_rts(arvif, value);
+ if (ret) {
+ ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
+ arvif->vdev_id, ret);
+ break;
+ }
+ }
mutex_unlock(&ar->conf_mutex);
- return ar_iter.ret;
+ return ret;
}
static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
--
1.7.9.5
^ permalink raw reply related
* [PATCH/RFT 1/3] ath10k: fix add_interface failure handling
From: Michal Kazior @ 2013-10-03 13:09 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
In-Reply-To: <1380805765-31521-1-git-send-email-michal.kazior@tieto.com>
If something failed along add_interface() setup it
was possible to leak a vdev id, vdev and peer.
This could end up with leaked FW state or FW crash
(assuming add_interface() failure wasn't a result of
a crash).
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 50 ++++++++++++++++++++++++---------
1 file changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 8684e03..7f8b258 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2001,18 +2001,17 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
ath10k_warn("Only one monitor interface allowed\n");
ret = -EBUSY;
- goto exit;
+ goto err;
}
bit = ffs(ar->free_vdev_map);
if (bit == 0) {
ret = -EBUSY;
- goto exit;
+ goto err;
}
arvif->vdev_id = bit - 1;
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
- ar->free_vdev_map &= ~(1 << arvif->vdev_id);
if (ar->p2p)
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
@@ -2048,26 +2047,32 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
arvif->vdev_subtype, vif->addr);
if (ret) {
ath10k_warn("WMI vdev create failed: ret %d\n", ret);
- goto exit;
+ goto err;
}
+ ar->free_vdev_map &= ~BIT(arvif->vdev_id);
+
vdev_param = ar->wmi.vdev_param->def_keyid;
ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
arvif->def_wep_key_index);
- if (ret)
+ if (ret) {
ath10k_warn("Failed to set default keyid: %d\n", ret);
+ goto err_vdev_delete;
+ }
vdev_param = ar->wmi.vdev_param->tx_encap_type;
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
ATH10K_HW_TXRX_NATIVE_WIFI);
- if (ret)
+ if (ret) {
ath10k_warn("Failed to set TX encap: %d\n", ret);
+ goto err_vdev_delete;
+ }
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
if (ret) {
ath10k_warn("Failed to create peer for AP: %d\n", ret);
- goto exit;
+ goto err_vdev_delete;
}
}
@@ -2076,38 +2081,57 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
param, value);
- if (ret)
+ if (ret) {
ath10k_warn("Failed to set RX wake policy: %d\n", ret);
+ goto err_peer_delete;
+ }
param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
param, value);
- if (ret)
+ if (ret) {
ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
+ goto err_peer_delete;
+ }
param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
param, value);
- if (ret)
+ if (ret) {
ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
+ goto err_peer_delete;
+ }
}
ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
- if (ret)
+ if (ret) {
ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
arvif->vdev_id, ret);
+ goto err_peer_delete;
+ }
ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
- if (ret)
+ if (ret) {
ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
arvif->vdev_id, ret);
+ goto err_peer_delete;
+ }
if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
ar->monitor_present = true;
-exit:
+ mutex_unlock(&ar->conf_mutex);
+ return 0;
+
+err_peer_delete:
+ if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
+ ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
+err_vdev_delete:
+ ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
+ ar->free_vdev_map &= ~BIT(arvif->vdev_id);
+err:
mutex_unlock(&ar->conf_mutex);
return ret;
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH/RFT 2/3] ath10k: track vif list internally
From: Michal Kazior @ 2013-10-03 13:09 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
In-Reply-To: <1380805765-31521-1-git-send-email-michal.kazior@tieto.com>
mac80211 interface interations functions have
peculiar locking issues. This patch introduces
internal (to ath10k) vif list that will be used
for vif iteration purposes.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
drivers/net/wireless/ath/ath10k/core.c | 2 ++
drivers/net/wireless/ath/ath10k/core.h | 3 +++
drivers/net/wireless/ath/ath10k/mac.c | 3 +++
3 files changed, 8 insertions(+)
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 7b5dd09..4d04dc8 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -710,6 +710,7 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
mutex_init(&ar->conf_mutex);
spin_lock_init(&ar->data_lock);
+ INIT_LIST_HEAD(&ar->arvifs);
INIT_LIST_HEAD(&ar->peers);
init_waitqueue_head(&ar->peer_mapping_wq);
@@ -817,6 +818,7 @@ int ath10k_core_start(struct ath10k *ar)
goto err_disconnect_htc;
ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1;
+ INIT_LIST_HEAD(&ar->arvifs);
return 0;
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index ce36daa..de20ac0 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -205,6 +205,8 @@ struct ath10k_peer {
#define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)
struct ath10k_vif {
+ struct list_head list;
+
u32 vdev_id;
enum wmi_vdev_type vdev_type;
enum wmi_vdev_subtype vdev_subtype;
@@ -402,6 +404,7 @@ struct ath10k {
/* protects shared structure data */
spinlock_t data_lock;
+ struct list_head arvifs;
struct list_head peers;
wait_queue_head_t peer_mapping_wq;
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 7f8b258..292e5cd 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2051,6 +2051,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
}
ar->free_vdev_map &= ~BIT(arvif->vdev_id);
+ list_add(&arvif->list, &ar->arvifs);
vdev_param = ar->wmi.vdev_param->def_keyid;
ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
@@ -2131,6 +2132,7 @@ err_peer_delete:
err_vdev_delete:
ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
ar->free_vdev_map &= ~BIT(arvif->vdev_id);
+ list_del(&arvif->list);
err:
mutex_unlock(&ar->conf_mutex);
return ret;
@@ -2153,6 +2155,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
spin_unlock_bh(&ar->data_lock);
ar->free_vdev_map |= 1 << (arvif->vdev_id);
+ list_del(&arvif->list);
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
--
1.7.9.5
^ permalink raw reply related
* [PATCH/RFT 0/3] ath10k: fixes
From: Michal Kazior @ 2013-10-03 13:09 UTC (permalink / raw)
To: ath10k; +Cc: linux-wireless, Michal Kazior
Hi,
This patchset addresses recently spotted issue
with (yet another) scheduling while atomic bug
(the other being WEP key index setting). This one
is related to hw_config() and powersave settings.
This comes from recent changes I've do to HTC/WMI.
WMI commands can now block so it's illegal to call
them in an atomic context anymore.
ath10k needs to setup some settings per-vdev (i.e.
per-interface) such as powersave, rts, fragmentation.
Until now mac80211 iteration functions were used.
However using non-atomic iteration function variant
doesn't solve the problem as it introduces an
issue with iflist_mtx deadlock in some cases.
I briefly tried to reproduce the issue Kalle
reported but was unsuccessful thus the "/RFT".
Michal Kazior (3):
ath10k: fix add_interface failure handling
ath10k: track vif list internally
ath10k: fix scheduling while atomic config bug
drivers/net/wireless/ath/ath10k/core.c | 2 +
drivers/net/wireless/ath/ath10k/core.h | 3 +
drivers/net/wireless/ath/ath10k/mac.c | 199 ++++++++++++++++----------------
3 files changed, 107 insertions(+), 97 deletions(-)
--
1.7.9.5
^ permalink raw reply
* [PATCH v2 1/2] rt2x00: rt2800lib: remove TXMIXER_GAIN entries from the extended EEPROM map
From: Gabor Juhos @ 2013-10-03 12:07 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Paul Menzel, Gabor Juhos
The comments are indicating that the TXMIXER_GAIN_BG
and TXMIXED_GAIN_A entries are overlapping with the
RSSI_BG2 and RSSI_A2 entries in the extended EEPROM
map. This is not correct, because the upper byte of
the RSSI_BG2 and RSSI_A2 entries are reserved. There
are no TX mixer gain values are stored at all in the
extended EEPROM.
Remove the initialization of these entries from the
extended EEPROM map to reflect this.
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Acked-by: Paul Menzel <paulepanter@users.sourceforge.net>
---
Changes since v1:
- improve commit message and fix a typo
- add Paul's Acked-by tag
---
drivers/net/wireless/rt2x00/rt2800lib.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index c706ddc..c979bb7 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -280,10 +280,8 @@ static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
[EEPROM_RSSI_BG] = 0x0028,
[EEPROM_TXPOWER_DELTA] = 0x0028, /* Overlaps with RSSI_BG */
[EEPROM_RSSI_BG2] = 0x0029,
- [EEPROM_TXMIXER_GAIN_BG] = 0x0029, /* Overlaps with RSSI_BG2 */
[EEPROM_RSSI_A] = 0x002a,
[EEPROM_RSSI_A2] = 0x002b,
- [EEPROM_TXMIXER_GAIN_A] = 0x002b, /* Overlaps with RSSI_A2 */
[EEPROM_TXPOWER_BG1] = 0x0030,
[EEPROM_TXPOWER_BG2] = 0x0037,
[EEPROM_EXT_TXPOWER_BG3] = 0x003e,
--
1.7.10
^ permalink raw reply related
* [PATCH v2 2/2] rt2x00: rt2800lib: remove TXPOWER_DELTA entry from extended EEPROM map
From: Gabor Juhos @ 2013-10-03 12:07 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users, Paul Menzel, Gabor Juhos
In-Reply-To: <1380802022-28646-1-git-send-email-juhosg@openwrt.org>
The TXPOWER_DELTA field of the regular EEPROM
stores the TX power compensation value for HT40.
The extended EEPROM has no such field, it stores
separate TX power values for HT20 and for HT40.
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Acked-by: Paul Menzel <paulepanter@users.sourceforge.net>
---
Changes since v1:
- add Paul's Acked-by tag
---
drivers/net/wireless/rt2x00/rt2800lib.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index c979bb7..315f4af 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -278,7 +278,6 @@ static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
[EEPROM_LNA] = 0x0026,
[EEPROM_EXT_LNA2] = 0x0027,
[EEPROM_RSSI_BG] = 0x0028,
- [EEPROM_TXPOWER_DELTA] = 0x0028, /* Overlaps with RSSI_BG */
[EEPROM_RSSI_BG2] = 0x0029,
[EEPROM_RSSI_A] = 0x002a,
[EEPROM_RSSI_A2] = 0x002b,
--
1.7.10
^ permalink raw reply related
* Re: [PATCH] rt2x00: rt2800lib: remove duplicate rf_vals for RF3053.
From: Gabor Juhos @ 2013-10-03 12:06 UTC (permalink / raw)
To: Kevin Lo; +Cc: John Linville, linux-wireless, users
In-Reply-To: <524D2139.4000608@kevlo.org>
2013.10.03. 9:48 keltezéssel, Kevin Lo írta:
> We already have rf_vals_3x with same values. Hence rf_vals_3053 is removed
> in this patch.
>
> Signed-off-by: Kevin Lo <kevlo@kevlo.org>
For completeness, the comment of rf_vals_3x should be updated to indicate that
it also supports RF3053. Otherwise the patch is fine.
-Gabor
^ permalink raw reply
* Re: [rt2x00-users] [PATCH 1/2] rt2x00: rt2800lib: remove TXMIXER_GAIN entries from the extended EEPROM map
From: Gabor Juhos @ 2013-10-03 12:05 UTC (permalink / raw)
To: Paul Menzel; +Cc: John Linville, linux-wireless, users
In-Reply-To: <1380789509.8125.6.camel@mattotaupa>
Dear Paul,
<...>
>> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
>> index c706ddc..c979bb7 100644
>> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
>> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
>> @@ -280,10 +280,8 @@ static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
>> [EEPROM_RSSI_BG] = 0x0028,
>> [EEPROM_TXPOWER_DELTA] = 0x0028, /* Overlaps with RSSI_BG */
>> [EEPROM_RSSI_BG2] = 0x0029,
>> - [EEPROM_TXMIXER_GAIN_BG] = 0x0029, /* Overlaps with RSSI_BG2 */
>> [EEPROM_RSSI_A] = 0x002a,
>> [EEPROM_RSSI_A2] = 0x002b,
>> - [EEPROM_TXMIXER_GAIN_A] = 0x002b, /* Overlaps with RSSI_A2 */
>> [EEPROM_TXPOWER_BG1] = 0x0030,
>> [EEPROM_TXPOWER_BG2] = 0x0037,
>> [EEPROM_EXT_TXPOWER_BG3] = 0x003e,
>
> Do you know if this fixes any problems and should be backported to
> stable?
This is a cleanup patch, it does not fix any problem. The removed entries are
not used by the code at all.
> If any testing can be done on
>
> idVendor 0x148f Ralink Technology, Corp.
> idProduct 0x2870 RT2870 Wireless Adapter
>
> please tell me.
The extended EEPROM map is used only for the RT3593 chipset, it does not affect
RT2870 in any way.
>
> With the fixes above,
>
> Acked-by: Paul Menzel <paulepanter@users.sourceforge.net>
Thank you for the review! I will send an updated version.
-Gabor
^ permalink raw reply
* [PATCH 3/3] brcmsmac: add support for a BCM4313 with PCI id 0x4313
From: Hauke Mehrtens @ 2013-10-03 11:49 UTC (permalink / raw)
To: linville
Cc: linux-wireless, zajec5, arend, brcm80211-dev-list, jogo,
Hauke Mehrtens
In-Reply-To: <1380800951-28643-1-git-send-email-hauke@hauke-m.de>
There are some BCM4313 out there with a PCI id of 0x4313. These devices
are missing a sprom and are only used on routers or other embedded
devices. We found one connected to a BCM63XX SoC.
This devices was found by someone in this ticket:
https://dev.openwrt.org/ticket/13551
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
drivers/net/wireless/brcm80211/brcmsmac/main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 4608e0e..df6229e 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -5695,7 +5695,7 @@ static bool brcms_c_chipmatch_pci(struct bcma_device *core)
return true;
if ((device == BCM43224_D11N_ID) || (device == BCM43225_D11N2G_ID))
return true;
- if (device == BCM4313_D11N2G_ID)
+ if (device == BCM4313_D11N2G_ID || device == BCM4313_CHIP_ID)
return true;
if ((device == BCM43236_D11N_ID) || (device == BCM43236_D11N2G_ID))
return true;
--
1.7.10.4
^ permalink raw reply related
* [PATCH 2/3] bcma: add PCI id 0x4313
From: Hauke Mehrtens @ 2013-10-03 11:49 UTC (permalink / raw)
To: linville
Cc: linux-wireless, zajec5, arend, brcm80211-dev-list, jogo,
Hauke Mehrtens
In-Reply-To: <1380800951-28643-1-git-send-email-hauke@hauke-m.de>
This PCI id is used by some BCM4313 cards without a sprom. I have seen
such a card on a router connected to some BCM63XX SoC via PCIe. There
are cards out there with the same PCI id and a BCM4311, which is a pre
ieee80211n chip only supporting ieee80211a, these are still not
supported by b43 and not detected by ssb.
This devices was found by someone in this ticket:
https://dev.openwrt.org/ticket/13551
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
drivers/bcma/host_pci.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index a1caf9c..6fb98b5 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -272,6 +272,7 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bcma_host_pci_suspend,
static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = {
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) },
+ { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4313) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43224) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) },
--
1.7.10.4
^ permalink raw reply related
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