Linux wireless drivers development
 help / color / mirror / Atom feed
* pull-request: iwlwifi-next 2017-12-05
From: Luca Coelho @ 2017-12-05 19:10 UTC (permalink / raw)
  To: kvalo; +Cc: linux-wireless, linuxwifi, david.e.box, janet.morgan, joe.konno

[-- Attachment #1: Type: text/plain, Size: 4170 bytes --]

Hi Kalle,

This is my second batch of patches intended for v4.16.  As I mentioned
in the patchset thread, I moved patches 5/15 and 6/16 to iwlwifi-fixes. 
Otherwise nothing major here, just the usual continued development.
More details about the contents in the tag description.

I have sent this out before and kbuildbot reported success.

Please let me know if there are any issues.

Cheers,
Luca.


The following changes since commit 80b0ebd488b3edaf3e5ed08c34a952c804e3a635:

  Merge tag 'iwlwifi-next-for-kalle-2017-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next (2017-12-02 15:22:54 +0200)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git tags/iwlwifi-next-for-kalle-2017-12-05

for you to fetch changes up to 0190ff24e55efd3e02479537c2d91835602fffa3:

  iwlwifi: mvm: request statistics when reading debugfs (2017-12-05 21:01:43 +0200)

----------------------------------------------------------------
Second batch of iwlwifi updates for v4.16

* Initial work for rate-scaling offload;
* Support for new FW API version;
* Some fixes here and there;

----------------------------------------------------------------
Avraham Stern (1):
      iwlwifi: mvm: add WFA vendor specific TPC report IE to probe request

Emmanuel Grumbach (1):
      iwlwifi: mvm: remove set but unused variable in iwl_mvm_roc_done_wk

Gregory Greenman (7):
      iwlwifi: mvm: rs: introduce new API for rate scaling
      iwlwifi: mvm: rs: add ops for the new rate scaling in the FW
      iwlwifi: mvm: rs: add basic implementation of the new RS API handlers
      iwlwifi: mvm: rs: new rate scale API - add FW notifications
      iwlwifi: mvm: rs: new rate scale API - add debugfs hooks
      iwlwifi: mvm: rs: add size checks when printing to a buffer
      iwlwifi: mvm: rs: add sanity check when sending LQ command

Johannes Berg (1):
      iwlwifi: mvm: request statistics when reading debugfs

Liad Kaufman (1):
      iwlwifi: mvm: make init_dbg effective only on failure

Luca Coelho (1):
      iwlwifi: bump FW API to 36 for 8000 and up

Sara Sharon (1):
      iwlwifi: mvm: avoid dumping assert log when device is stopped

 drivers/net/wireless/intel/iwlwifi/cfg/22000.c       |   2 +-
 drivers/net/wireless/intel/iwlwifi/cfg/8000.c        |   4 +-
 drivers/net/wireless/intel/iwlwifi/cfg/9000.c        |   2 +-
 drivers/net/wireless/intel/iwlwifi/fw/api/datapath.h |  15 +++++
 drivers/net/wireless/intel/iwlwifi/fw/api/rs.h       | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 drivers/net/wireless/intel/iwlwifi/fw/file.h         |   2 +
 drivers/net/wireless/intel/iwlwifi/mvm/Makefile      |   2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c     |  79 ++++++++++++++++++++++++-
 drivers/net/wireless/intel/iwlwifi/mvm/fw.c          |   8 +--
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c    |  13 +++-
 drivers/net/wireless/intel/iwlwifi/mvm/mvm.h         |  10 +++-
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c         |   9 ++-
 drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c       | 314 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/net/wireless/intel/iwlwifi/mvm/rs.c          | 230 ++++++++++++++++++++++++++++++++++++++---------------------------------
 drivers/net/wireless/intel/iwlwifi/mvm/rs.h          |  48 +++++++++++++++
 drivers/net/wireless/intel/iwlwifi/mvm/rx.c          |   2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c        |   2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/scan.c        |  35 ++++++++++-
 drivers/net/wireless/intel/iwlwifi/mvm/sta.c         |  19 +++++-
 drivers/net/wireless/intel/iwlwifi/mvm/sta.h         |   7 ++-
 drivers/net/wireless/intel/iwlwifi/mvm/time-event.c  |   9 +--
 drivers/net/wireless/intel/iwlwifi/mvm/tx.c          |   8 ++-
 drivers/net/wireless/intel/iwlwifi/mvm/utils.c       |  14 ++++-
 23 files changed, 952 insertions(+), 144 deletions(-)
 create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [RFC PATCH 2/2] nl80211: implement beacon change notifier
From: Sergey Matyukevich @ 2017-12-05 20:31 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Igor Mitsyanko, Avinash Patil, Marianna Carrera
In-Reply-To: <1511784144.5456.12.camel@sipsolutions.net>

Hello Johannes,

> > In our case, we are experimenting with applications running along with
> > hostapd and enabling band steering and client roaming functionality.
> > As I mentioned, various approaches are being examined, including
> > both pure nl80211-based approach as well as adding direct hooks
> > to hostapd.
> 
> To be honest, I'm torn on this.
> 
> On the one hand, I think it's fairly reasonable functionality, but on
> the other hand I'm not sure we should encourage such separate
> approaches - it seems to me that will lead to a lot of fragmentation
> and much harder debuggability for upstream where these things get used.
> 
> It's also a bunch of code we have to maintain, for nothing that seems
> of use to the community - since it's the sort of flexibility explicitly
> designed for non-public code (otherwise it could just be part of
> hostapd; actually it could even if it were non-public, at least in
> theory, unless you're planning it as a value-add thing to go with an
> open source hostapd ...).
> 
> So while I don't want to stop you entirely in your tracks with this,
> I'd really prefer you explore other options regarding where to put your
> client steering functionality, perhaps even working on hostapd.

Well, our preferred approach for these experiments is going to be
communication with hostapd instead of kernel. One of the reasons
is that GET_CMD_BEACON is not enough. We have to enable multiple
listeners of mgmt frames as well. However that feature was rejected
earlier this year: https://patchwork.kernel.org/patch/9615697

By the way, speaking about GET_CMD_BEACON and its possible users in the
community. There is already a stub for it in nl80211 uapi headers. What
was the original idea for that ? Or was it just a placeholder added
together with SET_BEACON ?

Regards,
Sergey

^ permalink raw reply

* Re: rsi_91x: Failed to read status register on failed authentication
From: Amitkumar Karwar @ 2017-12-06  7:13 UTC (permalink / raw)
  To: Alexey Brodkin
  Cc: amit.karwar@redpinesignals.com, linux-wireless@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-snps-arc@lists.infradead.org
In-Reply-To: <1512490314.4977.143.camel@synopsys.com>

On Tue, Dec 5, 2017 at 9:41 PM, Alexey Brodkin
<Alexey.Brodkin@synopsys.com> wrote:
> Hi Amit,
>
> I'm seeing quite a strange behavior of RedPine module.
> It connects perfectly fine to one of access points but fails
> to connect to another.
>
> Moreover after that failure RSI driver starts to flood me with
> messages saying:
> --------------------->8--------------------
> rsi_91x: rsi_sdio_check_buffer_status: Failed to read status register
> --------------------->8--------------------
>
> Below you may find details of my 2 experiments.
> Note I use vanilla Linux kernel v4.14.4
>
> Any ideas what could be wrong?
>

Could you enable driver debug zones and share dmesg log for analysis?

echo 0xffffffff > /sys/kernel/debug/phy0/debug_zone

Regards,
Amitkumar

^ permalink raw reply

* RE: [EXT] Re: [PATCH v4 1/3] mwifiex: refactor device dump code to make it generic for usb interface
From: Xinming Hu @ 2017-12-06  9:31 UTC (permalink / raw)
  To: Brian Norris
  Cc: Linux Wireless, Kalle Valo, Dmitry Torokhov, rajatja@google.com,
	Zhiyuan Yang, Tim Song, Cathy Luo, James Cao, Ganapathi Bhat,
	Ellie Reeves
In-Reply-To: <20171205182544.GA126555@google.com>

SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnJpYW4g
Tm9ycmlzIFttYWlsdG86YnJpYW5ub3JyaXNAY2hyb21pdW0ub3JnXQ0KPiBTZW50OiAyMDE3xOox
MtTCNsjVIDI6MjYNCj4gVG86IFhpbm1pbmcgSHUgPGh1eG1AbWFydmVsbC5jb20+DQo+IENjOiBM
aW51eCBXaXJlbGVzcyA8bGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnPjsgS2FsbGUgVmFs
bw0KPiA8a3ZhbG9AY29kZWF1cm9yYS5vcmc+OyBEbWl0cnkgVG9yb2tob3YgPGR0b3JAZ29vZ2xl
LmNvbT47DQo+IHJhamF0amFAZ29vZ2xlLmNvbTsgWmhpeXVhbiBZYW5nIDx5YW5nenlAbWFydmVs
bC5jb20+OyBUaW0gU29uZw0KPiA8c29uZ3Rhb0BtYXJ2ZWxsLmNvbT47IENhdGh5IEx1byA8Y2x1
b0BtYXJ2ZWxsLmNvbT47IEphbWVzIENhbw0KPiA8amNhb0BtYXJ2ZWxsLmNvbT47IEdhbmFwYXRo
aSBCaGF0IDxnYmhhdEBtYXJ2ZWxsLmNvbT47IEVsbGllIFJlZXZlcw0KPiA8ZWxsaWVyZXZ2ZXNA
Z21haWwuY29tPg0KPiBTdWJqZWN0OiBbRVhUXSBSZTogW1BBVENIIHY0IDEvM10gbXdpZmlleDog
cmVmYWN0b3IgZGV2aWNlIGR1bXAgY29kZSB0byBtYWtlIGl0DQo+IGdlbmVyaWMgZm9yIHVzYiBp
bnRlcmZhY2UNCj4gDQo+IEV4dGVybmFsIEVtYWlsDQo+IA0KPiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+IEhp
LA0KPiANCj4gT24gTW9uLCBEZWMgMDQsIDIwMTcgYXQgMDg6MTg6NDJQTSArMDgwMCwgWGlubWlu
ZyBIdSB3cm90ZToNCj4gPiBUaGlzIHBhdGNoIHJlZmFjdG9yIGN1cnJlbnQgZGV2aWNlIGR1bXAg
Y29kZSB0byBtYWtlIGl0IGdlbmVyaWMgZm9yDQo+ID4gc3Vic2VxdWVudCBpbXBsZW1lbnRhdGlv
biBvbiB1c2IgaW50ZXJmYWNlLg0KPiANCj4gSSBzdGlsbCB0aGluayB5b3UncmUgbWFraW5nIHRo
ZSBzcGFnaGV0dGkgd29yc2UuIEkgb25seSBoYXZlIGEgZmV3IHNwZWNpZmljDQo+IHN1Z2dlc3Rp
b25zIGZvciBpbXByb3ZpbmcgeW91ciBzcGFnaGV0dGkgY29kZSBhdCB0aGUgbW9tZW50LCBidXQg
SSdtIHN0aWxsIHN1cmUNCj4geW91IGNvdWxkIGRvIGJldHRlci4NCj4gDQpPaywgVGhhbmtzLg0K
DQo+ID4gU2lnbmVkLW9mZi1ieTogWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gPiBT
aWduZWQtb2ZmLWJ5OiBDYXRoeSBMdW8gPGNsdW9AbWFydmVsbC5jb20+DQo+ID4gU2lnbmVkLW9m
Zi1ieTogR2FuYXBhdGhpIEJoYXQgPGdiaGF0QG1hcnZlbGwuY29tPg0KPiA+IC0tLQ0KPiA+IHYy
OiBBZGRyZXNzZWQgYmVsb3cgcmV2aWV3IGNvbW1lbnRzIGZyb20gQnJpYW4gTm9ycmlzDQo+ID4g
ICAgIGEpIHVzZSBuZXcgQVBJIHRpbWVyX3NldHVwL2Zyb21fdGltZXIuDQo+ID4gICAgIGIpIHJl
c2V0IGRldmR1bXBfbGVuIGR1cmluZyBpbml0aXphdGlvbg0KPiA+IHY0OiBTYW1lIGFzIHYyLHYz
DQo+ID4gLS0tDQo+ID4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0
LmMgfCAgMSArDQo+ID4gZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4u
YyB8IDg3DQo+ID4gKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0NCj4gPiBkcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oIHwgMTEgKysrLQ0KPiA+IGRyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMgfCAxMyArKystLQ0KPiA+IGRyaXZl
cnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMgfCAxNCArKystLQ0KPiA+ICA1
IGZpbGVzIGNoYW5nZWQsIDcyIGluc2VydGlvbnMoKyksIDU0IGRlbGV0aW9ucygtKQ0KPiA+DQo+
ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0
LmMNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMNCj4g
PiBpbmRleCBlMWFhODYwLi5iMGQzZDY4IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJl
bGVzcy9tYXJ2ZWxsL213aWZpZXgvaW5pdC5jDQo+ID4gQEAgLTMxNCw2ICszMTQsNyBAQCBzdGF0
aWMgdm9pZCBtd2lmaWV4X2luaXRfYWRhcHRlcihzdHJ1Y3QNCj4gbXdpZmlleF9hZGFwdGVyICph
ZGFwdGVyKQ0KPiA+ICAJYWRhcHRlci0+aWZhY2VfbGltaXQucDJwX2ludGYgPSBNV0lGSUVYX01B
WF9QMlBfTlVNOw0KPiA+ICAJYWRhcHRlci0+YWN0aXZlX3NjYW5fdHJpZ2dlcmVkID0gZmFsc2U7
DQo+ID4gIAl0aW1lcl9zZXR1cCgmYWRhcHRlci0+d2FrZXVwX3RpbWVyLCB3YWtldXBfdGltZXJf
Zm4sIDApOw0KPiA+ICsJYWRhcHRlci0+ZGV2ZHVtcF9sZW4gPSAwOw0KPiA+ICB9DQo+ID4NCj4g
PiAgLyoNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lm
aWV4L21haW4uYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21h
aW4uYw0KPiA+IGluZGV4IGE5NmJkN2UuLmY3ZDAyOTkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYw0KPiA+ICsrKyBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMNCj4gPiBAQCAtMTA1MSw5ICsxMDUx
LDIzIEBAIHZvaWQgbXdpZmlleF9tdWx0aV9jaGFuX3Jlc3luYyhzdHJ1Y3QNCj4gPiBtd2lmaWV4
X2FkYXB0ZXIgKmFkYXB0ZXIpICB9DQo+ID4gRVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF9tdWx0
aV9jaGFuX3Jlc3luYyk7DQo+ID4NCj4gPiAtaW50IG13aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1
Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCB2b2lkDQo+ID4gKipkcnZfaW5mbykNCj4gPiAr
dm9pZCBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICph
ZGFwdGVyKQ0KPiA+ICB7DQo+ID4gLQl2b2lkICpwOw0KPiA+ICsJLyogRHVtcCBhbGwgdGhlIG1l
bW9yeSBkYXRhIGludG8gc2luZ2xlIGZpbGUsIGEgdXNlcnNwYWNlIHNjcmlwdCB3aWxsDQo+ID4g
KwkgKiBiZSB1c2VkIHRvIHNwbGl0IGFsbCB0aGUgbWVtb3J5IGRhdGEgdG8gbXVsdGlwbGUgZmls
ZXMNCj4gPiArCSAqLw0KPiA+ICsJbXdpZmlleF9kYmcoYWRhcHRlciwgTVNHLA0KPiA+ICsJCSAg
ICAiPT0gbXdpZmlleCBkdW1wIGluZm9ybWF0aW9uIHRvIC9zeXMvY2xhc3MvZGV2Y29yZWR1bXAN
Cj4gc3RhcnRcbiIpOw0KPiA+ICsJZGV2X2NvcmVkdW1wdihhZGFwdGVyLT5kZXYsIGFkYXB0ZXIt
PmRldmR1bXBfZGF0YSwNCj4gYWRhcHRlci0+ZGV2ZHVtcF9sZW4sDQo+ID4gKwkJICAgICAgR0ZQ
X0tFUk5FTCk7DQo+IA0KPiBTZWVtcyBsaWtlIHlvdSBzaG91bGQgcmVzZXQgYWRhcHRlci0+ZGV2
ZHVtcF9kYXRhIGFuZCAtPmRldmR1bXBfbGVuIGhlcmUsDQo+IHNvIHlvdSBkb24ndCBhY2NpZGVu
dGFsbHkgcmV1c2UgaXQ/IChZb3UncmUgZXhwZWN0aW5nDQo+IGRldl9jb3JlZHVtcHYoKSB0byBm
cmVlIHRoZSBidWZmZXIsIG5vPykNCj4gDQoNCk9oLCB5ZXMsIEkgd2FzIGV4cGVjdCBkZXZfY29y
ZWR1bXB2IHRvIGZyZWUgdGhlIGJ1ZmZlciwgdGhlIGRldl9jb3JlZHVtcCBmcmFtZXdvcmsgd2ls
bCBmcmVlIGR1bXAgZGF0YSBhZnRlciA1IG1pbnV0ZXMuDQpXaGF0J3MgbW9yZSwgSWYgdGhlcmUg
aXMgbmV3IGNvcmVkdW1wIGluIDUgbWludXRlcywgdGhlIG5ldyBkdW1wIGRhdGEgd2lsbCBiZSBk
aXNjYXJkIGFuZCBmcmVlLg0KQ29uc2lkZXIgYmVsb3cgc2VxdWVuY2UgaGFwcGVucyBpbiBjb21t
YW5kIHRpbWVvdXQgY29udGV4dDoNCk13aWZpZXhfY21kX3Rtb19mdW5jDQooMSkgIC0tPiAgIGZp
cm13YXJlIGR1bXAgMSAtLT4gICAgZGV2Y29yZWR1bXAgMQ0KKDIpICAtLT4gIGNhcmRfcmVzZXQg
LS0+IGluaXQgc29mdHdhcmUNCgkJCQlDb21tYW5kIHRpbWVvdXQgaGFwcGVucyBhZ2FpbglpbiA1
IG1pbnV0ZXMgLS0+ICBmaXJtd2FyZSBkdW1wIDIgIC0tPiAgIGRldmNvcmVkdW1wIDINCg0KSGVy
ZSwgaWYgd2UgZnJlZSBhZGFwdGVyLT4gZGV2ZHVtcF9kYXRhLCBhbmQgIHRoZW4gdXNlciBjYXQg
ZGV2Y29yZWR1bXAxLCB3aWxsIGNyYXNoIHRoZSBrZXJuZWwNCg0KDQpJIHRoaW5rLCBoZXJlLCBS
ZWdhcmRzICJyZXNldCBhZGFwdGVyLT5kZXZkdW1wX2RhdGEiLCB5b3UgbWVhbiBhZGFwdGVyLT5k
ZXZkdW1wX2RhdGEgPSBOVUxMLCANCkJ1dCBub3QgZnJlZSBpdCwgcmlnaHQgPw0KDQoNCj4gPiAr
CW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywNCj4gPiArCQkgICAgIj09IG13aWZpZXggZHVtcCBp
bmZvcm1hdGlvbiB0byAvc3lzL2NsYXNzL2RldmNvcmVkdW1wDQo+IGVuZFxuIik7DQo+ID4gK30g
RVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXApOw0KPiA+ICsNCj4g
PiArdm9pZCBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRh
cHRlcikgew0KPiA+ICsJY2hhciAqcDsNCj4gPiAgCWNoYXIgZHJ2X3ZlcnNpb25bNjRdOw0KPiA+
ICAJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHA7DQo+ID4gIAlzdHJ1Y3Qgc2Rpb19tbWNfY2Fy
ZCAqc2Rpb19jYXJkOw0KPiA+IEBAIC0xMDYxLDE3ICsxMDc1LDEyIEBAIGludCBtd2lmaWV4X2Ry
dl9pbmZvX2R1bXAoc3RydWN0DQo+IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgdm9pZCAqKmRy
dl9pbmZvKQ0KPiA+ICAJaW50IGksIGlkeDsNCj4gPiAgCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4
cTsNCj4gPiAgCXN0cnVjdCBtd2lmaWV4X2RlYnVnX2luZm8gKmRlYnVnX2luZm87DQo+ID4gLQl2
b2lkICpkcnZfaW5mb19kdW1wOw0KPiA+DQo+ID4gIAltd2lmaWV4X2RiZyhhZGFwdGVyLCBNU0cs
ICI9PT1td2lmaWV4IGRyaXZlcmluZm8gZHVtcCBzdGFydD09PVxuIik7DQo+ID4NCj4gPiAtCS8q
IG1lbW9yeSBhbGxvY2F0ZSBoZXJlIHNob3VsZCBiZSBmcmVlIGluIG13aWZpZXhfdXBsb2FkX2Rl
dmljZV9kdW1wKi8NCj4gPiAtCWRydl9pbmZvX2R1bXAgPSB2emFsbG9jKE1XSUZJRVhfRFJWX0lO
Rk9fU0laRV9NQVgpOw0KPiA+IC0NCj4gPiAtCWlmICghZHJ2X2luZm9fZHVtcCkNCj4gPiAtCQly
ZXR1cm4gMDsNCj4gPiAtDQo+ID4gLQlwID0gKGNoYXIgKikoZHJ2X2luZm9fZHVtcCk7DQo+ID4g
KwlwID0gYWRhcHRlci0+ZGV2ZHVtcF9kYXRhOw0KPiA+ICsJc3RyY3B5KHAsICI9PT09PT09PVN0
YXJ0IGR1bXAgZHJpdmVyaW5mbz09PT09PT09XG4iKTsNCj4gPiArCXAgKz0gc3RybGVuKCI9PT09
PT09PVN0YXJ0IGR1bXAgZHJpdmVyaW5mbz09PT09PT09XG4iKTsNCj4gPiAgCXAgKz0gc3ByaW50
ZihwLCAiZHJpdmVyX25hbWUgPSAiICJcIm13aWZpZXhcIlxuIik7DQo+ID4NCj4gPiAgCW13aWZp
ZXhfZHJ2X2dldF9kcml2ZXJfdmVyc2lvbihhZGFwdGVyLCBkcnZfdmVyc2lvbiwgQEAgLTExNTUs
MjENCj4gPiArMTE2NCwxOCBAQCBpbnQgbXdpZmlleF9kcnZfaW5mb19kdW1wKHN0cnVjdCBtd2lm
aWV4X2FkYXB0ZXIgKmFkYXB0ZXIsDQo+IHZvaWQgKipkcnZfaW5mbykNCj4gPiAgCQlrZnJlZShk
ZWJ1Z19pbmZvKTsNCj4gPiAgCX0NCj4gPg0KPiA+ICsJc3RyY3B5KHAsICJcbj09PT09PT09RW5k
IGR1bXA9PT09PT09PVxuIik7DQo+ID4gKwlwICs9IHN0cmxlbigiXG49PT09PT09PUVuZCBkdW1w
PT09PT09PT1cbiIpOw0KPiA+ICAJbXdpZmlleF9kYmcoYWRhcHRlciwgTVNHLCAiPT09bXdpZmll
eCBkcml2ZXJpbmZvIGR1bXAgZW5kPT09XG4iKTsNCj4gPiAtCSpkcnZfaW5mbyA9IGRydl9pbmZv
X2R1bXA7DQo+ID4gLQlyZXR1cm4gcCAtIGRydl9pbmZvX2R1bXA7DQo+ID4gKwlhZGFwdGVyLT5k
ZXZkdW1wX2xlbiA9IHAgLSAoY2hhciAqKWFkYXB0ZXItPmRldmR1bXBfZGF0YTsNCj4gPiAgfQ0K
PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X2Rydl9pbmZvX2R1bXApOw0KPiA+DQo+ID4g
LXZvaWQgbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAq
YWRhcHRlciwgdm9pZA0KPiAqZHJ2X2luZm8sDQo+ID4gLQkJCQlpbnQgZHJ2X2luZm9fc2l6ZSkN
Cj4gPiArdm9pZCBtd2lmaWV4X3ByZXBhcmVfZndfZHVtcF9pbmZvKHN0cnVjdCBtd2lmaWV4X2Fk
YXB0ZXIgKmFkYXB0ZXIpDQo+ID4gIHsNCj4gPiAtCXU4IGlkeCwgKmR1bXBfZGF0YSwgKmZ3X2R1
bXBfcHRyOw0KPiA+IC0JdTMyIGR1bXBfbGVuOw0KPiA+IC0NCj4gPiAtCWR1bXBfbGVuID0gKHN0
cmxlbigiPT09PT09PT1TdGFydCBkdW1wIGRyaXZlcmluZm89PT09PT09PVxuIikgKw0KPiA+IC0J
CSAgICAgICBkcnZfaW5mb19zaXplICsNCj4gPiAtCQkgICAgICAgc3RybGVuKCJcbj09PT09PT09
RW5kIGR1bXA9PT09PT09PVxuIikpOw0KPiA+ICsJdTggaWR4Ow0KPiA+ICsJY2hhciAqZndfZHVt
cF9wdHI7DQo+ID4gKwl1MzIgZHVtcF9sZW4gPSAwOw0KPiA+DQo+ID4gIAlmb3IgKGlkeCA9IDA7
IGlkeCA8IGFkYXB0ZXItPm51bV9tZW1fdHlwZXM7IGlkeCsrKSB7DQo+ID4gIAkJc3RydWN0IG1l
bW9yeV90eXBlX21hcHBpbmcgKmVudHJ5ID0gQEAgLTExODQsMjQgKzExOTAsMjQgQEANCj4gdm9p
ZA0KPiA+IG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIg
KmFkYXB0ZXIsIHZvaWQNCj4gKmRydl9pbmZvLA0KPiA+ICAJCX0NCj4gPiAgCX0NCj4gPg0KPiA+
IC0JZHVtcF9kYXRhID0gdnphbGxvYyhkdW1wX2xlbiArIDEpOw0KPiA+IC0JaWYgKCFkdW1wX2Rh
dGEpDQo+ID4gLQkJZ290byBkb25lOw0KPiA+IC0NCj4gPiAtCWZ3X2R1bXBfcHRyID0gZHVtcF9k
YXRhOw0KPiA+ICsJaWYgKGR1bXBfbGVuICsgMSArIGFkYXB0ZXItPmRldmR1bXBfbGVuID4gTVdJ
RklFWF9GV19EVU1QX1NJWkUpIHsNCj4gPiArCQkvKiBSZWFsbG9jIGluIGNhc2UgYnVmZmVyIG92
ZXJmbG93ICovDQo+ID4gKwkJZndfZHVtcF9wdHIgPSB2emFsbG9jKGR1bXBfbGVuICsgMSArIGFk
YXB0ZXItPmRldmR1bXBfbGVuKTsNCj4gPiArCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBNU0csICJS
ZWFsbG9jIGRldmljZSBkdW1wIGRhdGEuXG4iKTsNCj4gPiArCQlpZiAoIWZ3X2R1bXBfcHRyKSB7
DQo+ID4gKwkJCXZmcmVlKGFkYXB0ZXItPmRldmR1bXBfZGF0YSk7DQo+ID4gKwkJCW13aWZpZXhf
ZGJnKGFkYXB0ZXIsIEVSUk9SLA0KPiA+ICsJCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBm
YWlsdXJlIVxuIik7DQo+ID4gKwkJCXJldHVybjsNCj4gPiArCQl9DQo+ID4NCj4gPiAtCS8qIER1
bXAgYWxsIHRoZSBtZW1vcnkgZGF0YSBpbnRvIHNpbmdsZSBmaWxlLCBhIHVzZXJzcGFjZSBzY3Jp
cHQgd2lsbA0KPiA+IC0JICogYmUgdXNlZCB0byBzcGxpdCBhbGwgdGhlIG1lbW9yeSBkYXRhIHRv
IG11bHRpcGxlIGZpbGVzDQo+ID4gLQkgKi8NCj4gPiAtCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1T
RywNCj4gPiAtCQkgICAgIj09IG13aWZpZXggZHVtcCBpbmZvcm1hdGlvbiB0byAvc3lzL2NsYXNz
L2RldmNvcmVkdW1wDQo+IHN0YXJ0Iik7DQo+ID4gKwkJbWVtbW92ZShmd19kdW1wX3B0ciwgYWRh
cHRlci0+ZGV2ZHVtcF9kYXRhLA0KPiA+ICsJCQlhZGFwdGVyLT5kZXZkdW1wX2xlbik7DQo+ID4g
KwkJdmZyZWUoYWRhcHRlci0+ZGV2ZHVtcF9kYXRhKTsNCj4gPiArCQlhZGFwdGVyLT5kZXZkdW1w
X2RhdGEgPSBmd19kdW1wX3B0cjsNCj4gPiArCX0NCj4gPg0KPiA+IC0Jc3RyY3B5KGZ3X2R1bXBf
cHRyLCAiPT09PT09PT1TdGFydCBkdW1wIGRyaXZlcmluZm89PT09PT09PVxuIik7DQo+ID4gLQlm
d19kdW1wX3B0ciArPSBzdHJsZW4oIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZvPT09PT09
PT1cbiIpOw0KPiA+IC0JbWVtY3B5KGZ3X2R1bXBfcHRyLCBkcnZfaW5mbywgZHJ2X2luZm9fc2l6
ZSk7DQo+ID4gLQlmd19kdW1wX3B0ciArPSBkcnZfaW5mb19zaXplOw0KPiA+IC0Jc3RyY3B5KGZ3
X2R1bXBfcHRyLCAiXG49PT09PT09PUVuZCBkdW1wPT09PT09PT1cbiIpOw0KPiA+IC0JZndfZHVt
cF9wdHIgKz0gc3RybGVuKCJcbj09PT09PT09RW5kIGR1bXA9PT09PT09PVxuIik7DQo+ID4gKwlm
d19kdW1wX3B0ciA9IChjaGFyICopYWRhcHRlci0+ZGV2ZHVtcF9kYXRhICsNCj4gYWRhcHRlci0+
ZGV2ZHVtcF9sZW47DQo+ID4NCj4gPiAgCWZvciAoaWR4ID0gMDsgaWR4IDwgYWRhcHRlci0+bnVt
X21lbV90eXBlczsgaWR4KyspIHsNCj4gPiAgCQlzdHJ1Y3QgbWVtb3J5X3R5cGVfbWFwcGluZyAq
ZW50cnkgPSBAQCAtMTIyOCwxMSArMTIzNCw4IEBADQo+IHZvaWQNCj4gPiBtd2lmaWV4X3VwbG9h
ZF9kZXZpY2VfZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCB2b2lkDQo+ICpk
cnZfaW5mbywNCj4gPiAgCS8qIGRldmljZSBkdW1wIGRhdGEgd2lsbCBiZSBmcmVlIGluIGRldmlj
ZSBjb3JlZHVtcCByZWxlYXNlIGZ1bmN0aW9uDQo+ID4gIAkgKiBhZnRlciA1IG1pbg0KPiA+ICAJ
ICovDQo+IA0KPiBeXiBUaGlzIGNvbW1lbnQgaXMgYSBiaXQgb3V0IG9mIHBsYWNlIG5vdy4gVGhl
IGRhdGEgaXMgbm90IGR1bXBlZCB1bnRpbCB3ZSBjYWxsDQo+IG13aWZpZXhfdXBsb2FkX2Rldmlj
ZV9kdW1wKCksIGFuZCBzbyB3ZSBkb24ndCBndWFyYW50ZWUgYW55b25lIHdpbGwNCj4gYWN0dWFs
bHkgZnJlZSBpdCBmb3IgdXMgdW50aWwgdGhlbg0KPiANCg0KT2suDQoNCj4gPiAtCWRldl9jb3Jl
ZHVtcHYoYWRhcHRlci0+ZGV2LCBkdW1wX2RhdGEsIGR1bXBfbGVuLCBHRlBfS0VSTkVMKTsNCj4g
PiAtCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywNCj4gPiAtCQkgICAgIj09IG13aWZpZXggZHVt
cCBpbmZvcm1hdGlvbiB0byAvc3lzL2NsYXNzL2RldmNvcmVkdW1wIGVuZCIpOw0KPiA+ICsJYWRh
cHRlci0+ZGV2ZHVtcF9sZW4gPSBmd19kdW1wX3B0ciAtIChjaGFyICopYWRhcHRlci0+ZGV2ZHVt
cF9kYXRhOw0KPiA+DQo+ID4gLWRvbmU6DQo+ID4gIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGFkYXB0
ZXItPm51bV9tZW1fdHlwZXM7IGlkeCsrKSB7DQo+ID4gIAkJc3RydWN0IG1lbW9yeV90eXBlX21h
cHBpbmcgKmVudHJ5ID0NCj4gPiAgCQkJJmFkYXB0ZXItPm1lbV90eXBlX21hcHBpbmdfdGJsW2lk
eF07DQo+ID4gQEAgLTEyNDEsMTAgKzEyNDQsOCBAQCB2b2lkIG13aWZpZXhfdXBsb2FkX2Rldmlj
ZV9kdW1wKHN0cnVjdA0KPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKmRydl9pbmZv
LA0KPiA+ICAJCWVudHJ5LT5tZW1fcHRyID0gTlVMTDsNCj4gPiAgCQllbnRyeS0+bWVtX3NpemUg
PSAwOw0KPiA+ICAJfQ0KPiA+IC0NCj4gPiAtCXZmcmVlKGRydl9pbmZvKTsNCj4gPiAgfQ0KPiA+
IC1FWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcCk7DQo+ID4gK0VY
UE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfcHJlcGFyZV9md19kdW1wX2luZm8pOw0KPiA+DQo+ID4g
IC8qDQo+ID4gICAqIENGRzgwMi4xMSBuZXR3b3JrIGRldmljZSBoYW5kbGVyIGZvciBzdGF0aXN0
aWNzIHJldHJpZXZhbC4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy
dmVsbC9td2lmaWV4L21haW4uaA0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L21haW4uaA0KPiA+IGluZGV4IDE1NGMwNzkuLjhiNjI0MWEgMTAwNjQ0DQo+ID4gLS0t
IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uaA0KPiA+ICsrKyBi
L2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBAQCAtOTQs
NiArOTQsOCBAQCBlbnVtIHsNCj4gPg0KPiA+ICAjZGVmaW5lIE1BWF9FVkVOVF9TSVpFICAgICAg
ICAgICAgICAgICAgMjA0OA0KPiA+DQo+ID4gKyNkZWZpbmUgTVdJRklFWF9GV19EVU1QX1NJWkUg
ICAgICAgKDIgKiAxMDI0ICogMTAyNCkNCj4gPiArDQo+ID4gICNkZWZpbmUgQVJQX0ZJTFRFUl9N
QVhfQlVGX1NJWkUgICAgICAgICA2OA0KPiA+DQo+ID4gICNkZWZpbmUgTVdJRklFWF9LRVlfQlVG
RkVSX1NJWkUJCQkxNg0KPiA+IEBAIC0xMDMyLDYgKzEwMzQsOSBAQCBzdHJ1Y3QgbXdpZmlleF9h
ZGFwdGVyIHsNCj4gPiAgCWJvb2wgd2FrZV9ieV93aWZpOw0KPiA+ICAJLyogQWdncmVnYXRpb24g
cGFyYW1ldGVycyovDQo+ID4gIAlzdHJ1Y3QgYnVzX2FnZ3JfcGFyYW1zIGJ1c19hZ2dyOw0KPiA+
ICsJLyogRGV2aWNlIGR1bXAgZGF0YS9sZW5ndGggKi8NCj4gPiArCXZvaWQgKmRldmR1bXBfZGF0
YTsNCj4gPiArCWludCBkZXZkdW1wX2xlbjsNCj4gPiAgfTsNCj4gPg0KPiA+ICB2b2lkIG13aWZp
ZXhfcHJvY2Vzc190eF9xdWV1ZShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsgQEAN
Cj4gPiAtMTY1Niw5ICsxNjYxLDkgQEAgdm9pZCBtd2lmaWV4X2hpc3RfZGF0YV9hZGQoc3RydWN0
IG13aWZpZXhfcHJpdmF0ZQ0KPiA+ICpwcml2LA0KPiA+ICB1OCBtd2lmaWV4X2FkanVzdF9kYXRh
X3JhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwNCj4gPiAgCQkJICAgIHU4IHJ4X3Jh
dGUsIHU4IGh0X2luZm8pOw0KPiA+DQo+ID4gLWludCBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoc3Ry
dWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgdm9pZA0KPiA+ICoqZHJ2X2luZm8pOyAtdm9p
ZCBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyDQo+ICph
ZGFwdGVyLCB2b2lkICpkcnZfaW5mbywNCj4gPiAtCQkJCWludCBkcnZfaW5mb19zaXplKTsNCj4g
PiArdm9pZCBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRh
cHRlcik7IHZvaWQNCj4gPiArbXdpZmlleF9wcmVwYXJlX2Z3X2R1bXBfaW5mbyhzdHJ1Y3QgbXdp
ZmlleF9hZGFwdGVyICphZGFwdGVyKTsgdm9pZA0KPiA+ICttd2lmaWV4X3VwbG9hZF9kZXZpY2Vf
ZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsNCj4gPiAgdm9pZCAqbXdpZmll
eF9hbGxvY19kbWFfYWxpZ25fYnVmKGludCByeF9sZW4sIGdmcF90IGZsYWdzKTsgIHZvaWQNCj4g
PiBtd2lmaWV4X3F1ZXVlX21haW5fd29yayhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVy
KTsgIGludA0KPiA+IG13aWZpZXhfZ2V0X3dha2V1cF9yZWFzb24oc3RydWN0IG13aWZpZXhfcHJp
dmF0ZSAqcHJpdiwgdTE2IGFjdGlvbiwNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ly
ZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mv
bWFydmVsbC9td2lmaWV4L3BjaWUuYw0KPiA+IGluZGV4IGNkMzE0OTQuLmY2NjZjYjIgMTAwNjQ0
DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYw0K
PiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMNCj4g
PiBAQCAtMjc2OSwxMiArMjc2OSwxNyBAQCBzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfZndfZHVt
cChzdHJ1Y3QNCj4gPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpDQo+ID4NCj4gPiAgc3RhdGlj
IHZvaWQgbXdpZmlleF9wY2llX2RldmljZV9kdW1wX3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRl
cg0KPiA+ICphZGFwdGVyKSAgew0KPiA+IC0JaW50IGRydl9pbmZvX3NpemU7DQo+ID4gLQl2b2lk
ICpkcnZfaW5mbzsNCj4gPiArCWFkYXB0ZXItPmRldmR1bXBfZGF0YSA9IHZ6YWxsb2MoTVdJRklF
WF9GV19EVU1QX1NJWkUpOw0KPiANCj4gSSdtIHN0aWxsIG5vdCBzdXJlIHdoeSB5b3UgbmVlZCAz
IGRpZmZlcmVudCBjYWxsZXJzIHRvIGFsbG9jYXRlIHRoZSBzYW1lIHNpemUNCj4gYnVmZmVyLiBJ
dCBzZWVtcyBsaWtlIHRoaXMgc2hvdWxkIGFsbCBiZSBkb25lIGluIHRoZSBjb3JlLg0KPiANCg0K
SSBoYWQgdGhvdWdodCBvZiBwdXQgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRydl9pbmZvX2R1bXAg
aW50byAxIGZ1bmN0aW9uICwgYW5kIGxldCBpdCBjYWxsZWQgaW4gZGV2aWNlX2R1bXAuDQpCdXQg
aXQgbG9va3MgcXVpdGUgc3RyYW5nZS4NCkNvbnNpZGVyIHRoZSBkaWZmZXJlbnQgaW1wbGVtZW50
YXRpb24gb24gdXNiLCBsZXQgdGhlc2Ugc3ViIGZ1bmN0aW9ucyB3b3JrcyBpbiBhIGxvb3NlIGNv
dXBsaW5nIHdheSBzZWVtcyBiZXR0ZXIgdG8gcmV1c2UgdGhhbiBhICJjb3JlIiBhcmNoaXRlY3R1
cmUuDQoNClBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBtb3JlIHN1Z2dlc3Rpb25zIHRv
IGVuaGFuY2UgdGhpcyBwYXJ0DQoNClRoYW5rcyAmIFJlZ2FyZHMsDQpTaW1vbg0KDQo+IEJyaWFu
DQo+IA0KPiA+ICsJaWYgKCFhZGFwdGVyLT5kZXZkdW1wX2RhdGEpIHsNCj4gPiArCQltd2lmaWV4
X2RiZyhhZGFwdGVyLCBFUlJPUiwNCj4gPiArCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBm
YWlsdXJlIVxuIik7DQo+ID4gKwkJcmV0dXJuOw0KPiA+ICsJfQ0KPiA+DQo+ID4gLQlkcnZfaW5m
b19zaXplID0gbXdpZmlleF9kcnZfaW5mb19kdW1wKGFkYXB0ZXIsICZkcnZfaW5mbyk7DQo+ID4g
Kwltd2lmaWV4X2Rydl9pbmZvX2R1bXAoYWRhcHRlcik7DQo+ID4gIAltd2lmaWV4X3BjaWVfZndf
ZHVtcChhZGFwdGVyKTsNCj4gPiAtCW13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKGFkYXB0ZXIs
IGRydl9pbmZvLCBkcnZfaW5mb19zaXplKTsNCj4gPiArCW13aWZpZXhfcHJlcGFyZV9md19kdW1w
X2luZm8oYWRhcHRlcik7DQo+ID4gKwltd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChhZGFwdGVy
KTsNCj4gPiAgfQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9jYXJkX3Jlc2V0
X3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlcg0KPiA+ICphZGFwdGVyKSBkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+IGIvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+IGluZGV4IGZkNTE4M2Mu
LmE4Mjg4MDEgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L3NkaW8uYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdp
ZmlleC9zZGlvLmMNCj4gPiBAQCAtMjUwNSwxNSArMjUwNSwyMSBAQCBzdGF0aWMgdm9pZA0KPiA+
IG13aWZpZXhfc2Rpb19nZW5lcmljX2Z3X2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRh
cHRlcikgIHN0YXRpYw0KPiA+IHZvaWQgbXdpZmlleF9zZGlvX2RldmljZV9kdW1wX3dvcmsoc3Ry
dWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikgIHsNCj4gPiAgCXN0cnVjdCBzZGlvX21tY19j
YXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsNCj4gPiAtCWludCBkcnZfaW5mb19zaXplOw0KPiA+
IC0Jdm9pZCAqZHJ2X2luZm87DQo+ID4NCj4gPiAtCWRydl9pbmZvX3NpemUgPSBtd2lmaWV4X2Ry
dl9pbmZvX2R1bXAoYWRhcHRlciwgJmRydl9pbmZvKTsNCj4gPiArCWFkYXB0ZXItPmRldmR1bXBf
ZGF0YSA9IHZ6YWxsb2MoTVdJRklFWF9GV19EVU1QX1NJWkUpOw0KPiA+ICsJaWYgKCFhZGFwdGVy
LT5kZXZkdW1wX2RhdGEpIHsNCj4gPiArCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwNCj4g
PiArCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBmYWlsdXJlIVxuIik7DQo+ID4gKwkJcmV0
dXJuOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCW13aWZpZXhfZHJ2X2luZm9fZHVtcChhZGFwdGVy
KTsNCj4gPiAgCWlmIChjYXJkLT5md19kdW1wX2VuaCkNCj4gPiAgCQltd2lmaWV4X3NkaW9fZ2Vu
ZXJpY19md19kdW1wKGFkYXB0ZXIpOw0KPiA+ICAJZWxzZQ0KPiA+ICAJCW13aWZpZXhfc2Rpb19m
d19kdW1wKGFkYXB0ZXIpOw0KPiA+IC0JbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAoYWRhcHRl
ciwgZHJ2X2luZm8sIGRydl9pbmZvX3NpemUpOw0KPiA+ICsJbXdpZmlleF9wcmVwYXJlX2Z3X2R1
bXBfaW5mbyhhZGFwdGVyKTsNCj4gPiArCW13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKGFkYXB0
ZXIpOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX3dvcmsoc3Ry
dWN0IHdvcmtfc3RydWN0ICp3b3JrKQ0KPiA+IC0tDQo+ID4gMS45LjENCj4gPg0K

^ permalink raw reply

* Re: Re: [PATCH v4 1/3] mwifiex: refactor device dump code to make it generic for usb interface
From: Xinming Hu @ 2017-12-06  9:34 UTC (permalink / raw)
  To: Brian Norris
  Cc: Linux Wireless, Kalle Valo, Dmitry Torokhov, rajatja@google.com,
	Zhiyuan Yang, Tim Song, Cathy Luo, James Cao, Ganapathi Bhat,
	Ellie Reeves

SGkgQnJpYW4sDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnJpYW4g
Tm9ycmlzIFttYWlsdG86YnJpYW5ub3JyaXNAY2hyb21pdW0ub3JnXQ0KPiBTZW50OiAyMDE3xOox
MtTCNsjVIDI6MjYNCj4gVG86IFhpbm1pbmcgSHUgPGh1eG1AbWFydmVsbC5jb20+DQo+IENjOiBM
aW51eCBXaXJlbGVzcyA8bGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnPjsgS2FsbGUgVmFs
bw0KPiA8a3ZhbG9AY29kZWF1cm9yYS5vcmc+OyBEbWl0cnkgVG9yb2tob3YgPGR0b3JAZ29vZ2xl
LmNvbT47DQo+IHJhamF0amFAZ29vZ2xlLmNvbTsgWmhpeXVhbiBZYW5nIDx5YW5nenlAbWFydmVs
bC5jb20+OyBUaW0gU29uZw0KPiA8c29uZ3Rhb0BtYXJ2ZWxsLmNvbT47IENhdGh5IEx1byA8Y2x1
b0BtYXJ2ZWxsLmNvbT47IEphbWVzIENhbw0KPiA8amNhb0BtYXJ2ZWxsLmNvbT47IEdhbmFwYXRo
aSBCaGF0IDxnYmhhdEBtYXJ2ZWxsLmNvbT47IEVsbGllIFJlZXZlcw0KPiA8ZWxsaWVyZXZ2ZXNA
Z21haWwuY29tPg0KPiBTdWJqZWN0OiBbRVhUXSBSZTogW1BBVENIIHY0IDEvM10gbXdpZmlleDog
cmVmYWN0b3IgZGV2aWNlIGR1bXAgY29kZSB0byBtYWtlIGl0DQo+IGdlbmVyaWMgZm9yIHVzYiBp
bnRlcmZhY2UNCj4gDQo+IEV4dGVybmFsIEVtYWlsDQo+IA0KPiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+IEhp
LA0KPiANCj4gT24gTW9uLCBEZWMgMDQsIDIwMTcgYXQgMDg6MTg6NDJQTSArMDgwMCwgWGlubWlu
ZyBIdSB3cm90ZToNCj4gPiBUaGlzIHBhdGNoIHJlZmFjdG9yIGN1cnJlbnQgZGV2aWNlIGR1bXAg
Y29kZSB0byBtYWtlIGl0IGdlbmVyaWMgZm9yDQo+ID4gc3Vic2VxdWVudCBpbXBsZW1lbnRhdGlv
biBvbiB1c2IgaW50ZXJmYWNlLg0KPiANCj4gSSBzdGlsbCB0aGluayB5b3UncmUgbWFraW5nIHRo
ZSBzcGFnaGV0dGkgd29yc2UuIEkgb25seSBoYXZlIGEgZmV3IHNwZWNpZmljDQo+IHN1Z2dlc3Rp
b25zIGZvciBpbXByb3ZpbmcgeW91ciBzcGFnaGV0dGkgY29kZSBhdCB0aGUgbW9tZW50LCBidXQg
SSdtIHN0aWxsIHN1cmUNCj4geW91IGNvdWxkIGRvIGJldHRlci4NCj4gDQoNCk9rLCBUaGFua3Mu
DQoNCj4gPiBTaWduZWQtb2ZmLWJ5OiBYaW5taW5nIEh1IDxodXhtQG1hcnZlbGwuY29tPg0KPiA+
IFNpZ25lZC1vZmYtYnk6IENhdGh5IEx1byA8Y2x1b0BtYXJ2ZWxsLmNvbT4NCj4gPiBTaWduZWQt
b2ZmLWJ5OiBHYW5hcGF0aGkgQmhhdCA8Z2JoYXRAbWFydmVsbC5jb20+DQo+ID4gLS0tDQo+ID4g
djI6IEFkZHJlc3NlZCBiZWxvdyByZXZpZXcgY29tbWVudHMgZnJvbSBCcmlhbiBOb3JyaXMNCj4g
PiAgICAgYSkgdXNlIG5ldyBBUEkgdGltZXJfc2V0dXAvZnJvbV90aW1lci4NCj4gPiAgICAgYikg
cmVzZXQgZGV2ZHVtcF9sZW4gZHVyaW5nIGluaXRpemF0aW9uDQo+ID4gdjQ6IFNhbWUgYXMgdjIs
djMNCj4gPiAtLS0NCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2lu
aXQuYyB8ICAxICsNCj4gPiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFp
bi5jIHwgODcNCj4gPiArKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQ0KPiA+IGRyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmggfCAxMSArKystDQo+ID4gZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYyB8IDEzICsrKy0tDQo+ID4gZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYyB8IDE0ICsrKy0tDQo+ID4g
IDUgZmlsZXMgY2hhbmdlZCwgNzIgaW5zZXJ0aW9ucygrKSwgNTQgZGVsZXRpb25zKC0pDQo+ID4N
Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2lu
aXQuYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYw0K
PiA+IGluZGV4IGUxYWE4NjAuLmIwZDNkNjggMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQv
d2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMNCj4gPiBAQCAtMzE0LDYgKzMxNCw3IEBAIHN0
YXRpYyB2b2lkIG13aWZpZXhfaW5pdF9hZGFwdGVyKHN0cnVjdA0KPiBtd2lmaWV4X2FkYXB0ZXIg
KmFkYXB0ZXIpDQo+ID4gIAlhZGFwdGVyLT5pZmFjZV9saW1pdC5wMnBfaW50ZiA9IE1XSUZJRVhf
TUFYX1AyUF9OVU07DQo+ID4gIAlhZGFwdGVyLT5hY3RpdmVfc2Nhbl90cmlnZ2VyZWQgPSBmYWxz
ZTsNCj4gPiAgCXRpbWVyX3NldHVwKCZhZGFwdGVyLT53YWtldXBfdGltZXIsIHdha2V1cF90aW1l
cl9mbiwgMCk7DQo+ID4gKwlhZGFwdGVyLT5kZXZkdW1wX2xlbiA9IDA7DQo+ID4gIH0NCj4gPg0K
PiA+ICAvKg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213
aWZpZXgvbWFpbi5jDQo+ID4gYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgv
bWFpbi5jDQo+ID4gaW5kZXggYTk2YmQ3ZS4uZjdkMDI5OSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2
ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5jDQo+ID4gKysrIGIvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYw0KPiA+IEBAIC0xMDUxLDkgKzEw
NTEsMjMgQEAgdm9pZCBtd2lmaWV4X211bHRpX2NoYW5fcmVzeW5jKHN0cnVjdA0KPiA+IG13aWZp
ZXhfYWRhcHRlciAqYWRhcHRlcikgIH0NCj4gPiBFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X211
bHRpX2NoYW5fcmVzeW5jKTsNCj4gPg0KPiA+IC1pbnQgbXdpZmlleF9kcnZfaW5mb19kdW1wKHN0
cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQNCj4gPiAqKmRydl9pbmZvKQ0KPiA+
ICt2b2lkIG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIg
KmFkYXB0ZXIpDQo+ID4gIHsNCj4gPiAtCXZvaWQgKnA7DQo+ID4gKwkvKiBEdW1wIGFsbCB0aGUg
bWVtb3J5IGRhdGEgaW50byBzaW5nbGUgZmlsZSwgYSB1c2Vyc3BhY2Ugc2NyaXB0IHdpbGwNCj4g
PiArCSAqIGJlIHVzZWQgdG8gc3BsaXQgYWxsIHRoZSBtZW1vcnkgZGF0YSB0byBtdWx0aXBsZSBm
aWxlcw0KPiA+ICsJICovDQo+ID4gKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBNU0csDQo+ID4gKwkJ
ICAgICI9PSBtd2lmaWV4IGR1bXAgaW5mb3JtYXRpb24gdG8gL3N5cy9jbGFzcy9kZXZjb3JlZHVt
cA0KPiBzdGFydFxuIik7DQo+ID4gKwlkZXZfY29yZWR1bXB2KGFkYXB0ZXItPmRldiwgYWRhcHRl
ci0+ZGV2ZHVtcF9kYXRhLA0KPiBhZGFwdGVyLT5kZXZkdW1wX2xlbiwNCj4gPiArCQkgICAgICBH
RlBfS0VSTkVMKTsNCj4gDQo+IFNlZW1zIGxpa2UgeW91IHNob3VsZCByZXNldCBhZGFwdGVyLT5k
ZXZkdW1wX2RhdGEgYW5kIC0+ZGV2ZHVtcF9sZW4gaGVyZSwNCj4gc28geW91IGRvbid0IGFjY2lk
ZW50YWxseSByZXVzZSBpdD8gKFlvdSdyZSBleHBlY3RpbmcNCj4gZGV2X2NvcmVkdW1wdigpIHRv
IGZyZWUgdGhlIGJ1ZmZlciwgbm8/KQ0KPiANCg0KT2gsIHllcywgSSB3YXMgZXhwZWN0IGRldl9j
b3JlZHVtcHYgdG8gZnJlZSB0aGUgYnVmZmVyLCB0aGUgZGV2X2NvcmVkdW1wIGZyYW1ld29yayB3
aWxsIGZyZWUgZHVtcCBkYXRhIGFmdGVyIDUgbWludXRlcy4NCldoYXQncyBtb3JlLCBJZiB0aGVy
ZSBpcyBuZXcgY29yZWR1bXAgaW4gNSBtaW51dGVzLCB0aGUgbmV3IGR1bXAgZGF0YSB3aWxsIGJl
IGRpc2NhcmQgYW5kIGZyZWUuDQpDb25zaWRlciBiZWxvdyBzZXF1ZW5jZSBoYXBwZW5zIGluIGNv
bW1hbmQgdGltZW91dCBjb250ZXh0Og0KTXdpZmlleF9jbWRfdG1vX2Z1bmMNCigxKSAgLS0+ICAg
ZmlybXdhcmUgZHVtcCAxIC0tPiAgICBkZXZjb3JlZHVtcCAxDQooMikgIC0tPiAgY2FyZF9yZXNl
dCAtLT4gaW5pdCBzb2Z0d2FyZQ0KCQkJCUNvbW1hbmQgdGltZW91dCBoYXBwZW5zIGFnYWluCWlu
IDUgbWludXRlcyAtLT4gIGZpcm13YXJlIGR1bXAgMiAgLS0+ICAgZGV2Y29yZWR1bXAgMg0KDQpI
ZXJlLCBpZiB3ZSBmcmVlIGFkYXB0ZXItPiBkZXZkdW1wX2RhdGEsIGFuZCAgdGhlbiB1c2VyIGNh
dCBkZXZjb3JlZHVtcDEsIHdpbGwgY3Jhc2ggdGhlIGtlcm5lbA0KDQoNCkkgdGhpbmssIGhlcmUs
IFJlZ2FyZHMgInJlc2V0IGFkYXB0ZXItPmRldmR1bXBfZGF0YSIsIHlvdSBtZWFuIGFkYXB0ZXIt
PmRldmR1bXBfZGF0YSA9IE5VTEwsIEJ1dCBub3QgZnJlZSBpdCwgcmlnaHQgPw0KDQo+ID4gKwlt
d2lmaWV4X2RiZyhhZGFwdGVyLCBNU0csDQo+ID4gKwkJICAgICI9PSBtd2lmaWV4IGR1bXAgaW5m
b3JtYXRpb24gdG8gL3N5cy9jbGFzcy9kZXZjb3JlZHVtcA0KPiBlbmRcbiIpOw0KPiA+ICt9IEVY
UE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKTsNCj4gPiArDQo+ID4g
K3ZvaWQgbXdpZmlleF9kcnZfaW5mb19kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0
ZXIpIHsNCj4gPiArCWNoYXIgKnA7DQo+ID4gIAljaGFyIGRydl92ZXJzaW9uWzY0XTsNCj4gPiAg
CXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwOw0KPiA+ICAJc3RydWN0IHNkaW9fbW1jX2NhcmQg
KnNkaW9fY2FyZDsNCj4gPiBAQCAtMTA2MSwxNyArMTA3NSwxMiBAQCBpbnQgbXdpZmlleF9kcnZf
aW5mb19kdW1wKHN0cnVjdA0KPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKipkcnZf
aW5mbykNCj4gPiAgCWludCBpLCBpZHg7DQo+ID4gIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7
DQo+ID4gIAlzdHJ1Y3QgbXdpZmlleF9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvOw0KPiA+IC0Jdm9p
ZCAqZHJ2X2luZm9fZHVtcDsNCj4gPg0KPiA+ICAJbXdpZmlleF9kYmcoYWRhcHRlciwgTVNHLCAi
PT09bXdpZmlleCBkcml2ZXJpbmZvIGR1bXAgc3RhcnQ9PT1cbiIpOw0KPiA+DQo+ID4gLQkvKiBt
ZW1vcnkgYWxsb2NhdGUgaGVyZSBzaG91bGQgYmUgZnJlZSBpbiBtd2lmaWV4X3VwbG9hZF9kZXZp
Y2VfZHVtcCovDQo+ID4gLQlkcnZfaW5mb19kdW1wID0gdnphbGxvYyhNV0lGSUVYX0RSVl9JTkZP
X1NJWkVfTUFYKTsNCj4gPiAtDQo+ID4gLQlpZiAoIWRydl9pbmZvX2R1bXApDQo+ID4gLQkJcmV0
dXJuIDA7DQo+ID4gLQ0KPiA+IC0JcCA9IChjaGFyICopKGRydl9pbmZvX2R1bXApOw0KPiA+ICsJ
cCA9IGFkYXB0ZXItPmRldmR1bXBfZGF0YTsNCj4gPiArCXN0cmNweShwLCAiPT09PT09PT1TdGFy
dCBkdW1wIGRyaXZlcmluZm89PT09PT09PVxuIik7DQo+ID4gKwlwICs9IHN0cmxlbigiPT09PT09
PT1TdGFydCBkdW1wIGRyaXZlcmluZm89PT09PT09PVxuIik7DQo+ID4gIAlwICs9IHNwcmludGYo
cCwgImRyaXZlcl9uYW1lID0gIiAiXCJtd2lmaWV4XCJcbiIpOw0KPiA+DQo+ID4gIAltd2lmaWV4
X2Rydl9nZXRfZHJpdmVyX3ZlcnNpb24oYWRhcHRlciwgZHJ2X3ZlcnNpb24sIEBAIC0xMTU1LDIx
DQo+ID4gKzExNjQsMTggQEAgaW50IG13aWZpZXhfZHJ2X2luZm9fZHVtcChzdHJ1Y3QgbXdpZmll
eF9hZGFwdGVyICphZGFwdGVyLA0KPiB2b2lkICoqZHJ2X2luZm8pDQo+ID4gIAkJa2ZyZWUoZGVi
dWdfaW5mbyk7DQo+ID4gIAl9DQo+ID4NCj4gPiArCXN0cmNweShwLCAiXG49PT09PT09PUVuZCBk
dW1wPT09PT09PT1cbiIpOw0KPiA+ICsJcCArPSBzdHJsZW4oIlxuPT09PT09PT1FbmQgZHVtcD09
PT09PT09XG4iKTsNCj4gPiAgCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywgIj09PW13aWZpZXgg
ZHJpdmVyaW5mbyBkdW1wIGVuZD09PVxuIik7DQo+ID4gLQkqZHJ2X2luZm8gPSBkcnZfaW5mb19k
dW1wOw0KPiA+IC0JcmV0dXJuIHAgLSBkcnZfaW5mb19kdW1wOw0KPiA+ICsJYWRhcHRlci0+ZGV2
ZHVtcF9sZW4gPSBwIC0gKGNoYXIgKilhZGFwdGVyLT5kZXZkdW1wX2RhdGE7DQo+ID4gIH0NCj4g
PiAgRVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF9kcnZfaW5mb19kdW1wKTsNCj4gPg0KPiA+IC12
b2lkIG13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFk
YXB0ZXIsIHZvaWQNCj4gKmRydl9pbmZvLA0KPiA+IC0JCQkJaW50IGRydl9pbmZvX3NpemUpDQo+
ID4gK3ZvaWQgbXdpZmlleF9wcmVwYXJlX2Z3X2R1bXBfaW5mbyhzdHJ1Y3QgbXdpZmlleF9hZGFw
dGVyICphZGFwdGVyKQ0KPiA+ICB7DQo+ID4gLQl1OCBpZHgsICpkdW1wX2RhdGEsICpmd19kdW1w
X3B0cjsNCj4gPiAtCXUzMiBkdW1wX2xlbjsNCj4gPiAtDQo+ID4gLQlkdW1wX2xlbiA9IChzdHJs
ZW4oIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZvPT09PT09PT1cbiIpICsNCj4gPiAtCQkg
ICAgICAgZHJ2X2luZm9fc2l6ZSArDQo+ID4gLQkJICAgICAgIHN0cmxlbigiXG49PT09PT09PUVu
ZCBkdW1wPT09PT09PT1cbiIpKTsNCj4gPiArCXU4IGlkeDsNCj4gPiArCWNoYXIgKmZ3X2R1bXBf
cHRyOw0KPiA+ICsJdTMyIGR1bXBfbGVuID0gMDsNCj4gPg0KPiA+ICAJZm9yIChpZHggPSAwOyBp
ZHggPCBhZGFwdGVyLT5udW1fbWVtX3R5cGVzOyBpZHgrKykgew0KPiA+ICAJCXN0cnVjdCBtZW1v
cnlfdHlwZV9tYXBwaW5nICplbnRyeSA9IEBAIC0xMTg0LDI0ICsxMTkwLDI0IEBADQo+IHZvaWQN
Cj4gPiBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICph
ZGFwdGVyLCB2b2lkDQo+ICpkcnZfaW5mbywNCj4gPiAgCQl9DQo+ID4gIAl9DQo+ID4NCj4gPiAt
CWR1bXBfZGF0YSA9IHZ6YWxsb2MoZHVtcF9sZW4gKyAxKTsNCj4gPiAtCWlmICghZHVtcF9kYXRh
KQ0KPiA+IC0JCWdvdG8gZG9uZTsNCj4gPiAtDQo+ID4gLQlmd19kdW1wX3B0ciA9IGR1bXBfZGF0
YTsNCj4gPiArCWlmIChkdW1wX2xlbiArIDEgKyBhZGFwdGVyLT5kZXZkdW1wX2xlbiA+IE1XSUZJ
RVhfRldfRFVNUF9TSVpFKSB7DQo+ID4gKwkJLyogUmVhbGxvYyBpbiBjYXNlIGJ1ZmZlciBvdmVy
ZmxvdyAqLw0KPiA+ICsJCWZ3X2R1bXBfcHRyID0gdnphbGxvYyhkdW1wX2xlbiArIDEgKyBhZGFw
dGVyLT5kZXZkdW1wX2xlbik7DQo+ID4gKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgTVNHLCAiUmVh
bGxvYyBkZXZpY2UgZHVtcCBkYXRhLlxuIik7DQo+ID4gKwkJaWYgKCFmd19kdW1wX3B0cikgew0K
PiA+ICsJCQl2ZnJlZShhZGFwdGVyLT5kZXZkdW1wX2RhdGEpOw0KPiA+ICsJCQltd2lmaWV4X2Ri
ZyhhZGFwdGVyLCBFUlJPUiwNCj4gPiArCQkJCSAgICAidnphbGxvYyBkZXZkdW1wIGRhdGEgZmFp
bHVyZSFcbiIpOw0KPiA+ICsJCQlyZXR1cm47DQo+ID4gKwkJfQ0KPiA+DQo+ID4gLQkvKiBEdW1w
IGFsbCB0aGUgbWVtb3J5IGRhdGEgaW50byBzaW5nbGUgZmlsZSwgYSB1c2Vyc3BhY2Ugc2NyaXB0
IHdpbGwNCj4gPiAtCSAqIGJlIHVzZWQgdG8gc3BsaXQgYWxsIHRoZSBtZW1vcnkgZGF0YSB0byBt
dWx0aXBsZSBmaWxlcw0KPiA+IC0JICovDQo+ID4gLQltd2lmaWV4X2RiZyhhZGFwdGVyLCBNU0cs
DQo+ID4gLQkJICAgICI9PSBtd2lmaWV4IGR1bXAgaW5mb3JtYXRpb24gdG8gL3N5cy9jbGFzcy9k
ZXZjb3JlZHVtcA0KPiBzdGFydCIpOw0KPiA+ICsJCW1lbW1vdmUoZndfZHVtcF9wdHIsIGFkYXB0
ZXItPmRldmR1bXBfZGF0YSwNCj4gPiArCQkJYWRhcHRlci0+ZGV2ZHVtcF9sZW4pOw0KPiA+ICsJ
CXZmcmVlKGFkYXB0ZXItPmRldmR1bXBfZGF0YSk7DQo+ID4gKwkJYWRhcHRlci0+ZGV2ZHVtcF9k
YXRhID0gZndfZHVtcF9wdHI7DQo+ID4gKwl9DQo+ID4NCj4gPiAtCXN0cmNweShmd19kdW1wX3B0
ciwgIj09PT09PT09U3RhcnQgZHVtcCBkcml2ZXJpbmZvPT09PT09PT1cbiIpOw0KPiA+IC0JZndf
ZHVtcF9wdHIgKz0gc3RybGVuKCI9PT09PT09PVN0YXJ0IGR1bXAgZHJpdmVyaW5mbz09PT09PT09
XG4iKTsNCj4gPiAtCW1lbWNweShmd19kdW1wX3B0ciwgZHJ2X2luZm8sIGRydl9pbmZvX3NpemUp
Ow0KPiA+IC0JZndfZHVtcF9wdHIgKz0gZHJ2X2luZm9fc2l6ZTsNCj4gPiAtCXN0cmNweShmd19k
dW1wX3B0ciwgIlxuPT09PT09PT1FbmQgZHVtcD09PT09PT09XG4iKTsNCj4gPiAtCWZ3X2R1bXBf
cHRyICs9IHN0cmxlbigiXG49PT09PT09PUVuZCBkdW1wPT09PT09PT1cbiIpOw0KPiA+ICsJZndf
ZHVtcF9wdHIgPSAoY2hhciAqKWFkYXB0ZXItPmRldmR1bXBfZGF0YSArDQo+IGFkYXB0ZXItPmRl
dmR1bXBfbGVuOw0KPiA+DQo+ID4gIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGFkYXB0ZXItPm51bV9t
ZW1fdHlwZXM7IGlkeCsrKSB7DQo+ID4gIAkJc3RydWN0IG1lbW9yeV90eXBlX21hcHBpbmcgKmVu
dHJ5ID0gQEAgLTEyMjgsMTEgKzEyMzQsOCBAQA0KPiB2b2lkDQo+ID4gbXdpZmlleF91cGxvYWRf
ZGV2aWNlX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgdm9pZA0KPiAqZHJ2
X2luZm8sDQo+ID4gIAkvKiBkZXZpY2UgZHVtcCBkYXRhIHdpbGwgYmUgZnJlZSBpbiBkZXZpY2Ug
Y29yZWR1bXAgcmVsZWFzZSBmdW5jdGlvbg0KPiA+ICAJICogYWZ0ZXIgNSBtaW4NCj4gPiAgCSAq
Lw0KPiANCj4gXl4gVGhpcyBjb21tZW50IGlzIGEgYml0IG91dCBvZiBwbGFjZSBub3cuIFRoZSBk
YXRhIGlzIG5vdCBkdW1wZWQgdW50aWwgd2UgY2FsbA0KPiBtd2lmaWV4X3VwbG9hZF9kZXZpY2Vf
ZHVtcCgpLCBhbmQgc28gd2UgZG9uJ3QgZ3VhcmFudGVlIGFueW9uZSB3aWxsDQo+IGFjdHVhbGx5
IGZyZWUgaXQgZm9yIHVzIHVudGlsIHRoZW4NCj4gDQoNCk9rYXkuDQoNCj4gPiAtCWRldl9jb3Jl
ZHVtcHYoYWRhcHRlci0+ZGV2LCBkdW1wX2RhdGEsIGR1bXBfbGVuLCBHRlBfS0VSTkVMKTsNCj4g
PiAtCW13aWZpZXhfZGJnKGFkYXB0ZXIsIE1TRywNCj4gPiAtCQkgICAgIj09IG13aWZpZXggZHVt
cCBpbmZvcm1hdGlvbiB0byAvc3lzL2NsYXNzL2RldmNvcmVkdW1wIGVuZCIpOw0KPiA+ICsJYWRh
cHRlci0+ZGV2ZHVtcF9sZW4gPSBmd19kdW1wX3B0ciAtIChjaGFyICopYWRhcHRlci0+ZGV2ZHVt
cF9kYXRhOw0KPiA+DQo+ID4gLWRvbmU6DQo+ID4gIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGFkYXB0
ZXItPm51bV9tZW1fdHlwZXM7IGlkeCsrKSB7DQo+ID4gIAkJc3RydWN0IG1lbW9yeV90eXBlX21h
cHBpbmcgKmVudHJ5ID0NCj4gPiAgCQkJJmFkYXB0ZXItPm1lbV90eXBlX21hcHBpbmdfdGJsW2lk
eF07DQo+ID4gQEAgLTEyNDEsMTAgKzEyNDQsOCBAQCB2b2lkIG13aWZpZXhfdXBsb2FkX2Rldmlj
ZV9kdW1wKHN0cnVjdA0KPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKmRydl9pbmZv
LA0KPiA+ICAJCWVudHJ5LT5tZW1fcHRyID0gTlVMTDsNCj4gPiAgCQllbnRyeS0+bWVtX3NpemUg
PSAwOw0KPiA+ICAJfQ0KPiA+IC0NCj4gPiAtCXZmcmVlKGRydl9pbmZvKTsNCj4gPiAgfQ0KPiA+
IC1FWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcCk7DQo+ID4gK0VY
UE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfcHJlcGFyZV9md19kdW1wX2luZm8pOw0KPiA+DQo+ID4g
IC8qDQo+ID4gICAqIENGRzgwMi4xMSBuZXR3b3JrIGRldmljZSBoYW5kbGVyIGZvciBzdGF0aXN0
aWNzIHJldHJpZXZhbC4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy
dmVsbC9td2lmaWV4L21haW4uaA0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L21haW4uaA0KPiA+IGluZGV4IDE1NGMwNzkuLjhiNjI0MWEgMTAwNjQ0DQo+ID4gLS0t
IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uaA0KPiA+ICsrKyBi
L2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBAQCAtOTQs
NiArOTQsOCBAQCBlbnVtIHsNCj4gPg0KPiA+ICAjZGVmaW5lIE1BWF9FVkVOVF9TSVpFICAgICAg
ICAgICAgICAgICAgMjA0OA0KPiA+DQo+ID4gKyNkZWZpbmUgTVdJRklFWF9GV19EVU1QX1NJWkUg
ICAgICAgKDIgKiAxMDI0ICogMTAyNCkNCj4gPiArDQo+ID4gICNkZWZpbmUgQVJQX0ZJTFRFUl9N
QVhfQlVGX1NJWkUgICAgICAgICA2OA0KPiA+DQo+ID4gICNkZWZpbmUgTVdJRklFWF9LRVlfQlVG
RkVSX1NJWkUJCQkxNg0KPiA+IEBAIC0xMDMyLDYgKzEwMzQsOSBAQCBzdHJ1Y3QgbXdpZmlleF9h
ZGFwdGVyIHsNCj4gPiAgCWJvb2wgd2FrZV9ieV93aWZpOw0KPiA+ICAJLyogQWdncmVnYXRpb24g
cGFyYW1ldGVycyovDQo+ID4gIAlzdHJ1Y3QgYnVzX2FnZ3JfcGFyYW1zIGJ1c19hZ2dyOw0KPiA+
ICsJLyogRGV2aWNlIGR1bXAgZGF0YS9sZW5ndGggKi8NCj4gPiArCXZvaWQgKmRldmR1bXBfZGF0
YTsNCj4gPiArCWludCBkZXZkdW1wX2xlbjsNCj4gPiAgfTsNCj4gPg0KPiA+ICB2b2lkIG13aWZp
ZXhfcHJvY2Vzc190eF9xdWV1ZShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsgQEAN
Cj4gPiAtMTY1Niw5ICsxNjYxLDkgQEAgdm9pZCBtd2lmaWV4X2hpc3RfZGF0YV9hZGQoc3RydWN0
IG13aWZpZXhfcHJpdmF0ZQ0KPiA+ICpwcml2LA0KPiA+ICB1OCBtd2lmaWV4X2FkanVzdF9kYXRh
X3JhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwNCj4gPiAgCQkJICAgIHU4IHJ4X3Jh
dGUsIHU4IGh0X2luZm8pOw0KPiA+DQo+ID4gLWludCBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoc3Ry
dWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgdm9pZA0KPiA+ICoqZHJ2X2luZm8pOyAtdm9p
ZCBtd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyDQo+ICph
ZGFwdGVyLCB2b2lkICpkcnZfaW5mbywNCj4gPiAtCQkJCWludCBkcnZfaW5mb19zaXplKTsNCj4g
PiArdm9pZCBtd2lmaWV4X2Rydl9pbmZvX2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRh
cHRlcik7IHZvaWQNCj4gPiArbXdpZmlleF9wcmVwYXJlX2Z3X2R1bXBfaW5mbyhzdHJ1Y3QgbXdp
ZmlleF9hZGFwdGVyICphZGFwdGVyKTsgdm9pZA0KPiA+ICttd2lmaWV4X3VwbG9hZF9kZXZpY2Vf
ZHVtcChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsNCj4gPiAgdm9pZCAqbXdpZmll
eF9hbGxvY19kbWFfYWxpZ25fYnVmKGludCByeF9sZW4sIGdmcF90IGZsYWdzKTsgIHZvaWQNCj4g
PiBtd2lmaWV4X3F1ZXVlX21haW5fd29yayhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVy
KTsgIGludA0KPiA+IG13aWZpZXhfZ2V0X3dha2V1cF9yZWFzb24oc3RydWN0IG13aWZpZXhfcHJp
dmF0ZSAqcHJpdiwgdTE2IGFjdGlvbiwNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ly
ZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mv
bWFydmVsbC9td2lmaWV4L3BjaWUuYw0KPiA+IGluZGV4IGNkMzE0OTQuLmY2NjZjYjIgMTAwNjQ0
DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYw0K
PiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMNCj4g
PiBAQCAtMjc2OSwxMiArMjc2OSwxNyBAQCBzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfZndfZHVt
cChzdHJ1Y3QNCj4gPiBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpDQo+ID4NCj4gPiAgc3RhdGlj
IHZvaWQgbXdpZmlleF9wY2llX2RldmljZV9kdW1wX3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRl
cg0KPiA+ICphZGFwdGVyKSAgew0KPiA+IC0JaW50IGRydl9pbmZvX3NpemU7DQo+ID4gLQl2b2lk
ICpkcnZfaW5mbzsNCj4gPiArCWFkYXB0ZXItPmRldmR1bXBfZGF0YSA9IHZ6YWxsb2MoTVdJRklF
WF9GV19EVU1QX1NJWkUpOw0KPiANCj4gSSdtIHN0aWxsIG5vdCBzdXJlIHdoeSB5b3UgbmVlZCAz
IGRpZmZlcmVudCBjYWxsZXJzIHRvIGFsbG9jYXRlIHRoZSBzYW1lIHNpemUNCj4gYnVmZmVyLiBJ
dCBzZWVtcyBsaWtlIHRoaXMgc2hvdWxkIGFsbCBiZSBkb25lIGluIHRoZSBjb3JlLg0KPiANCg0K
SSBoYWQgdGhvdWdodCBvZiBwdXQgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRydl9pbmZvX2R1bXAg
aW50byAxIGZ1bmN0aW9uICwgYW5kIGxldCBpdCBjYWxsZWQgaW4gZGV2aWNlX2R1bXAuDQpCdXQg
aXQgbG9va3MgcXVpdGUgc3RyYW5nZS4NCkNvbnNpZGVyIHRoZSBkaWZmZXJlbnQgaW1wbGVtZW50
YXRpb24gb24gdXNiLCBsZXQgdGhlc2Ugc3ViIGZ1bmN0aW9ucyB3b3JrcyBpbiBhIGxvb3NlIGNv
dXBsaW5nIHdheSBzZWVtcyBiZXR0ZXIgdG8gcmV1c2UgdGhhbiBhICJjb3JlIiBhcmNoaXRlY3R1
cmUuDQoNClBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBtb3JlIHN1Z2dlc3Rpb25zIHRv
IGVuaGFuY2UgdGhpcyBwYXJ0DQoNClRoYW5rcyAmIFJlZ2FyZHMsDQpTaW1vbg0KDQo+IEJyaWFu
DQo+IA0KPiA+ICsJaWYgKCFhZGFwdGVyLT5kZXZkdW1wX2RhdGEpIHsNCj4gPiArCQltd2lmaWV4
X2RiZyhhZGFwdGVyLCBFUlJPUiwNCj4gPiArCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBm
YWlsdXJlIVxuIik7DQo+ID4gKwkJcmV0dXJuOw0KPiA+ICsJfQ0KPiA+DQo+ID4gLQlkcnZfaW5m
b19zaXplID0gbXdpZmlleF9kcnZfaW5mb19kdW1wKGFkYXB0ZXIsICZkcnZfaW5mbyk7DQo+ID4g
Kwltd2lmaWV4X2Rydl9pbmZvX2R1bXAoYWRhcHRlcik7DQo+ID4gIAltd2lmaWV4X3BjaWVfZndf
ZHVtcChhZGFwdGVyKTsNCj4gPiAtCW13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKGFkYXB0ZXIs
IGRydl9pbmZvLCBkcnZfaW5mb19zaXplKTsNCj4gPiArCW13aWZpZXhfcHJlcGFyZV9md19kdW1w
X2luZm8oYWRhcHRlcik7DQo+ID4gKwltd2lmaWV4X3VwbG9hZF9kZXZpY2VfZHVtcChhZGFwdGVy
KTsNCj4gPiAgfQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9jYXJkX3Jlc2V0
X3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlcg0KPiA+ICphZGFwdGVyKSBkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+IGIvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYw0KPiA+IGluZGV4IGZkNTE4M2Mu
LmE4Mjg4MDEgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L3NkaW8uYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdp
ZmlleC9zZGlvLmMNCj4gPiBAQCAtMjUwNSwxNSArMjUwNSwyMSBAQCBzdGF0aWMgdm9pZA0KPiA+
IG13aWZpZXhfc2Rpb19nZW5lcmljX2Z3X2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRh
cHRlcikgIHN0YXRpYw0KPiA+IHZvaWQgbXdpZmlleF9zZGlvX2RldmljZV9kdW1wX3dvcmsoc3Ry
dWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikgIHsNCj4gPiAgCXN0cnVjdCBzZGlvX21tY19j
YXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsNCj4gPiAtCWludCBkcnZfaW5mb19zaXplOw0KPiA+
IC0Jdm9pZCAqZHJ2X2luZm87DQo+ID4NCj4gPiAtCWRydl9pbmZvX3NpemUgPSBtd2lmaWV4X2Ry
dl9pbmZvX2R1bXAoYWRhcHRlciwgJmRydl9pbmZvKTsNCj4gPiArCWFkYXB0ZXItPmRldmR1bXBf
ZGF0YSA9IHZ6YWxsb2MoTVdJRklFWF9GV19EVU1QX1NJWkUpOw0KPiA+ICsJaWYgKCFhZGFwdGVy
LT5kZXZkdW1wX2RhdGEpIHsNCj4gPiArCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwNCj4g
PiArCQkJICAgICJ2emFsbG9jIGRldmR1bXAgZGF0YSBmYWlsdXJlIVxuIik7DQo+ID4gKwkJcmV0
dXJuOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCW13aWZpZXhfZHJ2X2luZm9fZHVtcChhZGFwdGVy
KTsNCj4gPiAgCWlmIChjYXJkLT5md19kdW1wX2VuaCkNCj4gPiAgCQltd2lmaWV4X3NkaW9fZ2Vu
ZXJpY19md19kdW1wKGFkYXB0ZXIpOw0KPiA+ICAJZWxzZQ0KPiA+ICAJCW13aWZpZXhfc2Rpb19m
d19kdW1wKGFkYXB0ZXIpOw0KPiA+IC0JbXdpZmlleF91cGxvYWRfZGV2aWNlX2R1bXAoYWRhcHRl
ciwgZHJ2X2luZm8sIGRydl9pbmZvX3NpemUpOw0KPiA+ICsJbXdpZmlleF9wcmVwYXJlX2Z3X2R1
bXBfaW5mbyhhZGFwdGVyKTsNCj4gPiArCW13aWZpZXhfdXBsb2FkX2RldmljZV9kdW1wKGFkYXB0
ZXIpOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX3dvcmsoc3Ry
dWN0IHdvcmtfc3RydWN0ICp3b3JrKQ0KPiA+IC0tDQo+ID4gMS45LjENCj4gPg0K

^ permalink raw reply

* Re: [v3 5/8] Bluetooth: btrsi: add new rsi bluetooth driver
From: Amitkumar Karwar @ 2017-12-06 10:01 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Kalle Valo, linux-wireless, Amitkumar Karwar,
	Prameela Rani Garnepudi, open list:BLUETOOTH DRIVERS,
	Siva Rebbagondla
In-Reply-To: <24DB6495-8CFF-401F-88A7-59BD03BC0C88@holtmann.org>

On Fri, Dec 1, 2017 at 4:24 PM, Marcel Holtmann <marcel@holtmann.org> wrote=
:
> Hi Amitkumar,
>
>> 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>
>> ---
>> v3: Made BT_RSI module by default off(Marcel)
>>    Removed redundant exported function rsi_get_hci_ops()(Marcel)
>> v2: Addressed review comments from Marcel
>>    Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>>    Removed redundant BT_INFO messages
>>    h_adapter initialization and declaration in a single line.
>>    Removed unnecessary error checks for HCI_RUNNING and fsm_state
>>    Allocated new skb with skb_realloc_headroom() API if headroom is not =
sufficient
>>    Used get_unaligned_le16 helpers
>>    Moved a structure and union from header file to btrsi.c file
>> ---
>> drivers/bluetooth/Kconfig   |  11 +++
>> drivers/bluetooth/Makefile  |   2 +
>> drivers/bluetooth/btrsi.c   | 211 ++++++++++++++++++++++++++++++++++++++=
++++++
>> drivers/bluetooth/rsi_hci.h |  40 +++++++++
>> include/linux/rsi_header.h  |   2 +
>> 5 files changed, 266 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..33d7514 100644
>> --- a/drivers/bluetooth/Kconfig
>> +++ b/drivers/bluetooth/Kconfig
>> @@ -378,4 +378,15 @@ 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"
>> +     default n
>> +     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 Redpine 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)                +=3D btqca.o
>>
>> obj-$(CONFIG_BT_HCIUART_NOKIA)        +=3D hci_nokia.o
>>
>> +obj-$(CONFIG_BT_RSI)         +=3D btrsi.o
>> +
>> btmrvl-y                      :=3D btmrvl_main.o
>> btmrvl-$(CONFIG_DEBUG_FS)     +=3D btmrvl_debugfs.o
>>
>> diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
>> new file mode 100644
>> index 0000000..71f6f4e
>> --- /dev/null
>> +++ b/drivers/bluetooth/btrsi.c
>> @@ -0,0 +1,211 @@
>> +/**
>> + * 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 abo=
ve
>> + * copyright notice and this permission notice appear in all copies.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRAN=
TIES
>> + * 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 DAMAG=
ES
>> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN A=
N
>> + * 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"
>> +
>> +struct rsi_hci_adapter {
>> +     void *priv;
>> +     struct rsi_proto_ops *proto_ops;
>> +     struct hci_dev *hdev;
>> +};
>> +
>> +const struct rsi_mod_ops rsi_bt_ops =3D {
>> +     .attach =3D rsi_hci_attach,
>> +     .detach =3D rsi_hci_detach,
>> +     .recv_pkt =3D rsi_hci_recv_pkt,
>> +};
>> +EXPORT_SYMBOL(rsi_bt_ops);
>> +
>> +static int rsi_hci_open(struct hci_dev *hdev)
>> +{
>> +     return 0;
>> +}
>> +
>> +static int rsi_hci_close(struct hci_dev *hdev)
>> +{
>> +     return 0;
>> +}
>> +
>> +static int rsi_hci_flush(struct hci_dev *hdev)
>> +{
>> +     return 0;
>> +}
>> +
>> +static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
>> +{
>> +     struct rsi_hci_adapter *h_adapter =3D hci_get_drvdata(hdev);
>> +     struct sk_buff *new_skb =3D NULL;
>> +
>> +     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;
>> +     }
>> +
>> +     if (skb_headroom(skb) < RSI_HEADROOM_FOR_BT_HAL) {
>> +             /* Insufficient skb headroom - allocate a new skb */
>> +             new_skb =3D skb_realloc_headroom(skb, RSI_HEADROOM_FOR_BT_=
HAL);
>> +             if (unlikely(!new_skb))
>> +                     return -ENOMEM;
>> +             bt_cb(new_skb)->pkt_type =3D bt_cb(skb)->pkt_type;
>> +             kfree_skb(skb);
>> +             skb =3D new_skb;
>> +     }
>> +
>> +     return h_adapter->proto_ops->coex_send_pkt(h_adapter->priv, skb,
>> +                                                RSI_BT_Q);
>> +}
>> +
>> +int rsi_hci_recv_pkt(void *priv, u8 *pkt)
>> +{
>> +     struct rsi_hci_adapter *h_adapter =3D (struct rsi_hci_adapter *)pr=
iv;
>> +     struct hci_dev *hdev =3D h_adapter->hdev;
>> +     struct sk_buff *skb;
>> +
>> +     int pkt_len =3D get_unaligned_le16(pkt) & 0x0fff;
>> +     u8 queue_no =3D (get_unaligned_le16(pkt) & 0x7000) >> 12;
>> +
>> +     if (queue_no =3D=3D RSI_BT_MGMT_Q) {
>> +             u8 msg_type =3D pkt[14] & 0xFF;
>> +
>> +             switch (msg_type) {
>> +             case RSI_RESULT_CONFIRM:
>> +                     bt_dev_info(hdev, "BT Result Confirm");
>> +                     return 0;
>> +             case RSI_BT_BER:
>> +                     bt_dev_info(hdev, "BT Ber");
>> +                     return 0;
>> +             case RSI_BT_CW:
>> +                     bt_dev_info(hdev, "BT CW");
>> +                     return 0;
>> +             default:
>> +                     break;
>> +             }
>> +     }
>> +
>> +     skb =3D dev_alloc_skb(pkt_len);
>> +     if (!skb)
>> +             return -ENOMEM;
>> +
>> +     memcpy(skb->data, pkt + RSI_FRAME_DESC_SIZE, pkt_len);
>> +     skb_put(skb, pkt_len);
>> +     h_adapter->hdev->stat.byte_rx +=3D skb->len;
>> +
>> +     skb->dev =3D (void *)hdev;
>> +     bt_cb(skb)->pkt_type =3D pkt[14];
>> +
>> +     return hci_recv_frame(hdev, skb);
>> +}
>> +
>> +int rsi_hci_attach(void *priv, struct rsi_proto_ops *ops)
>> +{
>> +     struct rsi_hci_adapter *h_adapter =3D NULL;
>> +     struct hci_dev *hdev;
>> +     int status =3D 0;
>> +
>> +     h_adapter =3D kzalloc(sizeof(*h_adapter), GFP_KERNEL);
>> +     if (!h_adapter)
>> +             return -ENOMEM;
>> +
>> +     h_adapter->priv =3D priv;
>> +     ops->set_bt_context(priv, h_adapter);
>> +     h_adapter->proto_ops =3D ops;
>> +
>> +     hdev =3D hci_alloc_dev();
>> +     if (!hdev) {
>> +             BT_ERR("Failed to alloc HCI device\n");
>> +             goto err;
>> +     }
>> +
>> +     h_adapter->hdev =3D hdev;
>> +
>> +     if (ops->get_host_intf(priv) =3D=3D RSI_HOST_INTF_SDIO)
>> +             hdev->bus =3D HCI_SDIO;
>> +     else
>> +             hdev->bus =3D HCI_USB;
>> +
>> +     hci_set_drvdata(hdev, h_adapter);
>> +     hdev->dev_type =3D HCI_PRIMARY;
>> +     hdev->open =3D rsi_hci_open;
>> +     hdev->close =3D rsi_hci_close;
>> +     hdev->flush =3D rsi_hci_flush;
>> +     hdev->send =3D rsi_hci_send_pkt;
>> +
>> +     status =3D hci_register_dev(hdev);
>> +     if (status < 0) {
>> +             BT_ERR("%s: HCI registration failed with errcode %d\n",
>> +                    __func__, status);
>> +             goto err;
>> +     }
>> +
>> +     return 0;
>> +err:
>> +     if (hdev) {
>> +             hci_unregister_dev(hdev);
>> +             hci_free_dev(hdev);
>> +             h_adapter->hdev =3D NULL;
>> +     }
>> +     kfree(h_adapter);
>> +
>> +     return -EINVAL;
>> +}
>> +
>> +void rsi_hci_detach(void *priv)
>> +{
>> +     struct rsi_hci_adapter *h_adapter =3D (struct rsi_hci_adapter *)pr=
iv;
>> +     struct hci_dev *hdev;
>> +
>> +     if (!h_adapter)
>> +             return;
>> +
>> +     hdev =3D h_adapter->hdev;
>> +     if (hdev) {
>> +             hci_unregister_dev(hdev);
>> +             hci_free_dev(hdev);
>> +             h_adapter->hdev =3D NULL;
>> +     }
>> +
>> +     kfree(h_adapter);
>> +}
>> +
>> +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..6fc7757
>> --- /dev/null
>> +++ b/drivers/bluetooth/rsi_hci.h
>> @@ -0,0 +1,40 @@
>> +/**
>> + * 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 abo=
ve
>> + * copyright notice and this permission notice appear in all copies.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRAN=
TIES
>> + * 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 DAMAG=
ES
>> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN A=
N
>> + * 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/unaligned/le_byteshift.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
>
> I still like to see changes to the BT core that allows the driver to spec=
ify how headroom it needs. This can be follow up patches, but we should do =
that since reallocating the SKBs all the time is also pointless.

Ok. I will prepare follow up patch for this.

>
>> +
>> +#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
>
> I have no idea why this header file is needed at all. Fold this into btrs=
i.c and make the rsi_hci_* functions static.

I will take care of this in v4.

>
>> diff --git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
>> index 737ab4e..07d9574 100644
>> --- a/include/linux/rsi_header.h
>> +++ b/include/linux/rsi_header.h
>> @@ -51,4 +51,6 @@ struct rsi_mod_ops {
>>       void (*detach)(void *priv);
>>       int (*recv_pkt)(void *priv, u8 *msg);
>> };
>> +
>> +extern const struct rsi_mod_ops rsi_bt_ops;
>
> If you expose rsi_hci_attach via rsi_bt_ops, then there is no need for ma=
king rsi_hci_attach also public. I mentioned this in the first review as we=
ll. I do not get it. Either you expose rsi_bt_ops from this module or you e=
xpose the rsi_hci_* function, but both is totally pointless.
>

Got it. I will get rid of header file and make these functions static

Regards,
Amitkumar

^ permalink raw reply

* Re: iwlwifi 0000:01:00.0: RF_KILL bit toggled to disable radio.
From: Julian Calaby @ 2017-12-06 10:01 UTC (permalink / raw)
  To: Cristian; +Cc: linux-wireless
In-Reply-To: <CABwnbUk+=aJD_VGNKTiEZxK02iNzKLRKx337Owp=v5F6EaAJQA@mail.gmail.com>

Hi Cristian,

On Wed, Dec 6, 2017 at 4:12 AM, Cristian <caravena@gmail.com> wrote:
> Hello,
>
> dmesg:
> [20164.665033] iwlwifi 0000:01:00.0: RF_KILL bit toggled to disable radio.
> [20164.665037] iwlwifi 0000:01:00.0: reporting RF_KILL (radio disabled)
> [20168.544323] iwlwifi 0000:01:00.0: RF_KILL bit toggled to enable radio.
> [20168.544328] iwlwifi 0000:01:00.0: reporting RF_KILL (radio enabled)

This is perfectly normal, what is the purpose of this email?

Thanks,

-- 
Julian Calaby

Email: julian.calaby@gmail.com
Profile: http://www.google.com/profiles/julian.calaby/

^ permalink raw reply

* [v4 0/8] rsi: add bluetooth and coex support
From: Amitkumar Karwar @ 2017-12-06  9:56 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.

Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

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                   |  11 ++
 drivers/bluetooth/Makefile                  |   2 +
 drivers/bluetooth/btrsi.c                   | 224 ++++++++++++++++++++++++++++
 drivers/net/wireless/rsi/Kconfig            |   2 +-
 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     | 110 +++++++++++++-
 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         |  20 +--
 drivers/net/wireless/rsi/rsi_mgmt.h         |   3 +
 drivers/net/wireless/rsi/rsi_usb.h          |  16 +-
 include/linux/rsi_header.h                  |  56 +++++++
 21 files changed, 861 insertions(+), 83 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 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

* [v4 1/8] rsi: add rx control block to handle rx packets in USB
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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

* [v4 2/8] rsi: add bluetooth rx endpoint
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=000000000001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
v3: Same as v2
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 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

* [v4 3/8] rsi: add header file rsi_header
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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 ++----------
 include/linux/rsi_header.h          | 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;
diff --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

* [v4 4/8] rsi: add coex support
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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 +
 include/linux/rsi_header.h              |  20 ++++
 11 files changed, 291 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);
diff --git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
index 16a447b..737ab4e 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,27 @@
 #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);
+};
+
+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

* [v4 5/8] Bluetooth: btrsi: add new rsi bluetooth driver
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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>
---
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
    Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
    Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
    Removed redundant BT_INFO messages
    h_adapter initialization and declaration in a single line.
    Removed unnecessary error checks for HCI_RUNNING and fsm_state
    Allocated new skb with skb_realloc_headroom() API if headroom is not sufficient
    Used get_unaligned_le16 helpers
    Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  11 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 224 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/rsi_header.h |   2 +
 4 files changed, 239 insertions(+)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 60e1c7d..33d7514 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -378,4 +378,15 @@ 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"
+	default n
+	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 Redpine 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..f76ae4d
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,224 @@
+/**
+ * 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 <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/hci_core.h>
+#include <linux/unaligned/le_byteshift.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
+#define RSI_FRAME_DESC_SIZE	16
+
+static struct rsi_hci_adapter {
+	void *priv;
+	struct rsi_proto_ops *proto_ops;
+	struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+	return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+	return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+	return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+	struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+	struct sk_buff *new_skb = NULL;
+
+	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;
+	}
+
+	if (skb_headroom(skb) < RSI_HEADROOM_FOR_BT_HAL) {
+		/* Insufficient skb headroom - allocate a new skb */
+		new_skb = skb_realloc_headroom(skb, RSI_HEADROOM_FOR_BT_HAL);
+		if (unlikely(!new_skb))
+			return -ENOMEM;
+		bt_cb(new_skb)->pkt_type = bt_cb(skb)->pkt_type;
+		kfree_skb(skb);
+		skb = new_skb;
+	}
+
+	return h_adapter->proto_ops->coex_send_pkt(h_adapter->priv, skb,
+						   RSI_BT_Q);
+}
+
+static int rsi_hci_recv_pkt(void *priv, u8 *pkt)
+{
+	struct rsi_hci_adapter *h_adapter = (struct rsi_hci_adapter *)priv;
+	struct hci_dev *hdev = h_adapter->hdev;
+	struct sk_buff *skb;
+
+	int pkt_len = get_unaligned_le16(pkt) & 0x0fff;
+	u8 queue_no = (get_unaligned_le16(pkt) & 0x7000) >> 12;
+
+	if (queue_no == RSI_BT_MGMT_Q) {
+		u8 msg_type = pkt[14] & 0xFF;
+
+		switch (msg_type) {
+		case RSI_RESULT_CONFIRM:
+			bt_dev_info(hdev, "BT Result Confirm");
+			return 0;
+		case RSI_BT_BER:
+			bt_dev_info(hdev, "BT Ber");
+			return 0;
+		case RSI_BT_CW:
+			bt_dev_info(hdev, "BT CW");
+			return 0;
+		default:
+			break;
+		}
+	}
+
+	skb = dev_alloc_skb(pkt_len);
+	if (!skb)
+		return -ENOMEM;
+
+	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);
+}
+
+static 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;
+
+	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;
+	}
+
+	return 0;
+err:
+	if (hdev) {
+		hci_unregister_dev(hdev);
+		hci_free_dev(hdev);
+		h_adapter->hdev = NULL;
+	}
+	kfree(h_adapter);
+
+	return -EINVAL;
+}
+
+static 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;
+	if (hdev) {
+		hci_unregister_dev(hdev);
+		hci_free_dev(hdev);
+		h_adapter->hdev = NULL;
+	}
+
+	kfree(h_adapter);
+}
+
+const struct rsi_mod_ops rsi_bt_ops = {
+	.attach	= rsi_hci_attach,
+	.detach	= rsi_hci_detach,
+	.recv_pkt = rsi_hci_recv_pkt,
+};
+EXPORT_SYMBOL(rsi_bt_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/include/linux/rsi_header.h b/include/linux/rsi_header.h
index 737ab4e..07d9574 100644
--- a/include/linux/rsi_header.h
+++ b/include/linux/rsi_header.h
@@ -51,4 +51,6 @@ struct rsi_mod_ops {
 	void (*detach)(void *priv);
 	int (*recv_pkt)(void *priv, u8 *msg);
 };
+
+extern const struct rsi_mod_ops rsi_bt_ops;
 #endif
-- 
2.7.4

^ permalink raw reply related

* [v4 6/8] rsi: handle BT traffic in driver
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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: Siva Rebbagondla <siva.rebbagondla@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/Kconfig            |  2 +-
 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     | 31 +++++++++++++++++++++++
 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         |  3 +++
 9 files changed, 100 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..ad72c80 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -13,7 +13,7 @@ if WLAN_VENDOR_RSI
 
 config RSI_91X
 	tristate "Redpine Signals Inc 91x WLAN driver support"
-	depends on MAC80211
+	depends on MAC80211 && BT_RSI
 	---help---
 	  This option enabes support for RSI 1x1 devices.
 	  Select M (recommended), if you have a RSI 1x1 wireless module.
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..375b725 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,12 @@ 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,
+};
+
 /**
  * rsi_dbg() - This function outputs informational messages.
  * @zone: Zone of interest for output message.
@@ -144,6 +151,7 @@ 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;
+	u8 bt_pkt_type;
 
 	index = 0;
 	do {
@@ -183,6 +191,22 @@ 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) {
+				rsi_dbg(INFO_ZONE, "BT Card ready recvd\n");
+				if (rsi_bt_ops.attach(common, &g_proto_ops))
+					rsi_dbg(ERR_ZONE,
+						"Failed to attach BT module\n");
+			} else {
+				rsi_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 +254,13 @@ 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;
+}
+
 /**
  * rsi_91x_init() - This function initializes os interface operations.
  * @void: Void.
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..69a604e 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -290,6 +290,8 @@ struct rsi_common {
 	bool p2p_enabled;
 	struct timer_list roc_timer;
 	struct ieee80211_vif *roc_vif;
+
+	void *bt_adapter;
 };
 
 struct eepromrw_info {
@@ -363,5 +365,6 @@ 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);
 
 #endif
-- 
2.7.4

^ permalink raw reply related

* [v4 7/8] rsi: add module parameter operating mode
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth, Siva Rebbagondla
In-Reply-To: <1512554197-19664-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 | 57 ++++++++++++++++++++++++++++-----
 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, 79 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 375b725..4a0f5a18 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -68,8 +68,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";
@@ -267,7 +283,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * 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;
@@ -309,11 +325,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");
@@ -348,10 +387,12 @@ 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);
+		rsi_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

* [v4 8/8] rsi: sdio changes to support BT
From: Amitkumar Karwar @ 2017-12-06  9:56 UTC (permalink / raw)
  To: Kalle Valo, marcel
  Cc: linux-wireless, Amitkumar Karwar, Prameela Rani Garnepudi,
	linux-bluetooth
In-Reply-To: <1512554197-19664-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: [PATCH V2] brcm: add CYW4373 firmwares and Cypress license file
From: Kyle McMartin @ 2017-12-07  1:36 UTC (permalink / raw)
  To: Chi-Hsien Lin
  Cc: linux-wireless, brcm80211-dev-list, brcm80211-dev-list.pdl,
	Arend van Spriel, linux-firmware
In-Reply-To: <20171201084243.GA58942@aremote07.aus.cypress.com>

On Fri, Dec 01, 2017 at 02:43:00AM -0600, Chi-Hsien Lin wrote:
> Add the CYW4373 SDIO and USB firmware files, along with the corresponding
> Cypress license file.
> 
> Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
> ---
>  LICENCE.cypress            | 139 +++++++++++++++++++++++++++++++++++++++++++++
>  WHENCE                     |   5 ++
>  brcm/brcmfmac4373-sdio.bin | Bin 0 -> 457994 bytes
>  brcm/brcmfmac4373.bin      | Bin 0 -> 479232 bytes
>  4 files changed, 144 insertions(+)
>  create mode 100644 LICENCE.cypress
>  create mode 100644 brcm/brcmfmac4373-sdio.bin
>  create mode 100644 brcm/brcmfmac4373.bin
> 

pulled, thanks chi-hsien.

regards, kyle

^ permalink raw reply

* RE: SDIO supend / Resume issue debugging
From: Pandi Vijayaraj @ 2017-12-07  4:50 UTC (permalink / raw)
  To: linux-wireless

Hi All,

currently I am working in linux wifi driver for a wifi card interfaced via SDIO.
I am using a ubuntu PC with the kernel 4.13.3 for driver development.
The wifi driver is able to talk to the module via SDIO and basic scan,
connect functions are successful.
I am facing an issue in testing SDIO SUSPEND/Resume mechanism.
the suspend / resume code is below.

static int g_sdio_suspend(struct device *dev)
{
    int ret;
    struct sdio_func *func;
    struct g_sdio_privd *g_sdio;
    mmc_pm_flag_t flags;

    dev_info(dev, "SDIO interface suspend received \n");

    func  = dev_to_sdio_func(dev);

    g_sdio = sdio_get_drvdata(func);

    flags = sdio_get_host_pm_caps(func);

    dev_info(dev, "SDIO Host PM caps flags = %d\n", flags);

    if (!(flags & MMC_PM_KEEP_POWER)||
            !(flags & MMC_PM_WAKE_SDIO_IRQ))
        return -EINVAL;

    ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
    if (ret) {
        dev_info(dev, "SDIO host pm flags set fail"
                " : Keep power set = %d", ret);
    }

    ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
    if (ret) {
        dev_info(dev, "SDIO host pm flags set fail"
                " : Wake IRQ set = %d", ret);
    }

    return ret;
}

static int g_sdio_resume(struct device *dev)
{
    dev_info(dev, "SDIO interface resume received \n");

    return 0;
}

I am testing suspend by issuing the command "sudo pm-suspend".
The debug message after issuing the suspend command is given below.

>From the dmesg, it is seen that below sequence occured.

    sdhci_resume_host() -> disable_irq_wake()-> irq_set_irq_wake().

After that MMC timeout is happening.
I have tried to debug this for sometime. But I could not proceed
further in this issue.
kindly help me debug this issue.

 [ 1007.779365] PM: Suspending system (mem)
 [ 1007.779385] Suspending console(s) (use no_console_suspend to debug)
 [ 1007.779591] g_wlan_sdio mmc0:0001:1: SDIO interface suspend received
 [ 1007.779596] g_wlan_sdio mmc0:0001:1: SDIO Host PM caps flags = 3
 [ 1010.693547] usb 1-1.4: reset full-speed USB device number 5 using ehci-pci
 [ 1010.785620] Unbalanced IRQ 16 wake disable
 [ 1010.785629] ------------[ cut here ]------------
 [ 1010.785637] WARNING: CPU: 2 PID: 4099 at kernel/irq/manage.c:596
irq_set_irq_wake+0x125/0x130
 [ 1010.785638] Modules linked in: g_sdio(OE) rfcomm bnep uvcvideo
videobuf2_vmalloc videobuf2_memops btusb videobuf2_v4l2 btrtl
videobuf2_core intel_rapl btbcm btintel videodev bluetooth
x86_pkg_temp_thermal ecdh_generic media intel_powerclamp coretemp
snd_hda_codec_hdmi kvm irqbypass snd_hda_codec_realtek arc4
snd_hda_codec_generic iwldvm crct10dif_pclmul crc32_pclmul
ghash_clmulni_intel mac80211 pcbc aesni_intel aes_x86_64 crypto_simd
snd_hda_intel glue_helper joydev input_leds snd_hda_codec cryptd
snd_hda_core serio_raw snd_hwdep wmi_bmof iwlwifi snd_pcm
thinkpad_acpi mei_me snd_seq_midi snd_seq_midi_event nvram snd_rawmidi
snd_seq mei snd_seq_device cfg80211 snd_timer snd soundcore shpchp
lpc_ich mac_hid parport_pc ppdev lp parport autofs4 mmc_block i915
psmouse ahci i2c_algo_bit libahci drm_kms_helper
 [ 1010.785694]  sdhci_pci syscopyarea e1000e sdhci sysfillrect
sysimgblt fb_sys_fops drm ptp pps_core wmi video
 [ 1010.785707] CPU: 2 PID: 4099 Comm: kworker/u16:47 Tainted: G
    OE   4.13.3 #1
 [ 1010.785708] Hardware name: LENOVO 2349J8Q/2349J8Q, BIOS G1ET41WW
(1.16 ) 05/25/2012
 [ 1010.785712] Workqueue: events_unbound async_run_entry_fn
 [ 1010.785715] task: ffff91a4193e9e00 task.stack: ffff9f6d03540000
 [ 1010.785718] RIP: 0010:irq_set_irq_wake+0x125/0x130
 [ 1010.785720] RSP: 0000:ffff9f6d03543cf0 EFLAGS: 00010086
 [ 1010.785722] RAX: 000000000000001e RBX: ffff91a41895f400 RCX:
ffffffff82e56ca8
 [ 1010.785723] RDX: 0000000000000000 RSI: 0000000000000086 RDI:
0000000000000002
 [ 1010.785724] RBP: ffff9f6d03543d18 R08: 0000000000000000 R09:
000000000000001e
 [ 1010.785725] R10: 0000000000000000 R11: 0000000000000000 R12:
0000000000000010
 [ 1010.785727] R13: 0000000000000000 R14: 0000000000000000 R15:
ffffffff82d029ed
 [ 1010.785729] FS:  0000000000000000(0000) GS:ffff91a41e280000(0000)
knlGS:0000000000000000
 [ 1010.785730] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
 [ 1010.785732] CR2: 0000000000000000 CR3: 0000000072e09000 CR4:
00000000001406e0
 [ 1010.785733] Call Trace:
 [ 1010.785743]  sdhci_resume_host+0x8b/0x110 [sdhci]
 [ 1010.785748]  sdhci_pci_resume_host+0x2e/0x50 [sdhci_pci]
 [ 1010.785751]  ricoh_mmc_resume+0x1f/0x30 [sdhci_pci]
 [ 1010.785755]  sdhci_pci_resume+0x29/0x40 [sdhci_pci]
 [ 1010.785760]  pci_pm_resume+0x64/0xa0
 [ 1010.785764]  dpm_run_callback+0x56/0x150
 [ 1010.785767]  ? pci_pm_freeze+0xe0/0xe0
 [ 1010.785769]  device_resume+0xe1/0x1f0
 [ 1010.785772]  async_resume+0x1d/0x50
 [ 1010.785774]  async_run_entry_fn+0x36/0x150
 [ 1010.785778]  process_one_work+0x156/0x3f0
 [ 1010.785781]  worker_thread+0x4b/0x410
 [ 1010.785785]  kthread+0x109/0x140
 [ 1010.785788]  ? process_one_work+0x3f0/0x3f0
 [ 1010.785791]  ? kthread_create_on_node+0x70/0x70
 [ 1010.785795]  ret_from_fork+0x25/0x30
 [ 1010.785797] Code: 00 00 81 20 ff bf ff ff e9 62 ff ff ff b8 ea ff
ff ff e9 6c ff ff ff e8 2a f3 f9 ff 44 89 e6 48 c7 c7 08 ad c9 82 e8
2c e1 ff ff <0f> ff e9 3a ff ff ff 0f 1f 40 00 0f 1f 44 00 00 55 89 fe
48 c7
 [ 1010.785834] ---[ end trace 28557b45b8d2e530 ]---
 [ 1010.881561] usb 1-1.6: reset high-speed USB device number 6 using ehci-pci
 [ 1010.940861] psmouse serio1: synaptics: queried max coordinates: x
[..5470], y [..4498]
 [ 1012.547072] irq 16: nobody cared (try booting with the "irqpoll" option)
 [ 1012.547074] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W  OE
 4.13.3 #1
 [ 1012.547075] Hardware name: LENOVO 2349J8Q/2349J8Q, BIOS G1ET41WW
(1.16 ) 05/25/2012
 [ 1012.547075] Call Trace:
 [ 1012.547077]  <IRQ>
 [ 1012.547081]  dump_stack+0x63/0x82
 [ 1012.547084]  __report_bad_irq+0x36/0xc0
 [ 1012.547086]  note_interrupt+0x259/0x2a0
 [ 1012.547088]  handle_irq_event_percpu+0x57/0x80
 [ 1012.547089]  handle_irq_event+0x41/0x70
 [ 1012.547091]  handle_fasteoi_irq+0x9d/0x160
 [ 1012.547093]  handle_irq+0x1d/0x30
 [ 1012.547095]  do_IRQ+0x46/0xd0
 [ 1012.547096]  common_interrupt+0x89/0x89
 [ 1012.547100] RIP: 0010:cpuidle_enter_state+0x130/0x2e0
 [ 1012.547101] RSP: 0018:ffffffff82e03de0 EFLAGS: 00000246 ORIG_RAX:
ffffffffffffff8e
 [ 1012.547102] RAX: 0000000000000000 RBX: 0000000000000001 RCX:
000000000000001f
 [ 1012.547103] RDX: 0000000000000000 RSI: 000000003350f940 RDI:
0000000000000000
 [ 1012.547104] RBP: ffffffff82e03e18 R08: 0000000000000003 R09:
0000000000000008
 [ 1012.547104] R10: ffffffff82e03db0 R11: 000000000000000a R12:
0000000000000001
 [ 1012.547105] R13: ffff91a41e224e00 R14: ffffffff82ecbdb8 R15:
000000ebc0821b71
 [ 1012.547106]  </IRQ>
 [ 1012.547109]  cpuidle_enter+0x17/0x20
 [ 1012.547111]  call_cpuidle+0x23/0x40
 [ 1012.547113]  do_idle+0x18c/0x1f0
 [ 1012.547115]  cpu_startup_entry+0x73/0x80
 [ 1012.547116]  rest_init+0xb8/0xc0
[ 1012.547119]  start_kernel+0x459/0x47a
[ 1012.547121]  ? early_idt_handler_array+0x120/0x120
[ 1012.547122]  x86_64_start_reservations+0x24/0x26
[ 1012.547123]  x86_64_start_kernel+0x144/0x167
[ 1012.547126]  secondary_startup_64+0x9f/0x9f
[ 1012.547128] handlers:
[ 1012.547130] [<ffffffff8267fea0>] usb_hcd_irq

-- 
Regards,

Pandi Vijayaraj

^ permalink raw reply

* Where does rtlwifi/rtl8188ee identifies interrupt type?
From: Farhan Khan @ 2017-12-07  5:01 UTC (permalink / raw)
  To: linux-wireless

Hi all,

I am reading through the rtlwifi code, specifically rtl8188ee code. I
am trying to find the driver handles interrupts, reads from the card
and identifies what type of interrupt it receives.

I believe it will utilize the REG_HISR and REG_HIMR registers, but
only see writes to those register values, not reads which I was
expecting.

Any ideas? Thanks!

--
Farhan Khan
PGP Fingerprint: B28D 2726 E2BC A97E 3854 5ABE 9A9F 00BC D525 16EE

^ permalink raw reply

* Re: [PATCH 00/10] brcmfmac: restructuring sdio access functions
From: Arend van Spriel @ 2017-12-07  8:47 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless
In-Reply-To: <1510605347-7629-1-git-send-email-arend.vanspriel@broadcom.com>

On 11/13/2017 9:35 PM, Arend van Spriel wrote:
> These patches were originally submitted by Ian Molton a while ago so decided
> to resubmit them. This is a first series of 10 patches. Tested using BCM4354
> device which showed no regression.
>
> It is intended for 4.16 (no rush ;-) ) and applies to the master branch of
> the wireless-drivers-next repository.

Hi Kalle,

I have follow-up series on this one. If you plan to take it today or 
tomorrow, I can hold the follow-up a bit more.

Regards,
Arend

^ permalink raw reply

* Re: [PATCH 00/10] brcmfmac: restructuring sdio access functions
From: Kalle Valo @ 2017-12-07  8:49 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: linux-wireless
In-Reply-To: <5A29001E.4080905@broadcom.com>

Arend van Spriel <arend.vanspriel@broadcom.com> writes:

> On 11/13/2017 9:35 PM, Arend van Spriel wrote:
>> These patches were originally submitted by Ian Molton a while ago so decided
>> to resubmit them. This is a first series of 10 patches. Tested using BCM4354
>> device which showed no regression.
>>
>> It is intended for 4.16 (no rush ;-) ) and applies to the master branch of
>> the wireless-drivers-next repository.
>
> Hi Kalle,
>
> I have follow-up series on this one. If you plan to take it today or
> tomorrow, I can hold the follow-up a bit more.

I'm hoping to apply these today.

-- 
Kalle Valo

^ permalink raw reply

* Re: [PATCH 00/10] brcmfmac: restructuring sdio access functions
From: Arend van Spriel @ 2017-12-07  8:59 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless
In-Reply-To: <87r2s6vs6d.fsf@kamboji.qca.qualcomm.com>

On 12/7/2017 9:49 AM, Kalle Valo wrote:
> Arend van Spriel <arend.vanspriel@broadcom.com> writes:
>
>> On 11/13/2017 9:35 PM, Arend van Spriel wrote:
>>> These patches were originally submitted by Ian Molton a while ago so decided
>>> to resubmit them. This is a first series of 10 patches. Tested using BCM4354
>>> device which showed no regression.
>>>
>>> It is intended for 4.16 (no rush ;-) ) and applies to the master branch of
>>> the wireless-drivers-next repository.
>>
>> Hi Kalle,
>>
>> I have follow-up series on this one. If you plan to take it today or
>> tomorrow, I can hold the follow-up a bit more.
>
> I'm hoping to apply these today.
>

btw. my neighbors put out the Finnish flag. Was that about your 
independence? Not a yearly event, or is it?

Gr. AvS

^ permalink raw reply

* Re: [v4 5/8] Bluetooth: btrsi: add new rsi bluetooth driver
From: Marcel Holtmann @ 2017-12-07  9:09 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: <1512554197-19664-6-git-send-email-amitkarwar@gmail.com>

Hi Amitkumar,

> 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>
> ---
> v4: Removed rsi_hci.h file. Made the functions static(Marcel)
> v3: Made BT_RSI module by default off(Marcel)
>    Removed redundant exported function rsi_get_hci_ops()(Marcel)
> v2: Addressed review comments from Marcel
>    Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>    Removed redundant BT_INFO messages
>    h_adapter initialization and declaration in a single line.
>    Removed unnecessary error checks for HCI_RUNNING and fsm_state
>    Allocated new skb with skb_realloc_headroom() API if headroom is not sufficient
>    Used get_unaligned_le16 helpers
>    Moved a structure and union from header file to btrsi.c file
> ---
> drivers/bluetooth/Kconfig  |  11 +++
> drivers/bluetooth/Makefile |   2 +
> drivers/bluetooth/btrsi.c  | 224 +++++++++++++++++++++++++++++++++++++++++++++
> include/linux/rsi_header.h |   2 +
> 4 files changed, 239 insertions(+)
> create mode 100644 drivers/bluetooth/btrsi.c
> 
> diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
> index 60e1c7d..33d7514 100644
> --- a/drivers/bluetooth/Kconfig
> +++ b/drivers/bluetooth/Kconfig
> @@ -378,4 +378,15 @@ 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"
> +	default n
> +	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 Redpine 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..f76ae4d
> --- /dev/null
> +++ b/drivers/bluetooth/btrsi.c
> @@ -0,0 +1,224 @@
> +/**
> + * 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 <linux/version.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <net/bluetooth/bluetooth.h>
> +#include <net/bluetooth/hci_core.h>
> +#include <linux/unaligned/le_byteshift.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
> +#define RSI_FRAME_DESC_SIZE	16
> +
> +static struct rsi_hci_adapter {
> +	void *priv;
> +	struct rsi_proto_ops *proto_ops;
> +	struct hci_dev *hdev;
> +};
> +
> +static int rsi_hci_open(struct hci_dev *hdev)
> +{
> +	return 0;
> +}
> +
> +static int rsi_hci_close(struct hci_dev *hdev)
> +{
> +	return 0;
> +}
> +
> +static int rsi_hci_flush(struct hci_dev *hdev)
> +{
> +	return 0;
> +}
> +
> +static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
> +{
> +	struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
> +	struct sk_buff *new_skb = NULL;
> +
> +	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;
> +	}

Scrab these empty lines before the break. No need to bloat this up.

> +
> +	if (skb_headroom(skb) < RSI_HEADROOM_FOR_BT_HAL) {
> +		/* Insufficient skb headroom - allocate a new skb */
> +		new_skb = skb_realloc_headroom(skb, RSI_HEADROOM_FOR_BT_HAL);
> +		if (unlikely(!new_skb))
> +			return -ENOMEM;
> +		bt_cb(new_skb)->pkt_type = bt_cb(skb)->pkt_type;
> +		kfree_skb(skb);
> +		skb = new_skb;
> +	}
> +
> +	return h_adapter->proto_ops->coex_send_pkt(h_adapter->priv, skb,
> +						   RSI_BT_Q);
> +}
> +
> +static int rsi_hci_recv_pkt(void *priv, u8 *pkt)

