mac80211: clean and submit a bunch of rt2x00 patches
Clean and submit patches, mostly related to MT7620 to linux-wireless mailing list: https://patchwork.kernel.org/project/linux-wireless/list/?series=677770 Replace local patches with now submitted versions. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
		@@ -1,26 +1,21 @@
 | 
				
			|||||||
From patchwork Thu Dec 27 14:05:26 2018
 | 
					From 15eed6b853b7e06f08632ef3cbe6cc42ac3eb858 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
Content-Type: text/plain; charset="utf-8"
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
MIME-Version: 1.0
 | 
					 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					 | 
				
			||||||
X-Patchwork-Submitter: Tom Psyborg <pozega.tomislav@gmail.com>
 | 
					 | 
				
			||||||
X-Patchwork-Id: 10743707
 | 
					 | 
				
			||||||
X-Patchwork-Delegate: kvalo@adurom.com
 | 
					 | 
				
			||||||
From: =?utf-8?q?Tomislav_Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					 | 
				
			||||||
To: linux-wireless@vger.kernel.org
 | 
					 | 
				
			||||||
Cc: kvalo@codeaurora.org, hauke@hauke-m.de, nbd@nbd.name,
 | 
					 | 
				
			||||||
        john@phrozen.org, sgruszka@redhat.com, daniel@makrotopia.org
 | 
					 | 
				
			||||||
Subject: [PATCH 2/2] rt2x00: define RF5592 in init_eeprom routine
 | 
					 | 
				
			||||||
Date: Thu, 27 Dec 2018 15:05:26 +0100
 | 
					Date: Thu, 27 Dec 2018 15:05:26 +0100
 | 
				
			||||||
Message-Id: <1545919526-4074-2-git-send-email-pozega.tomislav@gmail.com>
 | 
					Subject: [PATCH 01/16] rt2x00: define RF5592 in init_eeprom routine
 | 
				
			||||||
X-Mailer: git-send-email 1.7.0.4
 | 
					 | 
				
			||||||
In-Reply-To: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
 | 
					 | 
				
			||||||
References: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
 | 
					 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Sender: linux-wireless-owner@vger.kernel.org
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Precedence: bulk
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
List-ID: <linux-wireless.vger.kernel.org>
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
X-Mailing-List: linux-wireless@vger.kernel.org
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
X-Virus-Scanned: ClamAV using ClamSMTP
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This patch fixes following crash on Linksys EA2750 during 5GHz wifi
 | 
					This patch fixes following crash on Linksys EA2750 during 5GHz wifi
 | 
				
			||||||
init:
 | 
					init:
 | 
				
			||||||
@@ -35,8 +30,8 @@ init:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    2 ++
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
 | 
				
			||||||
 1 files changed, 2 insertions(+), 0 deletions(-)
 | 
					 1 file changed, 2 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,16 +1,28 @@
 | 
				
			|||||||
From: David Bauer <mail@david-bauer.net>
 | 
					From 208be6e22eba13408a0a3eb4c02256bc9ddfaf48 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Mon, 16 Dec 2019 20:47:06 +0100
 | 
					Date: Mon, 16 Dec 2019 20:47:06 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add throughput LED trigger
 | 
					Subject: [PATCH 02/16] rt2x00: add throughput LED trigger
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: David Bauer <mail@david-bauer.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This adds a (currently missing) throughput LED trigger for the rt2x00
 | 
					This adds a (currently missing) throughput LED trigger for the rt2x00
 | 
				
			||||||
driver. Previously, LED triggers had to be assigned to the netdev, which
 | 
					driver. Previously, LED triggers had to be assigned to the netdev, which
 | 
				
			||||||
was limited to a single VAP.
 | 
					was limited to a single VAP.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signed-off-by: David Bauer <mail@david-bauer.net>
 | 
					 | 
				
			||||||
Tested-by: Christoph Krapp <achterin@googlemail.com>
 | 
					Tested-by: Christoph Krapp <achterin@googlemail.com>
 | 
				
			||||||
 | 
					Signed-off-by: David Bauer <mail@david-bauer.net>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 17 +++++++++++++++++
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 18 ++++++++++++++++++
 | 
				
			||||||
 1 file changed, 17 insertions(+)
 | 
					 1 file changed, 18 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
				
			||||||
@@ -34,13 +46,14 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
 | 
				
			|||||||
 static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
 | 
					 static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 	struct hw_mode_spec *spec = &rt2x00dev->spec;
 | 
					 	struct hw_mode_spec *spec = &rt2x00dev->spec;
 | 
				
			||||||
@@ -1206,6 +1219,10 @@ static int rt2x00lib_probe_hw(struct rt2
 | 
					@@ -1206,6 +1219,11 @@ static int rt2x00lib_probe_hw(struct rt2
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 #undef RT2X00_TASKLET_INIT
 | 
					 #undef RT2X00_TASKLET_INIT
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+	ieee80211_create_tpt_led_trigger(rt2x00dev->hw,
 | 
					+	ieee80211_create_tpt_led_trigger(rt2x00dev->hw,
 | 
				
			||||||
+		IEEE80211_TPT_LEDTRIG_FL_RADIO, rt2x00_tpt_blink,
 | 
					+					 IEEE80211_TPT_LEDTRIG_FL_RADIO,
 | 
				
			||||||
+		ARRAY_SIZE(rt2x00_tpt_blink));
 | 
					+					 rt2x00_tpt_blink,
 | 
				
			||||||
 | 
					+					 ARRAY_SIZE(rt2x00_tpt_blink));
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 	/*
 | 
					 	/*
 | 
				
			||||||
 	 * Register HW.
 | 
					 	 * Register HW.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,29 @@
 | 
				
			|||||||
From 9782a7f7488443568fa4d6088b73c9aff7eb8510 Mon Sep 17 00:00:00 2001
 | 
					From 8dcdb02e3ad5f3d384c071e0a36670bb342bab35 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
From: Daniel Golle <daniel@makrotopia.org>
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Wed, 19 Apr 2017 16:14:53 +0200
 | 
					Date: Wed, 19 Apr 2017 16:14:53 +0200
 | 
				
			||||||
Subject: [PATCH] rt2x00: add support for external PA on MT7620
 | 
					Subject: [PATCH 03/16] rt2x00: add support for external PA on MT7620
 | 
				
			||||||
To: Stanislaw Gruszka <sgruszka@redhat.com>
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
    linux-wireless@vger.kernel.org,
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
    Kalle Valo <kvalo@codeaurora.org>
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
Content-Type: text/plain; charset="UTF-8"
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
Content-Transfer-Encoding: quoted-printable
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
					Implement support for external PA connected to MT7620A.
 | 
				
			||||||
Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
[pozega.tomislav@gmail.com: use chanreg and dccal helpers.]
 | 
					[pozega.tomislav@gmail.com: use chanreg and dccal helpers.]
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 drivers/net/wireless/ralink/rt2x00/rt2800.h    |  1 +
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800.h   |  1 +
 | 
				
			||||||
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 70 +++++++++++++++++++++++++-
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 52 ++++++++++++++++++-
 | 
				
			||||||
 2 files changed, 70 insertions(+), 1 deletion(-)
 | 
					 2 files changed, 52 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 | 
				
			||||||
@@ -24,21 +31,19 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 #define EEPROM_NIC_CONF2_RX_STREAM	FIELD16(0x000f)
 | 
					 #define EEPROM_NIC_CONF2_RX_STREAM	FIELD16(0x000f)
 | 
				
			||||||
 #define EEPROM_NIC_CONF2_TX_STREAM	FIELD16(0x00f0)
 | 
					 #define EEPROM_NIC_CONF2_TX_STREAM	FIELD16(0x00f0)
 | 
				
			||||||
 #define EEPROM_NIC_CONF2_CRYSTAL	FIELD16(0x0600)
 | 
					 #define EEPROM_NIC_CONF2_CRYSTAL	FIELD16(0x0600)
 | 
				
			||||||
+#define EEPROM_NIC_CONF2_EXTERNAL_PA	FIELD16(0xc000)
 | 
					+#define EEPROM_NIC_CONF2_EXTERNAL_PA	FIELD16(0x8000)
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 /*
 | 
					 /*
 | 
				
			||||||
  * EEPROM LNA
 | 
					  * EEPROM LNA
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -4369,6 +4369,45 @@ static void rt2800_config_channel(struct
 | 
					@@ -4369,6 +4369,43 @@ static void rt2800_config_channel(struct
 | 
				
			||||||
 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
 | 
					 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+	if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
					+	if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
				
			||||||
+		if (test_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
					+		if (test_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
				
			||||||
+			     &rt2x00dev->cap_flags)) {
 | 
					+			     &rt2x00dev->cap_flags)) {
 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "Using incomplete support for " \
 | 
					 | 
				
			||||||
+					       "external PA\n");
 | 
					 | 
				
			||||||
+			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
 | 
					+			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
 | 
				
			||||||
+			reg |= 0x00000101;
 | 
					+			reg |= 0x00000101;
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
 | 
				
			||||||
@@ -76,7 +81,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 	bbp = rt2800_bbp_read(rt2x00dev, 4);
 | 
					 	bbp = rt2800_bbp_read(rt2x00dev, 4);
 | 
				
			||||||
 	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
 | 
					 	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
 | 
				
			||||||
 	rt2800_bbp_write(rt2x00dev, 4, bbp);
 | 
					 	rt2800_bbp_write(rt2x00dev, 4, bbp);
 | 
				
			||||||
@@ -9578,7 +9617,8 @@ static int rt2800_init_eeprom(struct rt2
 | 
					@@ -9578,7 +9615,8 @@ static int rt2800_init_eeprom(struct rt2
 | 
				
			||||||
 	 */
 | 
					 	 */
 | 
				
			||||||
 	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
 | 
					 	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -86,19 +91,19 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 		if (rt2x00_get_field16(eeprom,
 | 
					 		if (rt2x00_get_field16(eeprom,
 | 
				
			||||||
 		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
 | 
					 		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
 | 
				
			||||||
 		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
					 		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
				
			||||||
@@ -9589,6 +9629,18 @@ static int rt2800_init_eeprom(struct rt2
 | 
					@@ -9589,6 +9627,18 @@ static int rt2800_init_eeprom(struct rt2
 | 
				
			||||||
 			      &rt2x00dev->cap_flags);
 | 
					 			      &rt2x00dev->cap_flags);
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2);
 | 
					+	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) {
 | 
					+	if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) {
 | 
				
			||||||
+		if (rt2x00_get_field16(eeprom,
 | 
					+		if (!rt2x00_get_field16(eeprom,
 | 
				
			||||||
+		    EEPROM_NIC_CONF2_EXTERNAL_PA)) {
 | 
					+					EEPROM_NIC_CONF2_EXTERNAL_PA)) {
 | 
				
			||||||
+		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
					+			__clear_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
				
			||||||
+			      &rt2x00dev->cap_flags);
 | 
					+				    &rt2x00dev->cap_flags);
 | 
				
			||||||
+		    __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
 | 
					+			__clear_bit(CAPABILITY_EXTERNAL_PA_TX1,
 | 
				
			||||||
+			      &rt2x00dev->cap_flags);
 | 
					+				    &rt2x00dev->cap_flags);
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +1,32 @@
 | 
				
			|||||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					From 21f2acf0f9e9da35fbdb96ee0aea97b02472030b Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Mon, 8 Jan 2018 13:42:27 +0100
 | 
					Date: Mon, 8 Jan 2018 13:42:27 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add RF self TXDC calibration
 | 
					Subject: [PATCH 04/16] rt2x00: add RF self TXDC calibration for MT7620
 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Content-Type: text/plain; charset=UTF-8
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add TX self calibration based on mtk driver.
 | 
					Add TX self calibration based on mtk driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 51 +++++++++++++++++++
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 48 +++++++++++++++++++
 | 
				
			||||||
 1 file changed, 51 insertions(+)
 | 
					 1 file changed, 48 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -8438,6 +8438,56 @@ static void rt2800_init_rfcsr_5592(struc
 | 
					@@ -8436,6 +8436,53 @@ static void rt2800_init_rfcsr_5592(struc
 | 
				
			||||||
 	rt2800_led_open_drain_enable(rt2x00dev);
 | 
					 	rt2800_led_open_drain_enable(rt2x00dev);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -24,7 +36,6 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	u32 mac0518, mac051c, mac0528, mac052c;
 | 
					+	u32 mac0518, mac051c, mac0528, mac052c;
 | 
				
			||||||
+	u8 i;
 | 
					+	u8 i;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "RF Tx self calibration start\n");
 | 
					 | 
				
			||||||
+	mac0518 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
 | 
					+	mac0518 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
 | 
				
			||||||
+	mac051c = rt2800_register_read(rt2x00dev, RF_BYPASS0);
 | 
					+	mac051c = rt2800_register_read(rt2x00dev, RF_BYPASS0);
 | 
				
			||||||
+	mac0528 = rt2800_register_read(rt2x00dev, RF_CONTROL2);
 | 
					+	mac0528 = rt2800_register_read(rt2x00dev, RF_CONTROL2);
 | 
				
			||||||
@@ -42,18 +53,18 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, 0x4);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, 0x4);
 | 
				
			||||||
+	for (i = 0; i < 100; i = i + 1) {
 | 
					+	for (i = 0; i < 100; i = i + 1) {
 | 
				
			||||||
+		udelay(50);
 | 
					+		usleep_range(50, 100);
 | 
				
			||||||
+		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
 | 
					+		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
 | 
				
			||||||
+		if((rfvalue & 0x04) != 0x4)
 | 
					+		if ((rfvalue & 0x04) != 0x4)
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rfb5r1_org);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rfb5r1_org);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, 0x4);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, 0x4);
 | 
				
			||||||
+	for (i = 0; i < 100; i = i + 1) {
 | 
					+	for (i = 0; i < 100; i = i + 1) {
 | 
				
			||||||
+		udelay(50);
 | 
					+		usleep_range(50, 100);
 | 
				
			||||||
+		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1);
 | 
					+		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1);
 | 
				
			||||||
+		if((rfvalue & 0x04) != 0x4)
 | 
					+		if ((rfvalue & 0x04) != 0x4)
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, rfb7r1_org);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, rfb7r1_org);
 | 
				
			||||||
@@ -64,14 +75,12 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_register_write(rt2x00dev, RF_BYPASS0, mac051c);
 | 
					+	rt2800_register_write(rt2x00dev, RF_BYPASS0, mac051c);
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, RF_CONTROL2, mac0528);
 | 
					+	rt2800_register_write(rt2x00dev, RF_CONTROL2, mac0528);
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
 | 
					+	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
					 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 				       bool set_bw, bool is_ht40)
 | 
					 				       bool set_bw, bool is_ht40)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -9045,6 +9095,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -9043,6 +9090,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,21 @@
 | 
				
			|||||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					From b75efecd6473e6a044d214571c17cad8ae88ed42 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Mon, 8 Jan 2018 13:42:58 +0100
 | 
					Date: Mon, 8 Jan 2018 13:42:58 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add r calibration
 | 
					Subject: [PATCH 05/16] rt2x00: add r calibration for MT7620
 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Content-Type: text/plain; charset=UTF-8
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add r calibration code as found in mtk driver.
 | 
					Add r calibration code as found in mtk driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,15 +26,15 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -8488,6 +8488,155 @@ static void rt2800_rf_self_txdc_cal(stru
 | 
					@@ -8483,6 +8483,155 @@ static void rt2800_rf_self_txdc_cal(stru
 | 
				
			||||||
 	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
 | 
					 	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+static int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2)
 | 
					+static int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2)
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	int calcode;
 | 
					+	int calcode = ((d2 - d1) * 1000) / 43;
 | 
				
			||||||
+	calcode = ((d2 - d1) * 1000) / 43;
 | 
					+
 | 
				
			||||||
+	if ((calcode%10) >= 5)
 | 
					+	if ((calcode % 10) >= 5)
 | 
				
			||||||
+		calcode += 10;
 | 
					+		calcode += 10;
 | 
				
			||||||
+	calcode = (calcode / 10);
 | 
					+	calcode = (calcode / 10);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -70,7 +82,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (i = 0; i < 10000; i++) {
 | 
					+	for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macstatus & 0x1)
 | 
					+		if (macstatus & 0x1)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -85,7 +97,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (i = 0; i < 10000; i++) {
 | 
					+	for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macstatus & 0x2)
 | 
					+		if (macstatus & 0x2)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
@@ -112,7 +124,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 47, 0x04);
 | 
					+	rt2800_bbp_write(rt2x00dev, 47, 0x04);
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 22, 0x80);
 | 
					+	rt2800_bbp_write(rt2x00dev, 22, 0x80);
 | 
				
			||||||
+	udelay(100);
 | 
					+	usleep_range(100, 200);
 | 
				
			||||||
+	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
 | 
					+	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
 | 
				
			||||||
+	if (bytevalue > 128)
 | 
					+	if (bytevalue > 128)
 | 
				
			||||||
+		d1 = bytevalue - 256;
 | 
					+		d1 = bytevalue - 256;
 | 
				
			||||||
@@ -122,7 +134,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x01);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x01);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 22, 0x80);
 | 
					+	rt2800_bbp_write(rt2x00dev, 22, 0x80);
 | 
				
			||||||
+	udelay(100);
 | 
					+	usleep_range(100, 200);
 | 
				
			||||||
+	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
 | 
					+	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
 | 
				
			||||||
+	if (bytevalue > 128)
 | 
					+	if (bytevalue > 128)
 | 
				
			||||||
+		d2 = bytevalue - 256;
 | 
					+		d2 = bytevalue - 256;
 | 
				
			||||||
@@ -170,7 +182,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
					 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 				       bool set_bw, bool is_ht40)
 | 
					 				       bool set_bw, bool is_ht40)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -9095,6 +9244,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -9090,6 +9239,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,26 @@
 | 
				
			|||||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					From 865823b63f608ac024d326a465ba8fc1a28868cd Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Mon, 8 Jan 2018 13:43:37 +0100
 | 
					Date: Mon, 8 Jan 2018 13:43:37 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add RXDCOC calibration
 | 
					Subject: [PATCH 06/16] rt2x00: add RXDCOC calibration for MT7620
 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Content-Type: text/plain; charset=UTF-8
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add RXDCOC calibration code from mtk driver.
 | 
					Add RXDCOC calibration code from mtk driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					[fixed typo reported by Serge Vasilugin <vasilugin@yandex.ru>]
 | 
				
			||||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 65 +++++++++++++++++++
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 65 +++++++++++++++++++
 | 
				
			||||||
@@ -14,7 +28,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -8637,6 +8637,70 @@ static void rt2800_r_calibration(struct
 | 
					@@ -8632,6 +8632,70 @@ static void rt2800_r_calibration(struct
 | 
				
			||||||
 	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
 | 
					 	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -41,12 +55,12 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (i = 0; i < 10000; i++) {
 | 
					+	for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+		macvalue1 = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macvalue1 = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macvalue1 & 0x1)
 | 
					+		if (macvalue1 & 0x1)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
 | 
					+	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);
 | 
				
			||||||
+	saverfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4);
 | 
					+	saverfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4);
 | 
				
			||||||
+	saverfb5r4 = saverfb5r4 & (~0x40);
 | 
					+	saverfb5r4 = saverfb5r4 & (~0x40);
 | 
				
			||||||
+	saverfb7r4 = saverfb7r4 & (~0x40);
 | 
					+	saverfb7r4 = saverfb7r4 & (~0x40);
 | 
				
			||||||
@@ -63,9 +77,9 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+	for (i = 0; i < 10000; i++) {
 | 
					+	for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+		bbpreg = rt2800_bbp_read(rt2x00dev, 159);
 | 
					+		bbpreg = rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
+		if ((bbpreg & 0x40)==0)
 | 
					+		if ((bbpreg & 0x40) == 0)
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+		udelay(50);
 | 
					+		usleep_range(50, 100);
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	bbpreg = rt2800_bbp_read(rt2x00dev, 159);
 | 
					+	bbpreg = rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
@@ -85,7 +99,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
					 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 				       bool set_bw, bool is_ht40)
 | 
					 				       bool set_bw, bool is_ht40)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -9246,6 +9310,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -9241,6 +9305,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	rt2800_r_calibration(rt2x00dev);
 | 
					 	rt2800_r_calibration(rt2x00dev);
 | 
				
			||||||
 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
					 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,32 +1,46 @@
 | 
				
			|||||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					From 38b78ba60f6759968b19fe183a344a8612fef694 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Mon, 8 Jan 2018 13:43:56 +0100
 | 
					Date: Mon, 8 Jan 2018 13:43:56 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add RXIQ calibration
 | 
					Subject: [PATCH 07/16] rt2x00: add RXIQ calibration for MT7620
 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Content-Type: text/plain; charset=UTF-8
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add RXIQ calibration found in mtk driver. With old openwrt builds this
 | 
					Add RXIQ calibration found in mtk driver. With old openwrt builds this
 | 
				
			||||||
gets us ~8Mbps more of RX bandwidth (test with iPA/eLNA layout).
 | 
					gets us ~8Mbps more of RX bandwidth (test with iPA/eLNA layout).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 379 ++++++++++++++++++
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 384 ++++++++++++++++++
 | 
				
			||||||
 1 file changed, 379 insertions(+)
 | 
					 1 file changed, 384 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -8701,6 +8701,384 @@ static void rt2800_rxdcoc_calibration(st
 | 
					@@ -8696,6 +8696,389 @@ static void rt2800_rxdcoc_calibration(st
 | 
				
			||||||
 	rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
 | 
					 	rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+static u32 rt2800_do_sqrt_accumulation(u32 si) {
 | 
					+static u32 rt2800_do_sqrt_accumulation(u32 si)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
+	u32 root, root_pre, bit;
 | 
					+	u32 root, root_pre, bit;
 | 
				
			||||||
+	char i;
 | 
					+	char i;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
+	bit = 1 << 15;
 | 
					+	bit = 1 << 15;
 | 
				
			||||||
+	root = 0;
 | 
					+	root = 0;
 | 
				
			||||||
+	for (i = 15; i >= 0; i = i - 1) {
 | 
					+	for (i = 15; i >= 0; i = i - 1) {
 | 
				
			||||||
+		root_pre = root + bit;
 | 
					+		root_pre = root + bit;
 | 
				
			||||||
+		if ((root_pre*root_pre) <= si)
 | 
					+		if ((root_pre * root_pre) <= si)
 | 
				
			||||||
+			root = root_pre;
 | 
					+			root = root_pre;
 | 
				
			||||||
+		bit = bit >> 1;
 | 
					+		bit = bit >> 1;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -34,7 +48,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	return root;
 | 
					+	return root;
 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev) {
 | 
					+static void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
+	u8 rfb0r1, rfb0r2, rfb0r42;
 | 
					+	u8 rfb0r1, rfb0r2, rfb0r42;
 | 
				
			||||||
+	u8 rfb4r0, rfb4r19;
 | 
					+	u8 rfb4r0, rfb4r19;
 | 
				
			||||||
+	u8 rfb5r3, rfb5r4, rfb5r17, rfb5r18, rfb5r19, rfb5r20;
 | 
					+	u8 rfb5r3, rfb5r4, rfb5r17, rfb5r18, rfb5r19, rfb5r20;
 | 
				
			||||||
@@ -77,7 +92,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (i = 0; i < 10000; i++) {
 | 
					+	for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macstatus & 0x3)
 | 
					+		if (macstatus & 0x3)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -180,7 +195,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006);
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006);
 | 
				
			||||||
+			udelay(1);
 | 
					+			udelay(1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			bbpval = bbp1 & (~ 0x18);
 | 
					+			bbpval = bbp1 & (~0x18);
 | 
				
			||||||
+			bbpval = bbpval | 0x00;
 | 
					+			bbpval = bbpval | 0x00;
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 1, bbpval);
 | 
					+			rt2800_bbp_write(rt2x00dev, 1, bbpval);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -199,13 +214,13 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006);
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006);
 | 
				
			||||||
+			udelay(1);
 | 
					+			udelay(1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			bbpval = bbp1 & (~ 0x18);
 | 
					+			bbpval = bbp1 & (~0x18);
 | 
				
			||||||
+			bbpval = bbpval | 0x08;
 | 
					+			bbpval = bbpval | 0x08;
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 1, bbpval);
 | 
					+			rt2800_bbp_write(rt2x00dev, 1, bbpval);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x01);
 | 
					+			rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x01);
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+		udelay(500);
 | 
					+		usleep_range(500, 1500);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		vga_idx = 0;
 | 
					+		vga_idx = 0;
 | 
				
			||||||
+			while (vga_idx < 11) {
 | 
					+			while (vga_idx < 11) {
 | 
				
			||||||
@@ -217,7 +232,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+				for (i = 0; i < 10000; i++) {
 | 
					+				for (i = 0; i < 10000; i++) {
 | 
				
			||||||
+					bbpval = rt2800_bbp_read(rt2x00dev, 159);
 | 
					+					bbpval = rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
+					if ((bbpval & 0xff) == 0x93)
 | 
					+					if ((bbpval & 0xff) == 0x93)
 | 
				
			||||||
+						udelay(50);
 | 
					+						usleep_range(50, 100);
 | 
				
			||||||
+					else
 | 
					+					else
 | 
				
			||||||
+						break;
 | 
					+						break;
 | 
				
			||||||
+					}
 | 
					+					}
 | 
				
			||||||
@@ -247,7 +262,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+					value = rt2800_bbp_read(rt2x00dev, 159);
 | 
					+					value = rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
+					bbptemp = bbptemp + value;
 | 
					+					bbptemp = bbptemp + value;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+					if ((i < 2) && (bbptemp & 0x800000))
 | 
					+					if (i < 2 && (bbptemp & 0x800000))
 | 
				
			||||||
+						result = (bbptemp & 0xffffff) - 0x1000000;
 | 
					+						result = (bbptemp & 0xffffff) - 0x1000000;
 | 
				
			||||||
+					else if (i == 4)
 | 
					+					else if (i == 4)
 | 
				
			||||||
+						result = bbptemp;
 | 
					+						result = bbptemp;
 | 
				
			||||||
@@ -255,21 +270,23 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+						result = bbptemp;
 | 
					+						result = bbptemp;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+					if (i == 0)
 | 
					+					if (i == 0)
 | 
				
			||||||
+						mi = result/4096;
 | 
					+						mi = result / 4096;
 | 
				
			||||||
+					else if (i == 1)
 | 
					+					else if (i == 1)
 | 
				
			||||||
+						mq = result/4096;
 | 
					+						mq = result / 4096;
 | 
				
			||||||
+					else if (i == 2)
 | 
					+					else if (i == 2)
 | 
				
			||||||
+						si = bbptemp/4096;
 | 
					+						si = bbptemp / 4096;
 | 
				
			||||||
+					else if (i == 3)
 | 
					+					else if (i == 3)
 | 
				
			||||||
+						sq = bbptemp/4096;
 | 
					+						sq = bbptemp / 4096;
 | 
				
			||||||
+					else
 | 
					+					else
 | 
				
			||||||
+						riq = result/4096;
 | 
					+						riq = result / 4096;
 | 
				
			||||||
+				}
 | 
					+				}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				bbpval1 = si - mi*mi;
 | 
					+				bbpval1 = si - mi * mi;
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d", si, sq, riq, bbpval1, vga_idx);
 | 
					+				rt2x00_dbg(rt2x00dev,
 | 
				
			||||||
 | 
					+					   "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d",
 | 
				
			||||||
 | 
					+					   si, sq, riq, bbpval1, vga_idx);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if (bbpval1 >= (100*100))
 | 
					+				if (bbpval1 >= (100 * 100))
 | 
				
			||||||
+					break;
 | 
					+					break;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if (bbpval1 <= 100)
 | 
					+				if (bbpval1 <= 100)
 | 
				
			||||||
@@ -292,39 +309,39 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+					vga_idx = vga_idx + 1;
 | 
					+					vga_idx = vga_idx + 1;
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		sigma_i = rt2800_do_sqrt_accumulation(100*(si - mi*mi));
 | 
					+		sigma_i = rt2800_do_sqrt_accumulation(100 * (si - mi * mi));
 | 
				
			||||||
+		sigma_q = rt2800_do_sqrt_accumulation(100*(sq - mq*mq));
 | 
					+		sigma_q = rt2800_do_sqrt_accumulation(100 * (sq - mq * mq));
 | 
				
			||||||
+		r_iq = 10*(riq-(mi*mq));
 | 
					+		r_iq = 10 * (riq - (mi * mq));
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		rt2x00_dbg(rt2x00dev, "Sigma_i=%d, Sigma_q=%d, R_iq=%d", sigma_i, sigma_q, r_iq);
 | 
					+		rt2x00_dbg(rt2x00dev, "Sigma_i=%d, Sigma_q=%d, R_iq=%d", sigma_i, sigma_q, r_iq);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		if (((sigma_i <= 1400 ) && (sigma_i >= 1000))
 | 
					+		if (sigma_i <= 1400 && sigma_i >= 1000 &&
 | 
				
			||||||
+			&& ((sigma_i - sigma_q) <= 112)
 | 
					+		    (sigma_i - sigma_q) <= 112 &&
 | 
				
			||||||
+			&& ((sigma_i - sigma_q) >= -112)
 | 
					+		    (sigma_i - sigma_q) >= -112 &&
 | 
				
			||||||
+			&& ((mi <= 32) && (mi >= -32))
 | 
					+		    mi <= 32 && mi >= -32 &&
 | 
				
			||||||
+			&& ((mq <= 32) && (mq >= -32))) {
 | 
					+		    mq <= 32 && mq >= -32) {
 | 
				
			||||||
+				r_iq = 10*(riq-(mi*mq));
 | 
					+			r_iq = 10 * (riq - (mi * mq));
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", sigma_i, sigma_q, r_iq);
 | 
					+			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n",
 | 
				
			||||||
 | 
					+				   sigma_i, sigma_q, r_iq);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				g_rx = (1000 * sigma_q) / sigma_i;
 | 
					+			g_rx = (1000 * sigma_q) / sigma_i;
 | 
				
			||||||
+				g_imb = ((-2) * 128 * (1000 - g_rx)) / (1000 + g_rx);
 | 
					+			g_imb = ((-2) * 128 * (1000 - g_rx)) / (1000 + g_rx);
 | 
				
			||||||
+				ph_rx = (r_iq * 2292) / (sigma_i * sigma_q);
 | 
					+			ph_rx = (r_iq * 2292) / (sigma_i * sigma_q);
 | 
				
			||||||
+				rt2x00_info(rt2x00dev, "RXIQ G_imb=%d, Ph_rx=%d\n", g_imb, ph_rx);
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if ((ph_rx > 20) || (ph_rx < -20)) {
 | 
					+			if (ph_rx > 20 || ph_rx < -20) {
 | 
				
			||||||
+					ph_rx = 0;
 | 
					+				ph_rx = 0;
 | 
				
			||||||
+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					+				rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
				
			||||||
+				}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+				if ((g_imb > 12) || (g_imb < -12)) {
 | 
					 | 
				
			||||||
+					g_imb = 0;
 | 
					 | 
				
			||||||
+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					 | 
				
			||||||
+				}
 | 
					 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+		else {
 | 
					+
 | 
				
			||||||
 | 
					+			if (g_imb > 12 || g_imb < -12) {
 | 
				
			||||||
 | 
					+				g_imb = 0;
 | 
				
			||||||
 | 
					+				rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+		} else {
 | 
				
			||||||
+			g_imb = 0;
 | 
					+			g_imb = 0;
 | 
				
			||||||
+			ph_rx = 0;
 | 
					+			ph_rx = 0;
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", sigma_i, sigma_q, r_iq);
 | 
					+			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n",
 | 
				
			||||||
 | 
					+				   sigma_i, sigma_q, r_iq);
 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					+			rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -400,7 +417,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
					 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 				       bool set_bw, bool is_ht40)
 | 
					 				       bool set_bw, bool is_ht40)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -9313,6 +9691,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -9308,6 +9691,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
					 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
				
			||||||
 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
					 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
				
			||||||
 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
					 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					From 5f921753b95927c964a5061b5b64c310b968ff3e Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:43:14 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 08/16] rt2x00: don't run Rt5592 IQ calibration on MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The function rt2800_iq_calibrate is intended for Rt5592 only.
 | 
				
			||||||
 | 
					Don't call it for MT7620 which has it's own calibration functions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 | 
				
			||||||
 | 
					 1 file changed, 2 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -4366,7 +4366,8 @@ static void rt2800_config_channel(struct
 | 
				
			||||||
 | 
					 		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);
 | 
				
			||||||
 | 
					+		if (!rt2x00_rt(rt2x00dev, RT6352))
 | 
				
			||||||
 | 
					+			rt2800_iq_calibrate(rt2x00dev, rf->channel);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
				
			||||||
@@ -1,25 +1,38 @@
 | 
				
			|||||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
 | 
					From e02adea15f762d2add77b2b7714706f5c3c2f9c9 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
Date: Thu, 11 Jan 2018 19:53:49 +0100
 | 
					Date: Thu, 11 Jan 2018 19:53:49 +0100
 | 
				
			||||||
Subject: [PATCH] rt2x00: add TX LOFT calibration
 | 
					Subject: [PATCH 09/16] rt2x00: add TX LOFT calibration for MT7620
 | 
				
			||||||
MIME-Version: 1.0
 | 
					MIME-Version: 1.0
 | 
				
			||||||
Content-Type: text/plain; charset=UTF-8
 | 
					Content-Type: text/plain; charset=UTF-8
 | 
				
			||||||
Content-Transfer-Encoding: 8bit
 | 
					Content-Transfer-Encoding: 8bit
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add TX LOFT calibration from mtk driver.
 | 
					Add TX LOFT calibration from mtk driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
					Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 938 ++++++++++++++++++
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 922 ++++++++++++++++++
 | 
				
			||||||
 .../net/wireless/ralink/rt2x00/rt2800lib.h    |  10 +
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.h    |  10 +
 | 
				
			||||||
 2 files changed, 948 insertions(+)
 | 
					 2 files changed, 932 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -9079,6 +9079,943 @@ restore_value:
 | 
					@@ -9080,6 +9080,927 @@ restore_value:
 | 
				
			||||||
 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
 | 
					 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+static void rt2800_rf_configstore(struct rt2x00_dev *rt2x00dev, rf_reg_pair rf_reg_record[][13], u8 chain)
 | 
					+static void rt2800_rf_configstore(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					+				  struct rf_reg_pair rf_reg_record[][13], u8 chain)
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	u8 rfvalue = 0;
 | 
					+	u8 rfvalue = 0;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -131,13 +144,11 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+		rf_reg_record[CHAIN_1][12].value = rfvalue;
 | 
					+		rf_reg_record[CHAIN_1][12].value = rfvalue;
 | 
				
			||||||
+	} else {
 | 
					+	} else {
 | 
				
			||||||
+		rt2x00_warn(rt2x00dev, "Unknown chain = %u\n", chain);
 | 
					+		rt2x00_warn(rt2x00dev, "Unknown chain = %u\n", chain);
 | 
				
			||||||
+		return;
 | 
					 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_rf_configrecover(struct rt2x00_dev *rt2x00dev, rf_reg_pair rf_record[][13])
 | 
					+static void rt2800_rf_configrecover(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					+				    struct rf_reg_pair rf_record[][13])
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	u8 chain_index = 0, record_index = 0;
 | 
					+	u8 chain_index = 0, record_index = 0;
 | 
				
			||||||
+	u8 bank = 0, rf_register = 0, value = 0;
 | 
					+	u8 bank = 0, rf_register = 0, value = 0;
 | 
				
			||||||
@@ -148,11 +159,10 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			rf_register = rf_record[chain_index][record_index].reg;
 | 
					+			rf_register = rf_record[chain_index][record_index].reg;
 | 
				
			||||||
+			value = rf_record[chain_index][record_index].value;
 | 
					+			value = rf_record[chain_index][record_index].value;
 | 
				
			||||||
+			rt2800_rfcsr_write_bank(rt2x00dev, bank, rf_register, value);
 | 
					+			rt2800_rfcsr_write_bank(rt2x00dev, bank, rf_register, value);
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "bank: %d, rf_register: %d, value: %x\n", bank, rf_register, value);
 | 
					+			rt2x00_dbg(rt2x00dev, "bank: %d, rf_register: %d, value: %x\n",
 | 
				
			||||||
 | 
					+				   bank, rf_register, value);
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_setbbptonegenerator(struct rt2x00_dev *rt2x00dev)
 | 
					+static void rt2800_setbbptonegenerator(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
@@ -170,15 +180,13 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_bbp_write(rt2x00dev, 159, 0x3F);
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, 0x3F);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 244, 0x40);
 | 
					+	rt2800_bbp_write(rt2x00dev, 244, 0x40);
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static u32 rt2800_do_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx, u8 read_neg)
 | 
					+static u32 rt2800_do_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx, u8 read_neg)
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	u32 macvalue = 0;
 | 
					+	u32 macvalue = 0;
 | 
				
			||||||
+	int fftout_i = 0, fftout_q = 0;
 | 
					+	int fftout_i = 0, fftout_q = 0;
 | 
				
			||||||
+	u32 ptmp=0, pint = 0;
 | 
					+	u32 ptmp = 0, pint = 0;
 | 
				
			||||||
+	u8 bbp = 0;
 | 
					+	u8 bbp = 0;
 | 
				
			||||||
+	u8 tidxi;
 | 
					+	u8 tidxi;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -188,7 +196,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	bbp = 0x9b;
 | 
					+	bbp = 0x9b;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	while (bbp == 0x9b) {
 | 
					+	while (bbp == 0x9b) {
 | 
				
			||||||
+		udelay(10);
 | 
					+		usleep_range(10, 50);
 | 
				
			||||||
+		bbp = rt2800_bbp_read(rt2x00dev, 159);
 | 
					+		bbp = rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
+		bbp = bbp & 0xff;
 | 
					+		bbp = bbp & 0xff;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -233,10 +241,11 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	return pint;
 | 
					+	return pint;
 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static u32 rt2800_read_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx) {
 | 
					+static u32 rt2800_read_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
+	u32 macvalue = 0;
 | 
					+	u32 macvalue = 0;
 | 
				
			||||||
+	int fftout_i = 0, fftout_q = 0;
 | 
					+	int fftout_i = 0, fftout_q = 0;
 | 
				
			||||||
+	u32 ptmp=0, pint = 0;
 | 
					+	u32 ptmp = 0, pint = 0;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 158, 0xBA);
 | 
					+	rt2800_bbp_write(rt2x00dev, 158, 0xBA);
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 159, tidx);
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, tidx);
 | 
				
			||||||
@@ -252,7 +261,6 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	ptmp = (fftout_i * fftout_i);
 | 
					+	ptmp = (fftout_i * fftout_i);
 | 
				
			||||||
+	ptmp = ptmp + (fftout_q * fftout_q);
 | 
					+	ptmp = ptmp + (fftout_q * fftout_q);
 | 
				
			||||||
+	pint = ptmp;
 | 
					+	pint = ptmp;
 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "I = %d,  Q = %d, power = %x\n", fftout_i, fftout_q, pint);
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	return pint;
 | 
					+	return pint;
 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
@@ -266,18 +274,17 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	if (ch_idx == 0)
 | 
					+	if (ch_idx == 0)
 | 
				
			||||||
+		bbp = (iorq == 0) ? 0xb1: 0xb2;
 | 
					+		bbp = (iorq == 0) ? 0xb1 : 0xb2;
 | 
				
			||||||
+	else
 | 
					+	else
 | 
				
			||||||
+		bbp = (iorq == 0) ? 0xb8: 0xb9;
 | 
					+		bbp = (iorq == 0) ? 0xb8 : 0xb9;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+	rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+	bbp = dc;
 | 
					+	bbp = dc;
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_loft_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 alc_idx, u8 dc_result[][RF_ALC_NUM][2])
 | 
					+static void rt2800_loft_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx,
 | 
				
			||||||
 | 
					+			       u8 alc_idx, u8 dc_result[][RF_ALC_NUM][2])
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	u32 p0 = 0, p1 = 0, pf = 0;
 | 
					+	u32 p0 = 0, p1 = 0, pf = 0;
 | 
				
			||||||
+	char idx0 = 0, idx1 = 0;
 | 
					+	char idx0 = 0, idx1 = 0;
 | 
				
			||||||
@@ -303,16 +310,17 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+				p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
					+				p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			idx1 = idxf[iorq] + ((bidx == 5) ? 0 : ibit);
 | 
					+			idx1 = idxf[iorq] + (bidx == 5 ? 0 : ibit);
 | 
				
			||||||
+			idx1 = idx1 & 0x3F;
 | 
					+			idx1 = idx1 & 0x3F;
 | 
				
			||||||
+			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idx1);
 | 
					+			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idx1);
 | 
				
			||||||
+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
					+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "alc=%u, IorQ=%u, idx_final=%2x\n", alc_idx, iorq, idxf[iorq]);
 | 
					+			rt2x00_dbg(rt2x00dev, "alc=%u, IorQ=%u, idx_final=%2x\n",
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pf=%x, idx_0=%x, idx_1=%x, ibit=%x !\n", p0, p1, pf, idx0, idx1, ibit);
 | 
					+				   alc_idx, iorq, idxf[iorq]);
 | 
				
			||||||
 | 
					+			rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pf=%x, idx_0=%x, idx_1=%x, ibit=%x\n",
 | 
				
			||||||
 | 
					+				   p0, p1, pf, idx0, idx1, ibit);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			if ((bidx != 5) && (pf <= p0) && (pf < p1)) {
 | 
					+			if (bidx != 5 && pf <= p0 && pf < p1) {
 | 
				
			||||||
+				pf = pf;
 | 
					 | 
				
			||||||
+				idxf[iorq] = idxf[iorq];
 | 
					+				idxf[iorq] = idxf[iorq];
 | 
				
			||||||
+			} else if (p0 < p1) {
 | 
					+			} else if (p0 < p1) {
 | 
				
			||||||
+				pf = p0;
 | 
					+				pf = p0;
 | 
				
			||||||
@@ -321,17 +329,15 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+				pf = p1;
 | 
					+				pf = p1;
 | 
				
			||||||
+				idxf[iorq] = idx1 & 0x3F;
 | 
					+				idxf[iorq] = idx1 & 0x3F;
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "IorQ=%u, idx_final[%u]:%x, pf:%8x\n", iorq, iorq, idxf[iorq], pf);
 | 
					+			rt2x00_dbg(rt2x00dev, "IorQ=%u, idx_final[%u]:%x, pf:%8x\n",
 | 
				
			||||||
 | 
					+				   iorq, iorq, idxf[iorq], pf);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idxf[iorq]);
 | 
					+			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idxf[iorq]);
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+		ibit = ibit >> 1;
 | 
					+		ibit = ibit >> 1;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+	dc_result[ch_idx][alc_idx][0] = idxf[0];
 | 
					+	dc_result[ch_idx][alc_idx][0] = idxf[0];
 | 
				
			||||||
+	dc_result[ch_idx][alc_idx][1] = idxf[1];
 | 
					+	dc_result[ch_idx][alc_idx][1] = idxf[1];
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_iq_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 *ges, u8 *pes)
 | 
					+static void rt2800_iq_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 *ges, u8 *pes)
 | 
				
			||||||
@@ -349,26 +355,27 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	u8 bbp = 0;
 | 
					+	u8 bbp = 0;
 | 
				
			||||||
+	char bidx;
 | 
					+	char bidx;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "IQCalibration Start!\n");
 | 
					 | 
				
			||||||
+	for (bidx = 5; bidx >= 1; bidx--) {
 | 
					+	for (bidx = 5; bidx >= 1; bidx--) {
 | 
				
			||||||
+		for (gop = 0; gop < 2; gop++) {
 | 
					+		for (gop = 0; gop < 2; gop++) {
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "\n========================================================\n");
 | 
					+			rt2x00_dbg(rt2x00dev, "\n==============================================\n");
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			if ((gop == 1) || (bidx < 4)) {
 | 
					+			if (gop == 1 || bidx < 4) {
 | 
				
			||||||
+				if (gop == 0)
 | 
					+				if (gop == 0)
 | 
				
			||||||
+					iq_err = gerr;
 | 
					+					iq_err = gerr;
 | 
				
			||||||
+				else
 | 
					+				else
 | 
				
			||||||
+					iq_err = perr;
 | 
					+					iq_err = perr;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				first_search = (gop == 0) ? (bidx == 3) : (bidx == 5);
 | 
					+				first_search = (gop == 0) ? (bidx == 3) : (bidx == 5);
 | 
				
			||||||
+				touch_neg_max = (gop) ? ((iq_err & 0x0F) == 0x08) : ((iq_err & 0x3F) == 0x20);
 | 
					+				touch_neg_max = (gop) ? ((iq_err & 0x0F) == 0x08) :
 | 
				
			||||||
 | 
					+							((iq_err & 0x3F) == 0x20);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if (touch_neg_max) {
 | 
					+				if (touch_neg_max) {
 | 
				
			||||||
+					p0 = pf;
 | 
					+					p0 = pf;
 | 
				
			||||||
+					idx0 = iq_err;
 | 
					+					idx0 = iq_err;
 | 
				
			||||||
+				} else {
 | 
					+				} else {
 | 
				
			||||||
+					idx0 = iq_err - ibit;
 | 
					+					idx0 = iq_err - ibit;
 | 
				
			||||||
+					bbp = (ch_idx == 0) ? ((gop == 0) ? 0x28 : 0x29): ((gop == 0) ? 0x46 : 0x47);
 | 
					+					bbp = (ch_idx == 0) ? ((gop == 0) ? 0x28 : 0x29) :
 | 
				
			||||||
 | 
					+							      ((gop == 0) ? 0x46 : 0x47);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+					rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+					rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+					rt2800_bbp_write(rt2x00dev, 159, idx0);
 | 
					+					rt2800_bbp_write(rt2x00dev, 159, idx0);
 | 
				
			||||||
@@ -379,26 +386,30 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+				idx1 = iq_err + (first_search ? 0 : ibit);
 | 
					+				idx1 = iq_err + (first_search ? 0 : ibit);
 | 
				
			||||||
+				idx1 = (gop == 0) ? (idx1 & 0x0F) : (idx1 & 0x3F);
 | 
					+				idx1 = (gop == 0) ? (idx1 & 0x0F) : (idx1 & 0x3F);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : (gop == 0) ? 0x46 : 0x47;
 | 
					+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 :
 | 
				
			||||||
 | 
					+				      (gop == 0) ? 0x46 : 0x47;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+				rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+				rt2800_bbp_write(rt2x00dev, 159, idx1);
 | 
					+				rt2800_bbp_write(rt2x00dev, 159, idx1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
 | 
					+				p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pwer_final=%x, idx0=%x, idx1=%x, iq_err=%x, gop=%d, ibit=%x !\n", p0, p1, pf, idx0, idx1, iq_err, gop, ibit);
 | 
					+				rt2x00_dbg(rt2x00dev,
 | 
				
			||||||
 | 
					+					   "p0=%x, p1=%x, pwer_final=%x, idx0=%x, idx1=%x, iq_err=%x, gop=%d, ibit=%x\n",
 | 
				
			||||||
 | 
					+					   p0, p1, pf, idx0, idx1, iq_err, gop, ibit);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if ((!first_search) && (pf <= p0) && (pf < p1)) {
 | 
					+				if (!(!first_search && pf <= p0 && pf < p1)) {
 | 
				
			||||||
+					pf = pf;
 | 
					+					if (p0 < p1) {
 | 
				
			||||||
+				} else if (p0 < p1) {
 | 
					+						pf = p0;
 | 
				
			||||||
+					pf = p0;
 | 
					+						iq_err = idx0;
 | 
				
			||||||
+					iq_err = idx0;
 | 
					+					} else {
 | 
				
			||||||
+				} else {
 | 
					+						pf = p1;
 | 
				
			||||||
+					pf = p1;
 | 
					+						iq_err = idx1;
 | 
				
			||||||
+					iq_err = idx1;
 | 
					+					}
 | 
				
			||||||
+				}
 | 
					+				}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : (gop == 0) ? 0x46 : 0x47;
 | 
					+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 :
 | 
				
			||||||
 | 
					+						      (gop == 0) ? 0x46 : 0x47;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+				rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+				rt2800_bbp_write(rt2x00dev, 159, iq_err);
 | 
					+				rt2800_bbp_write(rt2x00dev, 159, iq_err);
 | 
				
			||||||
@@ -408,8 +419,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+				else
 | 
					+				else
 | 
				
			||||||
+					perr = iq_err;
 | 
					+					perr = iq_err;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "IQCalibration pf=%8x (%2x, %2x) !\n", pf, gerr & 0x0F, perr & 0x3F);
 | 
					+				rt2x00_dbg(rt2x00dev, "IQCalibration pf=%8x (%2x, %2x) !\n",
 | 
				
			||||||
+
 | 
					+					   pf, gerr & 0x0F, perr & 0x3F);
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -438,25 +449,21 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			rt2800_bbp_write(rt2x00dev, 159, pef & 0x3F);
 | 
					+			rt2800_bbp_write(rt2x00dev, 159, pef & 0x3F);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
 | 
					+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
 | 
				
			||||||
+			if ((gef == gsta) && (pef == psta)) {
 | 
					+			if (gef == gsta && pef == psta) {
 | 
				
			||||||
 | 
					+				pf = p1;
 | 
				
			||||||
 | 
					+				gerr = gef;
 | 
				
			||||||
 | 
					+				perr = pef;
 | 
				
			||||||
 | 
					+			} else if (pf > p1) {
 | 
				
			||||||
+				pf = p1;
 | 
					+				pf = p1;
 | 
				
			||||||
+				gerr = gef;
 | 
					+				gerr = gef;
 | 
				
			||||||
+				perr = pef;
 | 
					+				perr = pef;
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+			else if (pf > p1){
 | 
					+			rt2x00_dbg(rt2x00dev, "Fine IQCalibration p1=%8x pf=%8x (%2x, %2x) !\n",
 | 
				
			||||||
+				pf = p1;
 | 
					+				   p1, pf, gef & 0x0F, pef & 0x3F);
 | 
				
			||||||
+				gerr = gef;
 | 
					 | 
				
			||||||
+				perr = pef;
 | 
					 | 
				
			||||||
+			}
 | 
					 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "Fine IQCalibration p1=%8x pf=%8x (%2x, %2x) !\n", p1, pf, gef & 0x0F, pef & 0x3F);
 | 
					 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	ges[ch_idx] = gerr & 0x0F;
 | 
					+	ges[ch_idx] = gerr & 0x0F;
 | 
				
			||||||
+	pes[ch_idx] = perr & 0x3F;
 | 
					+	pes[ch_idx] = perr & 0x3F;
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "IQCalibration Done! CH = %u, (gain=%2x, phase=%2x)\n", ch_idx, gerr & 0x0F, perr & 0x3F);
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+static void rt2800_rf_aux_tx0_loopback(struct rt2x00_dev *rt2x00dev)
 | 
					+static void rt2800_rf_aux_tx0_loopback(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
@@ -495,7 +502,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+void rt2800_loft_iq_calibration(struct rt2x00_dev *rt2x00dev)
 | 
					+void rt2800_loft_iq_calibration(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
+{
 | 
					+{
 | 
				
			||||||
+	rf_reg_pair rf_store[CHAIN_NUM][13];
 | 
					+	struct rf_reg_pair rf_store[CHAIN_NUM][13];
 | 
				
			||||||
+	u32 macorg1 = 0;
 | 
					+	u32 macorg1 = 0;
 | 
				
			||||||
+	u32 macorg2 = 0;
 | 
					+	u32 macorg2 = 0;
 | 
				
			||||||
+	u32 macorg3 = 0;
 | 
					+	u32 macorg3 = 0;
 | 
				
			||||||
@@ -514,8 +521,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	u8 loft_dc_search_result[CHAIN_NUM][RF_ALC_NUM][2];
 | 
					+	u8 loft_dc_search_result[CHAIN_NUM][RF_ALC_NUM][2];
 | 
				
			||||||
+	u8 ger[CHAIN_NUM], per[CHAIN_NUM];
 | 
					+	u8 ger[CHAIN_NUM], per[CHAIN_NUM];
 | 
				
			||||||
+	u8 rf_gain[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x0c};
 | 
					+	u8 rf_gain[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x0c};
 | 
				
			||||||
+	u8 rfvga_gain_table[] = {0x24, 0x25, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3F};
 | 
					+	u8 rfvga_gain_table[] = {0x24, 0x25, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
 | 
				
			||||||
+
 | 
					+				 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3F};
 | 
				
			||||||
+	u8 vga_gain[] = {14, 14};
 | 
					+	u8 vga_gain[] = {14, 14};
 | 
				
			||||||
+	u8 bbp_2324gain[] = {0x16, 0x14, 0x12, 0x10, 0x0c, 0x08};
 | 
					+	u8 bbp_2324gain[] = {0x16, 0x14, 0x12, 0x10, 0x0c, 0x08};
 | 
				
			||||||
+	u8 bbp = 0, ch_idx = 0, rf_alc_idx = 0, idx = 0;
 | 
					+	u8 bbp = 0, ch_idx = 0, rf_alc_idx = 0, idx = 0;
 | 
				
			||||||
@@ -542,7 +549,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
					+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
				
			||||||
+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macvalue & 0x01)
 | 
					+		if (macvalue & 0x01)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -554,14 +561,13 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
					+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
				
			||||||
+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macvalue & 0x02)
 | 
					+		if (macvalue & 0x02)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
 | 
					+	for (ch_idx = 0; ch_idx < 2; ch_idx++)
 | 
				
			||||||
+		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
 | 
					+		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	bbpr30 = rt2800_bbp_read(rt2x00dev, 30);
 | 
					+	bbpr30 = rt2800_bbp_read(rt2x00dev, 30);
 | 
				
			||||||
+	rfb0r39 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 39);
 | 
					+	rfb0r39 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 39);
 | 
				
			||||||
@@ -576,7 +582,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_setbbptonegenerator(rt2x00dev);
 | 
					+	rt2800_setbbptonegenerator(rt2x00dev);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	for (ch_idx = 0; ch_idx < 2; ch_idx ++) {
 | 
					+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 23, 0x00);
 | 
					+		rt2800_bbp_write(rt2x00dev, 23, 0x00);
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 24, 0x00);
 | 
					+		rt2800_bbp_write(rt2x00dev, 24, 0x00);
 | 
				
			||||||
+		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00);
 | 
					+		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00);
 | 
				
			||||||
@@ -586,18 +592,17 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+		rt2800_register_write(rt2x00dev, 0x13b8, 0x10);
 | 
					+		rt2800_register_write(rt2x00dev, 0x13b8, 0x10);
 | 
				
			||||||
+		udelay(1);
 | 
					+		udelay(1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		if (ch_idx == 0) {
 | 
					+		if (ch_idx == 0)
 | 
				
			||||||
+			rt2800_rf_aux_tx0_loopback(rt2x00dev);
 | 
					+			rt2800_rf_aux_tx0_loopback(rt2x00dev);
 | 
				
			||||||
+		} else {
 | 
					+		else
 | 
				
			||||||
+			rt2800_rf_aux_tx1_loopback(rt2x00dev);
 | 
					+			rt2800_rf_aux_tx1_loopback(rt2x00dev);
 | 
				
			||||||
+		}
 | 
					+
 | 
				
			||||||
+		udelay(1);
 | 
					+		udelay(1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		if (ch_idx == 0) {
 | 
					+		if (ch_idx == 0)
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001004);
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001004);
 | 
				
			||||||
+		} else {
 | 
					+		else
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002004);
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002004);
 | 
				
			||||||
+		}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 158, 0x05);
 | 
					+		rt2800_bbp_write(rt2x00dev, 158, 0x05);
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 159, 0x00);
 | 
					+		rt2800_bbp_write(rt2x00dev, 159, 0x00);
 | 
				
			||||||
@@ -623,7 +628,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+			if (rf_alc_idx == 0) {
 | 
					+			if (rf_alc_idx == 0) {
 | 
				
			||||||
+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x21);
 | 
					+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x21);
 | 
				
			||||||
+				for (;vga_gain[ch_idx] > 0;vga_gain[ch_idx] = vga_gain[ch_idx] - 2) {
 | 
					+				for (; vga_gain[ch_idx] > 0;
 | 
				
			||||||
 | 
					+				     vga_gain[ch_idx] = vga_gain[ch_idx] - 2) {
 | 
				
			||||||
+					rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
 | 
					+					rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
 | 
				
			||||||
+					rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
 | 
					+					rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
 | 
				
			||||||
+					rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
 | 
					+					rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
 | 
				
			||||||
@@ -633,15 +639,15 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+					rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x21);
 | 
					+					rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x21);
 | 
				
			||||||
+					p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
					+					p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
 | 
				
			||||||
+					rt2x00_dbg(rt2x00dev, "LOFT AGC %d %d\n", p0, p1);
 | 
					+					rt2x00_dbg(rt2x00dev, "LOFT AGC %d %d\n", p0, p1);
 | 
				
			||||||
+					if ((p0 < 7000*7000) && (p1 < (7000*7000))) {
 | 
					+					if ((p0 < 7000 * 7000) && (p1 < (7000 * 7000)))
 | 
				
			||||||
+						break;
 | 
					+						break;
 | 
				
			||||||
+					}
 | 
					 | 
				
			||||||
+				}
 | 
					+				}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x00);
 | 
					+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x00);
 | 
				
			||||||
+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x00);
 | 
					+				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x00);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n",vga_gain[ch_idx], rfvga_gain_table[vga_gain[ch_idx]]);
 | 
					+				rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx],
 | 
				
			||||||
 | 
					+					   rfvga_gain_table[vga_gain[ch_idx]]);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+				if (vga_gain[ch_idx] < 0)
 | 
					+				if (vga_gain[ch_idx] < 0)
 | 
				
			||||||
+					vga_gain[ch_idx] = 0;
 | 
					+					vga_gain[ch_idx] = 0;
 | 
				
			||||||
@@ -659,7 +665,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) {
 | 
					+	for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) {
 | 
				
			||||||
+		for (idx = 0; idx < 4; idx++) {
 | 
					+		for (idx = 0; idx < 4; idx++) {
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 158, 0xB0);
 | 
					+			rt2800_bbp_write(rt2x00dev, 158, 0xB0);
 | 
				
			||||||
+			bbp = (idx<<2) + rf_alc_idx;
 | 
					+			bbp = (idx << 2) + rf_alc_idx;
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
					+			rt2800_bbp_write(rt2x00dev, 159, bbp);
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, " ALC %2x,", bbp);
 | 
					+			rt2x00_dbg(rt2x00dev, " ALC %2x,", bbp);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -720,8 +726,6 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_register_write(rt2x00dev, RF_BYPASS2, orig52c);
 | 
					+	rt2800_register_write(rt2x00dev, RF_BYPASS2, orig52c);
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
 | 
					+	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "LOFT Calibration Done!\n");
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
 | 
					+	savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
 | 
				
			||||||
+	macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
 | 
					+	macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
 | 
				
			||||||
+	macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
 | 
					+	macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
 | 
				
			||||||
@@ -741,7 +745,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
					+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
				
			||||||
+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macvalue & 0x01)
 | 
					+		if (macvalue & 0x01)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -752,7 +756,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
					+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
 | 
				
			||||||
+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
					+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
 | 
				
			||||||
+		if (macvalue & 0x02)
 | 
					+		if (macvalue & 0x02)
 | 
				
			||||||
+			udelay(50);
 | 
					+			usleep_range(50, 100);
 | 
				
			||||||
+		else
 | 
					+		else
 | 
				
			||||||
+			break;
 | 
					+			break;
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
@@ -791,9 +795,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, 0x13b8, 0x00000010);
 | 
					+	rt2800_register_write(rt2x00dev, 0x13b8, 0x00000010);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
 | 
					+	for (ch_idx = 0; ch_idx < 2; ch_idx++)
 | 
				
			||||||
+		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
 | 
					+		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x3B);
 | 
					+	rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x3B);
 | 
				
			||||||
+	rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x3B);
 | 
					+	rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x3B);
 | 
				
			||||||
@@ -803,7 +806,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_bbp_write(rt2x00dev, 158, 0xB0);
 | 
					+	rt2800_bbp_write(rt2x00dev, 158, 0xB0);
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 159, 0x80);
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, 0x80);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	for (ch_idx = 0; ch_idx < 2; ch_idx ++) {
 | 
					+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 23, 0x00);
 | 
					+		rt2800_bbp_write(rt2x00dev, 23, 0x00);
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 24, 0x00);
 | 
					+		rt2800_bbp_write(rt2x00dev, 24, 0x00);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
@@ -846,7 +849,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			count_step = 2;
 | 
					+			count_step = 2;
 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		for (;vga_gain[ch_idx] < 19; vga_gain[ch_idx]=(vga_gain[ch_idx] + count_step)) {
 | 
					+		for (; vga_gain[ch_idx] < 19; vga_gain[ch_idx] = (vga_gain[ch_idx] + count_step)) {
 | 
				
			||||||
+			rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
 | 
					+			rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
 | 
				
			||||||
+			rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
 | 
					+			rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
 | 
				
			||||||
+			rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
 | 
					+			rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
 | 
				
			||||||
@@ -855,37 +858,35 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+			rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+			rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 159, 0x00);
 | 
					+			rt2800_bbp_write(rt2x00dev, 159, 0x00);
 | 
				
			||||||
+			p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
 | 
					+			p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
 | 
				
			||||||
+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
 | 
					+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags))
 | 
				
			||||||
+				p0_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
 | 
					+				p0_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
 | 
				
			||||||
+			}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			bbp = (ch_idx == 0) ? 0x29 : 0x47;
 | 
					+			bbp = (ch_idx == 0) ? 0x29 : 0x47;
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+			rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 159, 0x21);
 | 
					+			rt2800_bbp_write(rt2x00dev, 159, 0x21);
 | 
				
			||||||
+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
 | 
					+			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
 | 
				
			||||||
+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags)) {
 | 
					+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags))
 | 
				
			||||||
+				p1_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
 | 
					+				p1_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
 | 
				
			||||||
+			}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			rt2x00_dbg(rt2x00dev, "IQ AGC %d %d\n", p0, p1);
 | 
					+			rt2x00_dbg(rt2x00dev, "IQ AGC %d %d\n", p0, p1);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
 | 
					+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
 | 
				
			||||||
+				rt2x00_dbg(rt2x00dev, "IQ AGC IDX 10 %d %d\n", p0_idx10, p1_idx10);
 | 
					+				rt2x00_dbg(rt2x00dev, "IQ AGC IDX 10 %d %d\n", p0_idx10, p1_idx10);
 | 
				
			||||||
+				if ((p0_idx10 > 7000*7000) || (p1_idx10 > 7000*7000)) {
 | 
					+				if ((p0_idx10 > 7000 * 7000) || (p1_idx10 > 7000 * 7000)) {
 | 
				
			||||||
+					if (vga_gain[ch_idx]!=0)
 | 
					+					if (vga_gain[ch_idx] != 0)
 | 
				
			||||||
+						vga_gain[ch_idx] = vga_gain[ch_idx]-1;
 | 
					+						vga_gain[ch_idx] = vga_gain[ch_idx] - 1;
 | 
				
			||||||
+					break;
 | 
					+					break;
 | 
				
			||||||
+				}
 | 
					+				}
 | 
				
			||||||
+			}
 | 
					+			}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+			if ((p0 > 2500*2500) || (p1 > 2500*2500)) {
 | 
					+			if ((p0 > 2500 * 2500) || (p1 > 2500 * 2500))
 | 
				
			||||||
+				break;
 | 
					+				break;
 | 
				
			||||||
+			}
 | 
					 | 
				
			||||||
+		}
 | 
					+		}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		if (vga_gain[ch_idx] > 18)
 | 
					+		if (vga_gain[ch_idx] > 18)
 | 
				
			||||||
+			vga_gain[ch_idx] = 18;
 | 
					+			vga_gain[ch_idx] = 18;
 | 
				
			||||||
+		rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n",vga_gain[ch_idx], rfvga_gain_table[vga_gain[ch_idx]]);
 | 
					+		rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx],
 | 
				
			||||||
 | 
					+			   rfvga_gain_table[vga_gain[ch_idx]]);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+		bbp = (ch_idx == 0) ? 0x29 : 0x47;
 | 
					+		bbp = (ch_idx == 0) ? 0x29 : 0x47;
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
					+		rt2800_bbp_write(rt2x00dev, 158, bbp);
 | 
				
			||||||
@@ -930,9 +931,8 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 39, rfb0r39);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 39, rfb0r39);
 | 
				
			||||||
+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfb0r42);
 | 
					+	rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfb0r42);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
 | 
					+	if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags))
 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 4, bbpr4);
 | 
					+		rt2800_bbp_write(rt2x00dev, 4, bbpr4);
 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 21, 0x01);
 | 
					+	rt2800_bbp_write(rt2x00dev, 21, 0x01);
 | 
				
			||||||
+	udelay(1);
 | 
					+	udelay(1);
 | 
				
			||||||
@@ -950,16 +950,12 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+	rt2800_register_write(rt2x00dev, RF_BYPASS3, macorg5);
 | 
					+	rt2800_register_write(rt2x00dev, RF_BYPASS3, macorg5);
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
 | 
					+	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
 | 
				
			||||||
+	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
 | 
					+	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	rt2x00_info(rt2x00dev, "TX IQ Calibration Done!\n");
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	return;
 | 
					 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
					 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 				       bool set_bw, bool is_ht40)
 | 
					 				       bool set_bw, bool is_ht40)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -9691,6 +10628,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -9692,6 +10613,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
					 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
				
			||||||
 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
					 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
				
			||||||
 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
					 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
				
			||||||
@@ -978,11 +974,11 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
 | 
				
			|||||||
+#define RF_ALC_NUM	6
 | 
					+#define RF_ALC_NUM	6
 | 
				
			||||||
+#define CHAIN_NUM	2
 | 
					+#define CHAIN_NUM	2
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+typedef struct rf_reg_pair {
 | 
					+struct rf_reg_pair {
 | 
				
			||||||
+	u8 bank;
 | 
					+	u8 bank;
 | 
				
			||||||
+	u8 reg;
 | 
					+	u8 reg;
 | 
				
			||||||
+	u8 value;
 | 
					+	u8 value;
 | 
				
			||||||
+} rf_reg_pair;
 | 
					+};
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 /* RT2800 driver data structure */
 | 
					 /* RT2800 driver data structure */
 | 
				
			||||||
 struct rt2800_drv_data {
 | 
					 struct rt2800_drv_data {
 | 
				
			||||||
@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					From f06bc3d756e7bfdaa03f060ae68797321b2e281a Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:22:04 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 10/16] rt2x00: move helper functions up in file
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Move register access helper functions up to the head of the file so
 | 
				
			||||||
 | 
					they can be used in all functions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 40 +++++++++----------
 | 
				
			||||||
 | 
					 1 file changed, 20 insertions(+), 20 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -199,6 +199,26 @@ static void rt2800_rfcsr_write_dccal(str
 | 
				
			||||||
 | 
					 	rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					+				  const u8 reg, const u8 value)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
				
			||||||
 | 
					+	rt2800_bbp_write(rt2x00dev, 159, value);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
				
			||||||
 | 
					+	return rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					+				  const u8 reg, const u8 value)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	rt2800_bbp_write(rt2x00dev, 195, reg);
 | 
				
			||||||
 | 
					+	rt2800_bbp_write(rt2x00dev, 196, value);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static u8 rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					 			    const unsigned int word)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -6955,26 +6975,6 @@ static void rt2800_init_bbp_5592(struct
 | 
				
			||||||
 | 
					 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					-				  const u8 reg, const u8 value)
 | 
				
			||||||
 | 
					-{
 | 
				
			||||||
 | 
					-	rt2800_bbp_write(rt2x00dev, 195, reg);
 | 
				
			||||||
 | 
					-	rt2800_bbp_write(rt2x00dev, 196, value);
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
 | 
					-				  const u8 reg, const u8 value)
 | 
				
			||||||
 | 
					-{
 | 
				
			||||||
 | 
					-	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
				
			||||||
 | 
					-	rt2800_bbp_write(rt2x00dev, 159, value);
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
 | 
				
			||||||
 | 
					-{
 | 
				
			||||||
 | 
					-	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
				
			||||||
 | 
					-	return rt2800_bbp_read(rt2x00dev, 159);
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	u8 bbp;
 | 
				
			||||||
@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					From d20eadcb4eac59c5168f48c33836fba32b8cd1ae Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:26:03 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 11/16] rt2x00: fix HT20/HT40 bandwidth switch on MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add missing configuration of the channel bandwidth filter to the
 | 
				
			||||||
 | 
					channel setup function for MT7620.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 8 ++++++++
 | 
				
			||||||
 | 
					 1 file changed, 8 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -3814,6 +3814,14 @@ static void rt2800_config_channel_rf7620
 | 
				
			||||||
 | 
					 		rfcsr |= tx_agc_fc;
 | 
				
			||||||
 | 
					 		rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (conf_is_ht40(conf)) {
 | 
				
			||||||
 | 
					+		rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10);
 | 
				
			||||||
 | 
					+		rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f);
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a);
 | 
				
			||||||
 | 
					+		rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
 | 
				
			||||||
@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					From fa8914fe29543be586e9bbc00c7209e2808f0a13 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:28:40 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 12/16] rt2x00: set correct TX_SW_CFG1 MAC register for MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Set correct TX_SW_CFG1 MAC register as it is done also in v3 of the
 | 
				
			||||||
 | 
					vendor driver[1].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[1]: https://gitlab.com/dm38/padavan-ng/-/blob/master/trunk/proprietary/rt_wifi/rtpci/3.0.X.X/mt76x2/chips/rt6352.c#L531
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +-
 | 
				
			||||||
 | 
					 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -5934,7 +5934,7 @@ static int rt2800_init_registers(struct
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 | 
				
			||||||
 | 
					 	} else if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
				
			||||||
 | 
					-		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
 | 
				
			||||||
 | 
					+		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
				
			||||||
@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					From 5b62ef26e5f17c5cdf19c05e32e2c1da9988480d Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:31:15 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 13/16] rt2x00: set VGC gain for both chains of MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Set bbp66 for all chains of the MT7620.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
 | 
				
			||||||
 | 
					 1 file changed, 2 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -5711,7 +5711,8 @@ static inline void rt2800_set_vgc(struct
 | 
				
			||||||
 | 
					 	if (qual->vgc_level != vgc_level) {
 | 
				
			||||||
 | 
					 		if (rt2x00_rt(rt2x00dev, RT3572) ||
 | 
				
			||||||
 | 
					 		    rt2x00_rt(rt2x00dev, RT3593) ||
 | 
				
			||||||
 | 
					-		    rt2x00_rt(rt2x00dev, RT3883)) {
 | 
				
			||||||
 | 
					+		    rt2x00_rt(rt2x00dev, RT3883) ||
 | 
				
			||||||
 | 
					+		    rt2x00_rt(rt2x00dev, RT6352)) {
 | 
				
			||||||
 | 
					 			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
 | 
				
			||||||
 | 
					 						       vgc_level);
 | 
				
			||||||
 | 
					 		} else if (rt2x00_rt(rt2x00dev, RT5592)) {
 | 
				
			||||||
@@ -1,423 +0,0 @@
 | 
				
			|||||||
From: Daniel Golle <daniel@makrotopia.org>
 | 
					 | 
				
			||||||
Date: Mon, 12 Sep 2022 21:33:13 +0100
 | 
					 | 
				
			||||||
Subject: [PATCH] rt2x00: various experimental fixes for MT7620
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Serge Vasilugin reports:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
To improve mt7620 built-in wifi performance some changes:
 | 
					 | 
				
			||||||
1. Correct BW20/BW40 switching (see comments with mark see commets with mark (1))
 | 
					 | 
				
			||||||
2. Correct TX_SW_CFG1 MAC reg from v3 of vendor driver see
 | 
					 | 
				
			||||||
        https://gitlab.com/dm38/padavan-ng/-/blob/master/trunk/proprietary/rt_wifi/rtpci/3.0.X.X/mt76x2/chips/rt6352.c#L531
 | 
					 | 
				
			||||||
3. Set bbp66 for all chains.
 | 
					 | 
				
			||||||
4. US_CYC_CNT init based on Programming guide, default value was 33 (pci),
 | 
					 | 
				
			||||||
   set chipset bus clock with fallback to cpu clock/3.
 | 
					 | 
				
			||||||
5. Don't overwrite default values for mt7620.
 | 
					 | 
				
			||||||
6. Correct some typos.
 | 
					 | 
				
			||||||
7. Add support for external LNA:
 | 
					 | 
				
			||||||
    a) RF and BBP regs never be corrected for this mode
 | 
					 | 
				
			||||||
    b) eLNA is driven the same way as ePA with mt7620's pin PA
 | 
					 | 
				
			||||||
        but vendor driver explicitly pin PA to gpio mode (for forrect calibration?)
 | 
					 | 
				
			||||||
        so I'm not sure that request for pa_pin in dts-file will be enough
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
First 5 changes (really 2) improve performance for boards w/o eLNA/ePA.
 | 
					 | 
				
			||||||
Changes 7 add support for eLNA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Configuration w/o eLAN/ePA and with eLNA show results
 | 
					 | 
				
			||||||
tx/rx (from router point of view) for each stream:
 | 
					 | 
				
			||||||
 35-40/30-35 Mbps for HT20
 | 
					 | 
				
			||||||
 65-70/60-65 Mbps for HT40
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Yes. Max results for 2T2R client is 140-145/135-140
 | 
					 | 
				
			||||||
with peaks 160/150, It correspond to mediatek driver results.
 | 
					 | 
				
			||||||
Boards with ePA untested.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
					 | 
				
			||||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					 | 
				
			||||||
@@ -137,6 +137,26 @@ static u8 rt2800_bbp_read(struct rt2x00_
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	return value;
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
+//serge: move here for use in test
 | 
					 | 
				
			||||||
+static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
+				  const u8 reg, const u8 value)
 | 
					 | 
				
			||||||
+{
 | 
					 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 195, reg);
 | 
					 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 196, value);
 | 
					 | 
				
			||||||
+}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
+				  const u8 reg, const u8 value)
 | 
					 | 
				
			||||||
+{
 | 
					 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
					 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 159, value);
 | 
					 | 
				
			||||||
+}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
 | 
					 | 
				
			||||||
+{
 | 
					 | 
				
			||||||
+	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
					 | 
				
			||||||
+	return rt2800_bbp_read(rt2x00dev, 159);
 | 
					 | 
				
			||||||
+}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
 			       const unsigned int word, const u8 value)
 | 
					 | 
				
			||||||
@@ -284,6 +304,28 @@ static void rt2800_rf_write(struct rt2x0
 | 
					 | 
				
			||||||
 	mutex_unlock(&rt2x00dev->csr_mutex);
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
+void rt6352_enable_pa_pin(struct rt2x00_dev *rt2x00dev, int enable)
 | 
					 | 
				
			||||||
+{
 | 
					 | 
				
			||||||
+	if (!rt2x00dev->pinctrl)
 | 
					 | 
				
			||||||
+		return;
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	if (enable) {
 | 
					 | 
				
			||||||
+		if (!rt2x00dev->pins_default) {
 | 
					 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "cannot enable PA pin! no default pinctrl\n");
 | 
					 | 
				
			||||||
+			return;
 | 
					 | 
				
			||||||
+		}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_default);
 | 
					 | 
				
			||||||
+	} else {
 | 
					 | 
				
			||||||
+		if (!rt2x00dev->pins_pa_gpio) {
 | 
					 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "cannot disable PA pin! no pa_gpio pinctrl\n");
 | 
					 | 
				
			||||||
+			return;
 | 
					 | 
				
			||||||
+		}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_pa_gpio);
 | 
					 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
+}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
 static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
 | 
					 | 
				
			||||||
 	[EEPROM_CHIP_ID]		= 0x0000,
 | 
					 | 
				
			||||||
 	[EEPROM_VERSION]		= 0x0001,
 | 
					 | 
				
			||||||
@@ -3801,6 +3843,20 @@ static void rt2800_config_channel_rf7620
 | 
					 | 
				
			||||||
 		rfcsr |= tx_agc_fc;
 | 
					 | 
				
			||||||
 		rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	if (conf_is_ht40(conf)) {//serge:skipped this step (1)
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 195, 141);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 196, 0x10);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 195, 157);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 196, 0x2f);
 | 
					 | 
				
			||||||
+		//rt2800_bbp_write(rt2x00dev, 105, 0x3C);
 | 
					 | 
				
			||||||
+	} else {
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 195, 141);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 196, 0x1a);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 195, 157);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 196, 0x40);
 | 
					 | 
				
			||||||
+		//rt2800_bbp_write(rt2x00dev, 105, 0x1C);
 | 
					 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
@@ -4172,6 +4228,11 @@ static void rt2800_config_channel(struct
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 86, 0x46);
 | 
					 | 
				
			||||||
 		else
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 86, 0);
 | 
					 | 
				
			||||||
+	} else if (rt2x00_rt(rt2x00dev, RT6352)) {//serge: don't overwite bbp r86 (5)
 | 
					 | 
				
			||||||
+		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, 86, 0x38);
 | 
					 | 
				
			||||||
 	} else {
 | 
					 | 
				
			||||||
 		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
 | 
					 | 
				
			||||||
 		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
 | 
					 | 
				
			||||||
@@ -4377,7 +4438,8 @@ static void rt2800_config_channel(struct
 | 
					 | 
				
			||||||
 		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);
 | 
					 | 
				
			||||||
+		if (!rt2x00_rt(rt2x00dev, RT6352))//serge: this function for rt5592 only, for rt6352 it switch off compensations (5)
 | 
					 | 
				
			||||||
+		    rt2800_iq_calibrate(rt2x00dev, rf->channel);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
					 | 
				
			||||||
@@ -4417,6 +4479,31 @@ static void rt2800_config_channel(struct
 | 
					 | 
				
			||||||
 			rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN,
 | 
					 | 
				
			||||||
 					      0x6C6C6B6C);
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {//serge: for support eLNA (7a)
 | 
					 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "Correct RF/BBP for eLNA!\n");
 | 
					 | 
				
			||||||
+			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
 | 
					 | 
				
			||||||
+			reg |= 0x00000101;
 | 
					 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+			reg = rt2800_register_read(rt2x00dev, RF_BYPASS3);
 | 
					 | 
				
			||||||
+			reg |= 0x00000101;
 | 
					 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+			rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
 | 
					 | 
				
			||||||
+			rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
 | 
					 | 
				
			||||||
+			rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
 | 
					 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 75, 0x68);//serge: move bbp eLNA init here?
 | 
					 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 76, 0x4C);
 | 
					 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 79, 0x1C);
 | 
					 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 80, 0x0C);
 | 
					 | 
				
			||||||
+			rt2800_bbp_write(rt2x00dev, 82, 0xB6);
 | 
					 | 
				
			||||||
+			/* bank 0 RF reg 42 and glrt BBP reg 141
 | 
					 | 
				
			||||||
+			will be set in config channel function
 | 
					 | 
				
			||||||
+			in dependence of channel and HT20/HT40
 | 
					 | 
				
			||||||
+			so don't touch it
 | 
					 | 
				
			||||||
+			*/
 | 
					 | 
				
			||||||
+		}
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	bbp = rt2800_bbp_read(rt2x00dev, 4);
 | 
					 | 
				
			||||||
@@ -4457,6 +4544,9 @@ static void rt2800_config_channel(struct
 | 
					 | 
				
			||||||
 		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
 | 
					 | 
				
			||||||
 		rt2800_bbp_write(rt2x00dev, 49, bbp);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
+//serge:just print results after config channel - don't forget to remove nahren (c) <- this is copyright, not ref to comments :)
 | 
					 | 
				
			||||||
+	bbp = rt2800_bbp_dcoc_read(rt2x00dev, 0x03);
 | 
					 | 
				
			||||||
+	pr_info("BBP tx/rx compensation control=0x%02x\n", bbp);
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)
 | 
					 | 
				
			||||||
@@ -5527,7 +5617,7 @@ void rt2800_vco_calibration(struct rt2x0
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-	if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
					 | 
				
			||||||
+	if (rt2x00_rt(rt2x00dev, RT6352)) {//serge:remark - move all this code to rfcsr_6352 init?
 | 
					 | 
				
			||||||
 		if (rt2x00dev->default_ant.rx_chain_num == 1) {
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 91, 0x07);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 95, 0x1A);
 | 
					 | 
				
			||||||
@@ -5695,7 +5785,8 @@ static inline void rt2800_set_vgc(struct
 | 
					 | 
				
			||||||
 	if (qual->vgc_level != vgc_level) {
 | 
					 | 
				
			||||||
 		if (rt2x00_rt(rt2x00dev, RT3572) ||
 | 
					 | 
				
			||||||
 		    rt2x00_rt(rt2x00dev, RT3593) ||
 | 
					 | 
				
			||||||
-		    rt2x00_rt(rt2x00dev, RT3883)) {
 | 
					 | 
				
			||||||
+		    rt2x00_rt(rt2x00dev, RT3883) ||
 | 
					 | 
				
			||||||
+		    rt2x00_rt(rt2x00dev, RT6352)) {//serge: rt6352 too (3)
 | 
					 | 
				
			||||||
 			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
 | 
					 | 
				
			||||||
 						       vgc_level);
 | 
					 | 
				
			||||||
 		} else if (rt2x00_rt(rt2x00dev, RT5592)) {
 | 
					 | 
				
			||||||
@@ -5930,7 +6021,7 @@ static int rt2800_init_registers(struct
 | 
					 | 
				
			||||||
 					      0x00550055);
 | 
					 | 
				
			||||||
 		} else {
 | 
					 | 
				
			||||||
 			rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
					 | 
				
			||||||
-			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
 | 
					 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);//serge:was 0x000C0000 (2)
 | 
					 | 
				
			||||||
 			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
					 | 
				
			||||||
 			rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
					 | 
				
			||||||
 			rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
					 | 
				
			||||||
@@ -6195,6 +6286,29 @@ static int rt2800_init_registers(struct
 | 
					 | 
				
			||||||
 		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
 | 
					 | 
				
			||||||
 		rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, 125);
 | 
					 | 
				
			||||||
 		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
 | 
					 | 
				
			||||||
+	} else if (rt2x00_is_soc(rt2x00dev)) {//serge:which value correct? (4)
 | 
					 | 
				
			||||||
+		struct clk *clk = clk_get_sys("bus", NULL);
 | 
					 | 
				
			||||||
+		int rate;
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		if (IS_ERR(clk)) {
 | 
					 | 
				
			||||||
+			rt2x00_warn(rt2x00dev, "system bus clock undefined\n");
 | 
					 | 
				
			||||||
+			clk = clk_get_sys("cpu", NULL);
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+			if (IS_ERR(clk))
 | 
					 | 
				
			||||||
+			    rate = 125;
 | 
					 | 
				
			||||||
+			else {
 | 
					 | 
				
			||||||
+			    rate = clk_get_rate(clk) / 3000000;
 | 
					 | 
				
			||||||
+			    clk_put(clk);
 | 
					 | 
				
			||||||
+			}
 | 
					 | 
				
			||||||
+		} else {
 | 
					 | 
				
			||||||
+			rate = clk_get_rate(clk) / 1000000;
 | 
					 | 
				
			||||||
+			clk_put(clk);
 | 
					 | 
				
			||||||
+		}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		rt2x00_info(rt2x00dev, "set US_CYC=%dMHz\n", rate);
 | 
					 | 
				
			||||||
+		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
 | 
					 | 
				
			||||||
+		rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, rate);
 | 
					 | 
				
			||||||
+		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG0);
 | 
					 | 
				
			||||||
@@ -6981,26 +7095,7 @@ static void rt2800_init_bbp_5592(struct
 | 
					 | 
				
			||||||
 	if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
 | 
					 | 
				
			||||||
 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
-				  const u8 reg, const u8 value)
 | 
					 | 
				
			||||||
-{
 | 
					 | 
				
			||||||
-	rt2800_bbp_write(rt2x00dev, 195, reg);
 | 
					 | 
				
			||||||
-	rt2800_bbp_write(rt2x00dev, 196, value);
 | 
					 | 
				
			||||||
-}
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
 | 
					 | 
				
			||||||
-				  const u8 reg, const u8 value)
 | 
					 | 
				
			||||||
-{
 | 
					 | 
				
			||||||
-	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
					 | 
				
			||||||
-	rt2800_bbp_write(rt2x00dev, 159, value);
 | 
					 | 
				
			||||||
-}
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
 | 
					 | 
				
			||||||
-{
 | 
					 | 
				
			||||||
-	rt2800_bbp_write(rt2x00dev, 158, reg);
 | 
					 | 
				
			||||||
-	return rt2800_bbp_read(rt2x00dev, 159);
 | 
					 | 
				
			||||||
-}
 | 
					 | 
				
			||||||
+//serge: move these function upper
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
 | 
					 | 
				
			||||||
 {
 | 
					 | 
				
			||||||
@@ -8635,7 +8730,7 @@ static void rt2800_r_calibration(struct
 | 
					 | 
				
			||||||
 		r_cal_code = (u8)rcalcode;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	rt2800_rfcsr_write_bank(rt2x00dev, 0, 7, r_cal_code);
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
+	pr_info("RF bank 0 reg 5=0x%02x\n", r_cal_code);//serge: just for info to compare with vendor driver
 | 
					 | 
				
			||||||
 	rt2800_bbp_write(rt2x00dev, 22, 0x0);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	bytevalue = rt2800_bbp_read(rt2x00dev, 21);
 | 
					 | 
				
			||||||
@@ -8693,7 +8788,7 @@ static void rt2800_rxdcoc_calibration(st
 | 
					 | 
				
			||||||
 			break;
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
 | 
					 | 
				
			||||||
+	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);//serge: was 0 - typo? (6)
 | 
					 | 
				
			||||||
 	saverfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4);
 | 
					 | 
				
			||||||
 	saverfb5r4 = saverfb5r4 & (~0x40);
 | 
					 | 
				
			||||||
 	saverfb7r4 = saverfb7r4 & (~0x40);
 | 
					 | 
				
			||||||
@@ -9022,13 +9117,15 @@ static void rt2800_rxiq_calibration(stru
 | 
					 | 
				
			||||||
 				rt2x00_info(rt2x00dev, "RXIQ G_imb=%d, Ph_rx=%d\n", g_imb, ph_rx);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 				if ((ph_rx > 20) || (ph_rx < -20)) {
 | 
					 | 
				
			||||||
+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL(ph_rx=%d out of [-20..20]", ph_rx);//serge:just to see value
 | 
					 | 
				
			||||||
 					ph_rx = 0;
 | 
					 | 
				
			||||||
-					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					 | 
				
			||||||
+					//rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					 | 
				
			||||||
 				}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 				if ((g_imb > 12) || (g_imb < -12)) {
 | 
					 | 
				
			||||||
+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL(g_imb=%d out of (-12..12]", g_imb);//serge:just to see the reason
 | 
					 | 
				
			||||||
 					g_imb = 0;
 | 
					 | 
				
			||||||
-					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					 | 
				
			||||||
+					//rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
 | 
					 | 
				
			||||||
 				}
 | 
					 | 
				
			||||||
 			}
 | 
					 | 
				
			||||||
 		else {
 | 
					 | 
				
			||||||
@@ -9039,11 +9136,21 @@ static void rt2800_rxiq_calibration(stru
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 		if (ch_idx == 0) {
 | 
					 | 
				
			||||||
+			//serge: just to see values
 | 
					 | 
				
			||||||
+			pr_info("RXIQ RX0 g_imb (0x37, %2x) ph_rx (0x35, %2x)\n",
 | 
					 | 
				
			||||||
+			    g_imb & 0x3f,
 | 
					 | 
				
			||||||
+			    ph_rx & 0x3f
 | 
					 | 
				
			||||||
+			);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 158, 0x37);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 159, g_imb & 0x3f);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 158, 0x35);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 159, ph_rx & 0x3f);
 | 
					 | 
				
			||||||
 		} else {
 | 
					 | 
				
			||||||
+			//serge: just to see values
 | 
					 | 
				
			||||||
+			pr_info("RXIQ RX1 g_imb (0x55, %2x) ph_rx (0x53, %2x)\n",
 | 
					 | 
				
			||||||
+			    g_imb & 0x3f,
 | 
					 | 
				
			||||||
+			    ph_rx & 0x3f
 | 
					 | 
				
			||||||
+			);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 158, 0x55);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 159, g_imb & 0x3f);
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 158, 0x53);
 | 
					 | 
				
			||||||
@@ -9745,6 +9852,15 @@ void rt2800_loft_iq_calibration(struct r
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) {
 | 
					 | 
				
			||||||
+		//serge: just to see values
 | 
					 | 
				
			||||||
+		pr_info("LOFT ALC (0xb0, %2x) I0 (0xb1, %2x) Q0 (0xb2, %2x) I1 (0xb8, %2x) Q1 (0xb9, %2x)\n",
 | 
					 | 
				
			||||||
+		    rf_alc_idx,
 | 
					 | 
				
			||||||
+		    loft_dc_search_result[CHAIN_0][rf_alc_idx][0x00] & 0x3F,
 | 
					 | 
				
			||||||
+		    loft_dc_search_result[CHAIN_0][rf_alc_idx][0x01] & 0x3F,
 | 
					 | 
				
			||||||
+		    loft_dc_search_result[CHAIN_1][rf_alc_idx][0x00] & 0x3F,
 | 
					 | 
				
			||||||
+		    loft_dc_search_result[CHAIN_1][rf_alc_idx][0x01] & 0x3F
 | 
					 | 
				
			||||||
+		);
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
 		for (idx = 0; idx < 4; idx++) {
 | 
					 | 
				
			||||||
 			rt2800_bbp_write(rt2x00dev, 158, 0xB0);
 | 
					 | 
				
			||||||
 			bbp = (idx<<2) + rf_alc_idx;
 | 
					 | 
				
			||||||
@@ -10669,6 +10785,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					 | 
				
			||||||
 		rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
+	rt6352_enable_pa_pin(rt2x00dev, 0);//serge: vendor driver do it before calibration (7b)
 | 
					 | 
				
			||||||
 	rt2800_r_calibration(rt2x00dev);
 | 
					 | 
				
			||||||
 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
					 | 
				
			||||||
 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
					 | 
				
			||||||
@@ -10676,6 +10793,29 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					 | 
				
			||||||
 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
					 | 
				
			||||||
 	rt2800_loft_iq_calibration(rt2x00dev);
 | 
					 | 
				
			||||||
 	rt2800_rxiq_calibration(rt2x00dev);
 | 
					 | 
				
			||||||
+	rt6352_enable_pa_pin(rt2x00dev, 1);//serge: vendor driver do it after calibration (7b)
 | 
					 | 
				
			||||||
+	/* Vendor driver restore iLNA/iPA before
 | 
					 | 
				
			||||||
+	recalibration and set correct values after.
 | 
					 | 
				
			||||||
+	Openwrt driver init iLNA and iPA but restore only
 | 
					 | 
				
			||||||
+	ePA values after recalibration.
 | 
					 | 
				
			||||||
+	So set eLNA values only
 | 
					 | 
				
			||||||
+	*/
 | 
					 | 
				
			||||||
+	if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {//serge: rf regs never corrected for eLNA (7a)
 | 
					 | 
				
			||||||
+		rt2x00_info(rt2x00dev, "Correct RF/BBP for eLNA!\n");
 | 
					 | 
				
			||||||
+		rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
 | 
					 | 
				
			||||||
+		rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
 | 
					 | 
				
			||||||
+		rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 75, 0x68);//serge: move bbp eLNA init here?
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 76, 0x4C);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 79, 0x1C);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 80, 0x0C);
 | 
					 | 
				
			||||||
+		rt2800_bbp_write(rt2x00dev, 82, 0xB6);
 | 
					 | 
				
			||||||
+		/* bank 0 RF reg 42 and glrt BBP reg 141
 | 
					 | 
				
			||||||
+		will be set in config channel function
 | 
					 | 
				
			||||||
+		in dependence of channel and HT20/HT40
 | 
					 | 
				
			||||||
+		so don't touch it
 | 
					 | 
				
			||||||
+		*/
 | 
					 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 | 
					 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | 
					 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | 
					 | 
				
			||||||
@@ -28,6 +28,7 @@
 | 
					 | 
				
			||||||
 #include <linux/average.h>
 | 
					 | 
				
			||||||
 #include <linux/usb.h>
 | 
					 | 
				
			||||||
 #include <linux/clk.h>
 | 
					 | 
				
			||||||
+#include <linux/pinctrl/consumer.h>
 | 
					 | 
				
			||||||
 #include <linux/rt2x00_platform.h>
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 #include <net/mac80211.h>
 | 
					 | 
				
			||||||
@@ -1029,6 +1030,11 @@ struct rt2x00_dev {
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	/* Clock for System On Chip devices. */
 | 
					 | 
				
			||||||
 	struct clk *clk;
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+	/* pinctrl and states for System On Chip devices with PA/LNA. */
 | 
					 | 
				
			||||||
+	struct pinctrl *pinctrl;
 | 
					 | 
				
			||||||
+	struct pinctrl_state *pins_default;
 | 
					 | 
				
			||||||
+	struct pinctrl_state *pins_pa_gpio;
 | 
					 | 
				
			||||||
 };
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 struct rt2x00_bar_list_entry {
 | 
					 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 | 
					 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 | 
					 | 
				
			||||||
@@ -97,6 +97,21 @@ int rt2x00soc_probe(struct platform_devi
 | 
					 | 
				
			||||||
 	if (retval)
 | 
					 | 
				
			||||||
 		goto exit_free_reg;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
+	rt2x00dev->pinctrl = devm_pinctrl_get(&pdev->dev);
 | 
					 | 
				
			||||||
+	if (IS_ERR(rt2x00dev->pinctrl)) {
 | 
					 | 
				
			||||||
+		rt2x00dev->pinctrl = NULL;
 | 
					 | 
				
			||||||
+		rt2x00dev->pins_default = NULL;
 | 
					 | 
				
			||||||
+		rt2x00dev->pins_pa_gpio = NULL;
 | 
					 | 
				
			||||||
+	} else {
 | 
					 | 
				
			||||||
+		rt2x00dev->pins_default = pinctrl_lookup_state(rt2x00dev->pinctrl, "default");
 | 
					 | 
				
			||||||
+		if (IS_ERR(rt2x00dev->pins_default))
 | 
					 | 
				
			||||||
+			rt2x00dev->pins_default = NULL;
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+		rt2x00dev->pins_pa_gpio = pinctrl_lookup_state(rt2x00dev->pinctrl, "pa_gpio");
 | 
					 | 
				
			||||||
+		if (IS_ERR(rt2x00dev->pins_pa_gpio))
 | 
					 | 
				
			||||||
+			rt2x00dev->pins_pa_gpio = NULL;
 | 
					 | 
				
			||||||
+	}
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
 	return 0;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 exit_free_reg:
 | 
					 | 
				
			||||||
@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					From 6569ed4ba88105d7ee877abba8f22e4965a29856 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:38:20 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 14/16] rt2x00: set SoC wmac clock register
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead of using the default value 33 (pci), set US_CYC_CNT init based
 | 
				
			||||||
 | 
					on Programming guide:
 | 
				
			||||||
 | 
					If available, set chipset bus clock with fallback to cpu clock/3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 21 +++++++++++++++++++
 | 
				
			||||||
 | 
					 1 file changed, 21 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -6197,6 +6197,27 @@ static int rt2800_init_registers(struct
 | 
				
			||||||
 | 
					 		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
 | 
				
			||||||
 | 
					 		rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, 125);
 | 
				
			||||||
 | 
					 		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
 | 
				
			||||||
 | 
					+	} else if (rt2x00_is_soc(rt2x00dev)) {
 | 
				
			||||||
 | 
					+		struct clk *clk = clk_get_sys("bus", NULL);
 | 
				
			||||||
 | 
					+		int rate;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (IS_ERR(clk)) {
 | 
				
			||||||
 | 
					+			clk = clk_get_sys("cpu", NULL);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+			if (IS_ERR(clk)) {
 | 
				
			||||||
 | 
					+				rate = 125;
 | 
				
			||||||
 | 
					+			} else {
 | 
				
			||||||
 | 
					+				rate = clk_get_rate(clk) / 3000000;
 | 
				
			||||||
 | 
					+				clk_put(clk);
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+		} else {
 | 
				
			||||||
 | 
					+			rate = clk_get_rate(clk) / 1000000;
 | 
				
			||||||
 | 
					+			clk_put(clk);
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
 | 
				
			||||||
 | 
					+		rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, rate);
 | 
				
			||||||
 | 
					+		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG0);
 | 
				
			||||||
@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					From 3ae108de9e64e44c724ce150d804c56a4e72ea4e Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:42:11 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 15/16] rt2x00: correctly set BBP register 86 for MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead of 0 set the correct value for BBP register 86 for MT7620.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 ++++-
 | 
				
			||||||
 | 
					 1 file changed, 4 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -4193,7 +4193,10 @@ static void rt2800_config_channel(struct
 | 
				
			||||||
 | 
					 		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, 86, 0);
 | 
				
			||||||
 | 
					+		if (rt2x00_rt(rt2x00dev, RT6352))
 | 
				
			||||||
 | 
					+			rt2800_bbp_write(rt2x00dev, 86, 0x38);
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			rt2800_bbp_write(rt2x00dev, 86, 0);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (rf->channel <= 14) {
 | 
				
			||||||
@@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					From 0fce1109f894ec7fcd72cb098843a1eff786716a Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					Date: Fri, 16 Sep 2022 20:49:42 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 16/16] rt2x00: import support for external LNA on MT7620
 | 
				
			||||||
 | 
					To: linux-wireless@vger.kernel.org,
 | 
				
			||||||
 | 
					    Stanislaw Gruszka <stf_xl@wp.pl>,
 | 
				
			||||||
 | 
					    Helmut Schaa <helmut.schaa@googlemail.com>
 | 
				
			||||||
 | 
					Cc: Kalle Valo <kvalo@kernel.org>,
 | 
				
			||||||
 | 
					    David S. Miller <davem@davemloft.net>,
 | 
				
			||||||
 | 
					    Eric Dumazet <edumazet@google.com>,
 | 
				
			||||||
 | 
					    Jakub Kicinski <kuba@kernel.org>,
 | 
				
			||||||
 | 
					    Paolo Abeni <pabeni@redhat.com>,
 | 
				
			||||||
 | 
					    Johannes Berg <johannes.berg@intel.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In order to carry out calibration on boards with ePA or eLNA the PA pin
 | 
				
			||||||
 | 
					needs to be switch to GPIO mode on MT7620. Implement that by selecting
 | 
				
			||||||
 | 
					pinctrl state "pa_gpio" which should be defined for MT7620 boards with
 | 
				
			||||||
 | 
					eLNA or ePA beside the "default" state.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
 | 
				
			||||||
 | 
					Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 .../net/wireless/ralink/rt2x00/rt2800lib.c    | 58 +++++++++++++++++++
 | 
				
			||||||
 | 
					 drivers/net/wireless/ralink/rt2x00/rt2x00.h   |  5 ++
 | 
				
			||||||
 | 
					 .../net/wireless/ralink/rt2x00/rt2x00soc.c    | 15 +++++
 | 
				
			||||||
 | 
					 3 files changed, 78 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
 | 
					@@ -304,6 +304,24 @@ static void rt2800_rf_write(struct rt2x0
 | 
				
			||||||
 | 
					 	mutex_unlock(&rt2x00dev->csr_mutex);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+void rt6352_enable_pa_pin(struct rt2x00_dev *rt2x00dev, int enable)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (!rt2x00dev->pinctrl)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (enable) {
 | 
				
			||||||
 | 
					+		if (!rt2x00dev->pins_default)
 | 
				
			||||||
 | 
					+			return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_default);
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		if (!rt2x00dev->pins_pa_gpio)
 | 
				
			||||||
 | 
					+			return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_pa_gpio);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
 | 
				
			||||||
 | 
					 	[EEPROM_CHIP_ID]		= 0x0000,
 | 
				
			||||||
 | 
					 	[EEPROM_VERSION]		= 0x0001,
 | 
				
			||||||
 | 
					@@ -4436,6 +4454,29 @@ static void rt2800_config_channel(struct
 | 
				
			||||||
 | 
					 			rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN,
 | 
				
			||||||
 | 
					 					      0x6C6C6B6C);
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
 | 
				
			||||||
 | 
					+			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
 | 
				
			||||||
 | 
					+			reg |= 0x00000101;
 | 
				
			||||||
 | 
					+			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+			reg = rt2800_register_read(rt2x00dev, RF_BYPASS3);
 | 
				
			||||||
 | 
					+			reg |= 0x00000101;
 | 
				
			||||||
 | 
					+			rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+			rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
 | 
				
			||||||
 | 
					+			rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
 | 
				
			||||||
 | 
					+			rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
 | 
				
			||||||
 | 
					+			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);
 | 
				
			||||||
 | 
					+			/* bank 0 RF reg 42 and glrt BBP reg 141 will be set in
 | 
				
			||||||
 | 
					+			 * config channel function in dependence of channel and
 | 
				
			||||||
 | 
					+			 * HT20/HT40 so don't touch it
 | 
				
			||||||
 | 
					+			 */
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	bbp = rt2800_bbp_read(rt2x00dev, 4);
 | 
				
			||||||
 | 
					@@ -10641,6 +10682,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
				
			||||||
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	rt6352_enable_pa_pin(rt2x00dev, 0);
 | 
				
			||||||
 | 
					 	rt2800_r_calibration(rt2x00dev);
 | 
				
			||||||
 | 
					 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
				
			||||||
 | 
					 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
				
			||||||
 | 
					@@ -10648,6 +10690,22 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 | 
					 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
				
			||||||
 | 
					 	rt2800_loft_iq_calibration(rt2x00dev);
 | 
				
			||||||
 | 
					 	rt2800_rxiq_calibration(rt2x00dev);
 | 
				
			||||||
 | 
					+	rt6352_enable_pa_pin(rt2x00dev, 1);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
 | 
				
			||||||
 | 
					+		rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
 | 
				
			||||||
 | 
					+		rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
 | 
				
			||||||
 | 
					+		rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
 | 
				
			||||||
 | 
					+		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);
 | 
				
			||||||
 | 
					+		/* bank 0 RF reg 42 and glrt BBP reg 141 will be set in config
 | 
				
			||||||
 | 
					+		 * channel function in dependence of channel and HT20/HT40,
 | 
				
			||||||
 | 
					+		 * so don't touch them here.
 | 
				
			||||||
 | 
					+		 */
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | 
				
			||||||
 | 
					@@ -28,6 +28,7 @@
 | 
				
			||||||
 | 
					 #include <linux/average.h>
 | 
				
			||||||
 | 
					 #include <linux/usb.h>
 | 
				
			||||||
 | 
					 #include <linux/clk.h>
 | 
				
			||||||
 | 
					+#include <linux/pinctrl/consumer.h>
 | 
				
			||||||
 | 
					 #include <linux/rt2x00_platform.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include <net/mac80211.h>
 | 
				
			||||||
 | 
					@@ -1029,6 +1030,11 @@ struct rt2x00_dev {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Clock for System On Chip devices. */
 | 
				
			||||||
 | 
					 	struct clk *clk;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* pinctrl and states for System On Chip devices with PA/LNA. */
 | 
				
			||||||
 | 
					+	struct pinctrl *pinctrl;
 | 
				
			||||||
 | 
					+	struct pinctrl_state *pins_default;
 | 
				
			||||||
 | 
					+	struct pinctrl_state *pins_pa_gpio;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct rt2x00_bar_list_entry {
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 | 
				
			||||||
 | 
					@@ -97,6 +97,21 @@ int rt2x00soc_probe(struct platform_devi
 | 
				
			||||||
 | 
					 	if (retval)
 | 
				
			||||||
 | 
					 		goto exit_free_reg;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	rt2x00dev->pinctrl = devm_pinctrl_get(&pdev->dev);
 | 
				
			||||||
 | 
					+	if (IS_ERR(rt2x00dev->pinctrl)) {
 | 
				
			||||||
 | 
					+		rt2x00dev->pinctrl = NULL;
 | 
				
			||||||
 | 
					+		rt2x00dev->pins_default = NULL;
 | 
				
			||||||
 | 
					+		rt2x00dev->pins_pa_gpio = NULL;
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		rt2x00dev->pins_default = pinctrl_lookup_state(rt2x00dev->pinctrl, "default");
 | 
				
			||||||
 | 
					+		if (IS_ERR(rt2x00dev->pins_default))
 | 
				
			||||||
 | 
					+			rt2x00dev->pins_default = NULL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		rt2x00dev->pins_pa_gpio = pinctrl_lookup_state(rt2x00dev->pinctrl, "pa_gpio");
 | 
				
			||||||
 | 
					+		if (IS_ERR(rt2x00dev->pins_pa_gpio))
 | 
				
			||||||
 | 
					+			rt2x00dev->pins_pa_gpio = NULL;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 exit_free_reg:
 | 
				
			||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
  */
 | 
					  */
 | 
				
			||||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
					+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
				
			||||||
@@ -3698,14 +3698,16 @@ static void rt2800_config_channel_rf7620
 | 
					@@ -3736,14 +3736,16 @@ static void rt2800_config_channel_rf7620
 | 
				
			||||||
 	rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
 | 
					 	rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
 | 
				
			||||||
 	rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
 | 
					 	rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -39,7 +39,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
 | 
					 	rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
 | 
				
			||||||
 	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
 | 
					 	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
 | 
				
			||||||
@@ -3739,18 +3741,23 @@ static void rt2800_config_channel_rf7620
 | 
					@@ -3777,18 +3779,23 @@ static void rt2800_config_channel_rf7620
 | 
				
			||||||
 		rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
 | 
					 		rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -73,7 +73,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
 | 
					 	if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
 | 
				
			||||||
 		if (conf_is_ht40(conf)) {
 | 
					 		if (conf_is_ht40(conf)) {
 | 
				
			||||||
@@ -3850,25 +3857,29 @@ static void rt2800_config_alc(struct rt2
 | 
					@@ -3896,25 +3903,29 @@ static void rt2800_config_alc(struct rt2
 | 
				
			||||||
 	if (i == 10000)
 | 
					 	if (i == 10000)
 | 
				
			||||||
 		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
 | 
					 		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -121,12 +121,12 @@
 | 
				
			|||||||
 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
 | 
					 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	rt2800_vco_calibration(rt2x00dev);
 | 
					 	rt2800_vco_calibration(rt2x00dev);
 | 
				
			||||||
@@ -5906,18 +5917,33 @@ static int rt2800_init_registers(struct
 | 
					@@ -5978,18 +5989,33 @@ static int rt2800_init_registers(struct
 | 
				
			||||||
 	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
 | 
					 	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
 | 
				
			||||||
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 | 
					 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 | 
				
			||||||
 	} else if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
					 	} else if (rt2x00_rt(rt2x00dev, RT6352)) {
 | 
				
			||||||
-		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
					-		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
				
			||||||
-		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
 | 
					-		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
 | 
				
			||||||
-		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
					-		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
				
			||||||
-		rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
					-		rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
				
			||||||
-		rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
					-		rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
				
			||||||
@@ -150,7 +150,7 @@
 | 
				
			|||||||
+					      0x00550055);
 | 
					+					      0x00550055);
 | 
				
			||||||
+		} else {
 | 
					+		} else {
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
					+			rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
 | 
					+			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
					+			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
					+			rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
 | 
				
			||||||
+			rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
					+			rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
 | 
				
			||||||
@@ -167,7 +167,7 @@
 | 
				
			|||||||
 		reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
 | 
					 		reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
 | 
				
			||||||
 		rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
 | 
					 		rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
 | 
				
			||||||
 		rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
 | 
					 		rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
 | 
				
			||||||
@@ -7061,14 +7087,16 @@ static void rt2800_init_bbp_6352(struct
 | 
					@@ -7134,14 +7160,16 @@ static void rt2800_init_bbp_6352(struct
 | 
				
			||||||
 	rt2800_bbp_write(rt2x00dev, 188, 0x00);
 | 
					 	rt2800_bbp_write(rt2x00dev, 188, 0x00);
 | 
				
			||||||
 	rt2800_bbp_write(rt2x00dev, 189, 0x00);
 | 
					 	rt2800_bbp_write(rt2x00dev, 189, 0x00);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -192,7 +192,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
 | 
					 	/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
 | 
				
			||||||
 	rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
 | 
					 	rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
 | 
				
			||||||
@@ -10407,31 +10435,36 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -10466,31 +10494,36 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
 | 
					 	rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
 | 
				
			||||||
 	rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
 | 
					 	rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -254,7 +254,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	/* Initialize RF channel register to default value */
 | 
					 	/* Initialize RF channel register to default value */
 | 
				
			||||||
 	rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
 | 
					 	rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
 | 
				
			||||||
@@ -10497,63 +10530,71 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -10556,63 +10589,71 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
 | 
					 	rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -383,7 +383,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	/* Initialize RF DC calibration register to default value */
 | 
					 	/* Initialize RF DC calibration register to default value */
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
 | 
				
			||||||
@@ -10616,12 +10657,17 @@ static void rt2800_init_rfcsr_6352(struc
 | 
					@@ -10675,12 +10716,17 @@ static void rt2800_init_rfcsr_6352(struc
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
 | 
				
			||||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
 | 
					 	rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -404,5 +404,5 @@
 | 
				
			|||||||
+		rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
					+		rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
				
			||||||
+	}
 | 
					+	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					 	rt6352_enable_pa_pin(rt2x00dev, 0);
 | 
				
			||||||
 	rt2800_r_calibration(rt2x00dev);
 | 
					 	rt2800_r_calibration(rt2x00dev);
 | 
				
			||||||
 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user