Linux wireless drivers development
 help / color / mirror / Atom feed
* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Felipe Balbi @ 2013-09-25 13:59 UTC (permalink / raw)
  To: Luca Coelho
  Cc: balbi, ben, Linux Kernel Mailing List, linux-wireless,
	Pavel Machek
In-Reply-To: <1380116535.4503.19.camel@porter.coelho.fi>

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

On Wed, Sep 25, 2013 at 04:42:15PM +0300, Luca Coelho wrote:
> On Wed, 2013-09-25 at 08:23 -0500, Felipe Balbi wrote:
> > On Wed, Sep 25, 2013 at 02:07:58PM +0300, Luca Coelho wrote:
> > > On Wed, 2013-09-25 at 14:04 +0300, Luca Coelho wrote:
> > > > When sending big binary blobs, it's generally better to send pull
> > > > requests instead of patches.  If you add the -p option when calling git
> > > > pull-request, the text will include all the readable parts but will omit
> > > > the binary stuff.
> > > > 
> > > > Thank you very much for following up on this!
> > > 
> > > Ah, and I forgot to say that you should update the WHENCE file
> > > accordingly too.  Check the wl12xx and wl18xx drivers for examples.
> > 
> > I'll send a pull request, but how about this ? I don't think we can
> > change the license. It seems like the other firmwares are using the
> > older license, I'd argue those should be changed to the new one, but
> > that's another discussion.
> 
> Cool, in general it looks good!
> 
> Though it would be nice to know if the same "new" license could be used
> for all the firmwares to avoid almost identical licenses.

well, i'm not a lawyer :-s

> > diff --git a/WHENCE b/WHENCE
> > index e66fea5..4e9e2ed 100644
> > --- a/WHENCE
> > +++ b/WHENCE
> > @@ -1705,6 +1705,19 @@ Licence: Redistributable. See LICENCE.tda7706-firmware.txt for details.
> >  
> >  --------------------------------------------------------------------------
> >  
> > +Driver: wl1251 - Texas Instruments 802.11 WLAN driver for WiLink4 chips
> > +
> > +File: ti-connectivity/wl1251-fw.bin
> > +File: ti-connectivity/wl1251-nvs.bin
> 
> Don't you have the firmware version number to add here with "Version:"
> tags like the other ones? I think you can easily find the version by
> running strings on the binary and grepping for "Rev" (at least with the
> newer WiLinks, this works).

Done :-) thanks for the tip.

> > +Licence: See LICENCE.wl1251 for details.
> > +
> > +The driver expects to find the firmwares under a ti-connectivity subdirectory.
> > +So if your system looks for firmwares in /lib/firmware, the firmwares for
> > +wl12xx chips must be located in /lib/firmware/ti-connectivity/.
> 
> It's a bit stupid that this was never changed in wl1251, but it still
> expects the driver in the "root" firmwares directory (ie.
> in /lib/firmware/wl1251-fw.bin, not
> in /lib/firmware/ti-connectivity/wl1251-fw.bin).  Maybe now is the right
> time to change the driver appropriately to keep consistency? ;)

alright, will do...

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Luca Coelho @ 2013-09-25 13:42 UTC (permalink / raw)
  To: balbi; +Cc: ben, Linux Kernel Mailing List, linux-wireless, Pavel Machek
In-Reply-To: <20130925132359.GE10746@radagast>

On Wed, 2013-09-25 at 08:23 -0500, Felipe Balbi wrote:
> On Wed, Sep 25, 2013 at 02:07:58PM +0300, Luca Coelho wrote:
> > On Wed, 2013-09-25 at 14:04 +0300, Luca Coelho wrote:
> > > When sending big binary blobs, it's generally better to send pull
> > > requests instead of patches.  If you add the -p option when calling git
> > > pull-request, the text will include all the readable parts but will omit
> > > the binary stuff.
> > > 
> > > Thank you very much for following up on this!
> > 
> > Ah, and I forgot to say that you should update the WHENCE file
> > accordingly too.  Check the wl12xx and wl18xx drivers for examples.
> 
> I'll send a pull request, but how about this ? I don't think we can
> change the license. It seems like the other firmwares are using the
> older license, I'd argue those should be changed to the new one, but
> that's another discussion.

Cool, in general it looks good!

Though it would be nice to know if the same "new" license could be used
for all the firmwares to avoid almost identical licenses.

More comments below...

> diff --git a/WHENCE b/WHENCE
> index e66fea5..4e9e2ed 100644
> --- a/WHENCE
> +++ b/WHENCE
> @@ -1705,6 +1705,19 @@ Licence: Redistributable. See LICENCE.tda7706-firmware.txt for details.
>  
>  --------------------------------------------------------------------------
>  
> +Driver: wl1251 - Texas Instruments 802.11 WLAN driver for WiLink4 chips
> +
> +File: ti-connectivity/wl1251-fw.bin
> +File: ti-connectivity/wl1251-nvs.bin

Don't you have the firmware version number to add here with "Version:"
tags like the other ones? I think you can easily find the version by
running strings on the binary and grepping for "Rev" (at least with the
newer WiLinks, this works).


> +Licence: See LICENCE.wl1251 for details.
> +
> +The driver expects to find the firmwares under a ti-connectivity subdirectory.
> +So if your system looks for firmwares in /lib/firmware, the firmwares for
> +wl12xx chips must be located in /lib/firmware/ti-connectivity/.

It's a bit stupid that this was never changed in wl1251, but it still
expects the driver in the "root" firmwares directory (ie.
in /lib/firmware/wl1251-fw.bin, not
in /lib/firmware/ti-connectivity/wl1251-fw.bin).  Maybe now is the right
time to change the driver appropriately to keep consistency? ;)

--
Luca.


^ permalink raw reply

* [PATCH] rt2800: add support for radio chip RF3070
From: Stanislaw Gruszka @ 2013-09-25 13:34 UTC (permalink / raw)
  To: linux-wireless; +Cc: users

Add support for new RF chip ID: 3070. It seems to be the same as 5370,
maybe vendor just put wrong value on the eeprom, but add this id anyway
since devices with it showed on the marked.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index fa33b5e..e3eb952 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -52,6 +52,7 @@
  * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392)
  * RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662)
  * RF5592 2.4G/5G 2T2R
+ * RF3070 2.4G 1T1R
  * RF5360 2.4G 1T1R
  * RF5370 2.4G 1T1R
  * RF5390 2.4G 1T1R
@@ -70,6 +71,7 @@
 #define RF3322				0x000c
 #define RF3053				0x000d
 #define RF5592				0x000f
+#define RF3070				0x3070
 #define RF3290				0x3290
 #define RF5360				0x5360
 #define RF5370				0x5370
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 88ce656..d2f638f 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -3152,6 +3152,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 	case RF3322:
 		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
 		break;
+	case RF3070:
 	case RF5360:
 	case RF5370:
 	case RF5372:
@@ -3166,7 +3167,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
 	}
 
-	if (rt2x00_rf(rt2x00dev, RF3290) ||
+	if (rt2x00_rf(rt2x00dev, RF3070) ||
+	    rt2x00_rf(rt2x00dev, RF3290) ||
 	    rt2x00_rf(rt2x00dev, RF3322) ||
 	    rt2x00_rf(rt2x00dev, RF5360) ||
 	    rt2x00_rf(rt2x00dev, RF5370) ||
@@ -4264,6 +4266,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
 		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
 		break;
 	case RF3053:
+	case RF3070:
 	case RF3290:
 	case RF5360:
 	case RF5370:
@@ -7021,6 +7024,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RF3022:
 	case RF3052:
 	case RF3053:
+	case RF3070:
 	case RF3290:
 	case RF3320:
 	case RF3322:
@@ -7543,6 +7547,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 		   rt2x00_rf(rt2x00dev, RF2020) ||
 		   rt2x00_rf(rt2x00dev, RF3021) ||
 		   rt2x00_rf(rt2x00dev, RF3022) ||
+		   rt2x00_rf(rt2x00dev, RF3070) ||
 		   rt2x00_rf(rt2x00dev, RF3290) ||
 		   rt2x00_rf(rt2x00dev, RF3320) ||
 		   rt2x00_rf(rt2x00dev, RF3322) ||
@@ -7671,6 +7676,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	case RF3320:
 	case RF3052:
 	case RF3053:
+	case RF3070:
 	case RF3290:
 	case RF5360:
 	case RF5370:

^ permalink raw reply related

* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Felipe Balbi @ 2013-09-25 13:23 UTC (permalink / raw)
  To: Luca Coelho
  Cc: Felipe Balbi, ben, Linux Kernel Mailing List, linux-wireless,
	Pavel Machek
In-Reply-To: <1380107278.4503.9.camel@porter.coelho.fi>

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

Hi,

On Wed, Sep 25, 2013 at 02:07:58PM +0300, Luca Coelho wrote:
> On Wed, 2013-09-25 at 14:04 +0300, Luca Coelho wrote:
> > Hi dude,
> > 
> > Great, this is cool! Finally! :)
> > 
> > A few comments...
> > 
> > 
> > On Tue, 2013-09-24 at 09:44 -0500, Felipe Balbi wrote:
> > > It's way overdue that we send these firmware
> > > blobs upstream. Thanks for everybody involved
> > > in getting this sorted out.
> > > 
> > > Cc: Luciano Coelho <luca@coelho.fi>
> > > Cc: Pavel Machek <pavel@denx.de>
> > > Signed-off-by: Felipe Balbi <balbi@ti.com>
> > > ---
> > 
> > The commit message could be a bit more descriptive rather than
> > narrative?
> > 
> > 
> > >  ti-connectivity/license-wl1251.txt |  59 +++++++++++++++++++++++++++++++++++++
> > 
> > The license file should be in the root, together with the other licenses
> > and called LICENCE.wl1251 (note the en-GB spelling).  Also, this license
> > is *very* similar to the one for WiLink6/7/8 (LICENCE.ti-connectivity),
> > except for some very minor things and the formatting.  Couldn't the same
> > one be used, for the sake of simplicity and consistency?
> > 
> > 
> > >  ti-connectivity/wl1251-fw.bin      | Bin 0 -> 194180 bytes
> > >  ti-connectivity/wl1251-nvs.bin     | Bin 0 -> 752 bytes
> > >  3 files changed, 59 insertions(+)
> > >  create mode 100644 ti-connectivity/license-wl1251.txt
> > >  create mode 100644 ti-connectivity/wl1251-fw.bin
> > >  create mode 100644 ti-connectivity/wl1251-nvs.bin
> > 
> > When sending big binary blobs, it's generally better to send pull
> > requests instead of patches.  If you add the -p option when calling git
> > pull-request, the text will include all the readable parts but will omit
> > the binary stuff.
> > 
> > Thank you very much for following up on this!
> 
> Ah, and I forgot to say that you should update the WHENCE file
> accordingly too.  Check the wl12xx and wl18xx drivers for examples.

I'll send a pull request, but how about this ? I don't think we can
change the license. It seems like the other firmwares are using the
older license, I'd argue those should be changed to the new one, but
that's another discussion.

commit 453b2a32470b2e50c5c96bc7ac4a39a3f6b6b30d
Author: Felipe Balbi <balbi@ti.com>
Date:   Tue Sep 24 09:29:34 2013 -0500

    ti-connectivity: add wl1251 firmware and license
    
    This new firmware blob is used with the old wl1251
    device whose driver has been in the kernel for quite
    some time.
    
    Cc: Luciano Coelho <luca@coelho.fi>
    Cc: Pavel Machek <pavel@denx.de>
    Signed-off-by: Felipe Balbi <balbi@ti.com>

diff --git a/LICENCE.wl1251 b/LICENCE.wl1251
new file mode 100644
index 0000000..bd0f5f1
--- /dev/null
+++ b/LICENCE.wl1251
@@ -0,0 +1,59 @@
+Copyright (c) 2000 – 2013 Texas Instruments Incorporated
+
+All rights reserved not granted herein.
+
+Limited License.
+
+Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
+license under copyrights and patents it now or hereafter owns or controls to
+make, have made, use, import, offer to sell and sell ("Utilize") this software
+subject to the terms herein.  With respect to the foregoing patent license,
+such license is granted  solely to the extent that any such patent is necessary
+to Utilize the software alone.  The patent license shall not apply to any
+combinations which include this software, other than combinations with devices
+manufactured by or for TI (“TI Devices”).  No hardware patent is licensed
+hereunder.
+
+Redistributions must preserve existing copyright notices and reproduce this
+license (including the above copyright notice and the disclaimer and (if
+applicable) source code license limitations below) in the documentation and/or
+other materials provided with the distribution
+
+Redistribution and use in binary form, without modification, are permitted
+provided that the following conditions are met:
+
+*	No reverse engineering, decompilation, or disassembly of this software
+	is permitted with respect to any software provided in binary form.
+
+*	any redistribution and use are licensed by TI for use only with TI
+	Devices.
+
+*	Nothing shall obligate TI to provide you with source code for the
+	software licensed and provided to you in object code.
+
+If software source code is provided to you, modification and redistribution of
+the source code are permitted provided that the following conditions are met:
+
+*	any redistribution and use of the source code, including any resulting
+	derivative works, are licensed by TI for use only with TI Devices.
+
+*	any redistribution and use of any object code compiled from the source
+	code and any resulting derivative works, are licensed by TI for use
+	only with TI Devices.
+
+Neither the name of Texas Instruments Incorporated nor the names of its
+suppliers may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+DISCLAIMER.
+
+THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/WHENCE b/WHENCE
index e66fea5..4e9e2ed 100644
--- a/WHENCE
+++ b/WHENCE
@@ -1705,6 +1705,19 @@ Licence: Redistributable. See LICENCE.tda7706-firmware.txt for details.
 
 --------------------------------------------------------------------------
 
+Driver: wl1251 - Texas Instruments 802.11 WLAN driver for WiLink4 chips
+
+File: ti-connectivity/wl1251-fw.bin
+File: ti-connectivity/wl1251-nvs.bin
+
+Licence: See LICENCE.wl1251 for details.
+
+The driver expects to find the firmwares under a ti-connectivity subdirectory.
+So if your system looks for firmwares in /lib/firmware, the firmwares for
+wl12xx chips must be located in /lib/firmware/ti-connectivity/.
+
+--------------------------------------------------------------------------
+
 Driver: wl12xx - Texas Instruments 802.11 WLAN driver for WiLink6/7 chips
 
 File: ti-connectivity/wl1271-fw.bin
diff --git a/ti-connectivity/wl1251-fw.bin b/ti-connectivity/wl1251-fw.bin
new file mode 100644
index 0000000..f89c983
Binary files /dev/null and b/ti-connectivity/wl1251-fw.bin differ
diff --git a/ti-connectivity/wl1251-nvs.bin b/ti-connectivity/wl1251-nvs.bin
new file mode 100644
index 0000000..2bf9c50
Binary files /dev/null and b/ti-connectivity/wl1251-nvs.bin differ

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply related

* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Felipe Balbi @ 2013-09-25 12:54 UTC (permalink / raw)
  To: Luca Coelho
  Cc: Felipe Balbi, ben, Linux Kernel Mailing List, linux-wireless,
	Pavel Machek
In-Reply-To: <1380107096.4503.8.camel@porter.coelho.fi>

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

Hi,

On Wed, Sep 25, 2013 at 02:04:56PM +0300, Luca Coelho wrote:
> Hi dude,
> 
> Great, this is cool! Finally! :)
> 
> A few comments...
> 
> 
> On Tue, 2013-09-24 at 09:44 -0500, Felipe Balbi wrote:
> > It's way overdue that we send these firmware
> > blobs upstream. Thanks for everybody involved
> > in getting this sorted out.
> > 
> > Cc: Luciano Coelho <luca@coelho.fi>
> > Cc: Pavel Machek <pavel@denx.de>
> > Signed-off-by: Felipe Balbi <balbi@ti.com>
> > ---
> 
> The commit message could be a bit more descriptive rather than
> narrative?

sure, why not.

> >  ti-connectivity/license-wl1251.txt |  59 +++++++++++++++++++++++++++++++++++++
> 
> The license file should be in the root, together with the other licenses
> and called LICENCE.wl1251 (note the en-GB spelling).  Also, this license
> is *very* similar to the one for WiLink6/7/8 (LICENCE.ti-connectivity),
> except for some very minor things and the formatting.  Couldn't the same
> one be used, for the sake of simplicity and consistency?

let me check.

> >  ti-connectivity/wl1251-fw.bin      | Bin 0 -> 194180 bytes
> >  ti-connectivity/wl1251-nvs.bin     | Bin 0 -> 752 bytes
> >  3 files changed, 59 insertions(+)
> >  create mode 100644 ti-connectivity/license-wl1251.txt
> >  create mode 100644 ti-connectivity/wl1251-fw.bin
> >  create mode 100644 ti-connectivity/wl1251-nvs.bin
> 
> When sending big binary blobs, it's generally better to send pull
> requests instead of patches.  If you add the -p option when calling git
> pull-request, the text will include all the readable parts but will omit
> the binary stuff.

will do

> Thank you very much for following up on this!

np.

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* Re: No connection with TP-Link TL-WN823N (rtl8192cu)
From: Dan Williams @ 2013-09-25 12:47 UTC (permalink / raw)
  To: Larry Finger; +Cc: linux-wireless
In-Reply-To: <524215AD.6060300@lwfinger.net>

On Tue, 2013-09-24 at 17:43 -0500, Larry Finger wrote:
> On 09/09/2013 05:15 PM, Dan Williams wrote:
> > On Mon, 2013-09-09 at 16:52 -0500, Larry Finger wrote:
> 
> >> I have been running rtl8192cu for the past 24 hours without a permanent
> >> disconnect. Under NetworkManager, I see some reason 7 deauthentications, but
> >
> > Running wpa_supplicant with debugging on might shed some light on these;
> > basically:
> >
> > mv /usr/sbin/wpa_supplicant /
> > killall -TERM wpa_supplicant
> > /wpa_supplicant -dddtu <piped to your favorite log file>
> >
> > and NM should automatically reconnect, and then we can figure out what's
> > going on in the supplicant.
> 
> Dan,
> 
> The log of wpa_supplicant associated with the reason 7 disconnects are as follows:

So reason 7 is "Incorrect frame type or subtype received from
unassociated station" which seems like the AP thinks we got
disconnected, and would seem to be a driver/mac80211 issue still, right?

> 1380060983.255499: RTM_NEWLINK: operstate=1 ifi_flags=0x1003 ([UP])
> 1380060983.255516: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
> 1380060983.255588: nl80211: if_removed already cleared - ignore event
> 1380060983.255600: Ignore event for foreign ifindex 22
> 1380060983.272257: nl80211: Event message available
> 1380060983.272307: nl80211: Delete station 20:e5:2a:01:f7:ea
> 1380060983.280211: nl80211: Event message available
> 1380060983.280228: nl80211: MLME event 39
> 1380060983.280230: nl80211: MLME event frame - hexdump(len=26): c0 00 3a 01 1c 
> 65 9d 5a c3 9d 20 e5 2a 01 f7 ea 20 e5 2a 01 f7 ea 30 d2 07 00
> 1380060983.280248: wlan3: Event DEAUTH (12) received
> 1380060983.280252: wlan3: Deauthentication notification
> 1380060983.280255: wlan3:  * reason 7
> 1380060983.280258: wlan3:  * address 20:e5:2a:01:f7:ea
> 1380060983.280260: Deauthentication frame IE(s) - hexdump(len=0): [NULL]
> 1380060983.280264: wlan3: WPA: Auto connect enabled: try to reconnect (wps=0)
> 1380060983.280267: wlan3: Setting scan request: 0 sec 100000 usec
> 1380060983.280271: Added BSSID 20:e5:2a:01:f7:ea into blacklist
> 1380060983.280276: wlan3: Not rescheduling scan to ensure that specific SSID 
> scans occur
> 1380060983.280281: wlan3: CTRL-EVENT-DISCONNECTED bssid=20:e5:2a:01:f7:ea reason=7
> 1380060983.280283: wlan3: Disconnect event - remove keys

Ok, got disconnected with reason 7...

> 1380060984.471985: WPA: Group Key - hexdump(len=16): [REMOVED]
> 1380060984.471989: wlan3: WPA: Installing GTK to the driver (keyidx=1 tx=0 len=16)
> 1380060984.471991: WPA: RSC - hexdump(len=6): 61 44 1a 00 00 00
> 1380060984.472044: wpa_driver_nl80211_set_key: ifindex=22 alg=3 addr=0x492909 
> key_idx=1 set_tx=0 seq_len=6 key_len=16
> 1380060984.472051:    broadcast key
> 1380060984.473171: wlan3: WPA: Key negotiation completed with 20:e5:2a:01:f7:ea 
> [PTK=CCMP GTK=CCMP]
> 1380060984.473174: wlan3: Cancelling authentication timeout
> 1380060984.473178: wlan3: State: GROUP_HANDSHAKE -> COMPLETED
> 1380060984.473183: wlan3: CTRL-EVENT-CONNECTED - Connection to 20:e5:2a:01:f7:ea 
> completed (reauth) [id=0 id_str=]

And got reconnected after a bit more than one second.  So at least it
recovers quickly, but the question is more about why the reason 7
happened, and what frames caused it, I think.

Dan


^ permalink raw reply

* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Luca Coelho @ 2013-09-25 11:07 UTC (permalink / raw)
  To: Felipe Balbi; +Cc: ben, Linux Kernel Mailing List, linux-wireless, Pavel Machek
In-Reply-To: <1380107096.4503.8.camel@porter.coelho.fi>

On Wed, 2013-09-25 at 14:04 +0300, Luca Coelho wrote:
> Hi dude,
> 
> Great, this is cool! Finally! :)
> 
> A few comments...
> 
> 
> On Tue, 2013-09-24 at 09:44 -0500, Felipe Balbi wrote:
> > It's way overdue that we send these firmware
> > blobs upstream. Thanks for everybody involved
> > in getting this sorted out.
> > 
> > Cc: Luciano Coelho <luca@coelho.fi>
> > Cc: Pavel Machek <pavel@denx.de>
> > Signed-off-by: Felipe Balbi <balbi@ti.com>
> > ---
> 
> The commit message could be a bit more descriptive rather than
> narrative?
> 
> 
> >  ti-connectivity/license-wl1251.txt |  59 +++++++++++++++++++++++++++++++++++++
> 
> The license file should be in the root, together with the other licenses
> and called LICENCE.wl1251 (note the en-GB spelling).  Also, this license
> is *very* similar to the one for WiLink6/7/8 (LICENCE.ti-connectivity),
> except for some very minor things and the formatting.  Couldn't the same
> one be used, for the sake of simplicity and consistency?
> 
> 
> >  ti-connectivity/wl1251-fw.bin      | Bin 0 -> 194180 bytes
> >  ti-connectivity/wl1251-nvs.bin     | Bin 0 -> 752 bytes
> >  3 files changed, 59 insertions(+)
> >  create mode 100644 ti-connectivity/license-wl1251.txt
> >  create mode 100644 ti-connectivity/wl1251-fw.bin
> >  create mode 100644 ti-connectivity/wl1251-nvs.bin
> 
> When sending big binary blobs, it's generally better to send pull
> requests instead of patches.  If you add the -p option when calling git
> pull-request, the text will include all the readable parts but will omit
> the binary stuff.
> 
> Thank you very much for following up on this!

Ah, and I forgot to say that you should update the WHENCE file
accordingly too.  Check the wl12xx and wl18xx drivers for examples.

--
Luca.


^ permalink raw reply

* [PATCH 1/7] brcmfmac: sync firmware event list
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Franky Lin, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

From: Franky Lin <frankyl@broadcom.com>

Update event list to keep sync with firmware development. Use calculated event
mask length instead of hard-coded value.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/dhd.h  |    2 --
 drivers/net/wireless/brcm80211/brcmfmac/fweh.h |    5 ++++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 2eb9e64..4de9aac 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -97,8 +97,6 @@
 #define	WLC_PHY_TYPE_LCN	8
 #define	WLC_PHY_TYPE_NULL	0xf
 
-#define BRCMF_EVENTING_MASK_LEN	16
-
 #define TOE_TX_CSUM_OL		0x00000001
 #define TOE_RX_CSUM_OL		0x00000002
 
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
index e679214..9ee5c51 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
@@ -102,7 +102,8 @@ struct brcmf_event;
 	BRCMF_ENUM_DEF(DCS_REQUEST, 73) \
 	BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \
 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
-	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127)
+	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \
+	BRCMF_ENUM_DEF(PSTA_PRIMARY_INTF_IND, 128)
 
 #define BRCMF_ENUM_DEF(id, val) \
 	BRCMF_E_##id = (val),
@@ -114,6 +115,8 @@ enum brcmf_fweh_event_code {
 };
 #undef BRCMF_ENUM_DEF
 
+#define BRCMF_EVENTING_MASK_LEN		(roundup(BRCMF_E_LAST, 8)/8)
+
 /* flags field values in struct brcmf_event_msg */
 #define BRCMF_EVENT_MSG_LINK		0x01
 #define BRCMF_EVENT_MSG_FLUSHTXQ	0x02
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 5/7] brcmfmac: fix sparse error 'bad constant expression'
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

The definition of BRCMF_EVENTING_MASK_LEN results in a sparse
error message

.../fweh.c:331:22: error: bad constant expression
.../fweh.c:388:22: error: bad constant expression
.../dhd_common.c:256:22: error: bad constant expression

This is caused by the use of roundup() in BRCMF_EVENTING_MASK_LEN
and it is used to allocate an array variable on the stack. Better
use DIV_ROUND_UP() macro.

Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/fweh.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
index 9ee5c51..14bc24d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
@@ -115,7 +115,7 @@ enum brcmf_fweh_event_code {
 };
 #undef BRCMF_ENUM_DEF
 
-#define BRCMF_EVENTING_MASK_LEN		(roundup(BRCMF_E_LAST, 8)/8)
+#define BRCMF_EVENTING_MASK_LEN		DIV_ROUND_UP(BRCMF_E_LAST, 8)
 
 /* flags field values in struct brcmf_event_msg */
 #define BRCMF_EVENT_MSG_LINK		0x01
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 2/7] brcmfmac: add BCM4339 SDIO interface support
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Franky Lin, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

From: Franky Lin <frankyl@broadcom.com>

BCM4339 is an a/b/g/n/ac 1x1 WiFi chip. This patch adds support for it through
SDIO interface.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 .../net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c   |   11 +++--------
 drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c  |   18 ++++++++++++++++++
 drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h  |    8 ++++++++
 drivers/net/wireless/brcm80211/include/brcm_hw_ids.h |    1 +
 4 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index 64f4a2b..f849d73 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -34,6 +34,7 @@
 #include <brcmu_utils.h>
 #include <brcmu_wifi.h>
 #include "sdio_host.h"
+#include "sdio_chip.h"
 #include "dhd_dbg.h"
 #include "dhd_bus.h"
 
@@ -41,13 +42,6 @@
 
 #define DMA_ALIGN_MASK	0x03
 
-#define SDIO_DEVICE_ID_BROADCOM_43143	43143
-#define SDIO_DEVICE_ID_BROADCOM_43241	0x4324
-#define SDIO_DEVICE_ID_BROADCOM_4329	0x4329
-#define SDIO_DEVICE_ID_BROADCOM_4330	0x4330
-#define SDIO_DEVICE_ID_BROADCOM_4334	0x4334
-#define SDIO_DEVICE_ID_BROADCOM_4335	0x4335
-
 #define SDIO_FUNC1_BLOCKSIZE		64
 #define SDIO_FUNC2_BLOCKSIZE		512
 
@@ -58,7 +52,8 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
 	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329)},
 	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330)},
 	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334)},
-	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4335)},
+	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM,
+		     SDIO_DEVICE_ID_BROADCOM_4335_4339)},
 	{ /* end: all zeroes */ },
 };
 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index ca72177..023ddcb 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -18,6 +18,7 @@
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/mmc/card.h>
+#include <linux/mmc/sdio_func.h>
 #include <linux/ssb/ssb_regs.h>
 #include <linux/bcma/bcma.h>
 
@@ -444,6 +445,9 @@ static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev,
 				   NULL);
 	ci->chip = regdata & CID_ID_MASK;
 	ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT;
+	if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 &&
+	    ci->chiprev >= 2)
+		ci->chip = BCM4339_CHIP_ID;
 	ci->socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT;
 
 	brcmf_dbg(INFO, "chipid=0x%x chiprev=%d\n", ci->chip, ci->chiprev);
@@ -541,6 +545,20 @@ static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev,
 		ci->ramsize = 0xc0000;
 		ci->rambase = 0x180000;
 		break;
+	case BCM4339_CHIP_ID:
+		ci->c_inf[0].wrapbase = 0x18100000;
+		ci->c_inf[0].cib = 0x2e084411;
+		ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
+		ci->c_inf[1].base = 0x18005000;
+		ci->c_inf[1].wrapbase = 0x18105000;
+		ci->c_inf[1].cib = 0x15004211;
+		ci->c_inf[2].id = BCMA_CORE_ARM_CR4;
+		ci->c_inf[2].base = 0x18002000;
+		ci->c_inf[2].wrapbase = 0x18102000;
+		ci->c_inf[2].cib = 0x04084411;
+		ci->ramsize = 0xc0000;
+		ci->rambase = 0x180000;
+		break;
 	default:
 		brcmf_err("chipid 0x%x is not supported\n", ci->chip);
 		return -ENODEV;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
index 83c041f..076b83c 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
@@ -54,6 +54,14 @@
 
 #define BRCMF_MAX_CORENUM	6
 
+/* SDIO device ID */
+#define SDIO_DEVICE_ID_BROADCOM_43143		43143
+#define SDIO_DEVICE_ID_BROADCOM_43241		0x4324
+#define SDIO_DEVICE_ID_BROADCOM_4329		0x4329
+#define SDIO_DEVICE_ID_BROADCOM_4330		0x4330
+#define SDIO_DEVICE_ID_BROADCOM_4334		0x4334
+#define SDIO_DEVICE_ID_BROADCOM_4335_4339	0x4335
+
 struct chip_core_info {
 	u16 id;
 	u16 rev;
diff --git a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
index c1fe245..84113ea 100644
--- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
@@ -41,5 +41,6 @@
 #define BCM4331_CHIP_ID		0x4331
 #define BCM4334_CHIP_ID		0x4334
 #define BCM4335_CHIP_ID		0x4335
+#define BCM4339_CHIP_ID		0x4339
 
 #endif				/* _BRCM_HW_IDS_H_ */
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 3/7] brcmfmac: add valid core index check in related functions
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Franky Lin, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

From: Franky Lin <frankyl@broadcom.com>

Perform a valid check for core index to avoid illegal address access.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index 023ddcb..2096a14 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -137,6 +137,8 @@ brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev,
 	u8 idx;
 
 	idx = brcmf_sdio_chip_getinfidx(ci, coreid);
+	if (idx == BRCMF_MAX_CORENUM)
+		return false;
 
 	regdata = brcmf_sdio_regrl(sdiodev,
 				   CORE_SB(ci->c_inf[idx].base, sbtmstatelow),
@@ -155,6 +157,8 @@ brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev,
 	bool ret;
 
 	idx = brcmf_sdio_chip_getinfidx(ci, coreid);
+	if (idx == BRCMF_MAX_CORENUM)
+		return false;
 
 	regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL,
 				   NULL);
@@ -262,6 +266,8 @@ brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev,
 	u32 regdata;
 
 	idx = brcmf_sdio_chip_getinfidx(ci, coreid);
+	if (idx == BRCMF_MAX_CORENUM)
+		return;
 
 	/* if core is already in reset, just return */
 	regdata = brcmf_sdio_regrl(sdiodev,
@@ -305,6 +311,8 @@ brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev,
 	u8 idx;
 
 	idx = brcmf_sdio_chip_getinfidx(ci, coreid);
+	if (idx == BRCMF_MAX_CORENUM)
+		return;
 
 	/*
 	 * Must do the disable sequence first to work for
@@ -369,6 +377,8 @@ brcmf_sdio_ai_resetcore(struct brcmf_sdio_dev *sdiodev,
 	u32 regdata;
 
 	idx = brcmf_sdio_chip_getinfidx(ci, coreid);
+	if (idx == BRCMF_MAX_CORENUM)
+		return;
 
 	/* must disable first to work for arbitrary current core state */
 	brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits);
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 7/7] brcmfmac: rework rx path bus interface
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

The brcmfmac has common and bus specific part. The rx function api
was using sk_buff_head. Changed to sk_buff instead.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h  |    2 +-
 .../net/wireless/brcm80211/brcmfmac/dhd_linux.c    |   38 +++++++++-----------
 drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c |   12 +++----
 drivers/net/wireless/brcm80211/brcmfmac/usb.c      |    5 +--
 4 files changed, 22 insertions(+), 35 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index f7c1985..200ee9b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -136,7 +136,7 @@ extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
 			 struct sk_buff *pkt, int prec);
 
 /* Receive frame for delivery to OS.  Callee disposes of rxp. */
-extern void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist);
+extern void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp);
 
 /* Indication from bus module regarding presence/insertion of dongle. */
 extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index e067aec..42bf19a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -509,9 +509,8 @@ netif_rx:
 	}
 }
 
-void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb)
 {
-	struct sk_buff *skb, *pnext;
 	struct brcmf_if *ifp;
 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
 	struct brcmf_pub *drvr = bus_if->drvr;
@@ -519,29 +518,24 @@ void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
 	u8 ifidx;
 	int ret;
 
-	brcmf_dbg(DATA, "Enter: %s: count=%u\n", dev_name(dev),
-		  skb_queue_len(skb_list));
+	brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb);
 
-	skb_queue_walk_safe(skb_list, skb, pnext) {
-		skb_unlink(skb, skb_list);
-
-		/* process and remove protocol-specific header */
-		ret = brcmf_proto_hdrpull(drvr, true, &ifidx, skb);
-		ifp = drvr->iflist[ifidx];
-
-		if (ret || !ifp || !ifp->ndev) {
-			if ((ret != -ENODATA) && ifp)
-				ifp->stats.rx_errors++;
-			brcmu_pkt_buf_free_skb(skb);
-			continue;
-		}
+	/* process and remove protocol-specific header */
+	ret = brcmf_proto_hdrpull(drvr, true, &ifidx, skb);
+	ifp = drvr->iflist[ifidx];
 
-		rd = (struct brcmf_skb_reorder_data *)skb->cb;
-		if (rd->reorder)
-			brcmf_rxreorder_process_info(ifp, rd->reorder, skb);
-		else
-			brcmf_netif_rx(ifp, skb);
+	if (ret || !ifp || !ifp->ndev) {
+		if ((ret != -ENODATA) && ifp)
+			ifp->stats.rx_errors++;
+		brcmu_pkt_buf_free_skb(skb);
+		return;
 	}
+
+	rd = (struct brcmf_skb_reorder_data *)skb->cb;
+	if (rd->reorder)
+		brcmf_rxreorder_process_info(ifp, rd->reorder, skb);
+	else
+		brcmf_netif_rx(ifp, skb);
 }
 
 void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 6e72b73..67f05db 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -1492,13 +1492,12 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
 					   bus->glom.qlen, pfirst, pfirst->data,
 					   pfirst->len, pfirst->next,
 					   pfirst->prev);
+			skb_unlink(pfirst, &bus->glom);
+			brcmf_rx_frame(bus->sdiodev->dev, pfirst);
+			bus->sdcnt.rxglompkts++;
 		}
-		/* sent any remaining packets up */
-		if (bus->glom.qlen)
-			brcmf_rx_frames(bus->sdiodev->dev, &bus->glom);
 
 		bus->sdcnt.rxglomframes++;
-		bus->sdcnt.rxglompkts += bus->glom.qlen;
 	}
 	return num;
 }
@@ -1643,7 +1642,6 @@ static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen)
 static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
 {
 	struct sk_buff *pkt;		/* Packet for event or data frames */
-	struct sk_buff_head pktlist;	/* needed for bus interface */
 	u16 pad;		/* Number of pad bytes to read */
 	uint rxleft = 0;	/* Remaining number of frames allowed */
 	int ret;		/* Return code from calls */
@@ -1845,9 +1843,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
 			continue;
 		}
 
-		skb_queue_head_init(&pktlist);
-		skb_queue_tail(&pktlist, pkt);
-		brcmf_rx_frames(bus->sdiodev->dev, &pktlist);
+		brcmf_rx_frame(bus->sdiodev->dev, pkt);
 	}
 
 	rxcount = maxframes - rxleft;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index 39e01a7..bf6758d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -435,7 +435,6 @@ static void brcmf_usb_rx_complete(struct urb *urb)
 	struct brcmf_usbreq  *req = (struct brcmf_usbreq *)urb->context;
 	struct brcmf_usbdev_info *devinfo = req->devinfo;
 	struct sk_buff *skb;
-	struct sk_buff_head skbq;
 
 	brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status);
 	brcmf_usb_del_fromq(devinfo, req);
@@ -450,10 +449,8 @@ static void brcmf_usb_rx_complete(struct urb *urb)
 	}
 
 	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
-		skb_queue_head_init(&skbq);
-		skb_queue_tail(&skbq, skb);
 		skb_put(skb, urb->actual_length);
-		brcmf_rx_frames(devinfo->dev, &skbq);
+		brcmf_rx_frame(devinfo->dev, skb);
 		brcmf_usb_rx_refill(devinfo, req);
 	} else {
 		brcmu_pkt_buf_free_skb(skb);
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 0/7] brcmfmac: cleanup and new device support
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Arend van Spriel

This series has a few cleanup patches fixing a sparse error, cleaning
up the rx path and also changing the firmware filename approach after
getting feedback on this by Stephen Warren. The remaining patches are
adding support for the BCM4339 SDIO chipset.

This series is intended for v3.13 kernel and applies to the master
branch of the wireless-next repository.

Arend van Spriel (2):
  brcmfmac: fix sparse error 'bad constant expression'
  brcmfmac: rework rx path bus interface

Franky Lin (4):
  brcmfmac: sync firmware event list
  brcmfmac: add BCM4339 SDIO interface support
  brcmfmac: add valid core index check in related functions
  brcmfmac: reserve memory for bus layer in sk_buff::cb

Hante Meuleman (1):
  brcmfmac: Use fw filename and nvram based of devid for sdio.

 .../net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c |   11 +-
 drivers/net/wireless/brcm80211/brcmfmac/dhd.h      |    2 -
 drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h  |    2 +-
 .../net/wireless/brcm80211/brcmfmac/dhd_linux.c    |   38 ++--
 drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c |  234 ++++++++++++--------
 drivers/net/wireless/brcm80211/brcmfmac/fweh.h     |    5 +-
 drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c |    2 +
 .../net/wireless/brcm80211/brcmfmac/sdio_chip.c    |   28 +++
 .../net/wireless/brcm80211/brcmfmac/sdio_chip.h    |    8 +
 drivers/net/wireless/brcm80211/brcmfmac/usb.c      |    5 +-
 .../net/wireless/brcm80211/include/brcm_hw_ids.h   |    1 +
 11 files changed, 211 insertions(+), 125 deletions(-)

-- 
1.7.10.4



^ permalink raw reply

* [PATCH 4/7] brcmfmac: reserve memory for bus layer in sk_buff::cb
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Franky Lin, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

From: Franky Lin <frankyl@broadcom.com>

Bus layer need to share sk_buff::cb with firmware signal feature. Reserve
necessary memory so they won't overwrite each other.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c |   15 ++++++++++-----
 drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c |    2 ++
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 1aa75d5..f9ba4d0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -1786,10 +1786,15 @@ brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus)
 	return;
 }
 
+/**
+ * struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
+ * bus layer usage.
+ */
 /* flag marking a dummy skb added for DMA alignment requirement */
-#define DUMMY_SKB_FLAG		0x10000
+#define ALIGN_SKB_FLAG		0x8000
 /* bit mask of data length chopped from the previous packet */
-#define DUMMY_SKB_CHOP_LEN_MASK	0xffff
+#define ALIGN_SKB_CHOP_LEN_MASK	0x7fff
+
 /**
  * brcmf_sdio_txpkt_prep - packet preparation for transmit
  * @bus: brcmf_sdio structure pointer
@@ -1854,7 +1859,7 @@ brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
 		memcpy(pkt_new->data,
 		       pkt_next->data + pkt_next->len - tail_chop,
 		       tail_chop);
-		*(u32 *)(pkt_new->cb) = DUMMY_SKB_FLAG + tail_chop;
+		*(u32 *)(pkt_new->cb) = ALIGN_SKB_FLAG + tail_chop;
 		skb_trim(pkt_next, pkt_next->len - tail_chop);
 		__skb_queue_after(pktq, pkt_next, pkt_new);
 	} else {
@@ -1908,8 +1913,8 @@ brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq)
 
 	skb_queue_walk_safe(pktq, pkt_next, tmp) {
 		dummy_flags = *(u32 *)(pkt_next->cb);
-		if (dummy_flags & DUMMY_SKB_FLAG) {
-			chop_len = dummy_flags & DUMMY_SKB_CHOP_LEN_MASK;
+		if (dummy_flags & ALIGN_SKB_FLAG) {
+			chop_len = dummy_flags & ALIGN_SKB_CHOP_LEN_MASK;
 			if (chop_len) {
 				pkt_prev = pkt_next->prev;
 				memcpy(pkt_prev->data + pkt_prev->len,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index 82f9140..d0cd0bf 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -168,6 +168,7 @@ enum brcmf_fws_skb_state {
 /**
  * struct brcmf_skbuff_cb - control buffer associated with skbuff.
  *
+ * @bus_flags: 2 bytes reserved for bus specific parameters
  * @if_flags: holds interface index and packet related flags.
  * @htod: host to device packet identifier (used in PKTTAG tlv).
  * @state: transmit state of the packet.
@@ -177,6 +178,7 @@ enum brcmf_fws_skb_state {
  * provides 48 bytes of storage so this structure should not exceed that.
  */
 struct brcmf_skbuff_cb {
+	u16 bus_flags;
 	u16 if_flags;
 	u32 htod;
 	enum brcmf_fws_skb_state state;
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 6/7] brcmfmac: Use fw filename and nvram based of devid for sdio.
From: Arend van Spriel @ 2013-09-25 11:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel
In-Reply-To: <1380107146-24026-1-git-send-email-arend@broadcom.com>

From: Hante Meuleman <meuleman@broadcom.com>

SDIO firmware download routines uses one name for firmware file
and nvram file for all sdio devices. This is not user friendly.
Use fw filename and nvram filename based upon chip id and revision.

Reported-by: Stephen Warren <swarren@wwwdotorg.org>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c |  207 +++++++++++++-------
 1 file changed, 133 insertions(+), 74 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index f9ba4d0..6e72b73 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -275,11 +275,6 @@ struct rte_console {
 /* Flags for SDH calls */
 #define F2SYNC	(SDIO_REQ_4BYTE | SDIO_REQ_FIXED)
 
-#define BRCMF_SDIO_FW_NAME	"brcm/brcmfmac-sdio.bin"
-#define BRCMF_SDIO_NV_NAME	"brcm/brcmfmac-sdio.txt"
-MODULE_FIRMWARE(BRCMF_SDIO_FW_NAME);
-MODULE_FIRMWARE(BRCMF_SDIO_NV_NAME);
-
 #define BRCMF_IDLE_IMMEDIATE	(-1)	/* Enter idle immediately */
 #define BRCMF_IDLE_ACTIVE	0	/* Do not request any SD clock change
 					 * when idle
@@ -454,9 +449,6 @@ struct brcmf_sdio {
 	struct work_struct datawork;
 	atomic_t dpc_tskcnt;
 
-	const struct firmware *firmware;
-	u32 fw_ptr;
-
 	bool txoff;		/* Transmit flow-controlled */
 	struct brcmf_sdio_count sdcnt;
 	bool sr_enabled; /* SaveRestore enabled */
@@ -493,6 +485,100 @@ enum brcmf_sdio_frmtype {
 	BRCMF_SDIO_FT_SUB,
 };
 
+#define BCM43143_FIRMWARE_NAME		"brcm/brcmfmac43143-sdio.bin"
+#define BCM43143_NVRAM_NAME		"brcm/brcmfmac43143-sdio.txt"
+#define BCM43241B0_FIRMWARE_NAME	"brcm/brcmfmac43241b0-sdio.bin"
+#define BCM43241B0_NVRAM_NAME		"brcm/brcmfmac43241b0-sdio.txt"
+#define BCM43241B4_FIRMWARE_NAME	"brcm/brcmfmac43241b4-sdio.bin"
+#define BCM43241B4_NVRAM_NAME		"brcm/brcmfmac43241b4-sdio.txt"
+#define BCM4329_FIRMWARE_NAME		"brcm/brcmfmac4329-sdio.bin"
+#define BCM4329_NVRAM_NAME		"brcm/brcmfmac4329-sdio.txt"
+#define BCM4330_FIRMWARE_NAME		"brcm/brcmfmac4330-sdio.bin"
+#define BCM4330_NVRAM_NAME		"brcm/brcmfmac4330-sdio.txt"
+#define BCM4334_FIRMWARE_NAME		"brcm/brcmfmac4334-sdio.bin"
+#define BCM4334_NVRAM_NAME		"brcm/brcmfmac4334-sdio.txt"
+#define BCM4335_FIRMWARE_NAME		"brcm/brcmfmac4335-sdio.bin"
+#define BCM4335_NVRAM_NAME		"brcm/brcmfmac4335-sdio.txt"
+
+MODULE_FIRMWARE(BCM43143_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM43143_NVRAM_NAME);
+MODULE_FIRMWARE(BCM43241B0_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM43241B0_NVRAM_NAME);
+MODULE_FIRMWARE(BCM43241B4_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM43241B4_NVRAM_NAME);
+MODULE_FIRMWARE(BCM4329_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM4329_NVRAM_NAME);
+MODULE_FIRMWARE(BCM4330_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM4330_NVRAM_NAME);
+MODULE_FIRMWARE(BCM4334_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
+MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
+MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
+
+struct brcmf_firmware_names {
+	u32 chipid;
+	u32 revmsk;
+	const char *bin;
+	const char *nv;
+};
+
+enum brcmf_firmware_type {
+	BRCMF_FIRMWARE_BIN,
+	BRCMF_FIRMWARE_NVRAM
+};
+
+#define BRCMF_FIRMWARE_NVRAM(name) \
+	name ## _FIRMWARE_NAME, name ## _NVRAM_NAME
+
+static const struct brcmf_firmware_names brcmf_fwname_data[] = {
+	{ BCM43143_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43143) },
+	{ BCM43241_CHIP_ID, 0x0000001F, BRCMF_FIRMWARE_NVRAM(BCM43241B0) },
+	{ BCM43241_CHIP_ID, 0xFFFFFFE0, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
+	{ BCM4329_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4329) },
+	{ BCM4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
+	{ BCM4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
+	{ BCM4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) }
+};
+
+
+static const struct firmware *brcmf_sdbrcm_get_fw(struct brcmf_sdio *bus,
+						  enum brcmf_firmware_type type)
+{
+	const struct firmware *fw;
+	const char *name;
+	int err, i;
+
+	for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) {
+		if (brcmf_fwname_data[i].chipid == bus->ci->chip &&
+		    brcmf_fwname_data[i].revmsk & BIT(bus->ci->chiprev)) {
+			switch (type) {
+			case BRCMF_FIRMWARE_BIN:
+				name = brcmf_fwname_data[i].bin;
+				break;
+			case BRCMF_FIRMWARE_NVRAM:
+				name = brcmf_fwname_data[i].nv;
+				break;
+			default:
+				brcmf_err("invalid firmware type (%d)\n", type);
+				return NULL;
+			}
+			goto found;
+		}
+	}
+	brcmf_err("Unknown chipid %d [%d]\n",
+		  bus->ci->chip, bus->ci->chiprev);
+	return NULL;
+
+found:
+	err = request_firmware(&fw, name, &bus->sdiodev->func[2]->dev);
+	if ((err) || (!fw)) {
+		brcmf_err("fail to request firmware %s (%d)\n", name, err);
+		return NULL;
+	}
+
+	return fw;
+}
+
 static void pkt_align(struct sk_buff *p, int len, int align)
 {
 	uint datalign;
@@ -3042,69 +3128,43 @@ static bool brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter)
 	return true;
 }
 
-static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_sdio *bus)
-{
-	if (bus->firmware->size < bus->fw_ptr + len)
-		len = bus->firmware->size - bus->fw_ptr;
-
-	memcpy(buf, &bus->firmware->data[bus->fw_ptr], len);
-	bus->fw_ptr += len;
-	return len;
-}
-
 static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus)
 {
+	const struct firmware *fw;
+	int err;
 	int offset;
-	uint len;
-	u8 *memblock = NULL, *memptr;
-	int ret;
-	u8 idx;
-
-	brcmf_dbg(INFO, "Enter\n");
-
-	ret = request_firmware(&bus->firmware, BRCMF_SDIO_FW_NAME,
-			       &bus->sdiodev->func[2]->dev);
-	if (ret) {
-		brcmf_err("Fail to request firmware %d\n", ret);
-		return ret;
-	}
-	bus->fw_ptr = 0;
-
-	memptr = memblock = kmalloc(MEMBLOCK + BRCMF_SDALIGN, GFP_ATOMIC);
-	if (memblock == NULL) {
-		ret = -ENOMEM;
-		goto err;
-	}
-	if ((u32)(unsigned long)memblock % BRCMF_SDALIGN)
-		memptr += (BRCMF_SDALIGN -
-			   ((u32)(unsigned long)memblock % BRCMF_SDALIGN));
-
-	offset = bus->ci->rambase;
-
-	/* Download image */
-	len = brcmf_sdbrcm_get_image((char *)memptr, MEMBLOCK, bus);
-	idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_ARM_CR4);
-	if (BRCMF_MAX_CORENUM != idx)
-		memcpy(&bus->ci->rst_vec, memptr, sizeof(bus->ci->rst_vec));
-	while (len) {
-		ret = brcmf_sdio_ramrw(bus->sdiodev, true, offset, memptr, len);
-		if (ret) {
+	int address;
+	int len;
+
+	fw = brcmf_sdbrcm_get_fw(bus, BRCMF_FIRMWARE_BIN);
+	if (fw == NULL)
+		return -ENOENT;
+
+	if (brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_ARM_CR4) !=
+	    BRCMF_MAX_CORENUM)
+		memcpy(&bus->ci->rst_vec, fw->data, sizeof(bus->ci->rst_vec));
+
+	err = 0;
+	offset = 0;
+	address = bus->ci->rambase;
+	while (offset < fw->size) {
+		len = ((offset + MEMBLOCK) < fw->size) ? MEMBLOCK :
+		      fw->size - offset;
+		err = brcmf_sdio_ramrw(bus->sdiodev, true, address,
+				       (u8 *)&fw->data[offset], len);
+		if (err) {
 			brcmf_err("error %d on writing %d membytes at 0x%08x\n",
-				  ret, MEMBLOCK, offset);
-			goto err;
+				  err, len, address);
+			goto failure;
 		}
-
-		offset += MEMBLOCK;
-		len = brcmf_sdbrcm_get_image((char *)memptr, MEMBLOCK, bus);
+		offset += len;
+		address += len;
 	}
 
-err:
-	kfree(memblock);
-
-	release_firmware(bus->firmware);
-	bus->fw_ptr = 0;
+failure:
+	release_firmware(fw);
 
-	return ret;
+	return err;
 }
 
 /*
@@ -3116,7 +3176,8 @@ err:
  * by two NULs.
 */
 
-static int brcmf_process_nvram_vars(struct brcmf_sdio *bus)
+static int brcmf_process_nvram_vars(struct brcmf_sdio *bus,
+				    const struct firmware *nv)
 {
 	char *varbuf;
 	char *dp;
@@ -3125,12 +3186,12 @@ static int brcmf_process_nvram_vars(struct brcmf_sdio *bus)
 	int ret = 0;
 	uint buf_len, n, len;
 
-	len = bus->firmware->size;
+	len = nv->size;
 	varbuf = vmalloc(len);
 	if (!varbuf)
 		return -ENOMEM;
 
-	memcpy(varbuf, bus->firmware->data, len);
+	memcpy(varbuf, nv->data, len);
 	dp = varbuf;
 
 	findNewline = false;
@@ -3182,18 +3243,16 @@ err:
 
 static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus)
 {
+	const struct firmware *nv;
 	int ret;
 
-	ret = request_firmware(&bus->firmware, BRCMF_SDIO_NV_NAME,
-			       &bus->sdiodev->func[2]->dev);
-	if (ret) {
-		brcmf_err("Fail to request nvram %d\n", ret);
-		return ret;
-	}
+	nv = brcmf_sdbrcm_get_fw(bus, BRCMF_FIRMWARE_NVRAM);
+	if (nv == NULL)
+		return -ENOENT;
 
-	ret = brcmf_process_nvram_vars(bus);
+	ret = brcmf_process_nvram_vars(bus, nv);
 
-	release_firmware(bus->firmware);
+	release_firmware(nv);
 
 	return ret;
 }
-- 
1.7.10.4



^ permalink raw reply related

* Re: [PATCH] ti-connectivity: add wl1251 firmware and license
From: Luca Coelho @ 2013-09-25 11:04 UTC (permalink / raw)
  To: Felipe Balbi; +Cc: ben, Linux Kernel Mailing List, linux-wireless, Pavel Machek
In-Reply-To: <1380033894-5007-1-git-send-email-balbi@ti.com>

Hi dude,

Great, this is cool! Finally! :)

A few comments...


On Tue, 2013-09-24 at 09:44 -0500, Felipe Balbi wrote:
> It's way overdue that we send these firmware
> blobs upstream. Thanks for everybody involved
> in getting this sorted out.
> 
> Cc: Luciano Coelho <luca@coelho.fi>
> Cc: Pavel Machek <pavel@denx.de>
> Signed-off-by: Felipe Balbi <balbi@ti.com>
> ---

The commit message could be a bit more descriptive rather than
narrative?


>  ti-connectivity/license-wl1251.txt |  59 +++++++++++++++++++++++++++++++++++++

The license file should be in the root, together with the other licenses
and called LICENCE.wl1251 (note the en-GB spelling).  Also, this license
is *very* similar to the one for WiLink6/7/8 (LICENCE.ti-connectivity),
except for some very minor things and the formatting.  Couldn't the same
one be used, for the sake of simplicity and consistency?


>  ti-connectivity/wl1251-fw.bin      | Bin 0 -> 194180 bytes
>  ti-connectivity/wl1251-nvs.bin     | Bin 0 -> 752 bytes
>  3 files changed, 59 insertions(+)
>  create mode 100644 ti-connectivity/license-wl1251.txt
>  create mode 100644 ti-connectivity/wl1251-fw.bin
>  create mode 100644 ti-connectivity/wl1251-nvs.bin

When sending big binary blobs, it's generally better to send pull
requests instead of patches.  If you add the -p option when calling git
pull-request, the text will include all the readable parts but will omit
the binary stuff.

Thank you very much for following up on this!

--
Cheers,
Luca.


^ permalink raw reply

* Re: [PATCH 08/13] ath10k: bring back the WMI path for mgmt frames
From: Michal Kazior @ 2013-09-25 10:46 UTC (permalink / raw)
  To: Bartosz Markowski; +Cc: ath10k, linux-wireless
In-Reply-To: <1380101891-18312-9-git-send-email-bartosz.markowski@tieto.com>

On 25 September 2013 11:38, Bartosz Markowski
<bartosz.markowski@tieto.com> wrote:
> @@ -1497,16 +1497,23 @@ static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
>                 goto exit;
>         }
>
> -       if (ieee80211_is_mgmt(hdr->frame_control))
> -               ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
> -       else if (ieee80211_is_nullfunc(hdr->frame_control))
> +       if (ieee80211_is_mgmt(hdr->frame_control)) {
> +               if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
> +                            ar->fw_features))
> +                       ret = ath10k_wmi_mgmt_tx(ar, skb);

Due to recent changes (WMI commands can block/sleep) this cannot be
so. ath10k_tx_htt() is called from an atomic context.

I'm seeing 2 aproaches here:
 a) management frame queue,
 b) use ieee80211_{stop,wake}_queues()

I'm worried (b) could degrade throughput. WMI endpoint has only 2 HTC
credits meaning management frame bursts will lock out data frame tx.


Michał.

^ permalink raw reply

* Re: [PATCH 12/13] ath10k: introduce dynamic pdev parameters
From: Michal Kazior @ 2013-09-25 10:39 UTC (permalink / raw)
  To: Bartosz Markowski; +Cc: ath10k, linux-wireless
In-Reply-To: <1380101891-18312-13-git-send-email-bartosz.markowski@tieto.com>

On 25 September 2013 11:38, Bartosz Markowski
<bartosz.markowski@tieto.com> wrote:
> +struct wmi_pdev_param_map {
> +       u32 wmi_pdev_param_tx_chain_mask;
> +       u32 wmi_pdev_param_rx_chain_mask;
> +       u32 wmi_pdev_param_txpower_limit2g;
> +       u32 wmi_pdev_param_txpower_limit5g;
> +       u32 wmi_pdev_param_txpower_scale;
> +       u32 wmi_pdev_param_beacon_gen_mode;
> +       u32 wmi_pdev_param_beacon_tx_mode;
> +       u32 wmi_pdev_param_resmgr_offchan_mode;
> +       u32 wmi_pdev_param_protection_mode;
> +       u32 wmi_pdev_param_dynamic_bw;
> +       u32 wmi_pdev_param_non_agg_sw_retry_th;
> +       u32 wmi_pdev_param_agg_sw_retry_th;
> +       u32 wmi_pdev_param_sta_kickout_th;
> +       u32 wmi_pdev_param_ac_aggrsize_scaling;
> +       u32 wmi_pdev_param_ltr_enable;
> +       u32 wmi_pdev_param_ltr_ac_latency_be;
> +       u32 wmi_pdev_param_ltr_ac_latency_bk;
> +       u32 wmi_pdev_param_ltr_ac_latency_vi;
> +       u32 wmi_pdev_param_ltr_ac_latency_vo;
> +       u32 wmi_pdev_param_ltr_ac_latency_timeout;
> +       u32 wmi_pdev_param_ltr_sleep_override;
> +       u32 wmi_pdev_param_ltr_rx_override;
> +       u32 wmi_pdev_param_ltr_tx_activity_timeout;
> +       u32 wmi_pdev_param_l1ss_enable;
> +       u32 wmi_pdev_param_dsleep_enable;
> +       u32 wmi_pdev_param_pcielp_txbuf_flush;
> +       u32 wmi_pdev_param_pcielp_txbuf_watermark;
> +       u32 wmi_pdev_param_pcielp_txbuf_tmo_en;
> +       u32 wmi_pdev_param_pcielp_txbuf_tmo_value;
> +       u32 wmi_pdev_param_pdev_stats_update_period;
> +       u32 wmi_pdev_param_vdev_stats_update_period;
> +       u32 wmi_pdev_param_peer_stats_update_period;
> +       u32 wmi_pdev_param_bcnflt_stats_update_period;
> +       u32 wmi_pdev_param_pmf_qos;
> +       u32 wmi_pdev_param_arp_ac_override;
> +       u32 wmi_pdev_param_arpdhcp_ac_override;
> +       u32 wmi_pdev_param_dcs;
> +       u32 wmi_pdev_param_ani_enable;
> +       u32 wmi_pdev_param_ani_poll_period;
> +       u32 wmi_pdev_param_ani_listen_period;
> +       u32 wmi_pdev_param_ani_ofdm_level;
> +       u32 wmi_pdev_param_ani_cck_level;
> +       u32 wmi_pdev_param_dyntxchain;
> +       u32 wmi_pdev_param_proxy_sta;
> +       u32 wmi_pdev_param_idle_ps_config;
> +       u32 wmi_pdev_param_power_gating_sleep;
> +       u32 wmi_pdev_param_fast_channel_reset;
> +       u32 wmi_pdev_param_burst_dur;
> +       u32 wmi_pdev_param_burst_enable;

Same as per vdev_param patch. I think there's no need for the
extraneous `wmi_pdev_param_`.


Michał.

^ permalink raw reply

* Re: [PATCH 11/13] ath10k: introduce dynamic vdev parameters
From: Michal Kazior @ 2013-09-25 10:38 UTC (permalink / raw)
  To: Bartosz Markowski; +Cc: ath10k, linux-wireless
In-Reply-To: <1380101891-18312-12-git-send-email-bartosz.markowski@tieto.com>

On 25 September 2013 11:38, Bartosz Markowski
<bartosz.markowski@tieto.com> wrote:
> +struct wmi_vdev_param_map {
> +       u32 wmi_vdev_param_rts_threshold;
> +       u32 wmi_vdev_param_fragmentation_threshold;
> +       u32 wmi_vdev_param_beacon_interval;
> +       u32 wmi_vdev_param_listen_interval;
> +       u32 wmi_vdev_param_multicast_rate;
> +       u32 wmi_vdev_param_mgmt_tx_rate;
> +       u32 wmi_vdev_param_slot_time;
> +       u32 wmi_vdev_param_preamble;
> +       u32 wmi_vdev_param_swba_time;
> +       u32 wmi_vdev_stats_update_period;
> +       u32 wmi_vdev_pwrsave_ageout_time;
> +       u32 wmi_vdev_host_swba_interval;
> +       u32 wmi_vdev_param_dtim_period;
> +       u32 wmi_vdev_oc_scheduler_air_time_limit;
> +       u32 wmi_vdev_param_wds;
> +       u32 wmi_vdev_param_atim_window;
> +       u32 wmi_vdev_param_bmiss_count_max;
> +       u32 wmi_vdev_param_bmiss_first_bcnt;
> +       u32 wmi_vdev_param_bmiss_final_bcnt;
> +       u32 wmi_vdev_param_feature_wmm;
> +       u32 wmi_vdev_param_chwidth;
> +       u32 wmi_vdev_param_chextoffset;
> +       u32 wmi_vdev_param_disable_htprotection;
> +       u32 wmi_vdev_param_sta_quickkickout;
> +       u32 wmi_vdev_param_mgmt_rate;
> +       u32 wmi_vdev_param_protection_mode;
> +       u32 wmi_vdev_param_fixed_rate;
> +       u32 wmi_vdev_param_sgi;
> +       u32 wmi_vdev_param_ldpc;
> +       u32 wmi_vdev_param_tx_stbc;
> +       u32 wmi_vdev_param_rx_stbc;
> +       u32 wmi_vdev_param_intra_bss_fwd;
> +       u32 wmi_vdev_param_def_keyid;
> +       u32 wmi_vdev_param_nss;
> +       u32 wmi_vdev_param_bcast_data_rate;
> +       u32 wmi_vdev_param_mcast_data_rate;
> +       u32 wmi_vdev_param_mcast_indicate;
> +       u32 wmi_vdev_param_dhcp_indicate;
> +       u32 wmi_vdev_param_unknown_dest_indicate;
> +       u32 wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs;
> +       u32 wmi_vdev_param_ap_keepalive_max_idle_inactive_time_secs;
> +       u32 wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs;
> +       u32 wmi_vdev_param_ap_enable_nawds;
> +       u32 wmi_vdev_param_mcast2ucast_set;
> +       u32 wmi_vdev_param_enable_rtscts;
> +       u32 wmi_vdev_param_txbf;
> +       u32 wmi_vdev_param_packet_powersave;
> +       u32 wmi_vdev_param_drop_unencry;
> +       u32 wmi_vdev_param_tx_encap_type;
> +       u32 wmi_vdev_param_ap_detect_out_of_sync_sleeping_sta_time_secs;

I don't think `wmi_vdev_param_` prefix is necessary here. Structure
already provides a prefix on it's own.


Michał.

^ permalink raw reply

* Re: [PATCH 01/13] ath10k: introduce dynamic WMI structures
From: Michal Kazior @ 2013-09-25 10:38 UTC (permalink / raw)
  To: Bartosz Markowski; +Cc: ath10k, linux-wireless
In-Reply-To: <1380101891-18312-2-git-send-email-bartosz.markowski@tieto.com>

On 25 September 2013 11:37, Bartosz Markowski
<bartosz.markowski@tieto.com> wrote:

> +struct wmi_cmd_map {
> +       u32 wmi_init_cmdid;
> +       u32 wmi_start_scan_cmdid;
> +       u32 wmi_stop_scan_cmdid;
> +       u32 wmi_scan_chan_list_cmdid;
> +       u32 wmi_scan_sch_prio_tbl_cmdid;
> +       u32 wmi_pdev_set_regdomain_cmdid;
> +       u32 wmi_pdev_set_channel_cmdid;
> +       u32 wmi_pdev_set_param_cmdid;
> +       u32 wmi_pdev_pktlog_enable_cmdid;
> +       u32 wmi_pdev_pktlog_disable_cmdid;
> +       u32 wmi_pdev_set_wmm_params_cmdid;
> +       u32 wmi_pdev_set_ht_cap_ie_cmdid;
> +       u32 wmi_pdev_set_vht_cap_ie_cmdid;
> +       u32 wmi_pdev_set_dscp_tid_map_cmdid;
> +       u32 wmi_pdev_set_quiet_mode_cmdid;
> +       u32 wmi_pdev_green_ap_ps_enable_cmdid;
> +       u32 wmi_pdev_get_tpc_config_cmdid;
> +       u32 wmi_pdev_set_base_macaddr_cmdid;
> +       u32 wmi_vdev_create_cmdid;
> +       u32 wmi_vdev_delete_cmdid;
> +       u32 wmi_vdev_start_request_cmdid;
> +       u32 wmi_vdev_restart_request_cmdid;
> +       u32 wmi_vdev_up_cmdid;
> +       u32 wmi_vdev_stop_cmdid;
> +       u32 wmi_vdev_down_cmdid;
> +       u32 wmi_vdev_set_param_cmdid;
> +       u32 wmi_vdev_install_key_cmdid;
> +       u32 wmi_peer_create_cmdid;
> +       u32 wmi_peer_delete_cmdid;
> +       u32 wmi_peer_flush_tids_cmdid;
> +       u32 wmi_peer_set_param_cmdid;
> +       u32 wmi_peer_assoc_cmdid;
> +       u32 wmi_peer_add_wds_entry_cmdid;
> +       u32 wmi_peer_remove_wds_entry_cmdid;
> +       u32 wmi_peer_mcast_group_cmdid;
> +       u32 wmi_bcn_tx_cmdid;
> +       u32 wmi_pdev_send_bcn_cmdid;
> +       u32 wmi_bcn_tmpl_cmdid;
> +       u32 wmi_bcn_filter_rx_cmdid;
> +       u32 wmi_prb_req_filter_rx_cmdid;
> +       u32 wmi_mgmt_tx_cmdid;
> +       u32 wmi_prb_tmpl_cmdid;
> +       u32 wmi_addba_clear_resp_cmdid;
> +       u32 wmi_addba_send_cmdid;
> +       u32 wmi_addba_status_cmdid;
> +       u32 wmi_delba_send_cmdid;
> +       u32 wmi_addba_set_resp_cmdid;
> +       u32 wmi_send_singleamsdu_cmdid;
> +       u32 wmi_sta_powersave_mode_cmdid;
> +       u32 wmi_sta_powersave_param_cmdid;
> +       u32 wmi_sta_mimo_ps_mode_cmdid;
> +       u32 wmi_pdev_dfs_enable_cmdid;
> +       u32 wmi_pdev_dfs_disable_cmdid;
> +       u32 wmi_roam_scan_mode;
> +       u32 wmi_roam_scan_rssi_threshold;
> +       u32 wmi_roam_scan_period;
> +       u32 wmi_roam_scan_rssi_change_threshold;
> +       u32 wmi_roam_ap_profile;
> +       u32 wmi_ofl_scan_add_ap_profile;
> +       u32 wmi_ofl_scan_remove_ap_profile;
> +       u32 wmi_ofl_scan_period;
> +       u32 wmi_p2p_dev_set_device_info;
> +       u32 wmi_p2p_dev_set_discoverability;
> +       u32 wmi_p2p_go_set_beacon_ie;
> +       u32 wmi_p2p_go_set_probe_resp_ie;
> +       u32 wmi_p2p_set_vendor_ie_data_cmdid;
> +       u32 wmi_ap_ps_peer_param_cmdid;
> +       u32 wmi_ap_ps_peer_uapsd_coex_cmdid;
> +       u32 wmi_peer_rate_retry_sched_cmdid;
> +       u32 wmi_wlan_profile_trigger_cmdid;
> +       u32 wmi_wlan_profile_set_hist_intvl_cmdid;
> +       u32 wmi_wlan_profile_get_profile_data_cmdid;
> +       u32 wmi_wlan_profile_enable_profile_id_cmdid;
> +       u32 wmi_wlan_profile_list_profile_id_cmdid;
> +       u32 wmi_pdev_suspend_cmdid;
> +       u32 wmi_pdev_resume_cmdid;
> +       u32 wmi_add_bcn_filter_cmdid;
> +       u32 wmi_rmv_bcn_filter_cmdid;
> +       u32 wmi_wow_add_wake_pattern_cmdid;
> +       u32 wmi_wow_del_wake_pattern_cmdid;
> +       u32 wmi_wow_enable_disable_wake_event_cmdid;
> +       u32 wmi_wow_enable_cmdid;
> +       u32 wmi_wow_hostwakeup_from_sleep_cmdid;
> +       u32 wmi_rtt_measreq_cmdid;
> +       u32 wmi_rtt_tsf_cmdid;
> +       u32 wmi_vdev_spectral_scan_configure_cmdid;
> +       u32 wmi_vdev_spectral_scan_enable_cmdid;
> +       u32 wmi_request_stats_cmdid;
> +       u32 wmi_set_arp_ns_offload_cmdid;
> +       u32 wmi_network_list_offload_config_cmdid;
> +       u32 wmi_gtk_offload_cmdid;
> +       u32 wmi_csa_offload_enable_cmdid;
> +       u32 wmi_csa_offload_chanswitch_cmdid;
> +       u32 wmi_chatter_set_mode_cmdid;
> +       u32 wmi_peer_tid_addba_cmdid;
> +       u32 wmi_peer_tid_delba_cmdid;
> +       u32 wmi_sta_dtim_ps_method_cmdid;
> +       u32 wmi_sta_uapsd_auto_trig_cmdid;
> +       u32 wmi_sta_keepalive_cmd;
> +       u32 wmi_echo_cmdid;
> +       u32 wmi_pdev_utf_cmdid;
> +       u32 wmi_dbglog_cfg_cmdid;
> +       u32 wmi_pdev_qvit_cmdid;
> +       u32 wmi_pdev_ftm_intg_cmdid;
> +       u32 wmi_vdev_set_keepalive_cmdid;
> +       u32 wmi_vdev_get_keepalive_cmdid;
> +       u32 wmi_force_fw_hang_cmdid;
> +       u32 wmi_gpio_config_cmdid;
> +       u32 wmi_gpio_output_cmdid;

I don't think the `wmi_` prefix is necessary here. Structure itself
already provides a prefix.


Michał.

^ permalink raw reply

* [PATCH for-3.12 1/3] brcmfmac: obtain platform data upon module initialization
From: Arend van Spriel @ 2013-09-25 10:11 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Arend van Spriel, stable
In-Reply-To: <1380103864-10447-1-git-send-email-arend@broadcom.com>

The driver uses platform_driver_probe() to obtain platform data
if any. However, that function is placed in the .init section so
it must be called upon driver module initialization.

The problem was reported by Fenguang Wu resulting in a kernel
oops because the .init section was already freed.

[   48.966342] Switched to clocksource tsc
[   48.970002] kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
[   48.970851] BUG: unable to handle kernel paging request at ffffffff82196446
[   48.970957] IP: [<ffffffff82196446>] classes_init+0x26/0x26
[   48.970957] PGD 1e76067 PUD 1e77063 PMD f388063 PTE 8000000002196163
[   48.970957] Oops: 0011 [#1]
[   48.970957] CPU: 0 PID: 17 Comm: kworker/0:1 Not tainted 3.11.0-rc7-00444-gc52dd7f #23
[   48.970957] Workqueue: events brcmf_driver_init
[   48.970957] task: ffff8800001d2000 ti: ffff8800001d4000 task.ti: ffff8800001d4000
[   48.970957] RIP: 0010:[<ffffffff82196446>]  [<ffffffff82196446>] classes_init+0x26/0x26
[   48.970957] RSP: 0000:ffff8800001d5d40  EFLAGS: 00000286
[   48.970957] RAX: 0000000000000001 RBX: ffffffff820c5620 RCX: 0000000000000000
[   48.970957] RDX: 0000000000000001 RSI: ffffffff816f7380 RDI: ffffffff820c56c0
[   48.970957] RBP: ffff8800001d5d50 R08: ffff8800001d2508 R09: 0000000000000002
[   48.970957] R10: 0000000000000000 R11: 0001f7ce298c5620 R12: ffff8800001c76b0
[   48.970957] R13: ffffffff81e91d40 R14: 0000000000000000 R15: ffff88000e0ce300
[   48.970957] FS:  0000000000000000(0000) GS:ffffffff81e84000(0000) knlGS:0000000000000000
[   48.970957] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[   48.970957] CR2: ffffffff82196446 CR3: 0000000001e75000 CR4: 00000000000006b0
[   48.970957] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   48.970957] DR3: 0000000000000000 DR6: 0000000000000000 DR7: 0000000000000000
[   48.970957] Stack:
[   48.970957]  ffffffff816f7df8 ffffffff820c5620 ffff8800001d5d60 ffffffff816eeec9
[   48.970957]  ffff8800001d5de0 ffffffff81073dc5 ffffffff81073d68 ffff8800001d5db8
[   48.970957]  0000000000000086 ffffffff820c5620 ffffffff824f7fd0 0000000000000000
[   48.970957] Call Trace:
[   48.970957]  [<ffffffff816f7df8>] ? brcmf_sdio_init+0x18/0x70
[   48.970957]  [<ffffffff816eeec9>] brcmf_driver_init+0x9/0x10
[   48.970957]  [<ffffffff81073dc5>] process_one_work+0x1d5/0x480
[   48.970957]  [<ffffffff81073d68>] ? process_one_work+0x178/0x480
[   48.970957]  [<ffffffff81074188>] worker_thread+0x118/0x3a0
[   48.970957]  [<ffffffff81074070>] ? process_one_work+0x480/0x480
[   48.970957]  [<ffffffff8107aa17>] kthread+0xe7/0xf0
[   48.970957]  [<ffffffff810829f7>] ? finish_task_switch.constprop.57+0x37/0xd0
[   48.970957]  [<ffffffff8107a930>] ? __kthread_parkme+0x80/0x80
[   48.970957]  [<ffffffff81a6923a>] ret_from_fork+0x7a/0xb0
[   48.970957]  [<ffffffff8107a930>] ? __kthread_parkme+0x80/0x80
[   48.970957] Code: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc <cc> cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
[   48.970957] RIP  [<ffffffff82196446>] classes_init+0x26/0x26
[   48.970957]  RSP <ffff8800001d5d40>
[   48.970957] CR2: ffffffff82196446
[   48.970957] ---[ end trace 62980817cd525f14 ]---

Cc: <stable@vger.kernel.org> # 3.10.x, 3.11.x
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Tested-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 .../net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c |   28 +++++++++-----------
 drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h  |    3 ++-
 .../net/wireless/brcm80211/brcmfmac/dhd_linux.c    |   14 +++++-----
 drivers/net/wireless/brcm80211/brcmfmac/usb.c      |    2 +-
 4 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index 64f4a2b..c3462b7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -464,8 +464,6 @@ static struct sdio_driver brcmf_sdmmc_driver = {
 
 static int brcmf_sdio_pd_probe(struct platform_device *pdev)
 {
-	int ret;
-
 	brcmf_dbg(SDIO, "Enter\n");
 
 	brcmfmac_sdio_pdata = pdev->dev.platform_data;
@@ -473,11 +471,7 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev)
 	if (brcmfmac_sdio_pdata->power_on)
 		brcmfmac_sdio_pdata->power_on();
 
-	ret = sdio_register_driver(&brcmf_sdmmc_driver);
-	if (ret)
-		brcmf_err("sdio_register_driver failed: %d\n", ret);
-
-	return ret;
+	return 0;
 }
 
 static int brcmf_sdio_pd_remove(struct platform_device *pdev)
@@ -500,6 +494,15 @@ static struct platform_driver brcmf_sdio_pd = {
 	}
 };
 
+void brcmf_sdio_register(void)
+{
+	int ret;
+
+	ret = sdio_register_driver(&brcmf_sdmmc_driver);
+	if (ret)
+		brcmf_err("sdio_register_driver failed: %d\n", ret);
+}
+
 void brcmf_sdio_exit(void)
 {
 	brcmf_dbg(SDIO, "Enter\n");
@@ -510,18 +513,13 @@ void brcmf_sdio_exit(void)
 		sdio_unregister_driver(&brcmf_sdmmc_driver);
 }
 
-void brcmf_sdio_init(void)
+void __init brcmf_sdio_init(void)
 {
 	int ret;
 
 	brcmf_dbg(SDIO, "Enter\n");
 
 	ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe);
-	if (ret == -ENODEV) {
-		brcmf_dbg(SDIO, "No platform data available, registering without.\n");
-		ret = sdio_register_driver(&brcmf_sdmmc_driver);
-	}
-
-	if (ret)
-		brcmf_err("driver registration failed: %d\n", ret);
+	if (ret == -ENODEV)
+		brcmf_dbg(SDIO, "No platform data available.\n");
 }
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index f7c1985..74156f8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -156,10 +156,11 @@ extern int brcmf_bus_start(struct device *dev);
 #ifdef CONFIG_BRCMFMAC_SDIO
 extern void brcmf_sdio_exit(void);
 extern void brcmf_sdio_init(void);
+extern void brcmf_sdio_register(void);
 #endif
 #ifdef CONFIG_BRCMFMAC_USB
 extern void brcmf_usb_exit(void);
-extern void brcmf_usb_init(void);
+extern void brcmf_usb_register(void);
 #endif
 
 #endif				/* _BRCMF_BUS_H_ */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index e067aec..40e7f85 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -1231,21 +1231,23 @@ u32 brcmf_get_chip_info(struct brcmf_if *ifp)
 	return bus->chip << 4 | bus->chiprev;
 }
 
-static void brcmf_driver_init(struct work_struct *work)
+static void brcmf_driver_register(struct work_struct *work)
 {
-	brcmf_debugfs_init();
-
 #ifdef CONFIG_BRCMFMAC_SDIO
-	brcmf_sdio_init();
+	brcmf_sdio_register();
 #endif
 #ifdef CONFIG_BRCMFMAC_USB
-	brcmf_usb_init();
+	brcmf_usb_register();
 #endif
 }
-static DECLARE_WORK(brcmf_driver_work, brcmf_driver_init);
+static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register);
 
 static int __init brcmfmac_module_init(void)
 {
+	brcmf_debugfs_init();
+#ifdef CONFIG_BRCMFMAC_SDIO
+	brcmf_sdio_init();
+#endif
 	if (!schedule_work(&brcmf_driver_work))
 		return -EBUSY;
 
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index 39e01a7..f4aea47 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -1539,7 +1539,7 @@ void brcmf_usb_exit(void)
 	brcmf_release_fw(&fw_image_list);
 }
 
-void brcmf_usb_init(void)
+void brcmf_usb_register(void)
 {
 	brcmf_dbg(USB, "Enter\n");
 	INIT_LIST_HEAD(&fw_image_list);
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH for-3.12 3/3] brcmsmac: call bcma_core_pci_power_save() from non-atomic context
From: Arend van Spriel @ 2013-09-25 10:11 UTC (permalink / raw)
  To: John W. Linville
  Cc: linux-wireless, Arend van Spriel, stable, Tod Jackson,
	Joe Perches, Rafal Milecki, Hauke Mehrtens
In-Reply-To: <1380103864-10447-1-git-send-email-arend@broadcom.com>

This patch adds explicit call to bcma_core_pci_power_save() from
a non-atomic context resolving 'scheduling while atomic' issue.

[   13.224317] BUG: scheduling while atomic: dhcpcd/1800/0x00000202
[   13.224322] Modules linked in: brcmsmac nouveau coretemp kvm_intel kvm cordic brcmutil bcma dell_wmi atl1c ttm mxm_wmi wmi
[   13.224354] CPU: 0 PID: 1800 Comm: dhcpcd Tainted: G        W    3.11.0-wl #1
[   13.224359] Hardware name: Alienware M11x R2/M11x R2, BIOS A04 11/23/2010
[   13.224363]  ffff880177c12c40 ffff880170fd1968 ffffffff8169af5b 0000000000000007
[   13.224374]  ffff880170fd1ad0 ffff880170fd1978 ffffffff81697ee2 ffff880170fd19f8
[   13.224383]  ffffffff816a19f5 00000000000f4240 000000000000d080 ffff880170fd1fd8
[   13.224391] Call Trace:
[   13.224399]  [<ffffffff8169af5b>] dump_stack+0x4f/0x84
[   13.224403]  [<ffffffff81697ee2>] __schedule_bug+0x43/0x51
[   13.224409]  [<ffffffff816a19f5>] __schedule+0x6e5/0x810
[   13.224412]  [<ffffffff816a1c34>] schedule+0x24/0x70
[   13.224416]  [<ffffffff816a04fc>] schedule_hrtimeout_range_clock+0x10c/0x150
[   13.224420]  [<ffffffff810684e0>] ? update_rmtp+0x60/0x60
[   13.224424]  [<ffffffff8106915f>] ? hrtimer_start_range_ns+0xf/0x20
[   13.224429]  [<ffffffff816a054e>] schedule_hrtimeout_range+0xe/0x10
[   13.224432]  [<ffffffff8104f6fb>] usleep_range+0x3b/0x40
[   13.224437]  [<ffffffffa003733a>] bcma_pcie_mdio_read.isra.5+0x8a/0x100 [bcma]
[   13.224442]  [<ffffffffa00374a5>] bcma_pcie_mdio_writeread.isra.6.constprop.13+0x25/0x30 [bcma]
[   13.224448]  [<ffffffffa00374f9>] bcma_core_pci_power_save+0x49/0x80 [bcma]
[   13.224452]  [<ffffffffa003765d>] bcma_core_pci_up+0x2d/0x60 [bcma]
[   13.224460]  [<ffffffffa03dc17c>] brcms_c_up+0xfc/0x430 [brcmsmac]
[   13.224467]  [<ffffffffa03d1a7d>] brcms_up+0x1d/0x20 [brcmsmac]
[   13.224473]  [<ffffffffa03d2498>] brcms_ops_start+0x298/0x340 [brcmsmac]
[   13.224478]  [<ffffffff81600a12>] ? cfg80211_netdev_notifier_call+0xd2/0x5f0
[   13.224483]  [<ffffffff815fa53d>] ? packet_notifier+0xad/0x1d0
[   13.224487]  [<ffffffff81656e75>] ieee80211_do_open+0x325/0xf80
[   13.224491]  [<ffffffff8106ac09>] ? __raw_notifier_call_chain+0x9/0x10
[   13.224495]  [<ffffffff81657b41>] ieee80211_open+0x71/0x80
[   13.224498]  [<ffffffff81526267>] __dev_open+0x87/0xe0
[   13.224502]  [<ffffffff8152650c>] __dev_change_flags+0x9c/0x180
[   13.224505]  [<ffffffff815266a3>] dev_change_flags+0x23/0x70
[   13.224509]  [<ffffffff8158cd68>] devinet_ioctl+0x5b8/0x6a0
[   13.224512]  [<ffffffff8158d5c5>] inet_ioctl+0x75/0x90
[   13.224516]  [<ffffffff8150b38b>] sock_do_ioctl+0x2b/0x70
[   13.224519]  [<ffffffff8150b681>] sock_ioctl+0x71/0x2a0
[   13.224523]  [<ffffffff8114ed47>] do_vfs_ioctl+0x87/0x520
[   13.224528]  [<ffffffff8113f159>] ? ____fput+0x9/0x10
[   13.224533]  [<ffffffff8106228c>] ? task_work_run+0x9c/0xd0
[   13.224537]  [<ffffffff8114f271>] SyS_ioctl+0x91/0xb0
[   13.224541]  [<ffffffff816aa252>] system_call_fastpath+0x16/0x1b

Cc: <stable@vger.kernel.org> # 3.11.x
Cc: Tod Jackson <tod.jackson@gmail.com>
Cc: Joe Perches <joe@perches.com>
Cc: Rafal Milecki <zajec5@gmail.com>
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index 3a65447..edc5d10 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -457,6 +457,8 @@ static int brcms_ops_start(struct ieee80211_hw *hw)
 	if (err != 0)
 		brcms_err(wl->wlc->hw->d11core, "%s: brcms_up() returned %d\n",
 			  __func__, err);
+
+	bcma_core_pci_power_save(wl->wlc->hw->d11core->bus, true);
 	return err;
 }
 
@@ -479,6 +481,8 @@ static void brcms_ops_stop(struct ieee80211_hw *hw)
 		return;
 	}
 
+	bcma_core_pci_power_save(wl->wlc->hw->d11core->bus, false);
+
 	/* put driver in down state */
 	spin_lock_bh(&wl->lock);
 	brcms_down(wl);
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH for-3.12 0/3] brcm80211: fixes for reported issues
From: Arend van Spriel @ 2013-09-25 10:11 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Arend van Spriel

This series contains a couple of fixes that have been reported by
users/developers.

This series is intended for v3.12 and applies to the master branch
of the wireless repository.

Regards,
Arend

Arend van Spriel (3):
  brcmfmac: obtain platform data upon module initialization
  bcma: make bcma_core_pci_{up,down}() callable from atomic context
  brcmsmac: call bcma_core_pci_power_save() from non-atomic context

 drivers/bcma/driver_pci.c                          |   49 +++++++++++---------
 .../net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c |   28 ++++++-----
 drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h  |    3 +-
 .../net/wireless/brcm80211/brcmfmac/dhd_linux.c    |   14 +++---
 drivers/net/wireless/brcm80211/brcmfmac/usb.c      |    2 +-
 .../net/wireless/brcm80211/brcmsmac/mac80211_if.c  |    4 ++
 include/linux/bcma/bcma_driver_pci.h               |    1 +
 7 files changed, 55 insertions(+), 46 deletions(-)

-- 
1.7.10.4



^ permalink raw reply

* [PATCH for-3.12 2/3] bcma: make bcma_core_pci_{up,down}() callable from atomic context
From: Arend van Spriel @ 2013-09-25 10:11 UTC (permalink / raw)
  To: John W. Linville
  Cc: linux-wireless, Arend van Spriel, stable, Tod Jackson,
	Joe Perches, Rafal Milecki, Hauke Mehrtens
In-Reply-To: <1380103864-10447-1-git-send-email-arend@broadcom.com>

This patch removes the bcma_core_pci_power_save() call from
the bcma_core_pci_{up,down}() functions as it tries to schedule
thus requiring to call them from non-atomic context. The function
bcma_core_pci_power_save() is now exported so the calling module
can explicitly use it in non-atomic context. This fixes the
'scheduling while atomic' issue reported by Tod Jackson and
Joe Perches.

[   13.210710] BUG: scheduling while atomic: dhcpcd/1800/0x00000202
[   13.210718] Modules linked in: brcmsmac nouveau coretemp kvm_intel kvm cordic brcmutil bcma dell_wmi atl1c ttm mxm_wmi wmi
[   13.210756] CPU: 2 PID: 1800 Comm: dhcpcd Not tainted 3.11.0-wl #1
[   13.210762] Hardware name: Alienware M11x R2/M11x R2, BIOS A04 11/23/2010
[   13.210767]  ffff880177c92c40 ffff880170fd1948 ffffffff8169af5b 0000000000000007
[   13.210777]  ffff880170fd1ab0 ffff880170fd1958 ffffffff81697ee2 ffff880170fd19d8
[   13.210785]  ffffffff816a19f5 00000000000f4240 000000000000d080 ffff880170fd1fd8
[   13.210794] Call Trace:
[   13.210813]  [<ffffffff8169af5b>] dump_stack+0x4f/0x84
[   13.210826]  [<ffffffff81697ee2>] __schedule_bug+0x43/0x51
[   13.210837]  [<ffffffff816a19f5>] __schedule+0x6e5/0x810
[   13.210845]  [<ffffffff816a1c34>] schedule+0x24/0x70
[   13.210855]  [<ffffffff816a04fc>] schedule_hrtimeout_range_clock+0x10c/0x150
[   13.210867]  [<ffffffff810684e0>] ? update_rmtp+0x60/0x60
[   13.210877]  [<ffffffff8106915f>] ? hrtimer_start_range_ns+0xf/0x20
[   13.210887]  [<ffffffff816a054e>] schedule_hrtimeout_range+0xe/0x10
[   13.210897]  [<ffffffff8104f6fb>] usleep_range+0x3b/0x40
[   13.210910]  [<ffffffffa00371af>] bcma_pcie_mdio_set_phy.isra.3+0x4f/0x80 [bcma]
[   13.210921]  [<ffffffffa003729f>] bcma_pcie_mdio_write.isra.4+0xbf/0xd0 [bcma]
[   13.210932]  [<ffffffffa0037498>] bcma_pcie_mdio_writeread.isra.6.constprop.13+0x18/0x30 [bcma]
[   13.210942]  [<ffffffffa00374ee>] bcma_core_pci_power_save+0x3e/0x80 [bcma]
[   13.210953]  [<ffffffffa003765d>] bcma_core_pci_up+0x2d/0x60 [bcma]
[   13.210975]  [<ffffffffa03dc17c>] brcms_c_up+0xfc/0x430 [brcmsmac]
[   13.210989]  [<ffffffffa03d1a7d>] brcms_up+0x1d/0x20 [brcmsmac]
[   13.211003]  [<ffffffffa03d2498>] brcms_ops_start+0x298/0x340 [brcmsmac]
[   13.211020]  [<ffffffff81600a12>] ? cfg80211_netdev_notifier_call+0xd2/0x5f0
[   13.211030]  [<ffffffff815fa53d>] ? packet_notifier+0xad/0x1d0
[   13.211064]  [<ffffffff81656e75>] ieee80211_do_open+0x325/0xf80
[   13.211076]  [<ffffffff8106ac09>] ? __raw_notifier_call_chain+0x9/0x10
[   13.211086]  [<ffffffff81657b41>] ieee80211_open+0x71/0x80
[   13.211101]  [<ffffffff81526267>] __dev_open+0x87/0xe0
[   13.211109]  [<ffffffff8152650c>] __dev_change_flags+0x9c/0x180
[   13.211117]  [<ffffffff815266a3>] dev_change_flags+0x23/0x70
[   13.211127]  [<ffffffff8158cd68>] devinet_ioctl+0x5b8/0x6a0
[   13.211136]  [<ffffffff8158d5c5>] inet_ioctl+0x75/0x90
[   13.211147]  [<ffffffff8150b38b>] sock_do_ioctl+0x2b/0x70
[   13.211155]  [<ffffffff8150b681>] sock_ioctl+0x71/0x2a0
[   13.211169]  [<ffffffff8114ed47>] do_vfs_ioctl+0x87/0x520
[   13.211180]  [<ffffffff8113f159>] ? ____fput+0x9/0x10
[   13.211198]  [<ffffffff8106228c>] ? task_work_run+0x9c/0xd0
[   13.211202]  [<ffffffff8114f271>] SyS_ioctl+0x91/0xb0
[   13.211208]  [<ffffffff816aa252>] system_call_fastpath+0x16/0x1b
[   13.211217] NOHZ: local_softirq_pending 202

The issue was introduced in v3.11 kernel by following commit:

commit aa51e598d04c6acf5477934cd6383f5a17ce9029
Author: Hauke Mehrtens <hauke@hauke-m.de>
Date:   Sat Aug 24 00:32:31 2013 +0200

    brcmsmac: use bcma PCIe up and down functions

    replace the calls to bcma_core_pci_extend_L1timer() by calls to the
    newly introduced bcma_core_pci_ip() and bcma_core_pci_down()

    Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
    Cc: Arend van Spriel <arend@broadcom.com>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>

This fix has been discussed with Hauke Mehrtens [1] selection
option 3) and is intended for v3.12.

Ref:
[1] http://mid.gmane.org/5239B12D.3040206@hauke-m.de

Cc: <stable@vger.kernel.org> # 3.11.x
Cc: Tod Jackson <tod.jackson@gmail.com>
Cc: Joe Perches <joe@perches.com>
Cc: Rafal Milecki <zajec5@gmail.com>
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/bcma/driver_pci.c            |   49 ++++++++++++++++++----------------
 include/linux/bcma/bcma_driver_pci.h |    1 +
 2 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index c9fd694..50329d1 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -210,25 +210,6 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc)
 	}
 }
 
-static void bcma_core_pci_power_save(struct bcma_drv_pci *pc, bool up)
-{
-	u16 data;
-
-	if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
-		data = up ? 0x74 : 0x7C;
-		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
-					 BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
-		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
-					 BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
-	} else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
-		data = up ? 0x75 : 0x7D;
-		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
-					 BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
-		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
-					 BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
-	}
-}
-
 /**************************************************
  * Init.
  **************************************************/
@@ -255,6 +236,32 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc)
 		bcma_core_pci_clientmode_init(pc);
 }
 
+void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
+{
+	struct bcma_drv_pci *pc;
+	u16 data;
+
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	pc = &bus->drv_pci[0];
+
+	if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
+		data = up ? 0x74 : 0x7C;
+		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+					 BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
+		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+					 BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
+	} else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
+		data = up ? 0x75 : 0x7D;
+		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+					 BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
+		bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+					 BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
+	}
+}
+EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
+
 int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
 			  bool enable)
 {
@@ -310,8 +317,6 @@ void bcma_core_pci_up(struct bcma_bus *bus)
 
 	pc = &bus->drv_pci[0];
 
-	bcma_core_pci_power_save(pc, true);
-
 	bcma_core_pci_extend_L1timer(pc, true);
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_up);
@@ -326,7 +331,5 @@ void bcma_core_pci_down(struct bcma_bus *bus)
 	pc = &bus->drv_pci[0];
 
 	bcma_core_pci_extend_L1timer(pc, false);
-
-	bcma_core_pci_power_save(pc, false);
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_down);
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index d66033f..0333e60 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -242,6 +242,7 @@ extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
 				 struct bcma_device *core, bool enable);
 extern void bcma_core_pci_up(struct bcma_bus *bus);
 extern void bcma_core_pci_down(struct bcma_bus *bus);
+extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
 extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);
-- 
1.7.10.4



^ permalink raw reply related

* [PATCH 12/13] ath10k: introduce dynamic pdev parameters
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

This is done exactly the same way as for vdev.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/core.h |    1 +
 drivers/net/wireless/ath/ath10k/mac.c  |   13 +--
 drivers/net/wireless/ath/ath10k/wmi.c  |  144 ++++++++++++++++++++++++++++++-
 drivers/net/wireless/ath/ath10k/wmi.h  |  148 +++++++++++++++++++++++++++++++-
 4 files changed, 297 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index c9ad626..d5e4d55 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -118,6 +118,7 @@ struct ath10k_wmi {
 	wait_queue_head_t tx_credits_wq;
 	struct wmi_cmd_map *cmd;
 	struct wmi_vdev_param_map *vdev_param;
+	struct wmi_pdev_param_map *pdev_param;
 
 	u32 num_mem_chunks;
 	struct ath10k_mem_chunk mem_chunks[ATH10K_MAX_MEM_REQS];
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index ea11a03..d846594 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1816,6 +1816,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
 {
 	struct ath10k *ar = hw->priv;
 	int ret = 0;
+	u32 pdev_param;
 
 	mutex_lock(&ar->conf_mutex);
 
@@ -1845,12 +1846,14 @@ static int ath10k_start(struct ieee80211_hw *hw)
 	else if (ar->state == ATH10K_STATE_RESTARTING)
 		ar->state = ATH10K_STATE_RESTARTED;
 
-	ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 1);
+	pdev_param = ar->wmi.pdev_param->wmi_pdev_param_pmf_qos;
+	ret = ath10k_wmi_pdev_set_param(ar, pdev_param, 1);
 	if (ret)
 		ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
 			    ret);
 
-	ret = ath10k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 0);
+	pdev_param = ar->wmi.pdev_param->wmi_pdev_param_dynamic_bw;
+	ret = ath10k_wmi_pdev_set_param(ar, pdev_param, 0);
 	if (ret)
 		ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
 			    ret);
@@ -2169,7 +2172,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
 	struct ath10k *ar = hw->priv;
 	struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
 	int ret = 0;
-	u32 vdev_param;
+	u32 vdev_param, pdev_param;
 
 	mutex_lock(&ar->conf_mutex);
 
@@ -2195,8 +2198,8 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
 			   "vdev %d set beacon tx mode to staggered\n",
 			   arvif->vdev_id);
 
-		ret = ath10k_wmi_pdev_set_param(ar,
-						WMI_PDEV_PARAM_BEACON_TX_MODE,
+		pdev_param = ar->wmi.pdev_param->wmi_pdev_param_beacon_tx_mode;
+		ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
 						WMI_BEACON_STAGGERED_MODE);
 		if (ret)
 			ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 44ed523..2a55bc8 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -399,6 +399,140 @@ static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
 		WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
 };
 
+static struct wmi_pdev_param_map wmi_pdev_param_map = {
+	.wmi_pdev_param_tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
+	.wmi_pdev_param_rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
+	.wmi_pdev_param_txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
+	.wmi_pdev_param_txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
+	.wmi_pdev_param_txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
+	.wmi_pdev_param_beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
+	.wmi_pdev_param_beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
+	.wmi_pdev_param_resmgr_offchan_mode =
+					WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
+	.wmi_pdev_param_protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
+	.wmi_pdev_param_dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
+	.wmi_pdev_param_non_agg_sw_retry_th =
+					WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
+	.wmi_pdev_param_agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
+	.wmi_pdev_param_sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
+	.wmi_pdev_param_ac_aggrsize_scaling =
+					WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
+	.wmi_pdev_param_ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
+	.wmi_pdev_param_ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
+	.wmi_pdev_param_ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
+	.wmi_pdev_param_ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
+	.wmi_pdev_param_ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
+	.wmi_pdev_param_ltr_ac_latency_timeout =
+					WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
+	.wmi_pdev_param_ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
+	.wmi_pdev_param_ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
+	.wmi_pdev_param_ltr_tx_activity_timeout =
+					WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
+	.wmi_pdev_param_l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
+	.wmi_pdev_param_dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
+	.wmi_pdev_param_pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
+	.wmi_pdev_param_pcielp_txbuf_watermark =
+					WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
+	.wmi_pdev_param_pcielp_txbuf_tmo_en =
+					WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
+	.wmi_pdev_param_pcielp_txbuf_tmo_value =
+					WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
+	.wmi_pdev_param_pdev_stats_update_period =
+					WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_vdev_stats_update_period =
+					WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_peer_stats_update_period =
+					WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_bcnflt_stats_update_period =
+				WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
+	.wmi_pdev_param_arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
+	.wmi_pdev_param_arpdhcp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_dcs = WMI_PDEV_PARAM_DCS,
+	.wmi_pdev_param_ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
+	.wmi_pdev_param_ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
+	.wmi_pdev_param_ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
+	.wmi_pdev_param_ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
+	.wmi_pdev_param_ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
+	.wmi_pdev_param_dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
+	.wmi_pdev_param_proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
+	.wmi_pdev_param_idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
+	.wmi_pdev_param_power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
+	.wmi_pdev_param_fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
+};
+
+static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
+	.wmi_pdev_param_tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
+	.wmi_pdev_param_rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
+	.wmi_pdev_param_txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
+	.wmi_pdev_param_txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
+	.wmi_pdev_param_txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
+	.wmi_pdev_param_beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
+	.wmi_pdev_param_beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
+	.wmi_pdev_param_resmgr_offchan_mode =
+					WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
+	.wmi_pdev_param_protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
+	.wmi_pdev_param_dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
+	.wmi_pdev_param_non_agg_sw_retry_th =
+					WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
+	.wmi_pdev_param_agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
+	.wmi_pdev_param_sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
+	.wmi_pdev_param_ac_aggrsize_scaling =
+					WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
+	.wmi_pdev_param_ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
+	.wmi_pdev_param_ltr_ac_latency_be =
+					WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
+	.wmi_pdev_param_ltr_ac_latency_bk =
+					WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
+	.wmi_pdev_param_ltr_ac_latency_vi =
+					WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
+	.wmi_pdev_param_ltr_ac_latency_vo =
+					WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
+	.wmi_pdev_param_ltr_ac_latency_timeout =
+				WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
+	.wmi_pdev_param_ltr_sleep_override =
+					WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
+	.wmi_pdev_param_ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
+	.wmi_pdev_param_ltr_tx_activity_timeout =
+				WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
+	.wmi_pdev_param_l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
+	.wmi_pdev_param_dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
+	.wmi_pdev_param_pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_pdev_stats_update_period =
+				WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_vdev_stats_update_period =
+				WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_peer_stats_update_period =
+				WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_bcnflt_stats_update_period =
+				WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
+	.wmi_pdev_param_pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
+	.wmi_pdev_param_arp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_arpdhcp_ac_override =
+					WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
+	.wmi_pdev_param_dcs = WMI_10X_PDEV_PARAM_DCS,
+	.wmi_pdev_param_ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
+	.wmi_pdev_param_ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
+	.wmi_pdev_param_ani_listen_period =
+					WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
+	.wmi_pdev_param_ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
+	.wmi_pdev_param_ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
+	.wmi_pdev_param_dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
+	.wmi_pdev_param_proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
+	.wmi_pdev_param_fast_channel_reset =
+					WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
+	.wmi_pdev_param_burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
+	.wmi_pdev_param_burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
+
+};
+
 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
 {
 	int ret;
@@ -1886,10 +2020,12 @@ int ath10k_wmi_attach(struct ath10k *ar)
 		ath10k_warn("Firmware 10.X is not yet supported\n");
 		ar->wmi.cmd = &wmi_10x_cmd_map;
 		ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
+		ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
 		ret = -ENOTSUPP;
 	} else {
 		ar->wmi.cmd = &wmi_cmd_map;
 		ar->wmi.vdev_param = &wmi_vdev_param_map;
+		ar->wmi.pdev_param = &wmi_pdev_param_map;
 		ret = 0;
 	}
 
@@ -2027,12 +2163,16 @@ int ath10k_wmi_pdev_resume_target(struct ath10k *ar)
 				   ar->wmi.cmd->wmi_pdev_resume_cmdid);
 }
 
-int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
-			      u32 value)
+int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
 {
 	struct wmi_pdev_set_param_cmd *cmd;
 	struct sk_buff *skb;
 
+	if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
+		ath10k_warn("pdev param %d not supported by firmware\n", id);
+		return -EINVAL;
+	}
+
 	skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
 	if (!skb)
 		return -ENOMEM;
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index fbff5cb..fcada27 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -2072,6 +2072,60 @@ struct wmi_csa_event {
 #define VDEV_DEFAULT_STATS_UPDATE_PERIOD    500
 #define PEER_DEFAULT_STATS_UPDATE_PERIOD    500
 
+struct wmi_pdev_param_map {
+	u32 wmi_pdev_param_tx_chain_mask;
+	u32 wmi_pdev_param_rx_chain_mask;
+	u32 wmi_pdev_param_txpower_limit2g;
+	u32 wmi_pdev_param_txpower_limit5g;
+	u32 wmi_pdev_param_txpower_scale;
+	u32 wmi_pdev_param_beacon_gen_mode;
+	u32 wmi_pdev_param_beacon_tx_mode;
+	u32 wmi_pdev_param_resmgr_offchan_mode;
+	u32 wmi_pdev_param_protection_mode;
+	u32 wmi_pdev_param_dynamic_bw;
+	u32 wmi_pdev_param_non_agg_sw_retry_th;
+	u32 wmi_pdev_param_agg_sw_retry_th;
+	u32 wmi_pdev_param_sta_kickout_th;
+	u32 wmi_pdev_param_ac_aggrsize_scaling;
+	u32 wmi_pdev_param_ltr_enable;
+	u32 wmi_pdev_param_ltr_ac_latency_be;
+	u32 wmi_pdev_param_ltr_ac_latency_bk;
+	u32 wmi_pdev_param_ltr_ac_latency_vi;
+	u32 wmi_pdev_param_ltr_ac_latency_vo;
+	u32 wmi_pdev_param_ltr_ac_latency_timeout;
+	u32 wmi_pdev_param_ltr_sleep_override;
+	u32 wmi_pdev_param_ltr_rx_override;
+	u32 wmi_pdev_param_ltr_tx_activity_timeout;
+	u32 wmi_pdev_param_l1ss_enable;
+	u32 wmi_pdev_param_dsleep_enable;
+	u32 wmi_pdev_param_pcielp_txbuf_flush;
+	u32 wmi_pdev_param_pcielp_txbuf_watermark;
+	u32 wmi_pdev_param_pcielp_txbuf_tmo_en;
+	u32 wmi_pdev_param_pcielp_txbuf_tmo_value;
+	u32 wmi_pdev_param_pdev_stats_update_period;
+	u32 wmi_pdev_param_vdev_stats_update_period;
+	u32 wmi_pdev_param_peer_stats_update_period;
+	u32 wmi_pdev_param_bcnflt_stats_update_period;
+	u32 wmi_pdev_param_pmf_qos;
+	u32 wmi_pdev_param_arp_ac_override;
+	u32 wmi_pdev_param_arpdhcp_ac_override;
+	u32 wmi_pdev_param_dcs;
+	u32 wmi_pdev_param_ani_enable;
+	u32 wmi_pdev_param_ani_poll_period;
+	u32 wmi_pdev_param_ani_listen_period;
+	u32 wmi_pdev_param_ani_ofdm_level;
+	u32 wmi_pdev_param_ani_cck_level;
+	u32 wmi_pdev_param_dyntxchain;
+	u32 wmi_pdev_param_proxy_sta;
+	u32 wmi_pdev_param_idle_ps_config;
+	u32 wmi_pdev_param_power_gating_sleep;
+	u32 wmi_pdev_param_fast_channel_reset;
+	u32 wmi_pdev_param_burst_dur;
+	u32 wmi_pdev_param_burst_enable;
+};
+
+#define WMI_PDEV_PARAM_UNSUPPORTED 0
+
 enum wmi_pdev_param {
 	/* TX chian mask */
 	WMI_PDEV_PARAM_TX_CHAIN_MASK = 0x1,
@@ -2171,6 +2225,97 @@ enum wmi_pdev_param {
 	WMI_PDEV_PARAM_POWER_GATING_SLEEP,
 };
 
+enum wmi_10x_pdev_param {
+	/* TX chian mask */
+	WMI_10X_PDEV_PARAM_TX_CHAIN_MASK = 0x1,
+	/* RX chian mask */
+	WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
+	/* TX power limit for 2G Radio */
+	WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
+	/* TX power limit for 5G Radio */
+	WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
+	/* TX power scale */
+	WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
+	/* Beacon generation mode . 0: host, 1: target   */
+	WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
+	/* Beacon generation mode . 0: staggered 1: bursted   */
+	WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
+	/*
+	 * Resource manager off chan mode .
+	 * 0: turn off off chan mode. 1: turn on offchan mode
+	 */
+	WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
+	/*
+	 * Protection mode:
+	 * 0: no protection 1:use CTS-to-self 2: use RTS/CTS
+	 */
+	WMI_10X_PDEV_PARAM_PROTECTION_MODE,
+	/* Dynamic bandwidth 0: disable 1: enable */
+	WMI_10X_PDEV_PARAM_DYNAMIC_BW,
+	/* Non aggregrate/ 11g sw retry threshold.0-disable */
+	WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
+	/* aggregrate sw retry threshold. 0-disable*/
+	WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
+	/* Station kickout threshold (non of consecutive failures).0-disable */
+	WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
+	/* Aggerate size scaling configuration per AC */
+	WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
+	/* LTR enable */
+	WMI_10X_PDEV_PARAM_LTR_ENABLE,
+	/* LTR latency for BE, in us */
+	WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
+	/* LTR latency for BK, in us */
+	WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
+	/* LTR latency for VI, in us */
+	WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
+	/* LTR latency for VO, in us  */
+	WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
+	/* LTR AC latency timeout, in ms */
+	WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
+	/* LTR platform latency override, in us */
+	WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
+	/* LTR-RX override, in us */
+	WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
+	/* Tx activity timeout for LTR, in us */
+	WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
+	/* L1SS state machine enable */
+	WMI_10X_PDEV_PARAM_L1SS_ENABLE,
+	/* Deep sleep state machine enable */
+	WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
+	/* pdev level stats update period in ms */
+	WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
+	/* vdev level stats update period in ms */
+	WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
+	/* peer level stats update period in ms */
+	WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
+	/* beacon filter status update period */
+	WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
+	/* QOS Mgmt frame protection MFP/PMF 0: disable, 1: enable */
+	WMI_10X_PDEV_PARAM_PMF_QOS,
+	/* Access category on which ARP and DHCP frames are sent */
+	WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
+	/* DCS configuration */
+	WMI_10X_PDEV_PARAM_DCS,
+	/* Enable/Disable ANI on target */
+	WMI_10X_PDEV_PARAM_ANI_ENABLE,
+	/* configure the ANI polling period */
+	WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
+	/* configure the ANI listening period */
+	WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
+	/* configure OFDM immunity level */
+	WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
+	/* configure CCK immunity level */
+	WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
+	/* Enable/Disable CDD for 1x1 STAs in rate control module */
+	WMI_10X_PDEV_PARAM_DYNTXCHAIN,
+	/* Enable/Disable Fast channel reset*/
+	WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
+	/* Set Bursting DUR */
+	WMI_10X_PDEV_PARAM_BURST_DUR,
+	/* Set Bursting Enable*/
+	WMI_10X_PDEV_PARAM_BURST_ENABLE,
+};
+
 struct wmi_pdev_set_param_cmd {
 	__le32 param_id;
 	__le32 param_value;
@@ -3797,8 +3942,7 @@ int ath10k_wmi_pdev_suspend_target(struct ath10k *ar);
 int ath10k_wmi_pdev_resume_target(struct ath10k *ar);
 int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
 				  u16 rd5g, u16 ctl2g, u16 ctl5g);
-int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
-			      u32 value);
+int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value);
 int ath10k_wmi_cmd_init(struct ath10k *ar);
 int ath10k_wmi_10x_cmd_init(struct ath10k *ar);
 int ath10k_wmi_start_scan(struct ath10k *ar, const struct wmi_start_scan_arg *);
-- 
1.7.10


^ 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