* Re: iwlwifi 8265 firmware crash vith v34 on linux 4.14
From: Luciano Coelho @ 2017-11-14 20:04 UTC (permalink / raw)
To: Thomas Backlund, linux-wireless
In-Reply-To: <b533ecc1-c4ce-b0fc-b7fb-b7beceb1f1cf@mageia.org>
Hi Thomas,
On Tue, 2017-11-14 at 21:49 +0200, Thomas Backlund wrote:
> Running a Lenovo Yoga 720 with kernel 4.14, I pulled the:
> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/linux-
> firmware.git
> tags/iwlwifi-fw-2017-11-03
>
> to try the new fw version 34 on my:
> 3f:00.0 Network controller [0280]: Intel Corporation Wireless 8265 /
> 8275 [8086:24fd] (rev 78)
>
> And got this firmware crash and no wifi working:
> (for reference firmware version 31.560484.0 from same git pull works)
>
>
> [ 11.423208] iwlwifi 0000:3f:00.0: Error sending SCAN_REQ_UMAC:
> time out after 2000ms.
Yes, this was a screw up on my side regarding the FW API. We have a
bugzilla and a patch to fix it already (on my comment #6):
https://bugzilla.kernel.org/show_bug.cgi?id=197591#c6
I'll try to get this into the first stable release for 4.14.
Sorry for the trouble and thanks for reporting!
--
Cheers,
Luca.
^ permalink raw reply
* Re: iwlwifi 8265 firmware crash vith v34 on linux 4.14
From: Thomas Backlund @ 2017-11-14 21:12 UTC (permalink / raw)
To: Luciano Coelho, linux-wireless
In-Reply-To: <1510689850.4011.96.camel@intel.com>
Den 14.11.2017 kl. 22:04, skrev Luciano Coelho:
> Hi Thomas,
>
> On Tue, 2017-11-14 at 21:49 +0200, Thomas Backlund wrote:
>> Running a Lenovo Yoga 720 with kernel 4.14, I pulled the:
>> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/linux-
>> firmware.git
>> tags/iwlwifi-fw-2017-11-03
>>
>> to try the new fw version 34 on my:
>> 3f:00.0 Network controller [0280]: Intel Corporation Wireless 8265 /
>> 8275 [8086:24fd] (rev 78)
>>
>> And got this firmware crash and no wifi working:
>> (for reference firmware version 31.560484.0 from same git pull works)
>>
>>
>> [ 11.423208] iwlwifi 0000:3f:00.0: Error sending SCAN_REQ_UMAC:
>> time out after 2000ms.
>
> Yes, this was a screw up on my side regarding the FW API. We have a
> bugzilla and a patch to fix it already (on my comment #6):
>
> https://bugzilla.kernel.org/show_bug.cgi?id=197591#c6
>
> I'll try to get this into the first stable release for 4.14.
>
Thanks. That patch fixed the crash here too :)
I'm now happily using v34 here
I'll queue it up in Mageia distro kernel too before landing the new
firmwares there...
> Sorry for the trouble and thanks for reporting!
No worries :)
--
Thomas
^ permalink raw reply
* Re: AP mode with Broadcom 4330
From: Russell King - ARM Linux @ 2017-11-14 23:07 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, brcm80211-dev-list.pdl, brcm80211-dev-list
In-Reply-To: <6f701504-0315-a49a-58d9-5cc9292d7d77@broadcom.com>
Arend,
Did this bug ever get fixed, or are 4330's still ending up advertising
BCRM_TEST_SSID when they're put into AP mode with mainline kernels?
It would be good to know whether I can drop my patch for this from my
kernel tree and still have working AP mode.
Thanks.
On Mon, Jul 31, 2017 at 10:28:50PM +0200, Arend van Spriel wrote:
> On 31-07-17 14:59, Russell King - ARM Linux wrote:
> > On Fri, Jul 28, 2017 at 09:50:21PM +0200, Arend van Spriel wrote:
> >> I was going to agree with you, but having second thoughts. There are
> >> actually two use-cases that need to be handled properly. The regular AP
> >> case and the MBSS case. In case of MBSS the initial AP interface will
> >> have mbss set to false and subsequent AP interfaces will have mbss set
> >> to true, but in firmware this has to be configured inverted. That is
> >> what the code above is doing. However, this indeed breaks the regular AP
> >> case for firmwares that abuse that setting for testing purposes (no idea
> >> why that is in a released firmware).
> >
> > Maybe detect the BCRM_TEST_SSID string in the firmware file (as it's
> > broken up amongst other data, it's not trivial) and disable mbss for
> > such firmware? Alternatively, maybe blacklist mbss for some firmware
> > versions?
>
> Well. It seem 43362 chip also had this and we disabled mbss for that
> chipset. So we may do that for 4330 as well.
>
> > Do the firmware versions that include this "abuse" actually have
> > functional mbss?
>
> Digging through our internal bug database I found a remark that
> BRCM_TEST_SSID showing up means mbss is not functional.
>
> > There's also the obvious question: which firmware is recommended for
> > the 4330?
>
> We tend to rely on what is released to AOSP as our team does not have
> the bandwidth to go through the release process. I checked and it is
> still the same so matches what is in linux-firmware.
>
> Regards,
> Arend
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line in suburbia: sync at 8.8Mbps down 630kbps up
According to speedtest.net: 8.21Mbps down 510kbps up
^ permalink raw reply
* [PATCH 0/8] rsi: add bluetooth and coex support
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth
From: Amitkumar Karwar <amit.karwar@redpinesignals.com>
This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.
Prameela Rani Garnepudi (6):
rsi: add rx control block to handle rx packets in USB
rsi: add header file rsi_header
rsi: add coex support
Bluetooth: btrsi: add new rsi bluetooth driver
rsi: add module parameter operating mode
rsi: sdio changes to support BT
Siva Rebbagondla (2):
rsi: add bluetooth rx endpoint
rsi: handle BT traffic in driver
drivers/bluetooth/Kconfig | 12 ++
drivers/bluetooth/Makefile | 2 +
drivers/bluetooth/btrsi.c | 268 ++++++++++++++++++++++++++++
drivers/bluetooth/rsi_hci.h | 51 ++++++
drivers/net/wireless/rsi/Makefile | 1 +
drivers/net/wireless/rsi/rsi_91x_coex.c | 184 +++++++++++++++++++
drivers/net/wireless/rsi/rsi_91x_core.c | 16 +-
drivers/net/wireless/rsi/rsi_91x_hal.c | 56 +++++-
drivers/net/wireless/rsi/rsi_91x_main.c | 127 ++++++++++++-
drivers/net/wireless/rsi/rsi_91x_mgmt.c | 2 +-
drivers/net/wireless/rsi/rsi_91x_sdio.c | 13 +-
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 5 +-
drivers/net/wireless/rsi/rsi_91x_usb.c | 124 +++++++++----
drivers/net/wireless/rsi/rsi_91x_usb_ops.c | 35 ++--
drivers/net/wireless/rsi/rsi_coex.h | 38 ++++
drivers/net/wireless/rsi/rsi_common.h | 5 +-
drivers/net/wireless/rsi/rsi_hal.h | 21 +++
drivers/net/wireless/rsi/rsi_main.h | 22 +--
drivers/net/wireless/rsi/rsi_mgmt.h | 3 +
drivers/net/wireless/rsi/rsi_usb.h | 16 +-
include/linux/rsi_header.h | 58 ++++++
21 files changed, 977 insertions(+), 82 deletions(-)
create mode 100644 drivers/bluetooth/btrsi.c
create mode 100644 drivers/bluetooth/rsi_hci.h
create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
create mode 100644 include/linux/rsi_header.h
--
2.7.4
^ permalink raw reply
* [PATCH 1/8] rsi: add rx control block to handle rx packets in USB
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_91x_main.c | 4 +-
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
drivers/net/wireless/rsi/rsi_91x_usb.c | 75 +++++++++++++++++++++++------
drivers/net/wireless/rsi/rsi_91x_usb_ops.c | 35 +++++++++-----
drivers/net/wireless/rsi/rsi_common.h | 2 +-
drivers/net/wireless/rsi/rsi_main.h | 2 +-
drivers/net/wireless/rsi/rsi_usb.h | 10 +++-
7 files changed, 96 insertions(+), 34 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common *common,
*
* Return: 0 on success, -1 on failure.
*/
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
{
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
index = 0;
do {
- frame_desc = &common->rx_data_pkt[index];
+ frame_desc = &rx_pkt[index];
actual_length = *(u16 *)&frame_desc[0];
offset = *(u16 *)&frame_desc[2];
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
- status = rsi_read_pkt(common, rcv_pkt_len);
+ status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 0873022..147fcee2 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
*/
static void rsi_rx_done_handler(struct urb *urb)
{
- struct rsi_hw *adapter = urb->context;
- struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+ struct rx_usb_ctrl_block *rx_cb = urb->context;
+ struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
if (urb->status)
return;
+ rx_cb->pend = 1;
rsi_set_event(&dev->rx_thread.event);
}
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
*
* Return: 0 on success, a negative error code on failure.
*/
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
{
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
- struct urb *urb = dev->rx_usb_urb[0];
+ struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1];
+ struct urb *urb = rx_cb->rx_urb;
int status;
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
urb->transfer_buffer,
3000,
rsi_rx_done_handler,
- adapter);
+ rx_cb);
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
*/
static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
{
+ u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
rsi_kill_thread(&dev->rx_thread);
- usb_free_urb(dev->rx_usb_urb[0]);
+
+ for (idx = 0; idx < MAX_RX_URBS; idx++) {
+ usb_free_urb(dev->rx_cb[idx].rx_urb);
+ kfree(dev->rx_cb[idx].rx_buffer);
+ }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
}
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+ struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+ struct rx_usb_ctrl_block *rx_cb;
+ u8 idx;
+
+ for (idx = 0; idx < MAX_RX_URBS; idx++) {
+ rx_cb = &dev->rx_cb[idx];
+
+ rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
+ GFP_KERNEL | GFP_DMA);
+ if (!rx_cb->rx_buffer)
+ goto err;
+
+ rx_cb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!rx_cb->rx_urb) {
+ rsi_dbg(ERR_ZONE, "Failed alloc rx urb[%d]\n", idx);
+ goto err;
+ }
+ rx_cb->rx_urb->transfer_buffer = rx_cb->rx_buffer;
+ rx_cb->ep_num = idx + 1;
+ rx_cb->data = (void *)dev;
+ }
+ return 0;
+
+err:
+ for (idx = 0; idx < MAX_RX_URBS; idx++) {
+ kfree(dev->rx_cb[idx].rx_buffer);
+ kfree(dev->rx_cb[idx].rx_urb);
+ }
+ return -1;
+}
+
/**
* rsi_init_usb_interface() - This function initializes the usb interface.
* @adapter: Pointer to the adapter structure.
@@ -504,7 +546,7 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
{
struct rsi_91x_usbdev *rsi_dev;
struct rsi_common *common = adapter->priv;
- int status;
+ int status, i;
rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
if (!rsi_dev)
@@ -531,12 +573,12 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
status = -ENOMEM;
goto fail_tx;
}
- rsi_dev->rx_usb_urb[0] = usb_alloc_urb(0, GFP_KERNEL);
- if (!rsi_dev->rx_usb_urb[0]) {
- status = -ENOMEM;
- goto fail_rx;
+
+ if (rsi_usb_init_rx(adapter)) {
+ rsi_dbg(ERR_ZONE, "Failed to init RX handle\n");
+ return -ENOMEM;
}
- rsi_dev->rx_usb_urb[0]->transfer_buffer = adapter->priv->rx_data_pkt;
+
rsi_dev->tx_blk_size = 252;
adapter->block_size = rsi_dev->tx_blk_size;
@@ -564,9 +606,10 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
return 0;
fail_thread:
- usb_free_urb(rsi_dev->rx_usb_urb[0]);
-fail_rx:
- kfree(rsi_dev->tx_buffer);
+ for (i = 0; i < MAX_RX_URBS; i++) {
+ kfree(rsi_dev->rx_cb[i].rx_buffer);
+ kfree(rsi_dev->rx_cb[i].rx_urb);
+ }
fail_tx:
kfree(common->rx_data_pkt);
return status;
@@ -698,7 +741,7 @@ static int rsi_probe(struct usb_interface *pfunction,
rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__);
}
- status = rsi_rx_urb_submit(adapter);
+ status = rsi_rx_urb_submit(adapter, WLAN_EP);
if (status)
goto err1;
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
index 465692b..d0650ea 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
@@ -29,7 +29,8 @@ void rsi_usb_rx_thread(struct rsi_common *common)
{
struct rsi_hw *adapter = common->priv;
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
- int status;
+ struct rx_usb_ctrl_block *rx_cb;
+ int status, idx;
do {
rsi_wait_event(&dev->rx_thread.event, EVENT_WAIT_FOREVER);
@@ -37,20 +38,30 @@ void rsi_usb_rx_thread(struct rsi_common *common)
if (atomic_read(&dev->rx_thread.thread_done))
goto out;
- mutex_lock(&common->rx_lock);
- status = rsi_read_pkt(common, 0);
- if (status) {
- rsi_dbg(ERR_ZONE, "%s: Failed To read data", __func__);
+ for (idx = 0; idx < MAX_RX_URBS; idx++) {
+ rx_cb = &dev->rx_cb[idx];
+ if (!rx_cb->pend)
+ continue;
+
+ mutex_lock(&common->rx_lock);
+ status = rsi_read_pkt(common, rx_cb->rx_buffer, 0);
+ if (status) {
+ rsi_dbg(ERR_ZONE, "%s: Failed To read data",
+ __func__);
+ mutex_unlock(&common->rx_lock);
+ break;
+ }
+ rx_cb->pend = 0;
mutex_unlock(&common->rx_lock);
- return;
+
+ if (adapter->rx_urb_submit(adapter, rx_cb->ep_num)) {
+ rsi_dbg(ERR_ZONE,
+ "%s: Failed in urb submission",
+ __func__);
+ return;
+ }
}
- mutex_unlock(&common->rx_lock);
rsi_reset_event(&dev->rx_thread.event);
- if (adapter->rx_urb_submit(adapter)) {
- rsi_dbg(ERR_ZONE,
- "%s: Failed in urb submission", __func__);
- return;
- }
} while (1);
out:
diff --git a/drivers/net/wireless/rsi/rsi_common.h b/drivers/net/wireless/rsi/rsi_common.h
index d07dbba..1d8af41 100644
--- a/drivers/net/wireless/rsi/rsi_common.h
+++ b/drivers/net/wireless/rsi/rsi_common.h
@@ -82,7 +82,7 @@ void rsi_mac80211_detach(struct rsi_hw *hw);
u16 rsi_get_connected_channel(struct ieee80211_vif *vif);
struct rsi_hw *rsi_91x_init(void);
void rsi_91x_deinit(struct rsi_hw *adapter);
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len);
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len);
#ifdef CONFIG_PM
int rsi_config_wowlan(struct rsi_hw *adapter, struct cfg80211_wowlan *wowlan);
#endif
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index 8cab630..ee469dc 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -343,7 +343,7 @@ struct rsi_hw {
void *rsi_dev;
struct rsi_host_intf_ops *host_intf_ops;
int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num);
- int (*rx_urb_submit)(struct rsi_hw *adapter);
+ int (*rx_urb_submit)(struct rsi_hw *adapter, u8 ep_num);
int (*determine_event_timeout)(struct rsi_hw *adapter);
};
diff --git a/drivers/net/wireless/rsi/rsi_usb.h b/drivers/net/wireless/rsi/rsi_usb.h
index 891daea..7e781d5 100644
--- a/drivers/net/wireless/rsi/rsi_usb.h
+++ b/drivers/net/wireless/rsi/rsi_usb.h
@@ -39,12 +39,20 @@
#define RSI_USB_BUF_SIZE 4096
#define RSI_USB_CTRL_BUF_SIZE 0x04
+struct rx_usb_ctrl_block {
+ u8 *data;
+ struct urb *rx_urb;
+ u8 *rx_buffer;
+ u8 ep_num;
+ u8 pend;
+};
+
struct rsi_91x_usbdev {
struct rsi_thread rx_thread;
u8 endpoint;
struct usb_device *usbdev;
struct usb_interface *pfunction;
- struct urb *rx_usb_urb[MAX_RX_URBS];
+ struct rx_usb_ctrl_block rx_cb[MAX_RX_URBS];
u8 *tx_buffer;
__le16 bulkin_size;
u8 bulkin_endpoint_addr;
--
2.7.4
^ permalink raw reply related
* [PATCH 2/8] rsi: add bluetooth rx endpoint
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_91x_usb.c | 37 ++++++++++++++++++++--------------
drivers/net/wireless/rsi/rsi_usb.h | 6 +++---
2 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 147fcee2..b212a15 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
- int ii, bep_found = 0;
+ int ii, bin_found = 0, bout_found = 0;
iface_desc = &(interface->altsetting[0]);
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
- if ((!(dev->bulkin_endpoint_addr)) &&
+ if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
- ((endpoint->bmAttributes &
- USB_ENDPOINT_XFERTYPE_MASK) ==
+ ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
- dev->bulkin_size = buffer_size;
- dev->bulkin_endpoint_addr =
+ dev->bulkin_size[bin_found] = buffer_size;
+ dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+ bin_found++;
}
- if (!dev->bulkout_endpoint_addr[bep_found] &&
+ if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
- dev->bulkout_endpoint_addr[bep_found] =
+ USB_ENDPOINT_XFER_BULK)) {
+ buffer_size = endpoint->wMaxPacketSize;
+ dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
- dev->bulkout_size[bep_found] = buffer_size;
- bep_found++;
+ dev->bulkout_size[bout_found] = buffer_size;
+ bout_found++;
}
- if (bep_found >= MAX_BULK_EP)
+ if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
- if (!(dev->bulkin_endpoint_addr) &&
- (dev->bulkout_endpoint_addr[0]))
+ if (!(dev->bulkin_endpoint_addr[0]) &&
+ dev->bulkout_endpoint_addr[0])
return -EINVAL;
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
usb_fill_bulk_urb(urb,
dev->usbdev,
usb_rcvbulkpipe(dev->usbdev,
- dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
urb->transfer_buffer,
3000,
rsi_rx_done_handler,
@@ -745,6 +746,12 @@ static int rsi_probe(struct usb_interface *pfunction,
if (status)
goto err1;
+ if (adapter->priv->coex_mode > 1) {
+ status = rsi_rx_urb_submit(adapter, BT_EP);
+ if (status)
+ goto err1;
+ }
+
return 0;
err1:
rsi_deinit_usb_interface(adapter);
diff --git a/drivers/net/wireless/rsi/rsi_usb.h b/drivers/net/wireless/rsi/rsi_usb.h
index 7e781d5..0fda14c 100644
--- a/drivers/net/wireless/rsi/rsi_usb.h
+++ b/drivers/net/wireless/rsi/rsi_usb.h
@@ -31,7 +31,7 @@
#define USB_VENDOR_REGISTER_WRITE 0x16
#define RSI_USB_TX_HEAD_ROOM 128
-#define MAX_RX_URBS 1
+#define MAX_RX_URBS 2
#define MAX_BULK_EP 8
#define WLAN_EP 1
#define BT_EP 2
@@ -54,8 +54,8 @@ struct rsi_91x_usbdev {
struct usb_interface *pfunction;
struct rx_usb_ctrl_block rx_cb[MAX_RX_URBS];
u8 *tx_buffer;
- __le16 bulkin_size;
- u8 bulkin_endpoint_addr;
+ __le16 bulkin_size[MAX_BULK_EP];
+ u8 bulkin_endpoint_addr[MAX_BULK_EP];
__le16 bulkout_size[MAX_BULK_EP];
u8 bulkout_endpoint_addr[MAX_BULK_EP];
u32 tx_blk_size;
--
2.7.4
^ permalink raw reply related
* [PATCH 3/8] rsi: add header file rsi_header
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
The common parameters used by wlan and bt modules are added
to a new header file "rsi_header.h" defined in '/include/linux'
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_main.h | 12 ++----------
| 34 ++++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+), 10 deletions(-)
create mode 100644 include/linux/rsi_header.h
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..ca02a4b 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
#include <linux/string.h>
#include <linux/skbuff.h>
#include <net/mac80211.h>
+#include <linux/rsi_header.h>
struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...);
#define MGMT_HW_Q 10
#define BEACON_HW_Q 11
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
#define IEEE80211_MGMT_FRAME 0x00
#define IEEE80211_CTL_FRAME 0x04
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
};
-enum host_intf {
- RSI_HOST_INTF_SDIO = 0,
- RSI_HOST_INTF_USB
-};
-
struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
- enum host_intf rsi_host_intf;
+ enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
--git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
new file mode 100644
index 0000000..16a447b
--- /dev/null
+++ b/include/linux/rsi_header.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q 0x2
+#define RSI_WLAN_Q 0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q 0x6
+#define RSI_BT_DATA_Q 0x7
+
+enum rsi_host_intf {
+ RSI_HOST_INTF_SDIO = 0,
+ RSI_HOST_INTF_USB
+};
+
+#endif
--
2.7.4
^ permalink raw reply related
* [PATCH 4/8] rsi: add coex support
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.
Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Initialization of
coex and operating mode values is moved to rsi_91x_init().
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/Makefile | 1 +
drivers/net/wireless/rsi/rsi_91x_coex.c | 182 ++++++++++++++++++++++++++++++++
drivers/net/wireless/rsi/rsi_91x_hal.c | 17 +--
drivers/net/wireless/rsi/rsi_91x_main.c | 30 +++++-
drivers/net/wireless/rsi/rsi_91x_mgmt.c | 2 +-
drivers/net/wireless/rsi/rsi_91x_sdio.c | 1 +
drivers/net/wireless/rsi/rsi_91x_usb.c | 2 +
drivers/net/wireless/rsi/rsi_coex.h | 38 +++++++
drivers/net/wireless/rsi/rsi_main.h | 5 +
drivers/net/wireless/rsi/rsi_mgmt.h | 3 +
| 22 ++++
11 files changed, 293 insertions(+), 10 deletions(-)
create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
diff --git a/drivers/net/wireless/rsi/Makefile b/drivers/net/wireless/rsi/Makefile
index 47c4590..fda827b 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y += rsi_91x_mac80211.o
rsi_91x-y += rsi_91x_mgmt.o
rsi_91x-y += rsi_91x_hal.o
rsi_91x-y += rsi_91x_ps.o
+rsi_91x-y += rsi_91x_coex.o
rsi_91x-$(CONFIG_RSI_DEBUGFS) += rsi_91x_debugfs.o
rsi_usb-y += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 0000000..914a0c5
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2017 Redpine Signals Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+ (struct rsi_coex_ctrl_block *coex_cb)
+{
+ enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+ if (skb_queue_len(&coex_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+ q_num = RSI_COEX_Q_COMMON;
+ if (skb_queue_len(&coex_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+ q_num = RSI_COEX_Q_BT;
+ if (skb_queue_len(&coex_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+ q_num = RSI_COEX_Q_WLAN;
+
+ return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+ enum rsi_coex_queues coex_q;
+ struct sk_buff *skb;
+
+ while (1) {
+ coex_q = rsi_coex_determine_coex_q(coex_cb);
+ rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
+
+ if (coex_q == RSI_COEX_Q_INVALID) {
+ rsi_dbg(DATA_TX_ZONE, "No more pkt\n");
+ break;
+ }
+
+ if (coex_q == RSI_COEX_Q_BT)
+ skb = skb_dequeue(&coex_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+ }
+}
+
+static void rsi_coex_scheduler_thread(struct rsi_common *common)
+{
+ struct rsi_coex_ctrl_block *coex_cb =
+ (struct rsi_coex_ctrl_block *)common->coex_cb;
+ u32 timeout = EVENT_WAIT_FOREVER;
+
+ do {
+ rsi_wait_event(&coex_cb->coex_tx_thread.event, timeout);
+ rsi_reset_event(&coex_cb->coex_tx_thread.event);
+
+ rsi_coex_sched_tx_pkts(coex_cb);
+ } while (atomic_read(&coex_cb->coex_tx_thread.thread_done) == 0);
+
+ complete_and_exit(&coex_cb->coex_tx_thread.completion, 0);
+}
+
+int rsi_coex_recv_pkt(struct rsi_common *common, u8 *msg)
+{
+ u8 msg_type = msg[RSI_RX_DESC_MSG_TYPE_OFFSET];
+
+ switch (msg_type) {
+ case COMMON_CARD_READY_IND:
+ rsi_dbg(INFO_ZONE, "common card ready received\n");
+ rsi_handle_card_ready(common, msg);
+ break;
+ case SLEEP_NOTIFY_IND:
+ rsi_dbg(INFO_ZONE, "sleep notify received\n");
+ rsi_mgmt_pkt_recv(common, msg);
+ break;
+ }
+
+ return 0;
+}
+
+static inline int rsi_map_coex_q(u8 hal_queue)
+{
+ switch (hal_queue) {
+ case RSI_COEX_Q:
+ return RSI_COEX_Q_COMMON;
+ case RSI_WLAN_Q:
+ return RSI_COEX_Q_WLAN;
+ case RSI_BT_Q:
+ return RSI_COEX_Q_BT;
+ }
+ return RSI_COEX_Q_INVALID;
+}
+
+int rsi_coex_send_pkt(void *priv, struct sk_buff *skb, u8 hal_queue)
+{
+ struct rsi_common *common = (struct rsi_common *)priv;
+ struct rsi_coex_ctrl_block *coex_cb =
+ (struct rsi_coex_ctrl_block *)common->coex_cb;
+ struct skb_info *tx_params = NULL;
+ enum rsi_coex_queues coex_q;
+ int status;
+
+ coex_q = rsi_map_coex_q(hal_queue);
+ if (coex_q == RSI_COEX_Q_INVALID) {
+ rsi_dbg(ERR_ZONE, "Invalid coex queue\n");
+ return -EINVAL;
+ }
+ if (coex_q != RSI_COEX_Q_COMMON &&
+ coex_q != RSI_COEX_Q_WLAN) {
+ skb_queue_tail(&coex_cb->coex_tx_qs[coex_q], skb);
+ rsi_set_event(&coex_cb->coex_tx_thread.event);
+ return 0;
+ }
+ if (common->iface_down) {
+ tx_params =
+ (struct skb_info *)&IEEE80211_SKB_CB(skb)->driver_data;
+
+ if (!(tx_params->flags & INTERNAL_MGMT_PKT)) {
+ rsi_indicate_tx_status(common->priv, skb, -EINVAL);
+ return 0;
+ }
+ }
+
+ /* Send packet to hal */
+ if (skb->priority == MGMT_SOFT_Q)
+ status = rsi_send_mgmt_pkt(common, skb);
+ else
+ status = rsi_send_data_pkt(common, skb);
+
+ return status;
+}
+
+int rsi_coex_attach(struct rsi_common *common)
+{
+ struct rsi_coex_ctrl_block *coex_cb;
+ int cnt;
+
+ coex_cb = kzalloc(sizeof(*coex_cb), GFP_KERNEL);
+ if (!coex_cb)
+ return -ENOMEM;
+
+ common->coex_cb = (void *)coex_cb;
+ coex_cb->priv = common;
+
+ /* Initialize co-ex queues */
+ for (cnt = 0; cnt < NUM_COEX_TX_QUEUES; cnt++)
+ skb_queue_head_init(&coex_cb->coex_tx_qs[cnt]);
+ rsi_init_event(&coex_cb->coex_tx_thread.event);
+
+ /* Initialize co-ex thread */
+ if (rsi_create_kthread(common,
+ &coex_cb->coex_tx_thread,
+ rsi_coex_scheduler_thread,
+ "Coex-Tx-Thread")) {
+ rsi_dbg(ERR_ZONE, "%s: Unable to init tx thrd\n", __func__);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+void rsi_coex_detach(struct rsi_common *common)
+{
+ struct rsi_coex_ctrl_block *coex_cb =
+ (struct rsi_coex_ctrl_block *)common->coex_cb;
+ int cnt;
+
+ rsi_kill_thread(&coex_cb->coex_tx_thread);
+
+ for (cnt = 0; cnt < NUM_COEX_TX_QUEUES; cnt++)
+ skb_queue_purge(&coex_cb->coex_tx_qs[cnt]);
+
+ kfree(coex_cb);
+}
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 1176de6..8b30448 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -31,8 +31,15 @@ int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
struct rsi_hw *adapter = common->priv;
int status;
+ if (common->coex_mode > 1)
+ down(&common->tx_bus_lock);
+
status = adapter->host_intf_ops->write_pkt(common->priv,
skb->data, skb->len);
+
+ if (common->coex_mode > 1)
+ up(&common->tx_bus_lock);
+
return status;
}
@@ -296,8 +303,7 @@ int rsi_send_data_pkt(struct rsi_common *common, struct sk_buff *skb)
if (status)
goto err;
- status = adapter->host_intf_ops->write_pkt(common->priv, skb->data,
- skb->len);
+ status = rsi_send_pkt_to_bus(common, skb);
if (status)
rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
@@ -342,8 +348,7 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
goto err;
rsi_prepare_mgmt_desc(common, skb);
- status = adapter->host_intf_ops->write_pkt(common->priv,
- (u8 *)skb->data, skb->len);
+ status = rsi_send_pkt_to_bus(common, skb);
if (status)
rsi_dbg(ERR_ZONE, "%s: Failed to write the packet\n", __func__);
@@ -926,10 +931,6 @@ int rsi_hal_device_init(struct rsi_hw *adapter)
{
struct rsi_common *common = adapter->priv;
- common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
- common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
- adapter->device_model = RSI_DEV_9113;
-
switch (adapter->device_model) {
case RSI_DEV_9113:
if (rsi_load_firmware(adapter)) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0413af8..7dce533 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -20,6 +20,7 @@
#include <linux/firmware.h>
#include "rsi_mgmt.h"
#include "rsi_common.h"
+#include "rsi_coex.h"
#include "rsi_hal.h"
u32 rsi_zone_enabled = /* INFO_ZONE |
@@ -160,8 +161,13 @@ int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
switch (queueno) {
case RSI_COEX_Q:
- rsi_mgmt_pkt_recv(common, (frame_desc + offset));
+ if (common->coex_mode > 1)
+ rsi_coex_recv_pkt(common, frame_desc + offset);
+ else
+ rsi_mgmt_pkt_recv(common,
+ (frame_desc + offset));
break;
+
case RSI_WIFI_DATA_Q:
skb = rsi_prepare_skb(common,
(frame_desc + offset),
@@ -217,6 +223,13 @@ static void rsi_tx_scheduler_thread(struct rsi_common *common)
complete_and_exit(&common->tx_thread.completion, 0);
}
+enum rsi_host_intf rsi_get_host_intf(void *priv)
+{
+ struct rsi_common *common = (struct rsi_common *)priv;
+
+ return common->priv->rsi_host_intf;
+}
+
/**
* rsi_91x_init() - This function initializes os interface operations.
* @void: Void.
@@ -251,6 +264,7 @@ struct rsi_hw *rsi_91x_init(void)
mutex_init(&common->mutex);
mutex_init(&common->tx_lock);
mutex_init(&common->rx_lock);
+ sema_init(&common->tx_bus_lock, 1);
if (rsi_create_kthread(common,
&common->tx_thread,
@@ -265,6 +279,17 @@ struct rsi_hw *rsi_91x_init(void)
timer_setup(&common->roc_timer, rsi_roc_timeout, 0);
init_completion(&common->wlan_init_completion);
common->init_done = true;
+
+ common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
+ common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
+ adapter->device_model = RSI_DEV_9113;
+ if (common->coex_mode > 1) {
+ if (rsi_coex_attach(common)) {
+ rsi_dbg(ERR_ZONE, "Failed to init coex module\n");
+ goto err;
+ }
+ }
+
return adapter;
err:
@@ -294,6 +319,9 @@ void rsi_91x_deinit(struct rsi_hw *adapter)
common->init_done = false;
+ if (common->coex_mode > 1)
+ rsi_coex_detach(common);
+
kfree(common);
kfree(adapter->rsi_dev);
kfree(adapter);
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 46c9d54..c21fca7 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -1791,7 +1791,7 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common,
return -EINVAL;
}
-static int rsi_handle_card_ready(struct rsi_common *common, u8 *msg)
+int rsi_handle_card_ready(struct rsi_common *common, u8 *msg)
{
switch (common->fsm_state) {
case FSM_CARD_NOT_READY:
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index b0cf411..ba38c6d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -18,6 +18,7 @@
#include <linux/module.h>
#include "rsi_sdio.h"
#include "rsi_common.h"
+#include "rsi_coex.h"
#include "rsi_hal.h"
/**
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b212a15..b09c7da 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -16,8 +16,10 @@
*/
#include <linux/module.h>
+#include <linux/rsi_header.h>
#include "rsi_usb.h"
#include "rsi_hal.h"
+#include "rsi_coex.h"
/**
* rsi_usb_card_write() - This function writes to the USB Card.
diff --git a/drivers/net/wireless/rsi/rsi_coex.h b/drivers/net/wireless/rsi/rsi_coex.h
new file mode 100644
index 0000000..22fe6ff
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_coex.h
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2017 Redpine Signals Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __RSI_COEX_H__
+#define __RSI_COEX_H__
+
+#include "rsi_common.h"
+
+#define RSI_COEX_TXQ_MAX_PKTS 64
+#define RSI_COEX_TXQ_WATER_MARK 50
+#define COMMON_CARD_READY_IND 0
+#define NUM_COEX_TX_QUEUES 5
+
+struct rsi_coex_ctrl_block {
+ struct rsi_common *priv;
+ struct sk_buff_head coex_tx_qs[NUM_COEX_TX_QUEUES];
+ struct rsi_thread coex_tx_thread;
+};
+
+int rsi_coex_attach(struct rsi_common *common);
+void rsi_coex_detach(struct rsi_common *common);
+int rsi_coex_send_pkt(void *priv, struct sk_buff *skb, u8 proto_type);
+int rsi_coex_recv_pkt(struct rsi_common *common, u8 *msg);
+
+#endif
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index ca02a4b..e1c1dc8 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -206,6 +206,7 @@ struct rsi_common {
struct rsi_hw *priv;
struct vif_priv vif_info[RSI_MAX_VIFS];
+ void *coex_cb;
bool mgmt_q_block;
struct version_info lmac_ver;
@@ -270,6 +271,7 @@ struct rsi_common {
u8 obm_ant_sel_val;
int tx_power;
u8 ant_in_use;
+ struct semaphore tx_bus_lock;
bool hibernate_resume;
bool reinit_hw;
u8 wow_flags;
@@ -359,4 +361,7 @@ struct rsi_host_intf_ops {
u8 *fw);
int (*reinit_device)(struct rsi_hw *adapter);
};
+
+enum rsi_host_intf rsi_get_host_intf(void *priv);
+
#endif
diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h b/drivers/net/wireless/rsi/rsi_mgmt.h
index 389094a..cf6567a 100644
--- a/drivers/net/wireless/rsi/rsi_mgmt.h
+++ b/drivers/net/wireless/rsi/rsi_mgmt.h
@@ -57,12 +57,14 @@
#define WOW_PATTERN_SIZE 256
/* Receive Frame Types */
+#define RSI_RX_DESC_MSG_TYPE_OFFSET 2
#define TA_CONFIRM_TYPE 0x01
#define RX_DOT11_MGMT 0x02
#define TX_STATUS_IND 0x04
#define BEACON_EVENT_IND 0x08
#define PROBEREQ_CONFIRM 2
#define CARD_READY_IND 0x00
+#define SLEEP_NOTIFY_IND 0x06
#define RSI_DELETE_PEER 0x0
#define RSI_ADD_PEER 0x1
@@ -638,6 +640,7 @@ static inline void rsi_set_len_qno(__le16 *addr, u16 len, u8 qno)
*addr = cpu_to_le16(len | ((qno & 7) << 12));
}
+int rsi_handle_card_ready(struct rsi_common *common, u8 *msg);
int rsi_mgmt_pkt_recv(struct rsi_common *common, u8 *msg);
int rsi_set_vap_capabilities(struct rsi_common *common, enum opmode mode,
u8 *mac_addr, u8 vap_id, u8 vap_status);
--git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
index 16a447b..277f748 100644
--- a/include/linux/rsi_header.h
+++ b/include/linux/rsi_header.h
@@ -17,6 +17,8 @@
#ifndef __RSI_HEADER_H__
#define __RSI_HEADER_H__
+#include <linux/skbuff.h>
+
/* HAL queue information */
#define RSI_COEX_Q 0x0
#define RSI_BT_Q 0x2
@@ -26,9 +28,29 @@
#define RSI_BT_MGMT_Q 0x6
#define RSI_BT_DATA_Q 0x7
+enum rsi_coex_queues {
+ RSI_COEX_Q_INVALID = -1,
+ RSI_COEX_Q_COMMON = 0,
+ RSI_COEX_Q_BT,
+ RSI_COEX_Q_WLAN
+};
+
enum rsi_host_intf {
RSI_HOST_INTF_SDIO = 0,
RSI_HOST_INTF_USB
};
+struct rsi_proto_ops {
+ int (*coex_send_pkt)(void *priv, struct sk_buff *skb, u8 hal_queue);
+ enum rsi_host_intf (*get_host_intf)(void *priv);
+ void (*set_bt_context)(void *priv, void *context);
+ void *(*get_bt_context)(void *priv);
+ struct rsi_mod_ops *bt_ops;
+};
+
+struct rsi_mod_ops {
+ int (*attach)(void *priv, struct rsi_proto_ops *ops);
+ void (*detach)(void *priv);
+ int (*recv_pkt)(void *priv, u8 *msg);
+};
#endif
--
2.7.4
^ permalink raw reply related
* [PATCH 5/8] Bluetooth: btrsi: add new rsi bluetooth driver
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/bluetooth/Kconfig | 12 ++
drivers/bluetooth/Makefile | 2 +
drivers/bluetooth/btrsi.c | 268 ++++++++++++++++++++++++++++++++++++++++++++
drivers/bluetooth/rsi_hci.h | 51 +++++++++
4 files changed, 333 insertions(+)
create mode 100644 drivers/bluetooth/btrsi.c
create mode 100644 drivers/bluetooth/rsi_hci.h
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 60e1c7d..ca58d74 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -378,4 +378,16 @@ config BT_QCOMSMD
Say Y here to compile support for HCI over Qualcomm SMD into the
kernel or say M to compile as a module.
+config BT_RSI
+ tristate "Redpine HCI support"
+ depends on BT && BT_RFCOMM
+ default m
+ help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Qualcomm SMD into the
+ kernel or say M to compile as a module.
+
endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..712af83a 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA) += btqca.o
obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
+obj-$(CONFIG_BT_RSI) += btrsi.o
+
btmrvl-y := btmrvl_main.o
btmrvl-$(CONFIG_DEBUG_FS) += btmrvl_debugfs.o
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 0000000..c52f418
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2017 Redpine Signals Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+e* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include "rsi_hci.h"
+
+static struct rsi_mod_ops rsi_bt_ops = {
+ .attach = rsi_hci_attach,
+ .detach = rsi_hci_detach,
+ .recv_pkt = rsi_hci_recv_pkt,
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+ BT_INFO("%s open\n", hdev->name);
+
+ return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+ BT_INFO("%s closed\n", hdev->name);
+
+ return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+ BT_ERR("%s flush\n", hdev->name);
+
+ return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+ struct rsi_hci_adapter *h_adapter;
+ struct sk_buff *new_skb = NULL;
+
+ int status = 0;
+
+ h_adapter = hci_get_drvdata(hdev);
+ if (!h_adapter) {
+ status = -EFAULT;
+ goto fail;
+ }
+
+ if (h_adapter->fsm_state != RSI_BT_FSM_DEVICE_READY) {
+ BT_INFO("BT Device not ready\n");
+ status = -ENODEV;
+ goto fail;
+ }
+
+ if (!test_bit(HCI_RUNNING, &hdev->flags)) {
+ status = -EBUSY;
+ goto fail;
+ }
+
+ switch (bt_cb(skb)->pkt_type) {
+ case HCI_COMMAND_PKT:
+ hdev->stat.cmd_tx++;
+ break;
+
+ case HCI_ACLDATA_PKT:
+ hdev->stat.acl_tx++;
+ break;
+
+ case HCI_SCODATA_PKT:
+ hdev->stat.sco_tx++;
+ break;
+
+ default:
+ dev_kfree_skb(skb);
+ status = -EILSEQ;
+ goto fail;
+ }
+
+ if (skb_headroom(skb) < RSI_HEADROOM_FOR_BT_HAL) {
+ /* Re-allocate one more skb with sufficent headroom */
+ /* Space for Descriptor (16 bytes) is required in head room */
+ u16 new_len = skb->len + RSI_HEADROOM_FOR_BT_HAL;
+
+ new_skb = dev_alloc_skb(new_len);
+ if (!new_skb) {
+ dev_kfree_skb(skb);
+ return -ENOMEM;
+ }
+ skb_reserve(new_skb, RSI_HEADROOM_FOR_BT_HAL);
+ skb_put(new_skb, skb->len);
+ memcpy(new_skb->data, skb->data, skb->len);
+ bt_cb(new_skb)->pkt_type = bt_cb(skb)->pkt_type;
+ dev_kfree_skb(skb);
+ skb = new_skb;
+ }
+ if (h_adapter->proto_ops->coex_send_pkt)
+ return h_adapter->proto_ops->coex_send_pkt(h_adapter->priv, skb,
+ RSI_BT_Q);
+
+fail:
+ dev_kfree_skb(skb);
+ return status;
+}
+
+int rsi_hci_recv_pkt(void *priv, u8 *pkt)
+{
+ struct rsi_hci_adapter *h_adapter = (struct rsi_hci_adapter *)priv;
+ struct hci_dev *hdev = NULL;
+ struct sk_buff *skb;
+ int pkt_len = (le16_to_cpu(*(__le16 *)pkt)) & 0x0fff;
+ u8 queue_no = (le16_to_cpu(*(__le16 *)pkt) & 0x7000) >> 12;
+
+ if (h_adapter->fsm_state != RSI_BT_FSM_DEVICE_READY) {
+ BT_INFO("BT Device not ready\n");
+ return 0;
+ }
+
+ if (queue_no == RSI_BT_MGMT_Q) {
+ u8 msg_type = pkt[14] & 0xFF;
+
+ switch (msg_type) {
+ case RSI_RESULT_CONFIRM:
+ BT_INFO("BT Result Confirm\n");
+ return 0;
+ case RSI_BT_BER:
+ BT_INFO("BT Ber\n");
+ return 0;
+ case RSI_BT_CW:
+ BT_INFO("BT CW\n");
+ return 0;
+ default:
+ break;
+ }
+ }
+
+ skb = dev_alloc_skb(pkt_len);
+ if (!skb)
+ return -ENOMEM;
+
+ hdev = h_adapter->hdev;
+ memcpy(skb->data, pkt + RSI_FRAME_DESC_SIZE, pkt_len);
+ skb_put(skb, pkt_len);
+ h_adapter->hdev->stat.byte_rx += skb->len;
+
+ skb->dev = (void *)hdev;
+ bt_cb(skb)->pkt_type = pkt[14];
+
+ return hci_recv_frame(hdev, skb);
+}
+EXPORT_SYMBOL_GPL(rsi_hci_recv_pkt);
+
+int rsi_hci_attach(void *priv, struct rsi_proto_ops *ops)
+{
+ struct rsi_hci_adapter *h_adapter = NULL;
+ struct hci_dev *hdev;
+ int status = 0;
+
+ h_adapter = kzalloc(sizeof(*h_adapter), GFP_KERNEL);
+ if (!h_adapter)
+ return -ENOMEM;
+
+ h_adapter->priv = priv;
+ ops->set_bt_context(priv, h_adapter);
+ h_adapter->proto_ops = ops;
+ ops->bt_ops = &rsi_bt_ops;
+ h_adapter->fsm_state = RSI_BT_FSM_DEVICE_READY;
+
+ hdev = hci_alloc_dev();
+ if (!hdev) {
+ BT_ERR("Failed to alloc HCI device\n");
+ goto err;
+ }
+ h_adapter->hdev = hdev;
+
+ if (ops->get_host_intf(priv) == RSI_HOST_INTF_SDIO)
+ hdev->bus = HCI_SDIO;
+ else
+ hdev->bus = HCI_USB;
+
+ hci_set_drvdata(hdev, h_adapter);
+ hdev->dev_type = HCI_PRIMARY;
+ hdev->open = rsi_hci_open;
+ hdev->close = rsi_hci_close;
+ hdev->flush = rsi_hci_flush;
+ hdev->send = rsi_hci_send_pkt;
+
+ status = hci_register_dev(hdev);
+ if (status < 0) {
+ BT_ERR("%s: HCI registration failed with errcode %d\n",
+ __func__, status);
+ goto err;
+ }
+
+ BT_INFO("%s interface created\n", hdev->name);
+
+ h_adapter->fsm_state = RSI_BT_FSM_DEVICE_READY;
+
+ return 0;
+
+err:
+ if (hdev) {
+ hci_unregister_dev(hdev);
+ hci_free_dev(hdev);
+ h_adapter->hdev = NULL;
+ }
+ kfree(h_adapter);
+
+ return -EINVAL;
+}
+
+void rsi_hci_detach(void *priv)
+{
+ struct rsi_hci_adapter *h_adapter = (struct rsi_hci_adapter *)priv;
+ struct hci_dev *hdev;
+
+ if (!h_adapter)
+ return;
+
+ hdev = h_adapter->hdev;
+
+ BT_INFO("Detaching %s\n", hdev->name);
+
+ if (hdev) {
+ hci_unregister_dev(hdev);
+ hci_free_dev(hdev);
+ h_adapter->hdev = NULL;
+ }
+
+ kfree(h_adapter);
+ h_adapter->fsm_state = RSI_BT_FSM_DEVICE_NOT_READY;
+}
+
+struct rsi_mod_ops *rsi_get_hci_ops(void)
+{
+ return &rsi_bt_ops;
+};
+EXPORT_SYMBOL_GPL(rsi_get_hci_ops);
+
+static int rsi_91x_bt_module_init(void)
+{
+ BT_INFO("%s: BT Module init called\n", __func__);
+
+ return 0;
+}
+
+static void rsi_91x_bt_module_exit(void)
+{
+ BT_INFO("%s: BT Module exit called\n", __func__);
+}
+
+module_init(rsi_91x_bt_module_init);
+module_exit(rsi_91x_bt_module_exit);
+MODULE_AUTHOR("Redpine Signals Inc");
+MODULE_DESCRIPTION("RSI BT driver");
+MODULE_SUPPORTED_DEVICE("RSI-BT");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/bluetooth/rsi_hci.h b/drivers/bluetooth/rsi_hci.h
new file mode 100644
index 0000000..6f44231
--- /dev/null
+++ b/drivers/bluetooth/rsi_hci.h
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2017 Redpine Signals Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __RSI_HCI_H__
+#define __RSI_HCI_H__
+
+#include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/hci_core.h>
+#include <linux/rsi_header.h>
+#include <net/genetlink.h>
+
+/* RX frame types */
+#define RSI_RESULT_CONFIRM 0x80
+#define RSI_BT_PER 0x10
+#define RSI_BT_BER 0x11
+#define RSI_BT_CW 0x12
+
+#define RSI_HEADROOM_FOR_BT_HAL 16
+
+enum bt_fsm_state {
+ RSI_BT_FSM_DEVICE_NOT_READY = 0,
+ RSI_BT_FSM_DEVICE_READY,
+};
+
+struct rsi_hci_adapter {
+ void *priv;
+ struct rsi_proto_ops *proto_ops;
+ enum bt_fsm_state fsm_state;
+ struct hci_dev *hdev;
+};
+
+#define RSI_FRAME_DESC_SIZE 16
+
+int rsi_hci_attach(void *priv, struct rsi_proto_ops *ops);
+void rsi_hci_detach(void *priv);
+int rsi_hci_recv_pkt(void *data, u8 *pkt);
+
+#endif
--
2.7.4
^ permalink raw reply related
* [PATCH 6/8] rsi: handle BT traffic in driver
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_91x_coex.c | 4 ++-
drivers/net/wireless/rsi/rsi_91x_core.c | 16 +++++++---
drivers/net/wireless/rsi/rsi_91x_hal.c | 39 ++++++++++++++++++++++++
drivers/net/wireless/rsi/rsi_91x_main.c | 47 +++++++++++++++++++++++++++++
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 1 +
drivers/net/wireless/rsi/rsi_common.h | 1 +
drivers/net/wireless/rsi/rsi_hal.h | 10 ++++++
drivers/net/wireless/rsi/rsi_main.h | 5 +++
| 2 ++
9 files changed, 119 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c b/drivers/net/wireless/rsi/rsi_91x_coex.c
index 914a0c5..f502cf9 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -48,8 +48,10 @@ static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
break;
}
- if (coex_q == RSI_COEX_Q_BT)
+ if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(&coex_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+ rsi_send_bt_pkt(coex_cb->priv, skb);
+ }
}
}
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..046ace8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
#include "rsi_mgmt.h"
#include "rsi_common.h"
#include "rsi_hal.h"
+#include "rsi_coex.h"
/**
* rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,19 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(&common->tx_lock);
break;
}
-
- if (q_num == MGMT_SOFT_Q) {
- status = rsi_send_mgmt_pkt(common, skb);
- } else if (q_num == MGMT_BEACON_Q) {
+ if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
- status = rsi_send_data_pkt(common, skb);
+ if (common->coex_mode > 1) {
+ status = rsi_coex_send_pkt(common, skb,
+ RSI_WLAN_Q);
+ } else {
+ if (q_num == MGMT_SOFT_Q)
+ status = rsi_send_mgmt_pkt(common, skb);
+ else
+ status = rsi_send_data_pkt(common, skb);
+ }
}
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 8b30448..883dba1 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
*/
#include <linux/firmware.h>
+#include <net/bluetooth/bluetooth.h>
#include "rsi_mgmt.h"
#include "rsi_hal.h"
#include "rsi_sdio.h"
@@ -24,6 +25,7 @@
static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x00010000},
{"rsi/rs9113_wlan_qspi.rps", 0x00010000},
+ {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x00010000},
};
int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
}
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+ int status = -EINVAL;
+ u8 header_size = 0;
+ struct rsi_bt_desc *bt_desc;
+ u8 queueno = ((skb->data[1] >> 4) & 0xf);
+
+ if (queueno == RSI_BT_MGMT_Q) {
+ status = rsi_send_pkt_to_bus(common, skb);
+ if (status)
+ rsi_dbg(ERR_ZONE, "%s: Failed to write bt mgmt pkt\n",
+ __func__);
+ goto out;
+ }
+ header_size = FRAME_DESC_SZ;
+ if (header_size > skb_headroom(skb)) {
+ rsi_dbg(ERR_ZONE, "%s: Not enough headroom\n", __func__);
+ status = -ENOSPC;
+ goto out;
+ }
+ skb_push(skb, header_size);
+ memset(skb->data, 0, header_size);
+ bt_desc = (struct rsi_bt_desc *)skb->data;
+
+ rsi_set_len_qno(&bt_desc->len_qno, (skb->len - FRAME_DESC_SZ),
+ RSI_BT_DATA_Q);
+ bt_desc->bt_pkt_type = cpu_to_le16(bt_cb(skb)->pkt_type);
+
+ status = rsi_send_pkt_to_bus(common, skb);
+ if (status)
+ rsi_dbg(ERR_ZONE, "%s: Failed to write bt pkt\n", __func__);
+
+out:
+ dev_kfree_skb(skb);
+ return status;
+}
+
int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb)
{
struct rsi_hw *adapter = (struct rsi_hw *)common->priv;
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 7dce533..00f54c5 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -18,6 +18,7 @@
#include <linux/module.h>
#include <linux/firmware.h>
+#include <linux/rsi_header.h>
#include "rsi_mgmt.h"
#include "rsi_common.h"
#include "rsi_coex.h"
@@ -35,6 +36,13 @@ u32 rsi_zone_enabled = /* INFO_ZONE |
0;
EXPORT_SYMBOL_GPL(rsi_zone_enabled);
+static struct rsi_proto_ops g_proto_ops = {
+ .coex_send_pkt = rsi_coex_send_pkt,
+ .get_host_intf = rsi_get_host_intf,
+ .set_bt_context = rsi_set_bt_context,
+ .get_bt_context = rsi_get_bt_context,
+};
+
/**
* rsi_dbg() - This function outputs informational messages.
* @zone: Zone of interest for output message.
@@ -144,6 +152,8 @@ int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
u32 index, length = 0, queueno = 0;
u16 actual_length = 0, offset;
struct sk_buff *skb = NULL;
+ struct rsi_mod_ops *bt_ops = g_proto_ops.bt_ops;
+ u8 bt_pkt_type;
index = 0;
do {
@@ -183,6 +193,24 @@ int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
rsi_mgmt_pkt_recv(common, (frame_desc + offset));
break;
+ case RSI_BT_MGMT_Q:
+ case RSI_BT_DATA_Q:
+#define BT_RX_PKT_TYPE_OFST 14
+#define BT_CARD_READY_IND 0x89
+ bt_pkt_type = frame_desc[offset + BT_RX_PKT_TYPE_OFST];
+ if (bt_pkt_type == BT_CARD_READY_IND &&
+ bt_ops && bt_ops->attach) {
+ rsi_dbg(INFO_ZONE, "BT Card ready recvd\n");
+ if (bt_ops->attach(common, &g_proto_ops))
+ rsi_dbg(ERR_ZONE,
+ "Failed to attach BT module\n");
+ } else {
+ if (bt_ops && bt_ops->recv_pkt)
+ bt_ops->recv_pkt(common->bt_adapter,
+ frame_desc + offset);
+ }
+ break;
+
default:
rsi_dbg(ERR_ZONE, "%s: pkt from invalid queue: %d\n",
__func__, queueno);
@@ -230,6 +258,20 @@ enum rsi_host_intf rsi_get_host_intf(void *priv)
return common->priv->rsi_host_intf;
}
+void rsi_set_bt_context(void *priv, void *bt_context)
+{
+ struct rsi_common *common = (struct rsi_common *)priv;
+
+ common->bt_adapter = bt_context;
+}
+
+void *rsi_get_bt_context(void *priv)
+{
+ struct rsi_common *common = (struct rsi_common *)priv;
+
+ return common->bt_adapter;
+}
+
/**
* rsi_91x_init() - This function initializes os interface operations.
* @void: Void.
@@ -339,6 +381,11 @@ EXPORT_SYMBOL_GPL(rsi_91x_deinit);
static int rsi_91x_hal_module_init(void)
{
rsi_dbg(INIT_ZONE, "%s: Module init called\n", __func__);
+
+ g_proto_ops.bt_ops = rsi_get_hci_ops();
+ if (!g_proto_ops.bt_ops)
+ rsi_dbg(ERR_ZONE, "Failed to get BT ops\n");
+
return 0;
}
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 9fbc0ef..26abe51 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -16,6 +16,7 @@
*/
#include <linux/firmware.h>
+#include <linux/rsi_header.h>
#include "rsi_sdio.h"
#include "rsi_common.h"
diff --git a/drivers/net/wireless/rsi/rsi_common.h b/drivers/net/wireless/rsi/rsi_common.h
index 1d8af41..4616585 100644
--- a/drivers/net/wireless/rsi/rsi_common.h
+++ b/drivers/net/wireless/rsi/rsi_common.h
@@ -62,6 +62,7 @@ static inline int rsi_create_kthread(struct rsi_common *common,
u8 *name)
{
init_completion(&thread->completion);
+ atomic_set(&thread->thread_done, 0);
thread->task = kthread_run(func_ptr, common, "%s", name);
if (IS_ERR(thread->task))
return (int)PTR_ERR(thread->task);
diff --git a/drivers/net/wireless/rsi/rsi_hal.h b/drivers/net/wireless/rsi/rsi_hal.h
index a09d36b..e712223 100644
--- a/drivers/net/wireless/rsi/rsi_hal.h
+++ b/drivers/net/wireless/rsi/rsi_hal.h
@@ -145,8 +145,18 @@ struct rsi_data_desc {
u8 sta_id;
} __packed;
+struct rsi_bt_desc {
+ __le16 len_qno;
+ __le16 reserved1;
+ __le32 reserved2;
+ __le32 reserved3;
+ __le16 reserved4;
+ __le16 bt_pkt_type;
+} __packed;
+
int rsi_hal_device_init(struct rsi_hw *adapter);
int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb);
int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb);
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb);
#endif
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index e1c1dc8..033cc8c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -290,6 +290,9 @@ struct rsi_common {
bool p2p_enabled;
struct timer_list roc_timer;
struct ieee80211_vif *roc_vif;
+
+ /* BT params */
+ void *bt_adapter;
};
struct eepromrw_info {
@@ -363,5 +366,7 @@ struct rsi_host_intf_ops {
};
enum rsi_host_intf rsi_get_host_intf(void *priv);
+void rsi_set_bt_context(void *priv, void *bt_context);
+void *rsi_get_bt_context(void *priv);
#endif
--git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
index 277f748..8e87d55 100644
--- a/include/linux/rsi_header.h
+++ b/include/linux/rsi_header.h
@@ -53,4 +53,6 @@ struct rsi_mod_ops {
void (*detach)(void *priv);
int (*recv_pkt)(void *priv, u8 *msg);
};
+
+struct rsi_mod_ops *rsi_get_hci_ops(void);
#endif
--
2.7.4
^ permalink raw reply related
* [PATCH 7/8] rsi: add module parameter operating mode
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Operating mode determines the support for other protocols.
This is made as module parameter for better usage.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_91x_main.c | 58 ++++++++++++++++++++++++++++-----
drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 +++++-
drivers/net/wireless/rsi/rsi_91x_usb.c | 10 +++++-
drivers/net/wireless/rsi/rsi_common.h | 2 +-
drivers/net/wireless/rsi/rsi_hal.h | 11 +++++++
5 files changed, 80 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 00f54c5..084b779 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -69,8 +69,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
static char *opmode_str(int oper_mode)
{
switch (oper_mode) {
- case RSI_DEV_OPMODE_WIFI_ALONE:
+ case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+ case DEV_OPMODE_BT_ALONE:
+ return "BT EDR alone";
+ case DEV_OPMODE_BT_LE_ALONE:
+ return "BT LE alone";
+ case DEV_OPMODE_BT_DUAL:
+ return "BT Dual";
+ case DEV_OPMODE_STA_BT:
+ return "Wi-Fi STA + BT EDR";
+ case DEV_OPMODE_STA_BT_LE:
+ return "Wi-Fi STA + BT LE";
+ case DEV_OPMODE_STA_BT_DUAL:
+ return "Wi-Fi STA + BT DUAL";
+ case DEV_OPMODE_AP_BT:
+ return "Wi-Fi AP + BT EDR";
+ case DEV_OPMODE_AP_BT_DUAL:
+ return "Wi-Fi AP + BT DUAL";
}
return "Unknown";
@@ -278,7 +294,7 @@ void *rsi_get_bt_context(void *priv)
*
* Return: Pointer to the adapter structure on success, NULL on failure .
*/
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
{
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -320,11 +336,34 @@ struct rsi_hw *rsi_91x_init(void)
spin_lock_init(&adapter->ps_lock);
timer_setup(&common->roc_timer, rsi_roc_timeout, 0);
init_completion(&common->wlan_init_completion);
+ common->oper_mode = oper_mode;
common->init_done = true;
-
- common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
- common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
+
+ /* Determine coex mode */
+ switch (common->oper_mode) {
+ case DEV_OPMODE_STA_BT_DUAL:
+ case DEV_OPMODE_STA_BT:
+ case DEV_OPMODE_STA_BT_LE:
+ case DEV_OPMODE_BT_ALONE:
+ case DEV_OPMODE_BT_LE_ALONE:
+ case DEV_OPMODE_BT_DUAL:
+ common->coex_mode = 2;
+ break;
+ case DEV_OPMODE_AP_BT_DUAL:
+ case DEV_OPMODE_AP_BT:
+ common->coex_mode = 4;
+ break;
+ case DEV_OPMODE_WIFI_ALONE:
+ common->coex_mode = 1;
+ break;
+ default:
+ common->oper_mode = 1;
+ common->coex_mode = 1;
+ }
+ rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+ __func__, common->oper_mode, common->coex_mode);
+
if (common->coex_mode > 1) {
if (rsi_coex_attach(common)) {
rsi_dbg(ERR_ZONE, "Failed to init coex module\n");
@@ -359,10 +398,13 @@ void rsi_91x_deinit(struct rsi_hw *adapter)
for (ii = 0; ii < NUM_SOFT_QUEUES; ii++)
skb_queue_purge(&common->tx_queue[ii]);
- common->init_done = false;
-
- if (common->coex_mode > 1)
+ if (common->coex_mode > 1) {
rsi_coex_detach(common);
+ if (g_proto_ops.bt_ops->detach)
+ g_proto_ops.bt_ops->detach(common->bt_adapter);
+ }
+
+ common->init_done = false;
kfree(common);
kfree(adapter->rsi_dev);
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
#include "rsi_coex.h"
#include "rsi_hal.h"
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+ "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+ "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+ "6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
/**
* rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
* @rw: Read/write
@@ -926,7 +934,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
- adapter = rsi_91x_init();
+ adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b09c7da..a30305e 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -21,6 +21,14 @@
#include "rsi_hal.h"
#include "rsi_coex.h"
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+ "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+ "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+ "6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
/**
* rsi_usb_card_write() - This function writes to the USB Card.
* @adapter: Pointer to the adapter structure.
@@ -708,7 +716,7 @@ static int rsi_probe(struct usb_interface *pfunction,
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
- adapter = rsi_91x_init();
+ adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_common.h b/drivers/net/wireless/rsi/rsi_common.h
index 4616585..d9ff3b8 100644
--- a/drivers/net/wireless/rsi/rsi_common.h
+++ b/drivers/net/wireless/rsi/rsi_common.h
@@ -81,7 +81,7 @@ static inline int rsi_kill_thread(struct rsi_thread *handle)
void rsi_mac80211_detach(struct rsi_hw *hw);
u16 rsi_get_connected_channel(struct ieee80211_vif *vif);
-struct rsi_hw *rsi_91x_init(void);
+struct rsi_hw *rsi_91x_init(u16 oper_mode);
void rsi_91x_deinit(struct rsi_hw *adapter);
int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len);
#ifdef CONFIG_PM
diff --git a/drivers/net/wireless/rsi/rsi_hal.h b/drivers/net/wireless/rsi/rsi_hal.h
index e712223..a7d3011 100644
--- a/drivers/net/wireless/rsi/rsi_hal.h
+++ b/drivers/net/wireless/rsi/rsi_hal.h
@@ -17,6 +17,17 @@
#ifndef __RSI_HAL_H__
#define __RSI_HAL_H__
+/* Device Operating modes */
+#define DEV_OPMODE_WIFI_ALONE 1
+#define DEV_OPMODE_BT_ALONE 4
+#define DEV_OPMODE_BT_LE_ALONE 8
+#define DEV_OPMODE_BT_DUAL 12
+#define DEV_OPMODE_STA_BT 5
+#define DEV_OPMODE_STA_BT_LE 9
+#define DEV_OPMODE_STA_BT_DUAL 13
+#define DEV_OPMODE_AP_BT 6
+#define DEV_OPMODE_AP_BT_DUAL 14
+
#define FLASH_WRITE_CHUNK_SIZE (4 * 1024)
#define FLASH_SECTOR_SIZE (4 * 1024)
--
2.7.4
^ permalink raw reply related
* [PATCH 8/8] rsi: sdio changes to support BT
From: Amitkumar Karwar @ 2017-11-15 7:20 UTC (permalink / raw)
To: Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth
In-Reply-To: <1510730444-3237-1-git-send-email-amitkarwar@gmail.com>
From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw *adapter,
int status;
queueno = ((pkt[1] >> 4) & 0xf);
+ if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+ queueno = RSI_BT_Q;
num_blocks = len / block_size;
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 26abe51..83652bd 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
rcv_pkt_len = (num_blks * 256);
- common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+ common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
--
2.7.4
^ permalink raw reply related
* Re: [v2] ath9k: add MSI support
From: Daniel Drake @ 2017-11-15 7:38 UTC (permalink / raw)
To: Kalle Valo
Cc: Russell Hu, linux-wireless@vger.kernel.org, Ryan Hsu,
Robert Chang, Aeolus Yang, ath9k-devel, linux@endlessm.com,
rafael.j.wysocki@intel.com, andy@infradead.org
In-Reply-To: <87bmk5hx9x.fsf@kamboji.qca.qualcomm.com>
On Tue, Nov 14, 2017 at 8:15 PM, Kalle Valo <kvalo@qca.qualcomm.com> wrote:
>> Can't be fixed in firmware, but it would be good to have confirmation
>> of the hardware behavivour, and maybe some other solution is possible?
>> Are you following this up within Qualcomm?
>
> No time to do that right now, sorry.
I got several autoresponders from people on this thread from Qualcomm
Taiwan. Would it be useful for us to drop off a sample of the affected
product at your Taipei or Hsinchu office so that you can investigate
further?
Thanks
Daniel
^ permalink raw reply
* Re: AP mode with Broadcom 4330
From: Arend van Spriel @ 2017-11-15 8:47 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-wireless, brcm80211-dev-list.pdl, brcm80211-dev-list
In-Reply-To: <20171114230723.GB31757@n2100.armlinux.org.uk>
On 11/15/2017 12:07 AM, Russell King - ARM Linux wrote:
> Arend,
>
> Did this bug ever get fixed, or are 4330's still ending up advertising
> BCRM_TEST_SSID when they're put into AP mode with mainline kernels?
>
> It would be good to know whether I can drop my patch for this from my
> kernel tree and still have working AP mode.
Hi Russell,
For now keep it as this thread got dusty on my end. Sorry about that. I
can submit a patch for brcmfmac disabling mbss, which may be what you
are carrying in your kernel tree right now. As 4330 is out there for a
while I guess it is good to make it a stable patch.
Regards,
Arend
> Thanks.
>
> On Mon, Jul 31, 2017 at 10:28:50PM +0200, Arend van Spriel wrote:
>> On 31-07-17 14:59, Russell King - ARM Linux wrote:
>>> On Fri, Jul 28, 2017 at 09:50:21PM +0200, Arend van Spriel wrote:
>>>> I was going to agree with you, but having second thoughts. There are
>>>> actually two use-cases that need to be handled properly. The regular AP
>>>> case and the MBSS case. In case of MBSS the initial AP interface will
>>>> have mbss set to false and subsequent AP interfaces will have mbss set
>>>> to true, but in firmware this has to be configured inverted. That is
>>>> what the code above is doing. However, this indeed breaks the regular AP
>>>> case for firmwares that abuse that setting for testing purposes (no idea
>>>> why that is in a released firmware).
>>>
>>> Maybe detect the BCRM_TEST_SSID string in the firmware file (as it's
>>> broken up amongst other data, it's not trivial) and disable mbss for
>>> such firmware? Alternatively, maybe blacklist mbss for some firmware
>>> versions?
>>
>> Well. It seem 43362 chip also had this and we disabled mbss for that
>> chipset. So we may do that for 4330 as well.
>>
>>> Do the firmware versions that include this "abuse" actually have
>>> functional mbss?
>>
>> Digging through our internal bug database I found a remark that
>> BRCM_TEST_SSID showing up means mbss is not functional.
>>
>>> There's also the obvious question: which firmware is recommended for
>>> the 4330?
>>
>> We tend to rely on what is released to AOSP as our team does not have
>> the bandwidth to go through the release process. I checked and it is
>> still the same so matches what is in linux-firmware.
>>
>> Regards,
>> Arend
>
^ permalink raw reply
* Re: [PATCH 7/8] rsi: add module parameter operating mode
From: Arend van Spriel @ 2017-11-15 8:56 UTC (permalink / raw)
To: Amitkumar Karwar, Kalle Valo, marcel
Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1510730444-3237-8-git-send-email-amitkarwar@gmail.com>
On 11/15/2017 8:20 AM, Amitkumar Karwar wrote:
> From: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
>
> Operating mode determines the support for other protocols.
> This is made as module parameter for better usage.
>
> Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
> Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
> ---
[...]
> -struct rsi_hw *rsi_91x_init(void)
> +struct rsi_hw *rsi_91x_init(u16 oper_mode)
> {
> struct rsi_hw *adapter = NULL;
> struct rsi_common *common = NULL;
> @@ -320,11 +336,34 @@ struct rsi_hw *rsi_91x_init(void)
> spin_lock_init(&adapter->ps_lock);
> timer_setup(&common->roc_timer, rsi_roc_timeout, 0);
> init_completion(&common->wlan_init_completion);
> + common->oper_mode = oper_mode;
> common->init_done = true;
> -
> - common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
> - common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
> adapter->device_model = RSI_DEV_9113;
Seems there are definitions for coex_mode....
> +
> + /* Determine coex mode */
> + switch (common->oper_mode) {
> + case DEV_OPMODE_STA_BT_DUAL:
> + case DEV_OPMODE_STA_BT:
> + case DEV_OPMODE_STA_BT_LE:
> + case DEV_OPMODE_BT_ALONE:
> + case DEV_OPMODE_BT_LE_ALONE:
> + case DEV_OPMODE_BT_DUAL:
> + common->coex_mode = 2;
... why use magic values here ?
> + break;
> + case DEV_OPMODE_AP_BT_DUAL:
> + case DEV_OPMODE_AP_BT:
> + common->coex_mode = 4;
> + break;
> + case DEV_OPMODE_WIFI_ALONE:
> + common->coex_mode = 1;
> + break;
> + default:
> + common->oper_mode = 1;
> + common->coex_mode = 1;
> + }
> + rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
> + __func__, common->oper_mode, common->coex_mode);
> +
> if (common->coex_mode > 1) {
> if (rsi_coex_attach(common)) {
> rsi_dbg(ERR_ZONE, "Failed to init coex module\n");
> @@ -359,10 +398,13 @@ void rsi_91x_deinit(struct rsi_hw *adapter)
> for (ii = 0; ii < NUM_SOFT_QUEUES; ii++)
> skb_queue_purge(&common->tx_queue[ii]);
>
> - common->init_done = false;
> -
> - if (common->coex_mode > 1)
> + if (common->coex_mode > 1) {
> rsi_coex_detach(common);
> + if (g_proto_ops.bt_ops->detach)
> + g_proto_ops.bt_ops->detach(common->bt_adapter);
> + }
> +
> + common->init_done = false;
Regards,
Arend
^ permalink raw reply
* Re: mesh point and ap mode on same interface
From: Kalle Valo @ 2017-11-15 10:01 UTC (permalink / raw)
To: Peter Oh
Cc: Harms, Hannes, Ben Greear, ath10k@lists.infradead.org,
linux-wireless@vger.kernel.org
In-Reply-To: <03700343-7b5c-b21e-8b7b-2ac8c7d3258b@bowerswilkins.com>
(adding linux-wireless for a cfg80211 question)
Peter Oh <peter.oh@bowerswilkins.com> writes:
> On 11/08/2017 04:49 AM, Harms, Hannes wrote:
>
>> I found a solution for the problem:
>>
>> When joining the mesh with beacon interval set to 100
>> both mesh and ap interface are coming up.
>>
>> > iw mesh0 mesh join my_mesh beacon-interval 100
>>
>> The default beacon interval is 1000 for mesh interfaces.
>> It seems that QCA9880 is not working
>> with different beacon intervals for ap + mesh.
>
> Good to hear that working. But mesh beacon interval 1000 which is
> default value should work. Any mesh beacon intervals of multiple of AP
> beacon intervals are supposed to work.
>
> (In other words, mesh beacon intervals that are not aligned by
>multiple of AP beacon intervals won't work). These are valid for both
>of QCA9880 and QCA4019 as far as I know.
It would be nice if ath10k could print a warning if the beacon intervals
are not compatible. Or is there a way to enforce the beacon interval
with help of cfg80211 or mac80211?
--=20
Kalle Valo=
^ permalink raw reply
* Re: mesh point and ap mode on same interface
From: Arend van Spriel @ 2017-11-15 10:13 UTC (permalink / raw)
To: Kalle Valo, Peter Oh
Cc: Harms, Hannes, Ben Greear, ath10k@lists.infradead.org,
linux-wireless@vger.kernel.org
In-Reply-To: <87po8jhncx.fsf@kamboji.qca.qualcomm.com>
On 11/15/2017 11:01 AM, Kalle Valo wrote:
> (adding linux-wireless for a cfg80211 question)
>
> Peter Oh <peter.oh@bowerswilkins.com> writes:
>> On 11/08/2017 04:49 AM, Harms, Hannes wrote:
>>
>>> I found a solution for the problem:
>>>
>>> When joining the mesh with beacon interval set to 100
>>> both mesh and ap interface are coming up.
>>>
>>>> iw mesh0 mesh join my_mesh beacon-interval 100
>>>
>>> The default beacon interval is 1000 for mesh interfaces.
>>> It seems that QCA9880 is not working
>>> with different beacon intervals for ap + mesh.
>>
>> Good to hear that working. But mesh beacon interval 1000 which is
>> default value should work. Any mesh beacon intervals of multiple of AP
>> beacon intervals are supposed to work.
>>
>> (In other words, mesh beacon intervals that are not aligned by
>> multiple of AP beacon intervals won't work). These are valid for both
>> of QCA9880 and QCA4019 as far as I know.
>
> It would be nice if ath10k could print a warning if the beacon intervals
> are not compatible. Or is there a way to enforce the beacon interval
> with help of cfg80211 or mac80211?
There is beacon interval checking in utility function
cfg80211_check_combinations() ->
cfg80211_iter_combinations() -> cfg80211_calculate_bi_data() for that.
However, it seems brcmfmac is the only user of that function according
to lxr (or elixir).
Regards,
Arend
^ permalink raw reply
* Re: mesh point and ap mode on same interface
From: Kalle Valo @ 2017-11-15 10:27 UTC (permalink / raw)
To: Arend van Spriel
Cc: Peter Oh, Harms, Hannes, Ben Greear, ath10k@lists.infradead.org,
linux-wireless@vger.kernel.org
In-Reply-To: <5A0C133E.8080305@broadcom.com>
Arend van Spriel <arend.vanspriel@broadcom.com> writes:
> On 11/15/2017 11:01 AM, Kalle Valo wrote:
>> (adding linux-wireless for a cfg80211 question)
>>
>> Peter Oh <peter.oh@bowerswilkins.com> writes:
>>> On 11/08/2017 04:49 AM, Harms, Hannes wrote:
>>>
>>>> I found a solution for the problem:
>>>>
>>>> When joining the mesh with beacon interval set to 100
>>>> both mesh and ap interface are coming up.
>>>>
>>>>> iw mesh0 mesh join my_mesh beacon-interval 100
>>>>
>>>> The default beacon interval is 1000 for mesh interfaces.
>>>> It seems that QCA9880 is not working
>>>> with different beacon intervals for ap + mesh.
>>>
>>> Good to hear that working. But mesh beacon interval 1000 which is
>>> default value should work. Any mesh beacon intervals of multiple of AP
>>> beacon intervals are supposed to work.
>>>
>>> (In other words, mesh beacon intervals that are not aligned by
>>> multiple of AP beacon intervals won't work). These are valid for both
>>> of QCA9880 and QCA4019 as far as I know.
>>
>> It would be nice if ath10k could print a warning if the beacon intervals
>> are not compatible. Or is there a way to enforce the beacon interval
>> with help of cfg80211 or mac80211?
>
> There is beacon interval checking in utility function
> cfg80211_check_combinations() ->
> cfg80211_iter_combinations() -> cfg80211_calculate_bi_data() for that.
Nice, that looks useful. Thanks for the tip.
> However, it seems brcmfmac is the only user of that function according
> to lxr (or elixir).
git-grep says the same.
--=20
Kalle Valo=
^ permalink raw reply
* Re: mesh point and ap mode on same interface
From: Arend van Spriel @ 2017-11-15 10:36 UTC (permalink / raw)
To: Kalle Valo
Cc: Peter Oh, Harms, Hannes, Ben Greear, ath10k@lists.infradead.org,
linux-wireless@vger.kernel.org
In-Reply-To: <87lgj7hm5e.fsf@kamboji.qca.qualcomm.com>
On 11/15/2017 11:27 AM, Kalle Valo wrote:
> Arend van Spriel <arend.vanspriel@broadcom.com> writes:
>
>> On 11/15/2017 11:01 AM, Kalle Valo wrote:
>>> (adding linux-wireless for a cfg80211 question)
>>>
>>> Peter Oh <peter.oh@bowerswilkins.com> writes:
>>>> On 11/08/2017 04:49 AM, Harms, Hannes wrote:
>>>>
>>>>> I found a solution for the problem:
>>>>>
>>>>> When joining the mesh with beacon interval set to 100
>>>>> both mesh and ap interface are coming up.
>>>>>
>>>>>> iw mesh0 mesh join my_mesh beacon-interval 100
>>>>>
>>>>> The default beacon interval is 1000 for mesh interfaces.
>>>>> It seems that QCA9880 is not working
>>>>> with different beacon intervals for ap + mesh.
>>>>
>>>> Good to hear that working. But mesh beacon interval 1000 which is
>>>> default value should work. Any mesh beacon intervals of multiple of AP
>>>> beacon intervals are supposed to work.
>>>>
>>>> (In other words, mesh beacon intervals that are not aligned by
>>>> multiple of AP beacon intervals won't work). These are valid for both
>>>> of QCA9880 and QCA4019 as far as I know.
>>>
>>> It would be nice if ath10k could print a warning if the beacon intervals
>>> are not compatible. Or is there a way to enforce the beacon interval
>>> with help of cfg80211 or mac80211?
>>
>> There is beacon interval checking in utility function
>> cfg80211_check_combinations() ->
>> cfg80211_iter_combinations() -> cfg80211_calculate_bi_data() for that.
>
> Nice, that looks useful. Thanks for the tip.
Initally was added by:
commit 0c317a02ca982ca093e71bf07cb562265ba40032
Author: Purushottam Kushwaha <pkushwah@qti.qualcomm.com>
Date: Wed Oct 12 18:26:51 2016 +0530
cfg80211: support virtual interfaces with different beacon intervals
And last touched by Johannes:
commit 4c8dea638c16141adb046fd2e0cab51dfe43650c
Author: Johannes Berg <johannes.berg@intel.com>
Date: Fri Oct 21 14:25:13 2016 +0200
cfg80211: validate beacon int as part of iface combinations
The last commit message has some info on how to use in case of AP/mesh.
>> However, it seems brcmfmac is the only user of that function according
>> to lxr (or elixir).
>
> git-grep says the same.
Yeah. git-grep has not sunk in my system yet ;-)
Regards,
Arend
^ permalink raw reply
* Re: Re: [PATCH 1/3] mwifiex: refactor device dump code to make it generic for usb interface
From: Xinming Hu @ 2017-11-15 11:05 UTC (permalink / raw)
To: Brian Norris, Xinming Hu
Cc: Linux Wireless, Kalle Valo, Dmitry Torokhov, rajatja@google.com,
Zhiyuan Yang, Tim Song, Cathy Luo, Ganapathi Bhat, James Cao
SGkgQnJpYW4sDQoNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBCcmlh
biBOb3JyaXMgW21haWx0bzpicmlhbm5vcnJpc0BjaHJvbWl1bS5vcmddDQo+IFNlbnQ6IDIwMTfE
6jjUwjE1yNUgNzo0NQ0KPiBUbzogWGlubWluZyBIdSA8aHV4aW5taW5nODIwQGdtYWlsLmNvbT4N
Cj4gQ2M6IExpbnV4IFdpcmVsZXNzIDxsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmc+OyBL
YWxsZSBWYWxvDQo+IDxrdmFsb0Bjb2RlYXVyb3JhLm9yZz47IERtaXRyeSBUb3Jva2hvdiA8ZHRv
ckBnb29nbGUuY29tPjsNCj4gcmFqYXRqYUBnb29nbGUuY29tOyBaaGl5dWFuIFlhbmcgPHlhbmd6
eUBtYXJ2ZWxsLmNvbT47IFRpbSBTb25nDQo+IDxzb25ndGFvQG1hcnZlbGwuY29tPjsgQ2F0aHkg
THVvIDxjbHVvQG1hcnZlbGwuY29tPjsgR2FuYXBhdGhpIEJoYXQNCj4gPGdiaGF0QG1hcnZlbGwu
Y29tPjsgWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gU3ViamVjdDogW0VYVF0gUmU6
IFtQQVRDSCAxLzNdIG13aWZpZXg6IHJlZmFjdG9yIGRldmljZSBkdW1wIGNvZGUgdG8gbWFrZSBp
dA0KPiBnZW5lcmljIGZvciB1c2IgaW50ZXJmYWNlDQo+IA0KPiBFeHRlcm5hbCBFbWFpbA0KPiAN
Cj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQ0KPiBPbiBNb24sIEF1ZyAxNCwgMjAxNyBhdCAxMjoxOTowMVBNICsw
MDAwLCBYaW5taW5nIEh1IHdyb3RlOg0KPiA+IEZyb206IFhpbm1pbmcgSHUgPGh1eG1AbWFydmVs
bC5jb20+DQo+ID4NCj4gPiBUaGlzIHBhdGNoIHJlZmFjdG9yIGN1cnJlbnQgZGV2aWNlIGR1bXAg
Y29kZSB0byBtYWtlIGl0IGdlbmVyaWMgZm9yDQo+ID4gc3Vic2VxdWVudCBpbXBsZW1lbnRhdGlv
biBvbiB1c2IgaW50ZXJmYWNlLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogWGlubWluZyBIdSA8
aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBDYXRoeSBMdW8gPGNsdW9AbWFy
dmVsbC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogR2FuYXBhdGhpIEJoYXQgPGdiaGF0QG1hcnZl
bGwuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZp
ZXgvbWFpbi5jIHwgOTANCj4gPiArKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQ0KPiA+IGRy
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmggfCAxMSArKystDQo+ID4g
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYyB8IDEzICsrKy0tDQo+
ID4gZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYyB8IDE0ICsrKy0t
DQo+ID4gIDQgZmlsZXMgY2hhbmdlZCwgNzQgaW5zZXJ0aW9ucygrKSwgNTQgZGVsZXRpb25zKC0p
DQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lm
aWV4L21haW4uYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21h
aW4uYw0KPiA+IGluZGV4IGVlNDBiNzMuLjkxOWQ5MWEgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYw0KPiA+ICsrKyBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMNCj4gPiBAQCAtMTA1Miw5ICsxMDUy
LDI2IEBAIHZvaWQgbXdpZmlleF9tdWx0aV9jaGFuX3Jlc3luYyhzdHJ1Y3QNCj4gPiBtd2lmaWV4
X2FkYXB0ZXIgKmFkYXB0ZXIpICB9DQo+ID4gRVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF9tdWx0
aV9jaGFuX3Jlc3luYyk7DQo+ID4NCj4gPiAtaW50IG13aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1
Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCB2b2lkDQo+ID4gKipkcnZfaW5mbykNCj4gPiAr
dm9pZCBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcCh1bnNpZ25lZCBsb25nIGZ1bmN0aW9uX2Nv
bnRleHQpDQo+IA0KPiBNeSBleWVzISBJdCBidXJucyENCj4gDQo+IE1vc3QgY2FsbGVycyBkb24n
dCBuZWVkIHRoZSBjYXN0aW5nLCBzbyB0aGlzIGxvb2tzIHRlcnJpYmx5IHVuc2FmZS4NCj4gUGxl
YXNlIGtlZXAgdGhlIGNhc3RpbmcgdG8gb25seSB3aGVyZSBpdCdzIG5lZWRlZCAoaS5lLiwgaW4g
dGhlIHRpbWVyLXJlbGF0ZWQNCj4gY29kZSkuDQoNCk15IGZhdWx0LCB3aWxsIGNvcnJlY3QgaXQg
aW4gVjIuDQoNCj4gDQo+IEFsc28sIHdoeSBjYW4ndCB0aGUgY2FsbGVyIHBhc3MgaW4gdGhlIGR1
bXAgZGF0YS9sZW4gdmFsdWVzPyBZb3UncmUgbWFraW5nIFBDSWUNCj4gYW5kIFNESU8gbG9vayBl
dmVuIHVnbGllciwganVzdCBiZWNhdXNlIHlvdSBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byB3cmFw
IHRoaXMNCj4gbmljZWx5IGZvciBVU0IuDQo+IA0KPiBZb3UgbWlnaHQgZG8gYmV0dGVyIHRvIGNv
bnNpZGVyIGhvdyB0byBtYWtlIHRoaXMgbmljZXIgYnkgaW1wbGVtZW50aW5nIGJldHRlcg0KPiBk
cml2ZXIgY2FsbGJhY2tzLCBhbmQgZG9pbmcgbW9zdCBvZiB0aGUgd29yayBpbiB0aGUgY29yZS4N
Cj4gT3ZlcmFsbCwgeW91IHNob3VsZG4ndCBuZWVkIHNvIG1hbnkgZXhwb3J0ZWQgc3ltYm9scy4N
Cj4gDQoNClBsZWFzZSBjaGVjayB0aGUgY29tbWVudHMgYmVsb3cuDQoNCj4gPiAgew0KPiA+IC0J
dm9pZCAqcDsNCj4gPiArCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPQ0KPiA+ICsJ
CShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICopZnVuY3Rpb25fY29udGV4dDsNCj4gPiArDQo+ID4g
KwkvKiBEdW1wIGFsbCB0aGUgbWVtb3J5IGRhdGEgaW50byBzaW5nbGUgZmlsZSwgYSB1c2Vyc3Bh
Y2Ugc2NyaXB0IHdpbGwNCj4gPiArCSAqIGJlIHVzZWQgdG8gc3BsaXQgYWxsIHRoZSBtZW1vcnkg
ZGF0YSB0byBtdWx0aXBsZSBmaWxlcw0KPiA+ICsJICovDQo+ID4gKwltd2lmaWV4X2RiZyhhZGFw
dGVyLCBNU0csDQo+ID4gKwkJICAgICI9PSBtd2lmaWV4IGR1bXAgaW5mb3JtYXRpb24gdG8gL3N5
cy9jbGFzcy9kZXZjb3JlZHVtcA0KPiBzdGFydCIpOw0KPiA+ICsJZGV2X2NvcmVkdW1wdihhZGFw
dGVyLT5kZXYsIGFkYXB0ZXItPmRldmR1bXBfZGF0YSwNCj4gYWRhcHRlci0+ZGV2ZHVtcF9sZW4s
DQo+ID4gKwkJICAgICAgR0ZQX0tFUk5FTCk7DQo+ID4gKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBN
U0csDQo+ID4gKwkJICAgICI9PSBtd2lmaWV4IGR1bXAgaW5mb3JtYXRpb24gdG8gL3N5cy9jbGFz
cy9kZXZjb3JlZHVtcA0KPiBlbmQiKTsgfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4
X3VwbG9hZF9kZXZpY2VfZHVtcCk7DQo+ID4gKw0KPiA+ICt2b2lkIG13aWZpZXhfZHJ2X2luZm9f
ZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKSB7DQo+ID4gKwljaGFyICpwOw0K
PiA+ICAJY2hhciBkcnZfdmVyc2lvbls2NF07DQo+ID4gIAlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpj
YXJkcDsNCj4gPiAgCXN0cnVjdCBzZGlvX21tY19jYXJkICpzZGlvX2NhcmQ7DQo+ID4gQEAgLTEw
NjIsMTcgKzEwNzksMTIgQEAgaW50IG13aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1Y3QNCj4gbXdp
ZmlleF9hZGFwdGVyICphZGFwdGVyLCB2b2lkICoqZHJ2X2luZm8pDQo+ID4gIAlpbnQgaSwgaWR4
Ow0KPiA+ICAJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOw0KPiA+ICAJc3RydWN0IG13aWZpZXhf
ZGVidWdfaW5mbyAqZGVidWdfaW5mbzsNCj4gPiAtCXZvaWQgKmRydl9pbmZvX2R1bXA7DQo+ID4N
Cj4gPiAgCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywgIj09PW13aWZpZXggZHJpdmVyaW5mbyBk
dW1wIHN0YXJ0PT09XG4iKTsNCj4gPg0KPiA+IC0JLyogbWVtb3J5IGFsbG9jYXRlIGhlcmUgc2hv
dWxkIGJlIGZyZWUgaW4gbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAqLw0KPiA+IC0JZHJ2X2lu
Zm9fZHVtcCA9IHZ6YWxsb2MoTVdJRklFWF9EUlZfSU5GT19TSVpFX01BWCk7DQo+ID4gLQ0KPiA+
IC0JaWYgKCFkcnZfaW5mb19kdW1wKQ0KPiA+IC0JCXJldHVybiAwOw0KPiA+IC0NCj4gPiAtCXAg
PSAoY2hhciAqKShkcnZfaW5mb19kdW1wKTsNCj4gPiArCXAgPSBhZGFwdGVyLT5kZXZkdW1wX2Rh
dGE7DQo+ID4gKwlzdHJjcHkocCwgIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZvPT09PT09
PT1cbiIpOw0KPiA+ICsJcCArPSBzdHJsZW4oIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZv
PT09PT09PT1cbiIpOw0KPiA+ICAJcCArPSBzcHJpbnRmKHAsICJkcml2ZXJfbmFtZSA9ICIgIlwi
bXdpZmlleFwiXG4iKTsNCj4gPg0KPiA+ICAJbXdpZmlleF9kcnZfZ2V0X2RyaXZlcl92ZXJzaW9u
KGFkYXB0ZXIsIGRydl92ZXJzaW9uLCBAQCAtMTE1NiwyMQ0KPiA+ICsxMTY4LDE4IEBAIGludCBt
d2lmaWV4X2Rydl9pbmZvX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwNCj4g
dm9pZCAqKmRydl9pbmZvKQ0KPiA+ICAJCWtmcmVlKGRlYnVnX2luZm8pOw0KPiA+ICAJfQ0KPiA+
DQo+ID4gKwlzdHJjcHkocCwgIlxuPT09PT09PT1FbmQgZHVtcD09PT09PT09XG4iKTsNCj4gPiAr
CXAgKz0gc3RybGVuKCJcbj09PT09PT09RW5kIGR1bXA9PT09PT09PVxuIik7DQo+ID4gIAltd2lm
aWV4X2RiZyhhZGFwdGVyLCBNU0csICI9PT1td2lmaWV4IGRyaXZlcmluZm8gZHVtcCBlbmQ9PT1c
biIpOw0KPiA+IC0JKmRydl9pbmZvID0gZHJ2X2luZm9fZHVtcDsNCj4gPiAtCXJldHVybiBwIC0g
ZHJ2X2luZm9fZHVtcDsNCj4gPiArCWFkYXB0ZXItPmRldmR1bXBfbGVuID0gcCAtIGFkYXB0ZXIt
PmRldmR1bXBfZGF0YTsNCj4gPiAgfQ0KPiA+ICBFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X2Ry
dl9pbmZvX2R1bXApOw0KPiA+DQo+ID4gLXZvaWQgbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAo
c3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgdm9pZA0KPiAqZHJ2X2luZm8sDQo+ID4g
LQkJCQlpbnQgZHJ2X2luZm9fc2l6ZSkNCj4gPiArdm9pZCBtd2lmaWV4X3ByZXBhcmVfZndfZHVt
cF9pbmZvKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpDQo+ID4gIHsNCj4gPiAtCXU4
IGlkeCwgKmR1bXBfZGF0YSwgKmZ3X2R1bXBfcHRyOw0KPiA+IC0JdTMyIGR1bXBfbGVuOw0KPiA+
IC0NCj4gPiAtCWR1bXBfbGVuID0gKHN0cmxlbigiPT09PT09PT1TdGFydCBkdW1wIGRyaXZlcmlu
Zm89PT09PT09PVxuIikgKw0KPiA+IC0JCSAgICAgICBkcnZfaW5mb19zaXplICsNCj4gPiAtCQkg
ICAgICAgc3RybGVuKCJcbj09PT09PT09RW5kIGR1bXA9PT09PT09PVxuIikpOw0KPiA+ICsJdTgg
aWR4Ow0KPiA+ICsJY2hhciAqZndfZHVtcF9wdHI7DQo+ID4gKwl1MzIgZHVtcF9sZW4gPSAwOw0K
PiA+DQo+ID4gIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGFkYXB0ZXItPm51bV9tZW1fdHlwZXM7IGlk
eCsrKSB7DQo+ID4gIAkJc3RydWN0IG1lbW9yeV90eXBlX21hcHBpbmcgKmVudHJ5ID0gQEAgLTEx
ODUsMjQgKzExOTQsMjQgQEANCj4gdm9pZA0KPiA+IG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1w
KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQNCj4gKmRydl9pbmZvLA0KPiA+
ICAJCX0NCj4gPiAgCX0NCj4gPg0KPiA+IC0JZHVtcF9kYXRhID0gdnphbGxvYyhkdW1wX2xlbiAr
IDEpOw0KPiA+IC0JaWYgKCFkdW1wX2RhdGEpDQo+ID4gLQkJZ290byBkb25lOw0KPiA+IC0NCj4g
PiAtCWZ3X2R1bXBfcHRyID0gZHVtcF9kYXRhOw0KPiA+ICsJaWYgKGR1bXBfbGVuICsgMSArIGFk
YXB0ZXItPmRldmR1bXBfbGVuID4gTVdJRklFWF9GV19EVU1QX1NJWkUpIHsNCj4gPiArCQkvKiBS
ZWFsbG9jIGluIGNhc2UgYnVmZmVyIG92ZXJmbG93ICovDQo+ID4gKwkJZndfZHVtcF9wdHIgPSB2
emFsbG9jKGR1bXBfbGVuICsgMSArIGFkYXB0ZXItPmRldmR1bXBfbGVuKTsNCj4gPiArCQltd2lm
aWV4X2RiZyhhZGFwdGVyLCBNU0csICJSZWFsbG9jIGRldmljZSBkdW1wIGRhdGEuIik7DQo+ID4g
KwkJaWYgKCFmd19kdW1wX3B0cikgew0KPiA+ICsJCQl2ZnJlZShhZGFwdGVyLT5kZXZkdW1wX2Rh
dGEpOw0KPiA+ICsJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwNCj4gPiArCQkJCSAgICAi
dnphbGxvYyBkZXZkdW1wIGRhdGEgZmFpbHVyZSFcbiIpOw0KPiA+ICsJCQlyZXR1cm47DQo+ID4g
KwkJfQ0KPiA+DQo+ID4gLQkvKiBEdW1wIGFsbCB0aGUgbWVtb3J5IGRhdGEgaW50byBzaW5nbGUg
ZmlsZSwgYSB1c2Vyc3BhY2Ugc2NyaXB0IHdpbGwNCj4gPiAtCSAqIGJlIHVzZWQgdG8gc3BsaXQg
YWxsIHRoZSBtZW1vcnkgZGF0YSB0byBtdWx0aXBsZSBmaWxlcw0KPiA+IC0JICovDQo+ID4gLQlt
d2lmaWV4X2RiZyhhZGFwdGVyLCBNU0csDQo+ID4gLQkJICAgICI9PSBtd2lmaWV4IGR1bXAgaW5m
b3JtYXRpb24gdG8gL3N5cy9jbGFzcy9kZXZjb3JlZHVtcA0KPiBzdGFydCIpOw0KPiA+ICsJCW1l
bW1vdmUoZndfZHVtcF9wdHIsIGFkYXB0ZXItPmRldmR1bXBfZGF0YSwNCj4gPiArCQkJYWRhcHRl
ci0+ZGV2ZHVtcF9sZW4pOw0KPiA+ICsJCXZmcmVlKGFkYXB0ZXItPmRldmR1bXBfZGF0YSk7DQo+
ID4gKwkJYWRhcHRlci0+ZGV2ZHVtcF9kYXRhID0gZndfZHVtcF9wdHI7DQo+ID4gKwl9DQo+ID4N
Cj4gPiAtCXN0cmNweShmd19kdW1wX3B0ciwgIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZv
PT09PT09PT1cbiIpOw0KPiA+IC0JZndfZHVtcF9wdHIgKz0gc3RybGVuKCI9PT09PT09PVN0YXJ0
IGR1bXAgZHJpdmVyaW5mbz09PT09PT09XG4iKTsNCj4gPiAtCW1lbWNweShmd19kdW1wX3B0ciwg
ZHJ2X2luZm8sIGRydl9pbmZvX3NpemUpOw0KPiA+IC0JZndfZHVtcF9wdHIgKz0gZHJ2X2luZm9f
c2l6ZTsNCj4gPiAtCXN0cmNweShmd19kdW1wX3B0ciwgIlxuPT09PT09PT1FbmQgZHVtcD09PT09
PT09XG4iKTsNCj4gPiAtCWZ3X2R1bXBfcHRyICs9IHN0cmxlbigiXG49PT09PT09PUVuZCBkdW1w
PT09PT09PT1cbiIpOw0KPiA+ICsJZndfZHVtcF9wdHIgPSBhZGFwdGVyLT5kZXZkdW1wX2RhdGEg
KyBhZGFwdGVyLT5kZXZkdW1wX2xlbjsNCj4gPg0KPiA+ICAJZm9yIChpZHggPSAwOyBpZHggPCBh
ZGFwdGVyLT5udW1fbWVtX3R5cGVzOyBpZHgrKykgew0KPiA+ICAJCXN0cnVjdCBtZW1vcnlfdHlw
ZV9tYXBwaW5nICplbnRyeSA9IEBAIC0xMjI5LDExICsxMjM4LDggQEANCj4gdm9pZA0KPiA+IG13
aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIs
IHZvaWQNCj4gKmRydl9pbmZvLA0KPiA+ICAJLyogZGV2aWNlIGR1bXAgZGF0YSB3aWxsIGJlIGZy
ZWUgaW4gZGV2aWNlIGNvcmVkdW1wIHJlbGVhc2UgZnVuY3Rpb24NCj4gPiAgCSAqIGFmdGVyIDUg
bWluDQo+ID4gIAkgKi8NCj4gPiAtCWRldl9jb3JlZHVtcHYoYWRhcHRlci0+ZGV2LCBkdW1wX2Rh
dGEsIGR1bXBfbGVuLCBHRlBfS0VSTkVMKTsNCj4gPiAtCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1T
RywNCj4gPiAtCQkgICAgIj09IG13aWZpZXggZHVtcCBpbmZvcm1hdGlvbiB0byAvc3lzL2NsYXNz
L2RldmNvcmVkdW1wIGVuZCIpOw0KPiA+ICsJYWRhcHRlci0+ZGV2ZHVtcF9sZW4gPSBmd19kdW1w
X3B0ciAtIGFkYXB0ZXItPmRldmR1bXBfZGF0YTsNCj4gPg0KPiA+IC1kb25lOg0KPiA+ICAJZm9y
IChpZHggPSAwOyBpZHggPCBhZGFwdGVyLT5udW1fbWVtX3R5cGVzOyBpZHgrKykgew0KPiA+ICAJ
CXN0cnVjdCBtZW1vcnlfdHlwZV9tYXBwaW5nICplbnRyeSA9DQo+ID4gIAkJCSZhZGFwdGVyLT5t
ZW1fdHlwZV9tYXBwaW5nX3RibFtpZHhdOw0KPiA+IEBAIC0xMjQyLDEwICsxMjQ4LDggQEAgdm9p
ZCBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChzdHJ1Y3QNCj4gbXdpZmlleF9hZGFwdGVyICph
ZGFwdGVyLCB2b2lkICpkcnZfaW5mbywNCj4gPiAgCQllbnRyeS0+bWVtX3B0ciA9IE5VTEw7DQo+
ID4gIAkJZW50cnktPm1lbV9zaXplID0gMDsNCj4gPiAgCX0NCj4gPiAtDQo+ID4gLQl2ZnJlZShk
cnZfaW5mbyk7DQo+ID4gIH0NCj4gPiAtRVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF91cGxvYWRf
ZGV2aWNlX2R1bXApOw0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X3ByZXBhcmVfZndf
ZHVtcF9pbmZvKTsNCj4gPg0KPiA+ICAvKg0KPiA+ICAgKiBDRkc4MDIuMTEgbmV0d29yayBkZXZp
Y2UgaGFuZGxlciBmb3Igc3RhdGlzdGljcyByZXRyaWV2YWwuDQo+ID4gZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBpbmRleCAwYWFhZTA4Li5l
MzA4YjhhIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdp
ZmlleC9tYWluLmgNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZp
ZXgvbWFpbi5oDQo+ID4gQEAgLTk0LDYgKzk0LDggQEAgZW51bSB7DQo+ID4NCj4gPiAgI2RlZmlu
ZSBNQVhfRVZFTlRfU0laRSAgICAgICAgICAgICAgICAgIDIwNDgNCj4gPg0KPiA+ICsjZGVmaW5l
IE1XSUZJRVhfRldfRFVNUF9TSVpFICAgICAgICgyICogMTAyNCAqIDEwMjQpDQo+ID4gKw0KPiA+
ICAjZGVmaW5lIEFSUF9GSUxURVJfTUFYX0JVRl9TSVpFICAgICAgICAgNjgNCj4gPg0KPiA+ICAj
ZGVmaW5lIE1XSUZJRVhfS0VZX0JVRkZFUl9TSVpFCQkJMTYNCj4gPiBAQCAtMTAzMyw2ICsxMDM1
LDkgQEAgc3RydWN0IG13aWZpZXhfYWRhcHRlciB7DQo+ID4gIAlib29sIHdha2VfYnlfd2lmaTsN
Cj4gPiAgCS8qIEFnZ3JlZ2F0aW9uIHBhcmFtZXRlcnMqLw0KPiA+ICAJc3RydWN0IGJ1c19hZ2dy
X3BhcmFtcyBidXNfYWdncjsNCj4gPiArCS8qIERldmljZSBkdW1wIGRhdGEvbGVuZ3RoICovDQo+
ID4gKwljaGFyICpkZXZkdW1wX2RhdGE7DQo+IA0KPiBTaG91bGQgYmUgJ3ZvaWQgKicuDQoNCk9r
Lg0KDQo+IA0KPiA+ICsJaW50IGRldmR1bXBfbGVuOw0KPiANCj4gSSByZWFsbHkgcmVhbGx5IGRv
bid0IGxpa2UgeW91IHN0aWNraW5nIHlldCBhbm90aGVyIHRyYW5zaWVudCBwaWVjZSBvZiBkYXRh
IGhlcmUuDQo+IElJVUMsIHlvdSdyZSBqdXN0IGFkbWl0dGluZyB0aGF0IChhZnRlciB0aGUgZmly
c3QgZHVtcCkgeW91J3JlIGdvaW5nIHRvIHdhc3RlDQo+IDJNQisgb2YgbWVtb3J5IGZvcmV2ZXI/
IFBsZWFzZSB0cnkgaGFyZGVyIHRoYW4gdGhhdC4NCj4gDQoNClNvcnJ5LCB0aGUgZGV2ZHVtcF9s
ZW4gc2hvdWxkIGJlIHJlc2V0IGR1cmluZyBzb2Z0d2FyZSBpbml0aXphdGlvbi4NCg0KPiA+ICB9
Ow0KPiA+DQo+ID4gIHZvaWQgbXdpZmlleF9wcm9jZXNzX3R4X3F1ZXVlKHN0cnVjdCBtd2lmaWV4
X2FkYXB0ZXIgKmFkYXB0ZXIpOyBAQA0KPiA+IC0xNjU0LDkgKzE2NTksOSBAQCB2b2lkIG13aWZp
ZXhfaGlzdF9kYXRhX2FkZChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlDQo+ID4gKnByaXYsDQo+ID4g
IHU4IG13aWZpZXhfYWRqdXN0X2RhdGFfcmF0ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2
LA0KPiA+ICAJCQkgICAgdTggcnhfcmF0ZSwgdTggaHRfaW5mbyk7DQo+ID4NCj4gPiAtaW50IG13
aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCB2b2lk
DQo+ID4gKipkcnZfaW5mbyk7IC12b2lkIG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHN0cnVj
dCBtd2lmaWV4X2FkYXB0ZXINCj4gKmFkYXB0ZXIsIHZvaWQgKmRydl9pbmZvLA0KPiA+IC0JCQkJ
aW50IGRydl9pbmZvX3NpemUpOw0KPiA+ICt2b2lkIG13aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1
Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsgdm9pZA0KPiA+ICttd2lmaWV4X3ByZXBhcmVf
ZndfZHVtcF9pbmZvKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOyB2b2lkDQo+ID4g
K213aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHVuc2lnbmVkIGxvbmcgZnVuY3Rpb25fY29udGV4
dCk7DQo+ID4gIHZvaWQgKm13aWZpZXhfYWxsb2NfZG1hX2FsaWduX2J1ZihpbnQgcnhfbGVuLCBn
ZnBfdCBmbGFncyk7ICB2b2lkDQo+ID4gbXdpZmlleF9xdWV1ZV9tYWluX3dvcmsoc3RydWN0IG13
aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7ICBpbnQNCj4gPiBtd2lmaWV4X2dldF93YWtldXBfcmVh
c29uKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHUxNiBhY3Rpb24sDQo+ID4gZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMNCj4gPiBi
L2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMNCj4gPiBpbmRleCBj
ZDMxNDk0Li5kYmM1OTQ0IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h
cnZlbGwvbXdpZmlleC9wY2llLmMNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2
ZWxsL213aWZpZXgvcGNpZS5jDQo+ID4gQEAgLTI3NjksMTIgKzI3NjksMTcgQEAgc3RhdGljIHZv
aWQgbXdpZmlleF9wY2llX2Z3X2R1bXAoc3RydWN0DQo+ID4gbXdpZmlleF9hZGFwdGVyICphZGFw
dGVyKQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9kZXZpY2VfZHVtcF93b3Jr
KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXINCj4gPiAqYWRhcHRlcikgIHsNCj4gPiAtCWludCBkcnZf
aW5mb19zaXplOw0KPiA+IC0Jdm9pZCAqZHJ2X2luZm87DQo+ID4gKwlhZGFwdGVyLT5kZXZkdW1w
X2RhdGEgPSB2emFsbG9jKE1XSUZJRVhfRldfRFVNUF9TSVpFKTsNCj4gPiArCWlmICghYWRhcHRl
ci0+ZGV2ZHVtcF9kYXRhKSB7DQo+ID4gKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsDQo+
ID4gKwkJCSAgICAidnphbGxvYyBkZXZkdW1wIGRhdGEgZmFpbHVyZSFcbiIpOw0KPiA+ICsJCXJl
dHVybjsNCj4gPiArCX0NCj4gPg0KPiA+IC0JZHJ2X2luZm9fc2l6ZSA9IG13aWZpZXhfZHJ2X2lu
Zm9fZHVtcChhZGFwdGVyLCAmZHJ2X2luZm8pOw0KPiA+ICsJbXdpZmlleF9kcnZfaW5mb19kdW1w
KGFkYXB0ZXIpOw0KPiA+ICAJbXdpZmlleF9wY2llX2Z3X2R1bXAoYWRhcHRlcik7DQo+ID4gLQlt
d2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChhZGFwdGVyLCBkcnZfaW5mbywgZHJ2X2luZm9fc2l6
ZSk7DQo+ID4gKwltd2lmaWV4X3ByZXBhcmVfZndfZHVtcF9pbmZvKGFkYXB0ZXIpOw0KPiA+ICsJ
bXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAoKHVuc2lnbmVkIGxvbmcpYWRhcHRlcik7DQo+IA0K
PiBIb3cgZGlkIHlvdSBtYW5hZ2UgdG8gbWFrZSA0IHNlcGFyYXRlIGZ1bmN0aW9uIGNhbGxzIGlu
dG8gNSBzZXBhcmF0ZSBmdW5jdGlvbg0KPiBjYWxscyBhbmQgMSBtZW1vcnkgYWxsb2NhdGlvbj8g
SSdtIHByZXR0eSBzdXJlIHlvdSdyZSBnb2luZyB0aGUgd3JvbmcgZGlyZWN0aW9uDQo+IG9uIHRo
aXMgcmVmYWN0b3JpbmcuDQo+IA0KDQpUaGUgdXNiIGZpcm13YXJlIGR1bXAgbWVjaGFuaXNtIGlz
IGRpZmZlcmVudCBmcm9tIGN1cnJlbnQgcGNpZS9zZGlvIGltcGxlbWVudGF0aW9uLCB0aGUgY29u
dGV4dCBpcyB1cGxvYWRlZCBpbiBtdWx0aXBsZSBGV19EVU1QX0lORk8oMHg3MykgZXZlbnQuDQpV
cG9uIHJlY2VpdmluZyBlYWNoIGV2ZW50LCBuZWVkIHBhc3RlIHRoZSBjb250ZXh0IHRvIGVuZCBv
ZiBwcmV2aW91cyBjb2xsZWN0ZWQgZXZlbnQgZHVtcHMuDQoNClRodXMgd2UgbmVlZCBhZGFwdGVy
LT5kZXZkdW1wX2RhdGEvZGV2ZHVtcF9sZW4gdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IGxvY2F0
aW9uIG9mIGV4aXN0IGR1bXAgbWVtb3J5Lg0KDQpUaGVyZWZvcmUgd2UgY2FuIHVzZSBhIHVuaWZp
ZWQgd2F5IGZvciBhbGwgaW50ZXJmYWNlcywgYW5kIHNpbXBsaWZ5IHRoZSBleGlzdCBQQ0lFL1NE
SU8gZHVtcCBmdW5jdGlvbiwgd2UgZG8gbm90IG5lZWQgdG8gYWxsb2NhdGUgImRydl9pbmZvIiBu
b3cuDQoNCkFsc28sIHRoZXJlIGlzIG5vIG1lbW9yeSByZWdpb24gdGFibGUgZm9yIFVTQiBpbnRl
cmZhY2UsIHNvIHRyeSB0byBzcGxpdCBjdXJyZW50IG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1w
IGZ1bmN0aW9uIHRvDQooMSkgbXdpZmlleF9wcmVwYXJlX2Z3X2R1bXA6ICAgICBjb3B5IHRoZSBk
dW1wIG9mIGVhY2ggbWVtb3J5IHJlZ2lvbiB0byBhZGFwdGVyLT5kZXZkdW1wX2RhdGEsICAgdGhp
cyBpcyB1c2VkIGluIFNESU8gYW5kIFBDSUUNCigyKSBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVt
cAkJY2FsbCBkZXZjb3JlZHVtcCBBUEkgdG8gdXBsb2FkIHRvIHN5c2ZzCSwJCXRoaXMgaXMgdXNl
ZCBpbiBTRElPL1BDSUUgYW5kIFVTQg0KDQpTb3JyeSBmb3IgdGhlIGxhdGVyIHJlc3BvbnNlLCBw
bGVhc2UgbGV0IHVzIGtub3cgeW91ciBzdWdnZXN0aW9ucyBpZiB0aGVyZSBhcmUgYW55IGlzc3Vl
cy4NCg0KPiBCcmlhbg0KPiANCj4gPiAgfQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIG13aWZpZXhf
cGNpZV9jYXJkX3Jlc2V0X3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlcg0KPiA+ICphZGFwdGVy
KSBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8u
Yw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+
IGluZGV4IGZkNTE4M2MuLjgwMTAxMDkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2ly
ZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVs
ZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMNCj4gPiBAQCAtMjUwNSwxNSArMjUwNSwyMSBAQCBz
dGF0aWMgdm9pZA0KPiA+IG13aWZpZXhfc2Rpb19nZW5lcmljX2Z3X2R1bXAoc3RydWN0IG13aWZp
ZXhfYWRhcHRlciAqYWRhcHRlcikgIHN0YXRpYw0KPiA+IHZvaWQgbXdpZmlleF9zZGlvX2Rldmlj
ZV9kdW1wX3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikgIHsNCj4gPiAgCXN0
cnVjdCBzZGlvX21tY19jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsNCj4gPiAtCWludCBkcnZf
aW5mb19zaXplOw0KPiA+IC0Jdm9pZCAqZHJ2X2luZm87DQo+ID4NCj4gPiAtCWRydl9pbmZvX3Np
emUgPSBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoYWRhcHRlciwgJmRydl9pbmZvKTsNCj4gPiArCWFk
YXB0ZXItPmRldmR1bXBfZGF0YSA9IHZ6YWxsb2MoTVdJRklFWF9GV19EVU1QX1NJWkUpOw0KPiA+
ICsJaWYgKCFhZGFwdGVyLT5kZXZkdW1wX2RhdGEpIHsNCj4gPiArCQltd2lmaWV4X2RiZyhhZGFw
dGVyLCBFUlJPUiwNCj4gPiArCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBmYWlsdXJlIVxu
Iik7DQo+ID4gKwkJcmV0dXJuOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCW13aWZpZXhfZHJ2X2lu
Zm9fZHVtcChhZGFwdGVyKTsNCj4gPiAgCWlmIChjYXJkLT5md19kdW1wX2VuaCkNCj4gPiAgCQlt
d2lmaWV4X3NkaW9fZ2VuZXJpY19md19kdW1wKGFkYXB0ZXIpOw0KPiA+ICAJZWxzZQ0KPiA+ICAJ
CW13aWZpZXhfc2Rpb19md19kdW1wKGFkYXB0ZXIpOw0KPiA+IC0JbXdpZmlleF91cGxvYWRfZGV2
aWNlX2R1bXAoYWRhcHRlciwgZHJ2X2luZm8sIGRydl9pbmZvX3NpemUpOw0KPiA+ICsJbXdpZmll
eF9wcmVwYXJlX2Z3X2R1bXBfaW5mbyhhZGFwdGVyKTsNCj4gPiArCW13aWZpZXhfdXBsb2FkX2Rl
dmljZV9kdW1wKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3Rh
dGljIHZvaWQgbXdpZmlleF9zZGlvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQ0KPiA+
IC0tDQo+ID4gMS45LjENCj4gPg0K
^ permalink raw reply
* Re: Re: [PATCH 2/3] mwifiex: device dump support for usb interface
From: Xinming Hu @ 2017-11-15 11:06 UTC (permalink / raw)
To: Brian Norris, Xinming Hu
Cc: Linux Wireless, Kalle Valo, Dmitry Torokhov, rajatja@google.com,
Zhiyuan Yang, Tim Song, Cathy Luo, Ganapathi Bhat, James Cao
SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnJpYW4g
Tm9ycmlzIFttYWlsdG86YnJpYW5ub3JyaXNAY2hyb21pdW0ub3JnXQ0KPiBTZW50OiAyMDE3xOo4
1MIxNcjVIDg6MDENCj4gVG86IFhpbm1pbmcgSHUgPGh1eGlubWluZzgyMEBnbWFpbC5jb20+DQo+
IENjOiBMaW51eCBXaXJlbGVzcyA8bGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnPjsgS2Fs
bGUgVmFsbw0KPiA8a3ZhbG9AY29kZWF1cm9yYS5vcmc+OyBEbWl0cnkgVG9yb2tob3YgPGR0b3JA
Z29vZ2xlLmNvbT47DQo+IHJhamF0amFAZ29vZ2xlLmNvbTsgWmhpeXVhbiBZYW5nIDx5YW5nenlA
bWFydmVsbC5jb20+OyBUaW0gU29uZw0KPiA8c29uZ3Rhb0BtYXJ2ZWxsLmNvbT47IENhdGh5IEx1
byA8Y2x1b0BtYXJ2ZWxsLmNvbT47IEdhbmFwYXRoaSBCaGF0DQo+IDxnYmhhdEBtYXJ2ZWxsLmNv
bT47IFhpbm1pbmcgSHUgPGh1eG1AbWFydmVsbC5jb20+DQo+IFN1YmplY3Q6IFtFWFRdIFJlOiBb
UEFUQ0ggMi8zXSBtd2lmaWV4OiBkZXZpY2UgZHVtcCBzdXBwb3J0IGZvciB1c2IgaW50ZXJmYWNl
DQo+IA0KPiBFeHRlcm5hbCBFbWFpbA0KPiANCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBIaSwNCj4gDQo+
IE9uIE1vbiwgQXVnIDE0LCAyMDE3IGF0IDEyOjE5OjAyUE0gKzAwMDAsIFhpbm1pbmcgSHUgd3Jv
dGU6DQo+ID4gRnJvbTogWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gPg0KPiA+IEZp
cm13YXJlIGR1bXAgb24gdXNiIGludGVyZmFjZSBpcyBkaWZmZXJlbnQgd2l0aCBjdXJyZW50IHNk
aW8vcGNpZQ0KPiA+IGNoaXBzZXQsIHdoaWNoIGlzIGJhc2VkIG9uIHJlZ2lzdGVyIG9wZXJhdGlv
bi4NCj4gPg0KPiA+IFdoZW4gZmlybXdhcmUgaGFuZyBvbiB1c2IgaW50ZXJmYWNlLCBjb250ZXh0
IGR1bXAgd2lsbCBiZSB1cGxvYWQgdG8NCj4gPiBob3N0IHVzaW5nIDB4NzMgZmlybXdhcmUgZGVi
dWcgZXZlbnQuDQo+ID4NCj4gPiBUaGlzIHBhdGNoIHN0b3JlIGR1bXAgZGF0YSBmcm9tIGRlYnVn
IGV2ZW50IGFuZCBzZW5kIHRvIHVzZXJzcGFjZQ0KPiA+IHVzaW5nIGRldmljZSBjb3JlZHVtcCBB
UEkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBYaW5taW5nIEh1IDxodXhtQG1hcnZlbGwuY29t
Pg0KPiA+IFNpZ25lZC1vZmYtYnk6IENhdGh5IEx1byA8Y2x1b0BtYXJ2ZWxsLmNvbT4NCj4gPiBT
aWduZWQtb2ZmLWJ5OiBHYW5hcGF0aGkgQmhhdCA8Z2JoYXRAbWFydmVsbC5jb20+DQo+ID4gLS0t
DQo+ID4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oICAgICAgICB8
ICAxICsNCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYyAg
ICAgIHwgIDMgKysNCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21h
aW4uaCAgICAgIHwgIDIgKysNCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lm
aWV4L3N0YV9ldmVudC5jIHwgMzkNCj4gPiArKysrKysrKysrKysrKysrKysrKysrKysNCj4gPiAg
NCBmaWxlcyBjaGFuZ2VkLCA0NSBpbnNlcnRpb25zKCspDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2Z3LmgNCj4gPiBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oDQo+ID4gaW5kZXggOWU3NTUyMi4uNjEw
YTNlYSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZp
ZXgvZncuaA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9m
dy5oDQo+ID4gQEAgLTU2OCw2ICs1NjgsNyBAQCBlbnVtIG13aWZpZXhfY2hhbm5lbF9mbGFncyB7
DQo+ID4gICNkZWZpbmUgRVZFTlRfQkdfU0NBTl9TVE9QUEVEICAgICAgICAgICAweDAwMDAwMDY1
DQo+ID4gICNkZWZpbmUgRVZFTlRfUkVNQUlOX09OX0NIQU5fRVhQSVJFRCAgICAweDAwMDAwMDVm
DQo+ID4gICNkZWZpbmUgRVZFTlRfTVVMVElfQ0hBTl9JTkZPICAgICAgICAgICAweDAwMDAwMDZh
DQo+ID4gKyNkZWZpbmUgRVZFTlRfRldfRFVNUF9JTkZPCQkweDAwMDAwMDczDQo+ID4gICNkZWZp
bmUgRVZFTlRfVFhfU1RBVFVTX1JFUE9SVAkJMHgwMDAwMDA3NA0KPiA+ICAjZGVmaW5lIEVWRU5U
X0JUX0NPRVhfV0xBTl9QQVJBX0NIQU5HRQkwWDAwMDAwMDc2DQo+ID4NCj4gPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYw0KPiA+IGIvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYw0KPiA+IGluZGV4IGUxMTkx
OWQuLjM4OWQ3MjUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs
bC9td2lmaWV4L2luaXQuYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
bXdpZmlleC9pbml0LmMNCj4gPiBAQCAtMzE1LDYgKzMxNSw4IEBAIHN0YXRpYyB2b2lkIG13aWZp
ZXhfaW5pdF9hZGFwdGVyKHN0cnVjdA0KPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpDQo+ID4g
IAlhZGFwdGVyLT5hY3RpdmVfc2Nhbl90cmlnZ2VyZWQgPSBmYWxzZTsNCj4gPiAgCXNldHVwX3Rp
bWVyKCZhZGFwdGVyLT53YWtldXBfdGltZXIsIHdha2V1cF90aW1lcl9mbiwNCj4gPiAgCQkgICAg
KHVuc2lnbmVkIGxvbmcpYWRhcHRlcik7DQo+ID4gKwlzZXR1cF90aW1lcigmYWRhcHRlci0+ZGV2
ZHVtcF90aW1lciwgbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAsDQo+ID4gKwkJICAgICh1bnNp
Z25lZCBsb25nKWFkYXB0ZXIpOw0KPiA+ICB9DQo+ID4NCj4gPiAgLyoNCj4gPiBAQCAtMzk3LDYg
KzM5OSw3IEBAIHN0YXRpYyB2b2lkIG13aWZpZXhfaW52YWxpZGF0ZV9saXN0cyhzdHJ1Y3QNCj4g
PiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpICBtd2lmaWV4X2FkYXB0ZXJfY2xlYW51cChzdHJ1
Y3QNCj4gPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpICB7DQo+ID4gIAlkZWxfdGltZXIoJmFk
YXB0ZXItPndha2V1cF90aW1lcik7DQo+ID4gKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+ZGV2
ZHVtcF90aW1lcik7DQo+ID4gIAltd2lmaWV4X2NhbmNlbF9hbGxfcGVuZGluZ19jbWQoYWRhcHRl
cik7DQo+ID4gIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPmNtZF93YWl0X3Eud2Fp
dCk7DQo+ID4gIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPmhzX2FjdGl2YXRlX3dh
aXRfcSk7DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdp
ZmlleC9tYWluLmgNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9t
YWluLmgNCj4gPiBpbmRleCBlMzA4YjhhLi42YjAwMjk0IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZl
cnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiArKysgYi9kcml2ZXJz
L25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oDQo+ID4gQEAgLTEwMzgsNiArMTAz
OCw3IEBAIHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgew0KPiA+ICAJLyogRGV2aWNlIGR1bXAgZGF0
YS9sZW5ndGggKi8NCj4gPiAgCWNoYXIgKmRldmR1bXBfZGF0YTsNCj4gPiAgCWludCBkZXZkdW1w
X2xlbjsNCj4gPiArCXN0cnVjdCB0aW1lcl9saXN0IGRldmR1bXBfdGltZXI7DQo+ID4gIH07DQo+
ID4NCj4gPiAgdm9pZCBtd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoc3RydWN0IG13aWZpZXhfYWRh
cHRlciAqYWRhcHRlcik7IEBADQo+ID4gLTE2ODAsNiArMTY4MSw3IEBAIHZvaWQgbXdpZmlleF9w
cm9jZXNzX211bHRpX2NoYW5fZXZlbnQoc3RydWN0DQo+ID4gbXdpZmlleF9wcml2YXRlICpwcml2
LCAgdm9pZCBtd2lmaWV4X211bHRpX2NoYW5fcmVzeW5jKHN0cnVjdA0KPiA+IG13aWZpZXhfYWRh
cHRlciAqYWRhcHRlcik7ICBpbnQgbXdpZmlleF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0DQo+IG13
aWZpZXhfcHJpdmF0ZSAqcHJpdiwNCj4gPiAgCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYp
Ow0KPiA+ICt2b2lkIG13aWZpZXhfZGV2ZHVtcF90bW9fZnVuYyh1bnNpZ25lZCBsb25nIGZ1bmN0
aW9uX2NvbnRleHQpOw0KPiA+DQo+ID4gICNpZmRlZiBDT05GSUdfREVCVUdfRlMNCj4gPiAgdm9p
ZCBtd2lmaWV4X2RlYnVnZnNfaW5pdCh2b2lkKTsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9u
ZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9ldmVudC5jDQo+ID4gYi9kcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMNCj4gPiBpbmRleCA4MzlkZjhh
Li5iY2YyZmEyIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
bXdpZmlleC9zdGFfZXZlbnQuYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdpZmlleC9zdGFfZXZlbnQuYw0KPiA+IEBAIC01ODYsNiArNTg2LDQwIEBAIHZvaWQNCj4g
bXdpZmlleF9idF9jb2V4X3dsYW5fcGFyYW1fdXBkYXRlX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3By
aXZhdGUgKnByaXYsDQo+ID4gIAkJYWRhcHRlci0+Y29leF9yeF93aW5fc2l6ZSk7DQo+ID4gIH0N
Cj4gPg0KPiA+ICtzdGF0aWMgdm9pZA0KPiA+ICttd2lmaWV4X2Z3X2R1bXBfaW5mb19ldmVudChz
dHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LA0KPiA+ICsJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAq
ZXZlbnRfc2tiKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVy
ID0gcHJpdi0+YWRhcHRlcjsNCj4gPiArDQo+ID4gKwlpZiAoYWRhcHRlci0+aWZhY2VfdHlwZSAh
PSBNV0lGSUVYX1VTQikgew0KPiA+ICsJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywNCj4gPiAr
CQkJICAgICJldmVudCBpcyBub3Qgb24gdXNiIGludGVyZmFjZSwgaWdub3JlIGl0XG4iKTsNCj4g
PiArCQlyZXR1cm47DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJaWYgKCFhZGFwdGVyLT5kZXZkdW1w
X2RhdGEpIHsNCj4gPiArCQkvKiBXaGVuIHJlY2VpdmUgdGhlIGZpcnN0IGV2ZW50LCBhbGxvY2F0
ZSBkZXZpY2UgZHVtcA0KPiA+ICsJCSAqIGJ1ZmZlciwgZHVtcCBkcml2ZXIgaW5mby4NCj4gPiAr
CQkgKi8NCj4gPiArCQlhZGFwdGVyLT5kZXZkdW1wX2RhdGEgPSB2emFsbG9jKE1XSUZJRVhfRldf
RFVNUF9TSVpFKTsNCj4gDQo+IERvZXMgdGhpcyBldmVyIGdldCBmcmVlZD8NCg0KU3VyZSwgaXQg
d2lsbCBiZSBmcmVlZCBieSBkZXZjb3JlZHVtcCBmcmFtZXdvcmssIDVtaW5zIGFmdGVyIGRyaXZl
ciBjYWxsIGRldl9jb3JlZHVtcA0KDQo+IA0KPiA+ICsJCWlmICghYWRhcHRlci0+ZGV2ZHVtcF9k
YXRhKSB7DQo+ID4gKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLA0KPiA+ICsJCQkJICAg
ICJ2emFsbG9jIGRldmR1bXAgZGF0YSBmYWlsdXJlIVxuIik7DQo+ID4gKwkJCXJldHVybjsNCj4g
PiArCQl9DQo+ID4gKw0KPiA+ICsJCW13aWZpZXhfZHJ2X2luZm9fZHVtcChhZGFwdGVyKTsNCj4g
PiArCX0NCj4gPiArDQo+ID4gKwltZW1tb3ZlKGFkYXB0ZXItPmRldmR1bXBfZGF0YSArIGFkYXB0
ZXItPmRldmR1bXBfbGVuLA0KPiA+ICsJCWFkYXB0ZXItPmV2ZW50X2JvZHksIGV2ZW50X3NrYi0+
bGVuIC0NCj4gTVdJRklFWF9FVkVOVF9IRUFERVJfTEVOKTsNCj4gPiArCWFkYXB0ZXItPmRldmR1
bXBfbGVuICs9IChldmVudF9za2ItPmxlbiAtDQo+IE1XSUZJRVhfRVZFTlRfSEVBREVSX0xFTik7
DQo+IA0KPiBBcmUgeW91IGdvaW5nIHRvIHRyeSB0byBjaGVjayBmb3Igb3ZlcmZsb3c/DQoNClRo
YW5rcyBmb3IgdGhlIHBvaW50LCB3aWxsIGFkZCB0aGUgY2hlY2sgaW4gVjIuDQoNCj4gDQo+ID4g
KwkvKiBJZiBubyBwcm9jZWVkZWQgZXZlbnQgYXJyaXZlIGluIDEwcywgdXBsb2FkIGRldmljZSBk
dW1wIGRhdGEqLw0KPiANCj4gWW91IG1pc3NlZCBhIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGNv
bW1lbnQuIFNob3VsZCBiZToNCj4gDQo+IAkvKiBJZiBubyBwcm9jZWVkZWQgZXZlbnQgYXJyaXZl
IGluIDEwcywgdXBsb2FkIGRldmljZSBkdW1wIGRhdGEuICovDQo+IA0KPiBBbHNvLCBpcyB0aGF0
IHJlYWxseSB0aGUgb25seSB3YXkgdG8gc2lnbmFsIHRoYXQgdGhlIGZpcm13YXJlIGR1bXAgaGFz
DQo+IGNvbXBsZXRlZD8gQnkgdGltaW5nIG91dD8gVGhhdCBzZWVtcyBsaWtlIGEgdmVyeSBiYWQg
ZGVzaWduLiBDYW4geW91DQo+IGltcGxlbWVudCBhbiAiZW5kIG9mIHRyYW5zbWlzc2lvbiIgc2ln
bmFsPw0KDQpHb29kIHN1Z2dlc3Rpb24sICBMYXRlc3QgZmlybXdhcmUgd2lsbCBzZXQgdGhlIHNp
Z25hbCBpbiB0aGUgbGFzdCBGV19EVU1QX0lORk8gZXZlbnQsIHdpbGwgYXBwbHkgaXQgaW4gVjIu
DQoNCkluIGNhc2UgdGhlICJlbmQgb2YgdHJhbnNtaXNzaW9uIiBldmVudCBsb3N0IGluIHNvbWUg
Y29ybmVsIGNhc2UsIHdlIHdvdWxkIGxpa2UgdG8gYWRkIGEgMTBzIHRpbWVyIHRvIHRyaWdnZXIg
dGhlIGR1bXAgdXBsb2FkIHRvIHVzZXJzcGFjZS4NCg0KUmVnYXJkcywNClNpbW9uDQoNCj4gDQo+
IEJyaWFuDQo+IA0KPiA+ICsJbW9kX3RpbWVyKCZhZGFwdGVyLT5kZXZkdW1wX3RpbWVyLA0KPiA+
ICsJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTVdJRklFWF9USU1FUl8xMFMpKTsNCj4g
PiArfQ0KPiA+ICsNCj4gPiAgLyoNCj4gPiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50
cyBnZW5lcmF0ZWQgYnkgZmlybXdhcmUuDQo+ID4gICAqDQo+ID4gQEAgLTYzOCw2ICs2NzIsNyBA
QCB2b2lkDQo+IG13aWZpZXhfYnRfY29leF93bGFuX3BhcmFtX3VwZGF0ZV9ldmVudChzdHJ1Y3Qg
bXdpZmlleF9wcml2YXRlICpwcml2LA0KPiA+ICAgKiAgICAgIC0gRVZFTlRfREVMQkENCj4gPiAg
ICogICAgICAtIEVWRU5UX0JBX1NUUkVBTV9USUVNT1VUDQo+ID4gICAqICAgICAgLSBFVkVOVF9B
TVNEVV9BR0dSX0NUUkwNCj4gPiArICogICAgICAtIEVWRU5UX0ZXX0RVTVBfSU5GTw0KPiA+ICAg
Ki8NCj4gPiAgaW50IG13aWZpZXhfcHJvY2Vzc19zdGFfZXZlbnQoc3RydWN0IG13aWZpZXhfcHJp
dmF0ZSAqcHJpdikgIHsgQEANCj4gPiAtMTAwOSw2ICsxMDQ0LDEwIEBAIGludCBtd2lmaWV4X3By
b2Nlc3Nfc3RhX2V2ZW50KHN0cnVjdA0KPiBtd2lmaWV4X3ByaXZhdGUgKnByaXYpDQo+ID4gIAkJ
CQkJICAgIGFkYXB0ZXItPmV2ZW50X3NrYi0+bGVuIC0NCj4gPiAgCQkJCQkgICAgc2l6ZW9mKGV2
ZW50Y2F1c2UpKTsNCj4gPiAgCQlicmVhazsNCj4gPiArCWNhc2UgRVZFTlRfRldfRFVNUF9JTkZP
Og0KPiA+ICsJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVWRU5ULCAiZXZlbnQ6IGZpcm13YXJlIGRl
YnVnIGluZm9cbiIpOw0KPiA+ICsJCW13aWZpZXhfZndfZHVtcF9pbmZvX2V2ZW50KHByaXYsIGFk
YXB0ZXItPmV2ZW50X3NrYik7DQo+ID4gKwkJYnJlYWs7DQo+ID4gIAkvKiBEZWJ1Z2dpbmcgZXZl
bnQ7IG5vdCB1c2VkLCBidXQgbGV0J3Mgbm90IHByaW50IGFuIEVSUk9SIGZvciBpdC4gKi8NCj4g
PiAgCWNhc2UgRVZFTlRfVU5LTk9XTl9ERUJVRzoNCj4gPiAgCQltd2lmaWV4X2RiZyhhZGFwdGVy
LCBFVkVOVCwgImV2ZW50OiBkZWJ1Z1xuIik7DQo+ID4gLS0NCj4gPiAxLjkuMQ0KPiA+DQo=
^ permalink raw reply
* Re: Re: [PATCH 3/3] mwifiex: debugfs: trigger device dump for usb interface
From: Xinming Hu @ 2017-11-15 11:31 UTC (permalink / raw)
To: Brian Norris, Xinming Hu
Cc: Linux Wireless, Kalle Valo, Dmitry Torokhov, rajatja@google.com,
Zhiyuan Yang, Tim Song, Cathy Luo, Ganapathi Bhat, James Cao
SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnJpYW4g
Tm9ycmlzIFttYWlsdG86YnJpYW5ub3JyaXNAY2hyb21pdW0ub3JnXQ0KPiBTZW50OiAyMDE3xOo4
1MIxNcjVIDc6NDkNCj4gVG86IFhpbm1pbmcgSHUgPGh1eGlubWluZzgyMEBnbWFpbC5jb20+DQo+
IENjOiBMaW51eCBXaXJlbGVzcyA8bGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnPjsgS2Fs
bGUgVmFsbw0KPiA8a3ZhbG9AY29kZWF1cm9yYS5vcmc+OyBEbWl0cnkgVG9yb2tob3YgPGR0b3JA
Z29vZ2xlLmNvbT47DQo+IHJhamF0amFAZ29vZ2xlLmNvbTsgWmhpeXVhbiBZYW5nIDx5YW5nenlA
bWFydmVsbC5jb20+OyBUaW0gU29uZw0KPiA8c29uZ3Rhb0BtYXJ2ZWxsLmNvbT47IENhdGh5IEx1
byA8Y2x1b0BtYXJ2ZWxsLmNvbT47IEdhbmFwYXRoaSBCaGF0DQo+IDxnYmhhdEBtYXJ2ZWxsLmNv
bT47IFhpbm1pbmcgSHUgPGh1eG1AbWFydmVsbC5jb20+DQo+IFN1YmplY3Q6IFtFWFRdIFJlOiBb
UEFUQ0ggMy8zXSBtd2lmaWV4OiBkZWJ1Z2ZzOiB0cmlnZ2VyIGRldmljZSBkdW1wIGZvciB1c2IN
Cj4gaW50ZXJmYWNlDQo+IA0KPiBFeHRlcm5hbCBFbWFpbA0KPiANCj4gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K
PiBIaSwNCj4gDQo+IE9uIE1vbiwgQXVnIDE0LCAyMDE3IGF0IDEyOjE5OjAzUE0gKzAwMDAsIFhp
bm1pbmcgSHUgd3JvdGU6DQo+ID4gRnJvbTogWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4N
Cj4gPg0KPiA+IFRoaXMgcGF0Y2ggZXh0ZW5kIGRldmljZV9kdW1wIGRlYnVnZnMgZnVuY3Rpb24g
dG8gbWFrZSBpdCB3b3JrcyBmb3INCj4gPiB1c2IgaW50ZXJmYWNlLg0KPiA+DQo+ID4gU2lnbmVk
LW9mZi1ieTogWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gPiBTaWduZWQtb2ZmLWJ5
OiBDYXRoeSBMdW8gPGNsdW9AbWFydmVsbC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogR2FuYXBh
dGhpIEJoYXQgPGdiaGF0QG1hcnZlbGwuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL25ldC93
aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMgIHwgMTEgKysrKysrKy0tLS0NCj4gPiBk
cml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jIHwgIDkgKysrKyst
LS0tDQo+ID4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oICAgICAg
fCAgMSArDQo+ID4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21k
LmMgfCAgNCArKysrDQo+ID4gIDQgZmlsZXMgY2hhbmdlZCwgMTcgaW5zZXJ0aW9ucygrKSwgOCBk
ZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9t
YXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdpZmlleC9jbWRldnQuYw0KPiA+IGluZGV4IDBlZGM1ZDYuLmIxNmRkNmEgMTAwNjQ0DQo+
ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NtZGV2dC5jDQo+
ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NtZGV2dC5jDQo+
ID4gQEAgLTI5MCwxMyArMjkwLDE2IEBAIHN0YXRpYyBpbnQgbXdpZmlleF9kbmxkX2NtZF90b19m
dyhzdHJ1Y3QNCj4gbXdpZmlleF9wcml2YXRlICpwcml2LA0KPiA+ICAJYWRhcHRlci0+ZGJnLmxh
c3RfY21kX2FjdFthZGFwdGVyLT5kYmcubGFzdF9jbWRfaW5kZXhdID0NCj4gPiAgCQkJZ2V0X3Vu
YWxpZ25lZF9sZTE2KCh1OCAqKWhvc3RfY21kICsgU19EU19HRU4pOw0KPiA+DQo+ID4gKwkvKiBT
ZXR1cCB0aGUgdGltZXIgYWZ0ZXIgdHJhbnNtaXQgY29tbWFuZCwgZXhjZXB0IHRoYXQgc3BlY2lm
aWMNCj4gPiArCSAqIGNvbW1hbmQgbWlnaHQgbm90IGhhdmUgY29tbWFuZCByZXNwb25zZS4NCj4g
PiArCSAqLw0KPiA+ICsJaWYgKGNtZF9jb2RlICE9IEhvc3RDbWRfQ01EX0ZXX0RVTVBfRVZFTlQp
DQo+ID4gKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT5jbWRfdGltZXIsDQo+ID4gKwkJCSAgamlmZmll
cyArIG1zZWNzX3RvX2ppZmZpZXMoTVdJRklFWF9USU1FUl8xMFMpKTsNCj4gPiArDQo+ID4gIAkv
KiBDbGVhciBCU1NfTk9fQklUUyBmcm9tIEhvc3RDbWQgKi8NCj4gPiAgCWNtZF9jb2RlICY9IEhv
c3RDbWRfQ01EX0lEX01BU0s7DQo+ID4NCj4gPiAtCS8qIFNldHVwIHRoZSB0aW1lciBhZnRlciB0
cmFuc21pdCBjb21tYW5kICovDQo+ID4gLQltb2RfdGltZXIoJmFkYXB0ZXItPmNtZF90aW1lciwN
Cj4gPiAtCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1XSUZJRVhfVElNRVJfMTBTKSk7
DQo+ID4gLQ0KPiA+ICAJcmV0dXJuIDA7DQo+ID4gIH0NCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9k
cml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jDQo+ID4gYi9kcml2
ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jDQo+ID4gaW5kZXggNmY0
MjM5Yi4uNWQ0NzZkZSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2
ZWxsL213aWZpZXgvZGVidWdmcy5jDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy
dmVsbC9td2lmaWV4L2RlYnVnZnMuYw0KPiA+IEBAIC0xNjgsMTAgKzE2OCwxMSBAQA0KPiA+ICB7
DQo+ID4gIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRh
Ow0KPiA+DQo+ID4gLQlpZiAoIXByaXYtPmFkYXB0ZXItPmlmX29wcy5kZXZpY2VfZHVtcCkNCj4g
PiAtCQlyZXR1cm4gLUVJTzsNCj4gPiAtDQo+ID4gLQlwcml2LT5hZGFwdGVyLT5pZl9vcHMuZGV2
aWNlX2R1bXAocHJpdi0+YWRhcHRlcik7DQo+ID4gKwlpZiAocHJpdi0+YWRhcHRlci0+aWZhY2Vf
dHlwZSA9PSBNV0lGSUVYX1VTQikNCj4gPiArCQltd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RD
bWRfQ01EX0ZXX0RVTVBfRVZFTlQsDQo+ID4gKwkJCQkgSG9zdENtZF9BQ1RfR0VOX1NFVCwgMCwg
TlVMTCwgdHJ1ZSk7DQo+IA0KPiBXaHkgY291bGRuJ3QgeW91IGp1c3QgaW1wbGVtZW50IHRoZSBk
ZXZpY2VfZHVtcCgpIGNhbGxiYWNrPw0KDQpDdXJyZW50bHkgbXdpZmlleF9zZW5kX2NtZCBmdW5j
dGlvbiBpcyBub3QgZXhwb3J0ZWQgdG8gZXh0ZXJuYWwgbW9kdWxlcywgaXQgaXMgZGVzaWduZWQg
Zm9yIG1vZHVsZSBtd2lmaWV4IGludGVybmFsIHVzZS4NCg0KSWYgd2UgZXhwb3J0IG13aWZpZXhf
c2VuZF9jbWQsIGFuZCBjYWxsIGl0IGluIG13aWZpZXhfdXNiLiBUaGVyZSB3aWxsIGJlIGEgbG9v
cCwNCg0KLkRldmljZV9kdW1wIChtb2R1bGUgbXdpZmlleF91c2IpICAtLT4gIG13aWZpZXhfc2Vu
ZF9jbWQobW9kdWxlIG13aWZpZXgpICAtLT4gLmhvc3RfdG9fY2FyZCAobW9kdWxlIG13aWZpZXhf
dXNiKQ0KDQpUaGlzIHNlZW1zIG5vdCBhbiBlbGVnYW50IGRlc2lnbiwgcmlnaHQ/DQoNCg0KUmVn
YXJkcywNClNpbW9uDQo+IA0KPiA+ICsJZWxzZQ0KPiA+ICsJCXByaXYtPmFkYXB0ZXItPmlmX29w
cy5kZXZpY2VfZHVtcChwcml2LT5hZGFwdGVyKTsNCj4gPg0KPiA+ICAJcmV0dXJuIDA7DQo+ID4g
IH0NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4
L2Z3LmgNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oDQo+
ID4gaW5kZXggNjEwYTNlYS4uMmQzYTY0NCAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL25ldC93
aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVs
ZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oDQo+ID4gQEAgLTM5OCw2ICszOTgsNyBAQCBlbnVtIE1X
SUZJRVhfODAyXzExX1BSSVZBQ1lfRklMVEVSIHsNCj4gPiAgI2RlZmluZSBIb3N0Q21kX0NNRF9U
RExTX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwDQo+ID4gICNkZWZpbmUgSG9z
dENtZF9DTURfTUNfUE9MSUNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMQ0KPiA+ICAj
ZGVmaW5lIEhvc3RDbWRfQ01EX1RETFNfT1BFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAx
MjINCj4gPiArI2RlZmluZSBIb3N0Q21kX0NNRF9GV19EVU1QX0VWRU5UCQkgICAgICAweDAxMjUN
Cj4gPiAgI2RlZmluZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHICAgICAgICAgICAg
ICAgMHgwMjIzDQo+ID4gICNkZWZpbmUgSG9zdENtZF9DTURfQ0hBTl9SRUdJT05fQ0ZHCQkgICAg
ICAweDAyNDINCj4gPiAgI2RlZmluZSBIb3N0Q21kX0NNRF9QQUNLRVRfQUdHUl9DVFJMCQkgICAg
ICAweDAyNTENCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L3N0YV9jbWQuYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lm
aWV4L3N0YV9jbWQuYw0KPiA+IGluZGV4IGZiMDkwMTQuLjIxMWU0N2QgMTAwNjQ0DQo+ID4gLS0t
IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWQuYw0KPiA+ICsr
KyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMNCj4gPiBA
QCAtMjIwNiw2ICsyMjA2LDEwIEBAIGludCBtd2lmaWV4X3N0YV9wcmVwYXJlX2NtZChzdHJ1Y3QN
Cj4gbXdpZmlleF9wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfbm8sDQo+ID4gIAljYXNlIEhv
c3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRzoNCj4gPiAgCQlyZXQgPSBtd2lmaWV4X2NtZF9jaGFu
X3JlZ2lvbl9jZmcocHJpdiwgY21kX3B0ciwgY21kX2FjdGlvbik7DQo+ID4gIAkJYnJlYWs7DQo+
ID4gKwljYXNlIEhvc3RDbWRfQ01EX0ZXX0RVTVBfRVZFTlQ6DQo+ID4gKwkJY21kX3B0ci0+Y29t
bWFuZCA9IGNwdV90b19sZTE2KGNtZF9ubyk7DQo+ID4gKwkJY21kX3B0ci0+c2l6ZSA9IGNwdV90
b19sZTE2KFNfRFNfR0VOKTsNCj4gPiArCQlicmVhazsNCj4gPiAgCWRlZmF1bHQ6DQo+ID4gIAkJ
bXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsDQo+ID4gIAkJCSAgICAiUFJFUF9DTUQ6
IHVua25vd24gY21kLSAlI3hcbiIsIGNtZF9ubyk7DQo+ID4gLS0NCj4gPiAxLjkuMQ0KPiA+DQo=
^ permalink raw reply
* [bug report] mac80211: fix VLAN handling with TXQs
From: Dan Carpenter @ 2017-11-15 12:29 UTC (permalink / raw)
To: johannes.berg; +Cc: linux-wireless
[ I fixed a Smatch bug and now it started warning about this code -dan ]
Hello Johannes Berg,
This is a semi-automatic email about new static checker warnings.
The patch 531682159092: "mac80211: fix VLAN handling with TXQs" from
Jun 22, 2017, leads to the following Smatch complaint:
net/mac80211/tx.c:3529 ieee80211_tx_dequeue()
error: we previously assumed 'skb' could be null (see line 3511)
net/mac80211/tx.c
3500 tx.key, skb);
3501 } else {
3502 if (invoke_tx_handlers_late(&tx))
3503 goto begin;
3504
3505 skb = __skb_dequeue(&tx.skbs);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The NULL skb would have to come from here.
3506
3507 if (!skb_queue_empty(&tx.skbs))
3508 skb_queue_splice_tail(&tx.skbs, &txqi->frags);
3509 }
3510
3511 if (skb && skb_has_frag_list(skb) &&
^^^
Old code checks
3512 !ieee80211_hw_check(&local->hw, TX_FRAG_LIST)) {
3513 if (skb_linearize(skb)) {
3514 ieee80211_free_txskb(&local->hw, skb);
3515 goto begin;
3516 }
3517 }
3518
3519 switch (tx.sdata->vif.type) {
3520 case NL80211_IFTYPE_MONITOR:
3521 if (tx.sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
3522 vif = &tx.sdata->vif;
3523 break;
3524 }
3525 tx.sdata = rcu_dereference(local->monitor_sdata);
3526 if (tx.sdata) {
3527 vif = &tx.sdata->vif;
3528 info->hw_queue =
3529 vif->hw_queue[skb_get_queue_mapping(skb)];
^^^
Patch adds unchecked dereference (might be a false positive).
3530 } else if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
3531 ieee80211_free_txskb(&local->hw, skb);
regards,
dan carpenter
^ permalink raw reply
* Re: [bug report] mac80211: fix VLAN handling with TXQs
From: Johannes Berg @ 2017-11-15 14:43 UTC (permalink / raw)
To: Dan Carpenter; +Cc: linux-wireless
In-Reply-To: <20171115122952.2rzx6kv2lycq5go5@mwanda>
Hi Dan,
> This is a semi-automatic email about new static checker warnings.
>
> The patch 531682159092: "mac80211: fix VLAN handling with TXQs" from
> Jun 22, 2017, leads to the following Smatch complaint:
>
> net/mac80211/tx.c:3529 ieee80211_tx_dequeue()
> error: we previously assumed 'skb' could be null (see line 3511)
Thanks for the report.
> net/mac80211/tx.c
> 3500 tx.key, skb);
> 3501 } else {
> 3502 if (invoke_tx_handlers_late(&tx))
> 3503 goto begin;
> 3504
> 3505 skb = __skb_dequeue(&tx.skbs);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> The NULL skb would have to come from here.
Yeah - this can't actually be empty at this point, as far as I can
tell.
> 3511 if (skb && skb_has_frag_list(skb) &&
> ^^^
> Old code checks
So I guess this is just useless.
I can send a patch to remove this if the warning bothers you much, or
I'll defer until I get smatch updated and it starts bothering me ;-)
johannes
^ permalink raw reply
* Re: [PATCH 2/8] rsi: add bluetooth rx endpoint
From: Marcel Holtmann @ 2017-11-15 15:23 UTC (permalink / raw)
To: Amitkumar Karwar
Cc: Kalle Valo, linux-wireless, Amitkumar Karwar,
Prameela Rani Garnepudi, open list:BLUETOOTH DRIVERS,
Siva Rebbagondla
In-Reply-To: <1510730444-3237-3-git-send-email-amitkarwar@gmail.com>
Hi Amitkumar,
> USB endpoint 1 is used for WLAN which is presently in use.
> USB endpoint 2 is introduced for BT Rx traffic. Enumeration
> of Rx BT endpoint and submitting Rx BT URB are added.
wouldn’t it be good to include the /sys/kernel/debug/usb/devices part here that shows how the USB device’s layout.
Regards
Marcel
^ 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