Why is it not const u8 *pkt?

> +{
> +	struct rsi_hci_adapter *h_adapter = (struct rsi_hci_adapter *)priv;

The cast here is not needed since *priv is a void pointer.

> +	struct hci_dev *hdev = h_adapter->hdev;
> +	struct sk_buff *skb;
> +
> +	int pkt_len = get_unaligned_le16(pkt) & 0x0fff;
> +	u8 queue_no = (get_unaligned_le16(pkt) & 0x7000) >> 12;

Why you are not doing get_unaligned_le16 once?

> +
> +	if (queue_no == RSI_BT_MGMT_Q) {
> +		u8 msg_type = pkt[14] & 0xFF;
> +
> +		switch (msg_type) {
> +		case RSI_RESULT_CONFIRM:
> +			bt_dev_info(hdev, "BT Result Confirm");
> +			return 0;
> +		case RSI_BT_BER:
> +			bt_dev_info(hdev, "BT Ber");
> +			return 0;
> +		case RSI_BT_CW:
> +			bt_dev_info(hdev, "BT CW");
> +			return 0;
> +		default:
> +			break;
> +		}
> +	}

Aren’t these above debug messages? How often 

> +
> +	skb = dev_alloc_skb(pkt_len);
> +	if (!skb)
> +		return -ENOMEM;
> +
> +	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;

That above is no longer needed.

> +	bt_cb(skb)->pkt_type = pkt[14];

Please hci_skb_pkt_type here.

> +
> +	return hci_recv_frame(hdev, skb);
> +}
> +
> +static 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;
> +
> +	hdev = hci_alloc_dev();
> +	if (!hdev) {
> +		BT_ERR("Failed to alloc HCI device\n”);

No \n at the end for the BT_ and bt_ ones.

> +		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);

The __func__ part is pointless here. And I would use err instead of status as variable.

> +		goto err;
> +	}
> +
> +	return 0;
> +err:
> +	if (hdev) {
> +		hci_unregister_dev(hdev);

That is wrong here. Nothing is registered.

> +		hci_free_dev(hdev);
> +		h_adapter->hdev = NULL;
> +	}

