Re: [PATCH v4 4/8] rt2800: fix registers init for MT7620

2018-10-16 Thread Daniel Golle
On Tue, Oct 16, 2018 at 10:11:16AM +0200, Stanislaw Gruszka wrote:
> On Fri, Oct 12, 2018 at 12:48:07PM +0200, Tom Psyborg wrote:
> > chip version support exist in daniel's tree since a long time ago. so
> > don't disable registers initialization but try to upstream his
> > changes.
> 
> Where is this patch ? I can not find it.

So this requires to make the chip version and package available to
drivers like rt2x00. First of all, this is a patch for linux-mips:

https://git.openwrt.org/?p=openwrt/staging/dangole.git;a=blob;f=target/linux/ramips/patches-4.4/300-mt7620-export-chip-version-and-pkg.patch;h=f6aca6c90516f9c534b3c51e9f99dff6a3f41b75;hb=709fe05dfea58728d6accb9fe56c7056d9d0715b

It belongs to this (very outdated) tree:
https://git.openwrt.org/?p=openwrt/staging/dangole.git;a=shortlog;h=refs/heads/differentiate-pkg-ver-eco

I'm not sure whether this is the right way to do this, but it worked.


Cheers


Daniel



> 
> Thanks
> Stanislaw


Re: [PATCH 4/4] rt2800: comment and simplify AGC init for RT6352

2018-10-10 Thread Daniel Golle
On Wed, Oct 10, 2018 at 10:09:14PM +0200, Tom Psyborg wrote:
> it's 6352 dude

true. thanks for the review!

> 
> On 10/10/2018, Stanislaw Gruszka  wrote:
> > We do not need separate lines for calculating register values.
> > Also add comment that value is different than in vendor driver.
> >
> > Suggested-by: Daniel Golle 
> > Signed-off-by: Stanislaw Gruszka 
> > ---
> >  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 ++---
> >  1 file changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > index a2cdd3a5034a..7b6effaa0740 100644
> > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > @@ -3986,9 +3986,12 @@ static void rt2800_config_channel(struct rt2x00_dev
> > *rt2x00dev,
> > rt2800_bbp_write(rt2x00dev, 195, 141);
> > rt2800_bbp_write(rt2x00dev, 196, reg);
> >
> > -   /* AGC init */
> > -   reg = rf->channel <= 14 ? 0x1c : 0x24;
> > -   reg += 2 * rt2x00dev->lna_gain;
> > +   /* AGC init.
> > +* Despite the vendor driver using different values here for
> > +* RT6362 chip, we use 0x1c for now. This may have to be changed
> > +* once TSSI got implemented.
> > +*/
> > +   reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain;
> > rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
> >
> > rt2800_iq_calibrate(rt2x00dev, rf->channel);
> > --
> > 2.7.5
> >
> >


Re: [PATCH v3 4/4] rt2800: fix registers init for MT7620

2018-10-10 Thread Daniel Golle
Hi Stanislaw,

On Wed, Oct 10, 2018 at 09:14:52AM +0200, Stanislaw Gruszka wrote:
> On Wed, Oct 10, 2018 at 01:27:31AM +0200, Tom Psyborg wrote:
> > On 09/10/2018, Stanislaw Gruszka  wrote:
> > > There is dupliceted 'if (rt2x00_rt(rt2x00dev, RT6352))' entry that couses
> > > we do not perform proper register initaliztion for RT6352 (MT7620 SOCs).
> > >
> > > Reported-by: Tomislav Požega 
> > > Signed-off-by: Stanislaw Gruszka 
> > > ---
> > >  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 +--
> > >  1 file changed, 1 insertion(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > index daf20d7424ac..170e7c87f7bc 100644
> > > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > @@ -5451,8 +5451,7 @@ static int rt2800_init_registers(struct rt2x00_dev
> > > *rt2x00dev)
> > > 0x);
> > >   }
> > >   } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> > > -rt2x00_rt(rt2x00dev, RT5392) ||
> > > -rt2x00_rt(rt2x00dev, RT6352)) {
> > > +rt2x00_rt(rt2x00dev, RT5392)) {
> > >   rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
> > >   rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
> > >   rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x);
> > > --
> > > 2.7.5
> > >
> > >
> > 
> > 
> > have you got chance to test
> > https://github.com/psyborg55/linux/commit/24b46d482590a87553df1de0b5c8032f363cb7cf
> >  ?
> > 
> >  using this code to determine 7620 soc
> > 
> >  if (rt == RT5390 && rt2x00_is_soc(rt2x00dev))
> >  rt = RT6352;
> > 
> >  somehow did not work in rt2800_init_registers routine. i could verify
> >  that by removing tx_sw_cfg registers from rt6352 and the wifi would
> >  still work, unless removed them from rt5390 also
> 
> I tested by adding additional printk("Init RT6352 registers\n"); in 
> if (rt2x00_rt(rt2x00dev, RT6352)) branch. The message was printed:
> 
> [   68.049946] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 6352, rev 
> 0500 detected
> [   68.065392] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 7620 detected
> [   68.079777] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
> [   68.177760] kmodloader: done loading kernel modules from /etc/modules.d/*
> [   68.825758] urandom_read: 5 callbacks suppressed
> [   68.825768] random: jshn: uninitialized urandom read (4 bytes read)
> [   77.792400] 8021q: adding VLAN 0 to HW filter on device eth0
> [   77.825045] br-lan: port 1(eth0.1) entered blocking state
> [   77.836032] br-lan: port 1(eth0.1) entered disabled state
> [   77.847156] device eth0.1 entered promiscuous mode
> [   77.856739] device eth0 entered promiscuous mode
> [   77.931043] br-lan: port 1(eth0.1) entered blocking state
> [   77.941861] br-lan: port 1(eth0.1) entered forwarding state
> [   77.953171] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
> [   78.849852] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
> [   82.302306] Init RT6352 registers
> 
> Perhaps rt2x00_is_soc(rt2x00dev) does not work on this particular system
> that you have and device is configured as RT5390 ? I.e. maybe this is
> PCIe device. This should be printed in :
> 
> ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 6352, rev 0500 detected
> 
> line, you should have 'RT chipset 5390' instead.

RT6352 is the pre-mediatek-merge name of MT7620A/N. It is always a SoC.
The RF part of both MT7620A and MT7620N identifies as RT5390. The
vendor driver also uses an equivalent check to destinguish between the
actual PCIe/USB RT5390xx and RT6352, see

https://github.com/i80s/mtk-sources/blob/master/mt7620/src/include/rtmp_chip.h#L114


Cheers


Daniel

> 
> Thanks
> Stanislaw


Re: [PATCH v3 2/4] rt2x00: remove confusing AGC register

2018-10-09 Thread Daniel Golle
On Tue, Oct 09, 2018 at 02:47:48PM +0200, Stanislaw Gruszka wrote:
> Hi
> 
> On Tue, Oct 09, 2018 at 02:27:22PM +0200, Daniel Golle wrote:
> > On Tue, Oct 09, 2018 at 01:56:08PM +0200,  Gruszka wrote:
> > > Register 66 was causing issues on RT6352 if set to the same value as
> > > in MTK driver. With 1c reg value device was working fine in both HT20
> > > and HT40 modes.
> > 
> > My guess is that this may change once we add proper TSSI which involes
> > parts of AGC init as well. I suggest to add a comment in the code to
> > reflect that.
> 
> I don't understand what you suggest, could you be more specific ?

simply add these lines:
/*
 * Despite the vendor driver using different values here, use 0x1c
 * for now. This may have to be changed once TSSI got implemented
 */

> 
> > > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> > > b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > index 1a2bf6c49b82..3a04eaef8511 100644
> > > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > @@ -3981,11 +3981,7 @@ static void rt2800_config_channel(struct 
> > > rt2x00_dev *rt2x00dev,
> > >   rt2800_bbp_write(rt2x00dev, 196, reg);
> > >  
> > >   /* AGC init */
> > > - if (rt2x00_rt(rt2x00dev, RT6352))
> > > - reg = 0x04;
> > > - else
> > > - reg = rf->channel <= 14 ? 0x1c : 0x24;
> > > -
> > > + reg = rf->channel <= 14 ? 0x1c : 0x24;
> > >   reg += 2 * rt2x00dev->lna_gain;
> > 
> > We can summerize the two lines into
> > reg = 0x1c + (2 * rt2x00dev->lna_gain);
> > which is also what is was before introducing support for MT7620.
> 
> I think you mean
> 
> reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain; 
> 
> to do not break 5GHz support for RT5592.  I can change that in
> separate patch, since this one in not technically wrong.
> 
> Thanks
> Stanislaw
> 


Re: [PATCH v3 2/4] rt2x00: remove confusing AGC register

2018-10-09 Thread Daniel Golle
Hi Stanislaw,

On Tue, Oct 09, 2018 at 01:56:08PM +0200,  Gruszka wrote:
> Register 66 was causing issues on RT6352 if set to the same value as
> in MTK driver. With 1c reg value device was working fine in both HT20
> and HT40 modes.

My guess is that this may change once we add proper TSSI which involes
parts of AGC init as well. I suggest to add a comment in the code to
reflect that.


> 
> Signed-off-by: Tomislav Požega 
> Signed-off-by: Stanislaw Gruszka 
> ---
>  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +-
>  1 file changed, 1 insertion(+), 5 deletions(-)
> 
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> index 1a2bf6c49b82..3a04eaef8511 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> @@ -3981,11 +3981,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
> *rt2x00dev,
>   rt2800_bbp_write(rt2x00dev, 196, reg);
>  
>   /* AGC init */
> - if (rt2x00_rt(rt2x00dev, RT6352))
> - reg = 0x04;
> - else
> - reg = rf->channel <= 14 ? 0x1c : 0x24;
> -
> + reg = rf->channel <= 14 ? 0x1c : 0x24;
>   reg += 2 * rt2x00dev->lna_gain;

We can summerize the two lines into
reg = 0x1c + (2 * rt2x00dev->lna_gain);
which is also what is was before introducing support for MT7620.


>   rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);


Cheers


Daniel


Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue...?

2018-08-18 Thread Daniel Golle
Still seeing a lot of those

Sat Aug 18 16:05:51 2018 kern.err kernel: [ 8364.972151] ieee80211 phy0: 
rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2
Sat Aug 18 16:05:51 2018 kern.err kernel: [ 8364.981622] ieee80211 phy0: 
rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2
Sat Aug 18 16:05:51 2018 kern.err kernel: [ 8364.991070] ieee80211 phy0: 
rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2
Sat Aug 18 16:05:51 2018 kern.err kernel: [ 8365.000506] ieee80211 phy0: 
rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2
Sat Aug 18 16:05:51 2018 kern.err kernel: [ 8365.009935] ieee80211 phy0: 
rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2

while wifi somehow keeps working at degraded level once the error
occured.

On Thu, Aug 16, 2018 at 07:30:40PM +, Craig Matsuura wrote:
> FWIW we would use iperf and push a lot of data to a STA and would cause lock 
> ups and issues with the queues.
> 
> 
> Craig
> 
> 
> Craig Matsuura • Technical Director, Embedded Software Architecture
> 
> cmatsu...@vivint.com<mailto:cmatsu...@vivint.com> • P: 801.229.6005
> 
> 
> 
> simply smarter • vivint.com
> 
> 3401 N Ashton Blvd. Lehi, UT 84043
> 
> 
> 
> [1497369905956_vivint-logo-orange.png]
> 
> 
> From: linux-wireless-ow...@vger.kernel.org 
>  on behalf of Stanislaw Gruszka 
> 
> Sent: Thursday, August 16, 2018 5:01:04 AM
> To: Daniel Golle
> Cc: Kofi Agor; Enrico Mioso; Craig Matsuura; Mathias Kresin; Tom Psyborg; 
> linux-wireless; John Crispin; Felix Fietkau; Jamie Stuart
> Subject: Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping 
> frame due to full tx queue...?
> 
> Hello
> 
> On Thu, Aug 16, 2018 at 12:35:29AM +0200, Daniel Golle wrote:
> > Clone the master branch of
> > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.openwrt.org%2Fopenwrt%2Fstaging%2Fdangole.gitdata=01%7C01%7Ccmatsuura%40vivint.com%7C259b5ae9949e445dd9fe08d603680486%7C54cc98ca024a470185483741e3b8d59d%7C0sdata=8mOOSNRnqvjDVnCNHH15c%2BfEzr69yPpCkbSdD6Q8ZuA%3Dreserved=0
> > and give it shot and let us know the results.
> 
> Thanks!
> 
> > > Please also remove:
> > > 600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
> > > 991-rt2800_change_rx_ampdu_factor.patch
> > > 992-rt2800_change_ba_size.patch
> > > 993-rt2800_change_rx_ampdu_density.patch
> > > Those are not needed and can be harmful with the test patches,
> > > (especially spurious interrupt one, patches will not apply cleanly
> > > with it).
> >
> > Ack. Hope it doesn't break Rt3883 and/or Rt3663 for which that patch
> > was added by Gabor Juhos a decade ago...
> 
> The new patches change the way we handle TX status interrupt. I think
> spurious interrupts were a problem because we do not disable the IRQ
> and read statuses, so we could get interrupt after we empty TX_STA_FIFO
> register. With current implementation this should not be an issue.
> 
> > > Another thing is fixing RATE_PROBE frames which are aggregated with
> > > other frames and not sent at requested rate. I implemented qsel queue 
> > > patch
> > > similar to mt76, but this not work as expected on older Ralink chips.
> > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fsgruszka%2Fwireless-drivers-next%2Fcommit%2F846d205edd8c36d1b7828fee54bf4cf40bf8cb1adata=01%7C01%7Ccmatsuura%40vivint.com%7C259b5ae9949e445dd9fe08d603680486%7C54cc98ca024a470185483741e3b8d59d%7C0sdata=mI%2BPAh7OalmB1hxzjF%2FL6GqxwHDPi7Hy5P9IWADu5gI%3Dreserved=0
> >
> > Which hardware did you try? Just so I can reproduce what's going on
> > and maybe help fixing it...
> 
> I tested on RT3062 PCI and some USB dongles, don't remember chip version.
> Basically HW become unresponsive after sent some traffic.
> 
> I debugged the problem by printing sequence number and rate of RATE PROBE
> frames by something like this:
> 
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c 
> b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
> index 92ddc19..d7f250b 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
> @@ -334,6 +334,12 @@ static void rt2x00queue_create_tx_descriptor_ht(struct 
> rt2x00_dev *rt2x00dev,
>  txdesc->u.ht.mcs |= 0x08;
>  }
> 
> +   if (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) {
> +   int ssn = le16_to_cpu(hdr->seq_ctrl) >> 4;
> +   printk("RATE PROBE %d %d\n", ssn, txdesc->u.h

Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue...?

2018-08-15 Thread Daniel Golle
Hi Stanislaw,

On Wed, Aug 15, 2018 at 01:40:30PM +0200, Stanislaw Gruszka wrote:
> On Mon, May 28, 2018 at 02:50:39PM +0200, Stanislaw Gruszka wrote:
> > I have some updates here.
> 
> And now more updates. I have 5 patches to test here:
> https://github.com/sgruszka/wireless-drivers-next/commits/rt2800-draft-v2
> 
> as reported by T-Bone here:
> https://bugzilla.kernel.org/show_bug.cgi?id=82751
> first 3 patches made Netgear WN3000RPv3 router workable.
> Another 2 should be further improvement, but were not tested broadly
> and can have some bugs.
> 
> Daniel, could you apply this on your staging tree for testing?

Done and rebased on top of blogic's tree with mac80211 from v4.18-rc7
instead of (outdated) wireless-testing.
Only compile-tested by myself for now, maybe someone can run a build on
actual MT7620 hardware?

Clone the master branch of
https://git.openwrt.org/openwrt/staging/dangole.git
and give it shot and let us know the results.

> Please also remove:
> 600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
> 991-rt2800_change_rx_ampdu_factor.patch
> 992-rt2800_change_ba_size.patch
> 993-rt2800_change_rx_ampdu_density.patch
> Those are not needed and can be harmful with the test patches,
> (especially spurious interrupt one, patches will not apply cleanly 
> with it).

Ack. Hope it doesn't break Rt3883 and/or Rt3663 for which that patch
was added by Gabor Juhos a decade ago...

> 
> Patches should make "Dropping frame due to full tx queue" and
> "Queue 2 failed to flush" errors gone. However if device is somewhat
> wrongly configured by driver at low level (i.e. wrong MAC/BBP/RF
> registers programing) there still will be troubles to have stable
> and fast wireless connection.
> 
> On TODO site, the proper watchdog should be added, but I'm not sure
> how to exactly detect device/firmware hung and how exactly device should
> be rested (by some HW reset by register or by doing full reinitialization).
> 
> Another thing is fixing RATE_PROBE frames which are aggregated with
> other frames and not sent at requested rate. I implemented qsel queue patch
> similar to mt76, but this not work as expected on older Ralink chips.  
> https://github.com/sgruszka/wireless-drivers-next/commit/846d205edd8c36d1b7828fee54bf4cf40bf8cb1a

Which hardware did you try? Just so I can reproduce what's going on
and maybe help fixing it...


Cheers

Daniel

> 
> Any help with those 2 problems are welcome.
>  
> Thanks
> Stanislaw
> 


Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue...?

2018-05-28 Thread Daniel Golle
Hi!

On Mon, May 28, 2018 at 02:50:40PM +0200, Stanislaw Gruszka wrote:
> I have some updates here.
> 
> ...
> Another issue is that sometimes we do not sent rate probe frames,
> I posted fix for that (revert of my older change):
> https://marc.info/?l=linux-wireless=152750671715369=2 
> This patch improve performance when mt7620 is connected with Intel iwl7265
> device. With the patch I have 70 Mbits/sec compared to about 17 Mbits/sec
> before. Perhaps it also fix stability issues.

Oh goodness, I didn't expect anything like that to still happen at
this stage. Thanks a lot for investigating the issue!
I've imported the patch to OpenWrt git:
https://git.openwrt.org/?p=openwrt/openwrt.git;a=commit;h=f4a639a3d7d40b4f63c431c2d554c479fbcc6b74

Once we got some feedback from users (please test!) we can push that
also to still be part of the openwrt-18.06 release.

Cheers

Daniel


Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue...?

2018-03-27 Thread Daniel Golle
Hi Stanislaw,

On Tue, Mar 27, 2018 at 07:18:16PM +0200, Stanislaw Gruszka wrote:
> On Tue, Mar 27, 2018 at 09:46:36AM +0200, Mathias Kresin wrote:
> > > Could you test just RX AMPDU patches, i.e.
> > > 
> > > rt2800_change_rx_ampdu_factor.patch
> > > rt2800_change_rx_ampdu_density.patch
> > > 
> > > I have somewhat positive results on RX performance on some devices
> > > with those. Perhaps you could confirm that :-)
> > 
> > This time I've done the test with HT20 only, to not annoy my neighbours.
> > 
> > The test setup is the following:
> > 
> > ath9k (STA) <=> (AP) o2 Box 6431 (RJ45) <=> desktop
> > 
> > With the patches applied the bandwidth is somewhat around 10 MBit/sec lower.
> > Even if I was able to reliable reproduce it, I'm not sure if it is within
> > the measuring tolerance.
> 
> Ok. I think when BBP/RF is correctly programmed patches will downgrade
> performance. For not well optimized devices patches might
> improve things , but this is not preferred solution. For 30+ client
> scenario I suggest to just disable HT (11n) in OpenWRT config.
> 
> Additionally since those errors do not happen frequently perhaps there
> is possibility to create watchdog and reset the device when problems
> start to happen.
> 
> FWIW: I'm running wt3020 (mt7620 device) as my home router for 3 weeks now
> and do not see any errors (I have 4 client devices). Performance measured
> by iperf is not good though - about 40 Mbit/s .

That's great news! Are you running OpenWrt or some self-baked
vanilla Linux with some of the OpenWrt patchery on top?
Also note that Tomislav Požega started porting more of the Rt6352
calibration routines, I'd be happy if you could review those as well
so they can go upstream right away:

https://github.com/openwrt/openwrt/pull/626

Just in case you are not aware of it, here is my staging tree with some
experimental changes for MT7620 including the fixes/work-arounds you
suggested as well as @psyborg55's patches:

https://git.openwrt.org/?p=openwrt/staging/dangole.git;a=summary


Cheers


Daniel


Re: ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue...?

2018-03-01 Thread Daniel Golle
[forwarding to all other involved players]

On Thu, Mar 01, 2018 at 05:50:51PM +0300, Jamie Stuart wrote:
> Hi Daniel,
> The driver seems much improved after this fix.

it's about those two
[PATCH 1/2] rt2x00: pause almost full queue early
[PATCH 2/2] rt2x00: do not pause queue unconditionally on error path

> Under very heavy load (30 clients downloading multi-GB files from SD card on 
> the server concurrently), wifi dies with errors:
> 
> [ 7794.230376] ieee80211 phy0: rt2x00lib_rxdone_read_signal: Warning - Frame 
> received with unrecognized signal, mode=0x0001, signal=0x010c, type=4
> 
> Thu Mar  1 16:36:47 2018 kern.err kernel: [ 8702.146403] ieee80211 phy0: 
> rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full 
> queue 2
> Thu Mar  1 16:36:47 2018 kern.err kernel: [ 8702.146403] Please file bug 
> report to http://rt2x00.serialmonkey.com
> Thu Mar  1 16:36:48 2018 kern.err kernel: [ 8702.288149] ieee80211 phy0: 
> rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full 
> queue 2
> Thu Mar  1 16:36:48 2018 kern.err kernel: [ 8702.288149] Please file bug 
> report to http://rt2x00.serialmonkey.com
> Thu Mar  1 16:36:48 2018 kern.err kernel: [ 8702.380761] ieee80211 phy0: 
> rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full 
> queue 2
> Thu Mar  1 16:36:48 2018 kern.err kernel: [ 8702.380761] Please file bug 
> report to http://rt2x00.serialmonkey.com
> 
> 
> > On 20 Dec 2017, at 06:00, Daniel Golle <dan...@makrotopia.org> wrote:
> > 
> > Hi Jamie,
> > 
> > there was another round of discussion regarding the queue management
> > problem and Stanislaw Gruszka (the main rt2x00 maintainer) suggested
> > two patches which would be a more correct fix for the
> > rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue
> > message and consecutive problems.
> > 
> > I imported them to my staging tree. Please retest and join the
> > discussion on
> > https://wireless.wiki.kernel.org/en/developers/mailinglists#linux-wireless_online_archives
> > see posts
> > https://marc.info/?l=linux-wireless=151368325114059=2
> > https://marc.info/?l=linux-wireless=151368325914062=2
> > and
> > https://marc.info/?l=linux-wireless=151368992716169=2
> > 
> > 
> > Cheers
> > 
> > 
> > Daniel
> > 
> > 


Re: [PATCH v2] rt2800: fix TX_PIN_CFG setting for non MT7620 chips

2017-08-25 Thread Daniel Golle
On Fri, Aug 25, 2017 at 05:04:15PM +0200, Stanislaw Gruszka wrote:
> Since commit 41977e86c984 ("rt2x00: add support for MT7620") we do not
> initialize TX_PIN_CFG setting. This cause breakage at least on some
> RT3573 devices. To fix the problem patch restores previous behaviour
> for non MT7620 chips.
> 
> Fixes: 41977e86c984 ("rt2x00: add support for MT7620")
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1480829
> Reported-and-tested-by: Jussi Eloranta <jussi.elora...@csun.edu>
> Cc: Daniel Golle <dan...@makrotopia.org>
> Signed-off-by: Stanislaw Gruszka <sgrus...@redhat.com>

Acked-by: Daniel Golle <dan...@makrotopia.org>

> ---
> v1 -> v2: patch for updated linux version
> 
>  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 -
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> index 0b75def39c6c..d2c289446c00 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> @@ -3702,7 +3702,10 @@ static void rt2800_config_channel(struct rt2x00_dev 
> *rt2x00dev,
>   if (rt2x00_rt(rt2x00dev, RT3572))
>   rt2800_rfcsr_write(rt2x00dev, 8, 0);
>  
> - tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
> + if (rt2x00_rt(rt2x00dev, RT6352))
> + tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
> + else
> + tx_pin = 0;
>  
>   switch (rt2x00dev->default_ant.tx_chain_num) {
>   case 3:
> -- 
> 2.7.5


Re: [PATCH] rt2800: fix TX_PIN_CFG setting for non MT7620 chips

2017-08-25 Thread Daniel Golle
Hi Stanislaw,

On Fri, Aug 25, 2017 at 01:38:29PM +0200, Stanislaw Gruszka wrote:
> Since commit 41977e86c984 ("rt2x00: add support for MT7620") we do not
> initialize TX_PIN_CFG setting. This cause breakage at least on some
> RT3573 devices. To fix the problem patch restores previous behaviour
> for non MT7620 chips.
> 
> Fixes: 41977e86c984 ("rt2x00: add support for MT7620")
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1480829
> Reported-and-tested-by: Jussi Eloranta 
> Signed-off-by: Stanislaw Gruszka 
> ---
>  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 -
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> index d11c7b2..5672aec 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> @@ -3699,7 +3699,10 @@ static void rt2800_config_channel(struct rt2x00_dev 
> *rt2x00dev,
>   if (rt2x00_rt(rt2x00dev, RT3572))
>   rt2800_rfcsr_write(rt2x00dev, 8, 0);
>  
> - rt2800_register_read(rt2x00dev, TX_PIN_CFG, _pin);
> + if (rt2x00_rt(rt2x00dev, RT6352))
> + rt2800_register_read(rt2x00dev, TX_PIN_CFG, _pin);

should be

tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);

since the calling convention of rt2800_register_read was changed in
commit eebd68e782 rt2x00: convert rt2800_register_read return type.
Probably you based the patch on an outdated tree...?


> + else
> + tx_pin = 0;
>  
>   switch (rt2x00dev->default_ant.tx_chain_num) {
>   case 3:
> -- 
> 2.7.5
> 


Re: [PATCH] rt2x00: remove unneccesary code

2017-05-18 Thread Daniel Golle
Done. See
https://git.lede-project.org/?p=source.git;a=commit;h=5e5499c612a667837c714fc4a41b7347e334ce14

I'll merge it into the patch adding support for ePA and then submit the
already reduced version upstream once it got sufficient testing.

Note that your mailer program destroyed the white-space formatting of
the patch which I had to fix manually as a consequence of that (tabs
were replaced by spaces, hence the patch didn't apply). Try to setup
git-send-email using SMTP directly in order to avoid that in future.

Cheers

Daniel


On Thu, May 18, 2017 at 01:32:38PM +0200, Tom Psyborg wrote:
> Oh, i missed that. It's fine as long as it gets merged in LEDE so it's
> ready for upstreaming.
> 
> On 18 May 2017 at 13:27, Daniel Golle <dan...@makrotopia.org> wrote:
> 
> > Hi Tom,
> >
> > thank you for that contribution.
> > Code for ePA has not yet been submitted upstream, I wanted to give it
> > some more testing, so it's still a local patch in OpenWrt/LEDE.
> > I'll merge your patch into our local patch-queue and submit it together
> > with the ePA code once it got some more testing.
> >
> > Cheers
> >
> > Daniel
> >
> > Patchworkers: consider this to be a request to defer this submission.
> >
> >
> > On Thu, May 18, 2017 at 12:42:14PM +0200, Tom Psyborg wrote:
> > > Use chanreg and dccal helpers to reduce the size of ePA code.
> > >
> > > Signed-off-by: Tomislav Požega <pozega.tomis...@gmail.com>
> > >
> > > ---
> >


Re: [PATCH] rt2x00: remove unneccesary code

2017-05-18 Thread Daniel Golle
Hi Tom,

thank you for that contribution.
Code for ePA has not yet been submitted upstream, I wanted to give it
some more testing, so it's still a local patch in OpenWrt/LEDE.
I'll merge your patch into our local patch-queue and submit it together
with the ePA code once it got some more testing.

Cheers

Daniel

Patchworkers: consider this to be a request to defer this submission.


On Thu, May 18, 2017 at 12:42:14PM +0200, Tom Psyborg wrote:
> Use chanreg and dccal helpers to reduce the size of ePA code.
> 
> Signed-off-by: Tomislav Požega 
> 
> ---


Re: [PATCH] rt2x00: improve calling conventions for register accessors

2017-05-15 Thread Daniel Golle
On Mon, May 15, 2017 at 10:40:52AM -0400, David Miller wrote:
> From: Arnd Bergmann <a...@arndb.de>
> Date: Mon, 15 May 2017 16:36:45 +0200
> 
> > On Mon, May 15, 2017 at 4:28 PM, Stanislaw Gruszka <sgrus...@redhat.com> 
> > wrote:
> >> On Mon, May 15, 2017 at 03:46:55PM +0200, Arnd Bergmann wrote:
> >>> With CONFIG_KASAN enabled and gcc-7, we get a warning about rather high
> >>> stack usage (with a private patch set I have to turn on this warning,
> >>> which I intend to get into the next kernel release):
> >>>
> >>> wireless/ralink/rt2x00/rt2800lib.c: In function 
> >>> 'rt2800_bw_filter_calibration':
> >>> wireless/ralink/rt2x00/rt2800lib.c:7990:1: error: the frame size of 2144 
> >>> bytes is larger than 1536 bytes [-Werror=frame-larger-than=]
> >>>
> >>> The problem is that KASAN inserts a redzone around each local variable 
> >>> that
> >>> gets passed by reference, and the newly added function has a lot of them.
> >>> We can easily avoid that here by changing the calling convention to have
> >>> the output as the return value of the function. This should also results 
> >>> in
> >>> smaller object code, saving around 4KB in .text with KASAN, or 2KB without
> >>> KASAN.
> >>>
> >>> Fixes: 41977e86c984 ("rt2x00: add support for MT7620")
> >>> Signed-off-by: Arnd Bergmann <a...@arndb.de>
> >>> ---
> >>>  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 319 
> >>> +
> >>>  1 file changed, 164 insertions(+), 155 deletions(-)
> >>
> >> We have read(, ) calling convention since forever in rt2x00 and that
> >> was never a problem. I dislike to change that now to make some tools
> >> happy, I think problem should be fixed in the tools instead.
> > 
> > How about adding 'depends on !KASAN' in Kconfig instead?
> 
> Please let's not go down that route and make such facilities less
> useful due to decreased coverage.

Being the one to blame for submitting the patch adding most of the
problem's footprint: Arnd's change looks good to me and I believe it
should be merged.
This is the type of feedback I was hoping for when submitting all the
long-forgotten and rotting patches from OpenWrt's mac80211 driver
patches! Thanks to Arnd for your efforts!

Consider this as
Acked-by: Daniel Golle <dan...@makrotopia.org>
for Arnd's original patch (and for NOT adding 'depends on !KASAN')

Cheers


Daniel

> 
> Thanks.


[PATCH] rt2800: fix mt7620 E2 channel registers

2017-04-18 Thread Daniel Golle
From: Tomislav Požega <pozega.tomis...@gmail.com>

update RF register 47 and 54 values according to vendor driver

Signed-off-by: Tomislav Požega <pozega.tomis...@gmail.com>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 86cffee6876a..8585cdc3de53 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -8145,9 +8145,11 @@ static void rt2800_init_rfcsr_6352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3);
rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
-   rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69);
+   rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67);
+   rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69);
rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF);
-   rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20);
+   rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
+   rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20);
rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF);
rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C);
-- 
2.12.2



[PATCH] rt2800: fix mt7620 vco calibration registers

2017-04-18 Thread Daniel Golle
From: Tomislav Požega <pozega.tomis...@gmail.com>

Use register values from init LNA function instead of the ones from
restore LNA function. Apply register values based on rx path
configuration.

Signed-off-by: Tomislav Požega <pozega.tomis...@gmail.com>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 870bf315f98b..86cffee6876a 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4932,7 +4932,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
 
if (rt2x00_rt(rt2x00dev, RT6352)) {
-   if (rt2x00dev->default_ant.tx_chain_num == 1) {
+   if (rt2x00dev->default_ant.rx_chain_num == 1) {
rt2800_bbp_write(rt2x00dev, 91, 0x07);
rt2800_bbp_write(rt2x00dev, 95, 0x1A);
rt2800_bbp_write(rt2x00dev, 195, 128);
@@ -4953,8 +4953,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
}
 
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
-   rt2800_bbp_write(rt2x00dev, 75, 0x60);
-   rt2800_bbp_write(rt2x00dev, 76, 0x44);
+   rt2800_bbp_write(rt2x00dev, 75, 0x68);
+   rt2800_bbp_write(rt2x00dev, 76, 0x4C);
rt2800_bbp_write(rt2x00dev, 79, 0x1C);
rt2800_bbp_write(rt2x00dev, 80, 0x0C);
rt2800_bbp_write(rt2x00dev, 82, 0xB6);
-- 
2.12.2



[PATCH 2/2] rt2800: do VCO calibration after programming ALC

2017-04-17 Thread Daniel Golle
Somehow AP doesn't come up and the first scan fails if we don't do
VCO calibration every time.
The vendor driver duplicates the VCO calibration function into the
channel switching logic, we can do the same with less duplication.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 7135519a638c..870bf315f98b 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3407,6 +3407,8 @@ static void rt2800_config_alc(struct rt2x00_dev 
*rt2x00dev,
rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
}
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
+
+   rt2800_vco_calibration(rt2x00dev);
 }
 
 static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
-- 
2.12.2



[PATCH 1/2] rt2800: fix LNA gain assignment for MT7620

2017-04-17 Thread Daniel Golle
The base value used for MT7620 differs from Rt5392 which resulted in
quite bad RX signal quality. Fix this by using the correct base value as
well as the LNA calibration values for HT20.

Reported-by: Tom Psyborg <pozega.tomis...@gmail.com>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index ba06ac2d876d..7135519a638c 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3806,11 +3806,25 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
}
 
if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
+   reg = 0x10;
+   if (!conf_is_ht40(conf)) {
+   if (rt2x00_rt(rt2x00dev, RT6352) &&
+   rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+   reg |= 0x5;
+   } else {
+   reg |= 0xa;
+   }
+   }
rt2800_bbp_write(rt2x00dev, 195, 141);
-   rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 
0x1a);
+   rt2800_bbp_write(rt2x00dev, 196, reg);
 
/* AGC init */
-   reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * 
rt2x00dev->lna_gain;
+   if (rt2x00_rt(rt2x00dev, RT6352))
+   reg = 0x04;
+   else
+   reg = rf->channel <= 14 ? 0x1c : 0x24;
+
+   reg += 2 * rt2x00dev->lna_gain;
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
 
rt2800_iq_calibrate(rt2x00dev, rf->channel);
-- 
2.12.2



[PATCH v3] rt2x00: reverse external PA capability flag logic

2017-04-10 Thread Daniel Golle
Consequently refer to external PA instead of inverting the logic and
use an internal PA capability flag which is a bit confusing.
Currently this is used for Rt3352 only, but MT7620A also allows for an
external PA which will be supported by a follow up patch.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
v3: fix typo in assignment of rfcsr register 51, thanks to Stanislaw
v2: replace remaining use of int_pa_* variables

 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 40 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  4 +--
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 201b12ed90c6..ba06ac2d876d 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7014,9 +7014,9 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
 {
-   int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
+   int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+   int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1,
  >cap_flags);
u8 rfcsr;
 
@@ -7056,9 +7056,9 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
rfcsr = 0x01;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR34_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR34_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
@@ -7068,13 +7068,13 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
rfcsr = 0x52;
-   if (tx0_int_pa) {
+   if (!tx0_ext_pa) {
rt2x00_set_field8(, RFCSR41_BIT1, 1);
rt2x00_set_field8(, RFCSR41_BIT4, 1);
}
rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
rfcsr = 0x52;
-   if (tx1_int_pa) {
+   if (!tx1_ext_pa) {
rt2x00_set_field8(, RFCSR42_BIT1, 1);
rt2x00_set_field8(, RFCSR42_BIT4, 1);
}
@@ -7087,19 +7087,19 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
rfcsr = 0x2d;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR50_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR50_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
-   rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
-   rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
-   rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
-   rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
-   rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
+   rt2800_rfcsr_write(rt2x00dev, 51, (tx0_ext_pa ? 0x52 : 0x7f));
+   rt2800_rfcsr_write(rt2x00dev, 52, (tx0_ext_pa ? 0xc0 : 0x00));
+   rt2800_rfcsr_write(rt2x00dev, 53, (tx0_ext_pa ? 0xd2 : 0x52));
+   rt2800_rfcsr_write(rt2x00dev, 54, (tx0_ext_pa ? 0xc0 : 0x1b));
+   rt2800_rfcsr_write(rt2x00dev, 55, (tx1_ext_pa ? 0x52 : 0x7f));
+   rt2800_rfcsr_write(rt2x00dev, 56, (tx1_ext_pa ? 0xc0 : 0x00));
+   rt2800_rfcsr_write(rt2x00dev, 57, (tx0_ext_pa ? 0x49 : 0x52));
+   rt2800_rfcsr_write(rt2x00dev, 58, (tx1_ext_pa ? 0xc0 : 0x1b));
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
@@ -8782,13 +8782,13 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, );
 
if (rt2x00_rt(rt2x00dev, RT3352)) {
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
-   __set_bit(CAPABILITY_INTERNAL_PA_TX0,
+   __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTER

[PATCH v2] rt2x00: reverse external PA capability flag logic

2017-04-10 Thread Daniel Golle
Consequently refer to external PA instead of inverting the logic and
use an internal PA capability flag which is a bit confusing.
Currently this is used for Rt3352 only, but MT7620A also allows for an
external PA which will be supported by a follow up patch.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
v2: replace remaining use of int_pa_* variables

 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 40 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  4 +--
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 201b12ed90c6..3e7d84efcfc5 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7014,9 +7014,9 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
 {
-   int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
+   int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+   int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1,
  >cap_flags);
u8 rfcsr;
 
@@ -7056,9 +7056,9 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
rfcsr = 0x01;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR34_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR34_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
@@ -7068,13 +7068,13 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
rfcsr = 0x52;
-   if (tx0_int_pa) {
+   if (!tx0_ext_pa) {
rt2x00_set_field8(, RFCSR41_BIT1, 1);
rt2x00_set_field8(, RFCSR41_BIT4, 1);
}
rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
rfcsr = 0x52;
-   if (tx1_int_pa) {
+   if (!tx1_ext_pa) {
rt2x00_set_field8(, RFCSR42_BIT1, 1);
rt2x00_set_field8(, RFCSR42_BIT4, 1);
}
@@ -7087,19 +7087,19 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
rfcsr = 0x2d;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR50_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR50_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
-   rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
-   rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
-   rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
-   rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
-   rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
-   rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
+   rt2800_rfcsr_write(rt2x00dev, 51, (tx0_ext_pa ? 0x52 : 0x72));
+   rt2800_rfcsr_write(rt2x00dev, 52, (tx0_ext_pa ? 0xc0 : 0x00));
+   rt2800_rfcsr_write(rt2x00dev, 53, (tx0_ext_pa ? 0xd2 : 0x52));
+   rt2800_rfcsr_write(rt2x00dev, 54, (tx0_ext_pa ? 0xc0 : 0x1b));
+   rt2800_rfcsr_write(rt2x00dev, 55, (tx1_ext_pa ? 0x52 : 0x7f));
+   rt2800_rfcsr_write(rt2x00dev, 56, (tx1_ext_pa ? 0xc0 : 0x00));
+   rt2800_rfcsr_write(rt2x00dev, 57, (tx0_ext_pa ? 0x49 : 0x52));
+   rt2800_rfcsr_write(rt2x00dev, 58, (tx1_ext_pa ? 0xc0 : 0x1b));
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
@@ -8782,13 +8782,13 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, );
 
if (rt2x00_rt(rt2x00dev, RT3352)) {
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
-   __set_bit(CAPABILITY_INTERNAL_PA_TX0,
+   __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
-   __set_bit(CAPABILITY_INTERNAL_PA_TX1,
+ 

[PATCH] rt2x00: invert external PA capability flag logic

2017-04-09 Thread Daniel Golle
Consequently refer to external PA instead of inverting the logic and
use an internal PA capability flag which is a bit confusing.
Currently this is used for Rt3352 only, but MT7620A also allows for an
external PA which will be supported by a follow up patch.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 24 
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  4 ++--
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 201b12ed90c6..3e49df1607ff 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7014,9 +7014,9 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
 {
-   int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
+   int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+   int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1,
  >cap_flags);
u8 rfcsr;
 
@@ -7056,9 +7056,9 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
rfcsr = 0x01;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR34_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR34_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
@@ -7068,13 +7068,13 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
rfcsr = 0x52;
-   if (tx0_int_pa) {
+   if (!tx0_ext_pa) {
rt2x00_set_field8(, RFCSR41_BIT1, 1);
rt2x00_set_field8(, RFCSR41_BIT4, 1);
}
rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
rfcsr = 0x52;
-   if (tx1_int_pa) {
+   if (!tx1_ext_pa) {
rt2x00_set_field8(, RFCSR42_BIT1, 1);
rt2x00_set_field8(, RFCSR42_BIT4, 1);
}
@@ -7087,9 +7087,9 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
rfcsr = 0x2d;
-   if (!tx0_int_pa)
+   if (tx0_ext_pa)
rt2x00_set_field8(, RFCSR50_TX0_EXT_PA, 1);
-   if (!tx1_int_pa)
+   if (tx1_ext_pa)
rt2x00_set_field8(, RFCSR50_TX1_EXT_PA, 1);
rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
@@ -8782,13 +8782,13 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, );
 
if (rt2x00_rt(rt2x00dev, RT3352)) {
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
-   __set_bit(CAPABILITY_INTERNAL_PA_TX0,
+   __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
  >cap_flags);
-   if (!rt2x00_get_field16(eeprom,
+   if (rt2x00_get_field16(eeprom,
EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
-   __set_bit(CAPABILITY_INTERNAL_PA_TX1,
+   __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
  >cap_flags);
}
 
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 8fdd2f9726ee..1bc353eafe37 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -719,8 +719,8 @@ enum rt2x00_capability_flags {
CAPABILITY_DOUBLE_ANTENNA,
CAPABILITY_BT_COEXIST,
CAPABILITY_VCO_RECALIBRATION,
-   CAPABILITY_INTERNAL_PA_TX0,
-   CAPABILITY_INTERNAL_PA_TX1,
+   CAPABILITY_EXTERNAL_PA_TX0,
+   CAPABILITY_EXTERNAL_PA_TX1,
 };
 
 /*
-- 
2.12.1



[PATCH v3] rt2x00: add support for MT7620

2017-03-20 Thread Daniel Golle
From: Roman Yeryomin <ro...@advem.lv>

Basic support for MT7620 built-in wireless radio was added to
OpenWrt in r41441. It has seen some heavy cleaning and refactoring
since in order to match the Kernel's code quality standards.

Signed-off-by: Roman Yeryomin <ro...@advem.lv>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
Acked-by: Stanislaw Gruszka <sgrus...@redhat.com>
---
v3: rebase on corrected rt2800.h
v2: added RT6352 instead of checking against RF7620
cleaned up rf_vals_7620 and channel switching
cargo-cult ported bandwidth filter calibration
(feels fishy, but works)
fixed some typos in the comments

 drivers/net/wireless/ralink/rt2x00/Kconfig |2 +-
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  177 +++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1421 +++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h |4 +
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|1 +
 5 files changed, 1578 insertions(+), 27 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig 
b/drivers/net/wireless/ralink/rt2x00/Kconfig
index de62f5dcb62f..a1d1cfe214d2 100644
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
@@ -201,7 +201,7 @@ endif
 
 config RT2800SOC
tristate "Ralink WiSoC support"
-   depends on SOC_RT288X || SOC_RT305X
+   depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
select RT2X00_LIB_SOC
select RT2X00_LIB_MMIO
select RT2X00_LIB_CRYPTO
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index fd1dbd956bad..6a8c93fb6a43 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -79,6 +79,7 @@
 #define RF5372 0x5372
 #define RF5390 0x5390
 #define RF5392 0x5392
+#define RF7620 0x7620
 
 /*
  * Chipset revisions.
@@ -639,6 +640,24 @@
 #define RF_CSR_CFG_BUSYFIELD32(0x0002)
 
 /*
+ * MT7620 RF registers (reversed order)
+ */
+#define RF_CSR_CFG_DATA_MT7620 FIELD32(0xff00)
+#define RF_CSR_CFG_REGNUM_MT7620   FIELD32(0x03ff)
+#define RF_CSR_CFG_WRITE_MT7620FIELD32(0x0010)
+#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x0001)
+
+/* undocumented registers for calibration of new MAC */
+#define RF_CONTROL00x0518
+#define RF_BYPASS0 0x051c
+#define RF_CONTROL10x0520
+#define RF_BYPASS1 0x0524
+#define RF_CONTROL20x0528
+#define RF_BYPASS2 0x052c
+#define RF_CONTROL30x0530
+#define RF_BYPASS3 0x0534
+
+/*
  * EFUSE_CSR: RT30x0 EEPROM
  */
 #define EFUSE_CTRL 0x0580
@@ -1022,6 +1041,16 @@
 #define AUTOWAKEUP_CFG_AUTOWAKEFIELD32(0x8000)
 
 /*
+ * MIMO_PS_CFG: MIMO Power-save Configuration
+ */
+#define MIMO_PS_CFG0x1210
+#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x0001)
+#define MIMO_PS_CFG_MMPS_RX_ANT_NUMFIELD32(0x0006)
+#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x0008)
+#define MIMO_PS_CFG_RX_STBY_POLFIELD32(0x0010)
+#define MIMO_PS_CFG_RX_RX_STBY0FIELD32(0x0020)
+
+/*
  * EDCA_AC0_CFG:
  */
 #define EDCA_AC0_CFG   0x1300
@@ -1095,6 +1124,12 @@
 #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f0)
 #define TX_PWR_CFG_0_OFDM12_CH0FIELD32(0x0f00)
 #define TX_PWR_CFG_0_OFDM12_CH1FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_0B_1MBS_2MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_5MBS_11MBS   FIELD32(0xff00)
+#define TX_PWR_CFG_0B_6MBS_9MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_12MBS_18MBS  FIELD32(0xff00)
+
 
 /*
  * TX_PWR_CFG_1:
@@ -1117,6 +1152,11 @@
 #define TX_PWR_CFG_1_MCS0_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_1_MCS2_CH0  FIELD32(0x0f00)
 #define TX_PWR_CFG_1_MCS2_CH1  FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_1B_24MBS_36MBS  FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_48MBSFIELD32(0xff00)
+#define TX_PWR_CFG_1B_MCS0_MCS1FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_MCS2_MCS3FIELD32(0xff00)
 
 /*
  * TX_PWR_CFG_2:
@@ -1139,6 +1179,11 @@
 #define TX_PWR_CFG_2_MCS8_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f00)
 #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_2B_MCS4_MCS5FIELD32(0x00ff)
+#define TX_PWR_CFG_2B_MCS6_MCS7FIELD32(0xff00)
+#define TX_PWR_CFG_2B_MCS8_MCS9

Re: mac80211: rt2x00: add support for MT7620

2017-03-19 Thread Daniel Golle
On Thu, Mar 16, 2017 at 08:01:04AM +, Kalle Valo wrote:
> Daniel Golle <dan...@makrotopia.org> wrote:
> > From: Roman Yeryomin <ro...@advem.lv>
> > 
> > Basic support for MT7620 built-in wireless radio was added to
> > OpenWrt in r41441. It has seen some heavy cleaning and refactoring
> > since in order to match the Kernel's code quality standards.
> > 
> > Signed-off-by: Roman Yeryomin <ro...@advem.lv>
> > Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> > Acked-by: Stanislaw Gruszka <sgrus...@redhat.com>
> 
> I'll remove the "mac80211:" prefix during commit, that should be only used 
> with
> mac80211 patches.

Thanks, I forgot about changing the subject line for v2.
Also make sure that https://patchwork.kernel.org/patch/9612163/ gets
applied before this one, because it doesn't apply cleanly otherwise.


> 
> -- 
> https://patchwork.kernel.org/patch/9618995/
> 
> Documentation about submitting wireless patches and checking status
> from patchwork:
> 
> https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
> 


Re: [PATCH] mac80211: rt2x00: add support for MT7620

2017-03-11 Thread Daniel Golle
Hi again!

On Sat, Mar 11, 2017 at 08:30:23PM +0100, Daniel Golle wrote:
> From: Roman Yeryomin <ro...@advem.lv>
> 
> Basic support for MT7620 built-in wireless radio was added to
> OpenWrt in r41441. It has seen some heavy cleaning and refactoring
> since in order to match the Kernel's code quality standards.
> 
> Signed-off-by: Roman Yeryomin <ro...@advem.lv>
> Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> ---

Binaries for testing have been generated by LEDE's buildbot. Download
a build for your MT7620 board and try the updated patch
https://downloads.lede-project.org/snapshots/targets/ramips/mt7620/

(it's easy to recognize the updated patch because the chip is now
detected as RT6352 rather than RT5390)

Cheers


Daniel


[PATCH] mac80211: rt2x00: add support for MT7620

2017-03-11 Thread Daniel Golle
From: Roman Yeryomin <ro...@advem.lv>

Basic support for MT7620 built-in wireless radio was added to
OpenWrt in r41441. It has seen some heavy cleaning and refactoring
since in order to match the Kernel's code quality standards.

Signed-off-by: Roman Yeryomin <ro...@advem.lv>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
v2: added RT6352 instead of checking against RF7620
cleaned up rf_vals_7620 and channel switching
cargo-cult ported bandwidth filter calibration
(feels fishy, but works)
fixed some typos in the comments

tx_pin should only be modified as higher bits contain setting polarity
for external LNA and PA which should not be reset. If you believe it
would cause regressions, let's only read it for RT6352 and set it to 0
for all other chips.

 drivers/net/wireless/ralink/rt2x00/Kconfig |2 +-
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  177 +++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1421 +++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h |4 +
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|1 +
 5 files changed, 1578 insertions(+), 27 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig 
b/drivers/net/wireless/ralink/rt2x00/Kconfig
index de62f5dcb62f..a1d1cfe214d2 100644
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
@@ -201,7 +201,7 @@ endif
 
 config RT2800SOC
tristate "Ralink WiSoC support"
-   depends on SOC_RT288X || SOC_RT305X
+   depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
select RT2X00_LIB_SOC
select RT2X00_LIB_MMIO
select RT2X00_LIB_CRYPTO
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 480b08601785..67506da61a4c 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -79,6 +79,7 @@
 #define RF5372 0x5372
 #define RF5390 0x5390
 #define RF5392 0x5392
+#define RF7620 0x7620
 
 /*
  * Chipset revisions.
@@ -639,6 +640,24 @@
 #define RF_CSR_CFG_BUSYFIELD32(0x0002)
 
 /*
+ * MT7620 RF registers (reversed order)
+ */
+#define RF_CSR_CFG_DATA_MT7620 FIELD32(0xff00)
+#define RF_CSR_CFG_REGNUM_MT7620   FIELD32(0x03ff)
+#define RF_CSR_CFG_WRITE_MT7620FIELD32(0x0010)
+#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x0001)
+
+/* undocumented registers for calibration of new MAC */
+#define RF_CONTROL00x0518
+#define RF_BYPASS0 0x051c
+#define RF_CONTROL10x0520
+#define RF_BYPASS1 0x0524
+#define RF_CONTROL20x0528
+#define RF_BYPASS2 0x052c
+#define RF_CONTROL30x0530
+#define RF_BYPASS3 0x0534
+
+/*
  * EFUSE_CSR: RT30x0 EEPROM
  */
 #define EFUSE_CTRL 0x0580
@@ -1022,6 +1041,16 @@
 #define AUTOWAKEUP_CFG_AUTOWAKEFIELD32(0x8000)
 
 /*
+ * MIMO_PS_CFG: MIMO Power-save Configuration
+ */
+#define MIMO_PS_CFG0x1210
+#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x0001)
+#define MIMO_PS_CFG_MMPS_RX_ANT_NUMFIELD32(0x0006)
+#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x0008)
+#define MIMO_PS_CFG_RX_STBY_POLFIELD32(0x0010)
+#define MIMO_PS_CFG_RX_RX_STBY0FIELD32(0x0020)
+
+/*
  * EDCA_AC0_CFG:
  */
 #define EDCA_AC0_CFG   0x1300
@@ -1095,6 +1124,12 @@
 #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f0)
 #define TX_PWR_CFG_0_OFDM12_CH0FIELD32(0x0f00)
 #define TX_PWR_CFG_0_OFDM12_CH1FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_0B_1MBS_2MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_5MBS_11MBS   FIELD32(0xff00)
+#define TX_PWR_CFG_0B_6MBS_9MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_12MBS_18MBS  FIELD32(0xff00)
+
 
 /*
  * TX_PWR_CFG_1:
@@ -1117,6 +1152,11 @@
 #define TX_PWR_CFG_1_MCS0_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_1_MCS2_CH0  FIELD32(0x0f00)
 #define TX_PWR_CFG_1_MCS2_CH1  FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_1B_24MBS_36MBS  FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_48MBSFIELD32(0xff00)
+#define TX_PWR_CFG_1B_MCS0_MCS1FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_MCS2_MCS3FIELD32(0xff00)
 
 /*
  * TX_PWR_CFG_2:
@@ -1139,6 +1179,11 @@
 #define TX_PWR_CFG_2_MCS8_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f00)
 #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_2B_MCS4

[PATCH] mac80211: rt2x00: add support for MT7620

2017-03-10 Thread Daniel Golle
From: Roman Yeryomin <ro...@advem.lv>

Basic support for MT7620 built-in wireless radio was added to
OpenWrt in r41441. It has seen some heavy cleaning and refactoring
since in order to match the Kernel's code quality standards.

Signed-off-by: Roman Yeryomin <ro...@advem.lv>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/Kconfig |2 +-
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  150 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1081 +++-
 3 files changed, 1209 insertions(+), 24 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig 
b/drivers/net/wireless/ralink/rt2x00/Kconfig
index de62f5dcb62f..a1d1cfe214d2 100644
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
@@ -201,7 +201,7 @@ endif
 
 config RT2800SOC
tristate "Ralink WiSoC support"
-   depends on SOC_RT288X || SOC_RT305X
+   depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
select RT2X00_LIB_SOC
select RT2X00_LIB_MMIO
select RT2X00_LIB_CRYPTO
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index fd1dbd956bad..4f70c0889129 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -79,6 +79,7 @@
 #define RF5372 0x5372
 #define RF5390 0x5390
 #define RF5392 0x5392
+#define RF7620 0x7620
 
 /*
  * Chipset revisions.
@@ -639,6 +640,14 @@
 #define RF_CSR_CFG_BUSYFIELD32(0x0002)
 
 /*
+ * MT7620 RF registers (reversed order)
+ */
+#define RF_CSR_CFG_DATA_MT7620 FIELD32(0xff00)
+#define RF_CSR_CFG_REGNUM_MT7620   FIELD32(0x03ff)
+#define RF_CSR_CFG_WRITE_MT7620FIELD32(0x0010)
+#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x0001)
+
+/*
  * EFUSE_CSR: RT30x0 EEPROM
  */
 #define EFUSE_CTRL 0x0580
@@ -1022,6 +1031,16 @@
 #define AUTOWAKEUP_CFG_AUTOWAKEFIELD32(0x8000)
 
 /*
+ * MIMO_PS_CFG: MIMO Power-save Configuration
+ */
+#define MIMO_PS_CFG0x1210
+#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x0001)
+#define MIMO_PS_CFG_MMPS_RX_ANT_NUMFIELD32(0x0006)
+#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x0008)
+#define MIMO_PS_CFG_RX_STBY_POLFIELD32(0x0010)
+#define MIMO_PS_CFG_RX_RX_STBY0FIELD32(0x0020)
+
+/*
  * EDCA_AC0_CFG:
  */
 #define EDCA_AC0_CFG   0x1300
@@ -1095,6 +1114,12 @@
 #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f0)
 #define TX_PWR_CFG_0_OFDM12_CH0FIELD32(0x0f00)
 #define TX_PWR_CFG_0_OFDM12_CH1FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_0B_1MBS_2MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_5MBS_11MBS   FIELD32(0xff00)
+#define TX_PWR_CFG_0B_6MBS_9MBSFIELD32(0x00ff)
+#define TX_PWR_CFG_0B_12MBS_18MBS  FIELD32(0xff00)
+
 
 /*
  * TX_PWR_CFG_1:
@@ -1117,6 +1142,11 @@
 #define TX_PWR_CFG_1_MCS0_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_1_MCS2_CH0  FIELD32(0x0f00)
 #define TX_PWR_CFG_1_MCS2_CH1  FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_1B_24MBS_36MBS  FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_48MBSFIELD32(0xff00)
+#define TX_PWR_CFG_1B_MCS0_MCS1FIELD32(0x00ff)
+#define TX_PWR_CFG_1B_MCS2_MCS3FIELD32(0xff00)
 
 /*
  * TX_PWR_CFG_2:
@@ -1139,6 +1169,11 @@
 #define TX_PWR_CFG_2_MCS8_CH1  FIELD32(0x00f0)
 #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f00)
 #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_2B_MCS4_MCS5FIELD32(0x00ff)
+#define TX_PWR_CFG_2B_MCS6_MCS7FIELD32(0xff00)
+#define TX_PWR_CFG_2B_MCS8_MCS9FIELD32(0x00ff)
+#define TX_PWR_CFG_2B_MCS10_MCS11  FIELD32(0xff00)
 
 /*
  * TX_PWR_CFG_3:
@@ -1161,6 +1196,11 @@
 #define TX_PWR_CFG_3_STBC0_CH1 FIELD32(0x00f0)
 #define TX_PWR_CFG_3_STBC2_CH0 FIELD32(0x0f00)
 #define TX_PWR_CFG_3_STBC2_CH1 FIELD32(0xf000)
+/* bits for new 2T devices */
+#define TX_PWR_CFG_3B_MCS12_MCS13  FIELD32(0x00ff)
+#define TX_PWR_CFG_3B_MCS14FIELD32(0xff00)
+#define TX_PWR_CFG_3B_STBC_MCS0_MCS1   FIELD32(0x00ff)
+#define TX_PWR_CFG_3B_STBC_MCS2_MSC3   FIELD32(0xff00)
 
 /*
  * TX_PWR_CFG_4:
@@ -1175,6 +1215,9 @@
 #define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x00f0)
 #define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x0f00)
 #define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0xf000)
+/* bits for new 2T devices */
+#define 

[PATCH] rt2x00: fix TX_PWR_CFG_4 register definition

2017-03-08 Thread Daniel Golle
Some of the macros used to describe the TX_PWR_CFG_4 register accidentally
refer to TX_PWR_CFG_3, probably a copy error. Fix that.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 480b08601785..fd1dbd956bad 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -1171,10 +1171,10 @@
 #define TX_PWR_CFG_4_UKNOWN7   FIELD32(0x0f00)
 #define TX_PWR_CFG_4_UKNOWN8   FIELD32(0xf000)
 /* bits for 3T devices */
-#define TX_PWR_CFG_3_STBC4_CH0 FIELD32(0x000f)
-#define TX_PWR_CFG_3_STBC4_CH1 FIELD32(0x00f0)
-#define TX_PWR_CFG_3_STBC6_CH0 FIELD32(0x0f00)
-#define TX_PWR_CFG_3_STBC6_CH1 FIELD32(0xf000)
+#define TX_PWR_CFG_4_STBC4_CH0 FIELD32(0x000f)
+#define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x00f0)
+#define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x0f00)
+#define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0xf000)
 
 /*
  * TX_PIN_CFG:
-- 
2.11.1



Re: [PATCH v4 0/3] rt2x00: RT5350 support

2017-01-20 Thread Daniel Golle
Hi Stanislaw,

On Fri, Jan 20, 2017 at 02:28:23PM +0100, Stanislaw Gruszka wrote:
> Repost patches from Daniel with updated clock handling and
> correct author of RT5350 patch.
> 
> Note I did not test patches on SOC devices, but getting
> clock frequency is simple and should be trouble-free.

Thanks a lot for handling this!
And big thanks to everyone involved for reviewing a smelly pile of
patches we had rotting here for half a decade...

Would you like me to re-work and re-submit the remaining patches needed
to support RT3883 and RF3853?

Otherwise, the next thing I'd have in mind would be to add device-tree
bindings to handle in-flash EEPROM loading, see the patches 60[2-9]* in
https://git.lede-project.org/?p=source.git;a=tree;f=package/kernel/mac80211/patches

Imho having only support for MTD partitions and skip support for
requesting firmware files from userspace for now would be the cleanest
way towards proper WiSoC support in vanilla kernels.
Obviously our existing patches need to be reworked and stuff needs to
be added to Documentation/devicetree/bindings.
Support for non-device-tree legacy platforms which need platform_data
and legacy EEPROM loading mechanism can remain a local patch in our
tree until those will no longer be needed.
Does everybody agree with this general direction?

John, Mathias: Are you going to rework and upstream your work to
support loading in-flash EEPROM yourself our would you like me to give
it a shot?


Cheers


Daniel



> 
> Daniel Golle (1):
>   rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal
> 
> Serge Vasilugin (1):
>   rt2x00: add support for RT5350 WiSoC
> 
> Stanislaw Gruszka (1):
>   rt2x00: add copy of clk for soc devices
> 
>  drivers/net/wireless/ralink/rt2x00/rt2800.h|   1 +
>  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 156 
> +++--
>  drivers/net/wireless/ralink/rt2x00/rt2x00.h|   5 +
>  drivers/net/wireless/ralink/rt2x00/rt2x00soc.c |   1 +
>  4 files changed, 155 insertions(+), 8 deletions(-)
> 
> -- 
> 1.8.3.1
> 


Re: [PATCH v4 1/3] rt2x00: add copy of clk for soc devices

2017-01-20 Thread Daniel Golle
On Fri, Jan 20, 2017 at 02:28:24PM +0100, Stanislaw Gruszka wrote:
> Since clk_get() is not trivial add copy of clk pointer to rt2x00dev
> for System On Chip devices and initialize it on probe routine.
> 
> Signed-off-by: Stanislaw Gruszka <sgrus...@redhat.com>
Acked-by: Daniel Golle <dan...@makrotopia.org>


[PATCH v3] rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal

2017-01-19 Thread Daniel Golle
On Rt3352 the driver needs to know the frequency of an external
crystal which can be either 40 MHz (as on all other WiSoCs until now)
or 20 MHz.
Get the clock attached by ramips WiSoC platform code which probes
SYSC_REG_SYSCFG (added by John Crispin in commit 6ac8579b96e3b) and
introduce a new flag clk_is_20mhz in struct hw_mode_spec to make the
driver aware and use either 40 MHz or 20 MHz specific rf_vals on those
WiSoC platforms.
The introduced support for boards with a 20 MHz crystal is also needed
for RT5350.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Mathias Kresin <d...@kresin.me>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 50 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 ++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 8ea844d35ecb..c33298baecc3 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "rt2x00.h"
 #include "rt2800lib.h"
@@ -7426,6 +7427,27 @@ static const struct rf_channel rf_vals_3x[] = {
{173, 0x61, 0, 9},
 };
 
+/*
+ * RF value list for rt3xxx with Xtal20MHz
+ * Supports: 2.4 GHz (all) (RF3322)
+ */
+static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
+   {1,0xE2, 2,  0x14},
+   {2,0xE3, 2,  0x14},
+   {3,0xE4, 2,  0x14},
+   {4,0xE5, 2,  0x14},
+   {5,0xE6, 2,  0x14},
+   {6,0xE7, 2,  0x14},
+   {7,0xE8, 2,  0x14},
+   {8,0xE9, 2,  0x14},
+   {9,0xEA, 2,  0x14},
+   {10,   0xEB, 2,  0x14},
+   {11,   0xEC, 2,  0x14},
+   {12,   0xED, 2,  0x14},
+   {13,   0xEE, 2,  0x14},
+   {14,   0xF0, 2,  0x18},
+};
+
 static const struct rf_channel rf_vals_5592_xtal20[] = {
/* Channel, N, K, mod, R */
{1, 482, 4, 10, 3},
@@ -7654,7 +7676,10 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
*rt2x00dev)
case RF5390:
case RF5392:
spec->num_channels = 14;
-   spec->channels = rf_vals_3x;
+   if (spec->clk_is_20mhz)
+   spec->channels = rf_vals_xtal20mhz_3x;
+   else
+   spec->channels = rf_vals_3x;
break;
 
case RF3052:
@@ -7835,6 +7860,20 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
return 0;
 }
 
+int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
+{
+   struct hw_mode_spec *spec = >spec;
+   struct clk *clk = clk_get(rt2x00dev->dev, NULL);
+
+   if (IS_ERR(clk))
+   return PTR_ERR(clk);
+
+   if (clk_get_rate(clk) == 2000)
+   spec->clk_is_20mhz = 1;
+
+   return 0;
+}
+
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
int retval;
@@ -7864,6 +7903,15 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
 
/*
+* Probe SoC clock.
+*/
+   if (rt2x00_is_soc(rt2x00dev)) {
+   retval = rt2800_probe_clk(rt2x00dev);
+   if (retval)
+   return retval;
+   }
+
+   /*
 * Initialize hw specifications.
 */
retval = rt2800_probe_hw_mode(rt2x00dev);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index bea7ac30522f..4b3dd1163653 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -400,6 +400,7 @@ static inline struct rt2x00_intf* vif_to_intf(struct 
ieee80211_vif *vif)
  * @channels: Device/chipset specific channel values (See  rf_channel).
  * @channels_info: Additional information for channels (See  
channel_info).
  * @ht: Driver HT Capabilities (See _sta_ht_cap).
+ * @clk_is_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz
  */
 struct hw_mode_spec {
unsigned int supported_bands;
@@ -415,6 +416,7 @@ struct hw_mode_spec {
const struct channel_info *channels_info;
 
struct ieee80211_sta_ht_cap ht;
+   int clk_is_20mhz;
 };
 
 /*
-- 
2.11.0



Re: [PATCH v2 13/14] rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal

2017-01-19 Thread Daniel Golle
On Thu, Jan 19, 2017 at 02:30:14PM +0100, Daniel Golle wrote:
> Hi Stanislaw,
> 
> On Wed, Jan 18, 2017 at 03:30:02PM +0100, Stanislaw Gruszka wrote:
> > On Mon, Jan 16, 2017 at 04:15:56AM +0100, Daniel Golle wrote:
> > > Signed-off-by: Gabor Juhos <juh...@openwrt.org>
> > > Signed-off-by: Mathias Kresin <d...@kresin.me>
> > > Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> > > ---
> > >  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 50 
> > > +-
> > >  drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 ++
> > >  2 files changed, 51 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> > > b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > index 93c97eade334..cb1457595f05 100644
> > > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > > @@ -36,6 +36,7 @@
> > >  #include 
> > >  #include 
> > >  #include 
> > > +#include 
> > >  
> > >  #include "rt2x00.h"
> > >  #include "rt2800lib.h"
> > > @@ -7675,6 +7676,27 @@ static const struct rf_channel 
> > > rf_vals_5592_xtal40[] = {
> > >   {196, 83, 0, 12, 1},
> > >  };
> > >  
> > > +/*
> > > + * RF value list for rt3xxx with Xtal20MHz
> > > + * Supports: 2.4 GHz (all) (RF3322)
> > > + */
> > > +static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
> > Please locate this values in alphabetical order (i.e. after _3x and 
> > before _5592 ).
> 
> Sure, sorry, that ended up in the wrong order when rebase the patches.
> 
> > 
> > >   struct hw_mode_spec *spec = >spec;
> > > @@ -7764,7 +7786,10 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
> > > *rt2x00dev)
> > >   case RF5390:
> > >   case RF5392:
> > >   spec->num_channels = 14;
> > > - spec->channels = rf_vals_3x;
> > > + if (spec->clk_is_20mhz)
> > > + spec->channels = rf_vals_xtal20mhz_3x;
> > > + else
> > > + spec->channels = rf_vals_3x;
> > >   break;
> > 
> > How does vendor drivers recognize xtal (I assume rf_vals_xtal20mhz_3x 
> > values were taken from vendor driver) ? It should be possible to get
> > clock frequency from device register like is is done on RF5592, without
> > adding additional clock recognition code. But if such code is needed
> > I prefer that low level board/platform routines do it and place clock
> > frequency for rt2x00 in rt2x00dev->dev->platform_data.

I researched and found this has already been implemented in the ramips
platform code, see

https://git.kernel.org/cgit/linux/kernel/git/kvalo/wireless-drivers-next.git/tree/arch/mips/ralink/rt305x.c#n194

The patch submitted uses this existing infrastructure which *does*
auto-probe the clock from the SoC's SYSCTRL register.
I'll re-submit a v3 with the alphabetic order above fixed, ok?


Cheers


Daniel


Re: [PATCH v3] rt2x00: add support for RT5350 WiSoC

2017-01-19 Thread Daniel Golle
On Thu, Jan 19, 2017 at 09:08:34PM +0200, Kalle Valo wrote:
> Daniel Golle <dan...@makrotopia.org> writes:
> 
> > From: Michel Stempin <michel.stem...@wanadoo.fr>
> >
> > Support for the RT5350 WiSoC was added to OpenWrt after having a
> > lengthy debate about the legality of the original submission, see
> > https://lists.openwrt.org/pipermail/openwrt-devel/2013-January/018224.html
> > MTK/Ralink Acked replied and says we can merge this patch under the GPL.
> > https://dev.openwrt.org/changeset/36177
> >
> > Signed-off-by: Serge Vasilugin <vasilu...@yandex.ru>
> > Tested-by: Michel Stempin <michel.stem...@wanadoo.fr>
> > Acked-by: John Crispin <blo...@openwrt.org>
> > [dan...@makrotopia.org: added commit message, cleaned up code]
> >
> > Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> > ---
> > v2: reordered patches to breakout RT3883 from the original series
> > v3: remove superflus EEPROM_NIC_CONF0 mangeling from RT5350 patch
> 
> As this is not part of the patch series I assume this patch doesn't have
> any dependencies and can be applied separately (if Stanislaw acks it).

Well, oops, it does depend on
https://patchwork.kernel.org/patch/9518023/
being merged first, at least partially.
Sorry for the mess...


Cheers


Daniel


Re: [PATCH v2 13/14] rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal

2017-01-19 Thread Daniel Golle
Hi Stanislaw,

On Wed, Jan 18, 2017 at 03:30:02PM +0100, Stanislaw Gruszka wrote:
> On Mon, Jan 16, 2017 at 04:15:56AM +0100, Daniel Golle wrote:
> > Signed-off-by: Gabor Juhos <juh...@openwrt.org>
> > Signed-off-by: Mathias Kresin <d...@kresin.me>
> > Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> > ---
> >  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 50 
> > +-
> >  drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 ++
> >  2 files changed, 51 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
> > b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > index 93c97eade334..cb1457595f05 100644
> > --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
> > @@ -36,6 +36,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  
> >  #include "rt2x00.h"
> >  #include "rt2800lib.h"
> > @@ -7675,6 +7676,27 @@ static const struct rf_channel rf_vals_5592_xtal40[] 
> > = {
> > {196, 83, 0, 12, 1},
> >  };
> >  
> > +/*
> > + * RF value list for rt3xxx with Xtal20MHz
> > + * Supports: 2.4 GHz (all) (RF3322)
> > + */
> > +static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
> Please locate this values in alphabetical order (i.e. after _3x and 
> before _5592 ).

Sure, sorry, that ended up in the wrong order when rebase the patches.

> 
> > struct hw_mode_spec *spec = >spec;
> > @@ -7764,7 +7786,10 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
> > *rt2x00dev)
> > case RF5390:
> > case RF5392:
> > spec->num_channels = 14;
> > -   spec->channels = rf_vals_3x;
> > +   if (spec->clk_is_20mhz)
> > +   spec->channels = rf_vals_xtal20mhz_3x;
> > +   else
> > +   spec->channels = rf_vals_3x;
> > break;
> 
> How does vendor drivers recognize xtal (I assume rf_vals_xtal20mhz_3x 
> values were taken from vendor driver) ? It should be possible to get
> clock frequency from device register like is is done on RF5592, without
> adding additional clock recognition code. But if such code is needed
> I prefer that low level board/platform routines do it and place clock
> frequency for rt2x00 in rt2x00dev->dev->platform_data.

Recent vendor drivers probe the clock by reading a SYSCTL register:
---
// Programming channel parameters
Value = (*((volatile u32 *)(RALINK_SYSCTL_BASE + 0x10)));
if(Value & (1<<20)) { //Xtal=40M
RT30xxWriteRFRegister(pAd, RF_R08, FreqItems3020[index].N);
RT30xxWriteRFRegister(pAd, RF_R09, FreqItems3020[index].K);
}else {
RT30xxWriteRFRegister(pAd, RF_R08, FreqItems3020_Xtal20M[index].N);
RT30xxWriteRFRegister(pAd, RF_R09, FreqItems3020_Xtal20M[index].K);
}
---

>From what I can see, most other drivers which need to touch SYSCTL
currently do that by defining a local precompiler macro:
---
#ifdef CONFIG_SOC_MT7621
#define RALINK_SYSCTL_BASE 0xbe00
#else
#define RALINK_SYSCTL_BASE 0xb000
#endif
---

That's obviously not very elegant and probably we should define SYSCTL
in the device tree of each SoC and we should write/adapt a syscon mfd
driver which other drivers may then use to read/write stuff to/from
SYSCTL. The clock could then be provided by a clk driver sitting on top
of that and rt2x00 would use that clock.
In the meantime, why not just define a static clock in the device-tree
and already have rt2x00 consume that clock? That would already be the
way things will most likely look like from rt2x00 point of view once
syscon and clk drivers are in place.


Cheers


Daniel


Re: [PATCH v2 09/14] rt2x00: rt2x00pci: set PCI MWI only if supported

2017-01-16 Thread Daniel Golle
On Mon, Jan 16, 2017 at 11:08:57AM +0100, Stanislaw Gruszka wrote:
> On Mon, Jan 16, 2017 at 04:06:25AM +0100, Daniel Golle wrote:
> > From: Claudio Mignanti <c.migna...@gmail.com>
> > 
> > This is needed for devices without support for PCI MWI. See also
> > https://dev.openwrt.org/changeset/21850
> > 
> > Signed-off-by: Daniel Golle <dan...@makrotopia.org>
> > ---
> >  drivers/net/wireless/ralink/rt2x00/rt2x00pci.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c 
> > b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
> > index eb6dbcd4fddf..4becfeb75ba8 100644
> > --- a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
> > +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
> > @@ -94,8 +94,10 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const 
> > struct rt2x00_ops *ops)
> >  
> > pci_set_master(pci_dev);
> >  
> > +#ifdef CONFIG_PCI_SET_MWI
> > if (pci_set_mwi(pci_dev))
> > rt2x00_probe_err("MWI not available\n");
> > +#endif
> 
> There is no CONFIG_PCI_SET_MWI in the kernel. This patch is either not
> needed (pci subsystem has own PCI_DISABLE_MWI define) or wrong (we
> should not call this function for some devices).

Apparently we thus never enabled MWI on PCI devices. John Crispin has
started to investigate why this patch was needed in first place, see
http://lists.infradead.org/pipermail/lede-dev/2017-January/005400.html

I suggest to drop it entirely until we figure out why it wasn't safe to
use MWI at least on some platforms. Once we know more there might be
a follow-up to selectively have the precompiler skip pci_set_mwi in
case we really still need to do this.
Aparently this was originally related to a compiler error on Kernel
2.6.30 when trying to build for Rt305x WiSoC platforms (which simply
do not have any PCI bus and probably explicite support for SoC devices
wasn't implemented in rt2x00 at the time).


Cheers


Daniel

> 
> Stanislaw


Re: [PATCH v2 14/14] rt2x00: add support for RT5350 WiSoC

2017-01-16 Thread Daniel Golle
On Mon, Jan 16, 2017 at 11:17:44AM +0100, Stanislaw Gruszka wrote:
> On Mon, Jan 16, 2017 at 04:17:58AM +0100, Daniel Golle wrote:
> > @@ -7131,6 +7236,12 @@ static int rt2800_validate_eeprom(struct rt2x00_dev 
> > *rt2x00dev)
> > rt2x00_set_field16(, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
> > rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
> > rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
> > +   } else if (rt2x00_rt(rt2x00dev, RT5350)) {
> > +   rt2x00_set_field16(, EEPROM_NIC_CONF0_RXPATH, 1);
> > +   rt2x00_set_field16(, EEPROM_NIC_CONF0_TXPATH, 1);
> > +   rt2x00_set_field16(, EEPROM_NIC_CONF0_RF_TYPE, RF3320);

Good catch. This line was probably left over when trying to implement
support for RT5350 based on adding codepaths to RF3320 which ended up
messy... As EEPROM_NIC_CONF0_RF_TYPE aparently isn't used anywhere else
in the code apart from setting rf type which is later on overwritten
for RT5350 anyway. So no need to set it at all. I suggest to simply
drop that line.

> 
> Here you set RF3320 ..
> > +   rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
> > +   rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
> > } else if (rt2x00_rt(rt2x00dev, RT2860) ||
> >rt2x00_rt(rt2x00dev, RT2872)) {
> > /*
> > @@ -7265,6 +7376,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
> > *rt2x00dev)
> > rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, );
> > else if (rt2x00_rt(rt2x00dev, RT3352))
> > rf = RF3322;
> > +   else if (rt2x00_rt(rt2x00dev, RT5350))
> > +   rf = RF5350;
> 
> and here RF5350. This does not seems to be correct.
> 
> Stanislaw


[PATCH v2 14/14] rt2x00: add support for RT5350 WiSoC

2017-01-15 Thread Daniel Golle
From: Michel Stempin <michel.stem...@wanadoo.fr>

Support for the RT5350 WiSoC was added to OpenWrt after having a
lengthy debate about the legality of the original submission, see
https://lists.openwrt.org/pipermail/openwrt-devel/2013-January/018224.html
MTK/Ralink Acked replied and says we can merge this patch under the GPL.
https://dev.openwrt.org/changeset/36177

Signed-off-by: Serge Vasilugin <vasilu...@yandex.ru>
Tested-by: Michel Stempin <michel.stem...@wanadoo.fr>
Acked-by: John Crispin <blo...@openwrt.org>
[dan...@makrotopia.org: added commit message, fixed code formatting]

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|   1 +
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 131 +++--
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|   1 +
 3 files changed, 126 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index e5110d24c0d7..7d101334d9f7 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -72,6 +72,7 @@
 #define RF5592 0x000f
 #define RF3070 0x3070
 #define RF3290 0x3290
+#define RF5350 0x5350
 #define RF5360 0x5360
 #define RF5362 0x5362
 #define RF5370 0x5370
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index cb1457595f05..709930ecb0d8 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -2838,6 +2838,13 @@ static void rt2800_config_channel_rf53xx(struct 
rt2x00_dev *rt2x00dev,
 
rt2800_rfcsr_write(rt2x00dev, 59,
   r59_non_bt[idx]);
+   } else if (rt2x00_rt(rt2x00dev, RT5350)) {
+   static const char r59_non_bt[] = {0x0b, 0x0b,
+   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
+   0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
+
+   rt2800_rfcsr_write(rt2x00dev, 59,
+  r59_non_bt[idx]);
}
}
}
@@ -3275,6 +3282,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
break;
case RF3070:
+   case RF5350:
case RF5360:
case RF5362:
case RF5370:
@@ -3293,6 +3301,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
if (rt2x00_rf(rt2x00dev, RF3070) ||
rt2x00_rf(rt2x00dev, RF3290) ||
rt2x00_rf(rt2x00dev, RF3322) ||
+   rt2x00_rf(rt2x00dev, RF5350) ||
rt2x00_rf(rt2x00dev, RF5360) ||
rt2x00_rf(rt2x00dev, RF5362) ||
rt2x00_rf(rt2x00dev, RF5370) ||
@@ -3550,7 +3559,8 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
/*
 * Clear update flag
 */
-   if (rt2x00_rt(rt2x00dev, RT3352)) {
+   if (rt2x00_rt(rt2x00dev, RT3352) ||
+   rt2x00_rt(rt2x00dev, RT5350)) {
rt2800_bbp_read(rt2x00dev, 49, );
rt2x00_set_field8(, BBP49_UPDATE_FLAG, 0);
rt2800_bbp_write(rt2x00dev, 49, bbp);
@@ -4431,6 +4441,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
case RF3053:
case RF3070:
case RF3290:
+   case RF5350:
case RF5360:
case RF5362:
case RF5370:
@@ -4837,6 +4848,8 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x);
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x);
+   } else if (rt2x00_rt(rt2x00dev, RT5350)) {
+   rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
} else {
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
@@ -5488,9 +5501,13 @@ static void rt2800_init_bbp_3352(struct rt2x00_dev 
*rt2x00dev)
 
rt2800_bbp_write(rt2x00dev, 82, 0x62);
 
-   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
-
-   rt2800_bbp_write(rt2x00dev, 84, 0x99);
+   if (rt2x00_rt(rt2x00dev, RT5350)) {
+   rt2800_bbp_write(rt2x00dev, 83, 0x7a);
+   rt2800_bbp_write(rt2x00dev, 84, 0x9a);
+   } else {
+   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
+   rt2800_bbp_write(rt2x00dev, 84, 0x99);
+   }
 
rt2800_bbp_write(rt2x00dev, 86

[PATCH v2 13/14] rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal

2017-01-15 Thread Daniel Golle
Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Mathias Kresin <d...@kresin.me>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 50 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 ++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 93c97eade334..cb1457595f05 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "rt2x00.h"
 #include "rt2800lib.h"
@@ -7675,6 +7676,27 @@ static const struct rf_channel rf_vals_5592_xtal40[] = {
{196, 83, 0, 12, 1},
 };
 
+/*
+ * RF value list for rt3xxx with Xtal20MHz
+ * Supports: 2.4 GHz (all) (RF3322)
+ */
+static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
+   {1,0xE2, 2,  0x14},
+   {2,0xE3, 2,  0x14},
+   {3,0xE4, 2,  0x14},
+   {4,0xE5, 2,  0x14},
+   {5,0xE6, 2,  0x14},
+   {6,0xE7, 2,  0x14},
+   {7,0xE8, 2,  0x14},
+   {8,0xE9, 2,  0x14},
+   {9,0xEA, 2,  0x14},
+   {10,   0xEB, 2,  0x14},
+   {11,   0xEC, 2,  0x14},
+   {12,   0xED, 2,  0x14},
+   {13,   0xEE, 2,  0x14},
+   {14,   0xF0, 2,  0x18},
+};
+
 static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
struct hw_mode_spec *spec = >spec;
@@ -7764,7 +7786,10 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
*rt2x00dev)
case RF5390:
case RF5392:
spec->num_channels = 14;
-   spec->channels = rf_vals_3x;
+   if (spec->clk_is_20mhz)
+   spec->channels = rf_vals_xtal20mhz_3x;
+   else
+   spec->channels = rf_vals_3x;
break;
 
case RF3052:
@@ -7945,6 +7970,20 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
return 0;
 }
 
+int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
+{
+   struct hw_mode_spec *spec = >spec;
+   struct clk *clk = clk_get(rt2x00dev->dev, NULL);
+
+   if (IS_ERR(clk))
+   return PTR_ERR(clk);
+
+   if (clk_get_rate(clk) == 2000)
+   spec->clk_is_20mhz = 1;
+
+   return 0;
+}
+
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
@@ -7985,6 +8024,15 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
 
/*
+* Probe SoC clock.
+*/
+   if (rt2x00_is_soc(rt2x00dev)) {
+   retval = rt2800_probe_clk(rt2x00dev);
+   if (retval)
+   return retval;
+   }
+
+   /*
 * Initialize hw specifications.
 */
retval = rt2800_probe_hw_mode(rt2x00dev);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index cfbf414c2627..b1eec49b0dac 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -400,6 +400,7 @@ static inline struct rt2x00_intf* vif_to_intf(struct 
ieee80211_vif *vif)
  * @channels: Device/chipset specific channel values (See  rf_channel).
  * @channels_info: Additional information for channels (See  
channel_info).
  * @ht: Driver HT Capabilities (See _sta_ht_cap).
+ * @clk_is_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz
  */
 struct hw_mode_spec {
unsigned int supported_bands;
@@ -415,6 +416,7 @@ struct hw_mode_spec {
const struct channel_info *channels_info;
 
struct ieee80211_sta_ht_cap ht;
+   int clk_is_20mhz;
 };
 
 /*
-- 
2.11.0



[PATCH v2 12/14] rt2x00: rt2800lib: support for for RT3352 with external PA

2017-01-15 Thread Daniel Golle
This is needed for WiFi to work e.g. on DIR-615 rev.H1 which got
external RF power amplifiers connected to the WiSoC.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
Signed-off-by: Gabor Juhos <juh...@openwrt.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 24 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 76 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 +
 3 files changed, 89 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 8024fc1a6ae2..e5110d24c0d7 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2320,6 +2320,12 @@ struct mac_iveiv_entry {
 #define RFCSR36_RF_BS  FIELD8(0x80)
 
 /*
+ * RFCSR 34:
+ */
+#define RFCSR34_TX0_EXT_PA FIELD8(0x04)
+#define RFCSR34_TX1_EXT_PA FIELD8(0x08)
+
+/*
  * RFCSR 38:
  */
 #define RFCSR38_RX_LO1_EN  FIELD8(0x20)
@@ -2331,6 +2337,18 @@ struct mac_iveiv_entry {
 #define RFCSR39_RX_LO2_EN  FIELD8(0x80)
 
 /*
+ * RFCSR 41:
+ */
+#define RFCSR41_BIT1   FIELD8(0x01)
+#define RFCSR41_BIT4   FIELD8(0x08)
+
+/*
+ * RFCSR 42:
+ */
+#define RFCSR42_BIT1   FIELD8(0x01)
+#define RFCSR42_BIT4   FIELD8(0x08)
+
+/*
  * RFCSR 49:
  */
 #define RFCSR49_TX FIELD8(0x3f)
@@ -2343,6 +2361,8 @@ struct mac_iveiv_entry {
  * RFCSR 50:
  */
 #define RFCSR50_TX FIELD8(0x3f)
+#define RFCSR50_TX0_EXT_PA FIELD8(0x02)
+#define RFCSR50_TX1_EXT_PA FIELD8(0x10)
 #define RFCSR50_EP FIELD8(0xc0)
 /* bits for RT3593 */
 #define RFCSR50_TX_LO1_EN  FIELD8(0x20)
@@ -2490,6 +2510,8 @@ enum rt2800_eeprom_word {
  * INTERNAL_TX_ALC: 0: disable, 1: enable
  * BT_COEXIST: 0: disable, 1: enable
  * DAC_TEST: 0: disable, 1: enable
+ * EXTERNAL_TX0_PA: 0: disable, 1: enable (only on RT3352)
+ * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352)
  */
 #define EEPROM_NIC_CONF1_HW_RADIO  FIELD16(0x0001)
 #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC   FIELD16(0x0002)
@@ -2506,6 +2528,8 @@ enum rt2800_eeprom_word {
 #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC   FIELD16(0x2000)
 #define EEPROM_NIC_CONF1_BT_COEXISTFIELD16(0x4000)
 #define EEPROM_NIC_CONF1_DAC_TEST  FIELD16(0x8000)
+#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352  FIELD16(0x4000)
+#define EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352  FIELD16(0x8000)
 
 /*
  * EEPROM frequency
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 366310011491..93c97eade334 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3320,11 +3320,18 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
/*
 * Change BBP settings
 */
+
if (rt2x00_rt(rt2x00dev, RT3352)) {
+   rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
+
rt2800_bbp_write(rt2x00dev, 27, 0x0);
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 27, 0x20);
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 86, 0x38);
+   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
} else if (rt2x00_rt(rt2x00dev, RT3593)) {
if (rf->channel > 14) {
/* Disable CCK Packet detection on 5GHz */
@@ -6296,6 +6303,12 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
 {
+   int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
+ >cap_flags);
+   int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+ >cap_flags);
+   u8 rfcsr;
+
rt2800_rf_init_calibration(rt2x00dev, 30);
 
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
@@ -6331,15 +6344,30 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
-   rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
+   rfcsr = 0x01;
+   if (!tx0_int_pa)
+   rt2x00_set_field8(, RFCSR34_TX0_EXT_PA, 1);
+   if (!tx1_int_pa)
+   rt2x00_set_field8(, RFCSR34_TX1_EXT_PA, 1);
+   rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
rt2800_rfcsr_write(rt2x00dev

[PATCH v2 11/14] rt2x00: rt2800lib: fix rf id for RT3352

2017-01-15 Thread Daniel Golle
From: Felix Fietkau <n...@openwrt.org>

Signed-off-by: Felix Fietkau <n...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 4f454e143266..366310011491 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7229,6 +7229,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, );
+   else if (rt2x00_rt(rt2x00dev, RT3352))
+   rf = RF3322;
else
rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
 
-- 
2.11.0



[PATCH v2 10/14] rt2x00: rt2800lib: correctly set HT20/HT40 filter

2017-01-15 Thread Daniel Golle
From: Serge Vasilugin <vasilu...@yandex.ru>

Simple patch to correct HT20/HT40 filter setting.
Tested with Rt3290, Rt3352 and Rt5350

Signed-off-by: Serge Vasilugin <vasilu...@yandex.ru>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  2 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 13 +++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 02ed0d512734..8024fc1a6ae2 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2303,6 +2303,8 @@ struct mac_iveiv_entry {
 #define RFCSR30_RX_H20MFIELD8(0x04)
 #define RFCSR30_RX_VCM FIELD8(0x18)
 #define RFCSR30_RF_CALIBRATION FIELD8(0x80)
+#define RF3322_RFCSR30_TX_H20M FIELD8(0x01)
+#define RF3322_RFCSR30_RX_H20M FIELD8(0x02)
 
 /*
  * RFCSR 31:
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index ff653f0d43d2..4f454e143266 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3299,8 +3299,17 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2x00_rf(rt2x00dev, RF5390) ||
rt2x00_rf(rt2x00dev, RF5392)) {
rt2800_rfcsr_read(rt2x00dev, 30, );
-   rt2x00_set_field8(, RFCSR30_TX_H20M, 0);
-   rt2x00_set_field8(, RFCSR30_RX_H20M, 0);
+   if (rt2x00_rf(rt2x00dev, RF3322)) {
+   rt2x00_set_field8(, RF3322_RFCSR30_TX_H20M,
+ conf_is_ht40(conf));
+   rt2x00_set_field8(, RF3322_RFCSR30_RX_H20M,
+ conf_is_ht40(conf));
+   } else {
+   rt2x00_set_field8(, RFCSR30_TX_H20M,
+ conf_is_ht40(conf));
+   rt2x00_set_field8(, RFCSR30_RX_H20M,
+ conf_is_ht40(conf));
+   }
rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
 
rt2800_rfcsr_read(rt2x00dev, 3, );
-- 
2.11.0



[PATCH v2 09/14] rt2x00: rt2x00pci: set PCI MWI only if supported

2017-01-15 Thread Daniel Golle
From: Claudio Mignanti <c.migna...@gmail.com>

This is needed for devices without support for PCI MWI. See also
https://dev.openwrt.org/changeset/21850

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2x00pci.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c 
b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
index eb6dbcd4fddf..4becfeb75ba8 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
@@ -94,8 +94,10 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct 
rt2x00_ops *ops)
 
pci_set_master(pci_dev);
 
+#ifdef CONFIG_PCI_SET_MWI
if (pci_set_mwi(pci_dev))
rt2x00_probe_err("MWI not available\n");
+#endif
 
if (dma_set_mask(_dev->dev, DMA_BIT_MASK(32))) {
rt2x00_probe_err("PCI DMA not supported\n");
-- 
2.11.0



[PATCH v2 08/14] rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS interrupts

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 72 -
 drivers/net/wireless/ralink/rt2x00/rt2x00.h |  5 ++
 2 files changed, 65 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
index 5f1936aa8fa7..750a9425b5be 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigned long data)
 }
 EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
 
-static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
+static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev,
+ u32 status)
 {
-   u32 status;
int i;
 
/*
@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrupt(struct 
rt2x00_dev *rt2x00dev)
 * Since we have only one producer and one consumer we don't
 * need to lock the kfifo.
 */
-   for (i = 0; i < rt2x00dev->tx->limit; i++) {
-   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
-
-   if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
-   break;
-
+   i = 0;
+   do {
if (!kfifo_put(>txstatus_fifo, status)) {
-   rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx 
status report\n");
+   rt2x00_warn(rt2x00dev,
+   "TX status FIFO overrun, drop TX status 
report\n");
break;
}
-   }
+
+   if (++i >= rt2x00dev->tx->limit)
+   break;
+
+   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
+   } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID));
 
/* Schedule the tasklet for processing the tx status. */
tasklet_schedule(>txstatus_tasklet);
 }
 
+#define RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES4
+
+static bool rt2800mmio_txstatus_is_spurious(struct rt2x00_dev *rt2x00dev,
+   u32 txstatus)
+{
+   if (likely(rt2x00_get_field32(txstatus, TX_STA_FIFO_VALID))) {
+   rt2x00dev->txstatus_irq_retries = 0;
+   return false;
+   }
+
+   rt2x00dev->txstatus_irq_retries++;
+
+   /* Ensure that we don't go into an infinite IRQ loop. */
+   if (rt2x00dev->txstatus_irq_retries >=
+   RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES) {
+   rt2x00_warn(rt2x00dev,
+   "%u spurious TX_FIFO_STATUS interrupt(s)\n",
+   rt2x00dev->txstatus_irq_retries);
+   rt2x00dev->txstatus_irq_retries = 0;
+   return false;
+   }
+
+   return true;
+}
+
 irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
 {
struct rt2x00_dev *rt2x00dev = dev_instance;
u32 reg, mask;
+   u32 txstatus = 0;
 
-   /* Read status and ACK all interrupts */
+   /* Read status */
rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, );
+
+   if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
+   /* Due to unknown reason the hardware generates a
+* TX_FIFO_STATUS interrupt before the TX_STA_FIFO
+* register contain valid data. Read the TX status
+* here to see if we have to process the actual
+* request.
+*/
+   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
+   if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) {
+   /* Remove the TX_FIFO_STATUS bit so it won't be
+* processed in this turn. The hardware will
+* generate another IRQ for us.
+*/
+   rt2x00_set_field32(,
+  INT_SOURCE_CSR_TX_FIFO_STATUS, 0);
+   }
+   }
+
+   /* ACK interrupts */
rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
 
if (!reg)
@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq, void 
*dev_instance)
mask = ~reg;
 
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
-   rt2800mmio_txstatus_interrupt(rt2x00dev);
+   rt2800mmio_txstatus_interrupt(rt2x00dev, txstatus);
/*
 * Never disable the TX_FIFO_STATUS interrupt.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 034a07273038..c27408b494ef 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.

[PATCH v2 07/14] rt2x00: rt2800lib: fix max supported beacon count for RT3593

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5058494d6c27..ff653f0d43d2 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7899,7 +7899,10 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
-   drv_data->hw_beacon_count = 8;
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   drv_data->hw_beacon_count = 16;
+   else
+   drv_data->hw_beacon_count = 8;
 
/*
 * Allocate eeprom data.
-- 
2.11.0



[PATCH v2 06/14] rt2x00: rt2800lib: init additional beacon offset registers

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 14 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 24 
 2 files changed, 38 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index a81852cfb4f9..02ed0d512734 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -629,6 +629,20 @@
  */
 #define PBF_DBG0x043c
 
+/* BCN_OFFSET2 */
+#define BCN_OFFSET20x0444
+#define BCN_OFFSET2_BCN8   FIELD32(0x00ff)
+#define BCN_OFFSET2_BCN9   FIELD32(0xff00)
+#define BCN_OFFSET2_BCN10  FIELD32(0x00ff)
+#define BCN_OFFSET2_BCN11  FIELD32(0xff00)
+
+/* BCN_OFFSET3 */
+#define BCN_OFFSET30x0448
+#define BCN_OFFSET3_BCN12  FIELD32(0x00ff)
+#define BCN_OFFSET3_BCN13  FIELD32(0xff00)
+#define BCN_OFFSET3_BCN14  FIELD32(0x00ff)
+#define BCN_OFFSET3_BCN15  FIELD32(0xff00)
+
 /*
  * RF registers
  */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 0893d9147af9..5058494d6c27 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4665,6 +4665,30 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
if (ret)
return ret;
 
+   if (drv_data->hw_beacon_count == 16) {
+   rt2800_register_read(rt2x00dev, BCN_OFFSET2, );
+   rt2x00_set_field32(, BCN_OFFSET2_BCN8,
+  rt2800_get_beacon_offset(rt2x00dev, 8));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN9,
+  rt2800_get_beacon_offset(rt2x00dev, 9));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN10,
+  rt2800_get_beacon_offset(rt2x00dev, 10));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN11,
+  rt2800_get_beacon_offset(rt2x00dev, 11));
+   rt2800_register_write(rt2x00dev, BCN_OFFSET2, reg);
+
+   rt2800_register_read(rt2x00dev, BCN_OFFSET3, );
+   rt2x00_set_field32(, BCN_OFFSET3_BCN12,
+  rt2800_get_beacon_offset(rt2x00dev, 12));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN13,
+  rt2800_get_beacon_offset(rt2x00dev, 13));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN14,
+  rt2800_get_beacon_offset(rt2x00dev, 14));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN15,
+  rt2800_get_beacon_offset(rt2x00dev, 15));
+   rt2800_register_write(rt2x00dev, BCN_OFFSET3, reg);
+   }
+
rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x013f);
rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x8003);
 
-- 
2.11.0



[PATCH v2 05/14] rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Some chipsets can handle more than 8 beacons at once.
Add a new field to the rt2800_drv_data structure which
will hold the number of supported beacons of the given
chipset.

Update the rt2x00_init_registers function to get the
beacon count from the new field instead of using a
hardcoded value.

In order to keep the current behaviour, initialize the
new field with the actually used value.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 4 +++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index dcacfa54b3d6..0893d9147af9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -5025,7 +5025,7 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
/*
 * Clear all beacons
 */
-   for (i = 0; i < 8; i++)
+   for (i = 0; i < drv_data->hw_beacon_count; i++)
rt2800_clear_beacon_register(rt2x00dev, i);
 
if (rt2x00_is_usb(rt2x00dev)) {
@@ -7875,6 +7875,8 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
+   drv_data->hw_beacon_count = 8;
+
/*
 * Allocate eeprom data.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index ccfa8cf1f5ac..ab49e6feeeb9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -37,6 +37,7 @@ struct rt2800_drv_data {
u8 max_psdu;
unsigned int tbtt_tick;
unsigned int ampdu_factor_cnt[4];
+   unsigned int hw_beacon_count;
DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
 
unsigned long rt2800_flags;
-- 
2.11.0



[PATCH v2 04/14] rt2x00: rt2800lib: fix beacon generation on RT3593

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

On the RT3593 chipset, the beacon registers are located
in the high 8KB part of the shared memory.

The high part of the shared memory is only accessible
if it is explicitly selected. Add a helper function
in order to be able to control the SHR_MSEL bit in
the PBF_SYS_CTRL register. Also add a few more helper
functions and use those to select the correct part of
the shared memory before and after accessing the beacon
registers.

The base addresses of the beacon registers are also
different from the actually used values, so fix the
'rt2800_hw_beacon_base' function to return the correct
values.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  3 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 44 ++
 2 files changed, 47 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 2371896c1e99..a81852cfb4f9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -574,6 +574,7 @@
 #define PBF_SYS_CTRL   0x0400
 #define PBF_SYS_CTRL_READY FIELD32(0x0080)
 #define PBF_SYS_CTRL_HOST_RAM_WRITEFIELD32(0x0001)
+#define PBF_SYS_CTRL_SHR_MSEL  FIELD32(0x0008)
 
 /*
  * HOST-MCU shared memory
@@ -2026,6 +2027,8 @@ struct mac_iveiv_entry {
  (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
  (HW_BEACON_BASE6 - ((__index - 6) * 0x0200
 
+#define HW_BEACON_BASE_HIGH(__index)   (0x4000 + (__index) * 512)
+
 #define BEACON_BASE_TO_OFFSET(_base)   (((_base) - 0x4000) / 64)
 
 /*
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 0fd67026f806..dcacfa54b3d6 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -82,6 +82,39 @@ static inline bool rt2800_is_305x_soc(struct rt2x00_dev 
*rt2x00dev)
return false;
 }
 
+static inline void rt2800_shared_mem_select(struct rt2x00_dev *rt2x00dev,
+   bool high)
+{
+   u32 reg;
+
+   if (WARN_ON_ONCE(!rt2800_has_high_shared_mem(rt2x00dev)))
+   return;
+
+   rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, );
+   rt2x00_set_field32(, PBF_SYS_CTRL_SHR_MSEL, high);
+   rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
+}
+
+static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   return true;
+
+   return false;
+}
+
+static inline void rt2800_select_beacon_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2800_beacon_uses_high_mem(rt2x00dev))
+   rt2800_shared_mem_select(rt2x00dev, true);
+}
+
+static inline void rt2800_deselect_beacon_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2800_beacon_uses_high_mem(rt2x00dev))
+   rt2800_shared_mem_select(rt2x00dev, false);
+}
+
 static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
 const unsigned int word, const u8 value)
 {
@@ -948,6 +981,9 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
 static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  unsigned int index)
 {
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   return HW_BEACON_BASE_HIGH(index);
+
return HW_BEACON_BASE(index);
 }
 
@@ -1046,8 +1082,12 @@ void rt2800_write_beacon(struct queue_entry *entry, 
struct txentry_desc *txdesc)
beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
 
rt2800_shared_mem_lock(rt2x00dev);
+
+   rt2800_select_beacon_mem(rt2x00dev);
rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
   entry->skb->len + padding_len);
+   rt2800_deselect_beacon_mem(rt2x00dev);
+
rt2800_shared_mem_unlock(rt2x00dev);
__set_bit(ENTRY_BCN_ENABLED, >flags);
 
@@ -1080,6 +1120,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 
rt2800_shared_mem_lock(rt2x00dev);
 
+   rt2800_select_beacon_mem(rt2x00dev);
+
/*
 * For the Beacon base registers we only need to clear
 * the whole TXWI which (when set to 0) will invalidate
@@ -1088,6 +1130,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
 
+   rt2800_deselect_beacon_mem(rt2x00dev);
+
rt2800_shared_mem_unlock(rt2x00dev);
 }
 
-- 
2.11.0



[PATCH v2 03/14] rt2x00: rt2800: serialize shared memory access

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

The shared memory of the rt2800 devices is accessible
through the register offset range between 0x4000 and
0x8000. The size of this range is 16KB only and on
devices which have more than 16KB of shared memory either
the low or the high part of the memory is accessible at a
time.

Serialize all accesses to the shared memory by a mutex,
in order to avoid concurrent use of that.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 55 -
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h  | 35 
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 26 
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |  4 ++
 drivers/net/wireless/ralink/rt2x00/rt2800pci.c  | 14 +++
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |  3 ++
 drivers/net/wireless/ralink/rt2x00/rt2800usb.c  | 31 ++
 7 files changed, 167 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5045af1b0dc9..0fd67026f806 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -451,11 +451,13 @@ void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
rt2x00_set_field32(, H2M_MAILBOX_CSR_CMD_TOKEN, token);
rt2x00_set_field32(, H2M_MAILBOX_CSR_ARG0, arg0);
rt2x00_set_field32(, H2M_MAILBOX_CSR_ARG1, arg1);
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
 
reg = 0;
rt2x00_set_field32(, HOST_CMD_CSR_HOST_COMMAND, command);
rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
+   rt2800_shared_mem_unlock(rt2x00dev);
}
 
mutex_unlock(>csr_mutex);
@@ -674,7 +676,9 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 * Wait for device to stabilize.
 */
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, );
+   rt2800_shared_mem_unlock(rt2x00dev);
if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
break;
msleep(1);
@@ -694,10 +698,16 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
/*
 * Initialize firmware.
 */
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
+
if (rt2x00_is_usb(rt2x00dev)) {
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
+
rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
}
msleep(1);
@@ -1035,8 +1045,10 @@ void rt2800_write_beacon(struct queue_entry *entry, 
struct txentry_desc *txdesc)
 
beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
 
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
   entry->skb->len + padding_len);
+   rt2800_shared_mem_unlock(rt2x00dev);
__set_bit(ENTRY_BCN_ENABLED, >flags);
 
/*
@@ -1066,6 +1078,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 
beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
 
+   rt2800_shared_mem_lock(rt2x00dev);
+
/*
 * For the Beacon base registers we only need to clear
 * the whole TXWI which (when set to 0) will invalidate
@@ -1073,6 +1087,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 */
for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
+
+   rt2800_shared_mem_unlock(rt2x00dev);
 }
 
 void rt2800_clear_beacon(struct queue_entry *entry)
@@ -1261,7 +1277,9 @@ static void rt2800_delete_wcid_attr(struct rt2x00_dev 
*rt2x00dev, int wcid)
 {
u32 offset;
offset = MAC_WCID_ATTR_ENTRY(wcid);
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, offset, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
 }
 
 static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
@@ -1274,11 +1292,13 @@ static void rt2800_config_wcid_attr_bssidx(struct 
rt2x00_dev *rt2x00dev,
 * The BSS Idx numbers is split in a main value of 3 bits,
 * and a extended field for adding one additional bit to the value.
 */
+   rt2800_shared_mem_

[PATCH v2 02/14] rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Some chipsets have more than 16KB of shared memory.
Introduce a new rt2800 specific flag to indicate that
and add a helper function which helps to check the
presence of the new flag.

Also enable the new flag for the RT3593 chipset which
has 24KB of shared memory. The flag can also be used
for other chipsets, but none of those has been tested
yet.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c |  4 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 13 +
 2 files changed, 17 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5436cdb07937..5045af1b0dc9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7770,6 +7770,7 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
 
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
+   struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
int retval;
u32 reg;
 
@@ -,6 +7778,9 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (retval)
return retval;
 
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   __set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
+
/*
 * Allocate eeprom data.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index 256928f0ea6a..4ee424dfe23f 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -22,6 +22,10 @@
 
 #include "rt2800.h"
 
+enum rt2800_flag {
+   RT2800_HAS_HIGH_SHARED_MEM,
+};
+
 /* RT2800 driver data structure */
 struct rt2800_drv_data {
u8 calibration_bw20;
@@ -34,6 +38,8 @@ struct rt2800_drv_data {
unsigned int tbtt_tick;
unsigned int ampdu_factor_cnt[4];
DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
+
+   unsigned long rt2800_flags;
 };
 
 struct rt2800_ops {
@@ -66,6 +72,13 @@ struct rt2800_ops {
__le32 *(*drv_get_txwi)(struct queue_entry *entry);
 };
 
+static inline bool rt2800_has_high_shared_mem(struct rt2x00_dev *rt2x00dev)
+{
+   struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
+
+   return test_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
+}
+
 static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
const unsigned int offset,
u32 *value)
-- 
2.11.0



[PATCH v2 00/14] rt2x00 patches from OpenWrt.org

2017-01-15 Thread Daniel Golle
As requested the original series was devided so that everything except
for Rt3883 can go first. What's left are a couple of fixes and as well
as added support for some Rt3352 boards as well as the Rt5350 WiSoC.

Claudio Mignanti (1):
  rt2x00: rt2x00pci: set PCI MWI only if supported

Daniel Golle (2):
  rt2x00: rt2800lib: support for for RT3352 with external PA
  rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal

Felix Fietkau (1):
  rt2x00: rt2800lib: fix rf id for RT3352

Gabor Juhos (8):
  rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h
  rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag
  rt2x00: rt2800: serialize shared memory access
  rt2x00: rt2800lib: fix beacon generation on RT3593
  rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data
  rt2x00: rt2800lib: init additional beacon offset registers
  rt2x00: rt2800lib: fix max supported beacon count for RT3593
  rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS
interrupts

Michel Stempin (1):
  rt2x00: add support for RT5350 WiSoC

Serge Vasilugin (1):
  rt2x00: rt2800lib: correctly set HT20/HT40 filter

 drivers/net/wireless/ralink/rt2x00/rt2800.h |  60 +++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 406 ++--
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h  |  65 
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c |  98 +-
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |   4 +
 drivers/net/wireless/ralink/rt2x00/rt2800pci.c  |  14 +
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |   3 +
 drivers/net/wireless/ralink/rt2x00/rt2800usb.c  |  31 ++
 drivers/net/wireless/ralink/rt2x00/rt2x00.h |  10 +
 drivers/net/wireless/ralink/rt2x00/rt2x00pci.c  |   2 +
 10 files changed, 640 insertions(+), 53 deletions(-)

-- 
2.11.0



[PATCH v2 01/14] rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h

2017-01-15 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

The rt2800_drv_data structure contains driver specific
information. Move the declaration into the rt2800lib.h
header which is a more logical place for it. Also fix
the comment style to avoid checkpatch warning.

The patch contains no functional changes, it is in
preparation for the next patch.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 16 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 16 
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index ec622a08a486..2371896c1e99 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2969,20 +2969,4 @@ enum rt2800_eeprom_word {
 #define WCID_END   222
 #define STA_IDS_SIZE   (WCID_END - WCID_START + 2)
 
-/*
- * RT2800 driver data structure
- */
-struct rt2800_drv_data {
-   u8 calibration_bw20;
-   u8 calibration_bw40;
-   u8 bbp25;
-   u8 bbp26;
-   u8 txmixer_gain_24g;
-   u8 txmixer_gain_5g;
-   u8 max_psdu;
-   unsigned int tbtt_tick;
-   unsigned int ampdu_factor_cnt[4];
-   DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
-};
-
 #endif /* RT2800_H */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index 0a8b4df665fe..256928f0ea6a 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -20,6 +20,22 @@
 #ifndef RT2800LIB_H
 #define RT2800LIB_H
 
+#include "rt2800.h"
+
+/* RT2800 driver data structure */
+struct rt2800_drv_data {
+   u8 calibration_bw20;
+   u8 calibration_bw40;
+   u8 bbp25;
+   u8 bbp26;
+   u8 txmixer_gain_24g;
+   u8 txmixer_gain_5g;
+   u8 max_psdu;
+   unsigned int tbtt_tick;
+   unsigned int ampdu_factor_cnt[4];
+   DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
+};
+
 struct rt2800_ops {
void (*register_read)(struct rt2x00_dev *rt2x00dev,
  const unsigned int offset, u32 *value);
-- 
2.11.0



Re: [OpenWrt-Devel] [RFC] [PULL REQUEST] rt2x00 patches from OpenWrt.org

2017-01-13 Thread Daniel Golle
On Fri, Jan 13, 2017 at 05:17:23PM +0100, Daniel Golle wrote:
> On Fri, Jan 13, 2017 at 04:59:59PM +0100, Johannes Berg wrote:
> > 
> > > The advantage of pull requests is that author information can be
> > > preserved more easily. Running git format-patch results in most
> > > patches
> > > having wrong SMTP sender information due to the assumption that the
> > > patch author is the same person also submitting the patch.
> > > So in practise, this would either require changing the From: (and
> > > thus
> > > Author) to myself or having most mails eaten by anti-spam measures
> > > due
> > > to non-matching SPF which prohibits my SMTP to send mail on behalf of
> > > the original authors of the patches.
> > > 
> > 
> > This is completely untrue. If the first line of the *body* of the email
> > is "From: ..." then this is preserved as the author information by git
> > am, and doing so is also the default in git format-patch/send-email
> > when the author doesn't match the email configuration.
> 
> Thanks for the clarification, I'll then submit the patches via
> git format-patch.

I posted all patches on the mailing list and bundled them up on
patchwork.
https://patchwork.kernel.org/bundle/dangole/rt2x00-from-openwrt/

Cheers


Daniel


[PATCH 12/40] rt2x00: rt2800lib: add channel configuration function for RF3853

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
[dan...@makrotopia.org: replaced udelay with usleep_range]
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 208 +
 1 file changed, 208 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 15bcad1156d9..eda886648daf 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -2661,6 +2661,211 @@ static void rt2800_config_channel_rf3053(struct 
rt2x00_dev *rt2x00dev,
}
 }
 
+static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev,
+struct ieee80211_conf *conf,
+struct rf_channel *rf,
+struct channel_info *info)
+{
+   u8 rfcsr;
+   u8 bbp;
+   u8 pwr1, pwr2, pwr3;
+
+   const bool txbf_enabled = false; /* TODO */
+
+   /* TODO: add band selection */
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
+   else if (rf->channel < 132)
+   rt2800_rfcsr_write(rt2x00dev, 6, 0x80);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
+
+   rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
+   rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 11, 0x46);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
+
+   rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
+
+   rt2800_rfcsr_read(rt2x00dev, 1, );
+   rt2x00_set_field8(, RFCSR1_RX0_PD, 0);
+   rt2x00_set_field8(, RFCSR1_TX0_PD, 0);
+   rt2x00_set_field8(, RFCSR1_RX1_PD, 0);
+   rt2x00_set_field8(, RFCSR1_TX1_PD, 0);
+   rt2x00_set_field8(, RFCSR1_RX2_PD, 0);
+   rt2x00_set_field8(, RFCSR1_TX2_PD, 0);
+   rt2x00_set_field8(, RFCSR1_RF_BLOCK_EN, 1);
+   rt2x00_set_field8(, RFCSR1_PLL_PD, 1);
+
+   switch (rt2x00dev->default_ant.tx_chain_num) {
+   case 3:
+   rt2x00_set_field8(, RFCSR1_TX2_PD, 1);
+   /* fallthrough */
+   case 2:
+   rt2x00_set_field8(, RFCSR1_TX1_PD, 1);
+   /* fallthrough */
+   case 1:
+   rt2x00_set_field8(, RFCSR1_TX0_PD, 1);
+   break;
+   }
+
+   switch (rt2x00dev->default_ant.rx_chain_num) {
+   case 3:
+   rt2x00_set_field8(, RFCSR1_RX2_PD, 1);
+   /* fallthrough */
+   case 2:
+   rt2x00_set_field8(, RFCSR1_RX1_PD, 1);
+   /* fallthrough */
+   case 1:
+   rt2x00_set_field8(, RFCSR1_RX0_PD, 1);
+   break;
+   }
+   rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
+
+   rt2800_adjust_freq_offset(rt2x00dev);
+
+   rt2800_rfcsr_read(rt2x00dev, 30, );
+   if (!conf_is_ht40(conf))
+   rfcsr &= ~(0x06);
+   else
+   rfcsr |= 0x06;
+   rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 31, 0xa0);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+
+   if (conf_is_ht40(conf))
+   rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
+
+   /* loopback RF_BS */
+   rt2800_rfcsr_read(rt2x00dev, 36, );
+   if (rf->channel <= 14)
+   rt2x00_set_field8(, RFCSR36_RF_BS, 1);
+   else
+   rt2x00_set_field8(, RFCSR36_RF_BS, 0);
+   rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
+
+   if (rf->channel <= 14)
+   rfcsr = 0x23;
+   else if (rf->channel < 100)
+   rfcsr = 0x36;
+   else if (rf->channel < 132)
+   rfcsr = 0x32;
+   else
+   rfcsr = 0x30;
+
+   if (txbf_enabled)
+   rfcsr |= 0x40;
+
+   rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
+
+   if (rf->channel <= 14)
+   rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
+   else
+   rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
+
+   if (rf->channel <= 14)
+   rfcsr = 0xbb;
+   else if (rf->channel < 100)
+   rfcsr = 0xeb;
+   else if (rf->channel < 132)
+   rfcsr = 0xb3;
+   else
+   rfcsr = 0x9b;
+   rt2800_rfcsr_write(rt2x00dev, 45, rfcsr);
+
+   if (rf->channel <= 14)
+   rfcsr = 0x8e;
+   else
+   rfcsr = 0x8a;
+
+   if (txbf_enabled)
+   rfcsr |= 0x20;
+
+   

[PATCH 13/40] rt2x00: rt2800lib: enable RF3853 support

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index eda886648daf..7c5061d5328d 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7447,6 +7447,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
case RF3290:
case RF3320:
case RF3322:
+   case RF3853:
case RF5360:
case RF5362:
case RF5370:
-- 
2.11.0



[PATCH 14/40] rt2x00: rt2800lib: add MAC register initialization for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 16 +++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 7c5061d5328d..cf9a8cfd4fbc 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -5020,6 +5020,12 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
rt2800_register_write(rt2x00dev, TX_SW_CFG2,
  0x);
}
+   } else if (rt2x00_rt(rt2x00dev, RT3883)) {
+   rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0402);
+   rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x);
+   rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x0004);
+   rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21);
+   rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x9c40);
} else if (rt2x00_rt(rt2x00dev, RT5390) ||
   rt2x00_rt(rt2x00dev, RT5392)) {
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
@@ -5053,7 +5059,10 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
 
rt2800_register_read(rt2x00dev, MAX_LEN_CFG, );
rt2x00_set_field32(, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
-   if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
+   if (rt2x00_rt(rt2x00dev, RT3883)) {
+   drv_data->max_psdu = 3;
+   rt2x00_set_field32(, MAX_LEN_CFG_MAX_PSDU, 3);
+   } else if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
rt2x00_rt(rt2x00dev, RT2883) ||
rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E)) {
drv_data->max_psdu = 2;
@@ -5211,6 +5220,11 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x0082 : 0x0002;
rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
 
+   if (rt2x00_rt(rt2x00dev, RT3883)) {
+   rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008);
+   rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413);
+   }
+
rt2800_register_read(rt2x00dev, TX_RTS_CFG, );
rt2x00_set_field32(, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 32);
rt2x00_set_field32(, TX_RTS_CFG_RTS_THRES,
-- 
2.11.0



[PATCH 40/40] rt2x00: correctly set HT20/HT40 filter

2017-01-13 Thread Daniel Golle
From: Serge Vasilugin 

Simple patch to correct HT20/HT40 switching.
Tested with Rt3290, Rt3352 and Rt5350

Signed-off-by: Serge Vasilugin 
[dan...@makrotopia.org: fixed code and commit message formatting]
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  2 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 13 +++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index f49babf2fbee..2fcb3eef65e6 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2319,6 +2319,8 @@ struct mac_iveiv_entry {
 #define RFCSR30_RX_H20MFIELD8(0x04)
 #define RFCSR30_RX_VCM FIELD8(0x18)
 #define RFCSR30_RF_CALIBRATION FIELD8(0x80)
+#define RF3322_RFCSR30_TX_H20M FIELD8(0x01)
+#define RF3322_RFCSR30_RX_H20M FIELD8(0x02)
 
 /*
  * RFCSR 31:
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 823bdc1b0322..c4e022edf119 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3562,8 +3562,17 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2x00_rf(rt2x00dev, RF5390) ||
rt2x00_rf(rt2x00dev, RF5392)) {
rt2800_rfcsr_read(rt2x00dev, 30, );
-   rt2x00_set_field8(, RFCSR30_TX_H20M, 0);
-   rt2x00_set_field8(, RFCSR30_RX_H20M, 0);
+   if (rt2x00_rf(rt2x00dev, RF3322)) {
+   rt2x00_set_field8(, RF3322_RFCSR30_TX_H20M,
+ conf_is_ht40(conf));
+   rt2x00_set_field8(, RF3322_RFCSR30_RX_H20M,
+ conf_is_ht40(conf));
+   } else {
+   rt2x00_set_field8(, RFCSR30_TX_H20M,
+ conf_is_ht40(conf));
+   rt2x00_set_field8(, RFCSR30_RX_H20M,
+ conf_is_ht40(conf));
+   }
rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
 
rt2800_rfcsr_read(rt2x00dev, 3, );
-- 
2.11.0



[PATCH 38/40] rt2x00: add support for RT5350 WiSoC

2017-01-13 Thread Daniel Golle
From: Michel Stempin 

Support for the RT5350 WiSoC was added to OpenWrt after having a
lengthy debate about the legality of the original submission, see
https://lists.openwrt.org/pipermail/openwrt-devel/2013-January/018224.html
MTK/Ralink Acked replied and says we can merge this patch under the GPL.
https://dev.openwrt.org/changeset/36177

Signed-off-by: Serge Vasilugin 
Tested-by: Michel Stempin 
Acked-by: John Crispin 
[dan...@makrotopia.org: added commit message, fixed code formatting]
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|   1 +
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 131 +++--
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|   1 +
 3 files changed, 126 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 14c94034a707..f49babf2fbee 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -74,6 +74,7 @@
 #define RF3070 0x3070
 #define RF3290 0x3290
 #define RF3853 0x3853
+#define RF5350 0x5350
 #define RF5360 0x5360
 #define RF5362 0x5362
 #define RF5370 0x5370
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 6a24892476c3..5f49117b9035 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3050,6 +3050,13 @@ static void rt2800_config_channel_rf53xx(struct 
rt2x00_dev *rt2x00dev,
 
rt2800_rfcsr_write(rt2x00dev, 59,
   r59_non_bt[idx]);
+   } else if (rt2x00_rt(rt2x00dev, RT5350)) {
+   static const char r59_non_bt[] = {0x0b, 0x0b,
+   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
+   0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
+
+   rt2800_rfcsr_write(rt2x00dev, 59,
+  r59_non_bt[idx]);
}
}
}
@@ -3528,6 +3535,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
break;
case RF3070:
+   case RF5350:
case RF5360:
case RF5362:
case RF5370:
@@ -3546,6 +3554,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
if (rt2x00_rf(rt2x00dev, RF3070) ||
rt2x00_rf(rt2x00dev, RF3290) ||
rt2x00_rf(rt2x00dev, RF3322) ||
+   rt2x00_rf(rt2x00dev, RF5350) ||
rt2x00_rf(rt2x00dev, RF5360) ||
rt2x00_rf(rt2x00dev, RF5362) ||
rt2x00_rf(rt2x00dev, RF5370) ||
@@ -3824,7 +3833,8 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
/*
 * Clear update flag
 */
-   if (rt2x00_rt(rt2x00dev, RT3352)) {
+   if (rt2x00_rt(rt2x00dev, RT3352) ||
+   rt2x00_rt(rt2x00dev, RT5350)) {
rt2800_bbp_read(rt2x00dev, 49, );
rt2x00_set_field8(, BBP49_UPDATE_FLAG, 0);
rt2800_bbp_write(rt2x00dev, 49, bbp);
@@ -4710,6 +4720,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
case RF3070:
case RF3290:
case RF3853:
+   case RF5350:
case RF5360:
case RF5362:
case RF5370:
@@ -5129,6 +5140,8 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x);
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x);
+   } else if (rt2x00_rt(rt2x00dev, RT5350)) {
+   rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x0404);
} else {
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x);
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
@@ -5788,9 +5801,13 @@ static void rt2800_init_bbp_3352(struct rt2x00_dev 
*rt2x00dev)
 
rt2800_bbp_write(rt2x00dev, 82, 0x62);
 
-   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
-
-   rt2800_bbp_write(rt2x00dev, 84, 0x99);
+   if (rt2x00_rt(rt2x00dev, RT5350)) {
+   rt2800_bbp_write(rt2x00dev, 83, 0x7a);
+   rt2800_bbp_write(rt2x00dev, 84, 0x9a);
+   } else {
+   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
+   rt2800_bbp_write(rt2x00dev, 84, 0x99);
+   }
 
rt2800_bbp_write(rt2x00dev, 86, 0x38);
 
@@ -5804,9 +5821,13 @@ static void rt2800_init_bbp_3352(struct rt2x00_dev 

[PATCH 39/40] rt2x00: fix rf id for RT3352

2017-01-13 Thread Daniel Golle
From: Felix Fietkau 

Signed-off-by: Felix Fietkau 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5f49117b9035..823bdc1b0322 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7861,10 +7861,11 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
 * RT53xx: defined in "EEPROM_CHIP_ID" field
 */
if (rt2x00_rt(rt2x00dev, RT3290) ||
-   rt2x00_rt(rt2x00dev, RT3352) ||
rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, );
+   else if (rt2x00_rt(rt2x00dev, RT3352))
+   rf = RF3322;
else if (rt2x00_rt(rt2x00dev, RT3883))
rf = RF3853;
else if (rt2x00_rt(rt2x00dev, RT5350))
-- 
2.11.0



[PATCH 37/40] rt2x00: add support for RT3352 with 20MHz crystal

2017-01-13 Thread Daniel Golle
Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Mathias Kresin <d...@kresin.me>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 50 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 ++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 320fdb90be84..6a24892476c3 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "rt2x00.h"
 #include "rt2800lib.h"
@@ -8227,6 +8228,27 @@ static const struct rf_channel rf_vals_5592_xtal40[] = {
{196, 83, 0, 12, 1},
 };
 
+/*
+ * RF value list for rt3xxx with Xtal20MHz
+ * Supports: 2.4 GHz (all) (RF3322)
+ */
+static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
+   {1,0xE2, 2,  0x14},
+   {2,0xE3, 2,  0x14},
+   {3,0xE4, 2,  0x14},
+   {4,0xE5, 2,  0x14},
+   {5,0xE6, 2,  0x14},
+   {6,0xE7, 2,  0x14},
+   {7,0xE8, 2,  0x14},
+   {8,0xE9, 2,  0x14},
+   {9,0xEA, 2,  0x14},
+   {10,   0xEB, 2,  0x14},
+   {11,   0xEC, 2,  0x14},
+   {12,   0xED, 2,  0x14},
+   {13,   0xEE, 2,  0x14},
+   {14,   0xF0, 2,  0x18},
+};
+
 static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
struct hw_mode_spec *spec = >spec;
@@ -8316,7 +8338,10 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
*rt2x00dev)
case RF5390:
case RF5392:
spec->num_channels = 14;
-   spec->channels = rf_vals_3x;
+   if (spec->clk_is_20mhz)
+   spec->channels = rf_vals_xtal20mhz_3x;
+   else
+   spec->channels = rf_vals_3x;
break;
 
case RF3052:
@@ -8504,6 +8529,20 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
return 0;
 }
 
+int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
+{
+   struct hw_mode_spec *spec = >spec;
+   struct clk *clk = clk_get(rt2x00dev->dev, NULL);
+
+   if (IS_ERR(clk))
+   return PTR_ERR(clk);
+
+   if (clk_get_rate(clk) == 2000)
+   spec->clk_is_20mhz = 1;
+
+   return 0;
+}
+
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
@@ -8546,6 +8585,15 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
 
/*
+* Probe SoC clock.
+*/
+   if (rt2x00_is_soc(rt2x00dev)) {
+   retval = rt2800_probe_clk(rt2x00dev);
+   if (retval)
+   return retval;
+   }
+
+   /*
 * Initialize hw specifications.
 */
retval = rt2800_probe_hw_mode(rt2x00dev);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index cfbf414c2627..b1eec49b0dac 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -400,6 +400,7 @@ static inline struct rt2x00_intf* vif_to_intf(struct 
ieee80211_vif *vif)
  * @channels: Device/chipset specific channel values (See  rf_channel).
  * @channels_info: Additional information for channels (See  
channel_info).
  * @ht: Driver HT Capabilities (See _sta_ht_cap).
+ * @clk_is_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz
  */
 struct hw_mode_spec {
unsigned int supported_bands;
@@ -415,6 +416,7 @@ struct hw_mode_spec {
const struct channel_info *channels_info;
 
struct ieee80211_sta_ht_cap ht;
+   int clk_is_20mhz;
 };
 
 /*
-- 
2.11.0



[PATCH 36/40] rt2x00: support for for RT3352 with external PA

2017-01-13 Thread Daniel Golle
This is needed for WiFi to work e.g. on DIR-615 rev.H1 which got
external RF power amplifiers connected to the WiSoC.

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
Signed-off-by: Gabor Juhos <juh...@openwrt.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 24 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 77 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00.h|  2 +
 3 files changed, 90 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 33a3b33c9a0b..14c94034a707 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2333,6 +2333,12 @@ struct mac_iveiv_entry {
 #define RFCSR36_RF_BS  FIELD8(0x80)
 
 /*
+ * RFCSR 34:
+ */
+#define RFCSR34_TX0_EXT_PA FIELD8(0x04)
+#define RFCSR34_TX1_EXT_PA FIELD8(0x08)
+
+/*
  * RFCSR 38:
  */
 #define RFCSR38_RX_LO1_EN  FIELD8(0x20)
@@ -2344,6 +2350,18 @@ struct mac_iveiv_entry {
 #define RFCSR39_RX_LO2_EN  FIELD8(0x80)
 
 /*
+ * RFCSR 41:
+ */
+#define RFCSR41_BIT1   FIELD8(0x01)
+#define RFCSR41_BIT4   FIELD8(0x08)
+
+/*
+ * RFCSR 42:
+ */
+#define RFCSR42_BIT1   FIELD8(0x01)
+#define RFCSR42_BIT4   FIELD8(0x08)
+
+/*
  * RFCSR 49:
  */
 #define RFCSR49_TX FIELD8(0x3f)
@@ -2356,6 +2374,8 @@ struct mac_iveiv_entry {
  * RFCSR 50:
  */
 #define RFCSR50_TX FIELD8(0x3f)
+#define RFCSR50_TX0_EXT_PA FIELD8(0x02)
+#define RFCSR50_TX1_EXT_PA FIELD8(0x10)
 #define RFCSR50_EP FIELD8(0xc0)
 /* bits for RT3593 */
 #define RFCSR50_TX_LO1_EN  FIELD8(0x20)
@@ -2503,6 +2523,8 @@ enum rt2800_eeprom_word {
  * INTERNAL_TX_ALC: 0: disable, 1: enable
  * BT_COEXIST: 0: disable, 1: enable
  * DAC_TEST: 0: disable, 1: enable
+ * EXTERNAL_TX0_PA: 0: disable, 1: enable (only on RT3352)
+ * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352)
  */
 #define EEPROM_NIC_CONF1_HW_RADIO  FIELD16(0x0001)
 #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC   FIELD16(0x0002)
@@ -2519,6 +2541,8 @@ enum rt2800_eeprom_word {
 #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC   FIELD16(0x2000)
 #define EEPROM_NIC_CONF1_BT_COEXISTFIELD16(0x4000)
 #define EEPROM_NIC_CONF1_DAC_TEST  FIELD16(0x8000)
+#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352  FIELD16(0x4000)
+#define EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352  FIELD16(0x8000)
 
 /*
  * EEPROM frequency
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 51c9d5e8b888..320fdb90be84 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3564,11 +3564,18 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
/*
 * Change BBP settings
 */
+
if (rt2x00_rt(rt2x00dev, RT3352)) {
+   rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
+
rt2800_bbp_write(rt2x00dev, 27, 0x0);
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 27, 0x20);
rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 86, 0x38);
+   rt2800_bbp_write(rt2x00dev, 83, 0x6a);
} else if (rt2x00_rt(rt2x00dev, RT3593)) {
if (rf->channel > 14) {
/* Disable CCK Packet detection on 5GHz */
@@ -6640,6 +6647,12 @@ static void rt2800_init_rfcsr_3290(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
 {
+   int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
+ >cap_flags);
+   int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+ >cap_flags);
+   u8 rfcsr;
+
rt2800_rf_init_calibration(rt2x00dev, 30);
 
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
@@ -6675,15 +6688,30 @@ static void rt2800_init_rfcsr_3352(struct rt2x00_dev 
*rt2x00dev)
rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
-   rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
+   rfcsr = 0x01;
+   if (!tx0_int_pa)
+   rt2x00_set_field8(, RFCSR34_TX0_EXT_PA, 1);
+   if (!tx1_int_pa)
+   rt2x00_set_field8(, RFCSR34_TX1_EXT_PA, 1);
+   rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
rt2800_rfcsr_write(rt2x00dev

[PATCH 35/40] rt2x00: rt2x00pci: set PCI MWI only if supported

2017-01-13 Thread Daniel Golle
From: Claudio Mignanti <c.migna...@gmail.com>

This is needed for devices without support for PCI MWI. See also
https://dev.openwrt.org/changeset/21850

Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2x00pci.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c 
b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
index eb6dbcd4fddf..4becfeb75ba8 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
@@ -94,8 +94,10 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct 
rt2x00_ops *ops)
 
pci_set_master(pci_dev);
 
+#ifdef CONFIG_PCI_SET_MWI
if (pci_set_mwi(pci_dev))
rt2x00_probe_err("MWI not available\n");
+#endif
 
if (dma_set_mask(_dev->dev, DMA_BIT_MASK(32))) {
rt2x00_probe_err("PCI DMA not supported\n");
-- 
2.11.0



[PATCH 34/40] rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS interrupts

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
[dan...@makrotopia.org: fixed indention]
---
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 72 -
 drivers/net/wireless/ralink/rt2x00/rt2x00.h |  5 ++
 2 files changed, 65 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
index 5f1936aa8fa7..750a9425b5be 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigned long data)
 }
 EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
 
-static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
+static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev,
+ u32 status)
 {
-   u32 status;
int i;
 
/*
@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrupt(struct 
rt2x00_dev *rt2x00dev)
 * Since we have only one producer and one consumer we don't
 * need to lock the kfifo.
 */
-   for (i = 0; i < rt2x00dev->tx->limit; i++) {
-   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
-
-   if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
-   break;
-
+   i = 0;
+   do {
if (!kfifo_put(>txstatus_fifo, status)) {
-   rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx 
status report\n");
+   rt2x00_warn(rt2x00dev,
+   "TX status FIFO overrun, drop TX status 
report\n");
break;
}
-   }
+
+   if (++i >= rt2x00dev->tx->limit)
+   break;
+
+   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
+   } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID));
 
/* Schedule the tasklet for processing the tx status. */
tasklet_schedule(>txstatus_tasklet);
 }
 
+#define RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES4
+
+static bool rt2800mmio_txstatus_is_spurious(struct rt2x00_dev *rt2x00dev,
+   u32 txstatus)
+{
+   if (likely(rt2x00_get_field32(txstatus, TX_STA_FIFO_VALID))) {
+   rt2x00dev->txstatus_irq_retries = 0;
+   return false;
+   }
+
+   rt2x00dev->txstatus_irq_retries++;
+
+   /* Ensure that we don't go into an infinite IRQ loop. */
+   if (rt2x00dev->txstatus_irq_retries >=
+   RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES) {
+   rt2x00_warn(rt2x00dev,
+   "%u spurious TX_FIFO_STATUS interrupt(s)\n",
+   rt2x00dev->txstatus_irq_retries);
+   rt2x00dev->txstatus_irq_retries = 0;
+   return false;
+   }
+
+   return true;
+}
+
 irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
 {
struct rt2x00_dev *rt2x00dev = dev_instance;
u32 reg, mask;
+   u32 txstatus = 0;
 
-   /* Read status and ACK all interrupts */
+   /* Read status */
rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, );
+
+   if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
+   /* Due to unknown reason the hardware generates a
+* TX_FIFO_STATUS interrupt before the TX_STA_FIFO
+* register contain valid data. Read the TX status
+* here to see if we have to process the actual
+* request.
+*/
+   rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, );
+   if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) {
+   /* Remove the TX_FIFO_STATUS bit so it won't be
+* processed in this turn. The hardware will
+* generate another IRQ for us.
+*/
+   rt2x00_set_field32(,
+  INT_SOURCE_CSR_TX_FIFO_STATUS, 0);
+   }
+   }
+
+   /* ACK interrupts */
rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
 
if (!reg)
@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq, void 
*dev_instance)
mask = ~reg;
 
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
-   rt2800mmio_txstatus_interrupt(rt2x00dev);
+   rt2800mmio_txstatus_interrupt(rt2x00dev, txstatus);
/*
 * Never disable the TX_FIFO_STATUS interrupt.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 034a07273038..c27408b494ef 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -995,6 +995,11 @@ struct rt2x00_dev {
int 

[PATCH 33/40] rt2x00: rt2800lib: use high memory for beacons on RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 55fc3ec4597b..51c9d5e8b888 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -97,7 +97,8 @@ static inline void rt2800_shared_mem_select(struct rt2x00_dev 
*rt2x00dev,
 
 static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
 {
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
return true;
 
return false;
-- 
2.11.0



[PATCH 32/40] rt2x00: rt2800lib: enable RT2800_HAS_HIGH_SHARED_MEM for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index c8a14eaafd22..55fc3ec4597b 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -8464,7 +8464,8 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (retval)
return retval;
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
if (rt2x00_rt(rt2x00dev, RT3593) ||
-- 
2.11.0



[PATCH 31/40] rt2x00: rt2800lib: fix txpower compensation for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 81368cee6e38..c8a14eaafd22 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4017,6 +4017,9 @@ static u8 rt2800_compensate_txpower(struct rt2x00_dev 
*rt2x00dev, int is_rate_b,
if (rt2x00_rt(rt2x00dev, RT3593))
return min_t(u8, txpower, 0xc);
 
+   if (rt2x00_rt(rt2x00dev, RT3883))
+   return min_t(u8, txpower, 0xf);
+
if (rt2x00_has_cap_power_limit(rt2x00dev)) {
/*
 * Check if eirp txpower exceed txpower_limit.
-- 
2.11.0



[PATCH 30/40] rt2x00: rt2800lib: fix EEPROM LNA validation for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index e79714b898b9..81368cee6e38 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7648,7 +7648,8 @@ static int rt2800_validate_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, );
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
rt2x00_set_field16(, EEPROM_RSSI_BG2_OFFSET2, 0);
-   if (!rt2x00_rt(rt2x00dev, RT3593)) {
+   if (!rt2x00_rt(rt2x00dev, RT3593) &&
+   !rt2x00_rt(rt2x00dev, RT3883)) {
if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
rt2x00_set_field16(, EEPROM_RSSI_BG2_LNA_A1,
@@ -7668,7 +7669,8 @@ static int rt2800_validate_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, );
if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
rt2x00_set_field16(, EEPROM_RSSI_A2_OFFSET2, 0);
-   if (!rt2x00_rt(rt2x00dev, RT3593)) {
+   if (!rt2x00_rt(rt2x00dev, RT3593) &&
+   !rt2x00_rt(rt2x00dev, RT3883)) {
if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
rt2x00_set_field16(, EEPROM_RSSI_A2_LNA_A2,
@@ -7676,7 +7678,8 @@ static int rt2800_validate_eeprom(struct rt2x00_dev 
*rt2x00dev)
}
rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
 
-   if (rt2x00_rt(rt2x00dev, RT3593)) {
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883)) {
rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, );
if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
-- 
2.11.0



[PATCH 28/40] rt2x00: rt2800lib: fix LNA gain configuration for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index bde8177c30c4..da430e304d1f 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -1994,7 +1994,8 @@ static void rt2800_config_lna_gain(struct rt2x00_dev 
*rt2x00dev,
rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, );
lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
} else if (libconf->rf.channel <= 128) {
-   if (rt2x00_rt(rt2x00dev, RT3593)) {
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883)) {
rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, );
lna_gain = rt2x00_get_field16(eeprom,
  EEPROM_EXT_LNA2_A1);
@@ -2004,7 +2005,8 @@ static void rt2800_config_lna_gain(struct rt2x00_dev 
*rt2x00dev,
  EEPROM_RSSI_BG2_LNA_A1);
}
} else {
-   if (rt2x00_rt(rt2x00dev, RT3593)) {
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883)) {
rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, );
lna_gain = rt2x00_get_field16(eeprom,
  EEPROM_EXT_LNA2_A2);
-- 
2.11.0



[PATCH 29/40] rt2x00: rt2800lib: fix VGC setup for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 11 +--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index da430e304d1f..e79714b898b9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4850,7 +4850,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev 
*rt2x00dev)
else
vgc = 0x2e + rt2x00dev->lna_gain;
} else { /* 5GHZ band */
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
else if (rt2x00_rt(rt2x00dev, RT5592))
vgc = 0x24 + (2 * rt2x00dev->lna_gain);
@@ -4870,7 +4871,8 @@ static inline void rt2800_set_vgc(struct rt2x00_dev 
*rt2x00dev,
 {
if (qual->vgc_level != vgc_level) {
if (rt2x00_rt(rt2x00dev, RT3572) ||
-   rt2x00_rt(rt2x00dev, RT3593)) {
+   rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883)) {
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
   vgc_level);
} else if (rt2x00_rt(rt2x00dev, RT5592)) {
@@ -4917,6 +4919,11 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, 
struct link_qual *qual,
}
break;
 
+   case RT3883:
+   if (qual->rssi > -65)
+   vgc += 0x10;
+   break;
+
case RT5592:
if (qual->rssi > -65)
vgc += 0x20;
-- 
2.11.0



[PATCH 27/40] rt2x00: rt2800lib: fix antenna configuration for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index ba73be7101b7..bde8177c30c4 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -1971,7 +1971,8 @@ void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, 
struct antenna_setup *ant)
rt2800_bbp_write(rt2x00dev, 3, r3);
rt2800_bbp_write(rt2x00dev, 1, r1);
 
-   if (rt2x00_rt(rt2x00dev, RT3593)) {
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883)) {
if (ant->rx_chain_num == 1)
rt2800_bbp_write(rt2x00dev, 86, 0x00);
else
-- 
2.11.0



[PATCH 26/40] rt2x00: rt2800lib: use correct beacon count for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 8f036090f320..ba73be7101b7 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -8451,7 +8451,8 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
drv_data->hw_beacon_count = 16;
else
drv_data->hw_beacon_count = 8;
-- 
2.11.0



[PATCH 23/40] rt2x00: rt2800lib: hardcode txmixer gain values to zero for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 797c60875ac6..e406885a5cc3 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7514,7 +7514,8 @@ static u8 rt2800_get_txmixer_gain_24g(struct rt2x00_dev 
*rt2x00dev)
 {
u16 word;
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
return 0;
 
rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, );
@@ -7528,7 +7529,8 @@ static u8 rt2800_get_txmixer_gain_5g(struct rt2x00_dev 
*rt2x00dev)
 {
u16 word;
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
return 0;
 
rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, );
-- 
2.11.0



[PATCH 24/40] rt2x00: rt2800lib: use correct [RT]XWI size for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index e406885a5cc3..1933dc22f1c4 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -558,6 +558,7 @@ void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
 {
switch (rt2x00dev->chip.rt) {
case RT3593:
+   case RT3883:
*txwi_size = TXWI_DESC_SIZE_4WORDS;
*rxwi_size = RXWI_DESC_SIZE_5WORDS;
break;
-- 
2.11.0



[PATCH 25/40] rt2x00: rt2800lib: use correct beacon base for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 1933dc22f1c4..8f036090f320 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -983,7 +983,8 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
 static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  unsigned int index)
 {
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
return HW_BEACON_BASE_HIGH(index);
 
return HW_BEACON_BASE(index);
-- 
2.11.0



[PATCH 15/40] rt2x00: rt2800soc: fix rt2800soc_disable_radio for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
index 871d9d331046..85575004a784 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
@@ -51,9 +51,16 @@ static bool rt2800soc_hwcrypt_disabled(struct rt2x00_dev 
*rt2x00dev)
 
 static void rt2800soc_disable_radio(struct rt2x00_dev *rt2x00dev)
 {
+   u32 reg;
+
rt2800_disable_radio(rt2x00dev);
rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0);
-   rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, 0);
+
+   reg = 0;
+   if (rt2x00_rt(rt2x00dev, RT3883))
+   rt2x00_set_field32(, TX_PIN_CFG_RFTR_EN, 1);
+
+   rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, reg);
 }
 
 static int rt2800soc_set_device_state(struct rt2x00_dev *rt2x00dev,
-- 
2.11.0



[PATCH 22/40] rt2x00: rt2800lib: use correct txpower calculation function for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 6df2c240d756..797c60875ac6 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4647,7 +4647,8 @@ static void rt2800_config_txpower(struct rt2x00_dev 
*rt2x00dev,
  struct ieee80211_channel *chan,
  int power_level)
 {
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
else
rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
-- 
2.11.0



[PATCH 21/40] rt2x00: rt2800lib: fix txpower_to_dev function for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 62ac5aa0f016..6df2c240d756 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3428,13 +3428,15 @@ static char rt2800_txpower_to_dev(struct rt2x00_dev 
*rt2x00dev,
  unsigned int channel,
  char txpower)
 {
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
 
if (channel <= 14)
return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
   MAX_A_TXPOWER_3593);
else
-- 
2.11.0



[PATCH 20/40] rt2x00: rt2800lib: add channel configuration code for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 72 --
 1 file changed, 69 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 005fd02c0226..62ac5aa0f016 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -3441,6 +3441,36 @@ static char rt2800_txpower_to_dev(struct rt2x00_dev 
*rt2x00dev,
return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
 }
 
+static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev,
+ struct rf_channel *rf)
+{
+   u8 bbp;
+
+   bbp = (rf->channel > 14) ? 0x48 : 0x38;
+   rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
+
+   rt2800_bbp_write(rt2x00dev, 69, 0x12);
+
+   if (rf->channel <= 14) {
+   rt2800_bbp_write(rt2x00dev, 70, 0x0a);
+   } else {
+   /* Disable CCK packet detection */
+   rt2800_bbp_write(rt2x00dev, 70, 0x00);
+   }
+
+   rt2800_bbp_write(rt2x00dev, 73, 0x10);
+
+   if (rf->channel > 14) {
+   rt2800_bbp_write(rt2x00dev, 62, 0x1d);
+   rt2800_bbp_write(rt2x00dev, 63, 0x1d);
+   rt2800_bbp_write(rt2x00dev, 64, 0x1d);
+   } else {
+   rt2800_bbp_write(rt2x00dev, 62, 0x2d);
+   rt2800_bbp_write(rt2x00dev, 63, 0x2d);
+   rt2800_bbp_write(rt2x00dev, 64, 0x2d);
+   }
+}
+
 static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
  struct ieee80211_conf *conf,
  struct rf_channel *rf,
@@ -3459,6 +3489,12 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2800_txpower_to_dev(rt2x00dev, rf->channel,
  info->default_power3);
 
+   switch (rt2x00dev->chip.rt) {
+   case RT3883:
+   rt3883_bbp_adjust(rt2x00dev, rf);
+   break;
+   }
+
switch (rt2x00dev->chip.rf) {
case RF2020:
case RF3020:
@@ -3542,6 +3578,15 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 77, 0x98);
+   } else if (rt2x00_rt(rt2x00dev, RT3883)) {
+   rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
+   rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
+
+   if (rt2x00dev->default_ant.rx_chain_num > 1)
+   rt2800_bbp_write(rt2x00dev, 86, 0x46);
+   else
+   rt2800_bbp_write(rt2x00dev, 86, 0);
} else {
rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
@@ -3554,6 +3599,7 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
!rt2x00_rt(rt2x00dev, RT5392)) {
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
rt2800_bbp_write(rt2x00dev, 82, 0x62);
+   rt2800_bbp_write(rt2x00dev, 82, 0x62);
rt2800_bbp_write(rt2x00dev, 75, 0x46);
} else {
if (rt2x00_rt(rt2x00dev, RT3593))
@@ -3562,19 +3608,22 @@ static void rt2800_config_channel(struct rt2x00_dev 
*rt2x00dev,
rt2800_bbp_write(rt2x00dev, 82, 0x84);
rt2800_bbp_write(rt2x00dev, 75, 0x50);
}
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
rt2800_bbp_write(rt2x00dev, 83, 0x8a);
}
 
} else {
if (rt2x00_rt(rt2x00dev, RT3572))
rt2800_bbp_write(rt2x00dev, 82, 0x94);
-   else if (rt2x00_rt(rt2x00dev, RT3593))
+   else if (rt2x00_rt(rt2x00dev, RT3593) ||
+rt2x00_rt(rt2x00dev, RT3883))
rt2800_bbp_write(rt2x00dev, 82, 0x82);
else
rt2800_bbp_write(rt2x00dev, 82, 0xf2);
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
rt2800_bbp_write(rt2x00dev, 83, 0x9a);
 
if (rt2x00_has_cap_external_lna_a(rt2x00dev))
@@ -3699,6 

[PATCH 19/40] rt2x00: rt2800lib: force rf type to RF3853 on RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index e3b9a97b1fc2..005fd02c0226 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7629,6 +7629,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev 
*rt2x00dev)
rt2x00_rt(rt2x00dev, RT5390) ||
rt2x00_rt(rt2x00dev, RT5392))
rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, );
+   else if (rt2x00_rt(rt2x00dev, RT3883))
+   rf = RF3853;
else
rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
 
-- 
2.11.0



[PATCH 18/40] rt2x00: rt2800lib: use the extended EEPROM map for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 870e2da20d47..e3b9a97b1fc2 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -342,7 +342,8 @@ static unsigned int rt2800_eeprom_word_index(struct 
rt2x00_dev *rt2x00dev,
  wiphy_name(rt2x00dev->hw->wiphy), word))
return 0;
 
-   if (rt2x00_rt(rt2x00dev, RT3593))
+   if (rt2x00_rt(rt2x00dev, RT3593) ||
+   rt2x00_rt(rt2x00dev, RT3883))
map = rt2800_eeprom_map_ext;
else
map = rt2800_eeprom_map;
-- 
2.11.0



[PATCH 16/40] rt2x00: rt2800lib: add BBP register initialization for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 44 ++
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index cf9a8cfd4fbc..df0c6dd90735 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -5830,6 +5830,47 @@ static void rt2800_init_bbp_3593(struct rt2x00_dev 
*rt2x00dev)
rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 }
 
+static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev)
+{
+   rt2800_init_bbp_early(rt2x00dev);
+
+   rt2800_bbp_write(rt2x00dev, 4, 0x50);
+   rt2800_bbp_write(rt2x00dev, 47, 0x48);
+
+   rt2800_bbp_write(rt2x00dev, 86, 0x46);
+   rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
+   rt2800_bbp_write(rt2x00dev, 92, 0x02);
+
+   rt2800_bbp_write(rt2x00dev, 103, 0xc0);
+   rt2800_bbp_write(rt2x00dev, 104, 0x92);
+   rt2800_bbp_write(rt2x00dev, 105, 0x34);
+   rt2800_bbp_write(rt2x00dev, 106, 0x12);
+   rt2800_bbp_write(rt2x00dev, 120, 0x50);
+   rt2800_bbp_write(rt2x00dev, 137, 0x0f);
+   rt2800_bbp_write(rt2x00dev, 163, 0x9d);
+
+   /* Set ITxBF timeout to 0x9C40=1000msec */
+   rt2800_bbp_write(rt2x00dev, 179, 0x02);
+   rt2800_bbp_write(rt2x00dev, 180, 0x00);
+   rt2800_bbp_write(rt2x00dev, 182, 0x40);
+   rt2800_bbp_write(rt2x00dev, 180, 0x01);
+   rt2800_bbp_write(rt2x00dev, 182, 0x9c);
+
+   rt2800_bbp_write(rt2x00dev, 179, 0x00);
+
+   /* Reprogram the inband interface to put right values in RXWI */
+   rt2800_bbp_write(rt2x00dev, 142, 0x04);
+   rt2800_bbp_write(rt2x00dev, 143, 0x3b);
+   rt2800_bbp_write(rt2x00dev, 142, 0x06);
+   rt2800_bbp_write(rt2x00dev, 143, 0xa0);
+   rt2800_bbp_write(rt2x00dev, 142, 0x07);
+   rt2800_bbp_write(rt2x00dev, 143, 0xa1);
+   rt2800_bbp_write(rt2x00dev, 142, 0x08);
+   rt2800_bbp_write(rt2x00dev, 143, 0xa2);
+   rt2800_bbp_write(rt2x00dev, 148, 0xc8);
+}
+
 static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
 {
int ant, div_mode;
@@ -6048,6 +6089,9 @@ static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
case RT3593:
rt2800_init_bbp_3593(rt2x00dev);
return;
+   case RT3883:
+   rt2800_init_bbp_3883(rt2x00dev);
+   return;
case RT5390:
case RT5392:
rt2800_init_bbp_53xx(rt2x00dev);
-- 
2.11.0



[PATCH 17/40] rt2x00: rt2800lib: add RFCSR initialization for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
[dan...@makrotopia.org: use usleep_range instead of msleep, fixed comment]
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  13 +++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 141 +
 2 files changed, 154 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 2190bf07d004..33a3b33c9a0b 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -1588,6 +1588,18 @@
 #define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x0f00)
 
 /*
+ * TX_TXBF_CFG:
+ */
+#define TX_TXBF_CFG_0  0x138c
+#define TX_TXBF_CFG_1  0x13a4
+#define TX_TXBF_CFG_2  0x13a8
+#define TX_TXBF_CFG_3  0x13ac
+
+/* TX_FBK_CFG_3S */
+#define TX_FBK_CFG_3S_00x13c4
+#define TX_FBK_CFG_3S_10x13c8
+
+/*
  * RX_FILTER_CFG: RX configuration register.
  */
 #define RX_FILTER_CFG  0x1400
@@ -2157,6 +2169,7 @@ struct mac_iveiv_entry {
 /*
  * RFCSR 2:
  */
+#define RFCSR2_RESCAL_BP   FIELD8(0x40)
 #define RFCSR2_RESCAL_EN   FIELD8(0x80)
 
 /*
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index df0c6dd90735..870e2da20d47 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -6865,6 +6865,144 @@ static void rt2800_init_rfcsr_3593(struct rt2x00_dev 
*rt2x00dev)
/* TODO: enable stream mode support */
 }
 
+static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev)
+{
+   u8 rfcsr;
+
+   /* TODO: get the actual ECO value from the SoC */
+   const unsigned int eco = 5;
+
+   rt2800_rf_init_calibration(rt2x00dev, 2);
+
+   rt2800_rfcsr_write(rt2x00dev, 0, 0xe0);
+   rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
+   rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
+   rt2800_rfcsr_write(rt2x00dev, 3, 0x20);
+   rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
+   rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 8, 0x5b);
+   rt2800_rfcsr_write(rt2x00dev, 9, 0x08);
+   rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
+   rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
+   rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
+   rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
+   rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+
+   /* RFCSR 17 will be initialized later based on the
+* frequency offset stored in the EEPROM
+*/
+
+   rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
+   rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+   rt2800_rfcsr_write(rt2x00dev, 23, 0xc0);
+   rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+   rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+   rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
+   rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
+   rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
+   rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
+   rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 41, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 42, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
+   rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
+   rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
+   rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
+   rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
+   rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
+   rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
+   rt2800_rfcsr_write(rt2x00dev, 53, 0x76);
+   rt2800_rfcsr_write(rt2x00dev, 54, 0x76);
+   rt2800_rfcsr_write(rt2x00dev, 55, 0x76);
+   rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
+   rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
+   rt2800_rfcsr_write(rt2x00dev, 58, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
+   rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
+  

[PATCH 11/40] rt2x00: rt2800lib: enable VCO calibration for RF3853

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index a1f8ca9a788b..15bcad1156d9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4414,6 +4414,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
case RF3053:
case RF3070:
case RF3290:
+   case RF3853:
case RF5360:
case RF5362:
case RF5370:
@@ -7894,6 +7895,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
*rt2x00dev)
case RF3053:
case RF3070:
case RF3290:
+   case RF3853:
case RF5360:
case RF5362:
case RF5370:
-- 
2.11.0



[PATCH 09/40] rt2x00: rt2800lib: enable support for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index ff653f0d43d2..efac8a320054 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7869,6 +7869,7 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
case RT3390:
case RT3572:
case RT3593:
+   case RT3883:
case RT5390:
case RT5392:
case RT5592:
-- 
2.11.0



[PATCH 10/40] rt2x00: rt2800lib: add rf_vals for RF3853

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  4 +-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 65 ++
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 02ed0d512734..2190bf07d004 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -48,7 +48,8 @@
  * RF2853 2.4G/5G 3T3R
  * RF3320 2.4G 1T1R(RT3350/RT3370/RT3390)
  * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392)
- * RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662)
+ * RF3053 2.4G/5G 3T3R(RT3563/RT3573/RT3593)
+ * RF3853 2.4G/5G 3T3R(RT3883/RT3662)
  * RF5592 2.4G/5G 2T2R
  * RF3070 2.4G 1T1R
  * RF5360 2.4G 1T1R
@@ -72,6 +73,7 @@
 #define RF5592 0x000f
 #define RF3070 0x3070
 #define RF3290 0x3290
+#define RF3853 0x3853
 #define RF5360 0x5360
 #define RF5362 0x5362
 #define RF5370 0x5370
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index efac8a320054..a1f8ca9a788b 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7482,6 +7482,66 @@ static const struct rf_channel rf_vals_3x[] = {
{173, 0x61, 0, 9},
 };
 
+static const struct rf_channel rf_vals_3853[] = {
+   {1,  241, 6, 2},
+   {2,  241, 6, 7},
+   {3,  242, 6, 2},
+   {4,  242, 6, 7},
+   {5,  243, 6, 2},
+   {6,  243, 6, 7},
+   {7,  244, 6, 2},
+   {8,  244, 6, 7},
+   {9,  245, 6, 2},
+   {10, 245, 6, 7},
+   {11, 246, 6, 2},
+   {12, 246, 6, 7},
+   {13, 247, 6, 2},
+   {14, 248, 6, 4},
+
+   {36, 0x56, 8, 4},
+   {38, 0x56, 8, 6},
+   {40, 0x56, 8, 8},
+   {44, 0x57, 8, 0},
+   {46, 0x57, 8, 2},
+   {48, 0x57, 8, 4},
+   {52, 0x57, 8, 8},
+   {54, 0x57, 8, 10},
+   {56, 0x58, 8, 0},
+   {60, 0x58, 8, 4},
+   {62, 0x58, 8, 6},
+   {64, 0x58, 8, 8},
+
+   {100, 0x5b, 8, 8},
+   {102, 0x5b, 8, 10},
+   {104, 0x5c, 8, 0},
+   {108, 0x5c, 8, 4},
+   {110, 0x5c, 8, 6},
+   {112, 0x5c, 8, 8},
+   {114, 0x5c, 8, 10},
+   {116, 0x5d, 8, 0},
+   {118, 0x5d, 8, 2},
+   {120, 0x5d, 8, 4},
+   {124, 0x5d, 8, 8},
+   {126, 0x5d, 8, 10},
+   {128, 0x5e, 8, 0},
+   {132, 0x5e, 8, 4},
+   {134, 0x5e, 8, 6},
+   {136, 0x5e, 8, 8},
+   {140, 0x5f, 8, 0},
+
+   {149, 0x5f, 8, 9},
+   {151, 0x5f, 8, 11},
+   {153, 0x60, 8, 1},
+   {157, 0x60, 8, 5},
+   {159, 0x60, 8, 7},
+   {161, 0x60, 8, 9},
+   {165, 0x61, 8, 1},
+   {167, 0x61, 8, 3},
+   {169, 0x61, 8, 5},
+   {171, 0x61, 8, 7},
+   {173, 0x61, 8, 9},
+};
+
 static const struct rf_channel rf_vals_5592_xtal20[] = {
/* Channel, N, K, mod, R */
{1, 482, 4, 10, 3},
@@ -7712,6 +7772,11 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev 
*rt2x00dev)
spec->channels = rf_vals_3x;
break;
 
+   case RF3853:
+   spec->num_channels = ARRAY_SIZE(rf_vals_3853);
+   spec->channels = rf_vals_3853;
+   break;
+
case RF5592:
rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, );
if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
-- 
2.11.0



[PATCH 08/40] rt2x00: allow to build rt2800soc module for RT3883

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig 
b/drivers/net/wireless/ralink/rt2x00/Kconfig
index de62f5dcb62f..3f2651dcbf37 100644
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
@@ -201,7 +201,7 @@ endif
 
 config RT2800SOC
tristate "Ralink WiSoC support"
-   depends on SOC_RT288X || SOC_RT305X
+   depends on SOC_RT288X || SOC_RT305X || SOC_RT3883
select RT2X00_LIB_SOC
select RT2X00_LIB_MMIO
select RT2X00_LIB_CRYPTO
-- 
2.11.0



[PATCH 07/40] rt2x00: rt2800lib: fix max supported beacon count for RT3593

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5058494d6c27..ff653f0d43d2 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7899,7 +7899,10 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
-   drv_data->hw_beacon_count = 8;
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   drv_data->hw_beacon_count = 16;
+   else
+   drv_data->hw_beacon_count = 8;
 
/*
 * Allocate eeprom data.
-- 
2.11.0



[PATCH 06/40] rt2x00: rt2800lib: init additional beacon offset registers

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 14 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 24 
 2 files changed, 38 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index a81852cfb4f9..02ed0d512734 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -629,6 +629,20 @@
  */
 #define PBF_DBG0x043c
 
+/* BCN_OFFSET2 */
+#define BCN_OFFSET20x0444
+#define BCN_OFFSET2_BCN8   FIELD32(0x00ff)
+#define BCN_OFFSET2_BCN9   FIELD32(0xff00)
+#define BCN_OFFSET2_BCN10  FIELD32(0x00ff)
+#define BCN_OFFSET2_BCN11  FIELD32(0xff00)
+
+/* BCN_OFFSET3 */
+#define BCN_OFFSET30x0448
+#define BCN_OFFSET3_BCN12  FIELD32(0x00ff)
+#define BCN_OFFSET3_BCN13  FIELD32(0xff00)
+#define BCN_OFFSET3_BCN14  FIELD32(0x00ff)
+#define BCN_OFFSET3_BCN15  FIELD32(0xff00)
+
 /*
  * RF registers
  */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 0893d9147af9..5058494d6c27 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -4665,6 +4665,30 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
if (ret)
return ret;
 
+   if (drv_data->hw_beacon_count == 16) {
+   rt2800_register_read(rt2x00dev, BCN_OFFSET2, );
+   rt2x00_set_field32(, BCN_OFFSET2_BCN8,
+  rt2800_get_beacon_offset(rt2x00dev, 8));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN9,
+  rt2800_get_beacon_offset(rt2x00dev, 9));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN10,
+  rt2800_get_beacon_offset(rt2x00dev, 10));
+   rt2x00_set_field32(, BCN_OFFSET2_BCN11,
+  rt2800_get_beacon_offset(rt2x00dev, 11));
+   rt2800_register_write(rt2x00dev, BCN_OFFSET2, reg);
+
+   rt2800_register_read(rt2x00dev, BCN_OFFSET3, );
+   rt2x00_set_field32(, BCN_OFFSET3_BCN12,
+  rt2800_get_beacon_offset(rt2x00dev, 12));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN13,
+  rt2800_get_beacon_offset(rt2x00dev, 13));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN14,
+  rt2800_get_beacon_offset(rt2x00dev, 14));
+   rt2x00_set_field32(, BCN_OFFSET3_BCN15,
+  rt2800_get_beacon_offset(rt2x00dev, 15));
+   rt2800_register_write(rt2x00dev, BCN_OFFSET3, reg);
+   }
+
rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x013f);
rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x8003);
 
-- 
2.11.0



[PATCH 05/40] rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

Some chipsets can handle more than 8 beacons at once.
Add a new field to the rt2800_drv_data structure which
will hold the number of supported beacons of the given
chipset.

Update the rt2x00_init_registers function to get the
beacon count from the new field instead of using a
hardcoded value.

In order to keep the current behaviour, initialize the
new field with the actually used value.

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 4 +++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index dcacfa54b3d6..0893d9147af9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -5025,7 +5025,7 @@ static int rt2800_init_registers(struct rt2x00_dev 
*rt2x00dev)
/*
 * Clear all beacons
 */
-   for (i = 0; i < 8; i++)
+   for (i = 0; i < drv_data->hw_beacon_count; i++)
rt2800_clear_beacon_register(rt2x00dev, i);
 
if (rt2x00_is_usb(rt2x00dev)) {
@@ -7875,6 +7875,8 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (rt2x00_rt(rt2x00dev, RT3593))
__set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
 
+   drv_data->hw_beacon_count = 8;
+
/*
 * Allocate eeprom data.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index ccfa8cf1f5ac..ab49e6feeeb9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -37,6 +37,7 @@ struct rt2800_drv_data {
u8 max_psdu;
unsigned int tbtt_tick;
unsigned int ampdu_factor_cnt[4];
+   unsigned int hw_beacon_count;
DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
 
unsigned long rt2800_flags;
-- 
2.11.0



[PATCH 03/40] rt2x00: rt2800: serialize shared memory access

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

The shared memory of the rt2800 devices is accessible
through the register offset range between 0x4000 and
0x8000. The size of this range is 16KB only and on
devices which have more than 16KB of shared memory either
the low or the high part of the memory is accessible at a
time.

Serialize all accesses to the shared memory by a mutex,
in order to avoid concurrent use of that.

Signed-off-by: Gabor Juhos 
[dan...@makrotopia.org: added comments for added mutex/spinlock]
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 55 -
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h  | 35 
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 26 
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |  4 ++
 drivers/net/wireless/ralink/rt2x00/rt2800pci.c  | 14 +++
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |  3 ++
 drivers/net/wireless/ralink/rt2x00/rt2800usb.c  | 31 ++
 7 files changed, 167 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5045af1b0dc9..0fd67026f806 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -451,11 +451,13 @@ void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
rt2x00_set_field32(, H2M_MAILBOX_CSR_CMD_TOKEN, token);
rt2x00_set_field32(, H2M_MAILBOX_CSR_ARG0, arg0);
rt2x00_set_field32(, H2M_MAILBOX_CSR_ARG1, arg1);
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
 
reg = 0;
rt2x00_set_field32(, HOST_CMD_CSR_HOST_COMMAND, command);
rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
+   rt2800_shared_mem_unlock(rt2x00dev);
}
 
mutex_unlock(>csr_mutex);
@@ -674,7 +676,9 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 * Wait for device to stabilize.
 */
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, );
+   rt2800_shared_mem_unlock(rt2x00dev);
if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
break;
msleep(1);
@@ -694,10 +698,16 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
/*
 * Initialize firmware.
 */
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
+
if (rt2x00_is_usb(rt2x00dev)) {
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
+
rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
}
msleep(1);
@@ -1035,8 +1045,10 @@ void rt2800_write_beacon(struct queue_entry *entry, 
struct txentry_desc *txdesc)
 
beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
 
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
   entry->skb->len + padding_len);
+   rt2800_shared_mem_unlock(rt2x00dev);
__set_bit(ENTRY_BCN_ENABLED, >flags);
 
/*
@@ -1066,6 +1078,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 
beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
 
+   rt2800_shared_mem_lock(rt2x00dev);
+
/*
 * For the Beacon base registers we only need to clear
 * the whole TXWI which (when set to 0) will invalidate
@@ -1073,6 +1087,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 */
for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
+
+   rt2800_shared_mem_unlock(rt2x00dev);
 }
 
 void rt2800_clear_beacon(struct queue_entry *entry)
@@ -1261,7 +1277,9 @@ static void rt2800_delete_wcid_attr(struct rt2x00_dev 
*rt2x00dev, int wcid)
 {
u32 offset;
offset = MAC_WCID_ATTR_ENTRY(wcid);
+   rt2800_shared_mem_lock(rt2x00dev);
rt2800_register_write(rt2x00dev, offset, 0);
+   rt2800_shared_mem_unlock(rt2x00dev);
 }
 
 static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
@@ -1274,11 +1292,13 @@ static void rt2800_config_wcid_attr_bssidx(struct 
rt2x00_dev *rt2x00dev,
 * The BSS Idx numbers is split in a main value of 3 bits,
 * and a extended field for adding one additional bit to the value.
 */
+   rt2800_shared_mem_lock(rt2x00dev);

[PATCH 04/40] rt2x00: rt2800lib: fix beacon generation on RT3593

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

On the RT3593 chipset, the beacon registers are located
in the high 8KB part of the shared memory.

The high part of the shared memory is only accessible
if it is explicitly selected. Add a helper function
in order to be able to control the SHR_MSEL bit in
the PBF_SYS_CTRL register. Also add a few more helper
functions and use those to select the correct part of
the shared memory before and after accessing the beacon
registers.

The base addresses of the beacon registers are also
different from the actually used values, so fix the
'rt2800_hw_beacon_base' function to return the correct
values.

Signed-off-by: Gabor Juhos 
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h|  3 ++
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 44 ++
 2 files changed, 47 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 2371896c1e99..a81852cfb4f9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -574,6 +574,7 @@
 #define PBF_SYS_CTRL   0x0400
 #define PBF_SYS_CTRL_READY FIELD32(0x0080)
 #define PBF_SYS_CTRL_HOST_RAM_WRITEFIELD32(0x0001)
+#define PBF_SYS_CTRL_SHR_MSEL  FIELD32(0x0008)
 
 /*
  * HOST-MCU shared memory
@@ -2026,6 +2027,8 @@ struct mac_iveiv_entry {
  (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
  (HW_BEACON_BASE6 - ((__index - 6) * 0x0200
 
+#define HW_BEACON_BASE_HIGH(__index)   (0x4000 + (__index) * 512)
+
 #define BEACON_BASE_TO_OFFSET(_base)   (((_base) - 0x4000) / 64)
 
 /*
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 0fd67026f806..dcacfa54b3d6 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -82,6 +82,39 @@ static inline bool rt2800_is_305x_soc(struct rt2x00_dev 
*rt2x00dev)
return false;
 }
 
+static inline void rt2800_shared_mem_select(struct rt2x00_dev *rt2x00dev,
+   bool high)
+{
+   u32 reg;
+
+   if (WARN_ON_ONCE(!rt2800_has_high_shared_mem(rt2x00dev)))
+   return;
+
+   rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, );
+   rt2x00_set_field32(, PBF_SYS_CTRL_SHR_MSEL, high);
+   rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
+}
+
+static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   return true;
+
+   return false;
+}
+
+static inline void rt2800_select_beacon_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2800_beacon_uses_high_mem(rt2x00dev))
+   rt2800_shared_mem_select(rt2x00dev, true);
+}
+
+static inline void rt2800_deselect_beacon_mem(struct rt2x00_dev *rt2x00dev)
+{
+   if (rt2800_beacon_uses_high_mem(rt2x00dev))
+   rt2800_shared_mem_select(rt2x00dev, false);
+}
+
 static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
 const unsigned int word, const u8 value)
 {
@@ -948,6 +981,9 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
 static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  unsigned int index)
 {
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   return HW_BEACON_BASE_HIGH(index);
+
return HW_BEACON_BASE(index);
 }
 
@@ -1046,8 +1082,12 @@ void rt2800_write_beacon(struct queue_entry *entry, 
struct txentry_desc *txdesc)
beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
 
rt2800_shared_mem_lock(rt2x00dev);
+
+   rt2800_select_beacon_mem(rt2x00dev);
rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
   entry->skb->len + padding_len);
+   rt2800_deselect_beacon_mem(rt2x00dev);
+
rt2800_shared_mem_unlock(rt2x00dev);
__set_bit(ENTRY_BCN_ENABLED, >flags);
 
@@ -1080,6 +1120,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
 
rt2800_shared_mem_lock(rt2x00dev);
 
+   rt2800_select_beacon_mem(rt2x00dev);
+
/*
 * For the Beacon base registers we only need to clear
 * the whole TXWI which (when set to 0) will invalidate
@@ -1088,6 +1130,8 @@ static inline void rt2800_clear_beacon_register(struct 
rt2x00_dev *rt2x00dev,
for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
rt2800_register_write(rt2x00dev, beacon_base + i, 0);
 
+   rt2800_deselect_beacon_mem(rt2x00dev);
+
rt2800_shared_mem_unlock(rt2x00dev);
 }
 
-- 
2.11.0



[PATCH 02/40] rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag

2017-01-13 Thread Daniel Golle
From: Gabor Juhos <juh...@openwrt.org>

Some chipsets have more than 16KB of shared memory.
Introduce a new rt2800 specific flag to indicate that
and add a helper function which helps to check the
presence of the new flag.

Also enable the new flag for the RT3593 chipset which
has 24KB of shared memory. The flag can also be used
for other chipsets, but none of those has been tested
yet.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c |  4 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 13 +
 2 files changed, 17 insertions(+)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 5436cdb07937..5045af1b0dc9 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -7770,6 +7770,7 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
 
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
+   struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
int retval;
u32 reg;
 
@@ -,6 +7778,9 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
if (retval)
return retval;
 
+   if (rt2x00_rt(rt2x00dev, RT3593))
+   __set_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
+
/*
 * Allocate eeprom data.
 */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index 256928f0ea6a..4ee424dfe23f 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -22,6 +22,10 @@
 
 #include "rt2800.h"
 
+enum rt2800_flag {
+   RT2800_HAS_HIGH_SHARED_MEM,
+};
+
 /* RT2800 driver data structure */
 struct rt2800_drv_data {
u8 calibration_bw20;
@@ -34,6 +38,8 @@ struct rt2800_drv_data {
unsigned int tbtt_tick;
unsigned int ampdu_factor_cnt[4];
DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
+
+   unsigned long rt2800_flags;
 };
 
 struct rt2800_ops {
@@ -66,6 +72,13 @@ struct rt2800_ops {
__le32 *(*drv_get_txwi)(struct queue_entry *entry);
 };
 
+static inline bool rt2800_has_high_shared_mem(struct rt2x00_dev *rt2x00dev)
+{
+   struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
+
+   return test_bit(RT2800_HAS_HIGH_SHARED_MEM, _data->rt2800_flags);
+}
+
 static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
const unsigned int offset,
u32 *value)
-- 
2.11.0



[PATCH 01/40] rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h

2017-01-13 Thread Daniel Golle
From: Gabor Juhos 

The rt2800_drv_data structure contains driver specific
information. Move the declaration into the rt2800lib.h
header which is a more logical place for it. Also fix
the comment style to avoid checkpatch warning.

The patch contains no functional changes, it is in
preparation for the next patch.

Signed-off-by: Gabor Juhos 
[dan...@makrotopia.org: removed stray newline]
---
 drivers/net/wireless/ralink/rt2x00/rt2800.h| 16 
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 16 
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index ec622a08a486..2371896c1e99 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -2969,20 +2969,4 @@ enum rt2800_eeprom_word {
 #define WCID_END   222
 #define STA_IDS_SIZE   (WCID_END - WCID_START + 2)
 
-/*
- * RT2800 driver data structure
- */
-struct rt2800_drv_data {
-   u8 calibration_bw20;
-   u8 calibration_bw40;
-   u8 bbp25;
-   u8 bbp26;
-   u8 txmixer_gain_24g;
-   u8 txmixer_gain_5g;
-   u8 max_psdu;
-   unsigned int tbtt_tick;
-   unsigned int ampdu_factor_cnt[4];
-   DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
-};
-
 #endif /* RT2800_H */
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
index 0a8b4df665fe..256928f0ea6a 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
@@ -20,6 +20,22 @@
 #ifndef RT2800LIB_H
 #define RT2800LIB_H
 
+#include "rt2800.h"
+
+/* RT2800 driver data structure */
+struct rt2800_drv_data {
+   u8 calibration_bw20;
+   u8 calibration_bw40;
+   u8 bbp25;
+   u8 bbp26;
+   u8 txmixer_gain_24g;
+   u8 txmixer_gain_5g;
+   u8 max_psdu;
+   unsigned int tbtt_tick;
+   unsigned int ampdu_factor_cnt[4];
+   DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
+};
+
 struct rt2800_ops {
void (*register_read)(struct rt2x00_dev *rt2x00dev,
  const unsigned int offset, u32 *value);
-- 
2.11.0



[PATCH 00/40] rt2x00 patches form OpenWrt.org

2017-01-13 Thread Daniel Golle
Some of these are fixes, most importantly Serge Vasilugin fixed setting
the HT20/HT40 filter which got us much closer to the expected
performance when using HT40 modes.

There is also a lot of new hardware support added:
Gabor Juhos wrote code for the Rt3883 WiSoC.
Daniel Golle implemented support for Rt3352 boards with external PA as
well as for boards using a 20MHz crystal instead of the usual 40MHz.
Serge Vasilugin contributed support for the Rt5350 WiSoC.
Michel Stempin, Felix Fietkau and John Crispin have been helping with
cleaning up things and putting away legal doubts.


Claudio Mignanti (1):
  rt2x00: rt2x00pci: set PCI MWI only if supported

Daniel Golle (2):
  rt2x00: support for for RT3352 with external PA
  rt2x00: add support for RT3352 with 20MHz crystal

Felix Fietkau (1):
  rt2x00: fix rf id for RT3352

Gabor Juhos (34):
  rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h
  rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag
  rt2x00: rt2800: serialize shared memory access
  rt2x00: rt2800lib: fix beacon generation on RT3593
  rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data
  rt2x00: rt2800lib: init additional beacon offset registers
  rt2x00: rt2800lib: fix max supported beacon count for RT3593
  rt2x00: allow to build rt2800soc module for RT3883
  rt2x00: rt2800lib: enable support for RT3883
  rt2x00: rt2800lib: add rf_vals for RF3853
  rt2x00: rt2800lib: enable VCO calibration for RF3853
  rt2x00: rt2800lib: add channel configuration function for RF3853
  rt2x00: rt2800lib: enable RF3853 support
  rt2x00: rt2800lib: add MAC register initialization for RT3883
  rt2x00: rt2800soc: fix rt2800soc_disable_radio for RT3883
  rt2x00: rt2800lib: add BBP register initialization for RT3883
  rt2x00: rt2800lib: add RFCSR initialization for RT3883
  rt2x00: rt2800lib: use the extended EEPROM map for RT3883
  rt2x00: rt2800lib: force rf type to RF3853 on RT3883
  rt2x00: rt2800lib: add channel configuration code for RT3883
  rt2x00: rt2800lib: fix txpower_to_dev function for RT3883
  rt2x00: rt2800lib: use correct txpower calculation function for RT3883
  rt2x00: rt2800lib: hardcode txmixer gain values to zero for RT3883
  rt2x00: rt2800lib: use correct [RT]XWI size for RT3883
  rt2x00: rt2800lib: use correct beacon base for RT3883
  rt2x00: rt2800lib: use correct beacon count for RT3883
  rt2x00: rt2800lib: fix antenna configuration for RT3883
  rt2x00: rt2800lib: fix LNA gain configuration for RT3883
  rt2x00: rt2800lib: fix VGC setup for RT3883
  rt2x00: rt2800lib: fix EEPROM LNA validation for RT3883
  rt2x00: rt2800lib: fix txpower compensation for RT3883
  rt2x00: rt2800lib: enable RT2800_HAS_HIGH_SHARED_MEM for RT3883
  rt2x00: rt2800lib: use high memory for beacons on RT3883
  rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS
interrupts

Michel Stempin (1):
  rt2x00: add support for RT5350 WiSoC

Serge Vasilugin (1):
  rt2x00: correctly set HT20/HT40 filter

 drivers/net/wireless/ralink/rt2x00/Kconfig  |2 +-
 drivers/net/wireless/ralink/rt2x00/rt2800.h |   77 +-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 1013 ++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h  |   65 ++
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c |   98 ++-
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |4 +
 drivers/net/wireless/ralink/rt2x00/rt2800pci.c  |   14 +
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |   12 +-
 drivers/net/wireless/ralink/rt2x00/rt2800usb.c  |   31 +
 drivers/net/wireless/ralink/rt2x00/rt2x00.h |   10 +
 drivers/net/wireless/ralink/rt2x00/rt2x00pci.c  |2 +
 11 files changed, 1254 insertions(+), 74 deletions(-)

-- 
2.11.0


Re: [RFC] [PULL REQUEST] rt2x00 patches from OpenWrt.org

2017-01-13 Thread Daniel Golle
On Fri, Jan 13, 2017 at 04:59:59PM +0100, Johannes Berg wrote:
> 
> > The advantage of pull requests is that author information can be
> > preserved more easily. Running git format-patch results in most
> > patches
> > having wrong SMTP sender information due to the assumption that the
> > patch author is the same person also submitting the patch.
> > So in practise, this would either require changing the From: (and
> > thus
> > Author) to myself or having most mails eaten by anti-spam measures
> > due
> > to non-matching SPF which prohibits my SMTP to send mail on behalf of
> > the original authors of the patches.
> > 
> 
> This is completely untrue. If the first line of the *body* of the email
> is "From: ..." then this is preserved as the author information by git
> am, and doing so is also the default in git format-patch/send-email
> when the author doesn't match the email configuration.

Thanks for the clarification, I'll then submit the patches via
git format-patch.

Cheers

Daniel


Re: [RFC] [PULL REQUEST] rt2x00 patches from OpenWrt.org

2017-01-13 Thread Daniel Golle
Hi Kalle,

On Fri, Jan 13, 2017 at 12:46:56PM +0200, Kalle Valo wrote:
> Daniel Golle <dan...@makrotopia.org> writes:
> > ...
> > Please review and comment, so we can get those patches merged!
> 
> No pull requests, please. Instead send these as patches, easier to
> review and actually also easier for me to merge.

The advantage of pull requests is that author information can be
preserved more easily. Running git format-patch results in most patches
having wrong SMTP sender information due to the assumption that the
patch author is the same person also submitting the patch.
So in practise, this would either require changing the From: (and thus
Author) to myself or having most mails eaten by anti-spam measures due
to non-matching SPF which prohibits my SMTP to send mail on behalf of
the original authors of the patches.

How do you suggest to handle this situation?


Cheers


Daniel


[RFC] [PULL REQUEST] rt2x00 patches from OpenWrt.org

2017-01-12 Thread Daniel Golle
Hi!

In preparation to be submitted upstream I started to clean up a huge
pile of patches for rt2x00 we have been carrying along for quite a
while (some for more than half a decade!).
Some of them are fixes, most importantly Serge Vasilugin fixed setting
the HT20/HT40 filter which got us much closer to the expected
performance when using HT40 modes.

And also a lot of new added hardware support:
Gabor Juhos wrote code for Rt3883 WiSoC.
Daniel Golle implemented support for Rt3352 by designs with external PA
as well as for boards using a 20MHz crystal instead of the usual 40MHz.
Serge Vasilugin contributed support for the Rt5350 WiSoC.
Michel Stempin, Felix Fietkau and John Crispin have been helping with
cleaning up things and putting away legal doubts.

Please review and comment, so we can get those patches merged!


Cheers


Daniel


The following changes since commit cc75c577806a53893122829d91cb122b51643a2d:

  mwifiex: get rid of global save_adapter and sdio_work (2017-01-12 16:49:18 
+0200)

are available in the git repository at:

  https://github.com/dangowrt/linux.git rt2x00-from-openwrt

for you to fetch changes up to fb8832d1896475059c964c75ab4baaf94199143c:

  rt2x00: fix WARN_ON_ONCE() caused by inbalanced set/clear of beacon enable 
bit (2017-01-13 04:17:57 +0100)


Claudio Mignanti (1):
  rt2x00: rt2x00pci: set PCI MWI only if supported

Daniel Golle (2):
  rt2x00: support for for RT3352 with external PA
  rt2x00: add support for RT3352 with 20MHz crystal

Felix Fietkau (1):
  rt2x00: fix rf id for RT3352

Gabor Juhos (34):
  rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h
  rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag
  rt2x00: rt2800: serialize shared memory access
  rt2x00: rt2800lib: fix beacon generation on RT3593
  rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data
  rt2x00: rt2800lib: init additional beacon offset registers
  rt2x00: rt2800lib: fix max supported beacon count for RT3593
  rt2x00: allow to build rt2800soc module for RT3883
  rt2x00: rt2800lib: enable support for RT3883
  rt2x00: rt2800lib: add rf_vals for RF3853
  rt2x00: rt2800lib: enable VCO calibration for RF3853
  rt2x00: rt2800lib: add channel configuration function for RF3853
  rt2x00: rt2800lib: enable RF3853 support
  rt2x00: rt2800lib: add MAC register initialization for RT3883
  rt2x00: rt2800soc: fix rt2800soc_disable_radio for RT3883
  rt2x00: rt2800lib: add BBP register initialization for RT3883
  rt2x00: rt2800lib: add RFCSR initialization for RT3883
  rt2x00: rt2800lib: use the extended EEPROM map for RT3883
  rt2x00: rt2800lib: force rf type to RF3853 on RT3883
  rt2x00: rt2800lib: add channel configuration code for RT3883
  rt2x00: rt2800lib: fix txpower_to_dev function for RT3883
  rt2x00: rt2800lib: use correct txpower calculation function for RT3883
  rt2x00: rt2800lib: hardcode txmixer gain values to zero for RT3883
  rt2x00: rt2800lib: use correct [RT]XWI size for RT3883
  rt2x00: rt2800lib: use correct beacon base for RT3883
  rt2x00: rt2800lib: use correct beacon count for RT3883
  rt2x00: rt2800lib: fix antenna configuration for RT3883
  rt2x00: rt2800lib: fix LNA gain configuration for RT3883
  rt2x00: rt2800lib: fix VGC setup for RT3883
  rt2x00: rt2800lib: fix EEPROM LNA validation for RT3883
  rt2x00: rt2800lib: fix txpower compensation for RT3883
  rt2x00: rt2800lib: enable RT2800_HAS_HIGH_SHARED_MEM for RT3883
  rt2x00: rt2800lib: use high memory for beacons on RT3883
  rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS 
interrupts

Michel Stempin (1):
  rt2x00: add support for RT5350 WiSoC

Serge Vasilugin (1):
  rt2x00 correctly set ht20/ht40 filter

evaxige (1):
  rt2x00: fix WARN_ON_ONCE() caused by inbalanced set/clear of beacon 
enable bit

 drivers/net/wireless/ralink/rt2x00/Kconfig  |2 +-
 drivers/net/wireless/ralink/rt2x00/rt2800.h |   79 +-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 1006 ++-
 drivers/net/wireless/ralink/rt2x00/rt2800lib.h  |   63 ++
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.c |   98 ++-
 drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |4 +
 drivers/net/wireless/ralink/rt2x00/rt2800pci.c  |   14 +
 drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |   12 +-
 drivers/net/wireless/ralink/rt2x00/rt2800usb.c  |   31 +
 drivers/net/wireless/ralink/rt2x00/rt2x00.h |   10 +
 drivers/net/wireless/ralink/rt2x00/rt2x00dev.c  |7 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00mac.c  |8 +-
 drivers/net/wireless/ralink/rt2x00/rt2x00pci.c  |2 +
 13 files changed, 1254 insertions(+), 82 deletions(-)