And I would use two error labels or just do it right in the error cases. It is actually simpler in the error cases since it is cleaner.

> +	kfree(h_adapter);
> +
> +	return -EINVAL;
> +}
> +
> +static 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;
> +	if (hdev) {
> +		hci_unregister_dev(hdev);
> +		hci_free_dev(hdev);
> +		h_adapter->hdev = NULL;
> +	}
> +
> +	kfree(h_adapter);
> +}
> +
> +const struct rsi_mod_ops rsi_bt_ops = {
> +	.attach	= rsi_hci_attach,
> +	.detach	= rsi_hci_detach,
> +	.recv_pkt = rsi_hci_recv_pkt,
> +};
> +EXPORT_SYMBOL(rsi_bt_ops);
> +
> +static int rsi_91x_bt_module_init(void)
> +{
> +	BT_INFO("%s: BT Module init called\n", __func__);

Scarp this BT_INFO, both of them are pointless.

> +
> +	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/include/linux/rsi_header.h b/include/linux/rsi_header.h
> index 737ab4e..07d9574 100644
> --- a/include/linux/rsi_header.h
> +++ b/include/linux/rsi_header.h
> @@ -51,4 +51,6 @@ struct rsi_mod_ops {
> 	void (*detach)(void *priv);
> 	int (*recv_pkt)(void *priv, u8 *msg);
> };
> +
> +extern const struct rsi_mod_ops rsi_bt_ops;
> #endif

Regards

Marcel

^ permalink raw reply

* [PATCH] brcmfmac: Support 43455 save-restore (SR) feature if FW include -sr
From: Wright Feng @ 2017-12-07  9:33 UTC (permalink / raw)
  To: arend.vanspriel, franky.lin, hante.meuleman, kvalo, chi-hsien.lin
  Cc: wright.feng, linux-wireless, brcm80211-dev-list.pdl, Double Lo

From: Double Lo <double.lo@cypress.com>

This patch will add 43455 into the save-restore(SR) capable chip list, so
the SR engine will be enabled with 43455 FW which built-in the -sr
function.

Signed-off-by: Double Lo <double.lo@cypress.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index c5d1a1c..f7b30ce 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -1338,6 +1338,7 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
 	switch (pub->chip) {
 	case BRCM_CC_4354_CHIP_ID:
 	case BRCM_CC_4356_CHIP_ID:
+	case BRCM_CC_4345_CHIP_ID:
 		/* explicitly check SR engine enable bit */
 		pmu_cc3_mask = BIT(2);
 		/* fall-through */
-- 
1.9.1

^ permalink raw reply related

* [PATCH] brcmsmac: use ARRAY_SIZE on rfseq_updategainu_events
From: Colin King @ 2017-12-07 10:20 UTC (permalink / raw)
  To: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Kalle Valo, linux-wireless, brcm80211-dev-list.pdl,
	brcm80211-dev-list, netdev
  Cc: kernel-janitors, linux-kernel

From: Colin Ian King <colin.king@canonical.com>

Use the ARRAY_SIZE macro on rfseq_updategainu_events to determine
size of the array. Improvement suggested by coccinelle.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
index 763e8ba6b178..7e01981bc5c8 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c
@@ -16049,8 +16049,7 @@ static void wlc_phy_workarounds_nphy_gainctrl(struct brcms_phy *pi)
 		wlc_phy_set_rfseq_nphy(pi, NPHY_RFSEQ_UPDATEGAINU,
 				       rfseq_updategainu_events,
 				       rfseq_updategainu_dlys,
-				       sizeof(rfseq_updategainu_events) /
-				       sizeof(rfseq_updategainu_events[0]));
+				       ARRAY_SIZE(rfseq_updategainu_events));
 
 		mod_phy_reg(pi, 0x153, (0xff << 8), (90 << 8));
 
-- 
2.14.1

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox