mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
Sunxi 5.17 (#3687)
* Add 88 new patches to series. tag: orange-pi-5.17-20220409-0454 * Fix the applicability of patches.megous to the v5.17.3 kernel * Fix series.conf. Disable the patch that is not being applied * Add support for sun50i-h6-orangepi-3-lts * Check the applicability in the series * Move to a patches.armbian folder * Bananapro: add AXP209 regulators * fix-gpio-kconfig remove if EXPERT to allow normal build * sunxi-5.17: Remove unused patches
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
From 444ae2245cdccb154ca7d21ba91d9e8e22389dd1 Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 19:23:56 +0000
|
||||
Subject: [PATCH 01/11] Move sun50i-h6-pwm settings to its own overlay
|
||||
|
||||
---
|
||||
.../allwinner/overlay/sun50i-h6-fixup.scr-cmd | 14 -----------
|
||||
.../dts/allwinner/overlay/sun50i-h6-pwm.dts | 25 +++++++++++++++++++
|
||||
2 files changed, 25 insertions(+), 14 deletions(-)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-pwm.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-fixup.scr-cmd b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-fixup.scr-cmd
|
||||
index d8e79ba45..f757db7aa 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-fixup.scr-cmd
|
||||
+++ b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-fixup.scr-cmd
|
||||
@@ -54,20 +54,6 @@ if test "${param_pps_falling_edge}" = "1"; then
|
||||
fdt set /pps@0 assert-falling-edge
|
||||
fi
|
||||
|
||||
-for f in ${overlays}; do
|
||||
- if test "${f}" = "pwm"; then
|
||||
- setenv bootargs_new ""
|
||||
- for arg in ${bootargs}; do
|
||||
- if test "${arg}" = "console=ttyS0,115200"; then
|
||||
- echo "Warning: Disabling ttyS0 console due to enabled PWM overlay"
|
||||
- else
|
||||
- setenv bootargs_new "${bootargs_new} ${arg}"
|
||||
- fi
|
||||
- done
|
||||
- setenv bootargs "${bootargs_new}"
|
||||
- fi
|
||||
-done
|
||||
-
|
||||
if test -n "${param_w1_pin}"; then
|
||||
setenv tmp_bank "${param_w1_pin}"
|
||||
setenv tmp_pin "${param_w1_pin}"
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-pwm.dts b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-pwm.dts
|
||||
new file mode 100644
|
||||
index 000000000..a8aa74ed1
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-pwm.dts
|
||||
@@ -0,0 +1,25 @@
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "allwinner,sun50i-h6-pwm";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ target = <&pio>;
|
||||
+ __overlay__ {
|
||||
+ pwm_pin: pwm-pin {
|
||||
+ pins = "PD22";
|
||||
+ function = "pwm";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ fragment@1 {
|
||||
+ target = <&pwm>;
|
||||
+ __overlay__ {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pwm_pin>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
From 51112a4620dea5d3c77ca09572a249f5f877a1ce Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 19:26:16 +0000
|
||||
Subject: [PATCH 02/11] Compile the pwm overlay
|
||||
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/overlay/Makefile | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/overlay/Makefile b/arch/arm64/boot/dts/allwinner/overlay/Makefile
|
||||
index 87f5addec..7cabe8f42 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/overlay/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/overlay/Makefile
|
||||
@@ -38,6 +38,7 @@ dtbo-$(CONFIG_ARCH_SUNXI) += \
|
||||
sun50i-h6-i2c0.dtbo \
|
||||
sun50i-h6-i2c1.dtbo \
|
||||
sun50i-h6-i2c2.dtbo \
|
||||
+ sun50i-h6-pwm.dtbo \
|
||||
sun50i-h6-ruart.dtbo \
|
||||
sun50i-h6-spi-add-cs1.dtbo \
|
||||
sun50i-h6-spi-jedec-nor.dtbo \
|
||||
--
|
||||
2.25.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,613 @@
|
||||
From 29cfa9437eaa2ff862ab0f06852383b181b60743 Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 20:18:18 +0000
|
||||
Subject: [PATCH 04/11] Add sunxi-addr driver - Used to fix uwe5622 bluetooth
|
||||
MAC addresses
|
||||
|
||||
---
|
||||
drivers/misc/Kconfig | 1 +
|
||||
drivers/misc/Makefile | 1 +
|
||||
drivers/misc/sunxi-addr/Kconfig | 6 +
|
||||
drivers/misc/sunxi-addr/Makefile | 5 +
|
||||
drivers/misc/sunxi-addr/sha256.c | 178 +++++++++++++
|
||||
drivers/misc/sunxi-addr/sunxi-addr.c | 358 +++++++++++++++++++++++++++
|
||||
6 files changed, 549 insertions(+)
|
||||
create mode 100755 drivers/misc/sunxi-addr/Kconfig
|
||||
create mode 100755 drivers/misc/sunxi-addr/Makefile
|
||||
create mode 100755 drivers/misc/sunxi-addr/sha256.c
|
||||
create mode 100755 drivers/misc/sunxi-addr/sunxi-addr.c
|
||||
|
||||
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
|
||||
index 24cb809ae..52843042f 100644
|
||||
--- a/drivers/misc/Kconfig
|
||||
+++ b/drivers/misc/Kconfig
|
||||
@@ -494,4 +494,5 @@ source "drivers/misc/cardreader/Kconfig"
|
||||
source "drivers/misc/habanalabs/Kconfig"
|
||||
source "drivers/misc/uacce/Kconfig"
|
||||
source "drivers/misc/pvpanic/Kconfig"
|
||||
+source "drivers/misc/sunxi-addr/Kconfig"
|
||||
endmenu
|
||||
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
|
||||
index f3eaa577a..0f9280509 100644
|
||||
--- a/drivers/misc/Makefile
|
||||
+++ b/drivers/misc/Makefile
|
||||
@@ -60,3 +60,4 @@ obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o
|
||||
obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o
|
||||
obj-$(CONFIG_HI6421V600_IRQ) += hi6421v600-irq.o
|
||||
obj-$(CONFIG_MODEM_POWER) += modem-power.o
|
||||
+obj-$(CONFIG_SUNXI_ADDR_MGT) += sunxi-addr/
|
||||
\ No newline at end of file
|
||||
diff --git a/drivers/misc/sunxi-addr/Kconfig b/drivers/misc/sunxi-addr/Kconfig
|
||||
new file mode 100755
|
||||
index 000000000..801dd2c02
|
||||
--- /dev/null
|
||||
+++ b/drivers/misc/sunxi-addr/Kconfig
|
||||
@@ -0,0 +1,6 @@
|
||||
+config SUNXI_ADDR_MGT
|
||||
+ tristate "Allwinner Network MAC Addess Manager"
|
||||
+ depends on BT || ETHERNET || WLAN
|
||||
+ depends on NVMEM_SUNXI_SID
|
||||
+ help
|
||||
+ allwinner network mac address management
|
||||
diff --git a/drivers/misc/sunxi-addr/Makefile b/drivers/misc/sunxi-addr/Makefile
|
||||
new file mode 100755
|
||||
index 000000000..f01fd4783
|
||||
--- /dev/null
|
||||
+++ b/drivers/misc/sunxi-addr/Makefile
|
||||
@@ -0,0 +1,5 @@
|
||||
+#
|
||||
+# Makefile for wifi mac addr manager drivers
|
||||
+#
|
||||
+sunxi_addr-objs := sunxi-addr.o sha256.o
|
||||
+obj-$(CONFIG_SUNXI_ADDR_MGT) += sunxi_addr.o
|
||||
diff --git a/drivers/misc/sunxi-addr/sha256.c b/drivers/misc/sunxi-addr/sha256.c
|
||||
new file mode 100755
|
||||
index 000000000..78825810c
|
||||
--- /dev/null
|
||||
+++ b/drivers/misc/sunxi-addr/sha256.c
|
||||
@@ -0,0 +1,178 @@
|
||||
+/*
|
||||
+ * Local implement of sha256.
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Allwinner.
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/string.h>
|
||||
+
|
||||
+/****************************** MACROS ******************************/
|
||||
+#define ROTRIGHT(a, b) (((a) >> (b)) | ((a) << (32 - (b))))
|
||||
+#define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z)))
|
||||
+#define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
|
||||
+#define EP0(x) (ROTRIGHT(x, 2) ^ ROTRIGHT(x, 13) ^ ROTRIGHT(x, 22))
|
||||
+#define EP1(x) (ROTRIGHT(x, 6) ^ ROTRIGHT(x, 11) ^ ROTRIGHT(x, 25))
|
||||
+#define SIG0(x) (ROTRIGHT(x, 7) ^ ROTRIGHT(x, 18) ^ ((x) >> 3))
|
||||
+#define SIG1(x) (ROTRIGHT(x, 17) ^ ROTRIGHT(x, 19) ^ ((x) >> 10))
|
||||
+
|
||||
+/**************************** VARIABLES *****************************/
|
||||
+static const uint32_t k[64] = {
|
||||
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
||||
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
||||
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
||||
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
||||
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
||||
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
||||
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
||||
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
||||
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
||||
+};
|
||||
+
|
||||
+struct sha256_ctx {
|
||||
+ uint8_t data[64]; /* current 512-bit chunk of message data, just like a buffer */
|
||||
+ uint32_t datalen; /* sign the data length of current chunk */
|
||||
+ uint64_t bitlen; /* the bit length of the total message */
|
||||
+ uint32_t state[8]; /* store the middle state of hash abstract */
|
||||
+};
|
||||
+
|
||||
+/*********************** FUNCTION DEFINITIONS ***********************/
|
||||
+static void sha256_transform(struct sha256_ctx *ctx, const uint8_t *data)
|
||||
+{
|
||||
+ uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
|
||||
+
|
||||
+ /* initialization */
|
||||
+ for (i = 0, j = 0; i < 16; ++i, j += 4)
|
||||
+ m[i] = (data[j] << 24) | (data[j + 1] << 16) |
|
||||
+ (data[j + 2] << 8) | (data[j + 3]);
|
||||
+ for ( ; i < 64; ++i)
|
||||
+ m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
|
||||
+
|
||||
+ a = ctx->state[0];
|
||||
+ b = ctx->state[1];
|
||||
+ c = ctx->state[2];
|
||||
+ d = ctx->state[3];
|
||||
+ e = ctx->state[4];
|
||||
+ f = ctx->state[5];
|
||||
+ g = ctx->state[6];
|
||||
+ h = ctx->state[7];
|
||||
+
|
||||
+ for (i = 0; i < 64; ++i) {
|
||||
+ t1 = h + EP1(e) + CH(e, f, g) + k[i] + m[i];
|
||||
+ t2 = EP0(a) + MAJ(a, b, c);
|
||||
+ h = g;
|
||||
+ g = f;
|
||||
+ f = e;
|
||||
+ e = d + t1;
|
||||
+ d = c;
|
||||
+ c = b;
|
||||
+ b = a;
|
||||
+ a = t1 + t2;
|
||||
+ }
|
||||
+
|
||||
+ ctx->state[0] += a;
|
||||
+ ctx->state[1] += b;
|
||||
+ ctx->state[2] += c;
|
||||
+ ctx->state[3] += d;
|
||||
+ ctx->state[4] += e;
|
||||
+ ctx->state[5] += f;
|
||||
+ ctx->state[6] += g;
|
||||
+ ctx->state[7] += h;
|
||||
+}
|
||||
+
|
||||
+static void sha256_init(struct sha256_ctx *ctx)
|
||||
+{
|
||||
+ ctx->datalen = 0;
|
||||
+ ctx->bitlen = 0;
|
||||
+ ctx->state[0] = 0x6a09e667;
|
||||
+ ctx->state[1] = 0xbb67ae85;
|
||||
+ ctx->state[2] = 0x3c6ef372;
|
||||
+ ctx->state[3] = 0xa54ff53a;
|
||||
+ ctx->state[4] = 0x510e527f;
|
||||
+ ctx->state[5] = 0x9b05688c;
|
||||
+ ctx->state[6] = 0x1f83d9ab;
|
||||
+ ctx->state[7] = 0x5be0cd19;
|
||||
+}
|
||||
+
|
||||
+static void sha256_update(struct sha256_ctx *ctx, const uint8_t *data, size_t len)
|
||||
+{
|
||||
+ uint32_t i;
|
||||
+
|
||||
+ for (i = 0; i < len; ++i) {
|
||||
+ ctx->data[ctx->datalen] = data[i];
|
||||
+ ctx->datalen++;
|
||||
+ if (ctx->datalen == 64) {
|
||||
+ /* 64 byte = 512 bit means the buffer ctx->data has
|
||||
+ * fully stored one chunk of message,
|
||||
+ * so do the sha256 hash map for the current chunk.
|
||||
+ */
|
||||
+ sha256_transform(ctx, ctx->data);
|
||||
+ ctx->bitlen += 512;
|
||||
+ ctx->datalen = 0;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void sha256_final(struct sha256_ctx *ctx, uint8_t *hash)
|
||||
+{
|
||||
+ uint32_t i;
|
||||
+
|
||||
+ i = ctx->datalen;
|
||||
+
|
||||
+ /* Pad whatever data is left in the buffer. */
|
||||
+ if (ctx->datalen < 56) {
|
||||
+ ctx->data[i++] = 0x80; /* pad 10000000 = 0x80 */
|
||||
+ while (i < 56)
|
||||
+ ctx->data[i++] = 0x00;
|
||||
+ } else {
|
||||
+ ctx->data[i++] = 0x80;
|
||||
+ while (i < 64)
|
||||
+ ctx->data[i++] = 0x00;
|
||||
+ sha256_transform(ctx, ctx->data);
|
||||
+ memset(ctx->data, 0, 56);
|
||||
+ }
|
||||
+
|
||||
+ /* Append to the padding the total message's length in bits and transform. */
|
||||
+ ctx->bitlen += ctx->datalen * 8;
|
||||
+ ctx->data[63] = ctx->bitlen;
|
||||
+ ctx->data[62] = ctx->bitlen >> 8;
|
||||
+ ctx->data[61] = ctx->bitlen >> 16;
|
||||
+ ctx->data[60] = ctx->bitlen >> 24;
|
||||
+ ctx->data[59] = ctx->bitlen >> 32;
|
||||
+ ctx->data[58] = ctx->bitlen >> 40;
|
||||
+ ctx->data[57] = ctx->bitlen >> 48;
|
||||
+ ctx->data[56] = ctx->bitlen >> 56;
|
||||
+ sha256_transform(ctx, ctx->data);
|
||||
+
|
||||
+ /* copying the final state to the output hash(use big endian). */
|
||||
+ for (i = 0; i < 4; ++i) {
|
||||
+ hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+int hmac_sha256(const uint8_t *plaintext, ssize_t psize, uint8_t *output)
|
||||
+{
|
||||
+ struct sha256_ctx ctx;
|
||||
+
|
||||
+ sha256_init(&ctx);
|
||||
+ sha256_update(&ctx, plaintext, psize);
|
||||
+ sha256_final(&ctx, output);
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/drivers/misc/sunxi-addr/sunxi-addr.c b/drivers/misc/sunxi-addr/sunxi-addr.c
|
||||
new file mode 100755
|
||||
index 000000000..a812e4e82
|
||||
--- /dev/null
|
||||
+++ b/drivers/misc/sunxi-addr/sunxi-addr.c
|
||||
@@ -0,0 +1,358 @@
|
||||
+/*
|
||||
+ * The driver of SUNXI NET MAC ADDR Manager.
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Allwinner.
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+#define DEBUG
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/miscdevice.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#define ADDR_MGT_DBG(fmt, arg...) printk(KERN_DEBUG "[ADDR_MGT] %s: " fmt "\n",\
|
||||
+ __func__, ## arg)
|
||||
+#define ADDR_MGT_ERR(fmt, arg...) printk(KERN_ERR "[ADDR_MGT] %s: " fmt "\n",\
|
||||
+ __func__, ## arg)
|
||||
+
|
||||
+#define MODULE_CUR_VERSION "v1.0.9"
|
||||
+
|
||||
+#define MATCH_STR_LEN 20
|
||||
+#define ADDR_VAL_LEN 6
|
||||
+#define ADDR_STR_LEN 18
|
||||
+#define ID_LEN 16
|
||||
+#define HASH_LEN 32
|
||||
+
|
||||
+#define TYPE_ANY 0
|
||||
+#define TYPE_BURN 1
|
||||
+#define TYPE_IDGEN 2
|
||||
+#define TYPE_USER 3
|
||||
+#define TYPE_RAND 4
|
||||
+
|
||||
+#define ADDR_FMT_STR 0
|
||||
+#define ADDR_FMT_VAL 1
|
||||
+
|
||||
+#define IS_TYPE_INVALID(x) ((x < TYPE_ANY) || (x > TYPE_RAND))
|
||||
+
|
||||
+#define ADDR_CLASS_ATTR_ADD(name) \
|
||||
+static ssize_t addr_##name##_show(struct class *class, \
|
||||
+ struct class_attribute *attr, char *buffer) \
|
||||
+{ \
|
||||
+ char addr[ADDR_STR_LEN]; \
|
||||
+ if (IS_TYPE_INVALID(get_addr_by_name(ADDR_FMT_STR, addr, #name))) \
|
||||
+ return 0; \
|
||||
+ return sprintf(buffer, "%.17s\n", addr); \
|
||||
+} \
|
||||
+static ssize_t addr_##name##_store(struct class *class, \
|
||||
+ struct class_attribute *attr, \
|
||||
+ const char *buffer, size_t count) \
|
||||
+{ \
|
||||
+ if (count != ADDR_STR_LEN) { \
|
||||
+ ADDR_MGT_ERR("Length wrong."); \
|
||||
+ return -EINVAL; \
|
||||
+ } \
|
||||
+ set_addr_by_name(TYPE_USER, ADDR_FMT_STR, buffer, #name); \
|
||||
+ return count; \
|
||||
+} \
|
||||
+static CLASS_ATTR_RW(addr_##name);
|
||||
+
|
||||
+struct addr_mgt_info {
|
||||
+ unsigned int type_def;
|
||||
+ unsigned int type_cur;
|
||||
+ unsigned int flag;
|
||||
+ char *addr;
|
||||
+ char *name;
|
||||
+};
|
||||
+
|
||||
+static struct addr_mgt_info info[] = {
|
||||
+ {TYPE_ANY, TYPE_ANY, 1, NULL, "wifi"},
|
||||
+ {TYPE_ANY, TYPE_ANY, 0, NULL, "bt" },
|
||||
+ {TYPE_ANY, TYPE_ANY, 1, NULL, "eth" },
|
||||
+};
|
||||
+
|
||||
+extern int hmac_sha256(const uint8_t *plaintext, ssize_t psize, uint8_t *output);
|
||||
+extern int sunxi_get_soc_chipid(unsigned char *chipid);
|
||||
+
|
||||
+static int addr_parse(int fmt, const char *addr, int check)
|
||||
+{
|
||||
+ char val_buf[ADDR_VAL_LEN];
|
||||
+ char cmp_buf[ADDR_VAL_LEN];
|
||||
+ int ret = ADDR_VAL_LEN;
|
||||
+
|
||||
+ if (fmt == ADDR_FMT_STR)
|
||||
+ ret = sscanf(addr, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
||||
+ &val_buf[0], &val_buf[1], &val_buf[2],
|
||||
+ &val_buf[3], &val_buf[4], &val_buf[5]);
|
||||
+ else
|
||||
+ memcpy(val_buf, addr, ADDR_VAL_LEN);
|
||||
+
|
||||
+ if (ret != ADDR_VAL_LEN)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (check && (val_buf[0] & 0x3))
|
||||
+ return -1;
|
||||
+
|
||||
+ memset(cmp_buf, 0x00, ADDR_VAL_LEN);
|
||||
+ if (memcmp(val_buf, cmp_buf, ADDR_VAL_LEN) == 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ memset(cmp_buf, 0xFF, ADDR_VAL_LEN);
|
||||
+ if (memcmp(val_buf, cmp_buf, ADDR_VAL_LEN) == 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct addr_mgt_info *addr_find_by_name(char *name)
|
||||
+{
|
||||
+ int i = 0;
|
||||
+ for (i = 0; i < ARRAY_SIZE(info); i++) {
|
||||
+ if (strcmp(info[i].name, name) == 0)
|
||||
+ return &info[i];
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int get_addr_by_name(int fmt, char *addr, char *name)
|
||||
+{
|
||||
+ struct addr_mgt_info *t;
|
||||
+
|
||||
+ t = addr_find_by_name(name);
|
||||
+ if (t == NULL) {
|
||||
+ ADDR_MGT_ERR("can't find addr named: %s", name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (IS_TYPE_INVALID(t->type_cur)) {
|
||||
+ ADDR_MGT_ERR("addr type invalid");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (addr_parse(ADDR_FMT_VAL, t->addr, t->flag)) {
|
||||
+ ADDR_MGT_ERR("addr parse fail(%s)", t->addr);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (fmt == ADDR_FMT_STR)
|
||||
+ sprintf(addr, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
+ t->addr[0], t->addr[1], t->addr[2],
|
||||
+ t->addr[3], t->addr[4], t->addr[5]);
|
||||
+ else
|
||||
+ memcpy(addr, t->addr, ADDR_VAL_LEN);
|
||||
+
|
||||
+ return t->type_cur;
|
||||
+}
|
||||
+
|
||||
+static int set_addr_by_name(int type, int fmt, const char *addr, char *name)
|
||||
+{
|
||||
+ struct addr_mgt_info *t;
|
||||
+
|
||||
+ t = addr_find_by_name(name);
|
||||
+ if (t == NULL) {
|
||||
+ ADDR_MGT_ERR("can't find addr named: %s", name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (addr_parse(fmt, addr, t->flag)) {
|
||||
+ ADDR_MGT_ERR("addr parse fail(%s)", addr);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ t->type_cur = type;
|
||||
+ if (fmt == ADDR_FMT_STR)
|
||||
+ sscanf(addr, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
||||
+ &t->addr[0], &t->addr[1], &t->addr[2],
|
||||
+ &t->addr[3], &t->addr[4], &t->addr[5]);
|
||||
+ else
|
||||
+ memcpy(t->addr, addr, ADDR_VAL_LEN);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int get_custom_mac_address(int fmt, char *name, char *addr)
|
||||
+{
|
||||
+ return get_addr_by_name(fmt, addr, name);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(get_custom_mac_address);
|
||||
+
|
||||
+static int addr_factory(struct device_node *np,
|
||||
+ int idx, int type, char *mac, char *name)
|
||||
+{
|
||||
+ int ret, i;
|
||||
+ char match[MATCH_STR_LEN];
|
||||
+ const char *p;
|
||||
+ char id[ID_LEN], hash[HASH_LEN], cmp_buf[ID_LEN];
|
||||
+ struct timespec64 curtime;
|
||||
+
|
||||
+ switch (type) {
|
||||
+ case TYPE_BURN:
|
||||
+ sprintf(match, "addr_%s", name);
|
||||
+ ret = of_property_read_string_index(np, match, 0, &p);
|
||||
+ if (ret)
|
||||
+ return -1;
|
||||
+
|
||||
+ ret = sscanf(p, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
||||
+ &mac[0], &mac[1], &mac[2],
|
||||
+ &mac[3], &mac[4], &mac[5]);
|
||||
+
|
||||
+ if (ret != ADDR_VAL_LEN)
|
||||
+ return -1;
|
||||
+ break;
|
||||
+ case TYPE_IDGEN:
|
||||
+ if (idx > HASH_LEN / ADDR_VAL_LEN - 1)
|
||||
+ return -1;
|
||||
+ if (sunxi_get_soc_chipid(id))
|
||||
+ return -1;
|
||||
+ memset(cmp_buf, 0x00, ID_LEN);
|
||||
+ if (memcmp(id, cmp_buf, ID_LEN) == 0)
|
||||
+ return -1;
|
||||
+ if (hmac_sha256(id, ID_LEN, hash))
|
||||
+ return -1;
|
||||
+ memcpy(mac, &hash[idx * ADDR_VAL_LEN], ADDR_VAL_LEN);
|
||||
+ break;
|
||||
+ case TYPE_RAND:
|
||||
+ for (i = 0; i < ADDR_VAL_LEN; i++) {
|
||||
+ ktime_get_real_ts64(&curtime);
|
||||
+ mac[i] = (char)curtime.tv_nsec;
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ ADDR_MGT_ERR("unsupport type: %d", type);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int addr_init(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *np = pdev->dev.of_node;
|
||||
+ int type, i, j;
|
||||
+ char match[MATCH_STR_LEN];
|
||||
+ char addr[ADDR_VAL_LEN];
|
||||
+ int type_tab[] = {TYPE_BURN, TYPE_IDGEN, TYPE_RAND};
|
||||
+
|
||||
+ /* init addr type and value */
|
||||
+ for (i = 0; i < ARRAY_SIZE(info); i++) {
|
||||
+ sprintf(match, "type_addr_%s", info[i].name);
|
||||
+ if (of_property_read_u32(np, match, &type)) {
|
||||
+ ADDR_MGT_DBG("Failed to get type_def_%s, use default: %d",
|
||||
+ info[i].name, info[i].type_def);
|
||||
+ } else {
|
||||
+ info[i].type_def = type;
|
||||
+ info[i].type_cur = type;
|
||||
+ }
|
||||
+
|
||||
+ if (IS_TYPE_INVALID(info[i].type_def))
|
||||
+ return -1;
|
||||
+ if (info[i].type_def != TYPE_ANY) {
|
||||
+ if (addr_factory(np, i, info[i].type_def, addr, info[i].name))
|
||||
+ return -1;
|
||||
+ } else {
|
||||
+ for (j = 0; j < ARRAY_SIZE(type_tab); j++) {
|
||||
+ if (!addr_factory(np, i, type_tab[j], addr, info[i].name)) {
|
||||
+ info[i].type_cur = type_tab[j];
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (info[i].flag)
|
||||
+ addr[0] &= 0xFC;
|
||||
+
|
||||
+ if (addr_parse(ADDR_FMT_VAL, addr, info[i].flag))
|
||||
+ return -1;
|
||||
+ else {
|
||||
+ info[i].addr = devm_kzalloc(&pdev->dev, ADDR_VAL_LEN, GFP_KERNEL);
|
||||
+ memcpy(info[i].addr, addr, ADDR_VAL_LEN);
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static ssize_t summary_show(struct class *class,
|
||||
+ struct class_attribute *attr, char *buffer)
|
||||
+{
|
||||
+ int i = 0, ret = 0;
|
||||
+
|
||||
+ ret += sprintf(&buffer[ret], "name cfg cur address\n");
|
||||
+ for (i = 0; i < ARRAY_SIZE(info); i++) {
|
||||
+ ret += sprintf(&buffer[ret],
|
||||
+ "%4s %d %d %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
+ info[i].name, info[i].type_def, info[i].type_cur,
|
||||
+ info[i].addr[0], info[i].addr[1], info[i].addr[2],
|
||||
+ info[i].addr[3], info[i].addr[4], info[i].addr[5]);
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+static CLASS_ATTR_RO(summary);
|
||||
+
|
||||
+ADDR_CLASS_ATTR_ADD(wifi);
|
||||
+ADDR_CLASS_ATTR_ADD(bt);
|
||||
+ADDR_CLASS_ATTR_ADD(eth);
|
||||
+
|
||||
+static struct attribute *addr_class_attrs[] = {
|
||||
+ &class_attr_summary.attr,
|
||||
+ &class_attr_addr_wifi.attr,
|
||||
+ &class_attr_addr_bt.attr,
|
||||
+ &class_attr_addr_eth.attr,
|
||||
+ NULL
|
||||
+};
|
||||
+ATTRIBUTE_GROUPS(addr_class);
|
||||
+
|
||||
+static struct class addr_class = {
|
||||
+ .name = "addr_mgt",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .class_groups = addr_class_groups,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id addr_mgt_ids[] = {
|
||||
+ { .compatible = "allwinner,sunxi-addr_mgt" },
|
||||
+ { /* Sentinel */ }
|
||||
+};
|
||||
+
|
||||
+static int addr_mgt_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int status;
|
||||
+
|
||||
+ ADDR_MGT_DBG("module version: %s", MODULE_CUR_VERSION);
|
||||
+ status = class_register(&addr_class);
|
||||
+ if (status < 0) {
|
||||
+ ADDR_MGT_ERR("class register error, status: %d.", status);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (addr_init(pdev)) {
|
||||
+ ADDR_MGT_ERR("failed to init addr.");
|
||||
+ class_unregister(&addr_class);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ ADDR_MGT_DBG("success.");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int addr_mgt_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ class_unregister(&addr_class);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver addr_mgt_driver = {
|
||||
+ .probe = addr_mgt_probe,
|
||||
+ .remove = addr_mgt_remove,
|
||||
+ .driver = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .name = "sunxi-addr-mgt",
|
||||
+ .of_match_table = addr_mgt_ids,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver_probe(addr_mgt_driver, addr_mgt_probe);
|
||||
+
|
||||
+MODULE_AUTHOR("Allwinnertech");
|
||||
+MODULE_DESCRIPTION("Network MAC Addess Manager");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.25.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,101 @@
|
||||
From 8ed1a098ef9d7a2febbb24d2e101928a3623a50c Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 20:22:40 +0000
|
||||
Subject: [PATCH 06/11] h6: dts: overlay: fix spidev
|
||||
|
||||
---
|
||||
.../overlay/sun50i-h6-spi-spidev.dts | 6 +--
|
||||
.../overlay/sun50i-h6-spi-spidev1.dts | 47 ++++++++++---------
|
||||
2 files changed, 27 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev.dts b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev.dts
|
||||
index bac3adcba..848c076d0 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev.dts
|
||||
@@ -2,7 +2,7 @@
|
||||
/plugin/;
|
||||
|
||||
/ {
|
||||
- compatible = "allwinner,sun50i-h6";
|
||||
+ compatible = "allwinner,sun8i-h3-spi";
|
||||
|
||||
fragment@0 {
|
||||
target-path = "/aliases";
|
||||
@@ -18,7 +18,7 @@ __overlay__ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
spidev@0 {
|
||||
- compatible = "spidev";
|
||||
+ compatible = "rohm,dh2228fv";
|
||||
status = "disabled";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <1000000>;
|
||||
@@ -32,7 +32,7 @@ __overlay__ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
spidev@0 {
|
||||
- compatible = "spidev";
|
||||
+ compatible = "rohm,dh2228fv";
|
||||
status = "disabled";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <1000000>;
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev1.dts b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev1.dts
|
||||
index e19448434..aee7da0a6 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev1.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/overlay/sun50i-h6-spi-spidev1.dts
|
||||
@@ -3,28 +3,29 @@
|
||||
/plugin/;
|
||||
|
||||
/ {
|
||||
- compatible = "allwinner,sun8i-h6";
|
||||
+ compatible = "allwinner,sun8i-h3-spi";
|
||||
|
||||
- fragment@0 {
|
||||
- target-path = "/aliases";
|
||||
- __overlay__ {
|
||||
- /* Path to the SPI controller nodes */
|
||||
- spi1 = "/soc/spi@5011000";
|
||||
- };
|
||||
- };
|
||||
- fragment@1 {
|
||||
- target = <&spi1>;
|
||||
- __overlay__ {
|
||||
- pinctrl-names = "default";
|
||||
- pinctrl-0 = <&spi1_pins>;
|
||||
- status = "okay";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- spidev@0 {
|
||||
- compatible = "spidev";
|
||||
- reg = <0x0>;
|
||||
- spi-max-frequency = <1000000>;
|
||||
- };
|
||||
- };
|
||||
- };
|
||||
+ fragment@0 {
|
||||
+ target-path = "/aliases";
|
||||
+ __overlay__ {
|
||||
+ /* Path to the SPI controller nodes */
|
||||
+ spi1 = "/soc/spi@5011000";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ fragment@1 {
|
||||
+ target = <&spi1>;
|
||||
+ __overlay__ {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&spi1_pins>;
|
||||
+ status = "okay";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ spidev@0 {
|
||||
+ compatible = "rohm,dh2228fv";
|
||||
+ reg = <0x0>;
|
||||
+ spi-max-frequency = <1000000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
From 70a0c21f9bc1eed754cce584fe382883dc412db0 Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 20:31:26 +0000
|
||||
Subject: [PATCH 08/11] uwe5622: bluetooth: Fix firmware init fail
|
||||
|
||||
---
|
||||
net/bluetooth/hci_core.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
|
||||
index c67390367..b2ee9b6a8 100644
|
||||
--- a/net/bluetooth/hci_core.c
|
||||
+++ b/net/bluetooth/hci_core.c
|
||||
@@ -932,7 +932,11 @@ static int __hci_init(struct hci_dev *hdev)
|
||||
|
||||
err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT, NULL);
|
||||
if (err < 0)
|
||||
+#if defined(CONFIG_RK_WIFI_DEVICE_UWE5621) || defined(CONFIG_AW_WIFI_DEVICE_UWE5622)
|
||||
+ ;
|
||||
+#else
|
||||
return err;
|
||||
+#endif
|
||||
|
||||
err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT, NULL);
|
||||
if (err < 0)
|
||||
--
|
||||
2.25.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,59 @@
|
||||
From caaa7def76801cbe9937602603f6b471f776e6f6 Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Sat, 16 Apr 2022 11:19:05 +0300
|
||||
Subject: [PATCH] nvmem: sunxi_sid: add sunxi_get_soc_chipid, sunxi_get_serial
|
||||
|
||||
---
|
||||
drivers/nvmem/sunxi_sid.c | 28 ++++++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
diff --git a/drivers/nvmem/sunxi_sid.c b/drivers/nvmem/sunxi_sid.c
|
||||
index 37a6abb0e..c81fac63d 100644
|
||||
--- a/drivers/nvmem/sunxi_sid.c
|
||||
+++ b/drivers/nvmem/sunxi_sid.c
|
||||
@@ -37,6 +37,25 @@ struct sunxi_sid {
|
||||
u32 value_offset;
|
||||
};
|
||||
|
||||
+static unsigned int sunxi_soc_chipid[4];
|
||||
+static unsigned int sunxi_serial[4];
|
||||
+
|
||||
+int sunxi_get_soc_chipid(unsigned char *chipid)
|
||||
+{
|
||||
+ memcpy(chipid, sunxi_soc_chipid, 16);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(sunxi_get_soc_chipid);
|
||||
+
|
||||
+int sunxi_get_serial(unsigned char *serial)
|
||||
+{
|
||||
+ memcpy(serial, sunxi_serial, 16);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(sunxi_get_serial);
|
||||
+
|
||||
static int sunxi_sid_read(void *context, unsigned int offset,
|
||||
void *val, size_t bytes)
|
||||
{
|
||||
@@ -167,6 +186,15 @@ static int sunxi_sid_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, nvmem);
|
||||
|
||||
+ nvmem_cfg->reg_read(sid, 0, &sunxi_soc_chipid[0], sizeof(int));
|
||||
+ nvmem_cfg->reg_read(sid, 4, &sunxi_soc_chipid[1], sizeof(int));
|
||||
+ nvmem_cfg->reg_read(sid, 8, &sunxi_soc_chipid[2], sizeof(int));
|
||||
+ nvmem_cfg->reg_read(sid, 12, &sunxi_soc_chipid[3], sizeof(int));
|
||||
+
|
||||
+ sunxi_serial[0] = sunxi_soc_chipid[3];
|
||||
+ sunxi_serial[1] = sunxi_soc_chipid[2];
|
||||
+ sunxi_serial[2] = (sunxi_soc_chipid[1] >> 16) & 0x0ffff;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
@@ -0,0 +1,611 @@
|
||||
From 1f2b868b06041370235d7f87724fb1f397f2018e Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Sat, 16 Apr 2022 11:51:35 +0300
|
||||
Subject: [PATCH] add initial support for orangepi3-lts
|
||||
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
.../allwinner/sun50i-h6-orangepi-3-lts.dts | 398 ++++++++++++++++++
|
||||
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 101 ++++-
|
||||
3 files changed, 487 insertions(+), 13 deletions(-)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index fe2c76047..30a51b913 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -41,6 +41,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-beelink-gs1.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3-lts.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-lite2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-one-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-pine-h64.dtb
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
new file mode 100644
|
||||
index 000000000..cc5a73026
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
@@ -0,0 +1,398 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+// Copyright (C) 2019 Ondřej Jirman <megous@megous.com>
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "sun50i-h6.dtsi"
|
||||
+#include "sun50i-h6-cpu-opp.dtsi"
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "OrangePi 3 LTS";
|
||||
+ compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ serial1 = &uart1;
|
||||
+ serial9 = &r_uart;
|
||||
+ ethernet0 = &emac;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ ddc-en-gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_con_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_out_con>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ ext_osc32k: ext_osc32k_clk {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <32768>;
|
||||
+ clock-output-names = "ext_osc32k";
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ status {
|
||||
+ label = "green-led";
|
||||
+ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
|
||||
+ default-state = "on";
|
||||
+ };
|
||||
+
|
||||
+ power {
|
||||
+ label = "red-led";
|
||||
+ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ reg_vcc5v: vcc5v {
|
||||
+ /* board wide 5V supply directly from the DC jack */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-5v";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ reg_gmac_3v3: gmac-3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-gmac-3v3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ startup-delay-us = <100000>;
|
||||
+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
|
||||
+ enable-active-high;
|
||||
+ };
|
||||
+
|
||||
+ reg_vcc33_wifi: vcc33-wifi {
|
||||
+ /* Always on 3.3V regulator for WiFi and BT */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc33-wifi";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ enable-active-high;
|
||||
+ gpio = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
|
||||
+ };
|
||||
+
|
||||
+ reg_vcc_wifi_io: vcc-wifi-io {
|
||||
+ /* Always on 1.8V/300mA regulator for WiFi and BT IO */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-wifi-io";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ vin-supply = <®_vcc33_wifi>;
|
||||
+ };
|
||||
+
|
||||
+ wifi_pwrseq: wifi-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ clocks = <&rtc 1>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ reset-gpios = <&r_pio 1 3 GPIO_ACTIVE_LOW>; /* PM3 */
|
||||
+ post-power-on-delay-ms = <200>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <®_dcdca>;
|
||||
+};
|
||||
+
|
||||
+&de {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&dwc3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ehci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ehci3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&gpu {
|
||||
+ mali-supply = <®_dcdcc>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi_out {
|
||||
+ hdmi_out_con: endpoint {
|
||||
+ remote-endpoint = <&hdmi_con_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&emac {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&ext_rgmii_pins>;
|
||||
+ phy-mode = "rgmii-id";
|
||||
+ phy-handle = <&ext_rgmii_phy>;
|
||||
+ phy-supply = <®_gmac_3v3>;
|
||||
+ allwinner,rx-delay-ps = <200>;
|
||||
+ allwinner,tx-delay-ps = <300>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mdio {
|
||||
+ ext_rgmii_phy: ethernet-phy@1 {
|
||||
+ compatible = "ethernet-phy-ieee802.3-c22";
|
||||
+ reg = <1>;
|
||||
+
|
||||
+ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */
|
||||
+ reset-assert-us = <15000>;
|
||||
+ reset-deassert-us = <40000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2s1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc0 {
|
||||
+ vmmc-supply = <®_cldo1>;
|
||||
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
|
||||
+ bus-width = <4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc1 {
|
||||
+ vmmc-supply = <®_vcc33_wifi>;
|
||||
+ vqmmc-supply = <®_vcc_wifi_io>;
|
||||
+ mmc-pwrseq = <&wifi_pwrseq>;
|
||||
+ bus-width = <4>;
|
||||
+ non-removable;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc2 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc2_pins>;
|
||||
+ vmmc-supply = <®_cldo1>;
|
||||
+ vqmmc-supply = <®_bldo2>;
|
||||
+ bus-width = <8>;
|
||||
+ non-removable;
|
||||
+ cap-mmc-hw-reset;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pio {
|
||||
+ vcc-pc-supply = <®_bldo2>;
|
||||
+ vcc-pd-supply = <®_cldo1>;
|
||||
+ vcc-pg-supply = <®_vcc_wifi_io>;
|
||||
+};
|
||||
+
|
||||
+&r_rsb {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp805: pmic@745 {
|
||||
+ compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
+ reg = <0x745>;
|
||||
+ interrupt-parent = <&r_intc>;
|
||||
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ x-powers,self-working-mode;
|
||||
+ vina-supply = <®_vcc5v>;
|
||||
+ vinb-supply = <®_vcc5v>;
|
||||
+ vinc-supply = <®_vcc5v>;
|
||||
+ vind-supply = <®_vcc5v>;
|
||||
+ vine-supply = <®_vcc5v>;
|
||||
+ aldoin-supply = <®_vcc5v>;
|
||||
+ bldoin-supply = <®_vcc5v>;
|
||||
+ cldoin-supply = <®_vcc5v>;
|
||||
+
|
||||
+ regulators {
|
||||
+ reg_aldo1: aldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-pl-led-ir";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo2: aldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc33-audio-tv-ephy-mac";
|
||||
+ regulator-enable-ramp-delay = <100000>;
|
||||
+ };
|
||||
+
|
||||
+ /* ALDO3 is shorted to CLDO1 */
|
||||
+ reg_aldo3: aldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-1";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo1: bldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc18-dram-bias-pll";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo2: bldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-efuse-pcie-hdmi-pc";
|
||||
+ };
|
||||
+
|
||||
+ reg_blod3: bldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-wifi-io-pm-pg";
|
||||
+ };
|
||||
+
|
||||
+ bldo4 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ reg_cldo1: cldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2";
|
||||
+ };
|
||||
+
|
||||
+ cldo2 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ cldo3 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdca: dcdca {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <800000>;
|
||||
+ regulator-max-microvolt = <1160000>;
|
||||
+ regulator-ramp-delay = <2500>;
|
||||
+ regulator-name = "vdd-cpu";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcc: dcdcc {
|
||||
+ regulator-enable-ramp-delay = <32000>;
|
||||
+ regulator-min-microvolt = <810000>;
|
||||
+ regulator-max-microvolt = <1080000>;
|
||||
+ regulator-ramp-delay = <2500>;
|
||||
+ regulator-name = "vdd-gpu";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcd: dcdcd {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <960000>;
|
||||
+ regulator-max-microvolt = <960000>;
|
||||
+ regulator-name = "vdd-sys";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdce: dcdce {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1200000>;
|
||||
+ regulator-name = "vcc-dram";
|
||||
+ };
|
||||
+
|
||||
+ sw {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pwm {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ac200_pwm_clk {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2s3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_ir {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&rtc {
|
||||
+ clocks = <&ext_osc32k>;
|
||||
+};
|
||||
+
|
||||
+&sound_hdmi {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sound_ac200 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+/delete-node/ &spi0;
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_ph_pins>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&uart1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
|
||||
+ uart-has-rtscts;
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&usb2otg {
|
||||
+ /*
|
||||
+ * This board doesn't have a controllable VBUS even though it
|
||||
+ * does have an ID pin. Using it as anything but a USB host is
|
||||
+ * unsafe.
|
||||
+ */
|
||||
+ dr_mode = "host";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb2phy {
|
||||
+ usb0_id_det-gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>; /* PC15 */
|
||||
+ usb0_vbus-supply = <®_vcc5v>;
|
||||
+ usb3_vbus-supply = <®_vcc5v>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb3phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
index d6217be99..97cd0f70f 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
@@ -91,6 +91,13 @@ osc24M: osc24M_clk {
|
||||
clock-output-names = "osc24M";
|
||||
};
|
||||
|
||||
+ ext_osc32k: ext_osc32k_clk {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <32768>;
|
||||
+ clock-output-names = "ext_osc32k";
|
||||
+ };
|
||||
+
|
||||
pmu {
|
||||
compatible = "arm,cortex-a53-pmu";
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@@ -126,6 +133,28 @@ cpu {
|
||||
};
|
||||
};
|
||||
|
||||
+ sound_ac200: sound_ac200 {
|
||||
+ status = "disabled";
|
||||
+ compatible = "simple-audio-card";
|
||||
+ simple-audio-card,format = "i2s";
|
||||
+ simple-audio-card,frame-master = <&i2s3_master>;
|
||||
+ simple-audio-card,bitclock-master = <&i2s3_master>;
|
||||
+ simple-audio-card,name = "allwinner,ac200-codec";
|
||||
+ simple-audio-card,mclk-fs = <512>;
|
||||
+ i2s3_master: simple-audio-card,cpu {
|
||||
+ sound-dai = <&i2s3>;
|
||||
+ system-clock-frequency = <22579200>;
|
||||
+ dai-tdm-slot-num = <2>;
|
||||
+ dai-tdm-slot-width = <32>;
|
||||
+ };
|
||||
+ simple-audio-card,codec {
|
||||
+ sound-dai = <&ac200_codec>;
|
||||
+ system-clock-frequency = <22579200>;
|
||||
+ dai-tdm-slot-num = <2>;
|
||||
+ dai-tdm-slot-width = <32>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
arm,no-tick-in-suspend;
|
||||
@@ -379,7 +408,6 @@ pwm: pwm@300a000 {
|
||||
pio: pinctrl@300b000 {
|
||||
compatible = "allwinner,sun50i-h6-pinctrl";
|
||||
reg = <0x0300b000 0x400>;
|
||||
- interrupt-parent = <&r_intc>;
|
||||
interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@@ -529,6 +557,11 @@ uart3_rts_cts_pins: uart3-rts-cts-pins {
|
||||
pins = "PD25", "PD26";
|
||||
function = "uart3";
|
||||
};
|
||||
+
|
||||
+ i2s3_pins: i2s3-pins {
|
||||
+ pins = "PB12", "PB13", "PB14", "PB15", "PB16";
|
||||
+ function = "i2s3";
|
||||
+ };
|
||||
};
|
||||
|
||||
iommu: iommu@30f0000 {
|
||||
@@ -727,6 +760,7 @@ i2c3: i2c@5002c00 {
|
||||
ac200: mfd@10 {
|
||||
compatible = "x-powers,ac200";
|
||||
reg = <0x10>;
|
||||
+ clocks = <&ac200_pwm_clk>;
|
||||
interrupt-parent = <&pio>;
|
||||
interrupts = <1 20 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
@@ -734,11 +768,16 @@ ac200: mfd@10 {
|
||||
|
||||
ac200_ephy: phy {
|
||||
compatible = "x-powers,ac200-ephy";
|
||||
- clocks = <&ac200_pwm_clk>;
|
||||
nvmem-cells = <&ephy_calibration>;
|
||||
nvmem-cell-names = "calibration";
|
||||
status = "disabled";
|
||||
};
|
||||
+
|
||||
+ ac200_codec: codec {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "x-powers,ac200-codec";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
@@ -775,6 +814,21 @@ i2s1: i2s@5091000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ i2s3: i2s@508f000 {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "allwinner,sun50i-h6-i2s";
|
||||
+ reg = <0x0508f000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_I2S3>, <&ccu CLK_I2S3>;
|
||||
+ clock-names = "apb", "mod";
|
||||
+ dmas = <&dma 6>, <&dma 6>;
|
||||
+ resets = <&ccu RST_BUS_I2S3>;
|
||||
+ dma-names = "rx", "tx";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2s3_pins>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
spdif: spdif@5093000 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun50i-h6-spdif";
|
||||
@@ -1070,6 +1124,7 @@ rtc: rtc@7000000 {
|
||||
interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-output-names = "osc32k", "osc32k-out", "iosc";
|
||||
+ clocks = <&ext_osc32k>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
@@ -1135,17 +1190,18 @@ r_uart_pins: r-uart-pins {
|
||||
};
|
||||
|
||||
r_ir: ir@7040000 {
|
||||
- compatible = "allwinner,sun50i-h6-ir",
|
||||
- "allwinner,sun6i-a31-ir";
|
||||
- reg = <0x07040000 0x400>;
|
||||
- interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
|
||||
- clocks = <&r_ccu CLK_R_APB1_IR>,
|
||||
- <&r_ccu CLK_IR>;
|
||||
- clock-names = "apb", "ir";
|
||||
- resets = <&r_ccu RST_R_APB1_IR>;
|
||||
- pinctrl-names = "default";
|
||||
- pinctrl-0 = <&r_ir_rx_pin>;
|
||||
- status = "disabled";
|
||||
+ compatible = "allwinner,sun50i-h6-ir",
|
||||
+ "allwinner,sun6i-a31-ir";
|
||||
+ reg = <0x07040000 0x400>;
|
||||
+ interrupt-parent = <&r_intc>;
|
||||
+ interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&r_ccu CLK_R_APB1_IR>,
|
||||
+ <&r_ccu CLK_IR>;
|
||||
+ clock-names = "apb", "ir";
|
||||
+ resets = <&r_ccu RST_R_APB1_IR>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&r_ir_rx_pin>;
|
||||
+ status = "disabled";
|
||||
};
|
||||
|
||||
r_i2c: i2c@7081400 {
|
||||
@@ -1187,6 +1243,25 @@ ths: thermal-sensor@5070400 {
|
||||
nvmem-cell-names = "calibration";
|
||||
#thermal-sensor-cells = <1>;
|
||||
};
|
||||
+
|
||||
+ sunxi-info {
|
||||
+ compatible = "allwinner,sun50i-h6-sys-info";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ addr_mgt: addr-mgt {
|
||||
+ compatible = "allwinner,sunxi-addr_mgt";
|
||||
+ type_addr_wifi = <0x2>;
|
||||
+ type_addr_bt = <0x2>;
|
||||
+ type_addr_eth = <0x2>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ dump_reg: dump_reg@20000 {
|
||||
+ compatible = "allwinner,sunxi-dump-reg";
|
||||
+ reg = <0x0 0x03001000 0x0 0x0f20>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
|
||||
thermal-zones {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From 9010972a9691d468eb68ab85c73c80bb572a5334 Mon Sep 17 00:00:00 2001
|
||||
From: Ukhellfire <afaulkner420@gmail.com>
|
||||
Date: Thu, 24 Mar 2022 22:21:00 +0000
|
||||
Subject: [PATCH] Fix H6 emmc
|
||||
|
||||
We have the wrong MMC CAP voltage for the emmc on this board
|
||||
---
|
||||
drivers/mmc/host/sunxi-mmc.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
|
||||
index dd1c2a610..9a641c7d2 100644
|
||||
--- a/drivers/mmc/host/sunxi-mmc.c
|
||||
+++ b/drivers/mmc/host/sunxi-mmc.c
|
||||
@@ -1221,6 +1221,7 @@ static const struct of_device_id sunxi_mmc_of_match[] = {
|
||||
{ .compatible = "allwinner,sun50i-a64-mmc", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun50i-a64-emmc", .data = &sun50i_a64_emmc_cfg },
|
||||
{ .compatible = "allwinner,sun50i-h5-emmc", .data = &sun50i_h5_emmc_cfg },
|
||||
+ { .compatible = "allwinner,sun50i-h6-emmc", .data = &sun50i_a64_emmc_cfg },
|
||||
{ .compatible = "allwinner,sun50i-a100-mmc", .data = &sun50i_a100_cfg },
|
||||
{ .compatible = "allwinner,sun50i-a100-emmc", .data = &sun50i_a100_emmc_cfg },
|
||||
{ /* sentinel */ }
|
||||
@@ -1434,7 +1435,7 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
|
||||
MMC_CAP_SDIO_IRQ;
|
||||
|
||||
/*
|
||||
- * Some H5 devices do not have signal traces precise enough to
|
||||
+ * Some H5 and H6 devices do not have signal traces precise enough to
|
||||
* use HS DDR mode for their eMMC chips.
|
||||
*
|
||||
* We still enable HS DDR modes for all the other controller
|
||||
@@ -1443,6 +1444,8 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
|
||||
if ((host->cfg->clk_delays || host->use_new_timings) &&
|
||||
!of_device_is_compatible(pdev->dev.of_node,
|
||||
"allwinner,sun50i-h5-emmc") &&
|
||||
+ !of_device_is_compatible(pdev->dev.of_node,
|
||||
+ "allwinner,sun50i-h6-emmc") &&
|
||||
!of_machine_is_compatible("allwinner,sun7i-a20") &&
|
||||
!of_machine_is_compatible("olimex,a64-olinuxino-2ge8g"))
|
||||
mmc->caps |= MMC_CAP_1_8V_DDR | MMC_CAP_3_3V_DDR;
|
||||
@@ -0,0 +1,23 @@
|
||||
From cfafb3f609842d63de13ccaa356b3861ac52c603 Mon Sep 17 00:00:00 2001
|
||||
From: Ukhellfire <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 07:10:57 +0000
|
||||
Subject: [PATCH] Fix H6 emmc
|
||||
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
index 40be5ad6d..3c6e9e875 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
@@ -566,8 +566,7 @@
|
||||
};
|
||||
|
||||
mmc2: mmc@4022000 {
|
||||
- compatible = "allwinner,sun50i-h6-emmc",
|
||||
- "allwinner,sun50i-a64-emmc";
|
||||
+ compatible = "allwinner,sun50i-h6-emmc";
|
||||
reg = <0x04022000 0x1000>;
|
||||
clocks = <&ccu CLK_BUS_MMC2>, <&ccu CLK_MMC2>;
|
||||
clock-names = "ahb", "mmc";
|
||||
@@ -0,0 +1,33 @@
|
||||
From 2b25d82f81c4eda2cfed56cd98e3178ccdb7d752 Mon Sep 17 00:00:00 2001
|
||||
From: afaulkner420 <afaulkner420@gmail.com>
|
||||
Date: Fri, 25 Mar 2022 23:26:02 +0000
|
||||
Subject: [PATCH] add uwe-bsp to OPi3-LTS dts file
|
||||
|
||||
---
|
||||
.../boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
index cc5a73026..83fa87039 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
@@ -180,6 +180,16 @@ &mmc1 {
|
||||
bus-width = <4>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
+
|
||||
+ uwe-bsp {
|
||||
+ compatible = "unisoc,uwe_bsp";
|
||||
+ keep-power-on;
|
||||
+ data-irq;
|
||||
+ //adma-tx;
|
||||
+ adma-rx;
|
||||
+ //blksz-512;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
|
||||
&mmc2 {
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From 409dfdd8ad3dfc0f69ca1abbfad3d955b00f6a01 Mon Sep 17 00:00:00 2001
|
||||
From: Ukhellfire <afaulkner420@gmail.com>
|
||||
Date: Fri, 1 Apr 2022 09:44:19 +0100
|
||||
Subject: [PATCH] Rollback to r_i2c
|
||||
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-orangepi-3-lts.dts | 16 +++-------------
|
||||
1 file changed, 3 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
index 83fa87039..0b07f8ca2 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
@@ -180,16 +180,6 @@
|
||||
bus-width = <4>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
-
|
||||
- uwe-bsp {
|
||||
- compatible = "unisoc,uwe_bsp";
|
||||
- keep-power-on;
|
||||
- data-irq;
|
||||
- //adma-tx;
|
||||
- adma-rx;
|
||||
- //blksz-512;
|
||||
- status = "okay";
|
||||
- };
|
||||
};
|
||||
|
||||
&mmc2 {
|
||||
@@ -218,12 +208,12 @@
|
||||
vcc-pg-supply = <®_vcc_wifi_io>;
|
||||
};
|
||||
|
||||
-&r_rsb {
|
||||
+&r_i2c {
|
||||
status = "okay";
|
||||
|
||||
- axp805: pmic@745 {
|
||||
+ axp805: pmic@36 {
|
||||
compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
- reg = <0x745>;
|
||||
+ reg = <0x36>;
|
||||
interrupt-parent = <&r_intc>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
@@ -0,0 +1,72 @@
|
||||
From 0067fd674e3a8892ed6ae1b85b0ffd6247c486e6 Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Tue, 12 Apr 2022 21:14:36 +0300
|
||||
Subject: [PATCH 2/2] Bananapro add AXP209 regulators
|
||||
|
||||
Author: Heiko Jehmlich <hje@jecons.de>
|
||||
Signed-off-by: Heiko Jehmlich <hje@jecons.de>
|
||||
---
|
||||
arch/arm/boot/dts/sun7i-a20-bananapro.dts | 50 +++++++++++++++++++++++
|
||||
1 file changed, 50 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun7i-a20-bananapro.dts b/arch/arm/boot/dts/sun7i-a20-bananapro.dts
|
||||
index 3a34fb39a..d5bc59060 100644
|
||||
--- a/arch/arm/boot/dts/sun7i-a20-bananapro.dts
|
||||
+++ b/arch/arm/boot/dts/sun7i-a20-bananapro.dts
|
||||
@@ -257,3 +257,53 @@ &usbphy {
|
||||
®_ahci_5v {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+#include "axp209.dtsi"
|
||||
+
|
||||
+&ac_power_supply {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&battery_power_supply {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+®_dcdc2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1000000>;
|
||||
+ regulator-max-microvolt = <1450000>;
|
||||
+ regulator-name = "vdd-cpu";
|
||||
+};
|
||||
+
|
||||
+®_dcdc3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1000000>;
|
||||
+ regulator-max-microvolt = <1400000>;
|
||||
+ regulator-name = "vdd-int-dll";
|
||||
+};
|
||||
+
|
||||
+®_ldo1 {
|
||||
+ regulator-name = "vdd-rtc";
|
||||
+};
|
||||
+
|
||||
+®_ldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "avcc";
|
||||
+};
|
||||
+
|
||||
+®_ldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-name = "vddio-csi0";
|
||||
+ regulator-ramp-delay = <1600>;
|
||||
+};
|
||||
+
|
||||
+®_ldo4 {
|
||||
+ regulator-always-on; /* required for SATA */
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-name = "vddio-csi1";
|
||||
+};
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
From c241059400999c4e87fba5fc2463148da6b81369 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 02:24:26 +0200
|
||||
Subject: [PATCH 527/544] ARM: dts: sun8i-h3-orange-pi-one: Enable all gpio
|
||||
header UARTs
|
||||
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h3-orangepi-one.dts | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
|
||||
index 96d2d5498c64..50479e716eae 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
|
||||
@@ -54,6 +54,9 @@ / {
|
||||
aliases {
|
||||
ethernet0 = &emac;
|
||||
serial0 = &uart0;
|
||||
+ serial1 = &uart1;
|
||||
+ serial2 = &uart2;
|
||||
+ serial3 = &uart3;
|
||||
};
|
||||
|
||||
chosen {
|
||||
@@ -183,19 +186,19 @@ &uart0 {
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
- status = "disabled";
|
||||
+ status = "okay";
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
- status = "disabled";
|
||||
+ status = "okay";
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart3_pins>;
|
||||
- status = "disabled";
|
||||
+ status = "okay";
|
||||
};
|
||||
|
||||
&usb_otg {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,335 @@
|
||||
From 2b3cdea804198e5fa046b4c297a67802b0176f7e Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sat, 29 Jan 2022 17:00:39 -0600
|
||||
Subject: [PATCH 538/544] Input: pinephone-keyboard - Add PinePhone keyboard
|
||||
driver
|
||||
|
||||
The official Pine64 PinePhone keyboard case contains a matrix keypad and
|
||||
a MCU which runs a libre firmware. Add support for its I2C interface.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
---
|
||||
MAINTAINERS | 6 +
|
||||
drivers/input/keyboard/Kconfig | 10 +
|
||||
drivers/input/keyboard/Makefile | 1 +
|
||||
drivers/input/keyboard/pinephone-keyboard.c | 258 ++++++++++++++++++++
|
||||
4 files changed, 275 insertions(+)
|
||||
create mode 100644 drivers/input/keyboard/pinephone-keyboard.c
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 9ffa1d9d14c4..2ab8f19c86f2 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -15358,6 +15358,12 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml
|
||||
F: drivers/iio/chemical/pms7003.c
|
||||
|
||||
+PINE64 PINEPHONE KEYBOARD DRIVER
|
||||
+M: Samuel Holland <samuel@sholland.org>
|
||||
+S: Supported
|
||||
+F: Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
|
||||
+F: drivers/input/keyboard/pinephone-keyboard.c
|
||||
+
|
||||
PLDMFW LIBRARY
|
||||
M: Jacob Keller <jacob.e.keller@intel.com>
|
||||
S: Maintained
|
||||
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
|
||||
index 9417ee0b1eff..dae8b65163d2 100644
|
||||
--- a/drivers/input/keyboard/Kconfig
|
||||
+++ b/drivers/input/keyboard/Kconfig
|
||||
@@ -523,6 +523,16 @@ config KEYBOARD_OPENCORES
|
||||
To compile this driver as a module, choose M here; the
|
||||
module will be called opencores-kbd.
|
||||
|
||||
+config KEYBOARD_PINEPHONE
|
||||
+ tristate "Pine64 PinePhone Keyboard"
|
||||
+ depends on I2C
|
||||
+ select CRC8
|
||||
+ select INPUT_MATRIXKMAP
|
||||
+ help
|
||||
+ Say Y here to enable support for the keyboard in the Pine64 PinePhone
|
||||
+ keyboard case. This driver supports the FLOSS firmware available at
|
||||
+ https://megous.com/git/pinephone-keyboard/
|
||||
+
|
||||
config KEYBOARD_PXA27x
|
||||
tristate "PXA27x/PXA3xx keypad support"
|
||||
depends on PXA27x || PXA3xx || ARCH_MMP
|
||||
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
|
||||
index e3c8648f834e..84da37e3a2f5 100644
|
||||
--- a/drivers/input/keyboard/Makefile
|
||||
+++ b/drivers/input/keyboard/Makefile
|
||||
@@ -51,6 +51,7 @@ obj-$(CONFIG_KEYBOARD_NSPIRE) += nspire-keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_OMAP4) += omap4-keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_OPENCORES) += opencores-kbd.o
|
||||
+obj-$(CONFIG_KEYBOARD_PINEPHONE) += pinephone-keyboard.o
|
||||
obj-$(CONFIG_KEYBOARD_PMIC8XXX) += pmic8xxx-keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_PXA930_ROTARY) += pxa930_rotary.o
|
||||
diff --git a/drivers/input/keyboard/pinephone-keyboard.c b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
new file mode 100644
|
||||
index 000000000000..9a071753fd91
|
||||
--- /dev/null
|
||||
+++ b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
@@ -0,0 +1,258 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+//
|
||||
+// Copyright (C) 2021-2022 Samuel Holland <samuel@sholland.org>
|
||||
+
|
||||
+#include <linux/crc8.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/input/matrix_keypad.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#define DRV_NAME "pinephone-keyboard"
|
||||
+
|
||||
+#define PPKB_CRC8_POLYNOMIAL 0x07
|
||||
+
|
||||
+#define PPKB_DEVICE_ID_HI 0x00
|
||||
+#define PPKB_DEVICE_ID_HI_VALUE 0x4b
|
||||
+#define PPKB_DEVICE_ID_LO 0x01
|
||||
+#define PPKB_DEVICE_ID_LO_VALUE 0x42
|
||||
+#define PPKB_FW_REVISION 0x02
|
||||
+#define PPKB_FW_FEATURES 0x03
|
||||
+#define PPKB_MATRIX_SIZE 0x06
|
||||
+#define PPKB_SCAN_CRC 0x07
|
||||
+#define PPKB_SCAN_DATA 0x08
|
||||
+#define PPKB_SYS_CONFIG 0x20
|
||||
+#define PPKB_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
+
|
||||
+struct pinephone_keyboard {
|
||||
+ struct input_dev *input;
|
||||
+ unsigned short *fn_keymap;
|
||||
+ u8 crc_table[CRC8_TABLE_SIZE];
|
||||
+ u8 row_shift;
|
||||
+ u8 rows;
|
||||
+ u8 cols;
|
||||
+ u8 fn_state;
|
||||
+ u8 buf_swap;
|
||||
+ u8 buf[];
|
||||
+};
|
||||
+
|
||||
+static int ppkb_set_scan(struct i2c_client *client, bool enable)
|
||||
+{
|
||||
+ struct device *dev = &client->dev;
|
||||
+ int ret, val;
|
||||
+
|
||||
+ ret = i2c_smbus_read_byte_data(client, PPKB_SYS_CONFIG);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "Failed to read config: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (enable)
|
||||
+ val = ret & ~PPKB_SYS_CONFIG_DISABLE_SCAN;
|
||||
+ else
|
||||
+ val = ret | PPKB_SYS_CONFIG_DISABLE_SCAN;
|
||||
+ ret = i2c_smbus_write_byte_data(client, PPKB_SYS_CONFIG, val);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "Failed to write config: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ppkb_update(struct i2c_client *client)
|
||||
+{
|
||||
+ struct pinephone_keyboard *ppkb = i2c_get_clientdata(client);
|
||||
+ struct device *dev = &client->dev;
|
||||
+ size_t buf_len = ppkb->cols + 1;
|
||||
+ u8 *old_buf = ppkb->buf;
|
||||
+ u8 *new_buf = ppkb->buf;
|
||||
+ unsigned short *keymap;
|
||||
+ int col, crc, ret, row;
|
||||
+
|
||||
+ if (ppkb->buf_swap)
|
||||
+ old_buf += buf_len;
|
||||
+ else
|
||||
+ new_buf += buf_len;
|
||||
+
|
||||
+ ret = i2c_smbus_read_i2c_block_data(client, PPKB_SCAN_CRC,
|
||||
+ buf_len, new_buf);
|
||||
+ if (ret != buf_len) {
|
||||
+ dev_err(dev, "Failed to read scan data: %d\n", ret);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ crc = crc8(ppkb->crc_table, new_buf + 1, ppkb->cols, CRC8_INIT_VALUE);
|
||||
+ if (crc != new_buf[0]) {
|
||||
+ dev_err(dev, "Bad scan data (%02x != %02x)\n", crc, new_buf[0]);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ ppkb->buf_swap = !ppkb->buf_swap;
|
||||
+
|
||||
+ keymap = ppkb->fn_state ? ppkb->fn_keymap : ppkb->input->keycode;
|
||||
+ for (col = 0; col < ppkb->cols; ++col) {
|
||||
+ u8 old = *(++old_buf);
|
||||
+ u8 new = *(++new_buf);
|
||||
+ u8 changed = old ^ new;
|
||||
+
|
||||
+ for (row = 0; row < ppkb->rows; ++row) {
|
||||
+ int code = MATRIX_SCAN_CODE(row, col, ppkb->row_shift);
|
||||
+ int value = new & BIT(row);
|
||||
+
|
||||
+ if (!(changed & BIT(row)))
|
||||
+ continue;
|
||||
+
|
||||
+ dev_dbg(dev, "row %u col %u %sed\n",
|
||||
+ row, col, value ? "press" : "releas");
|
||||
+ if (keymap[code] == KEY_FN) {
|
||||
+ dev_dbg(dev, "FN is now %sed\n",
|
||||
+ value ? "press" : "releas");
|
||||
+ keymap = value ? ppkb->fn_keymap
|
||||
+ : ppkb->input->keycode;
|
||||
+ ppkb->fn_state = value;
|
||||
+ }
|
||||
+ input_event(ppkb->input, EV_MSC, MSC_SCAN, code);
|
||||
+ input_report_key(ppkb->input, keymap[code], value);
|
||||
+ }
|
||||
+ }
|
||||
+ input_sync(ppkb->input);
|
||||
+}
|
||||
+
|
||||
+static int ppkb_open(struct input_dev *input)
|
||||
+{
|
||||
+ struct i2c_client *client = input_get_drvdata(input);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ppkb_set_scan(client, true);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ppkb_update(client);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ppkb_close(struct input_dev *input)
|
||||
+{
|
||||
+ struct i2c_client *client = input_get_drvdata(input);
|
||||
+
|
||||
+ ppkb_set_scan(client, false);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t ppkb_irq_thread(int irq, void *data)
|
||||
+{
|
||||
+ struct i2c_client *client = data;
|
||||
+
|
||||
+ ppkb_update(client);
|
||||
+
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static int ppkb_probe(struct i2c_client *client)
|
||||
+{
|
||||
+ struct device *dev = &client->dev;
|
||||
+ unsigned int phys_rows, phys_cols;
|
||||
+ unsigned int map_rows, map_cols;
|
||||
+ struct pinephone_keyboard *ppkb;
|
||||
+ u8 info[PPKB_MATRIX_SIZE + 1];
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info);
|
||||
+ if (ret != sizeof(info))
|
||||
+ return dev_err_probe(dev, ret, "Failed to read device ID\n");
|
||||
+
|
||||
+ if (info[PPKB_DEVICE_ID_HI] != PPKB_DEVICE_ID_HI_VALUE ||
|
||||
+ info[PPKB_DEVICE_ID_LO] != PPKB_DEVICE_ID_LO_VALUE)
|
||||
+ return dev_err_probe(dev, -ENODEV, "Unexpected device ID\n");
|
||||
+
|
||||
+ dev_info(dev, "Found keyboard firmware version %d.%d features %#x\n",
|
||||
+ info[PPKB_FW_REVISION] >> 4,
|
||||
+ info[PPKB_FW_REVISION] & 0xf,
|
||||
+ info[PPKB_FW_FEATURES]);
|
||||
+
|
||||
+ /* Disable scan by default to save power. */
|
||||
+ ret = ppkb_set_scan(client, false);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ phys_rows = info[PPKB_MATRIX_SIZE] & 0xf;
|
||||
+ phys_cols = info[PPKB_MATRIX_SIZE] >> 4;
|
||||
+ if (map_rows != phys_rows || map_cols != phys_cols)
|
||||
+ return dev_err_probe(dev, -EINVAL,
|
||||
+ "Keyboard size is %ux%u, but keymap is %ux%u\n",
|
||||
+ phys_rows, phys_cols, map_rows, map_cols);
|
||||
+
|
||||
+ /* Allocate two buffers, and include space for reading the CRC. */
|
||||
+ ppkb = devm_kzalloc(dev, struct_size(ppkb, buf, 2 * (phys_cols + 1)), GFP_KERNEL);
|
||||
+ if (!ppkb)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ i2c_set_clientdata(client, ppkb);
|
||||
+
|
||||
+ crc8_populate_msb(ppkb->crc_table, PPKB_CRC8_POLYNOMIAL);
|
||||
+ ppkb->row_shift = get_count_order(map_cols);
|
||||
+ ppkb->rows = map_rows;
|
||||
+ ppkb->cols = map_cols;
|
||||
+
|
||||
+ ppkb->input = devm_input_allocate_device(dev);
|
||||
+ if (!ppkb->input)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ input_set_drvdata(ppkb->input, client);
|
||||
+
|
||||
+ ppkb->input->name = "PinePhone Keyboard";
|
||||
+ ppkb->input->phys = DRV_NAME "/input0";
|
||||
+ ppkb->input->id.bustype = BUS_I2C;
|
||||
+ ppkb->input->open = ppkb_open;
|
||||
+ ppkb->input->close = ppkb_close;
|
||||
+
|
||||
+ __set_bit(EV_MSC, ppkb->input->evbit);
|
||||
+ __set_bit(EV_REP, ppkb->input->evbit);
|
||||
+
|
||||
+ ret = matrix_keypad_build_keymap(NULL, "linux,fn-keymap",
|
||||
+ map_rows, map_cols, NULL, ppkb->input);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Failed to build FN keymap\n");
|
||||
+
|
||||
+ ppkb->fn_keymap = ppkb->input->keycode;
|
||||
+
|
||||
+ ret = matrix_keypad_build_keymap(NULL, "linux,keymap",
|
||||
+ map_rows, map_cols, NULL, ppkb->input);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Failed to build keymap\n");
|
||||
+
|
||||
+ ret = input_register_device(ppkb->input);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Failed to register input\n");
|
||||
+
|
||||
+ ret = devm_request_threaded_irq(dev, client->irq, NULL, ppkb_irq_thread,
|
||||
+ IRQF_ONESHOT, client->name, client);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Failed to request IRQ\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ppkb_of_match[] = {
|
||||
+ { .compatible = "pine64,pinephone-keyboard" },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ppkb_of_match);
|
||||
+
|
||||
+static struct i2c_driver ppkb_driver = {
|
||||
+ .probe_new = ppkb_probe,
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .of_match_table = ppkb_of_match,
|
||||
+ },
|
||||
+};
|
||||
+module_i2c_driver(ppkb_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Samuel Holland <samuel@sholland.org>");
|
||||
+MODULE_DESCRIPTION("Pine64 PinePhone keyboard driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
From 0b25e25bf9183a5bc16206160ce1d214f51695ee Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sat, 29 Jan 2022 17:00:40 -0600
|
||||
Subject: [PATCH 539/544] Input: pinephone-keyboard - Build in the default
|
||||
keymap
|
||||
|
||||
The PinePhone keyboard comes with removable keys, but there is a default
|
||||
layout labeled from the factory. Use this keymap if none is provided in
|
||||
the devicetree.
|
||||
|
||||
Suggested-by: Ondrej Jirman <x@xff.cz>
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
---
|
||||
drivers/input/keyboard/pinephone-keyboard.c | 128 +++++++++++++++++++-
|
||||
1 file changed, 123 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/pinephone-keyboard.c b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
index 9a071753fd91..8065bc3e101a 100644
|
||||
--- a/drivers/input/keyboard/pinephone-keyboard.c
|
||||
+++ b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
@@ -24,6 +24,113 @@
|
||||
#define PPKB_SYS_CONFIG 0x20
|
||||
#define PPKB_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
|
||||
+#define PPKB_DEFAULT_KEYMAP_ROWS 6
|
||||
+#define PPKB_DEFAULT_KEYMAP_COLS 12
|
||||
+
|
||||
+static const uint32_t ppkb_default_fn_keymap[] = {
|
||||
+ KEY(0, 0, KEY_FN_ESC),
|
||||
+ KEY(0, 1, KEY_F1),
|
||||
+ KEY(0, 2, KEY_F2),
|
||||
+ KEY(0, 3, KEY_F3),
|
||||
+ KEY(0, 4, KEY_F4),
|
||||
+ KEY(0, 5, KEY_F5),
|
||||
+ KEY(0, 6, KEY_F6),
|
||||
+ KEY(0, 7, KEY_F7),
|
||||
+ KEY(0, 8, KEY_F8),
|
||||
+ KEY(0, 9, KEY_F9),
|
||||
+ KEY(0, 10, KEY_F10),
|
||||
+ KEY(0, 11, KEY_DELETE),
|
||||
+
|
||||
+ KEY(2, 0, KEY_SYSRQ),
|
||||
+ KEY(2, 10, KEY_INSERT),
|
||||
+
|
||||
+ KEY(3, 0, KEY_LEFTSHIFT),
|
||||
+ KEY(3, 8, KEY_HOME),
|
||||
+ KEY(3, 9, KEY_UP),
|
||||
+ KEY(3, 10, KEY_END),
|
||||
+
|
||||
+ KEY(4, 1, KEY_LEFTCTRL),
|
||||
+ KEY(4, 6, KEY_LEFT),
|
||||
+ KEY(4, 8, KEY_RIGHT),
|
||||
+ KEY(4, 9, KEY_DOWN),
|
||||
+
|
||||
+ KEY(5, 2, KEY_FN),
|
||||
+ KEY(5, 3, KEY_LEFTALT),
|
||||
+ KEY(5, 5, KEY_RIGHTALT),
|
||||
+};
|
||||
+
|
||||
+static const struct matrix_keymap_data ppkb_default_fn_keymap_data = {
|
||||
+ .keymap = ppkb_default_fn_keymap,
|
||||
+ .keymap_size = ARRAY_SIZE(ppkb_default_fn_keymap),
|
||||
+};
|
||||
+
|
||||
+static const uint32_t ppkb_default_keymap[] = {
|
||||
+ KEY(0, 0, KEY_ESC),
|
||||
+ KEY(0, 1, KEY_1),
|
||||
+ KEY(0, 2, KEY_2),
|
||||
+ KEY(0, 3, KEY_3),
|
||||
+ KEY(0, 4, KEY_4),
|
||||
+ KEY(0, 5, KEY_5),
|
||||
+ KEY(0, 6, KEY_6),
|
||||
+ KEY(0, 7, KEY_7),
|
||||
+ KEY(0, 8, KEY_8),
|
||||
+ KEY(0, 9, KEY_9),
|
||||
+ KEY(0, 10, KEY_0),
|
||||
+ KEY(0, 11, KEY_BACKSPACE),
|
||||
+
|
||||
+ KEY(1, 0, KEY_TAB),
|
||||
+ KEY(1, 1, KEY_Q),
|
||||
+ KEY(1, 2, KEY_W),
|
||||
+ KEY(1, 3, KEY_E),
|
||||
+ KEY(1, 4, KEY_R),
|
||||
+ KEY(1, 5, KEY_T),
|
||||
+ KEY(1, 6, KEY_Y),
|
||||
+ KEY(1, 7, KEY_U),
|
||||
+ KEY(1, 8, KEY_I),
|
||||
+ KEY(1, 9, KEY_O),
|
||||
+ KEY(1, 10, KEY_P),
|
||||
+ KEY(1, 11, KEY_ENTER),
|
||||
+
|
||||
+ KEY(2, 0, KEY_LEFTMETA),
|
||||
+ KEY(2, 1, KEY_A),
|
||||
+ KEY(2, 2, KEY_S),
|
||||
+ KEY(2, 3, KEY_D),
|
||||
+ KEY(2, 4, KEY_F),
|
||||
+ KEY(2, 5, KEY_G),
|
||||
+ KEY(2, 6, KEY_H),
|
||||
+ KEY(2, 7, KEY_J),
|
||||
+ KEY(2, 8, KEY_K),
|
||||
+ KEY(2, 9, KEY_L),
|
||||
+ KEY(2, 10, KEY_SEMICOLON),
|
||||
+
|
||||
+ KEY(3, 0, KEY_LEFTSHIFT),
|
||||
+ KEY(3, 1, KEY_Z),
|
||||
+ KEY(3, 2, KEY_X),
|
||||
+ KEY(3, 3, KEY_C),
|
||||
+ KEY(3, 4, KEY_V),
|
||||
+ KEY(3, 5, KEY_B),
|
||||
+ KEY(3, 6, KEY_N),
|
||||
+ KEY(3, 7, KEY_M),
|
||||
+ KEY(3, 8, KEY_COMMA),
|
||||
+ KEY(3, 9, KEY_DOT),
|
||||
+ KEY(3, 10, KEY_SLASH),
|
||||
+
|
||||
+ KEY(4, 1, KEY_LEFTCTRL),
|
||||
+ KEY(4, 4, KEY_SPACE),
|
||||
+ KEY(4, 6, KEY_APOSTROPHE),
|
||||
+ KEY(4, 8, KEY_RIGHTBRACE),
|
||||
+ KEY(4, 9, KEY_LEFTBRACE),
|
||||
+
|
||||
+ KEY(5, 2, KEY_FN),
|
||||
+ KEY(5, 3, KEY_LEFTALT),
|
||||
+ KEY(5, 5, KEY_RIGHTALT),
|
||||
+};
|
||||
+
|
||||
+static const struct matrix_keymap_data ppkb_default_keymap_data = {
|
||||
+ .keymap = ppkb_default_keymap,
|
||||
+ .keymap_size = ARRAY_SIZE(ppkb_default_keymap),
|
||||
+};
|
||||
+
|
||||
struct pinephone_keyboard {
|
||||
struct input_dev *input;
|
||||
unsigned short *fn_keymap;
|
||||
@@ -151,6 +258,8 @@ static irqreturn_t ppkb_irq_thread(int irq, void *data)
|
||||
|
||||
static int ppkb_probe(struct i2c_client *client)
|
||||
{
|
||||
+ const struct matrix_keymap_data *fn_keymap_data = &ppkb_default_fn_keymap_data;
|
||||
+ const struct matrix_keymap_data *keymap_data = &ppkb_default_keymap_data;
|
||||
struct device *dev = &client->dev;
|
||||
unsigned int phys_rows, phys_cols;
|
||||
unsigned int map_rows, map_cols;
|
||||
@@ -176,9 +285,18 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
+ /* Allow the devicetree to override the default keymaps. */
|
||||
+ if (of_property_read_bool(dev->of_node, "linux,fn-keymap") ||
|
||||
+ of_property_read_bool(dev->of_node, "linux,keymap")) {
|
||||
+ ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ fn_keymap_data = keymap_data = NULL;
|
||||
+ } else {
|
||||
+ map_rows = PPKB_DEFAULT_KEYMAP_ROWS;
|
||||
+ map_cols = PPKB_DEFAULT_KEYMAP_COLS;
|
||||
+ }
|
||||
|
||||
phys_rows = info[PPKB_MATRIX_SIZE] & 0xf;
|
||||
phys_cols = info[PPKB_MATRIX_SIZE] >> 4;
|
||||
@@ -214,14 +332,14 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
__set_bit(EV_MSC, ppkb->input->evbit);
|
||||
__set_bit(EV_REP, ppkb->input->evbit);
|
||||
|
||||
- ret = matrix_keypad_build_keymap(NULL, "linux,fn-keymap",
|
||||
+ ret = matrix_keypad_build_keymap(fn_keymap_data, "linux,fn-keymap",
|
||||
map_rows, map_cols, NULL, ppkb->input);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to build FN keymap\n");
|
||||
|
||||
ppkb->fn_keymap = ppkb->input->keycode;
|
||||
|
||||
- ret = matrix_keypad_build_keymap(NULL, "linux,keymap",
|
||||
+ ret = matrix_keypad_build_keymap(keymap_data, "linux,keymap",
|
||||
map_rows, map_cols, NULL, ppkb->input);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to build keymap\n");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
From 1e4f5fc83ed0f86cebf39fb20bcaa77ab4224ef9 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sat, 29 Jan 2022 17:00:41 -0600
|
||||
Subject: [PATCH 540/544] Input: pinephone-keyboard - Support the proxied I2C
|
||||
bus
|
||||
|
||||
The PinePhone keyboard case contains a battery managed by an integrated
|
||||
power bank IC. The power bank IC communicates over I2C, and the keyboard
|
||||
MCU firmware provides an interface to read and write its registers.
|
||||
Let's use this interface to implement a SMBus adapter, so we can reuse
|
||||
the driver for the power bank IC.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
---
|
||||
drivers/input/keyboard/pinephone-keyboard.c | 73 +++++++++++++++++++++
|
||||
1 file changed, 73 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/keyboard/pinephone-keyboard.c b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
index 8065bc3e101a..7d2e16e588a0 100644
|
||||
--- a/drivers/input/keyboard/pinephone-keyboard.c
|
||||
+++ b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
@@ -3,6 +3,7 @@
|
||||
// Copyright (C) 2021-2022 Samuel Holland <samuel@sholland.org>
|
||||
|
||||
#include <linux/crc8.h>
|
||||
+#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/interrupt.h>
|
||||
@@ -23,6 +24,11 @@
|
||||
#define PPKB_SCAN_DATA 0x08
|
||||
#define PPKB_SYS_CONFIG 0x20
|
||||
#define PPKB_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
+#define PPKB_SYS_SMBUS_COMMAND 0x21
|
||||
+#define PPKB_SYS_SMBUS_DATA 0x22
|
||||
+#define PPKB_SYS_COMMAND 0x23
|
||||
+#define PPKB_SYS_COMMAND_SMBUS_READ 0x91
|
||||
+#define PPKB_SYS_COMMAND_SMBUS_WRITE 0xa1
|
||||
|
||||
#define PPKB_DEFAULT_KEYMAP_ROWS 6
|
||||
#define PPKB_DEFAULT_KEYMAP_COLS 12
|
||||
@@ -132,6 +138,7 @@ static const struct matrix_keymap_data ppkb_default_keymap_data = {
|
||||
};
|
||||
|
||||
struct pinephone_keyboard {
|
||||
+ struct i2c_adapter adapter;
|
||||
struct input_dev *input;
|
||||
unsigned short *fn_keymap;
|
||||
u8 crc_table[CRC8_TABLE_SIZE];
|
||||
@@ -143,6 +150,57 @@ struct pinephone_keyboard {
|
||||
u8 buf[];
|
||||
};
|
||||
|
||||
+static int ppkb_adap_smbus_xfer(struct i2c_adapter *adap, u16 addr,
|
||||
+ unsigned short flags, char read_write,
|
||||
+ u8 command, int size,
|
||||
+ union i2c_smbus_data *data)
|
||||
+{
|
||||
+ struct i2c_client *client = adap->algo_data;
|
||||
+ u8 buf[3];
|
||||
+ int ret;
|
||||
+
|
||||
+ buf[0] = command;
|
||||
+ buf[1] = data->byte;
|
||||
+ buf[2] = read_write == I2C_SMBUS_READ ? PPKB_SYS_COMMAND_SMBUS_READ
|
||||
+ : PPKB_SYS_COMMAND_SMBUS_WRITE;
|
||||
+
|
||||
+ ret = i2c_smbus_write_i2c_block_data(client, PPKB_SYS_SMBUS_COMMAND,
|
||||
+ sizeof(buf), buf);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Read back the command status until it passes or fails. */
|
||||
+ do {
|
||||
+ usleep_range(300, 500);
|
||||
+ ret = i2c_smbus_read_byte_data(client, PPKB_SYS_COMMAND);
|
||||
+ } while (ret == buf[2]);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ /* Commands return 0x00 on success and 0xff on failure. */
|
||||
+ if (ret)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ if (read_write == I2C_SMBUS_READ) {
|
||||
+ ret = i2c_smbus_read_byte_data(client, PPKB_SYS_SMBUS_DATA);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ data->byte = ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static u32 ppkg_adap_functionality(struct i2c_adapter *adap)
|
||||
+{
|
||||
+ return I2C_FUNC_SMBUS_BYTE_DATA;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_algorithm ppkb_adap_algo = {
|
||||
+ .smbus_xfer = ppkb_adap_smbus_xfer,
|
||||
+ .functionality = ppkg_adap_functionality,
|
||||
+};
|
||||
+
|
||||
static int ppkb_set_scan(struct i2c_client *client, bool enable)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
@@ -265,6 +323,7 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
unsigned int map_rows, map_cols;
|
||||
struct pinephone_keyboard *ppkb;
|
||||
u8 info[PPKB_MATRIX_SIZE + 1];
|
||||
+ struct device_node *i2c_bus;
|
||||
int ret;
|
||||
|
||||
ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info);
|
||||
@@ -312,6 +371,20 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
|
||||
i2c_set_clientdata(client, ppkb);
|
||||
|
||||
+ i2c_bus = of_get_child_by_name(dev->of_node, "i2c-bus");
|
||||
+ if (i2c_bus) {
|
||||
+ ppkb->adapter.owner = THIS_MODULE;
|
||||
+ ppkb->adapter.algo = &ppkb_adap_algo;
|
||||
+ ppkb->adapter.algo_data = client;
|
||||
+ ppkb->adapter.dev.parent = dev;
|
||||
+ ppkb->adapter.dev.of_node = i2c_bus;
|
||||
+ strscpy(ppkb->adapter.name, DRV_NAME, sizeof(ppkb->adapter.name));
|
||||
+
|
||||
+ ret = devm_i2c_add_adapter(dev, &ppkb->adapter);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Failed to add I2C adapter\n");
|
||||
+ }
|
||||
+
|
||||
crc8_populate_msb(ppkb->crc_table, PPKB_CRC8_POLYNOMIAL);
|
||||
ppkb->row_shift = get_count_order(map_cols);
|
||||
ppkb->rows = map_rows;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,307 @@
|
||||
From 22a8390dc841fe018b80a2876dd0903b12fc025b Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:26 +0200
|
||||
Subject: [PATCH 536/544] Revert "input: kb151: Add a driver for the KB151
|
||||
keyboard"
|
||||
|
||||
This reverts commit 77ad03baa78fcee1364155c2bb3f63c4266bb845.
|
||||
---
|
||||
drivers/input/keyboard/Kconfig | 10 --
|
||||
drivers/input/keyboard/Makefile | 1 -
|
||||
drivers/input/keyboard/kb151.c | 251 --------------------------------
|
||||
3 files changed, 262 deletions(-)
|
||||
delete mode 100644 drivers/input/keyboard/kb151.c
|
||||
|
||||
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
|
||||
index a38d3b707f98..9417ee0b1eff 100644
|
||||
--- a/drivers/input/keyboard/Kconfig
|
||||
+++ b/drivers/input/keyboard/Kconfig
|
||||
@@ -353,16 +353,6 @@ config KEYBOARD_HP7XX
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called jornada720_kbd.
|
||||
|
||||
-config KEYBOARD_KB151
|
||||
- tristate "Pine64 KB151 Keyboard"
|
||||
- depends on I2C
|
||||
- select CRC8
|
||||
- select INPUT_MATRIXKMAP
|
||||
- help
|
||||
- Say Y here to enable support for the KB151 keyboard used in the
|
||||
- Pine64 PinePhone keyboard case. This driver supports the FLOSS
|
||||
- firmware available at https://megous.com/git/pinephone-keyboard/
|
||||
-
|
||||
config KEYBOARD_LM8323
|
||||
tristate "LM8323 keypad chip"
|
||||
depends on I2C
|
||||
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
|
||||
index 1a7010f5d676..e3c8648f834e 100644
|
||||
--- a/drivers/input/keyboard/Makefile
|
||||
+++ b/drivers/input/keyboard/Makefile
|
||||
@@ -34,7 +34,6 @@ obj-$(CONFIG_KEYBOARD_IMX) += imx_keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_IMX_SC_KEY) += imx_sc_key.o
|
||||
obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o
|
||||
obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o
|
||||
-obj-$(CONFIG_KEYBOARD_KB151) += kb151.o
|
||||
obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o
|
||||
obj-$(CONFIG_KEYBOARD_LM8323) += lm8323.o
|
||||
obj-$(CONFIG_KEYBOARD_LM8333) += lm8333.o
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
deleted file mode 100644
|
||||
index bb6250efe934..000000000000
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ /dev/null
|
||||
@@ -1,251 +0,0 @@
|
||||
-// SPDX-License-Identifier: GPL-2.0-only
|
||||
-//
|
||||
-// Copyright (C) 2021 Samuel Holland <samuel@sholland.org>
|
||||
-
|
||||
-#include <linux/crc8.h>
|
||||
-#include <linux/i2c.h>
|
||||
-#include <linux/input/matrix_keypad.h>
|
||||
-#include <linux/interrupt.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/pm_wakeirq.h>
|
||||
-
|
||||
-#define KB151_CRC8_POLYNOMIAL 0x07
|
||||
-
|
||||
-#define KB151_DEVICE_ID_HI 0x00
|
||||
-#define KB151_DEVICE_ID_HI_VALUE 0x4b
|
||||
-#define KB151_DEVICE_ID_LO 0x01
|
||||
-#define KB151_DEVICE_ID_LO_VALUE 0x42
|
||||
-#define KB151_FW_REVISION 0x02
|
||||
-#define KB151_FW_FEATURES 0x03
|
||||
-#define KB151_MATRIX_SIZE 0x06
|
||||
-#define KB151_SCAN_CRC 0x07
|
||||
-#define KB151_SCAN_DATA 0x08
|
||||
-#define KB151_SYS_CONFIG 0x20
|
||||
-#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
-
|
||||
-struct kb151 {
|
||||
- struct input_dev *input;
|
||||
- u8 crc_table[CRC8_TABLE_SIZE];
|
||||
- u8 row_shift;
|
||||
- u8 rows;
|
||||
- u8 cols;
|
||||
- u8 fn_state;
|
||||
- u8 buf_swap;
|
||||
- u8 buf[];
|
||||
-};
|
||||
-
|
||||
-static void kb151_update(struct i2c_client *client)
|
||||
-{
|
||||
- struct kb151 *kb151 = i2c_get_clientdata(client);
|
||||
- unsigned short *keymap = kb151->input->keycode;
|
||||
- struct device *dev = &client->dev;
|
||||
- size_t buf_len = kb151->cols + 1;
|
||||
- u8 *old_buf = kb151->buf;
|
||||
- u8 *new_buf = kb151->buf;
|
||||
- int col, crc, ret, row;
|
||||
-
|
||||
- if (kb151->buf_swap)
|
||||
- old_buf += buf_len;
|
||||
- else
|
||||
- new_buf += buf_len;
|
||||
-
|
||||
- ret = i2c_smbus_read_i2c_block_data(client, KB151_SCAN_CRC,
|
||||
- buf_len, new_buf);
|
||||
- if (ret != buf_len) {
|
||||
- dev_err(dev, "Failed to read scan data: %d\n", ret);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- dev_dbg(dev, "%02x | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
|
||||
- new_buf[0], new_buf[1], new_buf[2], new_buf[3], new_buf[4], new_buf[5],
|
||||
- new_buf[6], new_buf[7], new_buf[8], new_buf[9], new_buf[10], new_buf[11],
|
||||
- new_buf[12]);
|
||||
- crc = crc8(kb151->crc_table, new_buf + 1, kb151->cols, CRC8_INIT_VALUE);
|
||||
- if (crc != new_buf[0]) {
|
||||
- dev_err(dev, "Bad scan data (%02x != %02x)\n",
|
||||
- crc, new_buf[0]);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- for (col = 0; col < kb151->cols; ++col) {
|
||||
- u8 old = *(++old_buf);
|
||||
- u8 new = *(++new_buf);
|
||||
- u8 changed = old ^ new;
|
||||
-
|
||||
- for (row = 0; row < kb151->rows; ++row) {
|
||||
- u8 pressed = new & BIT(row);
|
||||
- u8 map_row = row + (kb151->fn_state ? kb151->rows : 0);
|
||||
- int code = MATRIX_SCAN_CODE(map_row, col, kb151->row_shift);
|
||||
-
|
||||
- if (!(changed & BIT(row)))
|
||||
- continue;
|
||||
-
|
||||
- dev_dbg(&client->dev, "row %u col %u %sed\n",
|
||||
- map_row, col, pressed ? "press" : "releas");
|
||||
- if (keymap[code] == KEY_FN) {
|
||||
- dev_dbg(&client->dev, "FN is now %s\n",
|
||||
- pressed ? "pressed" : "released");
|
||||
- kb151->fn_state = pressed;
|
||||
- } else
|
||||
- input_report_key(kb151->input, keymap[code], pressed);
|
||||
- }
|
||||
- }
|
||||
- input_sync(kb151->input);
|
||||
-
|
||||
- kb151->buf_swap = !kb151->buf_swap;
|
||||
-}
|
||||
-
|
||||
-static int kb151_open(struct input_dev *input)
|
||||
-{
|
||||
- struct i2c_client *client = input_get_drvdata(input);
|
||||
- struct device *dev = &client->dev;
|
||||
- int ret, val;
|
||||
-
|
||||
- ret = i2c_smbus_read_byte_data(client, KB151_SYS_CONFIG);
|
||||
- if (ret < 0) {
|
||||
- dev_err(dev, "Failed to read config: %d\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- val = ret & ~KB151_SYS_CONFIG_DISABLE_SCAN;
|
||||
- ret = i2c_smbus_write_byte_data(client, KB151_SYS_CONFIG, val);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Failed to write config: %d\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- kb151_update(client);
|
||||
-
|
||||
- enable_irq(client->irq);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void kb151_close(struct input_dev *input)
|
||||
-{
|
||||
- struct i2c_client *client = input_get_drvdata(input);
|
||||
- struct device *dev = &client->dev;
|
||||
- int ret, val;
|
||||
-
|
||||
- disable_irq(client->irq);
|
||||
-
|
||||
- ret = i2c_smbus_read_byte_data(client, KB151_SYS_CONFIG);
|
||||
- if (ret < 0) {
|
||||
- dev_err(dev, "Failed to read config: %d\n", ret);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- val = ret | KB151_SYS_CONFIG_DISABLE_SCAN;
|
||||
- ret = i2c_smbus_write_byte_data(client, KB151_SYS_CONFIG, val);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Failed to write config: %d\n", ret);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static irqreturn_t kb151_irq_thread(int irq, void *data)
|
||||
-{
|
||||
- struct i2c_client *client = data;
|
||||
-
|
||||
- kb151_update(client);
|
||||
-
|
||||
- return IRQ_HANDLED;
|
||||
-}
|
||||
-
|
||||
-static int kb151_probe(struct i2c_client *client)
|
||||
-{
|
||||
- struct device *dev = &client->dev;
|
||||
- u8 info[KB151_MATRIX_SIZE + 1];
|
||||
- unsigned int kb_rows, kb_cols;
|
||||
- unsigned int map_rows, map_cols;
|
||||
- struct kb151 *kb151;
|
||||
- int ret;
|
||||
-
|
||||
- ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info);
|
||||
- if (ret != sizeof(info))
|
||||
- return ret;
|
||||
-
|
||||
- if (info[KB151_DEVICE_ID_HI] != KB151_DEVICE_ID_HI_VALUE ||
|
||||
- info[KB151_DEVICE_ID_LO] != KB151_DEVICE_ID_LO_VALUE)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- dev_info(dev, "Found KB151 with firmware %d.%d (features=%#x)\n",
|
||||
- info[KB151_FW_REVISION] >> 4,
|
||||
- info[KB151_FW_REVISION] & 0xf,
|
||||
- info[KB151_FW_FEATURES]);
|
||||
-
|
||||
- ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- kb_rows = info[KB151_MATRIX_SIZE] & 0xf;
|
||||
- kb_cols = info[KB151_MATRIX_SIZE] >> 4;
|
||||
- if (map_rows != 2 * kb_rows || map_cols != kb_cols) {
|
||||
- dev_err(dev, "Keyboard matrix is %ux%u, but key map is %ux%u\n",
|
||||
- kb_rows, kb_cols, map_rows, map_cols);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- /* Allocate two buffers, and include space for the CRC. */
|
||||
- kb151 = devm_kzalloc(dev, struct_size(kb151, buf, 2 * (kb_cols + 1)), GFP_KERNEL);
|
||||
- if (!kb151)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- i2c_set_clientdata(client, kb151);
|
||||
-
|
||||
- crc8_populate_msb(kb151->crc_table, KB151_CRC8_POLYNOMIAL);
|
||||
-
|
||||
- kb151->row_shift = get_count_order(kb_cols);
|
||||
- kb151->rows = kb_rows;
|
||||
- kb151->cols = kb_cols;
|
||||
-
|
||||
- kb151->input = devm_input_allocate_device(dev);
|
||||
- if (!kb151->input)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- input_set_drvdata(kb151->input, client);
|
||||
-
|
||||
- kb151->input->name = client->name;
|
||||
- kb151->input->phys = "kb151/input0";
|
||||
- kb151->input->id.bustype = BUS_I2C;
|
||||
- kb151->input->open = kb151_open;
|
||||
- kb151->input->close = kb151_close;
|
||||
-
|
||||
- __set_bit(EV_REP, kb151->input->evbit);
|
||||
-
|
||||
- ret = matrix_keypad_build_keymap(NULL, NULL, map_rows, map_cols,
|
||||
- NULL, kb151->input);
|
||||
- if (ret)
|
||||
- return dev_err_probe(dev, ret, "Failed to build keymap\n");
|
||||
-
|
||||
- ret = devm_request_threaded_irq(dev, client->irq,
|
||||
- NULL, kb151_irq_thread,
|
||||
- IRQF_ONESHOT | IRQF_NO_AUTOEN,
|
||||
- client->name, client);
|
||||
- if (ret)
|
||||
- return dev_err_probe(dev, ret, "Failed to request IRQ\n");
|
||||
-
|
||||
- ret = input_register_device(kb151->input);
|
||||
- if (ret)
|
||||
- return dev_err_probe(dev, ret, "Failed to register input\n");
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct of_device_id kb151_of_match[] = {
|
||||
- { .compatible = "pine64,kb151" },
|
||||
- { }
|
||||
-};
|
||||
-MODULE_DEVICE_TABLE(of, kb151_of_match);
|
||||
-
|
||||
-static struct i2c_driver kb151_driver = {
|
||||
- .probe_new = kb151_probe,
|
||||
- .driver = {
|
||||
- .name = "kb151",
|
||||
- .of_match_table = kb151_of_match,
|
||||
- },
|
||||
-};
|
||||
-module_i2c_driver(kb151_driver);
|
||||
-
|
||||
-MODULE_AUTHOR("Samuel Holland <samuel@sholland.org>");
|
||||
-MODULE_DESCRIPTION("Pine64 KB151 keyboard driver");
|
||||
-MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,260 @@
|
||||
From 6e92e54a55b49c94dc1d44f6fc6dc19dd30f580f Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:25 +0200
|
||||
Subject: [PATCH 534/544] Revert "input: kb151: Add support for IP5209 charger
|
||||
connected to the keyboard MCU"
|
||||
|
||||
This reverts commit fc168b44c929876c4f492b40a1c01aa57aa46352.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 206 ---------------------------------
|
||||
1 file changed, 206 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index 898a25d06ed6..41a68f0c3988 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -8,9 +8,7 @@
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
-#include <linux/regmap.h>
|
||||
#include <linux/module.h>
|
||||
-#include <linux/delay.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
|
||||
#define KB151_CRC8_POLYNOMIAL 0x07
|
||||
@@ -27,56 +25,6 @@
|
||||
#define KB151_SYS_CONFIG 0x20
|
||||
#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
|
||||
-/* imported from firmware/registers.h */
|
||||
-
|
||||
-#define REG_DEVID_K 0x00
|
||||
-#define REG_DEVID_B 0x01
|
||||
-#define REG_FW_REVISION 0x02
|
||||
-#define REG_FW_FEATURES 0x03
|
||||
-#define REG_FW_FEATURES_USB_DEBUGGER BIT(0)
|
||||
-#define REG_FW_FEATURES_FLASHING_MODE BIT(1)
|
||||
-#define REG_FW_FEATURES_SELF_TEST BIT(2)
|
||||
-#define REG_FW_FEATURES_STOCK_FW BIT(3)
|
||||
-#define REG_FW_FEATURES_I2CA BIT(4)
|
||||
-
|
||||
-#define REG_KEYMATRIX_SIZE 0x06
|
||||
-#define REG_KEYMATRIX_STATE_CRC8 0x07
|
||||
-#define REG_KEYMATRIX_STATE 0x08
|
||||
-#define REG_KEYMATRIX_STATE_END 0x13
|
||||
-
|
||||
-#define REG_SYS_CONFIG 0x20
|
||||
-#define REG_SYS_CONFIG_SCAN_BLOCK BIT(0)
|
||||
-
|
||||
-#define REG_SYS_CHG_ADDR 0x21
|
||||
-#define REG_SYS_CHG_DATA 0x22
|
||||
-
|
||||
-#define REG_SYS_COMMAND 0x23
|
||||
-#define REG_SYS_COMMAND_MCU_RESET 'r'
|
||||
-#define REG_SYS_COMMAND_USB_IAP 'i'
|
||||
-#define REG_SYS_COMMAND_SELFTEST 't'
|
||||
-#define REG_SYS_COMMAND_CHG_READ 0x91
|
||||
-#define REG_SYS_COMMAND_CHG_WRITE 0xA1
|
||||
-
|
||||
-#define REG_SYS_USER_APP_BLOCK 0x24
|
||||
-#define REG_SYS_USER_APP_BLOCK_MAGIC 0x53
|
||||
-
|
||||
-#define REG_FLASH_DATA_START 0x70
|
||||
-#define REG_FLASH_DATA_END 0xef
|
||||
-#define REG_FLASH_ADDR_L 0xf0
|
||||
-#define REG_FLASH_ADDR_H 0xf1
|
||||
-#define REG_FLASH_CRC8 0xf2
|
||||
-
|
||||
-#define REG_FLASH_UNLOCK 0xf3
|
||||
-#define REG_FLASH_UNLOCK_MAGIC 0x46
|
||||
-
|
||||
-#define REG_FLASH_CMD 0xf4
|
||||
-#define REG_FLASH_CMD_READ_ROM 0x52
|
||||
-#define REG_FLASH_CMD_WRITE_ROM 0x57
|
||||
-#define REG_FLASH_CMD_ERASE_ROM 0x45
|
||||
-#define REG_FLASH_CMD_COMMIT 0x43
|
||||
-
|
||||
-#define REG_DEBUG_LOG 0xff
|
||||
-
|
||||
/* default regmap from the factory */
|
||||
|
||||
#define DEFAULT_MAP_ROWS 12
|
||||
@@ -303,135 +251,6 @@ static irqreturn_t kb151_irq_thread(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_IP5XXX_POWER
|
||||
-
|
||||
-static int kb151_charger_regmap_read(void *context,
|
||||
- unsigned int reg, unsigned int *val)
|
||||
-{
|
||||
- struct i2c_client *client = context;
|
||||
- int ret, i;
|
||||
-
|
||||
- // initiate read of data from the charger
|
||||
- uint8_t buf[4] = { REG_SYS_CHG_ADDR, reg, 0xAA, REG_SYS_COMMAND_CHG_READ };
|
||||
- struct i2c_msg msgs[] = {
|
||||
- { client->addr, 0, 4, buf },
|
||||
- };
|
||||
-
|
||||
- ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
||||
- if (ret < 0) {
|
||||
- dev_err(&client->dev, "Charger read failed (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- for (i = 0; i < 5; i++) {
|
||||
- // read the result
|
||||
- uint8_t buf2[1] = { REG_SYS_CHG_DATA, };
|
||||
- uint8_t buf3[2] = { };
|
||||
- struct i2c_msg msgs2[] = {
|
||||
- { client->addr, 0, 1, buf2 },
|
||||
- { client->addr, I2C_M_RD, sizeof(buf3), buf3 },
|
||||
- };
|
||||
-
|
||||
- usleep_range(700, 1200);
|
||||
-
|
||||
- ret = i2c_transfer(client->adapter, msgs2, ARRAY_SIZE(msgs2));
|
||||
- if (ret < 0) {
|
||||
- dev_err(&client->dev, "Charger read failed (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- dev_dbg(&client->dev, "rd %02x %02x\n", buf3[0], buf3[1]);
|
||||
-
|
||||
- if (buf3[1] == REG_SYS_COMMAND_CHG_READ)
|
||||
- continue;
|
||||
-
|
||||
- if (buf3[1] == 0) {
|
||||
- *val = buf3[0];
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- if (buf3[1] == 0xff) {
|
||||
- dev_err(&client->dev,
|
||||
- "Charger read failed - MCU returned 0x%hhx\n",
|
||||
- buf3[1]);
|
||||
- return -EIO;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- dev_err(&client->dev, "Charger read failed - timeout (%d)\n", ret);
|
||||
- return -ETIMEDOUT;
|
||||
-}
|
||||
-
|
||||
-static int kb151_charger_regmap_write(void *context, unsigned int reg, unsigned int val)
|
||||
-{
|
||||
- struct i2c_client *client = context;
|
||||
- int ret, i;
|
||||
-
|
||||
- uint8_t buf[4] = { REG_SYS_CHG_ADDR, reg, val, REG_SYS_COMMAND_CHG_WRITE };
|
||||
- struct i2c_msg msgs[] = {
|
||||
- { client->addr, 0, 4, buf },
|
||||
- };
|
||||
-
|
||||
- dev_dbg(&client->dev, "wr 0x%02hhx: %02hhx\n", reg, val);
|
||||
-
|
||||
- ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
||||
- if (ret < 0) {
|
||||
- dev_err(&client->dev, "Charger write failed (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- for (i = 0; i < 5; i++) {
|
||||
- // read the result
|
||||
- uint8_t buf2[1] = { REG_SYS_COMMAND, };
|
||||
- uint8_t buf3[1] = { };
|
||||
- struct i2c_msg msgs2[] = {
|
||||
- { client->addr, 0, 1, buf2 },
|
||||
- { client->addr, I2C_M_RD, sizeof(buf3), buf3 },
|
||||
- };
|
||||
-
|
||||
- usleep_range(700, 1200);
|
||||
-
|
||||
- ret = i2c_transfer(client->adapter, msgs2, ARRAY_SIZE(msgs2));
|
||||
- if (ret < 0) {
|
||||
- dev_err(&client->dev, "Charger write failed (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- if (buf3[0] == REG_SYS_COMMAND_CHG_WRITE)
|
||||
- continue;
|
||||
-
|
||||
- if (buf3[0] == 0)
|
||||
- return 0;
|
||||
-
|
||||
- if (buf3[0] == 0xff) {
|
||||
- dev_err(&client->dev,
|
||||
- "Charger write failed - MCU returned 0x%hhx\n",
|
||||
- buf2[1]);
|
||||
- return -EIO;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- dev_err(&client->dev, "Charger write failed - timeout (%d)\n", ret);
|
||||
- return -ETIMEDOUT;
|
||||
-}
|
||||
-
|
||||
-static struct regmap_bus kb151_charger_regmap_bus = {
|
||||
- .reg_write = kb151_charger_regmap_write,
|
||||
- .reg_read = kb151_charger_regmap_read,
|
||||
-};
|
||||
-
|
||||
-static struct regmap_config kb151_charger_regmap_config = {
|
||||
- .reg_bits = 8,
|
||||
- .reg_stride = 1,
|
||||
- .val_bits = 8,
|
||||
- .max_register = 0xff,
|
||||
- .cache_type = REGCACHE_NONE,
|
||||
-};
|
||||
-
|
||||
-extern int ip5xxx_power_probe_with_regmap(struct device* dev, struct regmap *regmap);
|
||||
-
|
||||
-#endif
|
||||
-
|
||||
static int kb151_probe(struct i2c_client *client)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
@@ -439,9 +258,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
unsigned int kb_rows, kb_cols;
|
||||
unsigned int map_rows = DEFAULT_MAP_ROWS, map_cols = DEFAULT_MAP_COLS;
|
||||
struct kb151 *kb151;
|
||||
-#ifdef CONFIG_IP5XXX_POWER
|
||||
- struct regmap* regmap;
|
||||
-#endif
|
||||
bool has_of_keymap;
|
||||
int ret;
|
||||
|
||||
@@ -523,28 +339,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to register input\n");
|
||||
|
||||
-#ifdef CONFIG_IP5XXX_POWER
|
||||
- // we need to create a custom regmap_bus that will proxy
|
||||
- // charger register reads/writes via a keyboard MCU
|
||||
- regmap = __regmap_lockdep_wrapper(__devm_regmap_init,
|
||||
- "kb151-charger-regmap", dev,
|
||||
- &kb151_charger_regmap_bus, client,
|
||||
- &kb151_charger_regmap_config);
|
||||
- if (IS_ERR(regmap)) {
|
||||
- dev_err(dev, "Failed to create charger regmap (%ld)\n", PTR_ERR(regmap));
|
||||
- return PTR_ERR(regmap);
|
||||
- }
|
||||
-
|
||||
- // initialize the charger
|
||||
- ret = ip5xxx_power_probe_with_regmap(dev, regmap);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Failed to initialize keyboard charger (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-#else
|
||||
- dev_warn(dev, "Your kernel doesn't have CONFIG_IP5XXX_POWER enabled, keyboard charger support is disabled.\n");
|
||||
-#endif
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
From 1ae2936d9fb61cba0605d140a12693c3e55261bf Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:20 +0200
|
||||
Subject: [PATCH 530/544] Revert "input: kb151: Add support for VBAT regulator
|
||||
that powers the keyboard"
|
||||
|
||||
This reverts commit bf954f6706e7493c3455a2ea410e658b345ddb43.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 23 -----------------------
|
||||
1 file changed, 23 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index 17acd4b6cf92..e0c808b4209e 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
-#include <linux/regulator/consumer.h>
|
||||
|
||||
#define KB151_CRC8_POLYNOMIAL 0x07
|
||||
|
||||
@@ -185,7 +184,6 @@ static const struct matrix_keymap_data kb151_default_keymap_data = {
|
||||
|
||||
struct kb151 {
|
||||
struct input_dev *input;
|
||||
- struct regulator *vbat_supply;
|
||||
u8 crc_table[CRC8_TABLE_SIZE];
|
||||
u8 row_shift;
|
||||
u8 rows;
|
||||
@@ -494,11 +492,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
if (!kb151)
|
||||
return -ENOMEM;
|
||||
|
||||
- kb151->vbat_supply = devm_regulator_get(dev, "vbat");
|
||||
- if (IS_ERR(kb151->vbat_supply))
|
||||
- return dev_err_probe(dev, PTR_ERR(kb151->vbat_supply),
|
||||
- "Failed to get vbat_supply\n");
|
||||
-
|
||||
i2c_set_clientdata(client, kb151);
|
||||
|
||||
crc8_populate_msb(kb151->crc_table, KB151_CRC8_POLYNOMIAL);
|
||||
@@ -564,21 +557,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
dev_warn(dev, "Your kernel doesn't have CONFIG_IP5XXX_POWER enabled, keyboard charger support is disabled.\n");
|
||||
#endif
|
||||
|
||||
- ret = regulator_enable(kb151->vbat_supply);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Failed to enable keyboard vbat supply (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int kb151_remove(struct i2c_client *client)
|
||||
-{
|
||||
- struct kb151 *kb151 = i2c_get_clientdata(client);
|
||||
-
|
||||
- regulator_disable(kb151->vbat_supply);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -590,7 +568,6 @@ MODULE_DEVICE_TABLE(of, kb151_of_match);
|
||||
|
||||
static struct i2c_driver kb151_driver = {
|
||||
.probe_new = kb151_probe,
|
||||
- .remove = kb151_remove,
|
||||
.driver = {
|
||||
.name = "kb151",
|
||||
.of_match_table = kb151_of_match,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
From f889ad1bc71949ea2aa2136b18e3afc2181fd71c Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:23 +0200
|
||||
Subject: [PATCH 532/544] Revert "input: kb151: Allow to disable FN layer
|
||||
handling"
|
||||
|
||||
This reverts commit ce0155f7c168626d83be538ab95feb76881bfcc6.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 6 +-----
|
||||
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index 453eee2736f6..491c01dfd194 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -86,10 +86,6 @@ static bool disable_input;
|
||||
module_param(disable_input, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(disable_input, "Disable the keyboard part of the driver");
|
||||
|
||||
-static bool disable_fn_layer;
|
||||
-module_param(disable_fn_layer, bool, 0644);
|
||||
-MODULE_PARM_DESC(disable_fn_layer, "Disable the keyboard's Fn key layer map");
|
||||
-
|
||||
static const u32 kb151_default_keymap[] = {
|
||||
MATRIX_KEY(0, 0, KEY_ESC),
|
||||
MATRIX_KEY(0, 1, KEY_1),
|
||||
@@ -241,7 +237,7 @@ static void kb151_update(struct i2c_client *client)
|
||||
|
||||
dev_dbg(&client->dev, "row %u col %u %sed\n",
|
||||
map_row, col, pressed ? "press" : "releas");
|
||||
- if (keymap[code] == KEY_FN && !disable_fn_layer) {
|
||||
+ if (keymap[code] == KEY_FN) {
|
||||
dev_dbg(&client->dev, "FN is now %s\n",
|
||||
pressed ? "pressed" : "released");
|
||||
kb151->fn_state = pressed;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
From 14a679b92d3161cafde1793a146d2c2f8bb646e0 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:24 +0200
|
||||
Subject: [PATCH 533/544] Revert "input: kb151: Allow to disable the keyboard
|
||||
input processing"
|
||||
|
||||
This reverts commit 4cd3283892e4cec986551e3c60e34699139dd5b9.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 8 --------
|
||||
1 file changed, 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index 491c01dfd194..898a25d06ed6 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -82,10 +82,6 @@
|
||||
#define DEFAULT_MAP_ROWS 12
|
||||
#define DEFAULT_MAP_COLS 12
|
||||
|
||||
-static bool disable_input;
|
||||
-module_param(disable_input, bool, S_IRUGO);
|
||||
-MODULE_PARM_DESC(disable_input, "Disable the keyboard part of the driver");
|
||||
-
|
||||
static const u32 kb151_default_keymap[] = {
|
||||
MATRIX_KEY(0, 0, KEY_ESC),
|
||||
MATRIX_KEY(0, 1, KEY_1),
|
||||
@@ -496,9 +492,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
kb151->rows = kb_rows;
|
||||
kb151->cols = kb_cols;
|
||||
|
||||
- if (disable_input)
|
||||
- goto charger;
|
||||
-
|
||||
kb151->input = devm_input_allocate_device(dev);
|
||||
if (!kb151->input)
|
||||
return -ENOMEM;
|
||||
@@ -530,7 +523,6 @@ static int kb151_probe(struct i2c_client *client)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to register input\n");
|
||||
|
||||
-charger:
|
||||
#ifdef CONFIG_IP5XXX_POWER
|
||||
// we need to create a custom regmap_bus that will proxy
|
||||
// charger register reads/writes via a keyboard MCU
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
From 0f0407ea30c87898d5efee7db5fb874f57c4ec19 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:26 +0200
|
||||
Subject: [PATCH 535/544] Revert "input: kb151: Move default keymap to the
|
||||
drvier"
|
||||
|
||||
This reverts commit fa236c3c7a3afbf487ed12be021135053db97fa6.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 135 +++------------------------------
|
||||
1 file changed, 12 insertions(+), 123 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index 41a68f0c3988..bb6250efe934 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -1,12 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
//
|
||||
// Copyright (C) 2021 Samuel Holland <samuel@sholland.org>
|
||||
-// Copyright (C) 2022 Ondřej Jirman <megi@xff.cz>
|
||||
|
||||
#include <linux/crc8.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
-#include <dt-bindings/input/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
@@ -14,113 +12,16 @@
|
||||
#define KB151_CRC8_POLYNOMIAL 0x07
|
||||
|
||||
#define KB151_DEVICE_ID_HI 0x00
|
||||
-#define KB151_DEVICE_ID_HI_VALUE 0x4b
|
||||
+#define KB151_DEVICE_ID_HI_VALUE 0x4b
|
||||
#define KB151_DEVICE_ID_LO 0x01
|
||||
-#define KB151_DEVICE_ID_LO_VALUE 0x42
|
||||
+#define KB151_DEVICE_ID_LO_VALUE 0x42
|
||||
#define KB151_FW_REVISION 0x02
|
||||
#define KB151_FW_FEATURES 0x03
|
||||
#define KB151_MATRIX_SIZE 0x06
|
||||
#define KB151_SCAN_CRC 0x07
|
||||
#define KB151_SCAN_DATA 0x08
|
||||
#define KB151_SYS_CONFIG 0x20
|
||||
-#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
-
|
||||
-/* default regmap from the factory */
|
||||
-
|
||||
-#define DEFAULT_MAP_ROWS 12
|
||||
-#define DEFAULT_MAP_COLS 12
|
||||
-
|
||||
-static const u32 kb151_default_keymap[] = {
|
||||
- MATRIX_KEY(0, 0, KEY_ESC),
|
||||
- MATRIX_KEY(0, 1, KEY_1),
|
||||
- MATRIX_KEY(0, 2, KEY_2),
|
||||
- MATRIX_KEY(0, 3, KEY_3),
|
||||
- MATRIX_KEY(0, 4, KEY_4),
|
||||
- MATRIX_KEY(0, 5, KEY_5),
|
||||
- MATRIX_KEY(0, 6, KEY_6),
|
||||
- MATRIX_KEY(0, 7, KEY_7),
|
||||
- MATRIX_KEY(0, 8, KEY_8),
|
||||
- MATRIX_KEY(0, 9, KEY_9),
|
||||
- MATRIX_KEY(0, 10, KEY_0),
|
||||
- MATRIX_KEY(0, 11, KEY_BACKSPACE),
|
||||
- MATRIX_KEY(1, 0, KEY_TAB),
|
||||
- MATRIX_KEY(1, 1, KEY_Q),
|
||||
- MATRIX_KEY(1, 2, KEY_W),
|
||||
- MATRIX_KEY(1, 3, KEY_E),
|
||||
- MATRIX_KEY(1, 4, KEY_R),
|
||||
- MATRIX_KEY(1, 5, KEY_T),
|
||||
- MATRIX_KEY(1, 6, KEY_Y),
|
||||
- MATRIX_KEY(1, 7, KEY_U),
|
||||
- MATRIX_KEY(1, 8, KEY_I),
|
||||
- MATRIX_KEY(1, 9, KEY_O),
|
||||
- MATRIX_KEY(1, 10, KEY_P),
|
||||
- MATRIX_KEY(1, 11, KEY_ENTER),
|
||||
- MATRIX_KEY(2, 0, KEY_LEFTMETA),
|
||||
- MATRIX_KEY(2, 1, KEY_A),
|
||||
- MATRIX_KEY(2, 2, KEY_S),
|
||||
- MATRIX_KEY(2, 3, KEY_D),
|
||||
- MATRIX_KEY(2, 4, KEY_F),
|
||||
- MATRIX_KEY(2, 5, KEY_G),
|
||||
- MATRIX_KEY(2, 6, KEY_H),
|
||||
- MATRIX_KEY(2, 7, KEY_J),
|
||||
- MATRIX_KEY(2, 8, KEY_K),
|
||||
- MATRIX_KEY(2, 9, KEY_L),
|
||||
- MATRIX_KEY(2, 10, KEY_SEMICOLON),
|
||||
- MATRIX_KEY(3, 0, KEY_LEFTSHIFT),
|
||||
- MATRIX_KEY(3, 1, KEY_Z),
|
||||
- MATRIX_KEY(3, 2, KEY_X),
|
||||
- MATRIX_KEY(3, 3, KEY_C),
|
||||
- MATRIX_KEY(3, 4, KEY_V),
|
||||
- MATRIX_KEY(3, 5, KEY_B),
|
||||
- MATRIX_KEY(3, 6, KEY_N),
|
||||
- MATRIX_KEY(3, 7, KEY_M),
|
||||
- MATRIX_KEY(3, 8, KEY_COMMA),
|
||||
- MATRIX_KEY(3, 9, KEY_DOT),
|
||||
- MATRIX_KEY(3, 10, KEY_SLASH),
|
||||
- MATRIX_KEY(4, 1, KEY_LEFTCTRL),
|
||||
- MATRIX_KEY(4, 4, KEY_SPACE),
|
||||
- MATRIX_KEY(4, 6, KEY_APOSTROPHE),
|
||||
- MATRIX_KEY(4, 8, KEY_RIGHTBRACE),
|
||||
- MATRIX_KEY(4, 9, KEY_LEFTBRACE),
|
||||
- MATRIX_KEY(5, 2, KEY_FN),
|
||||
- MATRIX_KEY(5, 3, KEY_LEFTALT),
|
||||
- MATRIX_KEY(5, 5, KEY_RIGHTALT),
|
||||
-
|
||||
- /* FN layer */
|
||||
- MATRIX_KEY(6, 1, KEY_BACKSLASH), // |
|
||||
- MATRIX_KEY(6, 2, KEY_BACKSLASH),
|
||||
- MATRIX_KEY(6, 3, KEY_DOLLAR),
|
||||
- MATRIX_KEY(6, 4, KEY_EURO),
|
||||
- MATRIX_KEY(6, 5, KEY_GRAVE), // ~
|
||||
- MATRIX_KEY(6, 6, KEY_GRAVE),
|
||||
- MATRIX_KEY(6, 7, KEY_MINUS), // _
|
||||
- MATRIX_KEY(6, 8, KEY_EQUAL),
|
||||
- MATRIX_KEY(6, 9, KEY_MINUS),
|
||||
- MATRIX_KEY(6, 10, KEY_EQUAL),
|
||||
- MATRIX_KEY(6, 11, KEY_DELETE),
|
||||
-
|
||||
- MATRIX_KEY(8, 0, KEY_SYSRQ),
|
||||
- MATRIX_KEY(8, 10, KEY_INSERT),
|
||||
-
|
||||
- MATRIX_KEY(9, 0, KEY_LEFTSHIFT),
|
||||
- MATRIX_KEY(9, 8, KEY_HOME),
|
||||
- MATRIX_KEY(9, 9, KEY_UP),
|
||||
- MATRIX_KEY(9, 10, KEY_END),
|
||||
-
|
||||
- MATRIX_KEY(10, 1, KEY_LEFTCTRL),
|
||||
- MATRIX_KEY(10, 6, KEY_LEFT),
|
||||
- MATRIX_KEY(10, 8, KEY_RIGHT),
|
||||
- MATRIX_KEY(10, 9, KEY_DOWN),
|
||||
-
|
||||
- MATRIX_KEY(11, 2, KEY_FN),
|
||||
- MATRIX_KEY(11, 3, KEY_LEFTALT),
|
||||
- MATRIX_KEY(11, 5, KEY_RIGHTALT),
|
||||
-};
|
||||
-
|
||||
-static const struct matrix_keymap_data kb151_default_keymap_data = {
|
||||
- .keymap = kb151_default_keymap,
|
||||
- .keymap_size = ARRAY_SIZE(kb151_default_keymap),
|
||||
-};
|
||||
+#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0)
|
||||
|
||||
struct kb151 {
|
||||
struct input_dev *input;
|
||||
@@ -185,9 +86,8 @@ static void kb151_update(struct i2c_client *client)
|
||||
dev_dbg(&client->dev, "FN is now %s\n",
|
||||
pressed ? "pressed" : "released");
|
||||
kb151->fn_state = pressed;
|
||||
- } else {
|
||||
- input_report_key(kb151->input, keymap[code], pressed);
|
||||
- }
|
||||
+ } else
|
||||
+ input_report_key(kb151->input, keymap[code], pressed);
|
||||
}
|
||||
}
|
||||
input_sync(kb151->input);
|
||||
@@ -256,36 +156,26 @@ static int kb151_probe(struct i2c_client *client)
|
||||
struct device *dev = &client->dev;
|
||||
u8 info[KB151_MATRIX_SIZE + 1];
|
||||
unsigned int kb_rows, kb_cols;
|
||||
- unsigned int map_rows = DEFAULT_MAP_ROWS, map_cols = DEFAULT_MAP_COLS;
|
||||
+ unsigned int map_rows, map_cols;
|
||||
struct kb151 *kb151;
|
||||
- bool has_of_keymap;
|
||||
int ret;
|
||||
|
||||
- has_of_keymap = of_property_read_bool(dev->of_node, "linux,keymap");
|
||||
-
|
||||
ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info);
|
||||
- if (ret != sizeof(info)) {
|
||||
- dev_err(dev, "KB151 was not detected on the bus (%d)\n", ret);
|
||||
+ if (ret != sizeof(info))
|
||||
return ret;
|
||||
- }
|
||||
|
||||
if (info[KB151_DEVICE_ID_HI] != KB151_DEVICE_ID_HI_VALUE ||
|
||||
- info[KB151_DEVICE_ID_LO] != KB151_DEVICE_ID_LO_VALUE) {
|
||||
- dev_warn(dev, "Device on address %hu doesn't look like KB151\n",
|
||||
- client->addr);
|
||||
+ info[KB151_DEVICE_ID_LO] != KB151_DEVICE_ID_LO_VALUE)
|
||||
return -ENODEV;
|
||||
- }
|
||||
|
||||
dev_info(dev, "Found KB151 with firmware %d.%d (features=%#x)\n",
|
||||
info[KB151_FW_REVISION] >> 4,
|
||||
info[KB151_FW_REVISION] & 0xf,
|
||||
info[KB151_FW_FEATURES]);
|
||||
|
||||
- if (has_of_keymap) {
|
||||
- ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
+ ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
kb_rows = info[KB151_MATRIX_SIZE] & 0xf;
|
||||
kb_cols = info[KB151_MATRIX_SIZE] >> 4;
|
||||
@@ -322,8 +212,7 @@ static int kb151_probe(struct i2c_client *client)
|
||||
|
||||
__set_bit(EV_REP, kb151->input->evbit);
|
||||
|
||||
- ret = matrix_keypad_build_keymap(has_of_keymap ? NULL : &kb151_default_keymap_data,
|
||||
- NULL, map_rows, map_cols,
|
||||
+ ret = matrix_keypad_build_keymap(NULL, NULL, map_rows, map_cols,
|
||||
NULL, kb151->input);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to build keymap\n");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 82f769a72291b273f7b1de06ae3ee3d21f81b103 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:16:22 +0200
|
||||
Subject: [PATCH 531/544] Revert "input: kb151: Return EXDEV when MCU tells us
|
||||
that the charger is sleeping"
|
||||
|
||||
This reverts commit 35043d48e920420d53b27833f166d0b538308500.
|
||||
---
|
||||
drivers/input/keyboard/kb151.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c
|
||||
index e0c808b4209e..453eee2736f6 100644
|
||||
--- a/drivers/input/keyboard/kb151.c
|
||||
+++ b/drivers/input/keyboard/kb151.c
|
||||
@@ -362,7 +362,7 @@ static int kb151_charger_regmap_read(void *context,
|
||||
dev_err(&client->dev,
|
||||
"Charger read failed - MCU returned 0x%hhx\n",
|
||||
buf3[1]);
|
||||
- return -EXDEV;
|
||||
+ return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ static int kb151_charger_regmap_write(void *context, unsigned int reg, unsigned
|
||||
dev_err(&client->dev,
|
||||
"Charger write failed - MCU returned 0x%hhx\n",
|
||||
buf2[1]);
|
||||
- return -EXDEV;
|
||||
+ return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From 8c94497b4aca0c9c8aa804a6bdcfa5c8b8256c25 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Fri, 1 Apr 2022 22:00:59 +0200
|
||||
Subject: [PATCH 529/544] arm64: dts: rk3399-pinephone-pro: Enable Pinephone
|
||||
Keyboard power manager
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
index 219bd80e254b..d186ecbb8e6a 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
@@ -527,6 +527,15 @@ sgm3140_flash: led {
|
||||
flash-max-timeout-us = <250000>;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ keyboard-power {
|
||||
+ compatible = "megi,pinephone-keyboard-power-manager";
|
||||
+ phone-battery = "rk818-battery";
|
||||
+ phone-usb = "rk818-usb";
|
||||
+ kb-battery = "ip5xxx-battery";
|
||||
+ kb-boost = "ip5xxx-boost";
|
||||
+ kb-usb = "ip5xxx-usb";
|
||||
+ };
|
||||
};
|
||||
|
||||
&cpu_l0 {
|
||||
@@ -1081,7 +1090,7 @@ &i2c5 {
|
||||
pinctrl-0 = <&i2c5_xfer &pogo_int_pin>;
|
||||
status = "okay";
|
||||
|
||||
- keyboard@15 {
|
||||
+ ppkb: keyboard@15 {
|
||||
compatible = "pine64,kb151";
|
||||
reg = <0x15>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From a0c22fa0ab5bb4a27fbe60c20cbf3c7f471ab3c7 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Fri, 8 Apr 2022 22:09:38 +0200
|
||||
Subject: [PATCH 544/544] arm64: dts: rk3399-pinephone-pro: Use newer DT
|
||||
bindings for keyboard
|
||||
|
||||
---
|
||||
.../boot/dts/rockchip/rk3399-pinephone-pro.dts | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
index d186ecbb8e6a..4a47ccb1c08a 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
|
||||
@@ -85,7 +85,7 @@ bat: battery {
|
||||
<3400000 0>;
|
||||
};
|
||||
|
||||
- kb151_bat: kb151-battery {
|
||||
+ ppkb_battery: keyboard-battery {
|
||||
compatible = "simple-battery";
|
||||
voltage-min-design-microvolt = <3000000>;
|
||||
voltage-max-design-microvolt = <4200000>;
|
||||
@@ -1091,13 +1091,23 @@ &i2c5 {
|
||||
status = "okay";
|
||||
|
||||
ppkb: keyboard@15 {
|
||||
- compatible = "pine64,kb151";
|
||||
+ compatible = "pine64,pinephone-keyboard";
|
||||
reg = <0x15>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <RK_PA0 IRQ_TYPE_EDGE_FALLING>;
|
||||
vbat-supply = <&vcc5v0_sys>;
|
||||
wakeup-source;
|
||||
- monitored-battery = <&kb151_bat>;
|
||||
+
|
||||
+ i2c-bus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ charger@75 {
|
||||
+ compatible = "injoinic,ip5209";
|
||||
+ reg = <0x75>;
|
||||
+ monitored-battery = <&ppkb_battery>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From 5b22ab599d87abf63842b764f6b00089e5d09f4e Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Fri, 1 Apr 2022 22:00:43 +0200
|
||||
Subject: [PATCH 528/544] arm64: dts: sun50i-a64-pinephone: Enable Pinephone
|
||||
Keyboard power manager
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
.../boot/dts/allwinner/sun50i-a64-pinephone.dtsi | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index 4e88bcbcc968..2c80d9ba0c74 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -455,6 +455,15 @@ vibrator {
|
||||
enable-gpios = <&pio 3 2 GPIO_ACTIVE_HIGH>; /* PD2 */
|
||||
vcc-supply = <®_dcdc1>;
|
||||
};
|
||||
+
|
||||
+ keyboard-power {
|
||||
+ compatible = "megi,pinephone-keyboard-power-manager";
|
||||
+ phone-battery = "axp20x-battery";
|
||||
+ phone-usb = "axp20x-usb";
|
||||
+ kb-battery = "ip5xxx-battery";
|
||||
+ kb-boost = "ip5xxx-boost";
|
||||
+ kb-usb = "ip5xxx-usb";
|
||||
+ };
|
||||
};
|
||||
|
||||
&codec {
|
||||
@@ -685,7 +694,7 @@ accelerometer@68 {
|
||||
&i2c2 {
|
||||
status = "okay";
|
||||
|
||||
- keyboard@15 {
|
||||
+ ppkb: keyboard@15 {
|
||||
compatible = "pine64,kb151";
|
||||
reg = <0x15>;
|
||||
interrupt-parent = <&r_pio>;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From 6bd2856c01eca2f5103443ca684794db0884f00f Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Fri, 8 Apr 2022 22:09:33 +0200
|
||||
Subject: [PATCH 543/544] arm64: dts: sun50i-a64-pinephone: Use newer DT
|
||||
bindings for keyboard
|
||||
|
||||
---
|
||||
.../boot/dts/allwinner/sun50i-a64-pinephone.dtsi | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index 2c80d9ba0c74..2fd122bfca09 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -178,7 +178,7 @@ bat: battery {
|
||||
<0xdf 98>;
|
||||
};
|
||||
|
||||
- kb151_bat: kb151-battery {
|
||||
+ ppkb_battery: keyboard-battery {
|
||||
compatible = "simple-battery";
|
||||
voltage-min-design-microvolt = <3000000>;
|
||||
voltage-max-design-microvolt = <4200000>;
|
||||
@@ -695,13 +695,23 @@ &i2c2 {
|
||||
status = "okay";
|
||||
|
||||
ppkb: keyboard@15 {
|
||||
- compatible = "pine64,kb151";
|
||||
+ compatible = "pine64,pinephone-keyboard";
|
||||
reg = <0x15>;
|
||||
interrupt-parent = <&r_pio>;
|
||||
interrupts = <0 12 IRQ_TYPE_EDGE_FALLING>; /* PL12 */
|
||||
vbat-supply = <®_usb_5v>;
|
||||
wakeup-source;
|
||||
- monitored-battery = <&kb151_bat>;
|
||||
+
|
||||
+ i2c-bus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ charger@75 {
|
||||
+ compatible = "injoinic,ip5209";
|
||||
+ reg = <0x75>;
|
||||
+ monitored-battery = <&ppkb_battery>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
From 4c400cbfb2b7124f524485eaa8cea07db87af45a Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sat, 29 Jan 2022 17:00:38 -0600
|
||||
Subject: [PATCH 537/544] dt-bindings: input: Add the PinePhone keyboard
|
||||
binding
|
||||
|
||||
Add devicetree support for the PinePhone keyboard case, which provides a
|
||||
matrix keyboard interface and a proxied I2C bus.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
---
|
||||
.../input/pine64,pinephone-keyboard.yaml | 90 +++++++++++++++++++
|
||||
1 file changed, 90 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml b/Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..00f084b263f0
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
|
||||
@@ -0,0 +1,90 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/input/pine64,pinephone-keyboard.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Pine64 PinePhone keyboard device tree bindings
|
||||
+
|
||||
+maintainers:
|
||||
+ - Samuel Holland <samuel@sholland.org>
|
||||
+
|
||||
+description:
|
||||
+ A keyboard accessory is available for the Pine64 PinePhone and PinePhone Pro.
|
||||
+ It connects via I2C, providing a raw scan matrix, a flashing interface, and a
|
||||
+ subordinate I2C bus for communication with a battery charger IC.
|
||||
+
|
||||
+allOf:
|
||||
+ - $ref: /schemas/input/matrix-keymap.yaml#
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: pine64,pinephone-keyboard
|
||||
+
|
||||
+ reg:
|
||||
+ const: 0x15
|
||||
+
|
||||
+ interrupts:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ linux,fn-keymap:
|
||||
+ $ref: /schemas/input/matrix-keymap.yaml#/properties/linux,keymap
|
||||
+ description: keymap used when the Fn key is pressed
|
||||
+
|
||||
+ wakeup-source: true
|
||||
+
|
||||
+ i2c-bus:
|
||||
+ $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
+
|
||||
+dependencies:
|
||||
+ linux,fn-keymap: [ 'keypad,num-columns', 'keypad,num-rows' ]
|
||||
+ linux,keymap: [ 'keypad,num-columns', 'keypad,num-rows' ]
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - interrupts
|
||||
+
|
||||
+unevaluatedProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/input/input.h>
|
||||
+ #include <dt-bindings/interrupt-controller/irq.h>
|
||||
+
|
||||
+ i2c {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ keyboard@15 {
|
||||
+ compatible = "pine64,pinephone-keyboard";
|
||||
+ reg = <0x15>;
|
||||
+ interrupt-parent = <&r_pio>;
|
||||
+ interrupts = <0 12 IRQ_TYPE_EDGE_FALLING>; /* PL12 */
|
||||
+ keypad,num-rows = <6>;
|
||||
+ keypad,num-columns = <12>;
|
||||
+ linux,fn-keymap = <MATRIX_KEY(0, 0, KEY_FN_ESC)
|
||||
+ MATRIX_KEY(0, 1, KEY_F1)
|
||||
+ MATRIX_KEY(0, 2, KEY_F2)
|
||||
+ /* ... */
|
||||
+ MATRIX_KEY(5, 2, KEY_FN)
|
||||
+ MATRIX_KEY(5, 3, KEY_LEFTALT)
|
||||
+ MATRIX_KEY(5, 5, KEY_RIGHTALT)>;
|
||||
+ linux,keymap = <MATRIX_KEY(0, 0, KEY_ESC)
|
||||
+ MATRIX_KEY(0, 1, KEY_1)
|
||||
+ MATRIX_KEY(0, 2, KEY_2)
|
||||
+ /* ... */
|
||||
+ MATRIX_KEY(5, 2, KEY_FN)
|
||||
+ MATRIX_KEY(5, 3, KEY_LEFTALT)
|
||||
+ MATRIX_KEY(5, 5, KEY_RIGHTALT)>;
|
||||
+
|
||||
+ i2c-bus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ charger@75 {
|
||||
+ reg = <0x75>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
From 6027fbabb62712ef74d106994255e5b7d3ebd295 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:25:10 +0200
|
||||
Subject: [PATCH 541/544] input: pinephone-keyboard: Add support for VBAT
|
||||
regulator
|
||||
|
||||
This needs to be enabled for stable usage. If not, the keyboard
|
||||
MCU may be browning out when phone's VBAT is low.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/input/keyboard/pinephone-keyboard.c | 22 +++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/keyboard/pinephone-keyboard.c b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
index 7d2e16e588a0..b1e951cbb925 100644
|
||||
--- a/drivers/input/keyboard/pinephone-keyboard.c
|
||||
+++ b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
|
||||
#define DRV_NAME "pinephone-keyboard"
|
||||
|
||||
@@ -139,6 +140,7 @@ static const struct matrix_keymap_data ppkb_default_keymap_data = {
|
||||
|
||||
struct pinephone_keyboard {
|
||||
struct i2c_adapter adapter;
|
||||
+ struct regulator *vbat_supply;
|
||||
struct input_dev *input;
|
||||
unsigned short *fn_keymap;
|
||||
u8 crc_table[CRC8_TABLE_SIZE];
|
||||
@@ -371,6 +373,11 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
|
||||
i2c_set_clientdata(client, ppkb);
|
||||
|
||||
+ ppkb->vbat_supply = devm_regulator_get(dev, "vbat");
|
||||
+ if (IS_ERR(ppkb->vbat_supply))
|
||||
+ return dev_err_probe(dev, PTR_ERR(ppkb->vbat_supply),
|
||||
+ "Failed to get vbat_supply\n");
|
||||
+
|
||||
i2c_bus = of_get_child_by_name(dev->of_node, "i2c-bus");
|
||||
if (i2c_bus) {
|
||||
ppkb->adapter.owner = THIS_MODULE;
|
||||
@@ -426,6 +433,20 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to request IRQ\n");
|
||||
|
||||
+ ret = regulator_enable(ppkb->vbat_supply);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret,
|
||||
+ "Failed to enable keyboard vbat supply\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ppkb_remove(struct i2c_client *client)
|
||||
+{
|
||||
+ struct pinephone_keyboard *ppkb = i2c_get_clientdata(client);
|
||||
+
|
||||
+ regulator_disable(ppkb->vbat_supply);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -437,6 +458,7 @@ MODULE_DEVICE_TABLE(of, ppkb_of_match);
|
||||
|
||||
static struct i2c_driver ppkb_driver = {
|
||||
.probe_new = ppkb_probe,
|
||||
+ .remove = ppkb_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = ppkb_of_match,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
From ec0f8fdc30ddf2e0ddcad82b64fb2838c364820f Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:25:59 +0200
|
||||
Subject: [PATCH 542/544] input: pinephone-keyboard: Allow disabling the
|
||||
keyboard input
|
||||
|
||||
This is useful when the user wants to use a userspace implementation.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/input/keyboard/pinephone-keyboard.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/keyboard/pinephone-keyboard.c b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
index b1e951cbb925..d74ae97ed3cf 100644
|
||||
--- a/drivers/input/keyboard/pinephone-keyboard.c
|
||||
+++ b/drivers/input/keyboard/pinephone-keyboard.c
|
||||
@@ -10,6 +10,10 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
+static bool disable_input;
|
||||
+module_param(disable_input, bool, S_IRUGO);
|
||||
+MODULE_PARM_DESC(disable_input, "Disable the keyboard part of the driver");
|
||||
+
|
||||
#define DRV_NAME "pinephone-keyboard"
|
||||
|
||||
#define PPKB_CRC8_POLYNOMIAL 0x07
|
||||
@@ -397,6 +401,9 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
ppkb->rows = map_rows;
|
||||
ppkb->cols = map_cols;
|
||||
|
||||
+ if (disable_input)
|
||||
+ goto enable_regulator;
|
||||
+
|
||||
ppkb->input = devm_input_allocate_device(dev);
|
||||
if (!ppkb->input)
|
||||
return -ENOMEM;
|
||||
@@ -433,6 +440,7 @@ static int ppkb_probe(struct i2c_client *client)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to request IRQ\n");
|
||||
|
||||
+enable_regulator:
|
||||
ret = regulator_enable(ppkb->vbat_supply);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -37,10 +37,12 @@ index 81c355e6fa83..e392da8052c5 100644
|
||||
/*
|
||||
* sensor changes between scaling and subsampling, go through
|
||||
* exposure calculation
|
||||
@@ -2300,6 +2312,10 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
@@ -2302,7 +2314,11 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
sensor->fmt = *mbus_fmt;
|
||||
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
|
||||
ov5640_calc_pixel_rate(sensor));
|
||||
- ov5640_calc_pixel_rate(sensor));
|
||||
+ ov5640_calc_pixel_rate(sensor));
|
||||
+ __v4l2_ctrl_s_ctrl(sensor->ctrls.hblank,
|
||||
+ ov5640_calc_hblank(sensor));
|
||||
+ __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank,
|
||||
@@ -48,7 +50,7 @@ index 81c355e6fa83..e392da8052c5 100644
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&sensor->lock);
|
||||
@@ -2732,6 +2748,14 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
@@ -2735,6 +2751,14 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
0, INT_MAX, 1,
|
||||
ov5640_calc_pixel_rate(sensor));
|
||||
|
||||
@@ -63,7 +65,7 @@ index 81c355e6fa83..e392da8052c5 100644
|
||||
/* Auto/manual white balance */
|
||||
ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops,
|
||||
V4L2_CID_AUTO_WHITE_BALANCE,
|
||||
@@ -2780,6 +2804,8 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
@@ -2783,6 +2807,8 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
}
|
||||
|
||||
ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
@@ -75,3 +77,4 @@ index 81c355e6fa83..e392da8052c5 100644
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
|
||||
@@ -117,15 +117,7 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
fmt->width = mode->hact;
|
||||
fmt->height = mode->vact;
|
||||
|
||||
@@ -2327,7 +2266,6 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
struct ov5640_dev *sensor = to_ov5640_dev(sd);
|
||||
const struct ov5640_mode_info *new_mode;
|
||||
struct v4l2_mbus_framefmt *mbus_fmt = &format->format;
|
||||
- struct v4l2_mbus_framefmt *fmt;
|
||||
int ret;
|
||||
|
||||
if (format->pad != 0)
|
||||
@@ -2340,27 +2278,29 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
@@ -2339,28 +2278,32 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -135,24 +127,11 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
- if (format->which == V4L2_SUBDEV_FORMAT_TRY)
|
||||
- fmt = v4l2_subdev_get_try_format(sd, sd_state, 0);
|
||||
- else
|
||||
- fmt = &sensor->fmt;
|
||||
+ if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
+ *v4l2_subdev_get_try_format(sd, sd_state, 0) = *mbus_fmt;
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
*v4l2_subdev_get_try_format(sd, sd_state, 0) = *mbus_fmt;
|
||||
- goto out;
|
||||
- }
|
||||
+ } else {
|
||||
+ if (new_mode != sensor->current_mode) {
|
||||
+ sensor->current_mode = new_mode;
|
||||
+ sensor->pending_mode_change = true;
|
||||
+
|
||||
+ // Reset frame rate to maximum
|
||||
+ sensor->current_fr = sensor->current_mode->max_fps;
|
||||
+ }
|
||||
|
||||
- *fmt = *mbus_fmt;
|
||||
+ if (mbus_fmt->code != sensor->fmt.code)
|
||||
+ sensor->pending_fmt_change = true;
|
||||
|
||||
- if (new_mode != sensor->current_mode) {
|
||||
- sensor->current_mode = new_mode;
|
||||
@@ -160,17 +139,32 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
- }
|
||||
- if (mbus_fmt->code != sensor->fmt.code)
|
||||
- sensor->pending_fmt_change = true;
|
||||
+ if (new_mode != sensor->current_mode) {
|
||||
+ sensor->current_mode = new_mode;
|
||||
+ sensor->pending_mode_change = true;
|
||||
+
|
||||
+ // Reset frame rate to maximum
|
||||
+ sensor->current_fr = sensor->current_mode->max_fps;
|
||||
+ }
|
||||
+
|
||||
+ if (mbus_fmt->code != sensor->fmt.code)
|
||||
+ sensor->pending_fmt_change = true;
|
||||
|
||||
- /* update format even if code is unchanged, resolution might change */
|
||||
- sensor->fmt = *mbus_fmt;
|
||||
+ /* update format even if code is unchanged,
|
||||
+ * resolution might change */
|
||||
+ sensor->fmt = *mbus_fmt;
|
||||
|
||||
- __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
|
||||
- ov5640_calc_pixel_rate(sensor));
|
||||
+ __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
|
||||
+ ov5640_calc_pixel_rate(sensor));
|
||||
+ ov5640_calc_pixel_rate(sensor));
|
||||
+ }
|
||||
out:
|
||||
mutex_unlock(&sensor->lock);
|
||||
return ret;
|
||||
@@ -2881,7 +2821,6 @@ static int ov5640_enum_frame_interval(
|
||||
@@ -2881,7 +2824,6 @@ static int ov5640_enum_frame_interval(
|
||||
{
|
||||
struct ov5640_dev *sensor = to_ov5640_dev(sd);
|
||||
struct v4l2_fract tpf;
|
||||
@@ -178,7 +172,7 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
|
||||
if (fie->pad != 0)
|
||||
return -EINVAL;
|
||||
@@ -2891,9 +2830,7 @@ static int ov5640_enum_frame_interval(
|
||||
@@ -2891,9 +2833,7 @@ static int ov5640_enum_frame_interval(
|
||||
tpf.numerator = 1;
|
||||
tpf.denominator = ov5640_framerates[fie->index];
|
||||
|
||||
@@ -189,7 +183,7 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
return -EINVAL;
|
||||
|
||||
fie->interval = tpf;
|
||||
@@ -2912,12 +2849,52 @@ static int ov5640_g_frame_interval(struct v4l2_subdev *sd,
|
||||
@@ -2912,12 +2852,52 @@ static int ov5640_g_frame_interval(struct v4l2_subdev *sd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -243,7 +237,7 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
|
||||
if (fi->pad != 0)
|
||||
return -EINVAL;
|
||||
@@ -2931,26 +2908,11 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
|
||||
@@ -2931,26 +2911,11 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
|
||||
|
||||
mode = sensor->current_mode;
|
||||
|
||||
@@ -275,3 +269,4 @@ index 924a1f867923..81c355e6fa83 100644
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
From 74402b5981e5b38578ddb7e7961ace3931974df4 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 02:50:14 +0200
|
||||
Subject: [PATCH 520/544] power: supply: axp20x-battery: Support
|
||||
POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR
|
||||
|
||||
Support force disabling the charger in a more standardized way.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/axp20x_battery.c | 30 +++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
|
||||
index cf1d4064eee5..9d7e7dc15106 100644
|
||||
--- a/drivers/power/supply/axp20x_battery.c
|
||||
+++ b/drivers/power/supply/axp20x_battery.c
|
||||
@@ -229,6 +229,19 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
|
||||
val->intval = !!(reg & AXP20X_PWR_OP_BATT_PRESENT);
|
||||
break;
|
||||
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
+ ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
|
||||
+ ®);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (reg & AXP20X_CHRG_CTRL1_ENABLE)
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO;
|
||||
+ else
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
ret = regmap_read(axp20x_batt->regmap, AXP20X_PWR_OP_MODE,
|
||||
®);
|
||||
@@ -506,6 +519,21 @@ static int axp20x_battery_set_prop(struct power_supply *psy,
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
|
||||
return axp20x_set_max_constant_charge_current(axp20x_batt,
|
||||
val->intval);
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
+ switch (val->intval) {
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO:
|
||||
+ return regmap_update_bits(axp20x_batt->regmap,
|
||||
+ AXP20X_CHRG_CTRL1,
|
||||
+ AXP20X_CHRG_CTRL1_ENABLE,
|
||||
+ AXP20X_CHRG_CTRL1_ENABLE);
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE:
|
||||
+ return regmap_update_bits(axp20x_batt->regmap,
|
||||
+ AXP20X_CHRG_CTRL1,
|
||||
+ AXP20X_CHRG_CTRL1_ENABLE, 0);
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
switch (val->intval) {
|
||||
case POWER_SUPPLY_STATUS_CHARGING:
|
||||
@@ -527,6 +555,7 @@ static enum power_supply_property axp20x_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
|
||||
@@ -542,6 +571,7 @@ static int axp20x_battery_prop_writeable(struct power_supply *psy,
|
||||
enum power_supply_property psp)
|
||||
{
|
||||
return psp == POWER_SUPPLY_PROP_STATUS ||
|
||||
+ psp == POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR ||
|
||||
psp == POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ||
|
||||
psp == POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN ||
|
||||
psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT ||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
From efb857d1afed4423a68f6b8cc52bcccdcc68aa13 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 03:17:34 +0200
|
||||
Subject: [PATCH 523/544] power: supply: ip5xxx: Add boost status property
|
||||
|
||||
Boost can be enabled, but actually off. Real status is reported by
|
||||
POWER_SUPPLY_PROP_PRESENT property.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index f55fe505ebbf..5cb94704631d 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -44,6 +44,8 @@
|
||||
#define IP5XXX_GPIO_CTL2 0x53
|
||||
#define IP5XXX_GPIO_CTL2A 0x54
|
||||
#define IP5XXX_GPIO_CTL3 0x55
|
||||
+#define IP5XXX_STATUS 0x70
|
||||
+#define IP5XXX_STATUS_BOOST_ON BIT(2)
|
||||
#define IP5XXX_READ0 0x71
|
||||
#define IP5XXX_READ0_CHG_STAT GENMASK(7, 5)
|
||||
#define IP5XXX_READ0_CHG_STAT_IDLE (0x0 << 5)
|
||||
@@ -539,6 +541,7 @@ static const struct power_supply_desc ip5xxx_battery_desc = {
|
||||
|
||||
static const enum power_supply_property ip5xxx_boost_properties[] = {
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
+ POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
};
|
||||
|
||||
@@ -563,6 +566,14 @@ static int ip5xxx_boost_get_property(struct power_supply *psy,
|
||||
val->intval = !!(rval & IP5XXX_SYS_CTL0_BOOST_EN);
|
||||
return 0;
|
||||
|
||||
+ case POWER_SUPPLY_PROP_PRESENT:
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_STATUS, &rval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ val->intval = !!(rval & IP5XXX_STATUS_BOOST_ON);
|
||||
+ return 0;
|
||||
+
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
ret = ip5xxx_read(ip5xxx, IP5XXX_CHG_CTL1, &rval);
|
||||
if (ret)
|
||||
@@ -608,7 +619,7 @@ static int ip5xxx_boost_set_property(struct power_supply *psy,
|
||||
static int ip5xxx_boost_property_is_writeable(struct power_supply *psy,
|
||||
enum power_supply_property psp)
|
||||
{
|
||||
- return true;
|
||||
+ return psp != POWER_SUPPLY_PROP_PRESENT;
|
||||
}
|
||||
|
||||
static const struct power_supply_desc ip5xxx_boost_desc = {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
From b55d2d277ef854aae690a05e765c9c38a1d3e070 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 03:19:36 +0200
|
||||
Subject: [PATCH 524/544] power: supply: ip5xxx: Add ip5xxx-usb supply
|
||||
|
||||
This supply represents presnece of the USB power supply on VIN.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 44 +++++++++++++++++++++++++++++
|
||||
1 file changed, 44 insertions(+)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index 5cb94704631d..caa4d3c83c69 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -46,6 +46,7 @@
|
||||
#define IP5XXX_GPIO_CTL3 0x55
|
||||
#define IP5XXX_STATUS 0x70
|
||||
#define IP5XXX_STATUS_BOOST_ON BIT(2)
|
||||
+#define IP5XXX_STATUS_VIN_PRESENT BIT(4)
|
||||
#define IP5XXX_READ0 0x71
|
||||
#define IP5XXX_READ0_CHG_STAT GENMASK(7, 5)
|
||||
#define IP5XXX_READ0_CHG_STAT_IDLE (0x0 << 5)
|
||||
@@ -632,6 +633,45 @@ static const struct power_supply_desc ip5xxx_boost_desc = {
|
||||
.property_is_writeable = ip5xxx_boost_property_is_writeable,
|
||||
};
|
||||
|
||||
+static const enum power_supply_property ip5xxx_usb_properties[] = {
|
||||
+ POWER_SUPPLY_PROP_PRESENT,
|
||||
+};
|
||||
+
|
||||
+static int ip5xxx_usb_get_property(struct power_supply *psy,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val)
|
||||
+{
|
||||
+ struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
+ unsigned int rval;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ip5xxx_initialize(psy);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ switch (psp) {
|
||||
+ case POWER_SUPPLY_PROP_PRESENT:
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_STATUS, &rval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ val->intval = !!(rval & IP5XXX_STATUS_VIN_PRESENT);
|
||||
+ return 0;
|
||||
+
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static const struct power_supply_desc ip5xxx_usb_desc = {
|
||||
+ .name = "ip5xxx-usb",
|
||||
+ .type = POWER_SUPPLY_TYPE_USB,
|
||||
+ .properties = ip5xxx_usb_properties,
|
||||
+ .num_properties = ARRAY_SIZE(ip5xxx_usb_properties),
|
||||
+ .get_property = ip5xxx_usb_get_property,
|
||||
+ .property_is_writeable = ip5xxx_boost_property_is_writeable,
|
||||
+};
|
||||
+
|
||||
static const struct regmap_config ip5xxx_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
@@ -662,6 +702,10 @@ int ip5xxx_power_probe_with_regmap(struct device* dev, struct regmap *regmap)
|
||||
if (IS_ERR(psy))
|
||||
return PTR_ERR(psy);
|
||||
|
||||
+ psy = devm_power_supply_register(dev, &ip5xxx_usb_desc, &psy_cfg);
|
||||
+ if (IS_ERR(psy))
|
||||
+ return PTR_ERR(psy);
|
||||
+
|
||||
ret = power_supply_get_battery_info(psy, &ip5xxx->bat);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to get battery info\n");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
From c74be53fe9f646ab580f290511e28840af9ccb6f Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 3 Apr 2022 16:03:10 +0200
|
||||
Subject: [PATCH 525/544] power: supply: ip5xxx: Add support for
|
||||
POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR
|
||||
|
||||
This property is better for preventing charging, then the status property,
|
||||
because reading status property should return the actual status, and not
|
||||
whether the charging is currently inhibited or not.
|
||||
|
||||
System may have charging enabled, but the battery may still be discharging
|
||||
for a host of reasons.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 29 +++++++++++++++++++++++++++++
|
||||
1 file changed, 29 insertions(+)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index caa4d3c83c69..931874c86015 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -183,6 +183,7 @@ static int ip5xxx_initialize(struct power_supply *psy)
|
||||
static const enum power_supply_property ip5xxx_battery_properties[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_CHARGE_TYPE,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR,
|
||||
POWER_SUPPLY_PROP_HEALTH,
|
||||
POWER_SUPPLY_PROP_CAPACITY,
|
||||
POWER_SUPPLY_PROP_CALIBRATE,
|
||||
@@ -341,6 +342,18 @@ static int ip5xxx_battery_get_property(struct power_supply *psy,
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
return ip5xxx_battery_get_status(ip5xxx, &val->intval);
|
||||
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_SYS_CTL0, &rval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (rval & IP5XXX_SYS_CTL0_CHARGER_EN)
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO;
|
||||
+ else
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
case POWER_SUPPLY_PROP_CHARGE_TYPE:
|
||||
return ip5xxx_battery_get_charge_type(ip5xxx, &val->intval);
|
||||
|
||||
@@ -492,6 +505,21 @@ static int ip5xxx_battery_set_property(struct power_supply *psy,
|
||||
return ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL0,
|
||||
IP5XXX_SYS_CTL0_CHARGER_EN, rval);
|
||||
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
+ switch (val->intval) {
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO:
|
||||
+ rval = IP5XXX_SYS_CTL0_CHARGER_EN;
|
||||
+ break;
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE:
|
||||
+ rval = 0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL0,
|
||||
+ IP5XXX_SYS_CTL0_CHARGER_EN, rval);
|
||||
+
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
|
||||
return ip5xxx_battery_set_voltage_max(ip5xxx, val->intval);
|
||||
|
||||
@@ -525,6 +553,7 @@ static int ip5xxx_battery_property_is_writeable(struct power_supply *psy,
|
||||
{
|
||||
return psp == POWER_SUPPLY_PROP_STATUS ||
|
||||
psp == POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN ||
|
||||
+ psp == POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR ||
|
||||
psp == POWER_SUPPLY_PROP_CALIBRATE ||
|
||||
psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT ||
|
||||
psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,810 @@
|
||||
From 2ef6ae5fbccbef4ea2fe3c5bf332e558ab37d447 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 02:51:25 +0200
|
||||
Subject: [PATCH 521/544] power: supply: ip5xxx: Import driver code from
|
||||
orange-pi-5.18
|
||||
|
||||
Just like that.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 506 ++++++++++++----------------
|
||||
1 file changed, 223 insertions(+), 283 deletions(-)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index 31bc56d9333a..d3af6f2ae4a3 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -24,7 +24,7 @@
|
||||
#define IP5XXX_SYS_CTL4_SHDN_TIME_SEL GENMASK(7, 6)
|
||||
#define IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN BIT(5)
|
||||
#define IP5XXX_SYS_CTL5 0x07
|
||||
-#define IP5XXX_SYS_CTL5_NTC_EN BIT(7)
|
||||
+#define IP5XXX_SYS_CTL5_NTC_DIS BIT(6)
|
||||
#define IP5XXX_SYS_CTL5_WLED_MODE_SEL BIT(1)
|
||||
#define IP5XXX_SYS_CTL5_BTN_SHDN_SEL BIT(0)
|
||||
#define IP5XXX_CHG_CTL1 0x22
|
||||
@@ -62,7 +62,7 @@
|
||||
#define IP5XXX_READ1 0x72
|
||||
#define IP5XXX_READ1_WLED_PRESENT BIT(7)
|
||||
#define IP5XXX_READ1_LIGHT_LOAD BIT(6)
|
||||
-#define IP5XXX_READ1_VIN_OVER_VOLT BIT(5)
|
||||
+#define IP5XXX_READ1_VIN_OVERVOLT BIT(5)
|
||||
#define IP5XXX_READ2 0x77
|
||||
#define IP5XXX_READ2_BTN_PRESS BIT(3)
|
||||
#define IP5XXX_READ2_BTN_LONG_PRESS BIT(1)
|
||||
@@ -75,100 +75,102 @@
|
||||
#define IP5XXX_BATOCV_DAT1 0xa9
|
||||
|
||||
struct ip5xxx {
|
||||
- struct device *dev;
|
||||
struct regmap *regmap;
|
||||
- struct delayed_work wd_work;
|
||||
struct power_supply_battery_info *bat;
|
||||
int r_int;
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
-static const enum power_supply_property ip5xxx_boost_properties[] = {
|
||||
- POWER_SUPPLY_PROP_ONLINE,
|
||||
- POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
-};
|
||||
-
|
||||
-static int ip5xxx_boost_get_property(struct power_supply *psy,
|
||||
- enum power_supply_property psp,
|
||||
- union power_supply_propval *val)
|
||||
+/*
|
||||
+ * The IP5xxx charger only responds on I2C when it is "awake". The charger is
|
||||
+ * generally only awake when VIN is powered or when its boost converter is
|
||||
+ * enabled. Going into shutdown resets all register values. To handle this:
|
||||
+ * 1) When any bus error occurs, assume the charger has gone into shutdown.
|
||||
+ * 2) Attempt the initialization sequence on each subsequent register access
|
||||
+ * until it succeeds.
|
||||
+ */
|
||||
+static int ip5xxx_read(struct ip5xxx *ip5xxx, unsigned int reg,
|
||||
+ unsigned int *val)
|
||||
{
|
||||
- struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
- unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- switch (psp) {
|
||||
- case POWER_SUPPLY_PROP_ONLINE:
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_SYS_CTL0, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
+ ret = regmap_read(ip5xxx->regmap, reg, val);
|
||||
+ if (ret)
|
||||
+ ip5xxx->initialized = false;
|
||||
|
||||
- val->intval = !!(rval & IP5XXX_SYS_CTL0_BOOST_EN);
|
||||
- return 0;
|
||||
+ return ret;
|
||||
+}
|
||||
|
||||
- case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_CHG_CTL1, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 4530000;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
+static int ip5xxx_update_bits(struct ip5xxx *ip5xxx, unsigned int reg,
|
||||
+ unsigned int mask, unsigned int val)
|
||||
+{
|
||||
+ int ret;
|
||||
|
||||
- rval &= IP5XXX_CHG_CTL1_BOOST_UVP_SEL;
|
||||
- val->intval = 4530000 + 100000 * (rval >> 2);
|
||||
- return 0;
|
||||
+ ret = regmap_update_bits(ip5xxx->regmap, reg, mask, val);
|
||||
+ if (ret)
|
||||
+ ip5xxx->initialized = false;
|
||||
|
||||
- default:
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
-static int ip5xxx_boost_set_property(struct power_supply *psy,
|
||||
- enum power_supply_property psp,
|
||||
- const union power_supply_propval *val)
|
||||
+static int ip5xxx_initialize(struct power_supply *psy)
|
||||
{
|
||||
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
- unsigned int rval;
|
||||
+ int ret;
|
||||
|
||||
- switch (psp) {
|
||||
- case POWER_SUPPLY_PROP_ONLINE:
|
||||
- rval = val->intval ? IP5XXX_SYS_CTL0_BOOST_EN : 0;
|
||||
- return regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL0,
|
||||
- IP5XXX_SYS_CTL0_BOOST_EN, rval);
|
||||
+ if (ip5xxx->initialized)
|
||||
+ return 0;
|
||||
|
||||
- case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
- rval = ((val->intval - 4530000) / 100000) << 2;
|
||||
- return regmap_update_bits(ip5xxx->regmap, IP5XXX_CHG_CTL1,
|
||||
- IP5XXX_CHG_CTL1_BOOST_UVP_SEL, rval);
|
||||
+ /*
|
||||
+ * Disable shutdown under light load.
|
||||
+ * Enable power on when under load.
|
||||
+ */
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL1,
|
||||
+ IP5XXX_SYS_CTL1_LIGHT_SHDN_EN |
|
||||
+ IP5XXX_SYS_CTL1_LOAD_PWRUP_EN,
|
||||
+ IP5XXX_SYS_CTL1_LOAD_PWRUP_EN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
- default:
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-}
|
||||
+ /*
|
||||
+ * Enable shutdown after a long button press (as configured below).
|
||||
+ */
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL3,
|
||||
+ IP5XXX_SYS_CTL3_BTN_SHDN_EN,
|
||||
+ IP5XXX_SYS_CTL3_BTN_SHDN_EN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
-static int ip5xxx_boost_property_is_writeable(struct power_supply *psy,
|
||||
- enum power_supply_property psp)
|
||||
-{
|
||||
- return true;
|
||||
-}
|
||||
+ /*
|
||||
+ * Power on automatically when VIN is removed.
|
||||
+ */
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL4,
|
||||
+ IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN,
|
||||
+ IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
-static const struct power_supply_desc ip5xxx_boost_desc = {
|
||||
- .name = "ip5xxx-boost",
|
||||
- .type = POWER_SUPPLY_TYPE_MAINS,
|
||||
- .properties = ip5xxx_boost_properties,
|
||||
- .num_properties = ARRAY_SIZE(ip5xxx_boost_properties),
|
||||
- .get_property = ip5xxx_boost_get_property,
|
||||
- .set_property = ip5xxx_boost_set_property,
|
||||
- .property_is_writeable = ip5xxx_boost_property_is_writeable,
|
||||
-};
|
||||
+ /*
|
||||
+ * Enable the NTC.
|
||||
+ * Configure the button for two presses => LED, long press => shutdown.
|
||||
+ */
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL5,
|
||||
+ IP5XXX_SYS_CTL5_NTC_DIS |
|
||||
+ IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
+ IP5XXX_SYS_CTL5_BTN_SHDN_SEL,
|
||||
+ IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
+ IP5XXX_SYS_CTL5_BTN_SHDN_SEL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
-static const enum power_supply_property ip5xxx_charger_properties[] = {
|
||||
+ ip5xxx->initialized = true;
|
||||
+ dev_dbg(psy->dev.parent, "Initialized after power on\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const enum power_supply_property ip5xxx_battery_properties[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
- POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_CHARGE_TYPE,
|
||||
POWER_SUPPLY_PROP_HEALTH,
|
||||
POWER_SUPPLY_PROP_CAPACITY,
|
||||
@@ -183,18 +185,14 @@ static const enum power_supply_property ip5xxx_charger_properties[] = {
|
||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
|
||||
};
|
||||
|
||||
-static int ip5xxx_charger_get_status(struct ip5xxx *ip5xxx, int *val)
|
||||
+static int ip5xxx_battery_get_status(struct ip5xxx *ip5xxx, int *val)
|
||||
{
|
||||
unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_READ0, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_READ0, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
switch (rval & IP5XXX_READ0_CHG_STAT) {
|
||||
case IP5XXX_READ0_CHG_STAT_IDLE:
|
||||
@@ -219,19 +217,14 @@ static int ip5xxx_charger_get_status(struct ip5xxx *ip5xxx, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_get_charge_type(struct ip5xxx *ip5xxx, int *val)
|
||||
+static int ip5xxx_battery_get_charge_type(struct ip5xxx *ip5xxx, int *val)
|
||||
{
|
||||
unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_READ0, &rval);
|
||||
- if (ret) {
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
|
||||
- return 0;
|
||||
- }
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_READ0, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
switch (rval & IP5XXX_READ0_CHG_STAT) {
|
||||
case IP5XXX_READ0_CHG_STAT_IDLE:
|
||||
@@ -254,18 +247,14 @@ static int ip5xxx_charger_get_charge_type(struct ip5xxx *ip5xxx, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_get_health(struct ip5xxx *ip5xxx, int *val)
|
||||
+static int ip5xxx_battery_get_health(struct ip5xxx *ip5xxx, int *val)
|
||||
{
|
||||
unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_READ0, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = POWER_SUPPLY_HEALTH_GOOD;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_READ0, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
if (rval & IP5XXX_READ0_TIMEOUT)
|
||||
*val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
|
||||
@@ -275,18 +264,14 @@ static int ip5xxx_charger_get_health(struct ip5xxx *ip5xxx, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_get_voltage_max(struct ip5xxx *ip5xxx, int *val)
|
||||
+static int ip5xxx_battery_get_voltage_max(struct ip5xxx *ip5xxx, int *val)
|
||||
{
|
||||
unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_CHG_CTL2, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = 4200000;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_CHG_CTL2, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
/*
|
||||
* It is not clear what this will return if
|
||||
@@ -309,137 +294,93 @@ static int ip5xxx_charger_get_voltage_max(struct ip5xxx *ip5xxx, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_read_adc(struct ip5xxx *ip5xxx,
|
||||
+static int ip5xxx_battery_read_adc(struct ip5xxx *ip5xxx,
|
||||
u8 lo_reg, u8 hi_reg, int *val)
|
||||
{
|
||||
- unsigned hi, lo;
|
||||
+ unsigned int hi, lo;
|
||||
int ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, lo_reg, &lo);
|
||||
+ ret = ip5xxx_read(ip5xxx, lo_reg, &lo);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, hi_reg, &hi);
|
||||
+ ret = ip5xxx_read(ip5xxx, hi_reg, &hi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- if (hi & 0x20)
|
||||
- *val = -(int)((~lo & 0xff) + ((~hi & 0x1f) << 8) + 1);
|
||||
- else
|
||||
- *val = hi << 8 | lo;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int ip5xxx_charger_get_voltage_now(struct ip5xxx *ip5xxx, int *val)
|
||||
-{
|
||||
- int ret, raw;
|
||||
-
|
||||
- ret = ip5xxx_charger_read_adc(ip5xxx, IP5XXX_BATVADC_DAT0,
|
||||
- IP5XXX_BATVADC_DAT1, &raw);
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- *val = (2600 + DIV_ROUND_CLOSEST(raw * 1000, 3724)) * 1000;
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int ip5xxx_charger_get_current_now(struct ip5xxx *ip5xxx, int *val)
|
||||
-{
|
||||
- int ret, raw;
|
||||
-
|
||||
- ret = ip5xxx_charger_read_adc(ip5xxx, IP5XXX_BATIADC_DAT0,
|
||||
- IP5XXX_BATIADC_DAT1, &raw);
|
||||
- if (ret == -EXDEV) {
|
||||
- *val = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
+ *val = sign_extend32(hi << 8 | lo, 13);
|
||||
|
||||
- *val = DIV_ROUND_CLOSEST(raw * 1000, 1341) * 1000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_get_property(struct power_supply *psy,
|
||||
+static int ip5xxx_battery_get_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
{
|
||||
struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
- int raw, ret, vmax, cur, vol;
|
||||
+ int raw, ret, vmax;
|
||||
unsigned int rval;
|
||||
+ union power_supply_propval cur, vol;
|
||||
+
|
||||
+ ret = ip5xxx_initialize(psy);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
- return ip5xxx_charger_get_status(ip5xxx, &val->intval);
|
||||
+ return ip5xxx_battery_get_status(ip5xxx, &val->intval);
|
||||
|
||||
case POWER_SUPPLY_PROP_CHARGE_TYPE:
|
||||
- return ip5xxx_charger_get_charge_type(ip5xxx, &val->intval);
|
||||
-
|
||||
- case POWER_SUPPLY_PROP_PRESENT:
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_READ0, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
- val->intval = 1;
|
||||
- return 0;
|
||||
+ return ip5xxx_battery_get_charge_type(ip5xxx, &val->intval);
|
||||
|
||||
case POWER_SUPPLY_PROP_HEALTH:
|
||||
- return ip5xxx_charger_get_health(ip5xxx, &val->intval);
|
||||
+ return ip5xxx_battery_get_health(ip5xxx, &val->intval);
|
||||
|
||||
case POWER_SUPPLY_PROP_CAPACITY:
|
||||
- ret = ip5xxx_charger_get_voltage_now(ip5xxx, &vol);
|
||||
+ ret = ip5xxx_battery_get_property(psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &vol);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = ip5xxx_charger_get_current_now(ip5xxx, &cur);
|
||||
+ ret = ip5xxx_battery_get_property(psy, POWER_SUPPLY_PROP_CURRENT_NOW, &cur);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = power_supply_batinfo_ocv2cap(ip5xxx->bat, vol - cur * ip5xxx->r_int / 1000, 20);
|
||||
+ ret = power_supply_batinfo_ocv2cap(ip5xxx->bat,
|
||||
+ vol.intval - cur.intval * ip5xxx->r_int / 1000, 20);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
-
|
||||
+
|
||||
val->intval = ret;
|
||||
return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
|
||||
- return ip5xxx_charger_get_voltage_max(ip5xxx, &val->intval);
|
||||
+ return ip5xxx_battery_get_voltage_max(ip5xxx, &val->intval);
|
||||
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
|
||||
- return ip5xxx_charger_get_voltage_now(ip5xxx, &val->intval);
|
||||
+ ret = ip5xxx_battery_read_adc(ip5xxx, IP5XXX_BATVADC_DAT0,
|
||||
+ IP5XXX_BATVADC_DAT1, &raw);
|
||||
+
|
||||
+ val->intval = 2600000 + DIV_ROUND_CLOSEST(raw * 26855, 100);
|
||||
+ return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_OCV:
|
||||
- ret = ip5xxx_charger_read_adc(ip5xxx, IP5XXX_BATOCV_DAT0,
|
||||
+ ret = ip5xxx_battery_read_adc(ip5xxx, IP5XXX_BATOCV_DAT0,
|
||||
IP5XXX_BATOCV_DAT1, &raw);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
- return ret;
|
||||
- }
|
||||
|
||||
- val->intval = (2600 + DIV_ROUND_CLOSEST(raw * 1000, 3724)) * 1000;
|
||||
+ val->intval = 2600000 + DIV_ROUND_CLOSEST(raw * 26855, 100);
|
||||
return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||
- return ip5xxx_charger_get_current_now(ip5xxx, &val->intval);
|
||||
+ ret = ip5xxx_battery_read_adc(ip5xxx, IP5XXX_BATIADC_DAT0,
|
||||
+ IP5XXX_BATIADC_DAT1, &raw);
|
||||
+
|
||||
+ val->intval = DIV_ROUND_CLOSEST(raw * 745985, 1000);
|
||||
+ return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_CHG_CTL4A, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 0;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_CHG_CTL4A, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
rval &= IP5XXX_CHG_CTL4A_CONST_CUR_SEL;
|
||||
val->intval = 100000 * rval;
|
||||
@@ -450,28 +391,20 @@ static int ip5xxx_charger_get_property(struct power_supply *psy,
|
||||
return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
|
||||
- ret = ip5xxx_charger_get_voltage_max(ip5xxx, &vmax);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 4200000;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
- ret = regmap_read(ip5xxx->regmap, IP5XXX_CHG_CTL2, &rval);
|
||||
- if (ret == -EXDEV) {
|
||||
- val->intval = 4200000;
|
||||
- return 0;
|
||||
- } else if (ret) {
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_CHG_CTL2, &rval);
|
||||
+ if (ret)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
rval &= IP5XXX_CHG_CTL2_CONST_VOLT_SEL;
|
||||
val->intval = vmax + 14000 * (rval >> 1);
|
||||
return 0;
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
|
||||
- ret = ip5xxx_charger_get_voltage_max(ip5xxx, &vmax);
|
||||
+ ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -487,7 +420,7 @@ static int ip5xxx_charger_get_property(struct power_supply *psy,
|
||||
}
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_set_voltage_max(struct ip5xxx *ip5xxx, int val)
|
||||
+static int ip5xxx_battery_set_voltage_max(struct ip5xxx *ip5xxx, int val)
|
||||
{
|
||||
unsigned int rval;
|
||||
int ret;
|
||||
@@ -506,12 +439,12 @@ static int ip5xxx_charger_set_voltage_max(struct ip5xxx *ip5xxx, int val)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_CHG_CTL2,
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_CHG_CTL2,
|
||||
IP5XXX_CHG_CTL2_BAT_TYPE_SEL, rval);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_CHG_CTL4,
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_CHG_CTL4,
|
||||
IP5XXX_CHG_CTL4_BAT_TYPE_SEL_EN,
|
||||
IP5XXX_CHG_CTL4_BAT_TYPE_SEL_EN);
|
||||
if (ret)
|
||||
@@ -520,7 +453,7 @@ static int ip5xxx_charger_set_voltage_max(struct ip5xxx *ip5xxx, int val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_set_property(struct power_supply *psy,
|
||||
+static int ip5xxx_battery_set_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
const union power_supply_propval *val)
|
||||
{
|
||||
@@ -528,6 +461,10 @@ static int ip5xxx_charger_set_property(struct power_supply *psy,
|
||||
unsigned int rval;
|
||||
int ret, vmax;
|
||||
|
||||
+ ret = ip5xxx_initialize(psy);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
switch (val->intval) {
|
||||
@@ -541,24 +478,24 @@ static int ip5xxx_charger_set_property(struct power_supply *psy,
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
- return regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL0,
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL0,
|
||||
IP5XXX_SYS_CTL0_CHARGER_EN, rval);
|
||||
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
|
||||
- return ip5xxx_charger_set_voltage_max(ip5xxx, val->intval);
|
||||
+ return ip5xxx_battery_set_voltage_max(ip5xxx, val->intval);
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
|
||||
rval = val->intval / 100000;
|
||||
- return regmap_update_bits(ip5xxx->regmap, IP5XXX_CHG_CTL4A,
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_CHG_CTL4A,
|
||||
IP5XXX_CHG_CTL4A_CONST_CUR_SEL, rval);
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
|
||||
- ret = ip5xxx_charger_get_voltage_max(ip5xxx, &vmax);
|
||||
+ ret = ip5xxx_battery_get_voltage_max(ip5xxx, &vmax);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rval = ((val->intval - vmax) / 14000) << 1;
|
||||
- return regmap_update_bits(ip5xxx->regmap, IP5XXX_CHG_CTL2,
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_CHG_CTL2,
|
||||
IP5XXX_CHG_CTL2_CONST_VOLT_SEL, rval);
|
||||
|
||||
case POWER_SUPPLY_PROP_CALIBRATE:
|
||||
@@ -572,7 +509,7 @@ static int ip5xxx_charger_set_property(struct power_supply *psy,
|
||||
}
|
||||
}
|
||||
|
||||
-static int ip5xxx_charger_property_is_writeable(struct power_supply *psy,
|
||||
+static int ip5xxx_battery_property_is_writeable(struct power_supply *psy,
|
||||
enum power_supply_property psp)
|
||||
{
|
||||
return psp == POWER_SUPPLY_PROP_STATUS ||
|
||||
@@ -582,92 +519,106 @@ static int ip5xxx_charger_property_is_writeable(struct power_supply *psy,
|
||||
psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE;
|
||||
}
|
||||
|
||||
-static const struct power_supply_desc ip5xxx_charger_desc = {
|
||||
- .name = "ip5xxx-charger",
|
||||
+static const struct power_supply_desc ip5xxx_battery_desc = {
|
||||
+ .name = "ip5xxx-battery",
|
||||
.type = POWER_SUPPLY_TYPE_BATTERY,
|
||||
- .properties = ip5xxx_charger_properties,
|
||||
- .num_properties = ARRAY_SIZE(ip5xxx_charger_properties),
|
||||
- .get_property = ip5xxx_charger_get_property,
|
||||
- .set_property = ip5xxx_charger_set_property,
|
||||
- .property_is_writeable = ip5xxx_charger_property_is_writeable,
|
||||
+ .properties = ip5xxx_battery_properties,
|
||||
+ .num_properties = ARRAY_SIZE(ip5xxx_battery_properties),
|
||||
+ .get_property = ip5xxx_battery_get_property,
|
||||
+ .set_property = ip5xxx_battery_set_property,
|
||||
+ .property_is_writeable = ip5xxx_battery_property_is_writeable,
|
||||
};
|
||||
|
||||
-static const struct regmap_config ip5xxx_regmap_config = {
|
||||
- .reg_bits = 8,
|
||||
- .val_bits = 8,
|
||||
- .max_register = IP5XXX_BATOCV_DAT1,
|
||||
+static const enum power_supply_property ip5xxx_boost_properties[] = {
|
||||
+ POWER_SUPPLY_PROP_ONLINE,
|
||||
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
};
|
||||
|
||||
-static void ip5xxx_power_wd_work(struct work_struct *work)
|
||||
+static int ip5xxx_boost_get_property(struct power_supply *psy,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val)
|
||||
{
|
||||
- struct ip5xxx *ip5xxx = container_of(work, struct ip5xxx, wd_work.work);
|
||||
+ struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
+ unsigned int rval;
|
||||
int ret;
|
||||
|
||||
- if (ip5xxx->initialized) {
|
||||
- //XXX: perform some checks?
|
||||
- //- charger may reset some of its state when it's powered down
|
||||
- // by the user and not accessible
|
||||
- schedule_delayed_work(&ip5xxx->wd_work, msecs_to_jiffies(5000));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * Enable shutdown under light load.
|
||||
- * Disable power on when under load (wait until I2C is pulled up).
|
||||
- */
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL1,
|
||||
- IP5XXX_SYS_CTL1_LIGHT_SHDN_EN |
|
||||
- IP5XXX_SYS_CTL1_LOAD_PWRUP_EN,
|
||||
- IP5XXX_SYS_CTL1_LIGHT_SHDN_EN);
|
||||
+ ret = ip5xxx_initialize(psy);
|
||||
if (ret)
|
||||
- goto err;
|
||||
+ return ret;
|
||||
|
||||
- /*
|
||||
- * Enable shutdown after two short button presses within 1 second.
|
||||
- */
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL3,
|
||||
- IP5XXX_SYS_CTL3_BTN_SHDN_EN,
|
||||
- IP5XXX_SYS_CTL3_BTN_SHDN_EN);
|
||||
- if (ret)
|
||||
- goto err;
|
||||
+ switch (psp) {
|
||||
+ case POWER_SUPPLY_PROP_ONLINE:
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_SYS_CTL0, &rval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
- /*
|
||||
- * Disable power on when VIN is removed (wait until the phone is on).
|
||||
- */
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL4,
|
||||
- IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN |
|
||||
- IP5XXX_SYS_CTL4_SHDN_TIME_SEL, 0);
|
||||
- if (ret)
|
||||
- goto err;
|
||||
+ val->intval = !!(rval & IP5XXX_SYS_CTL0_BOOST_EN);
|
||||
+ return 0;
|
||||
|
||||
- /*
|
||||
- * Enable the NTC.
|
||||
- * Configure the button for two press => shutdown, long press => WLED.
|
||||
- */
|
||||
- ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL5,
|
||||
- IP5XXX_SYS_CTL5_NTC_EN |
|
||||
- IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
- IP5XXX_SYS_CTL5_BTN_SHDN_SEL, 0);
|
||||
- if (ret)
|
||||
- goto err;
|
||||
+ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
+ ret = ip5xxx_read(ip5xxx, IP5XXX_CHG_CTL1, &rval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
- ip5xxx->initialized = true;
|
||||
- schedule_delayed_work(&ip5xxx->wd_work, msecs_to_jiffies(5000));
|
||||
- dev_info(ip5xxx->dev, "Charger is initialized\n");
|
||||
- return;
|
||||
+ rval &= IP5XXX_CHG_CTL1_BOOST_UVP_SEL;
|
||||
+ val->intval = 4530000 + 100000 * (rval >> 2);
|
||||
+ return 0;
|
||||
|
||||
-err:
|
||||
- dev_err(ip5xxx->dev, "Failed to initialize the charger\n");
|
||||
- schedule_delayed_work(&ip5xxx->wd_work, msecs_to_jiffies(5000));
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
}
|
||||
|
||||
-static void ip5xxx_power_cleanup(void* data)
|
||||
+static int ip5xxx_boost_set_property(struct power_supply *psy,
|
||||
+ enum power_supply_property psp,
|
||||
+ const union power_supply_propval *val)
|
||||
{
|
||||
- struct ip5xxx *ip5xxx = data;
|
||||
+ struct ip5xxx *ip5xxx = power_supply_get_drvdata(psy);
|
||||
+ unsigned int rval;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ip5xxx_initialize(psy);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ switch (psp) {
|
||||
+ case POWER_SUPPLY_PROP_ONLINE:
|
||||
+ rval = val->intval ? IP5XXX_SYS_CTL0_BOOST_EN : 0;
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL0,
|
||||
+ IP5XXX_SYS_CTL0_BOOST_EN, rval);
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
+ rval = ((val->intval - 4530000) / 100000) << 2;
|
||||
+ return ip5xxx_update_bits(ip5xxx, IP5XXX_CHG_CTL1,
|
||||
+ IP5XXX_CHG_CTL1_BOOST_UVP_SEL, rval);
|
||||
|
||||
- cancel_delayed_work_sync(&ip5xxx->wd_work);
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
}
|
||||
|
||||
+static int ip5xxx_boost_property_is_writeable(struct power_supply *psy,
|
||||
+ enum power_supply_property psp)
|
||||
+{
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static const struct power_supply_desc ip5xxx_boost_desc = {
|
||||
+ .name = "ip5xxx-boost",
|
||||
+ .type = POWER_SUPPLY_TYPE_USB,
|
||||
+ .properties = ip5xxx_boost_properties,
|
||||
+ .num_properties = ARRAY_SIZE(ip5xxx_boost_properties),
|
||||
+ .get_property = ip5xxx_boost_get_property,
|
||||
+ .set_property = ip5xxx_boost_set_property,
|
||||
+ .property_is_writeable = ip5xxx_boost_property_is_writeable,
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_config ip5xxx_regmap_config = {
|
||||
+ .reg_bits = 8,
|
||||
+ .val_bits = 8,
|
||||
+ .max_register = IP5XXX_BATOCV_DAT1,
|
||||
+};
|
||||
+
|
||||
int ip5xxx_power_probe_with_regmap(struct device* dev, struct regmap *regmap)
|
||||
{
|
||||
struct power_supply_config psy_cfg = {};
|
||||
@@ -679,28 +630,19 @@ int ip5xxx_power_probe_with_regmap(struct device* dev, struct regmap *regmap)
|
||||
if (!ip5xxx)
|
||||
return -ENOMEM;
|
||||
|
||||
- ip5xxx->dev = dev;
|
||||
ip5xxx->regmap = regmap;
|
||||
- INIT_DELAYED_WORK(&ip5xxx->wd_work, ip5xxx_power_wd_work);
|
||||
|
||||
psy_cfg.of_node = dev->of_node;
|
||||
psy_cfg.drv_data = ip5xxx;
|
||||
|
||||
- psy = devm_power_supply_register(dev, &ip5xxx_boost_desc, &psy_cfg);
|
||||
+ psy = devm_power_supply_register(dev, &ip5xxx_battery_desc, &psy_cfg);
|
||||
if (IS_ERR(psy))
|
||||
return PTR_ERR(psy);
|
||||
|
||||
- psy = devm_power_supply_register(dev, &ip5xxx_charger_desc, &psy_cfg);
|
||||
+ psy = devm_power_supply_register(dev, &ip5xxx_boost_desc, &psy_cfg);
|
||||
if (IS_ERR(psy))
|
||||
return PTR_ERR(psy);
|
||||
|
||||
- ret = devm_add_action(dev, ip5xxx_power_cleanup, ip5xxx);
|
||||
- if (ret) {
|
||||
- ip5xxx_power_cleanup(ip5xxx);
|
||||
- dev_err(dev, "Failed to add cleanup action (%d)\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
ret = power_supply_get_battery_info(psy, &ip5xxx->bat);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to get battery info\n");
|
||||
@@ -710,8 +652,6 @@ int ip5xxx_power_probe_with_regmap(struct device* dev, struct regmap *regmap)
|
||||
else
|
||||
ip5xxx->r_int = 187;
|
||||
|
||||
- schedule_delayed_work(&ip5xxx->wd_work, msecs_to_jiffies(500));
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip5xxx_power_probe_with_regmap);
|
||||
@@ -746,5 +686,5 @@ static struct i2c_driver ip5xxx_power_driver = {
|
||||
module_i2c_driver(ip5xxx_power_driver);
|
||||
|
||||
MODULE_AUTHOR("Samuel Holland <samuel@sholland.org>");
|
||||
-MODULE_DESCRIPTION("Injoinic IP5xxx power supply driver");
|
||||
+MODULE_DESCRIPTION("Injoinic IP5xxx power bank IC driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
From d52563f9c5308a9439a2cc3511c56c3c9b16960c Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 03:15:45 +0200
|
||||
Subject: [PATCH 522/544] power: supply: ip5xxx: Modify initial configuration
|
||||
|
||||
- double press to power off
|
||||
- disable auto-power on under load
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index d3af6f2ae4a3..f55fe505ebbf 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -121,6 +121,16 @@ static int ip5xxx_initialize(struct power_supply *psy)
|
||||
if (ip5xxx->initialized)
|
||||
return 0;
|
||||
|
||||
+ /*
|
||||
+ * Disable flashlight feature.
|
||||
+ */
|
||||
+ ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL0,
|
||||
+ IP5XXX_SYS_CTL0_WLED_DET_EN |
|
||||
+ IP5XXX_SYS_CTL0_WLED_EN,
|
||||
+ 0);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
/*
|
||||
* Disable shutdown under light load.
|
||||
* Enable power on when under load.
|
||||
@@ -128,12 +138,12 @@ static int ip5xxx_initialize(struct power_supply *psy)
|
||||
ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL1,
|
||||
IP5XXX_SYS_CTL1_LIGHT_SHDN_EN |
|
||||
IP5XXX_SYS_CTL1_LOAD_PWRUP_EN,
|
||||
- IP5XXX_SYS_CTL1_LOAD_PWRUP_EN);
|
||||
+ 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
- * Enable shutdown after a long button press (as configured below).
|
||||
+ * Enable shutdown after a double press (as configured below).
|
||||
*/
|
||||
ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL3,
|
||||
IP5XXX_SYS_CTL3_BTN_SHDN_EN,
|
||||
@@ -142,7 +152,7 @@ static int ip5xxx_initialize(struct power_supply *psy)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
- * Power on automatically when VIN is removed.
|
||||
+ * Don't power on automatically when VIN is removed.
|
||||
*/
|
||||
ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL4,
|
||||
IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN,
|
||||
@@ -152,14 +162,12 @@ static int ip5xxx_initialize(struct power_supply *psy)
|
||||
|
||||
/*
|
||||
* Enable the NTC.
|
||||
- * Configure the button for two presses => LED, long press => shutdown.
|
||||
+ * Configure the button for two presses => shutdown, long press => LED.
|
||||
*/
|
||||
ret = ip5xxx_update_bits(ip5xxx, IP5XXX_SYS_CTL5,
|
||||
IP5XXX_SYS_CTL5_NTC_DIS |
|
||||
IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
- IP5XXX_SYS_CTL5_BTN_SHDN_SEL,
|
||||
- IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
- IP5XXX_SYS_CTL5_BTN_SHDN_SEL);
|
||||
+ IP5XXX_SYS_CTL5_BTN_SHDN_SEL, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From d81a784be91a1a6f156b919dc4273eae386868de Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 26 Mar 2022 23:02:47 +0100
|
||||
Subject: [PATCH 457/544] power: supply: ip5xxx: Re-configure IP5209 for finaly
|
||||
keyboard
|
||||
|
||||
- Enable auto-poweroff
|
||||
- 8s power off button time
|
||||
- double press to power off
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/ip5xxx_power.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/power/supply/ip5xxx_power.c b/drivers/power/supply/ip5xxx_power.c
|
||||
index 04c055ae3c2e..31bc56d9333a 100644
|
||||
--- a/drivers/power/supply/ip5xxx_power.c
|
||||
+++ b/drivers/power/supply/ip5xxx_power.c
|
||||
@@ -612,12 +612,13 @@ static void ip5xxx_power_wd_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
/*
|
||||
- * Disable shutdown under light load (it turns off the keyboard).
|
||||
+ * Enable shutdown under light load.
|
||||
* Disable power on when under load (wait until I2C is pulled up).
|
||||
*/
|
||||
ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL1,
|
||||
IP5XXX_SYS_CTL1_LIGHT_SHDN_EN |
|
||||
- IP5XXX_SYS_CTL1_LOAD_PWRUP_EN, 0);
|
||||
+ IP5XXX_SYS_CTL1_LOAD_PWRUP_EN,
|
||||
+ IP5XXX_SYS_CTL1_LIGHT_SHDN_EN);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
@@ -634,20 +635,19 @@ static void ip5xxx_power_wd_work(struct work_struct *work)
|
||||
* Disable power on when VIN is removed (wait until the phone is on).
|
||||
*/
|
||||
ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL4,
|
||||
- IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN, 0);
|
||||
+ IP5XXX_SYS_CTL4_VIN_PULLOUT_BOOST_EN |
|
||||
+ IP5XXX_SYS_CTL4_SHDN_TIME_SEL, 0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* Enable the NTC.
|
||||
- * Configure the button for two press => LED, long press => shutdown.
|
||||
+ * Configure the button for two press => shutdown, long press => WLED.
|
||||
*/
|
||||
ret = regmap_update_bits(ip5xxx->regmap, IP5XXX_SYS_CTL5,
|
||||
IP5XXX_SYS_CTL5_NTC_EN |
|
||||
IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
- IP5XXX_SYS_CTL5_BTN_SHDN_SEL,
|
||||
- IP5XXX_SYS_CTL5_WLED_MODE_SEL |
|
||||
- IP5XXX_SYS_CTL5_BTN_SHDN_SEL);
|
||||
+ IP5XXX_SYS_CTL5_BTN_SHDN_SEL, 0);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,287 @@
|
||||
From 1c0aca3ad7e85a7583334bf0b42bf4f507feca8a Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sat, 2 Apr 2022 02:45:47 +0200
|
||||
Subject: [PATCH 526/544] power: supply: rk818-charger: Unify rk818-charger and
|
||||
rk818-battery
|
||||
|
||||
The BSP driver is still used, but there is now a one device handling
|
||||
the battery/charger properties, which should confuse the userspace
|
||||
less. This also makes writing a power manager for the keyboard easier.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
---
|
||||
drivers/power/supply/Kconfig | 8 ---
|
||||
drivers/power/supply/Makefile | 3 +-
|
||||
drivers/power/supply/rk818_battery.c | 38 +++++++++++---
|
||||
drivers/power/supply/rk818_charger.c | 77 +++++++++++++++++++++++-----
|
||||
4 files changed, 95 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
|
||||
index 86a11b2bff3b..1e64406ad955 100644
|
||||
--- a/drivers/power/supply/Kconfig
|
||||
+++ b/drivers/power/supply/Kconfig
|
||||
@@ -874,14 +874,6 @@ config CHARGER_SURFACE
|
||||
Microsoft Surface devices, i.e. Surface Pro 7, Surface Laptop 3,
|
||||
Surface Book 3, and Surface Laptop Go.
|
||||
|
||||
-config BATTERY_RK818
|
||||
- bool "RK818 Battery driver"
|
||||
- depends on MFD_RK808
|
||||
- default n
|
||||
- help
|
||||
- If you say yes here you will get support for the battery of RK818 PMIC.
|
||||
- This driver can give support for Rk818 Battery Charge Interface.
|
||||
-
|
||||
config CHARGER_RK818
|
||||
bool "RK818 Charger driver"
|
||||
depends on MFD_RK808
|
||||
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
|
||||
index bc81f2bfe206..37aeffae2c05 100644
|
||||
--- a/drivers/power/supply/Makefile
|
||||
+++ b/drivers/power/supply/Makefile
|
||||
@@ -106,5 +106,4 @@ obj-$(CONFIG_RN5T618_POWER) += rn5t618_power.o
|
||||
obj-$(CONFIG_BATTERY_ACER_A500) += acer_a500_battery.o
|
||||
obj-$(CONFIG_BATTERY_SURFACE) += surface_battery.o
|
||||
obj-$(CONFIG_CHARGER_SURFACE) += surface_charger.o
|
||||
-obj-$(CONFIG_BATTERY_RK818) += rk818_battery.o
|
||||
-obj-$(CONFIG_CHARGER_RK818) += rk818_charger.o
|
||||
+obj-$(CONFIG_CHARGER_RK818) += rk818_charger.o rk818_battery.o
|
||||
diff --git a/drivers/power/supply/rk818_battery.c b/drivers/power/supply/rk818_battery.c
|
||||
index 741195e77da6..0e318786135f 100644
|
||||
--- a/drivers/power/supply/rk818_battery.c
|
||||
+++ b/drivers/power/supply/rk818_battery.c
|
||||
@@ -898,12 +898,10 @@ static int rk818_bat_get_charge_state(struct rk818_battery *di)
|
||||
return di->current_avg > 0;
|
||||
}
|
||||
|
||||
-static int rk818_battery_get_property(struct power_supply *psy,
|
||||
- enum power_supply_property psp,
|
||||
- union power_supply_propval *val)
|
||||
+int rk818_battery_get_property(struct rk818_battery *di,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val)
|
||||
{
|
||||
- struct rk818_battery *di = power_supply_get_drvdata(psy);
|
||||
-
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||
val->intval = di->current_avg * 1000;/*uA*/
|
||||
@@ -962,16 +960,26 @@ static int rk818_battery_get_property(struct power_supply *psy,
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(rk818_battery_get_property);
|
||||
+
|
||||
+static int rk818_battery_get_property_psy(struct power_supply *psy,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val)
|
||||
+{
|
||||
+ struct rk818_battery *di = power_supply_get_drvdata(psy);
|
||||
+
|
||||
+ return rk818_battery_get_property(di, psp, val);
|
||||
+}
|
||||
|
||||
static const struct power_supply_desc rk818_bat_desc = {
|
||||
.name = "battery",
|
||||
.type = POWER_SUPPLY_TYPE_BATTERY,
|
||||
.properties = rk818_bat_props,
|
||||
.num_properties = ARRAY_SIZE(rk818_bat_props),
|
||||
- .get_property = rk818_battery_get_property,
|
||||
+ .get_property = rk818_battery_get_property_psy,
|
||||
};
|
||||
|
||||
-static int rk818_bat_init_power_supply(struct rk818_battery *di)
|
||||
+static __maybe_unused int rk818_bat_init_power_supply(struct rk818_battery *di)
|
||||
{
|
||||
struct power_supply_config psy_cfg = { .drv_data = di, };
|
||||
|
||||
@@ -2451,7 +2459,10 @@ static void rk818_bat_power_supply_changed(struct rk818_battery *di)
|
||||
status = (status & CHRG_STATUS_MSK) >> 4;
|
||||
old_soc = di->dsoc;
|
||||
di->last_dsoc = di->dsoc;
|
||||
- power_supply_changed(di->bat);
|
||||
+
|
||||
+ if (di->bat)
|
||||
+ power_supply_changed(di->bat);
|
||||
+
|
||||
BAT_INFO("changed: dsoc=%d, rsoc=%d, v=%d, ov=%d c=%d, "
|
||||
"cap=%d, f=%d, st=%s, hotdie=%d\n",
|
||||
di->dsoc, di->rsoc, di->voltage_avg, di->voltage_ocv,
|
||||
@@ -3282,6 +3293,14 @@ static const struct of_device_id rk818_battery_of_match[] = {
|
||||
{ },
|
||||
};
|
||||
|
||||
+static struct rk818_battery* bat;
|
||||
+
|
||||
+struct rk818_battery* rk818_battery_get(void)
|
||||
+{
|
||||
+ return bat;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rk818_battery_get);
|
||||
+
|
||||
static int rk818_battery_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct of_device_id *of_id =
|
||||
@@ -3322,11 +3341,13 @@ static int rk818_battery_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ /*
|
||||
ret = rk818_bat_init_power_supply(di);
|
||||
if (ret) {
|
||||
dev_err(di->dev, "rk818 power supply register failed!\n");
|
||||
return ret;
|
||||
}
|
||||
+ */
|
||||
|
||||
rk818_bat_init_info(di);
|
||||
rk818_bat_init_fg(di);
|
||||
@@ -3341,6 +3362,7 @@ static int rk818_battery_probe(struct platform_device *pdev)
|
||||
|
||||
BAT_INFO("driver version %s\n", DRIVER_VERSION);
|
||||
|
||||
+ bat = di;
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff --git a/drivers/power/supply/rk818_charger.c b/drivers/power/supply/rk818_charger.c
|
||||
index d4ed7b1d558a..e72dab9755d9 100644
|
||||
--- a/drivers/power/supply/rk818_charger.c
|
||||
+++ b/drivers/power/supply/rk818_charger.c
|
||||
@@ -342,14 +342,36 @@ static int rk818_charger_get_voltage_max(struct rk818_charger *cg, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+struct rk818_battery;
|
||||
+struct rk818_battery* rk818_battery_get(void);
|
||||
+int rk818_battery_get_property(struct rk818_battery *di,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val);
|
||||
+
|
||||
static int rk818_charger_get_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
{
|
||||
struct rk818_charger *cg = power_supply_get_drvdata(psy);
|
||||
+ struct rk818_battery* di = rk818_battery_get();
|
||||
unsigned reg;
|
||||
int ret;
|
||||
|
||||
+ switch (psp) {
|
||||
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||
+ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
|
||||
+ case POWER_SUPPLY_PROP_PRESENT:
|
||||
+ case POWER_SUPPLY_PROP_CAPACITY:
|
||||
+ case POWER_SUPPLY_PROP_TEMP:
|
||||
+ case POWER_SUPPLY_PROP_STATUS:
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_COUNTER:
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_FULL:
|
||||
+ if (!di)
|
||||
+ return -ENODEV;
|
||||
+ return rk818_battery_get_property(di, psp, val);
|
||||
+ default:;
|
||||
+ }
|
||||
+
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_ONLINE:
|
||||
ret = regmap_read(cg->regmap, RK818_CHRG_CTRL_REG1, ®);
|
||||
@@ -361,6 +383,20 @@ static int rk818_charger_get_property(struct power_supply *psy,
|
||||
val->intval = !!(reg & RK818_CHRG_CTRL_REG1_CHRG_EN);
|
||||
break;
|
||||
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
+ ret = regmap_read(cg->regmap, RK818_CHRG_CTRL_REG1, ®);
|
||||
+ if (ret) {
|
||||
+ dev_err(cg->dev, "failed to read the charger state (%d)\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (reg & RK818_CHRG_CTRL_REG1_CHRG_EN)
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO;
|
||||
+ else
|
||||
+ val->intval = POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
ret = regmap_read(cg->regmap, RK818_SUP_STS_REG, ®);
|
||||
if (ret)
|
||||
@@ -467,14 +503,20 @@ static int rk818_charger_set_property(struct power_supply *psy,
|
||||
int ret;
|
||||
|
||||
switch (psp) {
|
||||
- case POWER_SUPPLY_PROP_ONLINE:
|
||||
- ret = regmap_update_bits(cg->regmap, RK818_CHRG_CTRL_REG1,
|
||||
- RK818_CHRG_CTRL_REG1_CHRG_EN,
|
||||
- val->intval ? RK818_CHRG_CTRL_REG1_CHRG_EN : 0);
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
if (ret)
|
||||
dev_err(cg->dev, "failed to setup the charger (%d)\n", ret);
|
||||
-
|
||||
- return ret;
|
||||
+ switch (val->intval) {
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO:
|
||||
+ return regmap_update_bits(cg->regmap, RK818_CHRG_CTRL_REG1,
|
||||
+ RK818_CHRG_CTRL_REG1_CHRG_EN,
|
||||
+ RK818_CHRG_CTRL_REG1_CHRG_EN);
|
||||
+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE:
|
||||
+ return regmap_update_bits(cg->regmap, RK818_CHRG_CTRL_REG1,
|
||||
+ RK818_CHRG_CTRL_REG1_CHRG_EN, 0);
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
|
||||
return rk818_charger_set_voltage_max(cg, val->intval);
|
||||
@@ -493,7 +535,7 @@ static int rk818_charger_prop_writeable(struct power_supply *psy,
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
|
||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
|
||||
- case POWER_SUPPLY_PROP_ONLINE:
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
|
||||
return 1;
|
||||
|
||||
default:
|
||||
@@ -505,6 +547,7 @@ static enum power_supply_property rk818_charger_props[] = {
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
POWER_SUPPLY_PROP_HEALTH,
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR,
|
||||
POWER_SUPPLY_PROP_CHARGE_TYPE,
|
||||
POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
|
||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
|
||||
@@ -512,17 +555,25 @@ static enum power_supply_property rk818_charger_props[] = {
|
||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
|
||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
|
||||
POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
|
||||
+
|
||||
+ // inherited from BSP battery driver
|
||||
+ POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
+ POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
+ POWER_SUPPLY_PROP_PRESENT,
|
||||
+ POWER_SUPPLY_PROP_CAPACITY,
|
||||
+ POWER_SUPPLY_PROP_TEMP,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_COUNTER,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_FULL,
|
||||
};
|
||||
|
||||
/*
|
||||
- * TODO: This functionality should be in a battery driver/supply, but that one
|
||||
- * is such a mess, I don't want to touch it now. Let's have a separate supply
|
||||
- * for controlling the charger for now, and a prayer for the poor soul that
|
||||
- * will have to understand and clean up the battery driver.
|
||||
+ * We import some capacity tracking functionality from the BSP battery driver.
|
||||
+ * Some poor soul will have to understand and clean up the BSP battery driver,
|
||||
+ * but not me, not now. :)
|
||||
*/
|
||||
static const struct power_supply_desc rk818_charger_desc = {
|
||||
- .name = "rk818-charger",
|
||||
- .type = POWER_SUPPLY_TYPE_MAINS,
|
||||
+ .name = "rk818-battery",
|
||||
+ .type = POWER_SUPPLY_TYPE_BATTERY,
|
||||
.properties = rk818_charger_props,
|
||||
.num_properties = ARRAY_SIZE(rk818_charger_props),
|
||||
.property_is_writeable = rk818_charger_prop_writeable,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
From d13f20eb97f3ef25febacac97e808d6c7a16966c Mon Sep 17 00:00:00 2001
|
||||
From: Chin-Yen Lee <timlee@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:50 +0800
|
||||
Subject: [PATCH 458/544] rtw88: 8822ce: add support for TX/RX 1ss mode
|
||||
|
||||
In some case, wifi chip need to be configed to be TX/RX 1ss mode.
|
||||
For this mode, wifi components, such as MAC/BB/RF, need to be
|
||||
specially set, and driver need to send SMPS action frame to inform AP.
|
||||
|
||||
Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/debug.c | 4 ++-
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 33 ++++++++++++++++++-
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 5 ++-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/tx.c | 2 +-
|
||||
5 files changed, 41 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
index e429428232c1..03a08137066f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
@@ -715,8 +715,10 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
|
||||
seq_printf(m, "Current CH(fc) = %u\n", rtwdev->hal.current_channel);
|
||||
seq_printf(m, "Current BW = %u\n", rtwdev->hal.current_band_width);
|
||||
seq_printf(m, "Current IGI = 0x%x\n", dm_info->igi_history[0]);
|
||||
- seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n\n",
|
||||
+ seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n",
|
||||
stats->tx_throughput, stats->rx_throughput);
|
||||
+ seq_printf(m, "1SS for TX and RX = %c\n\n", rtwdev->hal.txrx_1ss ?
|
||||
+ 'Y' : 'N');
|
||||
|
||||
seq_puts(m, "==========[Tx Phy Info]========\n");
|
||||
seq_puts(m, "[Tx Rate] = ");
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 2757aa0dc586..41b6db422638 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1135,7 +1135,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
||||
ldpc_en = HT_LDPC_EN;
|
||||
}
|
||||
|
||||
- if (efuse->hw_cap.nss == 1)
|
||||
+ if (efuse->hw_cap.nss == 1 || rtwdev->hal.txrx_1ss)
|
||||
ra_mask &= RA_MASK_VHT_RATES_1SS | RA_MASK_HT_RATES_1SS;
|
||||
|
||||
if (hal->current_band_type == RTW_BAND_5G) {
|
||||
@@ -1570,6 +1570,37 @@ static void rtw_unset_supported_band(struct ieee80211_hw *hw,
|
||||
kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]);
|
||||
}
|
||||
|
||||
+static void rtw_vif_smps_iter(void *data, u8 *mac,
|
||||
+ struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = (struct rtw_dev *)data;
|
||||
+
|
||||
+ if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc)
|
||||
+ return;
|
||||
+
|
||||
+ if (rtwdev->hal.txrx_1ss)
|
||||
+ ieee80211_request_smps(vif, IEEE80211_SMPS_STATIC);
|
||||
+ else
|
||||
+ ieee80211_request_smps(vif, IEEE80211_SMPS_OFF);
|
||||
+}
|
||||
+
|
||||
+void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool txrx_1ss)
|
||||
+{
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_hal *hal = &rtwdev->hal;
|
||||
+
|
||||
+ if (!chip->ops->config_txrx_mode || rtwdev->hal.txrx_1ss == txrx_1ss)
|
||||
+ return;
|
||||
+
|
||||
+ rtwdev->hal.txrx_1ss = txrx_1ss;
|
||||
+ if (txrx_1ss)
|
||||
+ chip->ops->config_txrx_mode(rtwdev, BB_PATH_A, BB_PATH_A, false);
|
||||
+ else
|
||||
+ chip->ops->config_txrx_mode(rtwdev, hal->antenna_tx,
|
||||
+ hal->antenna_rx, false);
|
||||
+ rtw_iterate_vifs_atomic(rtwdev, rtw_vif_smps_iter, rtwdev);
|
||||
+}
|
||||
+
|
||||
static void __update_firmware_feature(struct rtw_dev *rtwdev,
|
||||
struct rtw_fw_state *fw)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 36e1e408933d..970d29d19003 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -874,6 +874,8 @@ struct rtw_chip_ops {
|
||||
enum rtw_bb_path tx_path_1ss,
|
||||
enum rtw_bb_path tx_path_cck,
|
||||
bool is_tx2_path);
|
||||
+ void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path,
|
||||
+ u8 rx_path, bool is_tx2_path);
|
||||
|
||||
/* for coex */
|
||||
void (*coex_set_init)(struct rtw_dev *rtwdev);
|
||||
@@ -1867,6 +1869,7 @@ struct rtw_hal {
|
||||
u32 antenna_tx;
|
||||
u32 antenna_rx;
|
||||
u8 bfee_sts_cap;
|
||||
+ bool txrx_1ss;
|
||||
|
||||
/* protect tx power section */
|
||||
struct mutex tx_power_mutex;
|
||||
@@ -2123,5 +2126,5 @@ void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
|
||||
int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
|
||||
u32 fwcd_item);
|
||||
int rtw_dump_reg(struct rtw_dev *rtwdev, const u32 addr, const u32 size);
|
||||
-
|
||||
+void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss);
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 35c46e5209de..01bb356b4b65 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4962,6 +4962,7 @@ static struct rtw_chip_ops rtw8822c_ops = {
|
||||
.cfo_init = rtw8822c_cfo_init,
|
||||
.cfo_track = rtw8822c_cfo_track,
|
||||
.config_tx_path = rtw8822c_config_tx_path,
|
||||
+ .config_txrx_mode = rtw8822c_config_trx_mode,
|
||||
|
||||
.coex_set_init = rtw8822c_coex_cfg_init,
|
||||
.coex_set_ant_switch = NULL,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
index efcc1b0371a8..94d1089f4022 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
@@ -353,7 +353,7 @@ static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
|
||||
bw = si->bw_mode;
|
||||
rate_id = si->rate_id;
|
||||
- stbc = si->stbc_en;
|
||||
+ stbc = rtwdev->hal.txrx_1ss ? false : si->stbc_en;
|
||||
ldpc = si->ldpc_en;
|
||||
|
||||
out:
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From e2f25929ca0609f36708cafd15ecea497b886616 Mon Sep 17 00:00:00 2001
|
||||
From: Muhammad Usama Anjum <usama.anjum@collabora.com>
|
||||
Date: Fri, 21 Jan 2022 15:08:11 +0800
|
||||
Subject: [PATCH 430/456] rtw88: check for validity before using a pointer
|
||||
|
||||
ieee80211_probereq_get() can return NULL. Pointer skb should be checked
|
||||
for validty before use. If it is not valid, list of skbs needs to be
|
||||
freed.
|
||||
|
||||
Fixes: 10d162b2ed39 ("rtw88: 8822c: add ieee80211_ops::hw_scan")
|
||||
Signed-off-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220121070813.9656-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index 2f7c036f9022..b56dc43229d2 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -1866,11 +1866,19 @@ static int rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev,
|
||||
req->ssids[i].ssid,
|
||||
req->ssids[i].ssid_len,
|
||||
req->ie_len);
|
||||
+ if (!skb)
|
||||
+ goto out;
|
||||
rtw_append_probe_req_ie(rtwdev, skb, &list, rtwvif);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
return _rtw_hw_scan_update_probe_req(rtwdev, num, &list);
|
||||
+
|
||||
+out:
|
||||
+ skb_queue_walk(&list, skb)
|
||||
+ kfree_skb(skb);
|
||||
+
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
static int rtw_add_chan_info(struct rtw_dev *rtwdev, struct rtw_chan_info *info,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,379 @@
|
||||
From b431dda9c53a8d093f0c1ae9b084c2f585a34ea5 Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:54 +0800
|
||||
Subject: [PATCH 462/544] rtw88: coex: Add C2H/H2C handshake with BT mailbox
|
||||
for asking HID Info
|
||||
|
||||
In order to recognize the gaming controller HID, make a C2H/H2C/Mailbox
|
||||
handshake to collect all the connected information from BT.
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-6-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 150 ++++++++++++++++++++--
|
||||
drivers/net/wireless/realtek/rtw88/coex.h | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 15 +++
|
||||
drivers/net/wireless/realtek/rtw88/fw.h | 9 ++
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 40 ++++++
|
||||
6 files changed, 206 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 632151f081a5..cac053f485c3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -2375,6 +2375,7 @@ static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
if (coex->under_5g)
|
||||
@@ -2383,7 +2384,6 @@ static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
|
||||
rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
|
||||
- rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
|
||||
|
||||
if (efuse->share_ant) {
|
||||
/* Shared-Ant */
|
||||
@@ -2395,6 +2395,16 @@ static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
|
||||
tdma_case = 100;
|
||||
}
|
||||
|
||||
+ if (coex_stat->bt_game_hid_exist) {
|
||||
+ coex_stat->wl_coex_mode = COEX_WLINK_2GFREE;
|
||||
+ if (coex_stat->wl_tput_dir == COEX_WL_TPUT_TX)
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_tx[6]);
|
||||
+ else
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[5]);
|
||||
+ } else {
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
|
||||
+ }
|
||||
+
|
||||
rtw_coex_table(rtwdev, false, table_case);
|
||||
rtw_coex_tdma(rtwdev, false, tdma_case);
|
||||
}
|
||||
@@ -3249,20 +3259,138 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
coex_stat->bt_a2dp_bitpool = 0;
|
||||
|
||||
coex_stat->bt_a2dp_sink = ((coex_stat->bt_info_hb3 & BIT(7)) == BIT(7));
|
||||
- if (chip->wl_mimo_ps_support && !coex_stat->bt_inq_page) {
|
||||
- if ((coex_stat->bt_info_lb2 & COEX_INFO_CONNECTION) &&
|
||||
- (coex_stat->hi_pri_tx + coex_stat->hi_pri_rx >
|
||||
- COEX_BT_GAMEHID_CNT) && !coex_stat->bt_slave) {
|
||||
- coex_stat->bt_game_hid_exist = true;
|
||||
- rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
- "[BTCoex], BT game controller exisit!!\n");
|
||||
+
|
||||
+ rtw_coex_update_bt_link_info(rtwdev);
|
||||
+ rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
|
||||
+}
|
||||
+
|
||||
+#define COEX_BT_HIDINFO_MTK 0x46
|
||||
+static const u8 coex_bt_hidinfo_ps[] = {0x57, 0x69, 0x72};
|
||||
+static const u8 coex_bt_hidinfo_xb[] = {0x58, 0x62, 0x6f};
|
||||
+
|
||||
+void rtw_coex_bt_hid_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
+{
|
||||
+ struct rtw_coex *coex = &rtwdev->coex;
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
+ struct rtw_coex_hid *hidinfo;
|
||||
+ struct rtw_coex_hid_info_a *hida;
|
||||
+ struct rtw_coex_hid_handle_list *hl, *bhl;
|
||||
+ u8 sub_id = buf[2], gamehid_cnt = 0, handle, i;
|
||||
+ bool cur_game_hid_exist, complete;
|
||||
+
|
||||
+ if (!chip->wl_mimo_ps_support &&
|
||||
+ (sub_id == COEX_BT_HIDINFO_LIST || sub_id == COEX_BT_HIDINFO_A))
|
||||
+ return;
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
+ "[BTCoex], HID info notify, sub_id = 0x%x\n", sub_id);
|
||||
+
|
||||
+ switch (sub_id) {
|
||||
+ case COEX_BT_HIDINFO_LIST:
|
||||
+ hl = &coex_stat->hid_handle_list;
|
||||
+ bhl = (struct rtw_coex_hid_handle_list *)buf;
|
||||
+ if (!memcmp(hl, bhl, sizeof(*hl)))
|
||||
+ return;
|
||||
+ coex_stat->hid_handle_list = *bhl;
|
||||
+ memset(&coex_stat->hid_info, 0, sizeof(coex_stat->hid_info));
|
||||
+ for (i = 0; i < COEX_BT_HIDINFO_HANDLE_NUM; i++) {
|
||||
+ hidinfo = &coex_stat->hid_info[i];
|
||||
+ if (hl->handle[i] != COEX_BT_HIDINFO_NOTCON &&
|
||||
+ hl->handle[i] != 0)
|
||||
+ hidinfo->hid_handle = hl->handle[i];
|
||||
+ }
|
||||
+ break;
|
||||
+ case COEX_BT_HIDINFO_A:
|
||||
+ hida = (struct rtw_coex_hid_info_a *)buf;
|
||||
+ handle = hida->handle;
|
||||
+ for (i = 0; i < COEX_BT_HIDINFO_HANDLE_NUM; i++) {
|
||||
+ hidinfo = &coex_stat->hid_info[i];
|
||||
+ if (hidinfo->hid_handle == handle) {
|
||||
+ hidinfo->hid_vendor = hida->vendor;
|
||||
+ memcpy(hidinfo->hid_name, hida->name,
|
||||
+ sizeof(hidinfo->hid_name));
|
||||
+ hidinfo->hid_info_completed = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ for (i = 0; i < COEX_BT_HIDINFO_HANDLE_NUM; i++) {
|
||||
+ hidinfo = &coex_stat->hid_info[i];
|
||||
+ complete = hidinfo->hid_info_completed;
|
||||
+ handle = hidinfo->hid_handle;
|
||||
+ if (!complete || handle == COEX_BT_HIDINFO_NOTCON ||
|
||||
+ handle == 0 || handle >= COEX_BT_BLE_HANDLE_THRS) {
|
||||
+ hidinfo->is_game_hid = false;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (hidinfo->hid_vendor == COEX_BT_HIDINFO_MTK) {
|
||||
+ if ((memcmp(hidinfo->hid_name,
|
||||
+ coex_bt_hidinfo_ps,
|
||||
+ COEX_BT_HIDINFO_NAME)) == 0)
|
||||
+ hidinfo->is_game_hid = true;
|
||||
+ else if ((memcmp(hidinfo->hid_name,
|
||||
+ coex_bt_hidinfo_xb,
|
||||
+ COEX_BT_HIDINFO_NAME)) == 0)
|
||||
+ hidinfo->is_game_hid = true;
|
||||
+ else
|
||||
+ hidinfo->is_game_hid = false;
|
||||
} else {
|
||||
- coex_stat->bt_game_hid_exist = false;
|
||||
+ hidinfo->is_game_hid = false;
|
||||
}
|
||||
+ if (hidinfo->is_game_hid)
|
||||
+ gamehid_cnt++;
|
||||
}
|
||||
|
||||
- rtw_coex_update_bt_link_info(rtwdev);
|
||||
- rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
|
||||
+ if (gamehid_cnt > 0)
|
||||
+ cur_game_hid_exist = true;
|
||||
+ else
|
||||
+ cur_game_hid_exist = false;
|
||||
+
|
||||
+ if (cur_game_hid_exist != coex_stat->bt_game_hid_exist) {
|
||||
+ coex_stat->bt_game_hid_exist = cur_game_hid_exist;
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
+ "[BTCoex], HID info changed!bt_game_hid_exist = %d!\n",
|
||||
+ coex_stat->bt_game_hid_exist);
|
||||
+ rtw_coex_run_coex(rtwdev, COEX_RSN_BTSTATUS);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void rtw_coex_query_bt_hid_list(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_coex *coex = &rtwdev->coex;
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
+ struct rtw_coex_hid *hidinfo;
|
||||
+ u8 i, handle;
|
||||
+ bool complete;
|
||||
+
|
||||
+ if (!chip->wl_mimo_ps_support || coex_stat->wl_under_ips ||
|
||||
+ (coex_stat->wl_under_lps && !coex_stat->wl_force_lps_ctrl))
|
||||
+ return;
|
||||
+
|
||||
+ if (!coex_stat->bt_hid_exist &&
|
||||
+ !((coex_stat->bt_info_lb2 & COEX_INFO_CONNECTION) &&
|
||||
+ (coex_stat->hi_pri_tx + coex_stat->hi_pri_rx >
|
||||
+ COEX_BT_GAMEHID_CNT)))
|
||||
+ return;
|
||||
+
|
||||
+ rtw_fw_coex_query_hid_info(rtwdev, COEX_BT_HIDINFO_LIST, 0);
|
||||
+
|
||||
+ for (i = 0; i < COEX_BT_HIDINFO_HANDLE_NUM; i++) {
|
||||
+ hidinfo = &coex_stat->hid_info[i];
|
||||
+ complete = hidinfo->hid_info_completed;
|
||||
+ handle = hidinfo->hid_handle;
|
||||
+ if (handle == 0 || handle == COEX_BT_HIDINFO_NOTCON ||
|
||||
+ handle >= COEX_BT_BLE_HANDLE_THRS || complete)
|
||||
+ continue;
|
||||
+
|
||||
+ rtw_fw_coex_query_hid_info(rtwdev,
|
||||
+ COEX_BT_HIDINFO_A,
|
||||
+ handle);
|
||||
+ }
|
||||
}
|
||||
|
||||
void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.h b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
index 498b6432e7f8..07fa7aa34d4b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
@@ -403,10 +403,12 @@ void rtw_coex_scan_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_connect_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_media_status_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
+void rtw_coex_bt_hid_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
void rtw_coex_switchband_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev, u32 type);
|
||||
void rtw_coex_wl_status_check(struct rtw_dev *rtwdev);
|
||||
+void rtw_coex_query_bt_hid_list(struct rtw_dev *rtwdev);
|
||||
void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m);
|
||||
|
||||
static inline bool rtw_coex_disabled(struct rtw_dev *rtwdev)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index 4c8e5ea5d069..ac581df6290e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -233,6 +233,9 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
case C2H_BT_INFO:
|
||||
rtw_coex_bt_info_notify(rtwdev, c2h->payload, len);
|
||||
break;
|
||||
+ case C2H_BT_HID_INFO:
|
||||
+ rtw_coex_bt_hid_info_notify(rtwdev, c2h->payload, len);
|
||||
+ break;
|
||||
case C2H_WLAN_INFO:
|
||||
rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len);
|
||||
break;
|
||||
@@ -538,6 +541,18 @@ void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
|
||||
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
|
||||
}
|
||||
|
||||
+void rtw_fw_coex_query_hid_info(struct rtw_dev *rtwdev, u8 sub_id, u8 data)
|
||||
+{
|
||||
+ u8 h2c_pkt[H2C_PKT_SIZE] = {0};
|
||||
+
|
||||
+ SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_QUERY_BT_HID_INFO);
|
||||
+
|
||||
+ SET_COEX_QUERY_HID_INFO_SUBID(h2c_pkt, sub_id);
|
||||
+ SET_COEX_QUERY_HID_INFO_DATA1(h2c_pkt, data);
|
||||
+
|
||||
+ rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
|
||||
+}
|
||||
+
|
||||
void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data)
|
||||
{
|
||||
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
index 654c3c2e5721..b59d2cbad5d7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
@@ -47,6 +47,7 @@ enum rtw_c2h_cmd_id {
|
||||
C2H_CCX_TX_RPT = 0x03,
|
||||
C2H_BT_INFO = 0x09,
|
||||
C2H_BT_MP_INFO = 0x0b,
|
||||
+ C2H_BT_HID_INFO = 0x45,
|
||||
C2H_RA_RPT = 0x0c,
|
||||
C2H_HW_FEATURE_REPORT = 0x19,
|
||||
C2H_WLAN_INFO = 0x27,
|
||||
@@ -529,6 +530,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
|
||||
#define H2C_CMD_QUERY_BT_MP_INFO 0x67
|
||||
#define H2C_CMD_BT_WIFI_CONTROL 0x69
|
||||
#define H2C_CMD_WIFI_CALIBRATION 0x6d
|
||||
+#define H2C_CMD_QUERY_BT_HID_INFO 0x73
|
||||
|
||||
#define H2C_CMD_KEEP_ALIVE 0x03
|
||||
#define H2C_CMD_DISCONNECT_DECISION 0x04
|
||||
@@ -681,6 +683,11 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
|
||||
#define SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, value) \
|
||||
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
|
||||
|
||||
+#define SET_COEX_QUERY_HID_INFO_SUBID(h2c_pkt, value) \
|
||||
+ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
|
||||
+#define SET_COEX_QUERY_HID_INFO_DATA1(h2c_pkt, value) \
|
||||
+ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
|
||||
+
|
||||
#define SET_KEEP_ALIVE_ENABLE(h2c_pkt, value) \
|
||||
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
|
||||
#define SET_KEEP_ALIVE_ADOPT(h2c_pkt, value) \
|
||||
@@ -780,6 +787,8 @@ void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl);
|
||||
void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable);
|
||||
void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
|
||||
u8 para1, u8 para2, u8 para3, u8 para4, u8 para5);
|
||||
+void rtw_fw_coex_query_hid_info(struct rtw_dev *rtwdev, u8 sub_id, u8 data);
|
||||
+
|
||||
void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data);
|
||||
void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
|
||||
void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index da4657ac7c30..79a8e0282aa0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -208,6 +208,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
clear_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
|
||||
|
||||
rtw_coex_wl_status_check(rtwdev);
|
||||
+ rtw_coex_query_bt_hid_list(rtwdev);
|
||||
|
||||
if (busy_traffic != test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags))
|
||||
rtw_coex_wl_status_change_notify(rtwdev, 0);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index e62b085d7b14..17815af9dd4e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1355,6 +1355,42 @@ struct rtw_coex_dm {
|
||||
#define COEX_BTINFO_LENGTH_MAX 10
|
||||
#define COEX_BTINFO_LENGTH 7
|
||||
|
||||
+#define COEX_BT_HIDINFO_LIST 0x0
|
||||
+#define COEX_BT_HIDINFO_A 0x1
|
||||
+#define COEX_BT_HIDINFO_NAME 3
|
||||
+
|
||||
+#define COEX_BT_HIDINFO_LENGTH 6
|
||||
+#define COEX_BT_HIDINFO_HANDLE_NUM 4
|
||||
+#define COEX_BT_HIDINFO_C2H_HANDLE 0
|
||||
+#define COEX_BT_HIDINFO_C2H_VENDOR 1
|
||||
+#define COEX_BT_BLE_HANDLE_THRS 0x10
|
||||
+#define COEX_BT_HIDINFO_NOTCON 0xff
|
||||
+
|
||||
+struct rtw_coex_hid {
|
||||
+ u8 hid_handle;
|
||||
+ u8 hid_vendor;
|
||||
+ u8 hid_name[COEX_BT_HIDINFO_NAME];
|
||||
+ bool hid_info_completed;
|
||||
+ bool is_game_hid;
|
||||
+};
|
||||
+
|
||||
+struct rtw_coex_hid_handle_list {
|
||||
+ u8 cmd_id;
|
||||
+ u8 len;
|
||||
+ u8 subid;
|
||||
+ u8 handle_cnt;
|
||||
+ u8 handle[COEX_BT_HIDINFO_HANDLE_NUM];
|
||||
+} __packed;
|
||||
+
|
||||
+struct rtw_coex_hid_info_a {
|
||||
+ u8 cmd_id;
|
||||
+ u8 len;
|
||||
+ u8 subid;
|
||||
+ u8 handle;
|
||||
+ u8 vendor;
|
||||
+ u8 name[COEX_BT_HIDINFO_NAME];
|
||||
+} __packed;
|
||||
+
|
||||
struct rtw_coex_stat {
|
||||
bool bt_disabled;
|
||||
bool bt_disabled_pre;
|
||||
@@ -1386,6 +1422,7 @@ struct rtw_coex_stat {
|
||||
bool bt_418_hid_exist;
|
||||
bool bt_ble_hid_exist;
|
||||
bool bt_game_hid_exist;
|
||||
+ bool bt_hid_handle_cnt;
|
||||
bool bt_mailbox_reply;
|
||||
|
||||
bool wl_under_lps;
|
||||
@@ -1464,6 +1501,9 @@ struct rtw_coex_stat {
|
||||
|
||||
u32 darfrc;
|
||||
u32 darfrch;
|
||||
+
|
||||
+ struct rtw_coex_hid hid_info[COEX_BT_HIDINFO_HANDLE_NUM];
|
||||
+ struct rtw_coex_hid_handle_list hid_handle_list;
|
||||
};
|
||||
|
||||
struct rtw_coex {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,407 @@
|
||||
From e201b7131e9a7587888afa832833e313c1bdb824 Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:53 +0800
|
||||
Subject: [PATCH 461/544] rtw88: coex: Add WLAN MIMO power saving for Bluetooth
|
||||
gaming controller
|
||||
|
||||
To keep high sensitivity reaction, Bluetooth gaming controller will send
|
||||
packet very frequently, it will make WLAN performance very poor. To solve
|
||||
this situation, MIMO PS mechanism makes WLAN/BT own an antenna itself, WLAN
|
||||
quits 2SS performance but it can get a stable 1SS performance and Bluetooth
|
||||
gaming controller can keep sensitivity reaction at the same time.
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-5-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 113 +++++++++++++++++-
|
||||
drivers/net/wireless/realtek/rtw88/coex.h | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 3 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 38 ++++--
|
||||
7 files changed, 148 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 0aca8f089ebb..632151f081a5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -211,6 +211,10 @@ static void rtw_coex_wl_ccklock_detect(struct rtw_dev *rtwdev)
|
||||
|
||||
bool is_cck_lock_rate = false;
|
||||
|
||||
+ if (coex_stat->wl_coex_mode != COEX_WLINK_2G1PORT &&
|
||||
+ coex_stat->wl_coex_mode != COEX_WLINK_2GFREE)
|
||||
+ return;
|
||||
+
|
||||
if (coex_dm->bt_status == COEX_BTSTATUS_INQ_PAGE ||
|
||||
coex_stat->bt_setup_link) {
|
||||
coex_stat->wl_cck_lock = false;
|
||||
@@ -803,7 +807,9 @@ static void rtw_coex_update_bt_link_info(struct rtw_dev *rtwdev)
|
||||
static void rtw_coex_update_wl_ch_info(struct rtw_dev *rtwdev, u8 type)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_coex_dm *coex_dm = &rtwdev->coex.dm;
|
||||
+ struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
|
||||
u8 link = 0;
|
||||
u8 center_chan = 0;
|
||||
u8 bw;
|
||||
@@ -814,7 +820,9 @@ static void rtw_coex_update_wl_ch_info(struct rtw_dev *rtwdev, u8 type)
|
||||
if (type != COEX_MEDIA_DISCONNECT)
|
||||
center_chan = rtwdev->hal.current_channel;
|
||||
|
||||
- if (center_chan == 0) {
|
||||
+ if (center_chan == 0 ||
|
||||
+ (efuse->share_ant && center_chan <= 14 &&
|
||||
+ coex_stat->wl_coex_mode != COEX_WLINK_2GFREE)) {
|
||||
link = 0;
|
||||
center_chan = 0;
|
||||
bw = 0;
|
||||
@@ -953,6 +961,23 @@ static void rtw_coex_set_gnt_wl(struct rtw_dev *rtwdev, u8 state)
|
||||
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0300, state);
|
||||
}
|
||||
|
||||
+static void rtw_coex_mimo_ps(struct rtw_dev *rtwdev, bool force, bool state)
|
||||
+{
|
||||
+ struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
|
||||
+
|
||||
+ if (!force && state == coex_stat->wl_mimo_ps)
|
||||
+ return;
|
||||
+
|
||||
+ coex_stat->wl_mimo_ps = state;
|
||||
+
|
||||
+ rtw_set_txrx_1ss(rtwdev, state);
|
||||
+
|
||||
+ rtw_coex_update_wl_ch_info(rtwdev, (u8)coex_stat->wl_connected);
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
+ "[BTCoex], %s(): state = %d\n", __func__, state);
|
||||
+}
|
||||
+
|
||||
static void rtw_btc_wltoggle_table_a(struct rtw_dev *rtwdev, bool force,
|
||||
u8 table_case)
|
||||
{
|
||||
@@ -1129,7 +1154,8 @@ static void rtw_coex_set_tdma(struct rtw_dev *rtwdev, u8 byte1, u8 byte2,
|
||||
|
||||
ps_type = COEX_PS_WIFI_NATIVE;
|
||||
rtw_coex_power_save_state(rtwdev, ps_type, 0x0, 0x0);
|
||||
- } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
|
||||
+ } else if ((byte1 & BIT(4) && !(byte1 & BIT(5))) ||
|
||||
+ coex_stat->wl_coex_mode == COEX_WLINK_2GFREE) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
"[BTCoex], %s(): Force LPS (byte1 = 0x%x)\n", __func__,
|
||||
byte1);
|
||||
@@ -1825,6 +1851,54 @@ static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev)
|
||||
rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
|
||||
}
|
||||
|
||||
+static void rtw_coex_action_bt_game_hid(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_coex *coex = &rtwdev->coex;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
+ struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
+ struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ u8 table_case, tdma_case;
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
+ rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
|
||||
+
|
||||
+ if (efuse->share_ant) {
|
||||
+ coex_stat->wl_coex_mode = COEX_WLINK_2GFREE;
|
||||
+ if (coex_stat->bt_whck_test)
|
||||
+ table_case = 2;
|
||||
+ else if (coex_stat->wl_linkscan_proc || coex_stat->bt_hid_exist)
|
||||
+ table_case = 33;
|
||||
+ else if (coex_stat->bt_setup_link || coex_stat->bt_inq_page)
|
||||
+ table_case = 0;
|
||||
+ else if (coex_stat->bt_a2dp_exist)
|
||||
+ table_case = 34;
|
||||
+ else
|
||||
+ table_case = 33;
|
||||
+
|
||||
+ tdma_case = 0;
|
||||
+ } else {
|
||||
+ if (COEX_RSSI_HIGH(coex_dm->wl_rssi_state[1]))
|
||||
+ tdma_case = 112;
|
||||
+ else
|
||||
+ tdma_case = 113;
|
||||
+
|
||||
+ table_case = 121;
|
||||
+ }
|
||||
+
|
||||
+ if (coex_stat->wl_coex_mode == COEX_WLINK_2GFREE) {
|
||||
+ if (coex_stat->wl_tput_dir == COEX_WL_TPUT_TX)
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_tx[6]);
|
||||
+ else
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[5]);
|
||||
+ } else {
|
||||
+ rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
|
||||
+ }
|
||||
+
|
||||
+ rtw_coex_table(rtwdev, false, table_case);
|
||||
+ rtw_coex_tdma(rtwdev, false, tdma_case);
|
||||
+}
|
||||
+
|
||||
static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
@@ -2242,8 +2316,10 @@ static void rtw_coex_action_bt_a2dp_pan_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_under5g(struct rtw_dev *rtwdev)
|
||||
{
|
||||
+ struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@@ -2253,6 +2329,9 @@ static void rtw_coex_action_wl_under5g(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_coex_write_scbd(rtwdev, COEX_SCBD_FIX2M, false);
|
||||
|
||||
+ if (coex_stat->bt_game_hid_exist && coex_stat->wl_linkscan_proc)
|
||||
+ coex_stat->wl_coex_mode = COEX_WLINK_2GFREE;
|
||||
+
|
||||
if (efuse->share_ant) {
|
||||
/* Shared-Ant */
|
||||
table_case = 0;
|
||||
@@ -2440,6 +2519,7 @@ static void rtw_coex_action_wl_connected(struct rtw_dev *rtwdev)
|
||||
static void rtw_coex_run_coex(struct rtw_dev *rtwdev, u8 reason)
|
||||
{
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
bool rf4ce_en = false;
|
||||
@@ -2512,6 +2592,11 @@ static void rtw_coex_run_coex(struct rtw_dev *rtwdev, u8 reason)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
+ if (coex_stat->bt_game_hid_exist && coex_stat->wl_connected) {
|
||||
+ rtw_coex_action_bt_game_hid(rtwdev);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
if (coex_stat->bt_whck_test) {
|
||||
rtw_coex_action_bt_whql_test(rtwdev);
|
||||
goto exit;
|
||||
@@ -2548,6 +2633,18 @@ static void rtw_coex_run_coex(struct rtw_dev *rtwdev, u8 reason)
|
||||
}
|
||||
|
||||
exit:
|
||||
+
|
||||
+ if (chip->wl_mimo_ps_support) {
|
||||
+ if (coex_stat->wl_coex_mode == COEX_WLINK_2GFREE) {
|
||||
+ if (coex_dm->reason == COEX_RSN_2GMEDIA)
|
||||
+ rtw_coex_mimo_ps(rtwdev, true, true);
|
||||
+ else
|
||||
+ rtw_coex_mimo_ps(rtwdev, false, true);
|
||||
+ } else {
|
||||
+ rtw_coex_mimo_ps(rtwdev, false, false);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
rtw_coex_gnt_workaround(rtwdev, false, coex_stat->wl_coex_mode);
|
||||
rtw_coex_limited_wl(rtwdev);
|
||||
}
|
||||
@@ -3152,6 +3249,17 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
coex_stat->bt_a2dp_bitpool = 0;
|
||||
|
||||
coex_stat->bt_a2dp_sink = ((coex_stat->bt_info_hb3 & BIT(7)) == BIT(7));
|
||||
+ if (chip->wl_mimo_ps_support && !coex_stat->bt_inq_page) {
|
||||
+ if ((coex_stat->bt_info_lb2 & COEX_INFO_CONNECTION) &&
|
||||
+ (coex_stat->hi_pri_tx + coex_stat->hi_pri_rx >
|
||||
+ COEX_BT_GAMEHID_CNT) && !coex_stat->bt_slave) {
|
||||
+ coex_stat->bt_game_hid_exist = true;
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
+ "[BTCoex], BT game controller exisit!!\n");
|
||||
+ } else {
|
||||
+ coex_stat->bt_game_hid_exist = false;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
rtw_coex_update_bt_link_info(rtwdev);
|
||||
rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
|
||||
@@ -3666,6 +3774,7 @@ static const char *rtw_coex_get_wl_coex_mode(u8 coex_wl_link_mode)
|
||||
switch (coex_wl_link_mode) {
|
||||
case_WLINK(2G1PORT);
|
||||
case_WLINK(5G);
|
||||
+ case_WLINK(2GFREE);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.h b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
index 60a701c8ac13..498b6432e7f8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#define COEX_MIN_DELAY 10 /* delay unit in ms */
|
||||
#define COEX_RFK_TIMEOUT 600 /* RFK timeout in ms */
|
||||
+#define COEX_BT_GAMEHID_CNT 800
|
||||
|
||||
#define COEX_RF_OFF 0x0
|
||||
#define COEX_RF_ON 0x1
|
||||
@@ -172,6 +173,7 @@ enum coex_bt_profile {
|
||||
enum coex_wl_link_mode {
|
||||
COEX_WLINK_2G1PORT = 0x0,
|
||||
COEX_WLINK_5G = 0x3,
|
||||
+ COEX_WLINK_2GFREE = 0x7,
|
||||
COEX_WLINK_MAX
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 970d29d19003..e62b085d7b14 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1242,6 +1242,7 @@ struct rtw_chip_info {
|
||||
bool scbd_support;
|
||||
bool new_scbd10_def; /* true: fix 2M(8822c) */
|
||||
bool ble_hid_profile_support;
|
||||
+ bool wl_mimo_ps_support;
|
||||
u8 pstdma_type; /* 0: LPSoff, 1:LPSon */
|
||||
u8 bt_rssi_type;
|
||||
u8 ant_isolation;
|
||||
@@ -1384,6 +1385,7 @@ struct rtw_coex_stat {
|
||||
bool bt_slave;
|
||||
bool bt_418_hid_exist;
|
||||
bool bt_ble_hid_exist;
|
||||
+ bool bt_game_hid_exist;
|
||||
bool bt_mailbox_reply;
|
||||
|
||||
bool wl_under_lps;
|
||||
@@ -1404,6 +1406,7 @@ struct rtw_coex_stat {
|
||||
bool wl_connecting;
|
||||
bool wl_slot_toggle;
|
||||
bool wl_slot_toggle_change; /* if toggle to no-toggle */
|
||||
+ bool wl_mimo_ps;
|
||||
|
||||
u32 bt_supported_version;
|
||||
u32 bt_supported_feature;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 3fdbaf7302c5..ad2b323a0423 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2753,6 +2753,7 @@ struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.scbd_support = true,
|
||||
.new_scbd10_def = true,
|
||||
.ble_hid_profile_support = false,
|
||||
+ .wl_mimo_ps_support = false,
|
||||
.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
|
||||
.bt_rssi_type = COEX_BTRSSI_RATIO,
|
||||
.ant_isolation = 15,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index b1f4afb50830..a1ae1e7e59f6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1925,6 +1925,7 @@ struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.scbd_support = true,
|
||||
.new_scbd10_def = false,
|
||||
.ble_hid_profile_support = false,
|
||||
+ .wl_mimo_ps_support = false,
|
||||
.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
|
||||
.bt_rssi_type = COEX_BTRSSI_RATIO,
|
||||
.ant_isolation = 15,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index dd4fbb82750d..c9cedc349924 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2554,6 +2554,7 @@ struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.scbd_support = true,
|
||||
.new_scbd10_def = false,
|
||||
.ble_hid_profile_support = false,
|
||||
+ .wl_mimo_ps_support = false,
|
||||
.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
|
||||
.bt_rssi_type = COEX_BTRSSI_RATIO,
|
||||
.ant_isolation = 15,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 01bb356b4b65..39daca440593 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -2996,19 +2996,34 @@ static void rtw8822c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
|
||||
* enable "DAC off if GNT_WL = 0" for non-shared-antenna
|
||||
* disable 0x1c30[22] = 0,
|
||||
* enable: 0x1c30[22] = 1, 0x1c38[12] = 0, 0x1c38[28] = 1
|
||||
- *
|
||||
- * disable WL-S1 BB chage RF mode if GNT_BT
|
||||
+ */
|
||||
+ if (coex_stat->wl_coex_mode == COEX_WLINK_2GFREE) {
|
||||
+ rtw_write8_mask(rtwdev, REG_ANAPAR + 2,
|
||||
+ BIT_ANAPAR_BTPS >> 16, 0);
|
||||
+ } else {
|
||||
+ rtw_write8_mask(rtwdev, REG_ANAPAR + 2,
|
||||
+ BIT_ANAPAR_BTPS >> 16, 1);
|
||||
+ rtw_write8_mask(rtwdev, REG_RSTB_SEL + 1,
|
||||
+ BIT_DAC_OFF_ENABLE, 0);
|
||||
+ rtw_write8_mask(rtwdev, REG_RSTB_SEL + 3,
|
||||
+ BIT_DAC_OFF_ENABLE, 1);
|
||||
+ }
|
||||
+
|
||||
+ /* disable WL-S1 BB chage RF mode if GNT_BT
|
||||
* since RF TRx mask can do it
|
||||
*/
|
||||
- rtw_write8_mask(rtwdev, REG_ANAPAR + 2, BIT_ANAPAR_BTPS >> 16, 1);
|
||||
- rtw_write8_mask(rtwdev, REG_RSTB_SEL + 1, BIT_DAC_OFF_ENABLE, 0);
|
||||
- rtw_write8_mask(rtwdev, REG_RSTB_SEL + 3, BIT_DAC_OFF_ENABLE, 1);
|
||||
- rtw_write8_mask(rtwdev, REG_IGN_GNTBT4, BIT_PI_IGNORE_GNT_BT, 1);
|
||||
+ rtw_write8_mask(rtwdev, REG_IGN_GNTBT4,
|
||||
+ BIT_PI_IGNORE_GNT_BT, 1);
|
||||
|
||||
/* disable WL-S0 BB chage RF mode if wifi is at 5G,
|
||||
* or antenna path is separated
|
||||
*/
|
||||
- if (coex_stat->wl_coex_mode == COEX_WLINK_5G ||
|
||||
+ if (coex_stat->wl_coex_mode == COEX_WLINK_2GFREE) {
|
||||
+ rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1,
|
||||
+ BIT_PI_IGNORE_GNT_BT, 1);
|
||||
+ rtw_write8_mask(rtwdev, REG_NOMASK_TXBT,
|
||||
+ BIT_NOMASK_TXBT_ENABLE, 1);
|
||||
+ } else if (coex_stat->wl_coex_mode == COEX_WLINK_5G ||
|
||||
coex->under_5g || !efuse->share_ant) {
|
||||
if (coex_stat->kt_ver >= 3) {
|
||||
rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1,
|
||||
@@ -5008,6 +5023,8 @@ static const struct coex_table_para table_sant_8822c[] = {
|
||||
{0x66556aaa, 0x6a5a6aaa}, /*case-30*/
|
||||
{0xffffffff, 0x5aaa5aaa},
|
||||
{0x56555555, 0x5a5a5aaa},
|
||||
+ {0xdaffdaff, 0xdaffdaff},
|
||||
+ {0xddffddff, 0xddffddff},
|
||||
};
|
||||
|
||||
/* Non-Shared-Antenna Coex Table */
|
||||
@@ -5108,7 +5125,8 @@ static const struct coex_rf_para rf_para_tx_8822c[] = {
|
||||
{8, 17, true, 4},
|
||||
{7, 18, true, 4},
|
||||
{6, 19, true, 4},
|
||||
- {5, 20, true, 4}
|
||||
+ {5, 20, true, 4},
|
||||
+ {0, 21, true, 4} /* for gamg hid */
|
||||
};
|
||||
|
||||
static const struct coex_rf_para rf_para_rx_8822c[] = {
|
||||
@@ -5117,7 +5135,8 @@ static const struct coex_rf_para rf_para_rx_8822c[] = {
|
||||
{3, 24, true, 5},
|
||||
{2, 26, true, 5},
|
||||
{1, 27, true, 5},
|
||||
- {0, 28, true, 5}
|
||||
+ {0, 28, true, 5},
|
||||
+ {0, 28, true, 5} /* for gamg hid */
|
||||
};
|
||||
|
||||
static_assert(ARRAY_SIZE(rf_para_tx_8822c) == ARRAY_SIZE(rf_para_rx_8822c));
|
||||
@@ -5360,6 +5379,7 @@ struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.scbd_support = true,
|
||||
.new_scbd10_def = true,
|
||||
.ble_hid_profile_support = true,
|
||||
+ .wl_mimo_ps_support = true,
|
||||
.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
|
||||
.bt_rssi_type = COEX_BTRSSI_DBM,
|
||||
.ant_isolation = 15,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
From 36580724bf6585b3689a169dfcfec98450bbcfdb Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:51 +0800
|
||||
Subject: [PATCH 459/544] rtw88: coex: Improve WLAN throughput when HFP COEX
|
||||
|
||||
Disable power save TDMA mechanism under HFP COEX, so WLAN can TX/RX full
|
||||
time.
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 9 ++-------
|
||||
1 file changed, 2 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 2551e228b581..70adaee01762 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -1816,13 +1816,8 @@ static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev)
|
||||
|
||||
if (efuse->share_ant) {
|
||||
/* Shared-Ant */
|
||||
- if (coex_stat->bt_multi_link) {
|
||||
- table_case = 10;
|
||||
- tdma_case = 17;
|
||||
- } else {
|
||||
- table_case = 10;
|
||||
- tdma_case = 5;
|
||||
- }
|
||||
+ table_case = 10;
|
||||
+ tdma_case = 5;
|
||||
} else {
|
||||
/* Non-Shared-Ant */
|
||||
if (coex_stat->bt_multi_link) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
From fa2d63fbf0d90c58ccc9e8b0c7b9244e7a3b70a3 Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:55 +0800
|
||||
Subject: [PATCH 463/544] rtw88: coex: Update rtl8822c COEX version to 22020720
|
||||
|
||||
Enable Wi-Fi/BT mailbox 0x45 handshake and Wi-Fi MIMO power save
|
||||
mechanism for Bluetooth gaming controller.
|
||||
|
||||
BTCOEX Version: 22020720-2020
|
||||
Desired_BT_Coex_Ver: 0x20
|
||||
Desired_WL_FW_Ver: 9.9.11
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-7-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 39daca440593..87ff1cf4ad7e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -5374,8 +5374,8 @@ struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.wowlan_stub = &rtw_wowlan_stub_8822c,
|
||||
.max_sched_scan_ssids = 4,
|
||||
#endif
|
||||
- .coex_para_ver = 0x2103181c,
|
||||
- .bt_desired_ver = 0x1c,
|
||||
+ .coex_para_ver = 0x22020720,
|
||||
+ .bt_desired_ver = 0x20,
|
||||
.scbd_support = true,
|
||||
.new_scbd10_def = true,
|
||||
.ble_hid_profile_support = true,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
From a17900739716f3c83141b7065bfbc0eab58b2303 Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Tue, 15 Feb 2022 08:48:52 +0800
|
||||
Subject: [PATCH 460/544] rtw88: coex: update BT PTA counter regularly
|
||||
|
||||
If BT PTA counter can not update regularly, it will lead coex mechanism
|
||||
run into some unexpected state.
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220215004855.4098-4-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 46 +++++++++++++++++------
|
||||
drivers/net/wireless/realtek/rtw88/coex.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 2 +
|
||||
3 files changed, 37 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 70adaee01762..0aca8f089ebb 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -460,6 +460,29 @@ static void rtw_coex_gnt_workaround(struct rtw_dev *rtwdev, bool force, u8 mode)
|
||||
rtw_coex_set_gnt_fix(rtwdev);
|
||||
}
|
||||
|
||||
+static void rtw_coex_monitor_bt_ctr(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_coex *coex = &rtwdev->coex;
|
||||
+ struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
+ u32 tmp;
|
||||
+
|
||||
+ tmp = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS);
|
||||
+ coex_stat->hi_pri_tx = FIELD_GET(MASKLWORD, tmp);
|
||||
+ coex_stat->hi_pri_rx = FIELD_GET(MASKHWORD, tmp);
|
||||
+
|
||||
+ tmp = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS_1);
|
||||
+ coex_stat->lo_pri_tx = FIELD_GET(MASKLWORD, tmp);
|
||||
+ coex_stat->lo_pri_rx = FIELD_GET(MASKHWORD, tmp);
|
||||
+
|
||||
+ rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL,
|
||||
+ BIT_R_GRANTALL_WLMASK | BIT_STATIS_BT_EN);
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_COEX,
|
||||
+ "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
|
||||
+ coex_stat->hi_pri_rx, coex_stat->hi_pri_tx,
|
||||
+ coex_stat->lo_pri_rx, coex_stat->lo_pri_tx);
|
||||
+}
|
||||
+
|
||||
static void rtw_coex_monitor_bt_enable(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
@@ -3170,6 +3193,17 @@ void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev, u32 type)
|
||||
rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
|
||||
}
|
||||
|
||||
+void rtw_coex_wl_status_check(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
|
||||
+
|
||||
+ if ((coex_stat->wl_under_lps && !coex_stat->wl_force_lps_ctrl) ||
|
||||
+ coex_stat->wl_under_ips)
|
||||
+ return;
|
||||
+
|
||||
+ rtw_coex_monitor_bt_ctr(rtwdev);
|
||||
+}
|
||||
+
|
||||
void rtw_coex_bt_relink_work(struct work_struct *work)
|
||||
{
|
||||
struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
|
||||
@@ -3653,7 +3687,6 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
u16 score_board_WB, score_board_BW;
|
||||
u32 wl_reg_6c0, wl_reg_6c4, wl_reg_6c8, wl_reg_778, wl_reg_6cc;
|
||||
u32 lte_coex, bt_coex;
|
||||
- u32 bt_hi_pri, bt_lo_pri;
|
||||
int i;
|
||||
|
||||
score_board_BW = rtw_coex_read_scbd(rtwdev);
|
||||
@@ -3664,17 +3697,6 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
wl_reg_6cc = rtw_read32(rtwdev, REG_BT_COEX_TABLE_H);
|
||||
wl_reg_778 = rtw_read8(rtwdev, REG_BT_STAT_CTRL);
|
||||
|
||||
- bt_hi_pri = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS);
|
||||
- bt_lo_pri = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS_1);
|
||||
- rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL,
|
||||
- BIT_R_GRANTALL_WLMASK | BIT_STATIS_BT_EN);
|
||||
-
|
||||
- coex_stat->hi_pri_tx = FIELD_GET(MASKLWORD, bt_hi_pri);
|
||||
- coex_stat->hi_pri_rx = FIELD_GET(MASKHWORD, bt_hi_pri);
|
||||
-
|
||||
- coex_stat->lo_pri_tx = FIELD_GET(MASKLWORD, bt_lo_pri);
|
||||
- coex_stat->lo_pri_rx = FIELD_GET(MASKHWORD, bt_lo_pri);
|
||||
-
|
||||
sys_lte = rtw_read8(rtwdev, 0x73);
|
||||
lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
|
||||
bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.h b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
index fc61a0cab3e4..60a701c8ac13 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
@@ -404,6 +404,7 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
|
||||
void rtw_coex_switchband_notify(struct rtw_dev *rtwdev, u8 type);
|
||||
void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev, u32 type);
|
||||
+void rtw_coex_wl_status_check(struct rtw_dev *rtwdev);
|
||||
void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m);
|
||||
|
||||
static inline bool rtw_coex_disabled(struct rtw_dev *rtwdev)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 41b6db422638..da4657ac7c30 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -207,6 +207,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
else
|
||||
clear_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
|
||||
|
||||
+ rtw_coex_wl_status_check(rtwdev);
|
||||
+
|
||||
if (busy_traffic != test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags))
|
||||
rtw_coex_wl_status_change_notify(rtwdev, 0);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
From fcecd5786fd6106e75b61f5f584408fdbfb43c9d Mon Sep 17 00:00:00 2001
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
Date: Fri, 21 Jan 2022 15:08:12 +0800
|
||||
Subject: [PATCH 431/456] rtw88: fix idle mode flow for hw scan
|
||||
|
||||
Upon hw scan completion, idle mode is not re-entered. This might
|
||||
increase power consumption under no link mode. Fix this by adding the
|
||||
re-enter flow. We need another work for this since enter_ips waits
|
||||
for c2h_work to finish, which might lead to deadlock if caller is in
|
||||
the same work.
|
||||
|
||||
Fixes: 10d162b2ed39 ("rtw88: 8822c: add ieee80211_ops::hw_scan")
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220121070813.9656-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/mac80211.c | 5 ++++-
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 16 +++++++++++++++-
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 4 +++-
|
||||
4 files changed, 23 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index b56dc43229d2..a631042753ea 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -2030,7 +2030,7 @@ void rtw_hw_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
rtwdev->hal.rcr |= BIT_CBSSID_BCN;
|
||||
rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr);
|
||||
|
||||
- rtw_core_scan_complete(rtwdev, vif);
|
||||
+ rtw_core_scan_complete(rtwdev, vif, true);
|
||||
|
||||
ieee80211_wake_queues(rtwdev->hw);
|
||||
ieee80211_scan_completed(rtwdev->hw, &info);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
index ae7d97de5fdf..647d2662955b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
@@ -72,6 +72,9 @@ static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
int ret = 0;
|
||||
|
||||
+ /* let previous ips work finish to ensure we don't leave ips twice */
|
||||
+ cancel_work_sync(&rtwdev->ips_work);
|
||||
+
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
rtw_leave_lps_deep(rtwdev);
|
||||
@@ -614,7 +617,7 @@ static void rtw_ops_sw_scan_complete(struct ieee80211_hw *hw,
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
- rtw_core_scan_complete(rtwdev, vif);
|
||||
+ rtw_core_scan_complete(rtwdev, vif, false);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 38252113c4a8..39c223a2e3e2 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -272,6 +272,15 @@ static void rtw_c2h_work(struct work_struct *work)
|
||||
}
|
||||
}
|
||||
|
||||
+static void rtw_ips_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, ips_work);
|
||||
+
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
+ rtw_enter_ips(rtwdev);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
+}
|
||||
+
|
||||
static u8 rtw_acquire_macid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
unsigned long mac_id;
|
||||
@@ -1339,7 +1348,8 @@ void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
|
||||
set_bit(RTW_FLAG_SCANNING, rtwdev->flags);
|
||||
}
|
||||
|
||||
-void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif)
|
||||
+void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
+ bool hw_scan)
|
||||
{
|
||||
struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
||||
u32 config = 0;
|
||||
@@ -1354,6 +1364,9 @@ void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif)
|
||||
rtw_vif_port_config(rtwdev, rtwvif, config);
|
||||
|
||||
rtw_coex_scan_notify(rtwdev, COEX_SCAN_FINISH);
|
||||
+
|
||||
+ if (rtwvif->net_type == RTW_NET_NO_LINK && hw_scan)
|
||||
+ ieee80211_queue_work(rtwdev->hw, &rtwdev->ips_work);
|
||||
}
|
||||
|
||||
int rtw_core_start(struct rtw_dev *rtwdev)
|
||||
@@ -1919,6 +1932,7 @@ int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
INIT_DELAYED_WORK(&coex->wl_ccklock_work, rtw_coex_wl_ccklock_work);
|
||||
INIT_WORK(&rtwdev->tx_work, rtw_tx_work);
|
||||
INIT_WORK(&rtwdev->c2h_work, rtw_c2h_work);
|
||||
+ INIT_WORK(&rtwdev->ips_work, rtw_ips_work);
|
||||
INIT_WORK(&rtwdev->fw_recovery_work, rtw_fw_recovery_work);
|
||||
INIT_WORK(&rtwdev->ba_work, rtw_txq_ba_work);
|
||||
skb_queue_head_init(&rtwdev->c2h_queue);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index dc1cd9bd4b8a..36e1e408933d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1960,6 +1960,7 @@ struct rtw_dev {
|
||||
/* c2h cmd queue & handler work */
|
||||
struct sk_buff_head c2h_queue;
|
||||
struct work_struct c2h_work;
|
||||
+ struct work_struct ips_work;
|
||||
struct work_struct fw_recovery_work;
|
||||
|
||||
/* used to protect txqs list */
|
||||
@@ -2101,7 +2102,8 @@ void rtw_tx_report_purge_timer(struct timer_list *t);
|
||||
void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
|
||||
void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
|
||||
const u8 *mac_addr, bool hw_scan);
|
||||
-void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
+void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
+ bool hw_scan);
|
||||
int rtw_core_start(struct rtw_dev *rtwdev);
|
||||
void rtw_core_stop(struct rtw_dev *rtwdev);
|
||||
int rtw_chip_info_setup(struct rtw_dev *rtwdev);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
From 9703afcfbfd87bd9b9135452d06763bb07456339 Mon Sep 17 00:00:00 2001
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
Date: Fri, 21 Jan 2022 15:08:13 +0800
|
||||
Subject: [PATCH 432/456] rtw88: fix memory overrun and memory leak during
|
||||
hw_scan
|
||||
|
||||
Previously we allocated less memory than actual required, overwrite
|
||||
to the buffer causes the mm module to complaint and raise access
|
||||
violation faults. Along with potential memory leaks when returned
|
||||
early. Fix these by passing the correct size and proper deinit flow.
|
||||
|
||||
Fixes: 10d162b2ed39 ("rtw88: 8822c: add ieee80211_ops::hw_scan")
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220121070813.9656-4-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 34 +++++++++++++++++--------
|
||||
1 file changed, 24 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index a631042753ea..ce9535cce723 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -1784,9 +1784,9 @@ void rtw_fw_scan_notify(struct rtw_dev *rtwdev, bool start)
|
||||
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
|
||||
}
|
||||
|
||||
-static void rtw_append_probe_req_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
- struct sk_buff_head *list,
|
||||
- struct rtw_vif *rtwvif)
|
||||
+static int rtw_append_probe_req_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
+ struct sk_buff_head *list, u8 *bands,
|
||||
+ struct rtw_vif *rtwvif)
|
||||
{
|
||||
struct ieee80211_scan_ies *ies = rtwvif->scan_ies;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
@@ -1797,19 +1797,24 @@ static void rtw_append_probe_req_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
if (!(BIT(idx) & chip->band))
|
||||
continue;
|
||||
new = skb_copy(skb, GFP_KERNEL);
|
||||
+ if (!new)
|
||||
+ return -ENOMEM;
|
||||
skb_put_data(new, ies->ies[idx], ies->len[idx]);
|
||||
skb_put_data(new, ies->common_ies, ies->common_ie_len);
|
||||
skb_queue_tail(list, new);
|
||||
+ (*bands)++;
|
||||
}
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
-static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_ssids,
|
||||
+static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
struct sk_buff_head *probe_req_list)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb, *tmp;
|
||||
u8 page_offset = 1, *buf, page_size = chip->page_size;
|
||||
- u8 pages = page_offset + num_ssids * RTW_PROBE_PG_CNT;
|
||||
+ u8 pages = page_offset + num_probes * RTW_PROBE_PG_CNT;
|
||||
u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
|
||||
u16 buf_offset = page_size * page_offset;
|
||||
u8 tx_desc_sz = chip->tx_pkt_desc_sz;
|
||||
@@ -1848,6 +1853,8 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_ssids,
|
||||
rtwdev->scan_info.probe_pg_size = page_offset;
|
||||
out:
|
||||
kfree(buf);
|
||||
+ skb_queue_walk(probe_req_list, skb)
|
||||
+ kfree_skb(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1858,7 +1865,8 @@ static int rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev,
|
||||
struct cfg80211_scan_request *req = rtwvif->scan_req;
|
||||
struct sk_buff_head list;
|
||||
struct sk_buff *skb;
|
||||
- u8 num = req->n_ssids, i;
|
||||
+ u8 num = req->n_ssids, i, bands = 0;
|
||||
+ int ret;
|
||||
|
||||
skb_queue_head_init(&list);
|
||||
for (i = 0; i < num; i++) {
|
||||
@@ -1866,19 +1874,25 @@ static int rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev,
|
||||
req->ssids[i].ssid,
|
||||
req->ssids[i].ssid_len,
|
||||
req->ie_len);
|
||||
- if (!skb)
|
||||
+ if (!skb) {
|
||||
+ ret = -ENOMEM;
|
||||
goto out;
|
||||
- rtw_append_probe_req_ie(rtwdev, skb, &list, rtwvif);
|
||||
+ }
|
||||
+ ret = rtw_append_probe_req_ie(rtwdev, skb, &list, &bands,
|
||||
+ rtwvif);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
- return _rtw_hw_scan_update_probe_req(rtwdev, num, &list);
|
||||
+ return _rtw_hw_scan_update_probe_req(rtwdev, num * bands, &list);
|
||||
|
||||
out:
|
||||
skb_queue_walk(&list, skb)
|
||||
kfree_skb(skb);
|
||||
|
||||
- return -ENOMEM;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int rtw_add_chan_info(struct rtw_dev *rtwdev, struct rtw_chan_info *info,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
From fea8bd03eea2455844fa1bb0ad76695a1576ccd2 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Thu, 3 Feb 2022 11:25:32 +0300
|
||||
Subject: [PATCH 434/456] rtw88: fix use after free in
|
||||
rtw_hw_scan_update_probe_req()
|
||||
|
||||
This code needs to use skb_queue_walk_safe() instead of skb_queue_walk()
|
||||
because it frees the list iterator.
|
||||
|
||||
Fixes: d95984b5580d ("rtw88: fix memory overrun and memory leak during hw_scan")
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220203082532.GA25151@kili
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index ce9535cce723..4c8e5ea5d069 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -1853,7 +1853,7 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
rtwdev->scan_info.probe_pg_size = page_offset;
|
||||
out:
|
||||
kfree(buf);
|
||||
- skb_queue_walk(probe_req_list, skb)
|
||||
+ skb_queue_walk_safe(probe_req_list, skb, tmp)
|
||||
kfree_skb(skb);
|
||||
|
||||
return ret;
|
||||
@@ -1864,7 +1864,7 @@ static int rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev,
|
||||
{
|
||||
struct cfg80211_scan_request *req = rtwvif->scan_req;
|
||||
struct sk_buff_head list;
|
||||
- struct sk_buff *skb;
|
||||
+ struct sk_buff *skb, *tmp;
|
||||
u8 num = req->n_ssids, i, bands = 0;
|
||||
int ret;
|
||||
|
||||
@@ -1889,7 +1889,7 @@ static int rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev,
|
||||
return _rtw_hw_scan_update_probe_req(rtwdev, num * bands, &list);
|
||||
|
||||
out:
|
||||
- skb_queue_walk(&list, skb)
|
||||
+ skb_queue_walk_safe(&list, skb, tmp)
|
||||
kfree_skb(skb);
|
||||
|
||||
return ret;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,109 @@
|
||||
From 8ff3c0487956e8a749b4bf60a53046ba174e655b Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:45 +0800
|
||||
Subject: [PATCH 481/544] rtw89: 8852c: add 8852c empty files
|
||||
|
||||
Add these files, and then I can add specific chip::ops or chip::info along
|
||||
with the existing chip.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 20 +++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.h | 12 +++++++
|
||||
.../net/wireless/realtek/rtw89/rtw8852ce.c | 36 +++++++++++++++++++
|
||||
3 files changed, 68 insertions(+)
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
new file mode 100644
|
||||
index 000000000000..cd0004b01ebc
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -0,0 +1,20 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2019-2022 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include "rtw8852c.h"
|
||||
+
|
||||
+static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
+};
|
||||
+
|
||||
+const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
+ .chip_id = RTL8852C,
|
||||
+ .ops = &rtw8852c_chip_ops,
|
||||
+ .fw_name = "rtw89/rtw8852c_fw.bin",
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
+
|
||||
+MODULE_FIRMWARE("rtw89/rtw8852c_fw.bin");
|
||||
+MODULE_AUTHOR("Realtek Corporation");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852C driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.h b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
new file mode 100644
|
||||
index 000000000000..68a397223a81
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright(c) 2019-2022 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#ifndef __RTW89_8852C_H__
|
||||
+#define __RTW89_8852C_H__
|
||||
+
|
||||
+#include "core.h"
|
||||
+
|
||||
+extern const struct rtw89_chip_info rtw8852c_chip_info;
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
new file mode 100644
|
||||
index 000000000000..ee700bba1eb1
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2020-2022 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/pci.h>
|
||||
+
|
||||
+#include "pci.h"
|
||||
+#include "reg.h"
|
||||
+#include "rtw8852c.h"
|
||||
+
|
||||
+static const struct rtw89_driver_info rtw89_8852ce_info = {
|
||||
+ .chip = &rtw8852c_chip_info,
|
||||
+};
|
||||
+
|
||||
+static const struct pci_device_id rtw89_8852ce_id_table[] = {
|
||||
+ {
|
||||
+ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xc852),
|
||||
+ .driver_data = (kernel_ulong_t)&rtw89_8852ce_info,
|
||||
+ },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(pci, rtw89_8852ce_id_table);
|
||||
+
|
||||
+static struct pci_driver rtw89_8852ce_driver = {
|
||||
+ .name = "rtw89_8852ce",
|
||||
+ .id_table = rtw89_8852ce_id_table,
|
||||
+ .probe = rtw89_pci_probe,
|
||||
+ .remove = rtw89_pci_remove,
|
||||
+ .driver.pm = &rtw89_pm_ops,
|
||||
+};
|
||||
+module_pci_driver(rtw89_8852ce_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Realtek Corporation");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852CE driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
From 8b88108ac0fa856e7b612c044421e425337a0056 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:54 +0800
|
||||
Subject: [PATCH 490/544] rtw89: 8852c: add chip::dle_mem
|
||||
|
||||
These tables are used to configure hardware buffer size according to
|
||||
operating mode.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-11-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 62 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 10 +++
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 12 ++++
|
||||
5 files changed, 86 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 3b41300a8167..348fbbca254c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2188,6 +2188,7 @@ struct rtw89_ple_quota {
|
||||
u16 bb_rpt;
|
||||
u16 wd_rel;
|
||||
u16 cpu_io;
|
||||
+ u16 tx_rpt;
|
||||
};
|
||||
|
||||
struct rtw89_dle_mem {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index df657df6b149..0081cfbfea04 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -1183,6 +1183,18 @@ const struct rtw89_dle_size rtw89_wde_size4 = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_wde_size4);
|
||||
|
||||
+/* 8852C DLFW */
|
||||
+const struct rtw89_dle_size rtw89_wde_size18 = {
|
||||
+ RTW89_WDE_PG_64, 0, 2048,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_wde_size18);
|
||||
+
|
||||
+/* 8852C PCIE SCC */
|
||||
+const struct rtw89_dle_size rtw89_wde_size19 = {
|
||||
+ RTW89_WDE_PG_64, 3328, 0,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_wde_size19);
|
||||
+
|
||||
/* PCIE */
|
||||
const struct rtw89_dle_size rtw89_ple_size0 = {
|
||||
RTW89_PLE_PG_128, 1520, 16,
|
||||
@@ -1195,6 +1207,18 @@ const struct rtw89_dle_size rtw89_ple_size4 = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_ple_size4);
|
||||
|
||||
+/* 8852C DLFW */
|
||||
+const struct rtw89_dle_size rtw89_ple_size18 = {
|
||||
+ RTW89_PLE_PG_128, 2544, 16,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_size18);
|
||||
+
|
||||
+/* 8852C PCIE SCC */
|
||||
+const struct rtw89_dle_size rtw89_ple_size19 = {
|
||||
+ RTW89_PLE_PG_128, 1904, 16,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_size19);
|
||||
+
|
||||
/* PCIE 64 */
|
||||
const struct rtw89_wde_quota rtw89_wde_qt0 = {
|
||||
3792, 196, 0, 107,
|
||||
@@ -1207,6 +1231,18 @@ const struct rtw89_wde_quota rtw89_wde_qt4 = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_wde_qt4);
|
||||
|
||||
+/* 8852C DLFW */
|
||||
+const struct rtw89_wde_quota rtw89_wde_qt17 = {
|
||||
+ 0, 0, 0, 0,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_wde_qt17);
|
||||
+
|
||||
+/* 8852C PCIE SCC */
|
||||
+const struct rtw89_wde_quota rtw89_wde_qt18 = {
|
||||
+ 3228, 60, 0, 40,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_wde_qt18);
|
||||
+
|
||||
/* PCIE SCC */
|
||||
const struct rtw89_ple_quota rtw89_ple_qt4 = {
|
||||
264, 0, 16, 20, 26, 13, 356, 0, 32, 40, 8,
|
||||
@@ -1225,6 +1261,30 @@ const struct rtw89_ple_quota rtw89_ple_qt13 = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_ple_qt13);
|
||||
|
||||
+/* DLFW 52C */
|
||||
+const struct rtw89_ple_quota rtw89_ple_qt44 = {
|
||||
+ 0, 0, 16, 256, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_qt44);
|
||||
+
|
||||
+/* DLFW 52C */
|
||||
+const struct rtw89_ple_quota rtw89_ple_qt45 = {
|
||||
+ 0, 0, 32, 256, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_qt45);
|
||||
+
|
||||
+/* 8852C PCIE SCC */
|
||||
+const struct rtw89_ple_quota rtw89_ple_qt46 = {
|
||||
+ 525, 0, 16, 20, 13, 13, 178, 0, 32, 62, 8, 16,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_qt46);
|
||||
+
|
||||
+/* 8852C PCIE SCC */
|
||||
+const struct rtw89_ple_quota rtw89_ple_qt47 = {
|
||||
+ 525, 0, 32, 20, 1034, 13, 1199, 0, 1053, 62, 160, 1037,
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_ple_qt47);
|
||||
+
|
||||
static const struct rtw89_dle_mem *get_dle_mem_cfg(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_qta_mode mode)
|
||||
{
|
||||
@@ -1379,6 +1439,8 @@ static void ple_quota_cfg(struct rtw89_dev *rtwdev,
|
||||
SET_QUOTA(bb_rpt, PLE, 8);
|
||||
SET_QUOTA(wd_rel, PLE, 9);
|
||||
SET_QUOTA(cpu_io, PLE, 10);
|
||||
+ if (rtwdev->chip->chip_id == RTL8852C)
|
||||
+ SET_QUOTA(tx_rpt, PLE, 11);
|
||||
}
|
||||
|
||||
#undef SET_QUOTA
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 630811e053cc..e74806d33307 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -675,13 +675,23 @@ enum mac_ax_err_info {
|
||||
extern const struct rtw89_hfc_prec_cfg rtw89_hfc_preccfg_pcie;
|
||||
extern const struct rtw89_dle_size rtw89_wde_size0;
|
||||
extern const struct rtw89_dle_size rtw89_wde_size4;
|
||||
+extern const struct rtw89_dle_size rtw89_wde_size18;
|
||||
+extern const struct rtw89_dle_size rtw89_wde_size19;
|
||||
extern const struct rtw89_dle_size rtw89_ple_size0;
|
||||
extern const struct rtw89_dle_size rtw89_ple_size4;
|
||||
+extern const struct rtw89_dle_size rtw89_ple_size18;
|
||||
+extern const struct rtw89_dle_size rtw89_ple_size19;
|
||||
extern const struct rtw89_wde_quota rtw89_wde_qt0;
|
||||
extern const struct rtw89_wde_quota rtw89_wde_qt4;
|
||||
+extern const struct rtw89_wde_quota rtw89_wde_qt17;
|
||||
+extern const struct rtw89_wde_quota rtw89_wde_qt18;
|
||||
extern const struct rtw89_ple_quota rtw89_ple_qt4;
|
||||
extern const struct rtw89_ple_quota rtw89_ple_qt5;
|
||||
extern const struct rtw89_ple_quota rtw89_ple_qt13;
|
||||
+extern const struct rtw89_ple_quota rtw89_ple_qt44;
|
||||
+extern const struct rtw89_ple_quota rtw89_ple_qt45;
|
||||
+extern const struct rtw89_ple_quota rtw89_ple_qt46;
|
||||
+extern const struct rtw89_ple_quota rtw89_ple_qt47;
|
||||
|
||||
static inline u32 rtw89_mac_reg_by_idx(u32 reg_base, u8 band)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 30e05abc7b55..222aaddbff62 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -554,6 +554,7 @@
|
||||
#define R_AX_PLE_QTA8_CFG 0x9060
|
||||
#define R_AX_PLE_QTA9_CFG 0x9064
|
||||
#define R_AX_PLE_QTA10_CFG 0x9068
|
||||
+#define R_AX_PLE_QTA11_CFG 0x906C
|
||||
|
||||
#define R_AX_PLE_INI_STATUS 0x9100
|
||||
#define B_AX_PLE_Q_MGN_INI_RDY BIT(1)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index d555ea79dec5..55dca693cb5a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -7,6 +7,17 @@
|
||||
#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
|
||||
+static const struct rtw89_dle_mem rtw8852c_dle_mem_pcie[] = {
|
||||
+ [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_wde_size19, &rtw89_ple_size19,
|
||||
+ &rtw89_wde_qt18, &rtw89_wde_qt18, &rtw89_ple_qt46,
|
||||
+ &rtw89_ple_qt47},
|
||||
+ [RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_wde_size18,
|
||||
+ &rtw89_ple_size18, &rtw89_wde_qt17, &rtw89_wde_qt17,
|
||||
+ &rtw89_ple_qt44, &rtw89_ple_qt45},
|
||||
+ [RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL,
|
||||
+ NULL},
|
||||
+};
|
||||
+
|
||||
static const u32 rtw8852c_h2c_regs[RTW89_H2CREG_MAX] = {
|
||||
R_AX_H2CREG_DATA0_V1, R_AX_H2CREG_DATA1_V1, R_AX_H2CREG_DATA2_V1,
|
||||
R_AX_H2CREG_DATA3_V1
|
||||
@@ -218,6 +229,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.chip_id = RTL8852C,
|
||||
.ops = &rtw8852c_chip_ops,
|
||||
.fw_name = "rtw89/rtw8852c_fw.bin",
|
||||
+ .dle_mem = rtw8852c_dle_mem_pcie,
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN_V1,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
From a6af2ba35694187af5300021cc5e238eac349c2d Mon Sep 17 00:00:00 2001
|
||||
From: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:40 +0800
|
||||
Subject: [PATCH 504/544] rtw89: 8852c: add mac_ctrl_path and mac_cfg_gnt APIs
|
||||
|
||||
The BT-coexistence uses these function to control antenna and TDMA, so
|
||||
implement the variant type to support all chips.
|
||||
|
||||
Signed-off-by: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-10-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/coex.c | 24 +++----
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 19 +++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 70 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 3 +
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 25 +++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 2 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 2 +
|
||||
7 files changed, 133 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
index 99abd0fe7f15..684583955511 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
@@ -1478,7 +1478,7 @@ static void _set_gnt_wl(struct rtw89_dev *rtwdev, u8 phy_map, u8 state)
|
||||
}
|
||||
}
|
||||
|
||||
- rtw89_mac_cfg_gnt(rtwdev, &dm->gnt);
|
||||
+ rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
|
||||
}
|
||||
|
||||
#define BTC_TDMA_WLROLE_MAX 2
|
||||
@@ -2233,7 +2233,7 @@ static void _set_gnt_bt(struct rtw89_dev *rtwdev, u8 phy_map, u8 state)
|
||||
}
|
||||
}
|
||||
|
||||
- rtw89_mac_cfg_gnt(rtwdev, &dm->gnt);
|
||||
+ rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
|
||||
}
|
||||
|
||||
static void _set_bt_plut(struct rtw89_dev *rtwdev, u8 phy_map,
|
||||
@@ -2300,7 +2300,7 @@ static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
|
||||
|
||||
switch (type) {
|
||||
case BTC_ANT_WPOWERON:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, false);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, false);
|
||||
break;
|
||||
case BTC_ANT_WINIT:
|
||||
if (bt->enable.now) {
|
||||
@@ -2310,21 +2310,21 @@ static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
|
||||
}
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_BT, BTC_PLT_BT);
|
||||
break;
|
||||
case BTC_ANT_WONLY:
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
break;
|
||||
case BTC_ANT_WOFF:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, false);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, false);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
break;
|
||||
case BTC_ANT_W2G:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
if (rtwdev->dbcc_en) {
|
||||
for (i = 0; i < RTW89_PHY_MAX; i++) {
|
||||
b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G);
|
||||
@@ -2352,32 +2352,32 @@ static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
|
||||
}
|
||||
break;
|
||||
case BTC_ANT_W5G:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
break;
|
||||
case BTC_ANT_W25G:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_HW);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL,
|
||||
BTC_PLT_GNT_WL, BTC_PLT_GNT_WL);
|
||||
break;
|
||||
case BTC_ANT_FREERUN:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
break;
|
||||
case BTC_ANT_WRFK:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, true);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, true);
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO);
|
||||
_set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
break;
|
||||
case BTC_ANT_BRFK:
|
||||
- rtw89_mac_cfg_ctrl_path(rtwdev, false);
|
||||
+ rtw89_chip_cfg_ctrl_path(rtwdev, false);
|
||||
_set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_LO);
|
||||
_set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI);
|
||||
_set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 95f105232e80..08416f005b50 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2068,6 +2068,9 @@ struct rtw89_chip_ops {
|
||||
s8 pw_ofst, enum rtw89_mac_idx mac_idx);
|
||||
int (*pwr_on_func)(struct rtw89_dev *rtwdev);
|
||||
int (*pwr_off_func)(struct rtw89_dev *rtwdev);
|
||||
+ int (*cfg_ctrl_path)(struct rtw89_dev *rtwdev, bool wl);
|
||||
+ int (*mac_cfg_gnt)(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
|
||||
|
||||
void (*btc_set_rfe)(struct rtw89_dev *rtwdev);
|
||||
void (*btc_init_cfg)(struct rtw89_dev *rtwdev);
|
||||
@@ -3467,6 +3470,22 @@ static inline void rtw89_ctrl_btg(struct rtw89_dev *rtwdev, bool btg)
|
||||
chip->ops->ctrl_btg(rtwdev, btg);
|
||||
}
|
||||
|
||||
+static inline
|
||||
+void rtw89_chip_mac_cfg_gnt(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_mac_ax_coex_gnt *gnt_cfg)
|
||||
+{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ chip->ops->mac_cfg_gnt(rtwdev, gnt_cfg);
|
||||
+}
|
||||
+
|
||||
+static inline void rtw89_chip_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl)
|
||||
+{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ chip->ops->cfg_ctrl_path(rtwdev, wl);
|
||||
+}
|
||||
+
|
||||
static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
__le16 fc = hdr->frame_control;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index e52b0e7b5382..d68eb3126d8a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -3652,6 +3652,54 @@ int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw89_mac_cfg_gnt);
|
||||
+
|
||||
+int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_mac_ax_coex_gnt *gnt_cfg)
|
||||
+{
|
||||
+ u32 val = 0;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_bt)
|
||||
+ val |= B_AX_GNT_BT_RFC_S0_VAL | B_AX_GNT_BT_RX_VAL |
|
||||
+ B_AX_GNT_BT_TX_VAL;
|
||||
+ else
|
||||
+ val |= B_AX_WL_ACT_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_bt_sw_en)
|
||||
+ val |= B_AX_GNT_BT_RFC_S0_SWCTRL | B_AX_GNT_BT_RX_SWCTRL |
|
||||
+ B_AX_GNT_BT_TX_SWCTRL | B_AX_WL_ACT_SWCTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_wl)
|
||||
+ val |= B_AX_GNT_WL_RFC_S0_VAL | B_AX_GNT_WL_RX_VAL |
|
||||
+ B_AX_GNT_WL_TX_VAL | B_AX_GNT_WL_BB_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_wl_sw_en)
|
||||
+ val |= B_AX_GNT_WL_RFC_S0_SWCTRL | B_AX_GNT_WL_RX_SWCTRL |
|
||||
+ B_AX_GNT_WL_TX_SWCTRL | B_AX_GNT_WL_BB_SWCTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_bt)
|
||||
+ val |= B_AX_GNT_BT_RFC_S1_VAL | B_AX_GNT_BT_RX_VAL |
|
||||
+ B_AX_GNT_BT_TX_VAL;
|
||||
+ else
|
||||
+ val |= B_AX_WL_ACT_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_bt_sw_en)
|
||||
+ val |= B_AX_GNT_BT_RFC_S1_SWCTRL | B_AX_GNT_BT_RX_SWCTRL |
|
||||
+ B_AX_GNT_BT_TX_SWCTRL | B_AX_WL_ACT_SWCTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_wl)
|
||||
+ val |= B_AX_GNT_WL_RFC_S1_VAL | B_AX_GNT_WL_RX_VAL |
|
||||
+ B_AX_GNT_WL_TX_VAL | B_AX_GNT_WL_BB_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_wl_sw_en)
|
||||
+ val |= B_AX_GNT_WL_RFC_S1_SWCTRL | B_AX_GNT_WL_RX_SWCTRL |
|
||||
+ B_AX_GNT_WL_TX_SWCTRL | B_AX_GNT_WL_BB_SWCTRL;
|
||||
+
|
||||
+ rtw89_write32(rtwdev, R_AX_GNT_SW_CTRL, val);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_mac_cfg_gnt_v1);
|
||||
|
||||
int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt)
|
||||
{
|
||||
@@ -3711,6 +3759,28 @@ int rtw89_mac_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl)
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path);
|
||||
+
|
||||
+int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl)
|
||||
+{
|
||||
+ struct rtw89_btc *btc = &rtwdev->btc;
|
||||
+ struct rtw89_btc_dm *dm = &btc->dm;
|
||||
+ struct rtw89_mac_ax_gnt *g = dm->gnt.band;
|
||||
+ int i;
|
||||
+
|
||||
+ if (wl)
|
||||
+ return 0;
|
||||
+
|
||||
+ for (i = 0; i < RTW89_PHY_MAX; i++) {
|
||||
+ g[i].gnt_bt_sw_en = 1;
|
||||
+ g[i].gnt_bt = 1;
|
||||
+ g[i].gnt_wl_sw_en = 1;
|
||||
+ g[i].gnt_wl = 0;
|
||||
+ }
|
||||
+
|
||||
+ return rtw89_mac_cfg_gnt_v1(rtwdev, &dm->gnt);
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v1);
|
||||
|
||||
bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 680b0eea3174..0fb09d6e176d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -799,12 +799,15 @@ void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop);
|
||||
int rtw89_mac_coex_init(struct rtw89_dev *rtwdev, const struct rtw89_mac_ax_coex *coex);
|
||||
int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
|
||||
+int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
|
||||
int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt);
|
||||
u16 rtw89_mac_get_plt_cnt(struct rtw89_dev *rtwdev, u8 band);
|
||||
void rtw89_mac_cfg_sb(struct rtw89_dev *rtwdev, u32 val);
|
||||
u32 rtw89_mac_get_sb(struct rtw89_dev *rtwdev);
|
||||
bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl);
|
||||
+int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl);
|
||||
bool rtw89_mac_get_txpwr_cr(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
u32 reg_base, u32 *cr);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 5c11c5d81c8b..b37270e21364 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -1620,6 +1620,31 @@
|
||||
#define B_AX_STATIS_BT_LO_TX_1_MASK GENMASK(15, 0)
|
||||
#define B_AX_STATIS_BT_LO_RX_1_MASK GENMASK(31, 16)
|
||||
|
||||
+#define R_AX_GNT_SW_CTRL 0xDA48
|
||||
+#define R_AX_GNT_SW_CTRL_C1 0xFA48
|
||||
+#define B_AX_WL_ACT2_VAL BIT(21)
|
||||
+#define B_AX_WL_ACT2_SWCTRL BIT(20)
|
||||
+#define B_AX_WL_ACT_VAL BIT(19)
|
||||
+#define B_AX_WL_ACT_SWCTRL BIT(18)
|
||||
+#define B_AX_GNT_BT_RX_VAL BIT(17)
|
||||
+#define B_AX_GNT_BT_RX_SWCTRL BIT(16)
|
||||
+#define B_AX_GNT_BT_TX_VAL BIT(15)
|
||||
+#define B_AX_GNT_BT_TX_SWCTRL BIT(14)
|
||||
+#define B_AX_GNT_WL_RX_VAL BIT(13)
|
||||
+#define B_AX_GNT_WL_RX_SWCTRL BIT(12)
|
||||
+#define B_AX_GNT_WL_TX_VAL BIT(11)
|
||||
+#define B_AX_GNT_WL_TX_SWCTRL BIT(10)
|
||||
+#define B_AX_GNT_BT_RFC_S1_VAL BIT(9)
|
||||
+#define B_AX_GNT_BT_RFC_S1_SWCTRL BIT(8)
|
||||
+#define B_AX_GNT_WL_RFC_S1_VAL BIT(7)
|
||||
+#define B_AX_GNT_WL_RFC_S1_SWCTRL BIT(6)
|
||||
+#define B_AX_GNT_BT_RFC_S0_VAL BIT(5)
|
||||
+#define B_AX_GNT_BT_RFC_S0_SWCTRL BIT(4)
|
||||
+#define B_AX_GNT_WL_RFC_S0_VAL BIT(3)
|
||||
+#define B_AX_GNT_WL_RFC_S0_SWCTRL BIT(2)
|
||||
+#define B_AX_GNT_WL_BB_VAL BIT(1)
|
||||
+#define B_AX_GNT_WL_BB_SWCTRL BIT(0)
|
||||
+
|
||||
#define R_AX_TDMA_MODE 0xDA4C
|
||||
#define R_AX_TDMA_MODE_C1 0xFA4C
|
||||
#define B_AX_R_BT_CMD_RPT_MASK GENMASK(31, 16)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index c6986c649813..51e904ef8525 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -2019,6 +2019,8 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
|
||||
.set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset,
|
||||
.pwr_on_func = NULL,
|
||||
.pwr_off_func = NULL,
|
||||
+ .cfg_ctrl_path = rtw89_mac_cfg_ctrl_path,
|
||||
+ .mac_cfg_gnt = rtw89_mac_cfg_gnt,
|
||||
|
||||
.btc_set_rfe = rtw8852a_btc_set_rfe,
|
||||
.btc_init_cfg = rtw8852a_btc_init_cfg,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index 173008b14c4d..2ea9d5422ed7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -490,6 +490,8 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
.set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
+ .cfg_ctrl_path = rtw89_mac_cfg_ctrl_path_v1,
|
||||
+ .mac_cfg_gnt = rtw89_mac_cfg_gnt_v1,
|
||||
};
|
||||
|
||||
const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
From 7f01d3be17b08735a66eca47866fa53214c3e846 Mon Sep 17 00:00:00 2001
|
||||
From: Chung-Hsuan Hung <hsuan8331@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:35 +0800
|
||||
Subject: [PATCH 499/544] rtw89: 8852c: add read/write rf register function
|
||||
|
||||
Using encoded address which BIT(16) is used to discriminate which region is
|
||||
going to access. Illustrate the calling flow as below
|
||||
|
||||
rtw89_phy_write_rf_v1() -+-> rtw89_phy_write_rf() // old interface
|
||||
+-> rtw89_phy_write_rf_a() // new interface
|
||||
|
||||
Signed-off-by: Chung-Hsuan Hung <hsuan8331@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-5-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 110 ++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.h | 5 +
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 15 +++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 4 +
|
||||
4 files changed, 134 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index b75d08697a22..43d73ec3f759 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -604,6 +604,12 @@ u8 rtw89_phy_get_txsc(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_get_txsc);
|
||||
|
||||
+static bool rtw89_phy_check_swsi_busy(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ return !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_W_BUSY_V1) ||
|
||||
+ !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_R_BUSY_V1);
|
||||
+}
|
||||
+
|
||||
u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
u32 addr, u32 mask)
|
||||
{
|
||||
@@ -626,6 +632,56 @@ u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_read_rf);
|
||||
|
||||
+static u32 rtw89_phy_read_rf_a(struct rtw89_dev *rtwdev,
|
||||
+ enum rtw89_rf_path rf_path, u32 addr, u32 mask)
|
||||
+{
|
||||
+ bool busy;
|
||||
+ bool done;
|
||||
+ u32 val;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = read_poll_timeout_atomic(rtw89_phy_check_swsi_busy, busy, !busy,
|
||||
+ 1, 30, false, rtwdev);
|
||||
+ if (ret) {
|
||||
+ rtw89_err(rtwdev, "read rf busy swsi\n");
|
||||
+ return INV_RF_DATA;
|
||||
+ }
|
||||
+
|
||||
+ mask &= RFREG_MASK;
|
||||
+
|
||||
+ val = FIELD_PREP(B_SWSI_READ_ADDR_PATH_V1, rf_path) |
|
||||
+ FIELD_PREP(B_SWSI_READ_ADDR_ADDR_V1, addr);
|
||||
+ rtw89_phy_write32_mask(rtwdev, R_SWSI_READ_ADDR_V1, B_SWSI_READ_ADDR_V1, val);
|
||||
+ udelay(2);
|
||||
+
|
||||
+ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, done, done, 1,
|
||||
+ 30, false, rtwdev, R_SWSI_V1,
|
||||
+ B_SWSI_R_DATA_DONE_V1);
|
||||
+ if (ret) {
|
||||
+ rtw89_err(rtwdev, "read swsi busy\n");
|
||||
+ return INV_RF_DATA;
|
||||
+ }
|
||||
+
|
||||
+ return rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, mask);
|
||||
+}
|
||||
+
|
||||
+u32 rtw89_phy_read_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
+ u32 addr, u32 mask)
|
||||
+{
|
||||
+ bool ad_sel = FIELD_GET(RTW89_RF_ADDR_ADSEL_MASK, addr);
|
||||
+
|
||||
+ if (rf_path >= rtwdev->chip->rf_path_num) {
|
||||
+ rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path);
|
||||
+ return INV_RF_DATA;
|
||||
+ }
|
||||
+
|
||||
+ if (ad_sel)
|
||||
+ return rtw89_phy_read_rf(rtwdev, rf_path, addr, mask);
|
||||
+ else
|
||||
+ return rtw89_phy_read_rf_a(rtwdev, rf_path, addr, mask);
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_phy_read_rf_v1);
|
||||
+
|
||||
bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data)
|
||||
{
|
||||
@@ -651,6 +707,60 @@ bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_write_rf);
|
||||
|
||||
+static bool rtw89_phy_write_rf_a(struct rtw89_dev *rtwdev,
|
||||
+ enum rtw89_rf_path rf_path, u32 addr, u32 mask,
|
||||
+ u32 data)
|
||||
+{
|
||||
+ u8 bit_shift;
|
||||
+ u32 val;
|
||||
+ bool busy, b_msk_en = false;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = read_poll_timeout_atomic(rtw89_phy_check_swsi_busy, busy, !busy,
|
||||
+ 1, 30, false, rtwdev);
|
||||
+ if (ret) {
|
||||
+ rtw89_err(rtwdev, "write rf busy swsi\n");
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ data &= RFREG_MASK;
|
||||
+ mask &= RFREG_MASK;
|
||||
+
|
||||
+ if (mask != RFREG_MASK) {
|
||||
+ b_msk_en = true;
|
||||
+ rtw89_phy_write32_mask(rtwdev, R_SWSI_BIT_MASK_V1, RFREG_MASK,
|
||||
+ mask);
|
||||
+ bit_shift = __ffs(mask);
|
||||
+ data = (data << bit_shift) & RFREG_MASK;
|
||||
+ }
|
||||
+
|
||||
+ val = FIELD_PREP(B_SWSI_DATA_BIT_MASK_EN_V1, b_msk_en) |
|
||||
+ FIELD_PREP(B_SWSI_DATA_PATH_V1, rf_path) |
|
||||
+ FIELD_PREP(B_SWSI_DATA_ADDR_V1, addr) |
|
||||
+ FIELD_PREP(B_SWSI_DATA_VAL_V1, data);
|
||||
+
|
||||
+ rtw89_phy_write32_mask(rtwdev, R_SWSI_DATA_V1, MASKDWORD, val);
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
+ u32 addr, u32 mask, u32 data)
|
||||
+{
|
||||
+ bool ad_sel = FIELD_GET(RTW89_RF_ADDR_ADSEL_MASK, addr);
|
||||
+
|
||||
+ if (rf_path >= rtwdev->chip->rf_path_num) {
|
||||
+ rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (ad_sel)
|
||||
+ return rtw89_phy_write_rf(rtwdev, rf_path, addr, mask, data);
|
||||
+ else
|
||||
+ return rtw89_phy_write_rf_a(rtwdev, rf_path, addr, mask, data);
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_phy_write_rf_v1);
|
||||
+
|
||||
static void rtw89_phy_bb_reset(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
index d6bc84ae6cd7..e600e01cbdd1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "core.h"
|
||||
|
||||
#define RTW89_PHY_ADDR_OFFSET 0x10000
|
||||
+#define RTW89_RF_ADDR_ADSEL_MASK BIT(16)
|
||||
|
||||
#define get_phy_headline(addr) FIELD_GET(GENMASK(31, 28), addr)
|
||||
#define PHY_HEADLINE_VALID 0xf
|
||||
@@ -395,8 +396,12 @@ u8 rtw89_phy_get_txsc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_bandwidth dbw);
|
||||
u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
u32 addr, u32 mask);
|
||||
+u32 rtw89_phy_read_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
+ u32 addr, u32 mask);
|
||||
bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data);
|
||||
+bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
+ u32 addr, u32 mask, u32 data);
|
||||
void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_dm_init(struct rtw89_dev *rtwdev);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 09bf3afd6d9f..26efdfa70c04 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -1805,6 +1805,17 @@
|
||||
#define B_ANAPAR_FLTRST BIT(22)
|
||||
#define B_ANAPAR_CRXBB GENMASK(18, 16)
|
||||
#define B_ANAPAR_14 GENMASK(15, 0)
|
||||
+#define R_SWSI_DATA_V1 0x0370
|
||||
+#define B_SWSI_DATA_VAL_V1 GENMASK(19, 0)
|
||||
+#define B_SWSI_DATA_ADDR_V1 GENMASK(27, 20)
|
||||
+#define B_SWSI_DATA_PATH_V1 GENMASK(30, 28)
|
||||
+#define B_SWSI_DATA_BIT_MASK_EN_V1 BIT(31)
|
||||
+#define R_SWSI_BIT_MASK_V1 0x0374
|
||||
+#define B_SWSI_BIT_MASK_V1 GENMASK(19, 0)
|
||||
+#define R_SWSI_READ_ADDR_V1 0x0378
|
||||
+#define B_SWSI_READ_ADDR_ADDR_V1 GENMASK(7, 0)
|
||||
+#define B_SWSI_READ_ADDR_PATH_V1 GENMASK(10, 8)
|
||||
+#define B_SWSI_READ_ADDR_V1 GENMASK(10, 0)
|
||||
#define R_UPD_CLK_ADC 0x0700
|
||||
#define B_UPD_CLK_ADC_ON BIT(24)
|
||||
#define B_UPD_CLK_ADC_VAL GENMASK(26, 25)
|
||||
@@ -1912,6 +1923,10 @@
|
||||
#define R_CFO_COMP_SEG0_H 0x1388
|
||||
#define R_CFO_COMP_SEG0_CTRL 0x138C
|
||||
#define R_DBG32_D 0x1730
|
||||
+#define R_SWSI_V1 0x174C
|
||||
+#define B_SWSI_W_BUSY_V1 BIT(24)
|
||||
+#define B_SWSI_R_BUSY_V1 BIT(25)
|
||||
+#define B_SWSI_R_DATA_DONE_V1 BIT(26)
|
||||
#define R_TX_COUNTER 0x1A40
|
||||
#define R_IFS_CLM_TX_CNT 0x1ACC
|
||||
#define B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK GENMASK(31, 16)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index c74dedea511a..173008b14c4d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "debug.h"
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
+#include "phy.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
|
||||
@@ -484,6 +485,8 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
.read_efuse = rtw8852c_read_efuse,
|
||||
.read_phycap = rtw8852c_read_phycap,
|
||||
.power_trim = rtw8852c_power_trim,
|
||||
+ .read_rf = rtw89_phy_read_rf_v1,
|
||||
+ .write_rf = rtw89_phy_write_rf_v1,
|
||||
.set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
@@ -494,6 +497,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.ops = &rtw8852c_chip_ops,
|
||||
.fw_name = "rtw89/rtw8852c_fw.bin",
|
||||
.dle_mem = rtw8852c_dle_mem_pcie,
|
||||
+ .rf_base_addr = {0xe000, 0xf000},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.sec_ctrl_efuse_size = 4,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
From 311d0c0cdfdb271be7997f015f655bb48fc2bf2a Mon Sep 17 00:00:00 2001
|
||||
From: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:34 +0800
|
||||
Subject: [PATCH 498/544] rtw89: 8852c: add setting of TB UL TX power offset
|
||||
|
||||
Configure this TX power to indicate TX power offset that uses to transmit
|
||||
TB (trigger base) uplink frames.
|
||||
Also, shrink the unit of TX power offset changes to suitable type s8.
|
||||
|
||||
Signed-off-by: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-4-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 +-
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 8 ++---
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 36 +++++++++++++++++++
|
||||
4 files changed, 43 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 51c99e50b0ed..af73347c40b1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2065,7 +2065,7 @@ struct rtw89_chip_ops {
|
||||
struct ieee80211_rx_status *status);
|
||||
void (*bb_ctrl_btc_preagc)(struct rtw89_dev *rtwdev, bool bt_en);
|
||||
void (*set_txpwr_ul_tb_offset)(struct rtw89_dev *rtwdev,
|
||||
- s16 pw_ofst, enum rtw89_mac_idx mac_idx);
|
||||
+ s8 pw_ofst, enum rtw89_mac_idx mac_idx);
|
||||
int (*pwr_on_func)(struct rtw89_dev *rtwdev);
|
||||
int (*pwr_off_func)(struct rtw89_dev *rtwdev);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index a239bf017ac7..09bf3afd6d9f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -1525,8 +1525,10 @@
|
||||
#define B_AX_PWR_UL_TB_CTRL_EN BIT(31)
|
||||
#define R_AX_PWR_UL_TB_1T 0xD28C
|
||||
#define B_AX_PWR_UL_TB_1T_MASK GENMASK(4, 0)
|
||||
+#define B_AX_PWR_UL_TB_1T_V1_MASK GENMASK(7, 0)
|
||||
#define R_AX_PWR_UL_TB_2T 0xD290
|
||||
#define B_AX_PWR_UL_TB_2T_MASK GENMASK(4, 0)
|
||||
+#define B_AX_PWR_UL_TB_2T_V1_MASK GENMASK(7, 0)
|
||||
#define R_AX_PWR_BY_RATE_TABLE0 0xD2C0
|
||||
#define R_AX_PWR_BY_RATE_TABLE10 0xD2E8
|
||||
#define R_AX_PWR_BY_RATE R_AX_PWR_BY_RATE_TABLE0
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index 392f6e6e0a13..c6986c649813 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -1275,10 +1275,10 @@ static u32 rtw8852a_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
|
||||
static
|
||||
void rtw8852a_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
|
||||
- s16 pw_ofst, enum rtw89_mac_idx mac_idx)
|
||||
+ s8 pw_ofst, enum rtw89_mac_idx mac_idx)
|
||||
{
|
||||
- s32 val_1t = 0;
|
||||
- s32 val_2t = 0;
|
||||
+ s8 val_1t = 0;
|
||||
+ s8 val_2t = 0;
|
||||
u32 reg;
|
||||
|
||||
if (pw_ofst < -16 || pw_ofst > 15) {
|
||||
@@ -1288,7 +1288,7 @@ void rtw8852a_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN);
|
||||
- val_1t = (s32)pw_ofst;
|
||||
+ val_1t = pw_ofst;
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, val_1t);
|
||||
val_2t = max(val_1t - 3, -16);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index f37acfe7679e..c74dedea511a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -445,10 +445,46 @@ static void rtw8852c_power_trim(struct rtw89_dev *rtwdev)
|
||||
rtw8852c_pa_bias_trim(rtwdev);
|
||||
}
|
||||
|
||||
+static
|
||||
+void rtw8852c_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
|
||||
+ s8 pw_ofst, enum rtw89_mac_idx mac_idx)
|
||||
+{
|
||||
+ s8 pw_ofst_2tx;
|
||||
+ s8 val_1t;
|
||||
+ s8 val_2t;
|
||||
+ u32 reg;
|
||||
+ u8 i;
|
||||
+
|
||||
+ if (pw_ofst < -32 || pw_ofst > 31) {
|
||||
+ rtw89_warn(rtwdev, "[ULTB] Err pwr_offset=%d\n", pw_ofst);
|
||||
+ return;
|
||||
+ }
|
||||
+ val_1t = pw_ofst << 2;
|
||||
+ pw_ofst_2tx = max(pw_ofst - 3, -32);
|
||||
+ val_2t = pw_ofst_2tx << 2;
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[ULTB] val_1tx=0x%x\n", val_1t);
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[ULTB] val_2tx=0x%x\n", val_2t);
|
||||
+
|
||||
+ for (i = 0; i < 4; i++) {
|
||||
+ /* 1TX */
|
||||
+ reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx);
|
||||
+ rtw89_write32_mask(rtwdev, reg,
|
||||
+ B_AX_PWR_UL_TB_1T_V1_MASK << (8 * i),
|
||||
+ val_1t);
|
||||
+ /* 2TX */
|
||||
+ reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx);
|
||||
+ rtw89_write32_mask(rtwdev, reg,
|
||||
+ B_AX_PWR_UL_TB_2T_V1_MASK << (8 * i),
|
||||
+ val_2t);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
.read_efuse = rtw8852c_read_efuse,
|
||||
.read_phycap = rtw8852c_read_phycap,
|
||||
.power_trim = rtw8852c_power_trim,
|
||||
+ .set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
};
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
From 93ab22d514cf8073758d3d347038b2aa7d4067da Mon Sep 17 00:00:00 2001
|
||||
From: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:33 +0800
|
||||
Subject: [PATCH 497/544] rtw89: 8852c: add write/read crystal function in CFO
|
||||
tracking
|
||||
|
||||
The CFO tracking algorithm is the same, but control methods are different.
|
||||
Set parameters via xtal serial interfaces (SI).
|
||||
|
||||
Signed-off-by: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 19 +++++++++++++++----
|
||||
2 files changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 2f707c817fa7..680b0eea3174 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -884,7 +884,9 @@ int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
|
||||
enum rtw89_mac_xtal_si_offset {
|
||||
XTAL_SI_XTAL_SC_XI = 0x04,
|
||||
+#define XTAL_SC_XI_MASK GENMASK(7, 0)
|
||||
XTAL_SI_XTAL_SC_XO = 0x05,
|
||||
+#define XTAL_SC_XO_MASK GENMASK(7, 0)
|
||||
XTAL_SI_PWR_CUT = 0x10,
|
||||
#define XTAL_SI_SMALL_PWR_CUT BIT(0)
|
||||
#define XTAL_SI_BIG_PWR_CUT BIT(1)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 6a7e08bdd00e..b75d08697a22 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "debug.h"
|
||||
#include "fw.h"
|
||||
+#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "ps.h"
|
||||
#include "reg.h"
|
||||
@@ -1667,15 +1668,25 @@ static void rtw89_phy_cfo_set_crystal_cap(struct rtw89_dev *rtwdev,
|
||||
u8 crystal_cap, bool force)
|
||||
{
|
||||
struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
u8 sc_xi_val, sc_xo_val;
|
||||
|
||||
if (!force && cfo->crystal_cap == crystal_cap)
|
||||
return;
|
||||
crystal_cap = clamp_t(u8, crystal_cap, 0, 127);
|
||||
- rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap);
|
||||
- rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap);
|
||||
- sc_xo_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, true);
|
||||
- sc_xi_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, false);
|
||||
+ if (chip->chip_id == RTL8852A) {
|
||||
+ rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap);
|
||||
+ rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap);
|
||||
+ sc_xo_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, true);
|
||||
+ sc_xi_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, false);
|
||||
+ } else {
|
||||
+ rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO,
|
||||
+ crystal_cap, XTAL_SC_XO_MASK);
|
||||
+ rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI,
|
||||
+ crystal_cap, XTAL_SC_XI_MASK);
|
||||
+ rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO, &sc_xo_val);
|
||||
+ rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI, &sc_xi_val);
|
||||
+ }
|
||||
cfo->crystal_cap = sc_xi_val;
|
||||
cfo->x_cap_ofst = (s8)((int)cfo->crystal_cap - cfo->def_x_cap);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,244 @@
|
||||
From 3bad5a305b1bf9563fc69804e3b079727bc8f0b1 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:56 +0800
|
||||
Subject: [PATCH 492/544] rtw89: 8852c: process efuse of phycap
|
||||
|
||||
Read phycap data programmed in efuse, and store them into array.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-13-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 4 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 159 ++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.h | 2 +
|
||||
3 files changed, 165 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 6013f73ed7ca..483cf45fbcc9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2666,18 +2666,22 @@ struct rtw89_cfo_tracking_info {
|
||||
|
||||
/* 2GL, 2GH, 5GL1, 5GH1, 5GM1, 5GM2, 5GH1, 5GH2 */
|
||||
#define TSSI_TRIM_CH_GROUP_NUM 8
|
||||
+#define TSSI_TRIM_CH_GROUP_NUM_6G 16
|
||||
|
||||
#define TSSI_CCK_CH_GROUP_NUM 6
|
||||
#define TSSI_MCS_2G_CH_GROUP_NUM 5
|
||||
#define TSSI_MCS_5G_CH_GROUP_NUM 14
|
||||
+#define TSSI_MCS_6G_CH_GROUP_NUM 32
|
||||
#define TSSI_MCS_CH_GROUP_NUM \
|
||||
(TSSI_MCS_2G_CH_GROUP_NUM + TSSI_MCS_5G_CH_GROUP_NUM)
|
||||
|
||||
struct rtw89_tssi_info {
|
||||
u8 thermal[RF_PATH_MAX];
|
||||
s8 tssi_trim[RF_PATH_MAX][TSSI_TRIM_CH_GROUP_NUM];
|
||||
+ s8 tssi_trim_6g[RF_PATH_MAX][TSSI_TRIM_CH_GROUP_NUM_6G];
|
||||
s8 tssi_cck[RF_PATH_MAX][TSSI_CCK_CH_GROUP_NUM];
|
||||
s8 tssi_mcs[RF_PATH_MAX][TSSI_MCS_CH_GROUP_NUM];
|
||||
+ s8 tssi_6g_mcs[RF_PATH_MAX][TSSI_MCS_6G_CH_GROUP_NUM];
|
||||
s8 extra_ofst[RF_PATH_MAX];
|
||||
bool tssi_tracking_check[RF_PATH_MAX];
|
||||
u8 default_txagc_offset[RF_PATH_MAX];
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index e17e0ab75d0e..df6e9bf69f90 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -2,6 +2,7 @@
|
||||
/* Copyright(c) 2019-2022 Realtek Corporation
|
||||
*/
|
||||
|
||||
+#include "debug.h"
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "reg.h"
|
||||
@@ -220,7 +221,163 @@ static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void rtw8852c_phycap_parsing_tssi(struct rtw89_dev *rtwdev, u8 *phycap_map)
|
||||
+{
|
||||
+ struct rtw89_tssi_info *tssi = &rtwdev->tssi;
|
||||
+ static const u32 tssi_trim_addr[RF_PATH_NUM_8852C] = {0x5D6, 0x5AB};
|
||||
+ static const u32 tssi_trim_addr_6g[RF_PATH_NUM_8852C] = {0x5CE, 0x5A3};
|
||||
+ u32 addr = rtwdev->chip->phycap_addr;
|
||||
+ bool pg = false;
|
||||
+ u32 ofst;
|
||||
+ u8 i, j;
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++) {
|
||||
+ /* addrs are in decreasing order */
|
||||
+ ofst = tssi_trim_addr[i] - addr - j;
|
||||
+ tssi->tssi_trim[i][j] = phycap_map[ofst];
|
||||
+
|
||||
+ if (phycap_map[ofst] != 0xff)
|
||||
+ pg = true;
|
||||
+ }
|
||||
+
|
||||
+ for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM_6G; j++) {
|
||||
+ /* addrs are in decreasing order */
|
||||
+ ofst = tssi_trim_addr_6g[i] - addr - j;
|
||||
+ tssi->tssi_trim_6g[i][j] = phycap_map[ofst];
|
||||
+
|
||||
+ if (phycap_map[ofst] != 0xff)
|
||||
+ pg = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!pg) {
|
||||
+ memset(tssi->tssi_trim, 0, sizeof(tssi->tssi_trim));
|
||||
+ memset(tssi->tssi_trim_6g, 0, sizeof(tssi->tssi_trim_6g));
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
+ "[TSSI][TRIM] no PG, set all trim info to 0\n");
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++)
|
||||
+ for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++)
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
+ "[TSSI] path=%d idx=%d trim=0x%x addr=0x%x\n",
|
||||
+ i, j, tssi->tssi_trim[i][j],
|
||||
+ tssi_trim_addr[i] - j);
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_phycap_parsing_thermal_trim(struct rtw89_dev *rtwdev,
|
||||
+ u8 *phycap_map)
|
||||
+{
|
||||
+ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
|
||||
+ static const u32 thm_trim_addr[RF_PATH_NUM_8852C] = {0x5DF, 0x5DC};
|
||||
+ u32 addr = rtwdev->chip->phycap_addr;
|
||||
+ u8 i;
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ info->thermal_trim[i] = phycap_map[thm_trim_addr[i] - addr];
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[THERMAL][TRIM] path=%d thermal_trim=0x%x\n",
|
||||
+ i, info->thermal_trim[i]);
|
||||
+
|
||||
+ if (info->thermal_trim[i] != 0xff)
|
||||
+ info->pg_thermal_trim = true;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_thermal_trim(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+#define __thm_setting(raw) \
|
||||
+({ \
|
||||
+ u8 __v = (raw); \
|
||||
+ ((__v & 0x1) << 3) | ((__v & 0x1f) >> 1); \
|
||||
+})
|
||||
+ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
|
||||
+ u8 i, val;
|
||||
+
|
||||
+ if (!info->pg_thermal_trim) {
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[THERMAL][TRIM] no PG, do nothing\n");
|
||||
+
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ val = __thm_setting(info->thermal_trim[i]);
|
||||
+ rtw89_write_rf(rtwdev, i, RR_TM2, RR_TM2_OFF, val);
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[THERMAL][TRIM] path=%d thermal_setting=0x%x\n",
|
||||
+ i, val);
|
||||
+ }
|
||||
+#undef __thm_setting
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_phycap_parsing_pa_bias_trim(struct rtw89_dev *rtwdev,
|
||||
+ u8 *phycap_map)
|
||||
+{
|
||||
+ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
|
||||
+ static const u32 pabias_trim_addr[RF_PATH_NUM_8852C] = {0x5DE, 0x5DB};
|
||||
+ u32 addr = rtwdev->chip->phycap_addr;
|
||||
+ u8 i;
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ info->pa_bias_trim[i] = phycap_map[pabias_trim_addr[i] - addr];
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[PA_BIAS][TRIM] path=%d pa_bias_trim=0x%x\n",
|
||||
+ i, info->pa_bias_trim[i]);
|
||||
+
|
||||
+ if (info->pa_bias_trim[i] != 0xff)
|
||||
+ info->pg_pa_bias_trim = true;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_pa_bias_trim(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
|
||||
+ u8 pabias_2g, pabias_5g;
|
||||
+ u8 i;
|
||||
+
|
||||
+ if (!info->pg_pa_bias_trim) {
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[PA_BIAS][TRIM] no PG, do nothing\n");
|
||||
+
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ pabias_2g = FIELD_GET(GENMASK(3, 0), info->pa_bias_trim[i]);
|
||||
+ pabias_5g = FIELD_GET(GENMASK(7, 4), info->pa_bias_trim[i]);
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
+ "[PA_BIAS][TRIM] path=%d 2G=0x%x 5G=0x%x\n",
|
||||
+ i, pabias_2g, pabias_5g);
|
||||
+
|
||||
+ rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXG, pabias_2g);
|
||||
+ rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXA, pabias_5g);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int rtw8852c_read_phycap(struct rtw89_dev *rtwdev, u8 *phycap_map)
|
||||
+{
|
||||
+ rtw8852c_phycap_parsing_tssi(rtwdev, phycap_map);
|
||||
+ rtw8852c_phycap_parsing_thermal_trim(rtwdev, phycap_map);
|
||||
+ rtw8852c_phycap_parsing_pa_bias_trim(rtwdev, phycap_map);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_power_trim(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ rtw8852c_thermal_trim(rtwdev);
|
||||
+ rtw8852c_pa_bias_trim(rtwdev);
|
||||
+}
|
||||
+
|
||||
static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
+ .read_phycap = rtw8852c_read_phycap,
|
||||
+ .power_trim = rtw8852c_power_trim,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
};
|
||||
@@ -238,6 +395,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.limit_efuse_size = 1280,
|
||||
.dav_phy_efuse_size = 96,
|
||||
.dav_log_efuse_size = 16,
|
||||
+ .phycap_addr = 0x590,
|
||||
+ .phycap_size = 0x60,
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN_V1,
|
||||
.h2c_ctrl_reg = R_AX_H2CREG_CTRL_V1,
|
||||
.h2c_regs = rtw8852c_h2c_regs,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.h b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
index 68a397223a81..8abca49e6c84 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include "core.h"
|
||||
|
||||
+#define RF_PATH_NUM_8852C 2
|
||||
+
|
||||
extern const struct rtw89_chip_info rtw8852c_chip_info;
|
||||
|
||||
#endif
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
From 00d3e28301beaabb6053e84065c4fd2723825465 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:57 +0800
|
||||
Subject: [PATCH 493/544] rtw89: 8852c: process logic efuse map
|
||||
|
||||
Add a struct to access logic efuse map, and fill data according to the map.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-14-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 67 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.h | 62 +++++++++++++++++
|
||||
2 files changed, 129 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index df6e9bf69f90..35a9f40af3c9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -221,6 +221,72 @@ static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void rtw8852c_e_efuse_parsing(struct rtw89_efuse *efuse,
|
||||
+ struct rtw8852c_efuse *map)
|
||||
+{
|
||||
+ ether_addr_copy(efuse->addr, map->e.mac_addr);
|
||||
+ efuse->rfe_type = map->rfe_type;
|
||||
+ efuse->xtal_cap = map->xtal_k;
|
||||
+}
|
||||
+
|
||||
+static void rtw8852c_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
|
||||
+ struct rtw8852c_efuse *map)
|
||||
+{
|
||||
+ struct rtw89_tssi_info *tssi = &rtwdev->tssi;
|
||||
+ struct rtw8852c_tssi_offset *ofst[] = {&map->path_a_tssi, &map->path_b_tssi};
|
||||
+ u8 *bw40_1s_tssi_6g_ofst[] = {map->bw40_1s_tssi_6g_a, map->bw40_1s_tssi_6g_b};
|
||||
+ u8 i, j;
|
||||
+
|
||||
+ tssi->thermal[RF_PATH_A] = map->path_a_therm;
|
||||
+ tssi->thermal[RF_PATH_B] = map->path_b_therm;
|
||||
+
|
||||
+ for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
+ memcpy(tssi->tssi_cck[i], ofst[i]->cck_tssi,
|
||||
+ sizeof(ofst[i]->cck_tssi));
|
||||
+
|
||||
+ for (j = 0; j < TSSI_CCK_CH_GROUP_NUM; j++)
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
+ "[TSSI][EFUSE] path=%d cck[%d]=0x%x\n",
|
||||
+ i, j, tssi->tssi_cck[i][j]);
|
||||
+
|
||||
+ memcpy(tssi->tssi_mcs[i], ofst[i]->bw40_tssi,
|
||||
+ sizeof(ofst[i]->bw40_tssi));
|
||||
+ memcpy(tssi->tssi_mcs[i] + TSSI_MCS_2G_CH_GROUP_NUM,
|
||||
+ ofst[i]->bw40_1s_tssi_5g, sizeof(ofst[i]->bw40_1s_tssi_5g));
|
||||
+ memcpy(tssi->tssi_6g_mcs[i], bw40_1s_tssi_6g_ofst[i],
|
||||
+ sizeof(tssi->tssi_6g_mcs[i]));
|
||||
+
|
||||
+ for (j = 0; j < TSSI_MCS_CH_GROUP_NUM; j++)
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
+ "[TSSI][EFUSE] path=%d mcs[%d]=0x%x\n",
|
||||
+ i, j, tssi->tssi_mcs[i][j]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int rtw8852c_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map)
|
||||
+{
|
||||
+ struct rtw89_efuse *efuse = &rtwdev->efuse;
|
||||
+ struct rtw8852c_efuse *map;
|
||||
+
|
||||
+ map = (struct rtw8852c_efuse *)log_map;
|
||||
+
|
||||
+ efuse->country_code[0] = map->country_code[0];
|
||||
+ efuse->country_code[1] = map->country_code[1];
|
||||
+ rtw8852c_efuse_parsing_tssi(rtwdev, map);
|
||||
+
|
||||
+ switch (rtwdev->hci.type) {
|
||||
+ case RTW89_HCI_TYPE_PCIE:
|
||||
+ rtw8852c_e_efuse_parsing(efuse, map);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -ENOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void rtw8852c_phycap_parsing_tssi(struct rtw89_dev *rtwdev, u8 *phycap_map)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi = &rtwdev->tssi;
|
||||
@@ -376,6 +442,7 @@ static void rtw8852c_power_trim(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
+ .read_efuse = rtw8852c_read_efuse,
|
||||
.read_phycap = rtw8852c_read_phycap,
|
||||
.power_trim = rtw8852c_power_trim,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.h b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
index 8abca49e6c84..d0594716040b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
|
||||
@@ -9,6 +9,68 @@
|
||||
|
||||
#define RF_PATH_NUM_8852C 2
|
||||
|
||||
+struct rtw8852c_u_efuse {
|
||||
+ u8 rsvd[0x38];
|
||||
+ u8 mac_addr[ETH_ALEN];
|
||||
+};
|
||||
+
|
||||
+struct rtw8852c_e_efuse {
|
||||
+ u8 mac_addr[ETH_ALEN];
|
||||
+};
|
||||
+
|
||||
+struct rtw8852c_tssi_offset {
|
||||
+ u8 cck_tssi[TSSI_CCK_CH_GROUP_NUM];
|
||||
+ u8 bw40_tssi[TSSI_MCS_2G_CH_GROUP_NUM];
|
||||
+ u8 rsvd[7];
|
||||
+ u8 bw40_1s_tssi_5g[TSSI_MCS_5G_CH_GROUP_NUM];
|
||||
+} __packed;
|
||||
+
|
||||
+struct rtw8852c_efuse {
|
||||
+ u8 rsvd[0x210];
|
||||
+ struct rtw8852c_tssi_offset path_a_tssi;
|
||||
+ u8 rsvd1[10];
|
||||
+ struct rtw8852c_tssi_offset path_b_tssi;
|
||||
+ u8 rsvd2[94];
|
||||
+ u8 channel_plan;
|
||||
+ u8 xtal_k;
|
||||
+ u8 rsvd3;
|
||||
+ u8 iqk_lck;
|
||||
+ u8 rsvd4[5];
|
||||
+ u8 reg_setting:2;
|
||||
+ u8 tx_diversity:1;
|
||||
+ u8 rx_diversity:2;
|
||||
+ u8 ac_mode:1;
|
||||
+ u8 module_type:2;
|
||||
+ u8 rsvd5;
|
||||
+ u8 shared_ant:1;
|
||||
+ u8 coex_type:3;
|
||||
+ u8 ant_iso:1;
|
||||
+ u8 radio_on_off:1;
|
||||
+ u8 rsvd6:2;
|
||||
+ u8 eeprom_version;
|
||||
+ u8 customer_id;
|
||||
+ u8 tx_bb_swing_2g;
|
||||
+ u8 tx_bb_swing_5g;
|
||||
+ u8 tx_cali_pwr_trk_mode;
|
||||
+ u8 trx_path_selection;
|
||||
+ u8 rfe_type;
|
||||
+ u8 country_code[2];
|
||||
+ u8 rsvd7[3];
|
||||
+ u8 path_a_therm;
|
||||
+ u8 path_b_therm;
|
||||
+ u8 rsvd8[46];
|
||||
+ u8 bw40_1s_tssi_6g_a[TSSI_MCS_6G_CH_GROUP_NUM];
|
||||
+ u8 rsvd9[10];
|
||||
+ u8 bw40_1s_tssi_6g_b[TSSI_MCS_6G_CH_GROUP_NUM];
|
||||
+ u8 rsvd10[110];
|
||||
+ u8 channel_plan_6g;
|
||||
+ u8 rsvd11[71];
|
||||
+ union {
|
||||
+ struct rtw8852c_u_efuse u;
|
||||
+ struct rtw8852c_e_efuse e;
|
||||
+ };
|
||||
+} __packed;
|
||||
+
|
||||
extern const struct rtw89_chip_info rtw8852c_chip_info;
|
||||
|
||||
#endif
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From e00d6587189c57bbf380016289bc66e862228787 Mon Sep 17 00:00:00 2001
|
||||
From: Colin Ian King <colin.i.king@gmail.com>
|
||||
Date: Wed, 16 Mar 2022 23:42:42 +0000
|
||||
Subject: [PATCH 495/544] rtw89: Fix spelling mistake "Mis-Match" -> "Mismatch"
|
||||
|
||||
There are some spelling mistakes in some literal strings. Fix them.
|
||||
|
||||
Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220316234242.55515-1-colin.i.king@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/coex.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
index 07f26718b66f..99abd0fe7f15 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
@@ -4623,12 +4623,12 @@ static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
|
||||
ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired);
|
||||
seq_printf(m, "(%s, desired:%d.%d.%d), ",
|
||||
(wl->ver_info.fw_coex >= chip->wlcx_desired ?
|
||||
- "Match" : "Mis-Match"), ver_main, ver_sub, ver_hotfix);
|
||||
+ "Match" : "Mismatch"), ver_main, ver_sub, ver_hotfix);
|
||||
|
||||
seq_printf(m, "BT_FW_coex:%d(%s, desired:%d)\n",
|
||||
bt->ver_info.fw_coex,
|
||||
(bt->ver_info.fw_coex >= chip->btcx_desired ?
|
||||
- "Match" : "Mis-Match"), chip->btcx_desired);
|
||||
+ "Match" : "Mismatch"), chip->btcx_desired);
|
||||
|
||||
if (bt->enable.now && bt->ver_info.fw == 0)
|
||||
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_VER_INFO, true);
|
||||
@@ -5075,7 +5075,7 @@ static void _show_dm_info(struct rtw89_dev *rtwdev, struct seq_file *m)
|
||||
seq_printf(m, "leak_ap:%d, fw_offload:%s%s\n", dm->leak_ap,
|
||||
(BTC_CX_FW_OFFLOAD ? "Y" : "N"),
|
||||
(dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ?
|
||||
- "" : "(Mis-Match!!)"));
|
||||
+ "" : "(Mismatch!!)"));
|
||||
|
||||
if (dm->rf_trx_para.wl_tx_power == 0xff)
|
||||
seq_printf(m,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
From 5c534fb6843865f15dd49711cfee89a01ea43f56 Mon Sep 17 00:00:00 2001
|
||||
From: Yi-Tang Chiu <chiuyitang@realtek.com>
|
||||
Date: Fri, 18 Feb 2022 11:45:37 +0800
|
||||
Subject: [PATCH 475/544] rtw89: Limit the CFO boundaries of x'tal value
|
||||
|
||||
Set the boundaries of x'tal value to avoid extremely adjusted results,
|
||||
causing severely unexpected CFO.
|
||||
|
||||
Signed-off-by: Yi-Tang Chiu <chiuyitang@realtek.com>
|
||||
Signed-off-by: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220218034537.9338-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 4 ++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 21 +++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.h | 1 +
|
||||
3 files changed, 26 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 32600e1a23c2..8d709a2da52e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2613,6 +2613,10 @@ struct rtw89_cfo_tracking_info {
|
||||
s32 residual_cfo_acc;
|
||||
u8 phy_cfotrk_state;
|
||||
u8 phy_cfotrk_cnt;
|
||||
+ bool divergence_lock_en;
|
||||
+ u8 x_cap_lb;
|
||||
+ u8 x_cap_ub;
|
||||
+ u8 lock_cnt;
|
||||
};
|
||||
|
||||
/* 2GL, 2GH, 5GL1, 5GH1, 5GM1, 5GM2, 5GH1, 5GH2 */
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 719a2d6be0be..c6953a78658a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -1743,8 +1743,12 @@ static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev)
|
||||
cfo->crystal_cap_default = efuse->xtal_cap & B_AX_XTAL_SC_MASK;
|
||||
cfo->crystal_cap = cfo->crystal_cap_default;
|
||||
cfo->def_x_cap = cfo->crystal_cap;
|
||||
+ cfo->x_cap_ub = min_t(int, cfo->def_x_cap + CFO_BOUND, 0x7f);
|
||||
+ cfo->x_cap_lb = max_t(int, cfo->def_x_cap - CFO_BOUND, 0x1);
|
||||
cfo->is_adjust = false;
|
||||
+ cfo->divergence_lock_en = false;
|
||||
cfo->x_cap_ofst = 0;
|
||||
+ cfo->lock_cnt = 0;
|
||||
cfo->rtw89_multi_cfo_mode = RTW89_TP_BASED_AVG_MODE;
|
||||
cfo->apply_compensation = false;
|
||||
cfo->residual_cfo_acc = 0;
|
||||
@@ -1962,6 +1966,23 @@ static void rtw89_phy_cfo_dm(struct rtw89_dev *rtwdev)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CFO, "curr_cfo=0\n");
|
||||
return;
|
||||
}
|
||||
+ if (cfo->divergence_lock_en) {
|
||||
+ cfo->lock_cnt++;
|
||||
+ if (cfo->lock_cnt > CFO_PERIOD_CNT) {
|
||||
+ cfo->divergence_lock_en = false;
|
||||
+ cfo->lock_cnt = 0;
|
||||
+ } else {
|
||||
+ rtw89_phy_cfo_reset(rtwdev);
|
||||
+ }
|
||||
+ return;
|
||||
+ }
|
||||
+ if (cfo->crystal_cap >= cfo->x_cap_ub ||
|
||||
+ cfo->crystal_cap <= cfo->x_cap_lb) {
|
||||
+ cfo->divergence_lock_en = true;
|
||||
+ rtw89_phy_cfo_reset(rtwdev);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
rtw89_phy_cfo_crystal_cap_adjust(rtwdev, new_cfo);
|
||||
cfo->cfo_avg_pre = new_cfo;
|
||||
x_cap_update = cfo->crystal_cap != pre_x_cap;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
index 1fb2d96fbca3..d6bc84ae6cd7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
@@ -55,6 +55,7 @@
|
||||
#define CFO_TRK_STOP_TH (2 << 2)
|
||||
#define CFO_SW_COMP_FINE_TUNE (2 << 2)
|
||||
#define CFO_PERIOD_CNT 15
|
||||
+#define CFO_BOUND 32
|
||||
#define CFO_TP_UPPER 100
|
||||
#define CFO_TP_LOWER 50
|
||||
#define CFO_COMP_PERIOD 250
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
From 47552d02afd79d68e5023120833198545d62e78e Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Fri, 11 Feb 2022 15:59:51 +0800
|
||||
Subject: [PATCH 468/544] rtw89: add 6G support to rate adaptive mechanism
|
||||
|
||||
Construct rate mask of 6G band, and rate adaptive mechanism can work well
|
||||
on this band.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220211075953.40421-5-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index c491a1153681..69668108e19f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -161,6 +161,11 @@ static u64 rtw89_phy_ra_mask_cfg(struct rtw89_dev *rtwdev, struct rtw89_sta *rtw
|
||||
cfg_mask = u64_encode_bits(mask->control[NL80211_BAND_5GHZ].legacy,
|
||||
RA_MASK_OFDM_RATES);
|
||||
break;
|
||||
+ case RTW89_BAND_6G:
|
||||
+ band = NL80211_BAND_6GHZ;
|
||||
+ cfg_mask = u64_encode_bits(mask->control[NL80211_BAND_6GHZ].legacy,
|
||||
+ RA_MASK_OFDM_RATES);
|
||||
+ break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unhandled band type %d\n", hal->current_band_type);
|
||||
return -1;
|
||||
@@ -254,15 +259,25 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
ldpc_en = 1;
|
||||
}
|
||||
|
||||
- if (rtwdev->hal.current_band_type == RTW89_BAND_2G) {
|
||||
+ switch (rtwdev->hal.current_band_type) {
|
||||
+ case RTW89_BAND_2G:
|
||||
ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
if (sta->supp_rates[NL80211_BAND_2GHZ] <= 0xf)
|
||||
mode |= RTW89_RA_MODE_CCK;
|
||||
else
|
||||
mode |= RTW89_RA_MODE_CCK | RTW89_RA_MODE_OFDM;
|
||||
- } else {
|
||||
+ break;
|
||||
+ case RTW89_BAND_5G:
|
||||
ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
mode |= RTW89_RA_MODE_OFDM;
|
||||
+ break;
|
||||
+ case RTW89_BAND_6G:
|
||||
+ ra_mask |= (u64)sta->supp_rates[NL80211_BAND_6GHZ] << 4;
|
||||
+ mode |= RTW89_RA_MODE_OFDM;
|
||||
+ break;
|
||||
+ default:
|
||||
+ rtw89_err(rtwdev, "Unknown band type\n");
|
||||
+ break;
|
||||
}
|
||||
|
||||
ra_mask_bak = ra_mask;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
From beeb066e8a4a6714019c82ac94aae0fa0933aa01 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:52 +0800
|
||||
Subject: [PATCH 488/544] rtw89: add chip_info::{h2c,c2h}_reg to support more
|
||||
chips
|
||||
|
||||
This is a register-based H2C/C2H interface to exchange data with firmware.
|
||||
Since the register addresses of 8852A and 8852C are different, add fields
|
||||
to chip_info to support this.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-9-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 4 ++++
|
||||
drivers/net/wireless/realtek/rtw89/fw.c | 20 ++++++++-----------
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 11 ++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 15 ++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 15 ++++++++++++++
|
||||
5 files changed, 53 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 1aec32e8afba..d876de2d1a8d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2309,6 +2309,10 @@ struct rtw89_chip_info {
|
||||
u8 ps_mode_supported;
|
||||
|
||||
u32 hci_func_en_addr;
|
||||
+ u32 h2c_ctrl_reg;
|
||||
+ const u32 *h2c_regs;
|
||||
+ u32 c2h_ctrl_reg;
|
||||
+ const u32 *c2h_regs;
|
||||
};
|
||||
|
||||
union rtw89_bus_info {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
index 97224483f618..2fe091cc12c0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
@@ -1832,15 +1832,13 @@ void rtw89_fw_c2h_work(struct work_struct *work)
|
||||
static int rtw89_fw_write_h2c_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mac_h2c_info *info)
|
||||
{
|
||||
- static const u32 h2c_reg[RTW89_H2CREG_MAX] = {
|
||||
- R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1,
|
||||
- R_AX_H2CREG_DATA2, R_AX_H2CREG_DATA3
|
||||
- };
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const u32 *h2c_reg = chip->h2c_regs;
|
||||
u8 i, val, len;
|
||||
int ret;
|
||||
|
||||
ret = read_poll_timeout(rtw89_read8, val, val == 0, 1000, 5000, false,
|
||||
- rtwdev, R_AX_H2CREG_CTRL);
|
||||
+ rtwdev, chip->h2c_ctrl_reg);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "FW does not process h2c registers\n");
|
||||
return ret;
|
||||
@@ -1854,7 +1852,7 @@ static int rtw89_fw_write_h2c_reg(struct rtw89_dev *rtwdev,
|
||||
for (i = 0; i < RTW89_H2CREG_MAX; i++)
|
||||
rtw89_write32(rtwdev, h2c_reg[i], info->h2creg[i]);
|
||||
|
||||
- rtw89_write8(rtwdev, R_AX_H2CREG_CTRL, B_AX_H2CREG_TRIGGER);
|
||||
+ rtw89_write8(rtwdev, chip->h2c_ctrl_reg, B_AX_H2CREG_TRIGGER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1862,10 +1860,8 @@ static int rtw89_fw_write_h2c_reg(struct rtw89_dev *rtwdev,
|
||||
static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mac_c2h_info *info)
|
||||
{
|
||||
- static const u32 c2h_reg[RTW89_C2HREG_MAX] = {
|
||||
- R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1,
|
||||
- R_AX_C2HREG_DATA2, R_AX_C2HREG_DATA3
|
||||
- };
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const u32 *c2h_reg = chip->c2h_regs;
|
||||
u32 ret;
|
||||
u8 i, val;
|
||||
|
||||
@@ -1873,7 +1869,7 @@ static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,
|
||||
|
||||
ret = read_poll_timeout_atomic(rtw89_read8, val, val, 1,
|
||||
RTW89_C2H_TIMEOUT, false, rtwdev,
|
||||
- R_AX_C2HREG_CTRL);
|
||||
+ chip->c2h_ctrl_reg);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "c2h reg timeout\n");
|
||||
return ret;
|
||||
@@ -1882,7 +1878,7 @@ static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,
|
||||
for (i = 0; i < RTW89_C2HREG_MAX; i++)
|
||||
info->c2hreg[i] = rtw89_read32(rtwdev, c2h_reg[i]);
|
||||
|
||||
- rtw89_write8(rtwdev, R_AX_C2HREG_CTRL, 0);
|
||||
+ rtw89_write8(rtwdev, chip->c2h_ctrl_reg, 0);
|
||||
|
||||
info->id = RTW89_GET_C2H_HDR_FUNC(*info->c2hreg);
|
||||
info->content_len = (RTW89_GET_C2H_HDR_LEN(*info->c2hreg) << 2) -
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 86b18dbbc769..61f9899f02fc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -217,6 +217,17 @@
|
||||
#define B_AX_ASFF_FULL_NO_STK BIT(1)
|
||||
#define B_AX_EN_STUCK_DBG BIT(0)
|
||||
|
||||
+#define R_AX_H2CREG_DATA0_V1 0x7140
|
||||
+#define R_AX_H2CREG_DATA1_V1 0x7144
|
||||
+#define R_AX_H2CREG_DATA2_V1 0x7148
|
||||
+#define R_AX_H2CREG_DATA3_V1 0x714C
|
||||
+#define R_AX_C2HREG_DATA0_V1 0x7150
|
||||
+#define R_AX_C2HREG_DATA1_V1 0x7154
|
||||
+#define R_AX_C2HREG_DATA2_V1 0x7158
|
||||
+#define R_AX_C2HREG_DATA3_V1 0x715C
|
||||
+#define R_AX_H2CREG_CTRL_V1 0x7160
|
||||
+#define R_AX_C2HREG_CTRL_V1 0x7164
|
||||
+
|
||||
#define R_AX_HCI_FUNC_EN_V1 0x7880
|
||||
|
||||
#define R_AX_PHYREG_SET 0x8040
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index 86a5808a76c8..9db8a8f9dd18 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
|
||||
#include "coex.h"
|
||||
+#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "reg.h"
|
||||
@@ -376,6 +377,16 @@ static const struct rtw89_pwr_cfg * const pwr_off_seq_8852a[] = {
|
||||
rtw8852a_pwroff, NULL
|
||||
};
|
||||
|
||||
+static const u32 rtw8852a_h2c_regs[RTW89_H2CREG_MAX] = {
|
||||
+ R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1, R_AX_H2CREG_DATA2,
|
||||
+ R_AX_H2CREG_DATA3
|
||||
+};
|
||||
+
|
||||
+static const u32 rtw8852a_c2h_regs[RTW89_C2HREG_MAX] = {
|
||||
+ R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1, R_AX_C2HREG_DATA2,
|
||||
+ R_AX_C2HREG_DATA3
|
||||
+};
|
||||
+
|
||||
static void rtw8852ae_efuse_parsing(struct rtw89_efuse *efuse,
|
||||
struct rtw8852a_efuse *map)
|
||||
{
|
||||
@@ -2058,6 +2069,10 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
BIT(RTW89_PS_MODE_CLK_GATED) |
|
||||
BIT(RTW89_PS_MODE_PWR_GATED),
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN,
|
||||
+ .h2c_ctrl_reg = R_AX_H2CREG_CTRL,
|
||||
+ .h2c_regs = rtw8852a_h2c_regs,
|
||||
+ .c2h_ctrl_reg = R_AX_C2HREG_CTRL,
|
||||
+ .c2h_regs = rtw8852a_c2h_regs,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852a_chip_info);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index 3fa2dd4ff514..2f5ec94be50f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -2,10 +2,21 @@
|
||||
/* Copyright(c) 2019-2022 Realtek Corporation
|
||||
*/
|
||||
|
||||
+#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
|
||||
+static const u32 rtw8852c_h2c_regs[RTW89_H2CREG_MAX] = {
|
||||
+ R_AX_H2CREG_DATA0_V1, R_AX_H2CREG_DATA1_V1, R_AX_H2CREG_DATA2_V1,
|
||||
+ R_AX_H2CREG_DATA3_V1
|
||||
+};
|
||||
+
|
||||
+static const u32 rtw8852c_c2h_regs[RTW89_H2CREG_MAX] = {
|
||||
+ R_AX_C2HREG_DATA0_V1, R_AX_C2HREG_DATA1_V1, R_AX_C2HREG_DATA2_V1,
|
||||
+ R_AX_C2HREG_DATA3_V1
|
||||
+};
|
||||
+
|
||||
static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
@@ -195,6 +206,10 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN_V1,
|
||||
+ .h2c_ctrl_reg = R_AX_H2CREG_CTRL_V1,
|
||||
+ .h2c_regs = rtw8852c_h2c_regs,
|
||||
+ .c2h_ctrl_reg = R_AX_C2HREG_CTRL_V1,
|
||||
+ .c2h_regs = rtw8852c_c2h_regs,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
From 9cc2f087e50e1ed65343359345f69da4e9107e3d Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:36 +0800
|
||||
Subject: [PATCH 500/544] rtw89: add config_rf_reg_v1 to configure RF parameter
|
||||
tables
|
||||
|
||||
The format of RF parameter is changed; it doesn't encode delay parameters
|
||||
into table, but the delay coding becomes regular pair of register address
|
||||
and value.
|
||||
|
||||
To help firmware to recover RF register settings, we need to download
|
||||
these parameters to firmware. For v1 format, only download partial
|
||||
parameters (ignore them with addr < 0x100).
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-6-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 25 +++++++++++++++++++----
|
||||
drivers/net/wireless/realtek/rtw89/phy.h | 4 ++++
|
||||
3 files changed, 27 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index af73347c40b1..95f105232e80 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2229,6 +2229,8 @@ struct rtw89_phy_table {
|
||||
const struct rtw89_reg2_def *regs;
|
||||
u32 n_regs;
|
||||
enum rtw89_rf_path rf_path;
|
||||
+ void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg,
|
||||
+ enum rtw89_rf_path rf_path, void *data);
|
||||
};
|
||||
|
||||
struct rtw89_txpwr_table {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 43d73ec3f759..ac211d897311 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -862,6 +862,21 @@ static void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
}
|
||||
|
||||
+void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_reg2_def *reg,
|
||||
+ enum rtw89_rf_path rf_path,
|
||||
+ void *extra_data)
|
||||
+{
|
||||
+ rtw89_write_rf(rtwdev, rf_path, reg->addr, RFREG_MASK, reg->data);
|
||||
+
|
||||
+ if (reg->addr < 0x100)
|
||||
+ return;
|
||||
+
|
||||
+ rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path,
|
||||
+ (struct rtw89_fw_h2c_rf_reg_info *)extra_data);
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_phy_config_rf_reg_v1);
|
||||
+
|
||||
static int rtw89_phy_sel_headline(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_phy_table *table,
|
||||
u32 *headline_size, u32 *headline_idx,
|
||||
@@ -1033,6 +1048,8 @@ static u32 rtw89_phy_nctl_poll(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg,
|
||||
+ enum rtw89_rf_path rf_path, void *data);
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_phy_table *rf_table;
|
||||
struct rtw89_fw_h2c_rf_reg_info *rf_reg_info;
|
||||
@@ -1043,13 +1060,13 @@ void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
|
||||
return;
|
||||
|
||||
for (path = RF_PATH_A; path < chip->rf_path_num; path++) {
|
||||
- rf_reg_info->rf_path = path;
|
||||
rf_table = chip->rf_table[path];
|
||||
- rtw89_phy_init_reg(rtwdev, rf_table, rtw89_phy_config_rf_reg,
|
||||
- (void *)rf_reg_info);
|
||||
+ rf_reg_info->rf_path = rf_table->rf_path;
|
||||
+ config = rf_table->config ? rf_table->config : rtw89_phy_config_rf_reg;
|
||||
+ rtw89_phy_init_reg(rtwdev, rf_table, config, (void *)rf_reg_info);
|
||||
if (rtw89_phy_config_rf_reg_fw(rtwdev, rf_reg_info))
|
||||
rtw89_warn(rtwdev, "rf path %d reg h2c config failed\n",
|
||||
- path);
|
||||
+ rf_reg_info->rf_path);
|
||||
}
|
||||
kfree(rf_reg_info);
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
index e600e01cbdd1..adcfcb4c2429 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
@@ -404,6 +404,10 @@ bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data);
|
||||
void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev);
|
||||
+void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
|
||||
+ const struct rtw89_reg2_def *reg,
|
||||
+ enum rtw89_rf_path rf_path,
|
||||
+ void *extra_data);
|
||||
void rtw89_phy_dm_init(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
|
||||
u32 data, enum rtw89_phy_idx phy_idx);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
From 893bebd79c628d1bf850a37dc8ec0347a2b29808 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:51 +0800
|
||||
Subject: [PATCH 487/544] rtw89: add hci_func_en_addr to support variant
|
||||
generation
|
||||
|
||||
The HCI_FUNC_EN address of 8852C is different from existing chipset, so
|
||||
add a chip_info::hci_func_en_addr to fill the address individually.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-8-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 4 +++-
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 +
|
||||
5 files changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index b92dc2a03724..1aec32e8afba 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2307,6 +2307,8 @@ struct rtw89_chip_info {
|
||||
u8 rf_para_dlink_num;
|
||||
const struct rtw89_btc_rf_trx_para *rf_para_dlink;
|
||||
u8 ps_mode_supported;
|
||||
+
|
||||
+ u32 hci_func_en_addr;
|
||||
};
|
||||
|
||||
union rtw89_bus_info {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index d202ee761e90..9ba47a72812f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -2619,7 +2619,9 @@ static int rtw89_mac_fw_dl_pre_init(struct rtw89_dev *rtwdev)
|
||||
|
||||
static void rtw89_mac_hci_func_en(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
- rtw89_write32_set(rtwdev, R_AX_HCI_FUNC_EN,
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, chip->hci_func_en_addr,
|
||||
B_AX_HCI_TXDMA_EN | B_AX_HCI_RXDMA_EN);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index bb95e524d67b..86b18dbbc769 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -217,6 +217,8 @@
|
||||
#define B_AX_ASFF_FULL_NO_STK BIT(1)
|
||||
#define B_AX_EN_STUCK_DBG BIT(0)
|
||||
|
||||
+#define R_AX_HCI_FUNC_EN_V1 0x7880
|
||||
+
|
||||
#define R_AX_PHYREG_SET 0x8040
|
||||
#define PHYREG_SET_ALL_CYCLE 0x8
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index 1448214d6241..86a5808a76c8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -2057,6 +2057,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.ps_mode_supported = BIT(RTW89_PS_MODE_RFOFF) |
|
||||
BIT(RTW89_PS_MODE_CLK_GATED) |
|
||||
BIT(RTW89_PS_MODE_PWR_GATED),
|
||||
+ .hci_func_en_addr = R_AX_HCI_FUNC_EN,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852a_chip_info);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index cb4bcb85c418..3fa2dd4ff514 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -194,6 +194,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.fw_name = "rtw89/rtw8852c_fw.bin",
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
+ .hci_func_en_addr = R_AX_HCI_FUNC_EN_V1,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,372 @@
|
||||
From 4e71a45261a9a85623c9dd2ffc69dde40c5f4266 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:53 +0800
|
||||
Subject: [PATCH 489/544] rtw89: add page_regs to handle v1 chips
|
||||
|
||||
These registers are used to configure and access page size of HCI.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-10-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 16 +++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 60 ++++++++++++-------
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 39 ++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 16 +++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 16 +++++
|
||||
5 files changed, 124 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index d876de2d1a8d..3b41300a8167 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2237,6 +2237,21 @@ struct rtw89_txpwr_table {
|
||||
const struct rtw89_txpwr_table *tbl);
|
||||
};
|
||||
|
||||
+struct rtw89_page_regs {
|
||||
+ u32 hci_fc_ctrl;
|
||||
+ u32 ch_page_ctrl;
|
||||
+ u32 ach_page_ctrl;
|
||||
+ u32 ach_page_info;
|
||||
+ u32 pub_page_info3;
|
||||
+ u32 pub_page_ctrl1;
|
||||
+ u32 pub_page_ctrl2;
|
||||
+ u32 pub_page_info1;
|
||||
+ u32 pub_page_info2;
|
||||
+ u32 wp_page_ctrl1;
|
||||
+ u32 wp_page_ctrl2;
|
||||
+ u32 wp_page_info1;
|
||||
+};
|
||||
+
|
||||
struct rtw89_chip_info {
|
||||
enum rtw89_core_chip_id chip_id;
|
||||
const struct rtw89_chip_ops *ops;
|
||||
@@ -2313,6 +2328,7 @@ struct rtw89_chip_info {
|
||||
const u32 *h2c_regs;
|
||||
u32 c2h_ctrl_reg;
|
||||
const u32 *c2h_regs;
|
||||
+ const struct rtw89_page_regs *page_regs;
|
||||
};
|
||||
|
||||
union rtw89_bus_info {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 9ba47a72812f..df657df6b149 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -569,6 +569,8 @@ static int hfc_pub_cfg_chk(struct rtw89_dev *rtwdev)
|
||||
|
||||
static int hfc_ch_ctrl(struct rtw89_dev *rtwdev, u8 ch)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
const struct rtw89_hfc_ch_cfg *cfg = param->ch_cfg;
|
||||
int ret = 0;
|
||||
@@ -588,13 +590,15 @@ static int hfc_ch_ctrl(struct rtw89_dev *rtwdev, u8 ch)
|
||||
val = u32_encode_bits(cfg[ch].min, B_AX_MIN_PG_MASK) |
|
||||
u32_encode_bits(cfg[ch].max, B_AX_MAX_PG_MASK) |
|
||||
(cfg[ch].grp ? B_AX_GRP : 0);
|
||||
- rtw89_write32(rtwdev, R_AX_ACH0_PAGE_CTRL + ch * 4, val);
|
||||
+ rtw89_write32(rtwdev, regs->ach_page_ctrl + ch * 4, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hfc_upd_ch_info(struct rtw89_dev *rtwdev, u8 ch)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
struct rtw89_hfc_ch_info *info = param->ch_info;
|
||||
const struct rtw89_hfc_ch_cfg *cfg = param->ch_cfg;
|
||||
@@ -608,7 +612,7 @@ static int hfc_upd_ch_info(struct rtw89_dev *rtwdev, u8 ch)
|
||||
if (ch > RTW89_DMA_H2C)
|
||||
return -EINVAL;
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_ACH0_PAGE_INFO + ch * 4);
|
||||
+ val = rtw89_read32(rtwdev, regs->ach_page_info + ch * 4);
|
||||
info[ch].aval = u32_get_bits(val, B_AX_AVAL_PG_MASK);
|
||||
if (ch < RTW89_DMA_H2C)
|
||||
info[ch].used = u32_get_bits(val, B_AX_USE_PG_MASK);
|
||||
@@ -620,6 +624,8 @@ static int hfc_upd_ch_info(struct rtw89_dev *rtwdev, u8 ch)
|
||||
|
||||
static int hfc_pub_ctrl(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
const struct rtw89_hfc_pub_cfg *cfg = &rtwdev->mac.hfc_param.pub_cfg;
|
||||
u32 val;
|
||||
int ret;
|
||||
@@ -634,16 +640,18 @@ static int hfc_pub_ctrl(struct rtw89_dev *rtwdev)
|
||||
|
||||
val = u32_encode_bits(cfg->grp0, B_AX_PUBPG_G0_MASK) |
|
||||
u32_encode_bits(cfg->grp1, B_AX_PUBPG_G1_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_PUB_PAGE_CTRL1, val);
|
||||
+ rtw89_write32(rtwdev, regs->pub_page_ctrl1, val);
|
||||
|
||||
val = u32_encode_bits(cfg->wp_thrd, B_AX_WP_THRD_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_WP_PAGE_CTRL2, val);
|
||||
+ rtw89_write32(rtwdev, regs->wp_page_ctrl2, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hfc_upd_mix_info(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
struct rtw89_hfc_pub_cfg *pub_cfg = ¶m->pub_cfg;
|
||||
struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg;
|
||||
@@ -655,20 +663,20 @@ static int hfc_upd_mix_info(struct rtw89_dev *rtwdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_PUB_PAGE_INFO1);
|
||||
+ val = rtw89_read32(rtwdev, regs->pub_page_info1);
|
||||
info->g0_used = u32_get_bits(val, B_AX_G0_USE_PG_MASK);
|
||||
info->g1_used = u32_get_bits(val, B_AX_G1_USE_PG_MASK);
|
||||
- val = rtw89_read32(rtwdev, R_AX_PUB_PAGE_INFO3);
|
||||
+ val = rtw89_read32(rtwdev, regs->pub_page_info3);
|
||||
info->g0_aval = u32_get_bits(val, B_AX_G0_AVAL_PG_MASK);
|
||||
info->g1_aval = u32_get_bits(val, B_AX_G1_AVAL_PG_MASK);
|
||||
info->pub_aval =
|
||||
- u32_get_bits(rtw89_read32(rtwdev, R_AX_PUB_PAGE_INFO2),
|
||||
+ u32_get_bits(rtw89_read32(rtwdev, regs->pub_page_info2),
|
||||
B_AX_PUB_AVAL_PG_MASK);
|
||||
info->wp_aval =
|
||||
- u32_get_bits(rtw89_read32(rtwdev, R_AX_WP_PAGE_INFO1),
|
||||
+ u32_get_bits(rtw89_read32(rtwdev, regs->wp_page_info1),
|
||||
B_AX_WP_AVAL_PG_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_HCI_FC_CTRL);
|
||||
+ val = rtw89_read32(rtwdev, regs->hci_fc_ctrl);
|
||||
param->en = val & B_AX_HCI_FC_EN ? 1 : 0;
|
||||
param->h2c_en = val & B_AX_HCI_FC_CH12_EN ? 1 : 0;
|
||||
param->mode = u32_get_bits(val, B_AX_HCI_FC_MODE_MASK);
|
||||
@@ -681,21 +689,21 @@ static int hfc_upd_mix_info(struct rtw89_dev *rtwdev)
|
||||
prec_cfg->wp_ch811_full_cond =
|
||||
u32_get_bits(val, B_AX_HCI_FC_WP_CH811_FULL_COND_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_CH_PAGE_CTRL);
|
||||
+ val = rtw89_read32(rtwdev, regs->ch_page_ctrl);
|
||||
prec_cfg->ch011_prec = u32_get_bits(val, B_AX_PREC_PAGE_CH011_MASK);
|
||||
prec_cfg->h2c_prec = u32_get_bits(val, B_AX_PREC_PAGE_CH12_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_PUB_PAGE_CTRL2);
|
||||
+ val = rtw89_read32(rtwdev, regs->pub_page_ctrl2);
|
||||
pub_cfg->pub_max = u32_get_bits(val, B_AX_PUBPG_ALL_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_WP_PAGE_CTRL1);
|
||||
+ val = rtw89_read32(rtwdev, regs->wp_page_ctrl1);
|
||||
prec_cfg->wp_ch07_prec = u32_get_bits(val, B_AX_PREC_PAGE_WP_CH07_MASK);
|
||||
prec_cfg->wp_ch811_prec = u32_get_bits(val, B_AX_PREC_PAGE_WP_CH811_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_WP_PAGE_CTRL2);
|
||||
+ val = rtw89_read32(rtwdev, regs->wp_page_ctrl2);
|
||||
pub_cfg->wp_thrd = u32_get_bits(val, B_AX_WP_THRD_MASK);
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_PUB_PAGE_CTRL1);
|
||||
+ val = rtw89_read32(rtwdev, regs->pub_page_ctrl1);
|
||||
pub_cfg->grp0 = u32_get_bits(val, B_AX_PUBPG_G0_MASK);
|
||||
pub_cfg->grp1 = u32_get_bits(val, B_AX_PUBPG_G1_MASK);
|
||||
|
||||
@@ -708,20 +716,24 @@ static int hfc_upd_mix_info(struct rtw89_dev *rtwdev)
|
||||
|
||||
static void hfc_h2c_cfg(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
const struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg;
|
||||
u32 val;
|
||||
|
||||
val = u32_encode_bits(prec_cfg->h2c_prec, B_AX_PREC_PAGE_CH12_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_CH_PAGE_CTRL, val);
|
||||
+ rtw89_write32(rtwdev, regs->ch_page_ctrl, val);
|
||||
|
||||
- rtw89_write32_mask(rtwdev, R_AX_HCI_FC_CTRL,
|
||||
+ rtw89_write32_mask(rtwdev, regs->hci_fc_ctrl,
|
||||
B_AX_HCI_FC_CH12_FULL_COND_MASK,
|
||||
prec_cfg->h2c_full_cond);
|
||||
}
|
||||
|
||||
static void hfc_mix_cfg(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
const struct rtw89_hfc_pub_cfg *pub_cfg = ¶m->pub_cfg;
|
||||
const struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg;
|
||||
@@ -729,18 +741,18 @@ static void hfc_mix_cfg(struct rtw89_dev *rtwdev)
|
||||
|
||||
val = u32_encode_bits(prec_cfg->ch011_prec, B_AX_PREC_PAGE_CH011_MASK) |
|
||||
u32_encode_bits(prec_cfg->h2c_prec, B_AX_PREC_PAGE_CH12_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_CH_PAGE_CTRL, val);
|
||||
+ rtw89_write32(rtwdev, regs->ch_page_ctrl, val);
|
||||
|
||||
val = u32_encode_bits(pub_cfg->pub_max, B_AX_PUBPG_ALL_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_PUB_PAGE_CTRL2, val);
|
||||
+ rtw89_write32(rtwdev, regs->pub_page_ctrl2, val);
|
||||
|
||||
val = u32_encode_bits(prec_cfg->wp_ch07_prec,
|
||||
B_AX_PREC_PAGE_WP_CH07_MASK) |
|
||||
u32_encode_bits(prec_cfg->wp_ch811_prec,
|
||||
B_AX_PREC_PAGE_WP_CH811_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_WP_PAGE_CTRL1, val);
|
||||
+ rtw89_write32(rtwdev, regs->wp_page_ctrl1, val);
|
||||
|
||||
- val = u32_replace_bits(rtw89_read32(rtwdev, R_AX_HCI_FC_CTRL),
|
||||
+ val = u32_replace_bits(rtw89_read32(rtwdev, regs->hci_fc_ctrl),
|
||||
param->mode, B_AX_HCI_FC_MODE_MASK);
|
||||
val = u32_replace_bits(val, prec_cfg->ch011_full_cond,
|
||||
B_AX_HCI_FC_WD_FULL_COND_MASK);
|
||||
@@ -750,21 +762,23 @@ static void hfc_mix_cfg(struct rtw89_dev *rtwdev)
|
||||
B_AX_HCI_FC_WP_CH07_FULL_COND_MASK);
|
||||
val = u32_replace_bits(val, prec_cfg->wp_ch811_full_cond,
|
||||
B_AX_HCI_FC_WP_CH811_FULL_COND_MASK);
|
||||
- rtw89_write32(rtwdev, R_AX_HCI_FC_CTRL, val);
|
||||
+ rtw89_write32(rtwdev, regs->hci_fc_ctrl, val);
|
||||
}
|
||||
|
||||
static void hfc_func_en(struct rtw89_dev *rtwdev, bool en, bool h2c_en)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const struct rtw89_page_regs *regs = chip->page_regs;
|
||||
struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
|
||||
u32 val;
|
||||
|
||||
- val = rtw89_read32(rtwdev, R_AX_HCI_FC_CTRL);
|
||||
+ val = rtw89_read32(rtwdev, regs->hci_fc_ctrl);
|
||||
param->en = en;
|
||||
param->h2c_en = h2c_en;
|
||||
val = en ? (val | B_AX_HCI_FC_EN) : (val & ~B_AX_HCI_FC_EN);
|
||||
val = h2c_en ? (val | B_AX_HCI_FC_CH12_EN) :
|
||||
(val & ~B_AX_HCI_FC_CH12_EN);
|
||||
- rtw89_write32(rtwdev, R_AX_HCI_FC_CTRL, val);
|
||||
+ rtw89_write32(rtwdev, regs->hci_fc_ctrl, val);
|
||||
}
|
||||
|
||||
static int hfc_init(struct rtw89_dev *rtwdev, bool reset, bool en, bool h2c_en)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 61f9899f02fc..30e05abc7b55 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -217,6 +217,45 @@
|
||||
#define B_AX_ASFF_FULL_NO_STK BIT(1)
|
||||
#define B_AX_EN_STUCK_DBG BIT(0)
|
||||
|
||||
+#define R_AX_HCI_FC_CTRL_V1 0x1700
|
||||
+#define R_AX_CH_PAGE_CTRL_V1 0x1704
|
||||
+
|
||||
+#define R_AX_ACH0_PAGE_CTRL_V1 0x1710
|
||||
+#define R_AX_ACH1_PAGE_CTRL_V1 0x1714
|
||||
+#define R_AX_ACH2_PAGE_CTRL_V1 0x1718
|
||||
+#define R_AX_ACH3_PAGE_CTRL_V1 0x171C
|
||||
+#define R_AX_ACH4_PAGE_CTRL_V1 0x1720
|
||||
+#define R_AX_ACH5_PAGE_CTRL_V1 0x1724
|
||||
+#define R_AX_ACH6_PAGE_CTRL_V1 0x1728
|
||||
+#define R_AX_ACH7_PAGE_CTRL_V1 0x172C
|
||||
+#define R_AX_CH8_PAGE_CTRL_V1 0x1730
|
||||
+#define R_AX_CH9_PAGE_CTRL_V1 0x1734
|
||||
+#define R_AX_CH10_PAGE_CTRL_V1 0x1738
|
||||
+#define R_AX_CH11_PAGE_CTRL_V1 0x173C
|
||||
+
|
||||
+#define R_AX_ACH0_PAGE_INFO_V1 0x1750
|
||||
+#define R_AX_ACH1_PAGE_INFO_V1 0x1754
|
||||
+#define R_AX_ACH2_PAGE_INFO_V1 0x1758
|
||||
+#define R_AX_ACH3_PAGE_INFO_V1 0x175C
|
||||
+#define R_AX_ACH4_PAGE_INFO_V1 0x1760
|
||||
+#define R_AX_ACH5_PAGE_INFO_V1 0x1764
|
||||
+#define R_AX_ACH6_PAGE_INFO_V1 0x1768
|
||||
+#define R_AX_ACH7_PAGE_INFO_V1 0x176C
|
||||
+#define R_AX_CH8_PAGE_INFO_V1 0x1770
|
||||
+#define R_AX_CH9_PAGE_INFO_V1 0x1774
|
||||
+#define R_AX_CH10_PAGE_INFO_V1 0x1778
|
||||
+#define R_AX_CH11_PAGE_INFO_V1 0x177C
|
||||
+#define R_AX_CH12_PAGE_INFO_V1 0x1780
|
||||
+
|
||||
+#define R_AX_PUB_PAGE_INFO3_V1 0x178C
|
||||
+#define R_AX_PUB_PAGE_CTRL1_V1 0x1790
|
||||
+#define R_AX_PUB_PAGE_CTRL2_V1 0x1794
|
||||
+#define R_AX_PUB_PAGE_INFO1_V1 0x1798
|
||||
+#define R_AX_PUB_PAGE_INFO2_V1 0x179C
|
||||
+#define R_AX_WP_PAGE_CTRL1_V1 0x17A0
|
||||
+#define R_AX_WP_PAGE_CTRL2_V1 0x17A4
|
||||
+#define R_AX_WP_PAGE_INFO1_V1 0x17A8
|
||||
+
|
||||
#define R_AX_H2CREG_DATA0_V1 0x7140
|
||||
#define R_AX_H2CREG_DATA1_V1 0x7144
|
||||
#define R_AX_H2CREG_DATA2_V1 0x7148
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index 9db8a8f9dd18..4eb03dde3413 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -387,6 +387,21 @@ static const u32 rtw8852a_c2h_regs[RTW89_C2HREG_MAX] = {
|
||||
R_AX_C2HREG_DATA3
|
||||
};
|
||||
|
||||
+static const struct rtw89_page_regs rtw8852a_page_regs = {
|
||||
+ .hci_fc_ctrl = R_AX_HCI_FC_CTRL,
|
||||
+ .ch_page_ctrl = R_AX_CH_PAGE_CTRL,
|
||||
+ .ach_page_ctrl = R_AX_ACH0_PAGE_CTRL,
|
||||
+ .ach_page_info = R_AX_ACH0_PAGE_INFO,
|
||||
+ .pub_page_info3 = R_AX_PUB_PAGE_INFO3,
|
||||
+ .pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1,
|
||||
+ .pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2,
|
||||
+ .pub_page_info1 = R_AX_PUB_PAGE_INFO1,
|
||||
+ .pub_page_info2 = R_AX_PUB_PAGE_INFO2,
|
||||
+ .wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1,
|
||||
+ .wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2,
|
||||
+ .wp_page_info1 = R_AX_WP_PAGE_INFO1,
|
||||
+};
|
||||
+
|
||||
static void rtw8852ae_efuse_parsing(struct rtw89_efuse *efuse,
|
||||
struct rtw8852a_efuse *map)
|
||||
{
|
||||
@@ -2073,6 +2088,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.h2c_regs = rtw8852a_h2c_regs,
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL,
|
||||
.c2h_regs = rtw8852a_c2h_regs,
|
||||
+ .page_regs = &rtw8852a_page_regs,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852a_chip_info);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index 2f5ec94be50f..d555ea79dec5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -17,6 +17,21 @@ static const u32 rtw8852c_c2h_regs[RTW89_H2CREG_MAX] = {
|
||||
R_AX_C2HREG_DATA3_V1
|
||||
};
|
||||
|
||||
+static const struct rtw89_page_regs rtw8852c_page_regs = {
|
||||
+ .hci_fc_ctrl = R_AX_HCI_FC_CTRL_V1,
|
||||
+ .ch_page_ctrl = R_AX_CH_PAGE_CTRL_V1,
|
||||
+ .ach_page_ctrl = R_AX_ACH0_PAGE_CTRL_V1,
|
||||
+ .ach_page_info = R_AX_ACH0_PAGE_INFO_V1,
|
||||
+ .pub_page_info3 = R_AX_PUB_PAGE_INFO3_V1,
|
||||
+ .pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1_V1,
|
||||
+ .pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2_V1,
|
||||
+ .pub_page_info1 = R_AX_PUB_PAGE_INFO1_V1,
|
||||
+ .pub_page_info2 = R_AX_PUB_PAGE_INFO2_V1,
|
||||
+ .wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1_V1,
|
||||
+ .wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2_V1,
|
||||
+ .wp_page_info1 = R_AX_WP_PAGE_INFO1_V1,
|
||||
+};
|
||||
+
|
||||
static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
@@ -210,6 +225,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.h2c_regs = rtw8852c_h2c_regs,
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL_V1,
|
||||
.c2h_regs = rtw8852c_c2h_regs,
|
||||
+ .page_regs = &rtw8852c_page_regs,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,474 @@
|
||||
From ab07fcddf157eed8c70742c96d37959d7227520a Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:50 +0800
|
||||
Subject: [PATCH 486/544] rtw89: add power_{on/off}_func
|
||||
|
||||
New chipset uses individual power_{on/off} functions to replace old power
|
||||
sequences, because it is hard to represent new complicated flow in a
|
||||
sequence table.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-7-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 +
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 34 +++-
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 26 +++
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 57 ++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 2 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 183 ++++++++++++++++++
|
||||
6 files changed, 301 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 8b36972744f8..b92dc2a03724 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2066,6 +2066,8 @@ struct rtw89_chip_ops {
|
||||
void (*bb_ctrl_btc_preagc)(struct rtw89_dev *rtwdev, bool bt_en);
|
||||
void (*set_txpwr_ul_tb_offset)(struct rtw89_dev *rtwdev,
|
||||
s16 pw_ofst, enum rtw89_mac_idx mac_idx);
|
||||
+ int (*pwr_on_func)(struct rtw89_dev *rtwdev);
|
||||
+ int (*pwr_off_func)(struct rtw89_dev *rtwdev);
|
||||
|
||||
void (*btc_set_rfe)(struct rtw89_dev *rtwdev);
|
||||
void (*btc_init_cfg)(struct rtw89_dev *rtwdev);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 9a91b408cd28..d202ee761e90 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -1022,14 +1022,18 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
|
||||
#define PWR_ACT 1
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_pwr_cfg * const *cfg_seq;
|
||||
+ int (*cfg_func)(struct rtw89_dev *rtwdev);
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
int ret;
|
||||
u8 val;
|
||||
|
||||
- if (on)
|
||||
+ if (on) {
|
||||
cfg_seq = chip->pwr_on_seq;
|
||||
- else
|
||||
+ cfg_func = chip->ops->pwr_on_func;
|
||||
+ } else {
|
||||
cfg_seq = chip->pwr_off_seq;
|
||||
+ cfg_func = chip->ops->pwr_off_func;
|
||||
+ }
|
||||
|
||||
if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
|
||||
__rtw89_leave_ps_mode(rtwdev);
|
||||
@@ -1040,7 +1044,7 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
- ret = rtw89_mac_pwr_seq(rtwdev, cfg_seq);
|
||||
+ ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -3968,3 +3972,27 @@ int rtw89_mac_set_hw_muedca_ctrl(struct rtw89_dev *rtwdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask)
|
||||
+{
|
||||
+ u32 val32;
|
||||
+ int ret;
|
||||
+
|
||||
+ val32 = FIELD_PREP(B_AX_WL_XTAL_SI_ADDR_MASK, offset) |
|
||||
+ FIELD_PREP(B_AX_WL_XTAL_SI_DATA_MASK, val) |
|
||||
+ FIELD_PREP(B_AX_WL_XTAL_SI_BITMASK_MASK, mask) |
|
||||
+ FIELD_PREP(B_AX_WL_XTAL_SI_MODE_MASK, XTAL_SI_NORMAL_WRITE) |
|
||||
+ FIELD_PREP(B_AX_WL_XTAL_SI_CMD_POLL, 1);
|
||||
+ rtw89_write32(rtwdev, R_AX_WLAN_XTAL_SI_CTRL, val32);
|
||||
+
|
||||
+ ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_WL_XTAL_SI_CMD_POLL),
|
||||
+ 50, 50000, false, rtwdev, R_AX_WLAN_XTAL_SI_CTRL);
|
||||
+ if (ret) {
|
||||
+ rtw89_warn(rtwdev, "xtal si not ready(W): offset=%x val=%x mask=%x\n",
|
||||
+ offset, val, mask);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_mac_write_xtal_si);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 5c7a9d784265..630811e053cc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -872,4 +872,30 @@ int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta, u8 *tx_retry);
|
||||
|
||||
+enum rtw89_mac_xtal_si_offset {
|
||||
+ XTAL_SI_XTAL_SC_XI = 0x04,
|
||||
+ XTAL_SI_XTAL_SC_XO = 0x05,
|
||||
+ XTAL_SI_XTAL_XMD_2 = 0x24,
|
||||
+#define XTAL_SI_LDO_LPS GENMASK(6, 4)
|
||||
+ XTAL_SI_XTAL_XMD_4 = 0x26,
|
||||
+#define XTAL_SI_LPS_CAP GENMASK(3, 0)
|
||||
+ XTAL_SI_CV = 0x41,
|
||||
+ XTAL_SI_WL_RFC_S0 = 0x80,
|
||||
+#define XTAL_SI_RF00 BIT(0)
|
||||
+ XTAL_SI_WL_RFC_S1 = 0x81,
|
||||
+#define XTAL_SI_RF10 BIT(0)
|
||||
+ XTAL_SI_ANAPAR_WL = 0x90,
|
||||
+#define XTAL_SI_SRAM2RFC BIT(7)
|
||||
+#define XTAL_SI_GND_SHDN_WL BIT(6)
|
||||
+#define XTAL_SI_SHDN_WL BIT(5)
|
||||
+#define XTAL_SI_RFC2RF BIT(4)
|
||||
+#define XTAL_SI_OFF_EI BIT(3)
|
||||
+#define XTAL_SI_OFF_WEI BIT(2)
|
||||
+#define XTAL_SI_PON_EI BIT(1)
|
||||
+#define XTAL_SI_PON_WEI BIT(0)
|
||||
+ XTAL_SI_SRAM_CTRL = 0xA1,
|
||||
+};
|
||||
+
|
||||
+int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask);
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 62dca0888d88..bb95e524d67b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -8,16 +8,36 @@
|
||||
#define R_AX_SYS_WL_EFUSE_CTRL 0x000A
|
||||
#define B_AX_AUTOLOAD_SUS BIT(5)
|
||||
|
||||
+#define R_AX_SYS_ISO_CTRL 0x0000
|
||||
+#define B_AX_PWC_EV2EF_MASK GENMASK(15, 14)
|
||||
+#define B_AX_PWC_EV2EF_B15 BIT(15)
|
||||
+#define B_AX_PWC_EV2EF_B14 BIT(14)
|
||||
+#define B_AX_ISO_EB2CORE BIT(8)
|
||||
+
|
||||
#define R_AX_SYS_FUNC_EN 0x0002
|
||||
#define B_AX_FEN_BB_GLB_RSTN BIT(1)
|
||||
#define B_AX_FEN_BBRSTB BIT(0)
|
||||
|
||||
#define R_AX_SYS_PW_CTRL 0x0004
|
||||
+#define B_AX_XTAL_OFF_A_DIE BIT(22)
|
||||
+#define B_AX_DIS_WLBT_PDNSUSEN_SOPC BIT(18)
|
||||
+#define B_AX_RDY_SYSPWR BIT(17)
|
||||
+#define B_AX_EN_WLON BIT(16)
|
||||
+#define B_AX_APDM_HPDN BIT(15)
|
||||
#define B_AX_PSUS_OFF_CAPC_EN BIT(14)
|
||||
+#define B_AX_AFSM_PCIE_SUS_EN BIT(12)
|
||||
+#define B_AX_AFSM_WLSUS_EN BIT(11)
|
||||
+#define B_AX_APFM_SWLPS BIT(10)
|
||||
+#define B_AX_APFM_OFFMAC BIT(9)
|
||||
+#define B_AX_APFN_ONMAC BIT(8)
|
||||
|
||||
#define R_AX_SYS_CLK_CTRL 0x0008
|
||||
#define B_AX_CPU_CLK_EN BIT(14)
|
||||
|
||||
+#define R_AX_SYS_ADIE_PAD_PWR_CTRL 0x0018
|
||||
+#define B_AX_SYM_PADPDN_WL_PTA_1P3 BIT(6)
|
||||
+#define B_AX_SYM_PADPDN_WL_RFC_1P3 BIT(5)
|
||||
+
|
||||
#define R_AX_RSV_CTRL 0x001C
|
||||
#define B_AX_R_DIS_PRST BIT(6)
|
||||
#define B_AX_WLOCK_1C_BIT6 BIT(5)
|
||||
@@ -72,11 +92,16 @@
|
||||
#define R_AX_SYS_SDIO_CTRL 0x0070
|
||||
#define B_AX_PCIE_DIS_L2_CTRL_LDO_HCI BIT(15)
|
||||
#define B_AX_PCIE_DIS_WLSUS_AFT_PDN BIT(14)
|
||||
+#define B_AX_PCIE_CALIB_EN_V1 BIT(12)
|
||||
#define B_AX_PCIE_AUXCLK_GATE BIT(11)
|
||||
#define B_AX_LTE_MUX_CTRL_PATH BIT(26)
|
||||
|
||||
#define R_AX_PLATFORM_ENABLE 0x0088
|
||||
#define B_AX_WCPU_EN BIT(1)
|
||||
+#define B_AX_PLATFORM_EN BIT(0)
|
||||
+
|
||||
+#define R_AX_WLLPS_CTRL 0x0090
|
||||
+#define B_AX_DIS_WLBT_LPSEN_LOPC BIT(1)
|
||||
|
||||
#define R_AX_SCOREBOARD 0x00AC
|
||||
#define B_AX_TOGGLE BIT(31)
|
||||
@@ -89,11 +114,20 @@
|
||||
#define R_AX_DBG_PORT_SEL 0x00C0
|
||||
#define B_AX_DEBUG_ST_MASK GENMASK(31, 0)
|
||||
|
||||
+#define R_AX_PMC_DBG_CTRL2 0x00CC
|
||||
+#define B_AX_SYSON_DIS_PMCR_AX_WRMSK BIT(2)
|
||||
+
|
||||
#define R_AX_SYS_CFG1 0x00F0
|
||||
#define B_AX_CHIP_VER_MASK GENMASK(15, 12)
|
||||
|
||||
#define R_AX_SYS_STATUS1 0x00F4
|
||||
#define B_AX_SEL_0XC0_MASK GENMASK(17, 16)
|
||||
+#define B_AX_PAD_HCI_SEL_V2_MASK GENMASK(5, 3)
|
||||
+#define MAC_AX_HCI_SEL_SDIO_UART 0
|
||||
+#define MAC_AX_HCI_SEL_MULTI_USB 1
|
||||
+#define MAC_AX_HCI_SEL_PCIE_UART 2
|
||||
+#define MAC_AX_HCI_SEL_PCIE_USB 3
|
||||
+#define MAC_AX_HCI_SEL_MULTI_SDIO 4
|
||||
|
||||
#define R_AX_HALT_H2C_CTRL 0x0160
|
||||
#define R_AX_HALT_H2C 0x0168
|
||||
@@ -131,6 +165,21 @@
|
||||
#define R_AX_UDM2 0x01F8
|
||||
#define R_AX_UDM3 0x01FC
|
||||
|
||||
+#define R_AX_LDO_AON_CTRL0 0x0218
|
||||
+#define B_AX_PD_REGU_L BIT(16)
|
||||
+
|
||||
+#define R_AX_WLAN_XTAL_SI_CTRL 0x0270
|
||||
+#define B_AX_WL_XTAL_SI_CMD_POLL BIT(31)
|
||||
+#define B_AX_BT_XTAL_SI_ERR_FLAG BIT(30)
|
||||
+#define B_AX_WL_XTAL_GNT BIT(29)
|
||||
+#define B_AX_BT_XTAL_GNT BIT(28)
|
||||
+#define B_AX_WL_XTAL_SI_MODE_MASK GENMASK(25, 24)
|
||||
+#define XTAL_SI_NORMAL_WRITE 0x00
|
||||
+#define XTAL_SI_NORMAL_READ 0x01
|
||||
+#define B_AX_WL_XTAL_SI_BITMASK_MASK GENMASK(23, 16)
|
||||
+#define B_AX_WL_XTAL_SI_DATA_MASK GENMASK(15, 8)
|
||||
+#define B_AX_WL_XTAL_SI_ADDR_MASK GENMASK(7, 0)
|
||||
+
|
||||
#define R_AX_XTAL_ON_CTRL0 0x0280
|
||||
#define B_AX_XTAL_SC_LPS BIT(31)
|
||||
#define B_AX_XTAL_SC_XO_MASK GENMASK(23, 17)
|
||||
@@ -139,6 +188,11 @@
|
||||
|
||||
#define R_AX_GPIO0_7_FUNC_SEL 0x02D0
|
||||
|
||||
+#define R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN 0x02E4
|
||||
+#define B_AX_LED1_PULL_LOW_EN BIT(18)
|
||||
+#define B_AX_EESK_PULL_LOW_EN BIT(17)
|
||||
+#define B_AX_EECS_PULL_LOW_EN BIT(16)
|
||||
+
|
||||
#define R_AX_WLRF_CTRL 0x02F0
|
||||
#define B_AX_WLRF1_CTRL_7 BIT(15)
|
||||
#define B_AX_WLRF1_CTRL_1 BIT(9)
|
||||
@@ -208,7 +262,10 @@
|
||||
#define B_AX_PKT_IN_EN BIT(20)
|
||||
#define B_AX_DLE_CPUIO_EN BIT(19)
|
||||
#define B_AX_DISPATCHER_EN BIT(18)
|
||||
+#define B_AX_BBRPT_EN BIT(17)
|
||||
#define B_AX_MAC_SEC_EN BIT(16)
|
||||
+#define B_AX_MAC_UN_EN BIT(15)
|
||||
+#define B_AX_H_AXIDMA_EN BIT(14)
|
||||
|
||||
#define R_AX_DMAC_CLK_EN 0x8404
|
||||
#define B_AX_WD_RLS_CLK_EN BIT(27)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index a222e11de6ac..1448214d6241 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -1987,6 +1987,8 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
|
||||
.query_ppdu = rtw8852a_query_ppdu,
|
||||
.bb_ctrl_btc_preagc = rtw8852a_bb_ctrl_btc_preagc,
|
||||
.set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset,
|
||||
+ .pwr_on_func = NULL,
|
||||
+ .pwr_off_func = NULL,
|
||||
|
||||
.btc_set_rfe = rtw8852a_btc_set_rfe,
|
||||
.btc_init_cfg = rtw8852a_btc_init_cfg,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index cd0004b01ebc..cb4bcb85c418 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -2,15 +2,198 @@
|
||||
/* Copyright(c) 2019-2022 Realtek Corporation
|
||||
*/
|
||||
|
||||
+#include "mac.h"
|
||||
+#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
|
||||
+static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ u32 val32;
|
||||
+ u32 ret;
|
||||
+
|
||||
+ val32 = rtw89_read32_mask(rtwdev, R_AX_SYS_STATUS1, B_AX_PAD_HCI_SEL_V2_MASK);
|
||||
+ if (val32 == MAC_AX_HCI_SEL_PCIE_USB)
|
||||
+ rtw89_write32_set(rtwdev, R_AX_LDO_AON_CTRL0, B_AX_PD_REGU_L);
|
||||
+
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
|
||||
+ B_AX_AFSM_PCIE_SUS_EN);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_DIS_WLBT_PDNSUSEN_SOPC);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_DIS_WLBT_LPSEN_LOPC);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APDM_HPDN);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
+
|
||||
+ ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_RDY_SYSPWR,
|
||||
+ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
|
||||
+
|
||||
+ ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFN_ONMAC),
|
||||
+ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+ rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+ rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+
|
||||
+ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
|
||||
+
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL_EXTEND, B_AX_CMAC1_FEN);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL_EXTEND, B_AX_R_SYM_ISO_CMAC12PP);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_AFE_CTRL1, B_AX_R_SYM_WLCMAC1_P4_PC_EN |
|
||||
+ B_AX_R_SYM_WLCMAC1_P3_PC_EN |
|
||||
+ B_AX_R_SYM_WLCMAC1_P2_PC_EN |
|
||||
+ B_AX_R_SYM_WLCMAC1_P1_PC_EN |
|
||||
+ B_AX_R_SYM_WLCMAC1_PC_EN);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
+
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
+ XTAL_SI_GND_SHDN_WL, XTAL_SI_GND_SHDN_WL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
+
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
+ XTAL_SI_SHDN_WL, XTAL_SI_SHDN_WL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,
|
||||
+ XTAL_SI_OFF_WEI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_EI,
|
||||
+ XTAL_SI_OFF_EI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_RFC2RF);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_WEI,
|
||||
+ XTAL_SI_PON_WEI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_EI,
|
||||
+ XTAL_SI_PON_EI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SRAM2RFC);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_2, 0, XTAL_SI_LDO_LPS);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_4, 0, XTAL_SI_LPS_CAP);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_ISO_EB2CORE);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B15);
|
||||
+
|
||||
+ fsleep(1000);
|
||||
+
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN,
|
||||
+ B_AX_EECS_PULL_LOW_EN | B_AX_EESK_PULL_LOW_EN |
|
||||
+ B_AX_LED1_PULL_LOW_EN);
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN,
|
||||
+ B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN |
|
||||
+ B_AX_WD_RLS_EN | B_AX_DLE_WDE_EN | B_AX_TXPKT_CTRL_EN |
|
||||
+ B_AX_STA_SCH_EN | B_AX_DLE_PLE_EN | B_AX_PKT_BUF_EN |
|
||||
+ B_AX_DMAC_TBL_EN | B_AX_PKT_IN_EN | B_AX_DLE_CPUIO_EN |
|
||||
+ B_AX_DISPATCHER_EN | B_AX_BBRPT_EN | B_AX_MAC_SEC_EN |
|
||||
+ B_AX_MAC_UN_EN | B_AX_H_AXIDMA_EN);
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_CMAC_FUNC_EN,
|
||||
+ B_AX_CMAC_EN | B_AX_CMAC_TXEN | B_AX_CMAC_RXEN |
|
||||
+ B_AX_FORCE_CMACREG_GCKEN | B_AX_PHYINTF_EN |
|
||||
+ B_AX_CMAC_DMA_EN | B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN |
|
||||
+ B_AX_TMAC_EN | B_AX_RMAC_EN);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ u32 val32;
|
||||
+ u32 ret;
|
||||
+
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
|
||||
+ XTAL_SI_RFC2RF);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S1, 0, XTAL_SI_RF10);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
|
||||
+ XTAL_SI_SRAM2RFC);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
+ rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL_EXTEND,
|
||||
+ B_AX_R_SYM_FEN_WLBBGLB_1 | B_AX_R_SYM_FEN_WLBBFUN_1);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
+
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SHDN_WL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
+
|
||||
+ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_GND_SHDN_WL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
|
||||
+
|
||||
+ ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
|
||||
+ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, 0x0001A0B0);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_XTAL_OFF_A_DIE);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
+ .pwr_on_func = rtw8852c_pwr_on_func,
|
||||
+ .pwr_off_func = rtw8852c_pwr_off_func,
|
||||
};
|
||||
|
||||
const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.chip_id = RTL8852C,
|
||||
.ops = &rtw8852c_chip_ops,
|
||||
.fw_name = "rtw89/rtw8852c_fw.bin",
|
||||
+ .pwr_on_seq = NULL,
|
||||
+ .pwr_off_seq = NULL,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
From c0e1c19b53726f1fbd22ee0f4306f0554f086c06 Mon Sep 17 00:00:00 2001
|
||||
From: Chin-Yen Lee <timlee@realtek.com>
|
||||
Date: Fri, 25 Feb 2022 11:08:51 +0800
|
||||
Subject: [PATCH 478/544] rtw89: add tx_wake notify for low ps mode
|
||||
|
||||
We found management frames get stuck when wifi chip
|
||||
enters low ps mode. So we add one notify wake function
|
||||
to trigger wifi chip into normal mode before forwarding
|
||||
management frames.
|
||||
|
||||
Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220225030851.13327-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 19 +++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 3 ++
|
||||
drivers/net/wireless/realtek/rtw89/fw.c | 4 +++
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 34 +++++++++++++++++------
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 1 +
|
||||
6 files changed, 53 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index 88f1d452e5d6..3adb52f3dc45 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -755,6 +755,22 @@ rtw89_core_tx_btc_spec_pkt_notify(struct rtw89_dev *rtwdev,
|
||||
return PACKET_MAX;
|
||||
}
|
||||
|
||||
+static void
|
||||
+rtw89_core_tx_wake(struct rtw89_dev *rtwdev,
|
||||
+ struct rtw89_core_tx_request *tx_req)
|
||||
+{
|
||||
+ if (!rtwdev->fw.tx_wake)
|
||||
+ return;
|
||||
+
|
||||
+ if (!test_bit(RTW89_FLAG_LOW_POWER_MODE, rtwdev->flags))
|
||||
+ return;
|
||||
+
|
||||
+ if (tx_req->tx_type != RTW89_CORE_TX_TYPE_MGMT)
|
||||
+ return;
|
||||
+
|
||||
+ rtw89_mac_notify_wake(rtwdev);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
rtw89_core_tx_update_desc_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
@@ -853,6 +869,8 @@ int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwdev->stats, skb, true);
|
||||
rtw89_traffic_stats_accu(rtwdev, &rtwvif->stats, skb, true);
|
||||
rtw89_core_tx_update_desc_info(rtwdev, &tx_req);
|
||||
+ rtw89_core_tx_wake(rtwdev, &tx_req);
|
||||
+
|
||||
ret = rtw89_hci_tx_write(rtwdev, &tx_req);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to transmit skb to HCI\n");
|
||||
@@ -2618,6 +2636,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
|
||||
INIT_DELAYED_WORK(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work);
|
||||
rtwdev->txq_wq = alloc_workqueue("rtw89_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
|
||||
spin_lock_init(&rtwdev->ba_lock);
|
||||
+ spin_lock_init(&rtwdev->rpwm_lock);
|
||||
mutex_init(&rtwdev->mutex);
|
||||
mutex_init(&rtwdev->rf_mutex);
|
||||
rtwdev->total_sta_assoc = 0;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index d4c6d3140e22..d203e4c5727d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2376,6 +2376,7 @@ struct rtw89_fw_info {
|
||||
bool fw_log_enable;
|
||||
bool old_ht_ra_format;
|
||||
bool scan_offload;
|
||||
+ bool tx_wake;
|
||||
};
|
||||
|
||||
struct rtw89_cam_info {
|
||||
@@ -2877,6 +2878,8 @@ struct rtw89_dev {
|
||||
/* txqs to setup ba session */
|
||||
struct list_head ba_list;
|
||||
struct work_struct ba_work;
|
||||
+ /* used to protect rpwm */
|
||||
+ spinlock_t rpwm_lock;
|
||||
|
||||
struct rtw89_cam_info cam_info;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
index b610f676dab2..97224483f618 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
@@ -205,6 +205,10 @@ static void rtw89_fw_recognize_features(struct rtw89_dev *rtwdev)
|
||||
if (chip->chip_id == RTL8852A &&
|
||||
RTW89_FW_SUIT_VER_CODE(fw_suit) >= RTW89_FW_VER_CODE(0, 13, 35, 0))
|
||||
rtwdev->fw.scan_offload = true;
|
||||
+
|
||||
+ if (chip->chip_id == RTL8852A &&
|
||||
+ RTW89_FW_SUIT_VER_CODE(fw_suit) >= RTW89_FW_VER_CODE(0, 13, 35, 0))
|
||||
+ rtwdev->fw.tx_wake = true;
|
||||
}
|
||||
|
||||
int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 5e140290fe04..9a91b408cd28 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -917,23 +917,31 @@ rtw89_mac_get_req_pwr_state(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void rtw89_mac_send_rpwm(struct rtw89_dev *rtwdev,
|
||||
- enum rtw89_rpwm_req_pwr_state req_pwr_state)
|
||||
+ enum rtw89_rpwm_req_pwr_state req_pwr_state,
|
||||
+ bool notify_wake)
|
||||
{
|
||||
u16 request;
|
||||
|
||||
+ spin_lock_bh(&rtwdev->rpwm_lock);
|
||||
+
|
||||
request = rtw89_read16(rtwdev, R_AX_RPWM);
|
||||
request ^= request | PS_RPWM_TOGGLE;
|
||||
-
|
||||
- rtwdev->mac.rpwm_seq_num = (rtwdev->mac.rpwm_seq_num + 1) &
|
||||
- RPWM_SEQ_NUM_MAX;
|
||||
- request |= FIELD_PREP(PS_RPWM_SEQ_NUM, rtwdev->mac.rpwm_seq_num);
|
||||
-
|
||||
request |= req_pwr_state;
|
||||
|
||||
- if (req_pwr_state < RTW89_MAC_RPWM_REQ_PWR_STATE_CLK_GATED)
|
||||
- request |= PS_RPWM_ACK;
|
||||
+ if (notify_wake) {
|
||||
+ request |= PS_RPWM_NOTIFY_WAKE;
|
||||
+ } else {
|
||||
+ rtwdev->mac.rpwm_seq_num = (rtwdev->mac.rpwm_seq_num + 1) &
|
||||
+ RPWM_SEQ_NUM_MAX;
|
||||
+ request |= FIELD_PREP(PS_RPWM_SEQ_NUM,
|
||||
+ rtwdev->mac.rpwm_seq_num);
|
||||
|
||||
+ if (req_pwr_state < RTW89_MAC_RPWM_REQ_PWR_STATE_CLK_GATED)
|
||||
+ request |= PS_RPWM_ACK;
|
||||
+ }
|
||||
rtw89_write16(rtwdev, rtwdev->hci.rpwm_addr, request);
|
||||
+
|
||||
+ spin_unlock_bh(&rtwdev->rpwm_lock);
|
||||
}
|
||||
|
||||
static int rtw89_mac_check_cpwm_state(struct rtw89_dev *rtwdev,
|
||||
@@ -993,7 +1001,7 @@ void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
|
||||
else
|
||||
state = RTW89_MAC_RPWM_REQ_PWR_STATE_ACTIVE;
|
||||
|
||||
- rtw89_mac_send_rpwm(rtwdev, state);
|
||||
+ rtw89_mac_send_rpwm(rtwdev, state, false);
|
||||
ret = read_poll_timeout_atomic(rtw89_mac_check_cpwm_state, ret, !ret,
|
||||
1000, 15000, false, rtwdev, state);
|
||||
if (ret)
|
||||
@@ -1001,6 +1009,14 @@ void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
|
||||
enter ? "entering" : "leaving");
|
||||
}
|
||||
|
||||
+void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ enum rtw89_rpwm_req_pwr_state state;
|
||||
+
|
||||
+ state = rtw89_mac_get_req_pwr_state(rtwdev);
|
||||
+ rtw89_mac_send_rpwm(rtwdev, state, true);
|
||||
+}
|
||||
+
|
||||
static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
|
||||
{
|
||||
#define PWR_ACT 1
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 9ea84349e593..5c7a9d784265 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -799,6 +799,7 @@ bool rtw89_mac_get_txpwr_cr(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
u32 reg_base, u32 *cr);
|
||||
void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter);
|
||||
+void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev);
|
||||
void rtw89_mac_bf_assoc(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
void rtw89_mac_bf_disassoc(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index b39e531df2d7..62dca0888d88 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -112,6 +112,7 @@
|
||||
#define PS_RPWM_TOGGLE BIT(15)
|
||||
#define PS_RPWM_ACK BIT(14)
|
||||
#define PS_RPWM_SEQ_NUM GENMASK(13, 12)
|
||||
+#define PS_RPWM_NOTIFY_WAKE BIT(8)
|
||||
#define PS_RPWM_STATE 0x7
|
||||
#define RPWM_SEQ_NUM_MAX 3
|
||||
#define PS_CPWM_SEQ_NUM GENMASK(13, 12)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From a638f6407b6cac5a7ae7c13516c3f6fc82dfad91 Mon Sep 17 00:00:00 2001
|
||||
From: Po Hao Huang <phhuang@realtek.com>
|
||||
Date: Fri, 1 Apr 2022 13:50:40 +0800
|
||||
Subject: [PATCH 517/544] rtw89: change idle mode condition during hw_scan
|
||||
|
||||
Previously we only consider single interface's status, idle mode
|
||||
behavior could be unexpected when multiple interfaces is active.
|
||||
Change to enter/leave idle mode by mac80211's configuration state.
|
||||
|
||||
Signed-off-by: Po Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index c61061358980..be25b9a42fc1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -1798,9 +1798,9 @@ static void rtw89_ips_work(struct work_struct *work)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
|
||||
ips_work);
|
||||
-
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
- rtw89_enter_ips(rtwdev);
|
||||
+ if (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
+ rtw89_enter_ips(rtwdev);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
@@ -2703,7 +2703,7 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
|
||||
rtwdev->scanning = true;
|
||||
rtw89_leave_lps(rtwdev);
|
||||
- if (hw_scan && rtwvif->net_type == RTW89_NET_TYPE_NO_LINK)
|
||||
+ if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE))
|
||||
rtw89_leave_ips(rtwdev);
|
||||
|
||||
ether_addr_copy(rtwvif->mac_addr, mac_addr);
|
||||
@@ -2727,7 +2727,7 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
|
||||
rtwdev->scanning = false;
|
||||
rtwdev->dig.bypass_dig = true;
|
||||
- if (hw_scan && rtwvif->net_type == RTW89_NET_TYPE_NO_LINK)
|
||||
+ if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE))
|
||||
ieee80211_queue_work(rtwdev->hw, &rtwdev->ips_work);
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
From d5456eebd80bfd5610ae00e2fae0541b2e8513c6 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:41 +0800
|
||||
Subject: [PATCH 505/544] rtw89: change value assignment style of
|
||||
rtw89_mac_cfg_gnt()
|
||||
|
||||
Use if() style would be clear than "? :", because the else cases are
|
||||
always 0. The read val from rtw89_mac_read_lte() isn't used, so remove
|
||||
this statement.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-11-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 47 +++++++++++++-----------
|
||||
1 file changed, 25 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index d68eb3126d8a..dd538411a3c2 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -3621,29 +3621,32 @@ EXPORT_SYMBOL(rtw89_mac_coex_init);
|
||||
int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_mac_ax_coex_gnt *gnt_cfg)
|
||||
{
|
||||
- u32 val, ret;
|
||||
+ u32 val = 0, ret;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_bt)
|
||||
+ val |= B_AX_GNT_BT_RFC_S0_SW_VAL | B_AX_GNT_BT_BB_S0_SW_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_bt_sw_en)
|
||||
+ val |= B_AX_GNT_BT_RFC_S0_SW_CTRL | B_AX_GNT_BT_BB_S0_SW_CTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_wl)
|
||||
+ val |= B_AX_GNT_WL_RFC_S0_SW_VAL | B_AX_GNT_WL_BB_S0_SW_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[0].gnt_wl_sw_en)
|
||||
+ val |= B_AX_GNT_WL_RFC_S0_SW_CTRL | B_AX_GNT_WL_BB_S0_SW_CTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_bt)
|
||||
+ val |= B_AX_GNT_BT_RFC_S1_SW_VAL | B_AX_GNT_BT_BB_S1_SW_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_bt_sw_en)
|
||||
+ val |= B_AX_GNT_BT_RFC_S1_SW_CTRL | B_AX_GNT_BT_BB_S1_SW_CTRL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_wl)
|
||||
+ val |= B_AX_GNT_WL_RFC_S1_SW_VAL | B_AX_GNT_WL_BB_S1_SW_VAL;
|
||||
+
|
||||
+ if (gnt_cfg->band[1].gnt_wl_sw_en)
|
||||
+ val |= B_AX_GNT_WL_RFC_S1_SW_CTRL | B_AX_GNT_WL_BB_S1_SW_CTRL;
|
||||
|
||||
- ret = rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_1, &val);
|
||||
- if (ret) {
|
||||
- rtw89_err(rtwdev, "Read LTE fail!\n");
|
||||
- return ret;
|
||||
- }
|
||||
- val = (gnt_cfg->band[0].gnt_bt ?
|
||||
- B_AX_GNT_BT_RFC_S0_SW_VAL | B_AX_GNT_BT_BB_S0_SW_VAL : 0) |
|
||||
- (gnt_cfg->band[0].gnt_bt_sw_en ?
|
||||
- B_AX_GNT_BT_RFC_S0_SW_CTRL | B_AX_GNT_BT_BB_S0_SW_CTRL : 0) |
|
||||
- (gnt_cfg->band[0].gnt_wl ?
|
||||
- B_AX_GNT_WL_RFC_S0_SW_VAL | B_AX_GNT_WL_BB_S0_SW_VAL : 0) |
|
||||
- (gnt_cfg->band[0].gnt_wl_sw_en ?
|
||||
- B_AX_GNT_WL_RFC_S0_SW_CTRL | B_AX_GNT_WL_BB_S0_SW_CTRL : 0) |
|
||||
- (gnt_cfg->band[1].gnt_bt ?
|
||||
- B_AX_GNT_BT_RFC_S1_SW_VAL | B_AX_GNT_BT_BB_S1_SW_VAL : 0) |
|
||||
- (gnt_cfg->band[1].gnt_bt_sw_en ?
|
||||
- B_AX_GNT_BT_RFC_S1_SW_CTRL | B_AX_GNT_BT_BB_S1_SW_CTRL : 0) |
|
||||
- (gnt_cfg->band[1].gnt_wl ?
|
||||
- B_AX_GNT_WL_RFC_S1_SW_VAL | B_AX_GNT_WL_BB_S1_SW_VAL : 0) |
|
||||
- (gnt_cfg->band[1].gnt_wl_sw_en ?
|
||||
- B_AX_GNT_WL_RFC_S1_SW_CTRL | B_AX_GNT_WL_BB_S1_SW_CTRL : 0);
|
||||
ret = rtw89_mac_write_lte(rtwdev, R_AX_LTE_SW_CFG_1, val);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Write LTE fail!\n");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From c4b79ec3af111367a2d815828b17f5416c031e01 Mon Sep 17 00:00:00 2001
|
||||
From: Ching-Te Ku <ku920601@realtek.com>
|
||||
Date: Fri, 1 Apr 2022 13:50:42 +0800
|
||||
Subject: [PATCH 519/544] rtw89: coex: Add case for scan offload
|
||||
|
||||
Turn off coexistence driver control, let firmware can control the
|
||||
traffic during scan. This prevents potential unexpected behavior of
|
||||
the BT driver.
|
||||
|
||||
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/coex.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
index 684583955511..3d5664cc3a20 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
|
||||
@@ -3068,7 +3068,17 @@ static void _action_wl_scan(struct rtw89_dev *rtwdev)
|
||||
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
|
||||
struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
|
||||
|
||||
- if (rtwdev->dbcc_en) {
|
||||
+ if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
|
||||
+ _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W25G);
|
||||
+ if (btc->mdinfo.ant.type == BTC_ANT_SHARED)
|
||||
+ _set_policy(rtwdev, BTC_CXP_OFFE_DEF,
|
||||
+ BTC_RSN_NTFY_SCAN_START);
|
||||
+ else
|
||||
+ _set_policy(rtwdev, BTC_CXP_OFF_EQ0,
|
||||
+ BTC_RSN_NTFY_SCAN_START);
|
||||
+
|
||||
+ rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], Scan offload!\n");
|
||||
+ } else if (rtwdev->dbcc_en) {
|
||||
if (wl_dinfo->real_band[RTW89_PHY_0] != RTW89_BAND_2G &&
|
||||
wl_dinfo->real_band[RTW89_PHY_1] != RTW89_BAND_2G)
|
||||
_action_wl_5g(rtwdev);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
From d8101a400117e0b1ee2c4e41888c17e704ddc883 Mon Sep 17 00:00:00 2001
|
||||
From: "Gustavo A. R. Silva" <gustavoars@kernel.org>
|
||||
Date: Wed, 16 Feb 2022 13:50:47 -0600
|
||||
Subject: [PATCH 472/544] rtw89: core.h: Replace zero-length array with
|
||||
flexible-array member
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There is a regular need in the kernel to provide a way to declare
|
||||
having a dynamically sized set of trailing elements in a structure.
|
||||
Kernel code should always use “flexible array members”[1] for these
|
||||
cases. The older style of one-element or zero-length arrays should
|
||||
no longer be used[2].
|
||||
|
||||
[1] https://en.wikipedia.org/wiki/Flexible_array_member
|
||||
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays
|
||||
|
||||
Link: https://github.com/KSPP/linux/issues/78
|
||||
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
|
||||
Reviewed-by: Kees Cook <keescook@chromium.org>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220216195047.GA904198@embeddedor
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 3254be670bd6..4aca2062b65d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2879,7 +2879,7 @@ struct rtw89_dev {
|
||||
int napi_budget_countdown;
|
||||
|
||||
/* HCI related data, keep last */
|
||||
- u8 priv[0] __aligned(sizeof(void *));
|
||||
+ u8 priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
|
||||
static inline int rtw89_hci_tx_write(struct rtw89_dev *rtwdev,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From 74580f1867eed80e5eae94507b3793992acc7e83 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 09:27:41 +0800
|
||||
Subject: [PATCH 480/544] rtw89: declare HE capabilities in 6G band
|
||||
|
||||
To work properly in 6G band, declare HE 6G capabilities. Without this fix,
|
||||
it can only TX/RX with OFDM rates.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307012741.6371-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index f9ebf34f9a6e..a93555b0a2bf 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -2434,6 +2434,18 @@ static void rtw89_init_he_cap(struct rtw89_dev *rtwdev,
|
||||
he_cap->he_mcs_nss_supp.tx_mcs_160 = cpu_to_le16(mcs_map);
|
||||
}
|
||||
|
||||
+ if (band == NL80211_BAND_6GHZ) {
|
||||
+ __le16 capa;
|
||||
+
|
||||
+ capa = le16_encode_bits(IEEE80211_HT_MPDU_DENSITY_NONE,
|
||||
+ IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START) |
|
||||
+ le16_encode_bits(IEEE80211_VHT_MAX_AMPDU_1024K,
|
||||
+ IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP) |
|
||||
+ le16_encode_bits(IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454,
|
||||
+ IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
|
||||
+ iftype_data[idx].he_6ghz_capa.capa = capa;
|
||||
+ }
|
||||
+
|
||||
idx++;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
From a70ec6bc9657510c3232d6b4ef5f7e509eafb097 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Fri, 11 Feb 2022 15:59:52 +0800
|
||||
Subject: [PATCH 469/544] rtw89: declare if chip support 160M bandwidth
|
||||
|
||||
The new chip can support 160M, so add a chip attribute to indicate the
|
||||
chip support it.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220211075953.40421-6-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 19 ++++++++++++++++++-
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 +
|
||||
3 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index 116c5cb65fe4..bf5b7589906d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -2236,9 +2236,14 @@ static void rtw89_init_ht_cap(struct rtw89_dev *rtwdev,
|
||||
static void rtw89_init_vht_cap(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_sta_vht_cap *vht_cap)
|
||||
{
|
||||
- static const __le16 highest[RF_PATH_MAX] = {
|
||||
+ static const __le16 highest_bw80[RF_PATH_MAX] = {
|
||||
cpu_to_le16(433), cpu_to_le16(867), cpu_to_le16(1300), cpu_to_le16(1733),
|
||||
};
|
||||
+ static const __le16 highest_bw160[RF_PATH_MAX] = {
|
||||
+ cpu_to_le16(867), cpu_to_le16(1733), cpu_to_le16(2600), cpu_to_le16(3467),
|
||||
+ };
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+ const __le16 *highest = chip->support_bw160 ? highest_bw160 : highest_bw80;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u16 tx_mcs_map = 0, rx_mcs_map = 0;
|
||||
u8 sts_cap = 3;
|
||||
@@ -2267,6 +2272,9 @@ static void rtw89_init_vht_cap(struct rtw89_dev *rtwdev,
|
||||
vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
|
||||
IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
|
||||
vht_cap->cap |= sts_cap << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
||||
+ if (chip->support_bw160)
|
||||
+ vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
|
||||
+ IEEE80211_VHT_CAP_SHORT_GI_160;
|
||||
vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(rx_mcs_map);
|
||||
vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(tx_mcs_map);
|
||||
vht_cap->vht_mcs.rx_highest = highest[hal->rx_nss - 1];
|
||||
@@ -2339,6 +2347,8 @@ static void rtw89_init_he_cap(struct rtw89_dev *rtwdev,
|
||||
mac_cap_info[5] = IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
|
||||
phy_cap_info[0] = IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
|
||||
+ if (chip->support_bw160)
|
||||
+ phy_cap_info[0] |= IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
|
||||
phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US;
|
||||
@@ -2367,6 +2377,9 @@ static void rtw89_init_he_cap(struct rtw89_dev *rtwdev,
|
||||
phy_cap_info[8] = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
|
||||
IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI |
|
||||
IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996;
|
||||
+ if (chip->support_bw160)
|
||||
+ phy_cap_info[8] |= IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
|
||||
+ IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
|
||||
phy_cap_info[9] = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
|
||||
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
|
||||
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
|
||||
@@ -2377,6 +2390,10 @@ static void rtw89_init_he_cap(struct rtw89_dev *rtwdev,
|
||||
phy_cap_info[9] |= IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
|
||||
he_cap->he_mcs_nss_supp.rx_mcs_80 = cpu_to_le16(mcs_map);
|
||||
he_cap->he_mcs_nss_supp.tx_mcs_80 = cpu_to_le16(mcs_map);
|
||||
+ if (chip->support_bw160) {
|
||||
+ he_cap->he_mcs_nss_supp.rx_mcs_160 = cpu_to_le16(mcs_map);
|
||||
+ he_cap->he_mcs_nss_supp.tx_mcs_160 = cpu_to_le16(mcs_map);
|
||||
+ }
|
||||
|
||||
idx++;
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index c5d40777558e..0e55778b83ec 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2218,6 +2218,7 @@ struct rtw89_chip_info {
|
||||
const struct rtw89_dle_mem *dle_mem;
|
||||
u32 rf_base_addr[2];
|
||||
u8 support_bands;
|
||||
+ bool support_bw160;
|
||||
u8 rf_path_num;
|
||||
u8 tx_nss;
|
||||
u8 rx_nss;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index c39635a27399..a222e11de6ac 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -2024,6 +2024,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.dig_table = &rtw89_8852a_phy_dig_table,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
BIT(NL80211_BAND_5GHZ),
|
||||
+ .support_bw160 = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 6609068b99f771046852c4c5c65867bbd8863e7c Mon Sep 17 00:00:00 2001
|
||||
From: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:39 +0800
|
||||
Subject: [PATCH 503/544] rtw89: disable FW and H2C function if CPU disabled
|
||||
|
||||
Initialize FW status and disabled H2C function if CPU disabled. Then, it
|
||||
can reset to initial state.
|
||||
|
||||
Signed-off-by: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-9-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 83690656c3e8..e52b0e7b5382 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -2685,7 +2685,11 @@ static void rtw89_mac_disable_cpu(struct rtw89_dev *rtwdev)
|
||||
clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_WCPU_EN);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_WCPU_FW_CTRL, B_AX_WCPU_FWDL_EN |
|
||||
+ B_AX_H2C_PATH_RDY | B_AX_FWDL_PATH_RDY);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_CLK_CTRL, B_AX_CPU_CLK_EN);
|
||||
+ rtw89_write32_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
+ rtw89_write32_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
}
|
||||
|
||||
static int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
From 01c0a359188e2db44768ca77fd1e85a2ff083c0c Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:42 +0800
|
||||
Subject: [PATCH 506/544] rtw89: extend mac tx_en bits from 16 to 32
|
||||
|
||||
In order to support 8852C that uses 32 bits to control TX types.
|
||||
|
||||
This patch doesn't really use 32 bits tx_en yet, but next patch will
|
||||
use it.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-12-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 +-
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 6 +++---
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 4 ++--
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c | 8 ++++----
|
||||
4 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 08416f005b50..0ffb163c23f0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -609,7 +609,7 @@ struct rtw89_channel_params {
|
||||
};
|
||||
|
||||
struct rtw89_channel_help_params {
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
};
|
||||
|
||||
struct rtw89_port_reg {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index dd538411a3c2..2b507279f4e4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -2247,7 +2247,7 @@ static int rtw89_set_hw_sch_tx_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
}
|
||||
|
||||
int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
- u16 *tx_en, enum rtw89_sch_tx_sel sel)
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -2285,7 +2285,7 @@ int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_mac_stop_sch_tx);
|
||||
|
||||
-int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u16 tx_en)
|
||||
+int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -2459,7 +2459,7 @@ static int band1_enable(struct rtw89_dev *rtwdev)
|
||||
int ret, i;
|
||||
u32 sleep_bak[4] = {0};
|
||||
u32 pause_bak[4] = {0};
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
|
||||
ret = rtw89_mac_stop_sch_tx(rtwdev, 0, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
if (ret) {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 0fb09d6e176d..07a8c7c816a3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -791,8 +791,8 @@ void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
|
||||
u32 len, u8 class, u8 func);
|
||||
int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
- u16 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
-int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u16 tx_en);
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
+int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_ids, bool enable);
|
||||
void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev, u8 mac_idx);
|
||||
void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
index acdad5a300dd..4b29dc9a5c07 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
@@ -3526,7 +3526,7 @@ static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
const struct rtw89_chip_info *mac_reg = rtwdev->chip;
|
||||
u8 ch = rtwdev->hal.current_channel, ch_tmp;
|
||||
u8 bw = rtwdev->hal.current_band_width;
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0);
|
||||
s8 power;
|
||||
s16 xdbm;
|
||||
@@ -3623,7 +3623,7 @@ void rtw8852a_dack(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@@ -3648,7 +3648,7 @@ void rtw8852a_iqk_track(struct rtw89_dev *rtwdev)
|
||||
void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
bool is_afe)
|
||||
{
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@@ -3663,7 +3663,7 @@ void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
- u16 tx_en;
|
||||
+ u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
From 0cdfd2c126e1629c8b796dcae9ab61eeec9210fc Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Fri, 11 Feb 2022 15:59:50 +0800
|
||||
Subject: [PATCH 467/544] rtw89: extend subband for 6G band
|
||||
|
||||
Split 6G band into 8 sub-bands where indexes are from 0 to 7,
|
||||
i.e. RTW89_CH_6G_BAND_IDX[0-7]. Then, decide subband by both
|
||||
band and channel instead of just channel because conflicts
|
||||
between 5G channels and 6G channels.
|
||||
|
||||
Moreover, add default case to the existing use of switch (subband).
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220211075953.40421-4-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 59 +++++++++++++++----
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 9 +++
|
||||
.../net/wireless/realtek/rtw89/rtw8852a_rfk.c | 2 +
|
||||
3 files changed, 60 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index a9544b006f0b..116c5cb65fe4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -293,19 +293,58 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
break;
|
||||
}
|
||||
|
||||
- switch (center_chan) {
|
||||
+ switch (band) {
|
||||
default:
|
||||
- case 1 ... 14:
|
||||
- subband = RTW89_CH_2G;
|
||||
- break;
|
||||
- case 36 ... 64:
|
||||
- subband = RTW89_CH_5G_BAND_1;
|
||||
+ case RTW89_BAND_2G:
|
||||
+ switch (center_chan) {
|
||||
+ default:
|
||||
+ case 1 ... 14:
|
||||
+ subband = RTW89_CH_2G;
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
- case 100 ... 144:
|
||||
- subband = RTW89_CH_5G_BAND_3;
|
||||
+ case RTW89_BAND_5G:
|
||||
+ switch (center_chan) {
|
||||
+ default:
|
||||
+ case 36 ... 64:
|
||||
+ subband = RTW89_CH_5G_BAND_1;
|
||||
+ break;
|
||||
+ case 100 ... 144:
|
||||
+ subband = RTW89_CH_5G_BAND_3;
|
||||
+ break;
|
||||
+ case 149 ... 177:
|
||||
+ subband = RTW89_CH_5G_BAND_4;
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
- case 149 ... 177:
|
||||
- subband = RTW89_CH_5G_BAND_4;
|
||||
+ case RTW89_BAND_6G:
|
||||
+ switch (center_chan) {
|
||||
+ default:
|
||||
+ case 1 ... 29:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX0;
|
||||
+ break;
|
||||
+ case 33 ... 61:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX1;
|
||||
+ break;
|
||||
+ case 65 ... 93:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX2;
|
||||
+ break;
|
||||
+ case 97 ... 125:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX3;
|
||||
+ break;
|
||||
+ case 129 ... 157:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX4;
|
||||
+ break;
|
||||
+ case 161 ... 189:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX5;
|
||||
+ break;
|
||||
+ case 193 ... 221:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX6;
|
||||
+ break;
|
||||
+ case 225 ... 253:
|
||||
+ subband = RTW89_CH_6G_BAND_IDX7;
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index deb91f6b6737..c5d40777558e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -61,6 +61,15 @@ enum rtw89_subband {
|
||||
RTW89_CH_5G_BAND_3 = 3,
|
||||
RTW89_CH_5G_BAND_4 = 4,
|
||||
|
||||
+ RTW89_CH_6G_BAND_IDX0, /* Low */
|
||||
+ RTW89_CH_6G_BAND_IDX1, /* Low */
|
||||
+ RTW89_CH_6G_BAND_IDX2, /* Mid */
|
||||
+ RTW89_CH_6G_BAND_IDX3, /* Mid */
|
||||
+ RTW89_CH_6G_BAND_IDX4, /* High */
|
||||
+ RTW89_CH_6G_BAND_IDX5, /* High */
|
||||
+ RTW89_CH_6G_BAND_IDX6, /* Ultra-high */
|
||||
+ RTW89_CH_6G_BAND_IDX7, /* Ultra-high */
|
||||
+
|
||||
RTW89_SUBBAND_NR,
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
index aa326681b509..acdad5a300dd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
@@ -2917,6 +2917,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
u8 i, j;
|
||||
|
||||
switch (subband) {
|
||||
+ default:
|
||||
case RTW89_CH_2G:
|
||||
thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_p;
|
||||
thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_n;
|
||||
@@ -3101,6 +3102,7 @@ static void _tssi_pak(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
u8 subband = rtwdev->hal.current_subband;
|
||||
|
||||
switch (subband) {
|
||||
+ default:
|
||||
case RTW89_CH_2G:
|
||||
rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
|
||||
&rtw8852a_tssi_pak_defs_a_2g_tbl,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
From 2cfb28c44bb25687f6dc2cede828c991d8c4de91 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Tue, 1 Mar 2022 08:43:31 +0800
|
||||
Subject: [PATCH 479/544] rtw89: fix HE PHY bandwidth capability
|
||||
|
||||
Bit 2 and 3 are reserved on 5/6 GHz and bit 1 is reserved on 2.4 GHz,
|
||||
so the driver should only set the non-reserved bits according
|
||||
to band.
|
||||
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220301004331.6621-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 13 +++++++++----
|
||||
1 file changed, 9 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index 3adb52f3dc45..f9ebf34f9a6e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -2379,10 +2379,15 @@ static void rtw89_init_he_cap(struct rtw89_dev *rtwdev,
|
||||
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
|
||||
if (i == NL80211_IFTYPE_STATION)
|
||||
mac_cap_info[5] = IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
|
||||
- phy_cap_info[0] = IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
|
||||
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
|
||||
- if (chip->support_bw160)
|
||||
- phy_cap_info[0] |= IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
|
||||
+ if (band == NL80211_BAND_2GHZ) {
|
||||
+ phy_cap_info[0] =
|
||||
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
|
||||
+ } else {
|
||||
+ phy_cap_info[0] =
|
||||
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
|
||||
+ if (chip->support_bw160)
|
||||
+ phy_cap_info[0] |= IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
|
||||
+ }
|
||||
phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
From 7f25130a375cd77e0ee2880c2559931b69429e73 Mon Sep 17 00:00:00 2001
|
||||
From: Po Hao Huang <phhuang@realtek.com>
|
||||
Date: Fri, 1 Apr 2022 13:50:43 +0800
|
||||
Subject: [PATCH 518/544] rtw89: fix misconfiguration on hw_scan channel time
|
||||
|
||||
Without this patch, hw scan won't stay long enough on DFS/passive
|
||||
channels. Found previous logic error and fix it.
|
||||
|
||||
Signed-off-by: Po Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/fw.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
index 2c9470616a1b..c04ce1445ffc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
@@ -2099,7 +2099,7 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
|
||||
ch_info->num_pkt = 0;
|
||||
break;
|
||||
case RTW89_CHAN_DFS:
|
||||
- ch_info->period = min_t(u8, ch_info->period,
|
||||
+ ch_info->period = max_t(u8, ch_info->period,
|
||||
RTW89_DFS_CHAN_TIME);
|
||||
ch_info->dwell_time = RTW89_DWELL_TIME;
|
||||
break;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From b7ec341e7d02ae47f1c30cba80cc82043d662983 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Fri, 11 Mar 2022 10:00:07 +0800
|
||||
Subject: [PATCH 494/544] rtw89: fix uninitialized variable of
|
||||
rtw89_append_probe_req_ie()
|
||||
|
||||
smatch reports that:
|
||||
fw.c:1997 rtw89_append_probe_req_ie() error: uninitialized symbol 'ret'.
|
||||
|
||||
This can be a issue only if no band is supported by the chip, but it is
|
||||
impossible. So, it is still safe without this patch.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220311020007.20414-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/fw.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
index 2fe091cc12c0..6deaf8eec6b4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
||||
@@ -1964,7 +1964,7 @@ static int rtw89_append_probe_req_ie(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_scan_ies *ies = rtwvif->scan_ies;
|
||||
struct rtw89_pktofld_info *info;
|
||||
struct sk_buff *new;
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
u8 band;
|
||||
|
||||
for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
From ad12b7cb75fac21679cd4c374c13fe26b7afdbce Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Tue, 22 Feb 2022 11:21:03 +0800
|
||||
Subject: [PATCH 476/544] rtw89: get channel parameters of 160MHz bandwidth
|
||||
|
||||
Calculate the offset of center and primary frequencies to get hardware
|
||||
indices of center channel and primary channel, and then use them to
|
||||
configure hardware to a specific channel.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220222032103.29392-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 26 ++++++++++-------------
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 25 ++++++++++++++++++++++
|
||||
2 files changed, 36 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index 36b1dde007c7..a0086b14550a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -232,6 +232,7 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
u8 center_chan;
|
||||
u8 bandwidth = RTW89_CHANNEL_WIDTH_20;
|
||||
u8 primary_chan_idx = 0;
|
||||
+ u32 offset;
|
||||
u8 band;
|
||||
u8 subband;
|
||||
|
||||
@@ -256,23 +257,16 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
}
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
- bandwidth = RTW89_CHANNEL_WIDTH_80;
|
||||
+ case NL80211_CHAN_WIDTH_160:
|
||||
+ bandwidth = nl_to_rtw89_bandwidth(width);
|
||||
if (primary_freq > center_freq) {
|
||||
- if (primary_freq - center_freq == 10) {
|
||||
- primary_chan_idx = RTW89_SC_20_UPPER;
|
||||
- center_chan -= 2;
|
||||
- } else {
|
||||
- primary_chan_idx = RTW89_SC_20_UPMOST;
|
||||
- center_chan -= 6;
|
||||
- }
|
||||
+ offset = (primary_freq - center_freq - 10) / 20;
|
||||
+ primary_chan_idx = RTW89_SC_20_UPPER + offset * 2;
|
||||
+ center_chan -= 2 + offset * 4;
|
||||
} else {
|
||||
- if (center_freq - primary_freq == 10) {
|
||||
- primary_chan_idx = RTW89_SC_20_LOWER;
|
||||
- center_chan += 2;
|
||||
- } else {
|
||||
- primary_chan_idx = RTW89_SC_20_LOWEST;
|
||||
- center_chan += 6;
|
||||
- }
|
||||
+ offset = (center_freq - primary_freq - 10) / 20;
|
||||
+ primary_chan_idx = RTW89_SC_20_LOWER + offset * 2;
|
||||
+ center_chan += 2 + offset * 4;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -349,6 +343,7 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
}
|
||||
|
||||
chan_param->center_chan = center_chan;
|
||||
+ chan_param->center_freq = center_freq;
|
||||
chan_param->primary_chan = channel->hw_value;
|
||||
chan_param->bandwidth = bandwidth;
|
||||
chan_param->pri_ch_idx = primary_chan_idx;
|
||||
@@ -377,6 +372,7 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
|
||||
|
||||
hal->current_band_width = bandwidth;
|
||||
hal->current_channel = center_chan;
|
||||
+ hal->current_freq = ch_param.center_freq;
|
||||
hal->prev_primary_channel = hal->current_primary_channel;
|
||||
hal->current_primary_channel = ch_param.primary_chan;
|
||||
hal->current_band_type = ch_param.band_type;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 8d709a2da52e..a64080f4007e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -589,12 +589,17 @@ enum rtw89_sc_offset {
|
||||
RTW89_SC_20_LOWER = 2,
|
||||
RTW89_SC_20_UPMOST = 3,
|
||||
RTW89_SC_20_LOWEST = 4,
|
||||
+ RTW89_SC_20_UP2X = 5,
|
||||
+ RTW89_SC_20_LOW2X = 6,
|
||||
+ RTW89_SC_20_UP3X = 7,
|
||||
+ RTW89_SC_20_LOW3X = 8,
|
||||
RTW89_SC_40_UPPER = 9,
|
||||
RTW89_SC_40_LOWER = 10,
|
||||
};
|
||||
|
||||
struct rtw89_channel_params {
|
||||
u8 center_chan;
|
||||
+ u32 center_freq;
|
||||
u8 primary_chan;
|
||||
u8 bandwidth;
|
||||
u8 pri_ch_idx;
|
||||
@@ -2404,6 +2409,7 @@ struct rtw89_hal {
|
||||
u32 rx_fltr;
|
||||
u8 cv;
|
||||
u8 current_channel;
|
||||
+ u32 current_freq;
|
||||
u8 prev_primary_channel;
|
||||
u8 current_primary_channel;
|
||||
enum rtw89_subband current_subband;
|
||||
@@ -3201,6 +3207,25 @@ static inline u8 rtw89_hw_to_rate_info_bw(enum rtw89_bandwidth hw_bw)
|
||||
return RATE_INFO_BW_20;
|
||||
}
|
||||
|
||||
+static inline
|
||||
+enum rtw89_bandwidth nl_to_rtw89_bandwidth(enum nl80211_chan_width width)
|
||||
+{
|
||||
+ switch (width) {
|
||||
+ default:
|
||||
+ WARN(1, "Not support bandwidth %d\n", width);
|
||||
+ fallthrough;
|
||||
+ case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
+ case NL80211_CHAN_WIDTH_20:
|
||||
+ return RTW89_CHANNEL_WIDTH_20;
|
||||
+ case NL80211_CHAN_WIDTH_40:
|
||||
+ return RTW89_CHANNEL_WIDTH_40;
|
||||
+ case NL80211_CHAN_WIDTH_80:
|
||||
+ return RTW89_CHANNEL_WIDTH_80;
|
||||
+ case NL80211_CHAN_WIDTH_160:
|
||||
+ return RTW89_CHANNEL_WIDTH_160;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static inline
|
||||
struct rtw89_addr_cam_entry *rtw89_get_addr_cam_of(struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
From 110599f7e153ab4460da451c7b4d6ac0daa0e759 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Fri, 11 Feb 2022 15:59:53 +0800
|
||||
Subject: [PATCH 470/544] rtw89: handle TX/RX 160M bandwidth
|
||||
|
||||
Apply 160M bandwidth to RA (rate adaptive) mechanism, so it can transmit
|
||||
packets with this bandwidth. On the other hand, convert 160M bandwidth
|
||||
from RX desc to rx_info_bw.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220211075953.40421-7-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 15 ++-------------
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 12 ++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 13 ++++++-------
|
||||
3 files changed, 20 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index bf5b7589906d..63828dbfef4e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -1165,13 +1165,7 @@ static bool rtw89_core_rx_ppdu_match(struct rtw89_dev *rtwdev,
|
||||
rtw89_warn(rtwdev, "invalid RX rate mode %d\n", data_rate_mode);
|
||||
}
|
||||
|
||||
- if (desc_info->bw == RTW89_CHANNEL_WIDTH_80)
|
||||
- bw = RATE_INFO_BW_80;
|
||||
- else if (desc_info->bw == RTW89_CHANNEL_WIDTH_40)
|
||||
- bw = RATE_INFO_BW_40;
|
||||
- else
|
||||
- bw = RATE_INFO_BW_20;
|
||||
-
|
||||
+ bw = rtw89_hw_to_rate_info_bw(desc_info->bw);
|
||||
gi_ltf = rtw89_rxdesc_to_nl_he_gi(rtwdev, desc_info, false);
|
||||
ret = rtwdev->ppdu_sts.curr_rx_ppdu_cnt[band] == desc_info->ppdu_cnt &&
|
||||
status->rate_idx == rate_idx &&
|
||||
@@ -1442,12 +1436,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
|
||||
!(desc_info->sw_dec || desc_info->icv_err))
|
||||
rx_status->flag |= RX_FLAG_DECRYPTED;
|
||||
|
||||
- if (desc_info->bw == RTW89_CHANNEL_WIDTH_80)
|
||||
- rx_status->bw = RATE_INFO_BW_80;
|
||||
- else if (desc_info->bw == RTW89_CHANNEL_WIDTH_40)
|
||||
- rx_status->bw = RATE_INFO_BW_40;
|
||||
- else
|
||||
- rx_status->bw = RATE_INFO_BW_20;
|
||||
+ rx_status->bw = rtw89_hw_to_rate_info_bw(desc_info->bw);
|
||||
|
||||
data_rate = desc_info->data_rate;
|
||||
data_rate_mode = GET_DATA_RATE_MODE(data_rate);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 0e55778b83ec..3254be670bd6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -3160,6 +3160,18 @@ static inline struct rtw89_sta *sta_to_rtwsta_safe(struct ieee80211_sta *sta)
|
||||
return sta ? (struct rtw89_sta *)sta->drv_priv : NULL;
|
||||
}
|
||||
|
||||
+static inline u8 rtw89_hw_to_rate_info_bw(enum rtw89_bandwidth hw_bw)
|
||||
+{
|
||||
+ if (hw_bw == RTW89_CHANNEL_WIDTH_160)
|
||||
+ return RATE_INFO_BW_160;
|
||||
+ else if (hw_bw == RTW89_CHANNEL_WIDTH_80)
|
||||
+ return RATE_INFO_BW_80;
|
||||
+ else if (hw_bw == RTW89_CHANNEL_WIDTH_40)
|
||||
+ return RATE_INFO_BW_40;
|
||||
+ else
|
||||
+ return RATE_INFO_BW_20;
|
||||
+}
|
||||
+
|
||||
static inline
|
||||
struct rtw89_addr_cam_entry *rtw89_get_addr_cam_of(struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 69668108e19f..d1d3ebb5e226 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -302,6 +302,11 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta);
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
+ case IEEE80211_STA_RX_BW_160:
|
||||
+ bw_mode = RTW89_CHANNEL_WIDTH_160;
|
||||
+ sgi = sta->vht_cap.vht_supported &&
|
||||
+ (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
|
||||
+ break;
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
bw_mode = RTW89_CHANNEL_WIDTH_80;
|
||||
sgi = sta->vht_cap.vht_supported &&
|
||||
@@ -1439,13 +1444,7 @@ static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
|
||||
break;
|
||||
}
|
||||
|
||||
- if (bw == RTW89_CHANNEL_WIDTH_80)
|
||||
- ra_report->txrate.bw = RATE_INFO_BW_80;
|
||||
- else if (bw == RTW89_CHANNEL_WIDTH_40)
|
||||
- ra_report->txrate.bw = RATE_INFO_BW_40;
|
||||
- else
|
||||
- ra_report->txrate.bw = RATE_INFO_BW_20;
|
||||
-
|
||||
+ ra_report->txrate.bw = rtw89_hw_to_rate_info_bw(bw);
|
||||
ra_report->bit_rate = cfg80211_calculate_bitrate(&ra_report->txrate);
|
||||
ra_report->hw_rate = FIELD_PREP(RTW89_HW_RATE_MASK_MOD, mode) |
|
||||
FIELD_PREP(RTW89_HW_RATE_MASK_VAL, rate);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
From 9bcdb806a40ed3250a22623420aa7b4d8b138c2e Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:43 +0800
|
||||
Subject: [PATCH 507/544] rtw89: implement stop and resume channels
|
||||
transmission v1
|
||||
|
||||
These function is used to stop transmitting when we are going to switch
|
||||
channels or do some RF calibration. Before these operations, we need to
|
||||
stop channel transmission and backup setting into parameter tx_en. After
|
||||
operations are done, resume transmitting by backup parameter tx_en.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-13-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 20 +++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 84 +++++++++++++++++--
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 3 +
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 7 ++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 6 +-
|
||||
.../net/wireless/realtek/rtw89/rtw8852a_rfk.c | 16 ++--
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 2 +
|
||||
7 files changed, 123 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 0ffb163c23f0..771722132c53 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2071,6 +2071,9 @@ struct rtw89_chip_ops {
|
||||
int (*cfg_ctrl_path)(struct rtw89_dev *rtwdev, bool wl);
|
||||
int (*mac_cfg_gnt)(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
|
||||
+ int (*stop_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
+ int (*resume_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
|
||||
void (*btc_set_rfe)(struct rtw89_dev *rtwdev);
|
||||
void (*btc_init_cfg)(struct rtw89_dev *rtwdev);
|
||||
@@ -3486,6 +3489,23 @@ static inline void rtw89_chip_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl)
|
||||
chip->ops->cfg_ctrl_path(rtwdev, wl);
|
||||
}
|
||||
|
||||
+static inline
|
||||
+int rtw89_chip_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel)
|
||||
+{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ return chip->ops->stop_sch_tx(rtwdev, mac_idx, tx_en, sel);
|
||||
+}
|
||||
+
|
||||
+static inline
|
||||
+int rtw89_chip_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
+{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ return chip->ops->resume_sch_tx(rtwdev, mac_idx, tx_en);
|
||||
+}
|
||||
+
|
||||
static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
__le16 fc = hdr->frame_control;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 2b507279f4e4..5e554bd9f036 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -2246,6 +2246,24 @@ static int rtw89_set_hw_sch_tx_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int rtw89_set_hw_sch_tx_en_v1(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
+ u32 tx_en, u32 tx_en_mask)
|
||||
+{
|
||||
+ u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx);
|
||||
+ u32 val;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ val = rtw89_read32(rtwdev, reg);
|
||||
+ val = (val & ~tx_en_mask) | (tx_en & tx_en_mask);
|
||||
+ rtw89_write32(rtwdev, reg, val);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
u32 *tx_en, enum rtw89_sch_tx_sel sel)
|
||||
{
|
||||
@@ -2256,7 +2274,8 @@ int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
|
||||
switch (sel) {
|
||||
case RTW89_SCH_TX_SEL_ALL:
|
||||
- ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 0xffff);
|
||||
+ ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0,
|
||||
+ B_AX_CTN_TXEN_ALL_MASK);
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
@@ -2273,7 +2292,8 @@ int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
return ret;
|
||||
break;
|
||||
case RTW89_SCH_TX_SEL_MACID:
|
||||
- ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 0xffff);
|
||||
+ ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0,
|
||||
+ B_AX_CTN_TXEN_ALL_MASK);
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
@@ -2285,11 +2305,52 @@ int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_mac_stop_sch_tx);
|
||||
|
||||
+int rtw89_mac_stop_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ *tx_en = rtw89_read32(rtwdev,
|
||||
+ rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx));
|
||||
+
|
||||
+ switch (sel) {
|
||||
+ case RTW89_SCH_TX_SEL_ALL:
|
||||
+ ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 0,
|
||||
+ B_AX_CTN_TXEN_ALL_MASK_V1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ break;
|
||||
+ case RTW89_SCH_TX_SEL_HIQ:
|
||||
+ ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx,
|
||||
+ 0, B_AX_CTN_TXEN_HGQ);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ break;
|
||||
+ case RTW89_SCH_TX_SEL_MG0:
|
||||
+ ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx,
|
||||
+ 0, B_AX_CTN_TXEN_MGQ);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ break;
|
||||
+ case RTW89_SCH_TX_SEL_MACID:
|
||||
+ ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 0,
|
||||
+ B_AX_CTN_TXEN_ALL_MASK_V1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_mac_stop_sch_tx_v1);
|
||||
+
|
||||
int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, tx_en, 0xffff);
|
||||
+ ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, tx_en, B_AX_CTN_TXEN_ALL_MASK);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -2297,6 +2358,19 @@ int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_mac_resume_sch_tx);
|
||||
|
||||
+int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, tx_en,
|
||||
+ B_AX_CTN_TXEN_ALL_MASK_V1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_mac_resume_sch_tx_v1);
|
||||
+
|
||||
static u16 rtw89_mac_dle_buf_req(struct rtw89_dev *rtwdev, u16 buf_len,
|
||||
bool wd)
|
||||
{
|
||||
@@ -2461,7 +2535,7 @@ static int band1_enable(struct rtw89_dev *rtwdev)
|
||||
u32 pause_bak[4] = {0};
|
||||
u32 tx_en;
|
||||
|
||||
- ret = rtw89_mac_stop_sch_tx(rtwdev, 0, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ ret = rtw89_chip_stop_sch_tx(rtwdev, 0, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "[ERR]stop sch tx %d\n", ret);
|
||||
return ret;
|
||||
@@ -2491,7 +2565,7 @@ static int band1_enable(struct rtw89_dev *rtwdev)
|
||||
rtw89_write32(rtwdev, R_AX_SS_MACID_PAUSE_0 + i * 4, pause_bak[i]);
|
||||
}
|
||||
|
||||
- ret = rtw89_mac_resume_sch_tx(rtwdev, 0, tx_en);
|
||||
+ ret = rtw89_chip_resume_sch_tx(rtwdev, 0, tx_en);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "[ERR]CMAC1 resume sch tx %d\n", ret);
|
||||
return ret;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index 07a8c7c816a3..b797667c78c6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -792,7 +792,10 @@ void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
|
||||
int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
u32 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
+int rtw89_mac_stop_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
+ u32 *tx_en, enum rtw89_sch_tx_sel sel);
|
||||
int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
+int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_ids, bool enable);
|
||||
void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev, u8 mac_idx);
|
||||
void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index b37270e21364..25b106788118 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -893,6 +893,7 @@
|
||||
#define B_AX_CTN_TXEN_VI_0 BIT(2)
|
||||
#define B_AX_CTN_TXEN_BK_0 BIT(1)
|
||||
#define B_AX_CTN_TXEN_BE_0 BIT(0)
|
||||
+#define B_AX_CTN_TXEN_ALL_MASK GENMASK(15, 0)
|
||||
|
||||
#define R_AX_MUEDCA_BE_PARAM_0 0xC350
|
||||
#define R_AX_MUEDCA_BE_PARAM_0_C1 0xE350
|
||||
@@ -939,6 +940,12 @@
|
||||
#define B_AX_CTN_CHK_CCA_S20 BIT(1)
|
||||
#define B_AX_CTN_CHK_CCA_P20 BIT(0)
|
||||
|
||||
+#define R_AX_CTN_DRV_TXEN 0xC398
|
||||
+#define R_AX_CTN_DRV_TXEN_C1 0xE398
|
||||
+#define B_AX_CTN_TXEN_TWT_3 BIT(17)
|
||||
+#define B_AX_CTN_TXEN_TWT_2 BIT(16)
|
||||
+#define B_AX_CTN_TXEN_ALL_MASK_V1 GENMASK(17, 0)
|
||||
+
|
||||
#define R_AX_SCHEDULE_ERR_IMR 0xC3E8
|
||||
#define R_AX_SCHEDULE_ERR_IMR_C1 0xE3E8
|
||||
#define B_AX_SORT_NON_IDLE_ERR_INT_EN BIT(1)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index 51e904ef8525..41fc8db311ec 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -1167,7 +1167,7 @@ static void rtw8852a_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
u8 phy_idx = RTW89_PHY_0;
|
||||
|
||||
if (enter) {
|
||||
- rtw89_mac_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
|
||||
rtw8852a_dfs_en(rtwdev, false);
|
||||
rtw8852a_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0);
|
||||
@@ -1180,7 +1180,7 @@ static void rtw8852a_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
rtw8852a_dfs_en(rtwdev, true);
|
||||
rtw8852a_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0);
|
||||
rtw8852a_bb_reset_en(rtwdev, phy_idx, true);
|
||||
- rtw89_mac_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en);
|
||||
+ rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2021,6 +2021,8 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
|
||||
.pwr_off_func = NULL,
|
||||
.cfg_ctrl_path = rtw89_mac_cfg_ctrl_path,
|
||||
.mac_cfg_gnt = rtw89_mac_cfg_gnt,
|
||||
+ .stop_sch_tx = rtw89_mac_stop_sch_tx,
|
||||
+ .resume_sch_tx = rtw89_mac_resume_sch_tx,
|
||||
|
||||
.btc_set_rfe = rtw8852a_btc_set_rfe,
|
||||
.btc_init_cfg = rtw8852a_btc_init_cfg,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
index 4b29dc9a5c07..ad272854c442 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
@@ -3554,7 +3554,7 @@ static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
__func__, phy, power, xdbm);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
- rtw89_mac_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy));
|
||||
tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
|
||||
@@ -3600,7 +3600,7 @@ static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
|
||||
rtw8852a_bb_tx_mode_switch(rtwdev, phy, 0);
|
||||
|
||||
- rtw89_mac_resume_sch_tx(rtwdev, phy, tx_en);
|
||||
+ rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
@@ -3627,7 +3627,7 @@ void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
- rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
@@ -3636,7 +3636,7 @@ void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
else
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
|
||||
- rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
+ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
@@ -3652,12 +3652,12 @@ void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
- rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_rx_dck(rtwdev, phy_idx, is_afe);
|
||||
|
||||
- rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
+ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
@@ -3667,14 +3667,14 @@ void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
- rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
+ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
rtwdev->dpk.is_dpk_enable = true;
|
||||
rtwdev->dpk.is_dpk_reload_en = false;
|
||||
_dpk(rtwdev, phy_idx, false);
|
||||
|
||||
- rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
+ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index 2ea9d5422ed7..58920e91765e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -492,6 +492,8 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
.cfg_ctrl_path = rtw89_mac_cfg_ctrl_path_v1,
|
||||
.mac_cfg_gnt = rtw89_mac_cfg_gnt_v1,
|
||||
+ .stop_sch_tx = rtw89_mac_stop_sch_tx_v1,
|
||||
+ .resume_sch_tx = rtw89_mac_resume_sch_tx_v1,
|
||||
};
|
||||
|
||||
const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
From e08929a293b4da920a52662019d06828ba4dbcfe Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:38 +0800
|
||||
Subject: [PATCH 502/544] rtw89: initialize preload window of D-MAC
|
||||
|
||||
8852C add new hardware feature -- preload window, which is used to load
|
||||
more data to D-MAC, so it can possibly yield better performance.
|
||||
|
||||
This patch is to configure preload and reserved size for next window.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-8-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 43 ++++++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 24 +++++++++++++
|
||||
2 files changed, 67 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index aa33ec95aa36..83690656c3e8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -1545,6 +1545,43 @@ static int dle_init(struct rtw89_dev *rtwdev, enum rtw89_qta_mode mode,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int preload_init_set(struct rtw89_dev *rtwdev, enum rtw89_mac_idx mac_idx,
|
||||
+ enum rtw89_qta_mode mode)
|
||||
+{
|
||||
+ u32 reg, max_preld_size, min_rsvd_size;
|
||||
+
|
||||
+ max_preld_size = (mac_idx == RTW89_MAC_0 ?
|
||||
+ PRELD_B0_ENT_NUM : PRELD_B1_ENT_NUM) * PRELD_AMSDU_SIZE;
|
||||
+ reg = mac_idx == RTW89_MAC_0 ?
|
||||
+ R_AX_TXPKTCTL_B0_PRELD_CFG0 : R_AX_TXPKTCTL_B1_PRELD_CFG0;
|
||||
+ rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_USEMAXSZ_MASK, max_preld_size);
|
||||
+ rtw89_write32_set(rtwdev, reg, B_AX_B0_PRELD_FEN);
|
||||
+
|
||||
+ min_rsvd_size = PRELD_AMSDU_SIZE;
|
||||
+ reg = mac_idx == RTW89_MAC_0 ?
|
||||
+ R_AX_TXPKTCTL_B0_PRELD_CFG1 : R_AX_TXPKTCTL_B1_PRELD_CFG1;
|
||||
+ rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_NXT_TXENDWIN_MASK, PRELD_NEXT_WND);
|
||||
+ rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_NXT_RSVMINSZ_MASK, min_rsvd_size);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static bool is_qta_poh(struct rtw89_dev *rtwdev)
|
||||
+{
|
||||
+ return rtwdev->hci.type == RTW89_HCI_TYPE_PCIE;
|
||||
+}
|
||||
+
|
||||
+static int preload_init(struct rtw89_dev *rtwdev, enum rtw89_mac_idx mac_idx,
|
||||
+ enum rtw89_qta_mode mode)
|
||||
+{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
+
|
||||
+ if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || !is_qta_poh(rtwdev))
|
||||
+ return 0;
|
||||
+
|
||||
+ return preload_init_set(rtwdev, mac_idx, mode);
|
||||
+}
|
||||
+
|
||||
static bool dle_is_txq_empty(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 msk32;
|
||||
@@ -1652,6 +1689,12 @@ static int dmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ ret = preload_init(rtwdev, RTW89_MAC_0, rtwdev->mac.qta_mode);
|
||||
+ if (ret) {
|
||||
+ rtw89_err(rtwdev, "[ERR]preload init %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
ret = hfc_init(rtwdev, true, true, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "[ERR]HCI FC init %d\n", ret);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 94ec7b2aad9d..5c11c5d81c8b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -742,6 +742,30 @@
|
||||
#define R_AX_DBG_FUN_INTF_DATA 0x9F34
|
||||
#define B_AX_DFI_DATA_MASK GENMASK(31, 0)
|
||||
|
||||
+#define R_AX_TXPKTCTL_B0_PRELD_CFG0 0x9F48
|
||||
+#define B_AX_B0_PRELD_FEN BIT(31)
|
||||
+#define B_AX_B0_PRELD_USEMAXSZ_MASK GENMASK(25, 16)
|
||||
+#define PRELD_B0_ENT_NUM 10
|
||||
+#define PRELD_AMSDU_SIZE 52
|
||||
+#define B_AX_B0_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8)
|
||||
+#define B_AX_B0_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0)
|
||||
+
|
||||
+#define R_AX_TXPKTCTL_B0_PRELD_CFG1 0x9F4C
|
||||
+#define B_AX_B0_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8)
|
||||
+#define PRELD_NEXT_WND 1
|
||||
+#define B_AX_B0_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0)
|
||||
+
|
||||
+#define R_AX_TXPKTCTL_B1_PRELD_CFG0 0x9F88
|
||||
+#define B_AX_B1_PRELD_FEN BIT(31)
|
||||
+#define B_AX_B1_PRELD_USEMAXSZ_MASK GENMASK(25, 16)
|
||||
+#define PRELD_B1_ENT_NUM 4
|
||||
+#define B_AX_B1_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8)
|
||||
+#define B_AX_B1_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0)
|
||||
+
|
||||
+#define R_AX_TXPKTCTL_B1_PRELD_CFG1 0x9F8C
|
||||
+#define B_AX_B1_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8)
|
||||
+#define B_AX_B1_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0)
|
||||
+
|
||||
#define R_AX_AFE_CTRL1 0x0024
|
||||
|
||||
#define B_AX_R_SYM_WLCMAC1_P4_PC_EN BIT(4)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
From e9dffdc5c7543d4d29fc437fbd8224ac8892107d Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Mon, 14 Mar 2022 15:12:45 +0800
|
||||
Subject: [PATCH 510/544] rtw89: mac: correct decision on error status by
|
||||
scenario
|
||||
|
||||
The raw error code might combine error scenario and error status.
|
||||
But, the error scenario isn't parsed previously. It makes us mishandle
|
||||
cpu exception and assertion. Now, we correct the error status for them.
|
||||
|
||||
Besides, a few uses of error status are refined.
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 12 ++++++++++--
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 8 ++++++++
|
||||
drivers/net/wireless/realtek/rtw89/ser.c | 6 ++++--
|
||||
3 files changed, 22 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 580757bb52cf..87adaa08fdb9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -257,7 +257,9 @@ static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev,
|
||||
u32 dmac_err, cmac_err;
|
||||
|
||||
if (err != MAC_AX_ERR_L1_ERR_DMAC &&
|
||||
- err != MAC_AX_ERR_L0_PROMOTE_TO_L1)
|
||||
+ err != MAC_AX_ERR_L0_PROMOTE_TO_L1 &&
|
||||
+ err != MAC_AX_ERR_L0_ERR_CMAC0 &&
|
||||
+ err != MAC_AX_ERR_L0_ERR_CMAC1)
|
||||
return;
|
||||
|
||||
rtw89_info(rtwdev, "--->\nerr=0x%x\n", err);
|
||||
@@ -458,7 +460,7 @@ static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev,
|
||||
|
||||
u32 rtw89_mac_get_err_status(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
- u32 err;
|
||||
+ u32 err, err_scnr;
|
||||
int ret;
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, err, (err != 0), 1000, 100000,
|
||||
@@ -471,6 +473,12 @@ u32 rtw89_mac_get_err_status(struct rtw89_dev *rtwdev)
|
||||
err = rtw89_read32(rtwdev, R_AX_HALT_C2H);
|
||||
rtw89_write32(rtwdev, R_AX_HALT_C2H_CTRL, 0);
|
||||
|
||||
+ err_scnr = RTW89_ERROR_SCENARIO(err);
|
||||
+ if (err_scnr == RTW89_WCPU_CPU_EXCEPTION)
|
||||
+ err = MAC_AX_ERR_CPU_EXCEPTION;
|
||||
+ else if (err_scnr == RTW89_WCPU_ASSERTION)
|
||||
+ err = MAC_AX_ERR_ASSERTION;
|
||||
+
|
||||
rtw89_fw_st_dbg_dump(rtwdev);
|
||||
rtw89_mac_dump_err_status(rtwdev, err);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index fdc5ded23fde..a05c504505d8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -521,6 +521,13 @@ struct rtw89_mac_dle_dfi_qempty {
|
||||
u32 qempty;
|
||||
};
|
||||
|
||||
+enum rtw89_mac_error_scenario {
|
||||
+ RTW89_WCPU_CPU_EXCEPTION = 2,
|
||||
+ RTW89_WCPU_ASSERTION = 3,
|
||||
+};
|
||||
+
|
||||
+#define RTW89_ERROR_SCENARIO(__err) ((__err) >> 28)
|
||||
+
|
||||
/* Define DBG and recovery enum */
|
||||
enum mac_ax_err_info {
|
||||
/* Get error info */
|
||||
@@ -659,6 +666,7 @@ enum mac_ax_err_info {
|
||||
MAC_AX_ERR_L2_ERR_APB_BBRF_TO_OTHERS = 0x2370,
|
||||
MAC_AX_ERR_L2_RESET_DONE = 0x2400,
|
||||
MAC_AX_ERR_CPU_EXCEPTION = 0x3000,
|
||||
+ MAC_AX_ERR_ASSERTION = 0x4000,
|
||||
MAC_AX_GET_ERR_MAX,
|
||||
MAC_AX_DUMP_SHAREBUFF_INDICATOR = 0x80000000,
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c
|
||||
index e86f3d89ef1b..5327b97b9c72 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/ser.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/ser.c
|
||||
@@ -477,7 +477,7 @@ int rtw89_ser_notify(struct rtw89_dev *rtwdev, u32 err)
|
||||
{
|
||||
u8 event = SER_EV_NONE;
|
||||
|
||||
- rtw89_info(rtwdev, "ser event = 0x%04x\n", err);
|
||||
+ rtw89_info(rtwdev, "SER catches error: 0x%x\n", err);
|
||||
|
||||
switch (err) {
|
||||
case MAC_AX_ERR_L1_ERR_DMAC:
|
||||
@@ -503,8 +503,10 @@ int rtw89_ser_notify(struct rtw89_dev *rtwdev, u32 err)
|
||||
break;
|
||||
}
|
||||
|
||||
- if (event == SER_EV_NONE)
|
||||
+ if (event == SER_EV_NONE) {
|
||||
+ rtw89_warn(rtwdev, "SER cannot recognize error: 0x%x\n", err);
|
||||
return -EINVAL;
|
||||
+ }
|
||||
|
||||
ser_send_msg(&rtwdev->ser, event);
|
||||
return 0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
From 4bff1c315a9e34ac9a10095b625379df92fb240b Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Mon, 14 Mar 2022 15:12:44 +0800
|
||||
Subject: [PATCH 509/544] rtw89: mac: move table of mem base addr to common
|
||||
|
||||
Previously, mac_mem_base_addr_table was declared in debug.c locally
|
||||
because it's only used via debugfs to dump mac memory. Now, we plan to
|
||||
refine SER (system error recover) flow which will also need to dump mac
|
||||
memory to somewhere as information for error which is catched. So, we
|
||||
move mac_mem_base_addr_table to mac.c rtw89_mac_mem_base_addrs earlier
|
||||
as common code.
|
||||
|
||||
(no logic is changed)
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/debug.c | 22 +---------------------
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 20 ++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/mac.h | 2 ++
|
||||
3 files changed, 23 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
|
||||
index b73cc03cecfd..09c545497ec5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
|
||||
@@ -724,26 +724,6 @@ rtw89_debug_priv_mac_mem_dump_select(struct file *filp,
|
||||
return count;
|
||||
}
|
||||
|
||||
-static const u32 mac_mem_base_addr_table[RTW89_MAC_MEM_MAX] = {
|
||||
- [RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_SHCUT_MACHDR] = SHCUT_MACHDR_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_STA_SCHED] = STA_SCHED_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_RXPLD_FLTR_CAM] = RXPLD_FLTR_CAM_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_SECURITY_CAM] = SECURITY_CAM_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_WOW_CAM] = WOW_CAM_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_CMAC_TBL] = CMAC_TBL_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_ADDR_CAM] = ADDR_CAM_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_BA_CAM] = BA_CAM_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_BCN_IE_CAM0] = BCN_IE_CAM0_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_BCN_IE_CAM1] = BCN_IE_CAM1_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_TXD_FIFO_0] = TXD_FIFO_0_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_TXD_FIFO_1] = TXD_FIFO_1_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_TXDATA_FIFO_0] = TXDATA_FIFO_0_BASE_ADDR,
|
||||
- [RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR,
|
||||
-};
|
||||
-
|
||||
static void rtw89_debug_dump_mac_mem(struct seq_file *m,
|
||||
struct rtw89_dev *rtwdev,
|
||||
u8 sel, u32 start_addr, u32 len)
|
||||
@@ -757,7 +737,7 @@ static void rtw89_debug_dump_mac_mem(struct seq_file *m,
|
||||
pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1;
|
||||
start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE;
|
||||
residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE;
|
||||
- base_addr = mac_mem_base_addr_table[sel];
|
||||
+ base_addr = rtw89_mac_mem_base_addrs[sel];
|
||||
base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE;
|
||||
|
||||
for (p = 0; p < pages; p++) {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 5e554bd9f036..580757bb52cf 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -10,6 +10,26 @@
|
||||
#include "reg.h"
|
||||
#include "util.h"
|
||||
|
||||
+const u32 rtw89_mac_mem_base_addrs[RTW89_MAC_MEM_MAX] = {
|
||||
+ [RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_SHCUT_MACHDR] = SHCUT_MACHDR_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_STA_SCHED] = STA_SCHED_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_RXPLD_FLTR_CAM] = RXPLD_FLTR_CAM_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_SECURITY_CAM] = SECURITY_CAM_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_WOW_CAM] = WOW_CAM_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_CMAC_TBL] = CMAC_TBL_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_ADDR_CAM] = ADDR_CAM_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_BA_CAM] = BA_CAM_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_BCN_IE_CAM0] = BCN_IE_CAM0_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_BCN_IE_CAM1] = BCN_IE_CAM1_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_TXD_FIFO_0] = TXD_FIFO_0_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_TXD_FIFO_1] = TXD_FIFO_1_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_TXDATA_FIFO_0] = TXDATA_FIFO_0_BASE_ADDR,
|
||||
+ [RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR,
|
||||
+};
|
||||
+
|
||||
int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
enum rtw89_mac_hwmod_sel sel)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
index b797667c78c6..fdc5ded23fde 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
|
||||
@@ -273,6 +273,8 @@ enum rtw89_mac_mem_sel {
|
||||
RTW89_MAC_MEM_INVALID = RTW89_MAC_MEM_LAST,
|
||||
};
|
||||
|
||||
+extern const u32 rtw89_mac_mem_base_addrs[];
|
||||
+
|
||||
enum rtw89_rpwm_req_pwr_state {
|
||||
RTW89_MAC_RPWM_REQ_PWR_STATE_ACTIVE = 0,
|
||||
RTW89_MAC_RPWM_REQ_PWR_STATE_BAND0_RFON = 1,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
From 551bd7d71c44ccd6a88fed5edf18b7c3a8610a11 Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Fri, 11 Feb 2022 15:59:48 +0800
|
||||
Subject: [PATCH 465/544] rtw89: make rfk helpers common across chips
|
||||
|
||||
These rfk helpers are also useful for the chip which is under planning.
|
||||
So, move them to common code to avoid duplicate stuff in the future.
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220211075953.40421-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 52 ++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.h | 59 ++++++++++++++++++
|
||||
.../net/wireless/realtek/rtw89/rtw8852a_rfk.c | 60 -------------------
|
||||
.../realtek/rtw89/rtw8852a_rfk_table.h | 49 +--------------
|
||||
4 files changed, 112 insertions(+), 108 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 130db2f46f49..c491a1153681 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -3037,3 +3037,55 @@ void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif
|
||||
rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_STAID,
|
||||
vif->bss_conf.aid, phy_idx);
|
||||
}
|
||||
+
|
||||
+static void
|
||||
+_rfk_write_rf(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
+{
|
||||
+ rtw89_write_rf(rtwdev, def->path, def->addr, def->mask, def->data);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+_rfk_write32_mask(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
+{
|
||||
+ rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+_rfk_write32_set(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
+{
|
||||
+ rtw89_phy_write32_set(rtwdev, def->addr, def->mask);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+_rfk_write32_clr(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
+{
|
||||
+ rtw89_phy_write32_clr(rtwdev, def->addr, def->mask);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+_rfk_delay(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
+{
|
||||
+ udelay(def->data);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+(*_rfk_handler[])(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) = {
|
||||
+ [RTW89_RFK_F_WRF] = _rfk_write_rf,
|
||||
+ [RTW89_RFK_F_WM] = _rfk_write32_mask,
|
||||
+ [RTW89_RFK_F_WS] = _rfk_write32_set,
|
||||
+ [RTW89_RFK_F_WC] = _rfk_write32_clr,
|
||||
+ [RTW89_RFK_F_DELAY] = _rfk_delay,
|
||||
+};
|
||||
+
|
||||
+static_assert(ARRAY_SIZE(_rfk_handler) == RTW89_RFK_F_NUM);
|
||||
+
|
||||
+void
|
||||
+rtw89_rfk_parser(struct rtw89_dev *rtwdev, const struct rtw89_rfk_tbl *tbl)
|
||||
+{
|
||||
+ const struct rtw89_reg5_def *p = tbl->defs;
|
||||
+ const struct rtw89_reg5_def *end = tbl->defs + tbl->size;
|
||||
+
|
||||
+ for (; p < end; p++)
|
||||
+ _rfk_handler[p->flag](rtwdev, p);
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw89_rfk_parser);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
index 2cb68f49b4d6..81bd4aeffc75 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
|
||||
@@ -328,6 +328,65 @@ static inline u32 rtw89_phy_read32_mask(struct rtw89_dev *rtwdev,
|
||||
return rtw89_read32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask);
|
||||
}
|
||||
|
||||
+enum rtw89_rfk_flag {
|
||||
+ RTW89_RFK_F_WRF = 0,
|
||||
+ RTW89_RFK_F_WM = 1,
|
||||
+ RTW89_RFK_F_WS = 2,
|
||||
+ RTW89_RFK_F_WC = 3,
|
||||
+ RTW89_RFK_F_DELAY = 4,
|
||||
+ RTW89_RFK_F_NUM,
|
||||
+};
|
||||
+
|
||||
+struct rtw89_rfk_tbl {
|
||||
+ const struct rtw89_reg5_def *defs;
|
||||
+ u32 size;
|
||||
+};
|
||||
+
|
||||
+#define DECLARE_RFK_TBL(_name) \
|
||||
+const struct rtw89_rfk_tbl _name ## _tbl = { \
|
||||
+ .defs = _name, \
|
||||
+ .size = ARRAY_SIZE(_name), \
|
||||
+}
|
||||
+
|
||||
+#define DECL_RFK_WRF(_path, _addr, _mask, _data) \
|
||||
+ {.flag = RTW89_RFK_F_WRF, \
|
||||
+ .path = _path, \
|
||||
+ .addr = _addr, \
|
||||
+ .mask = _mask, \
|
||||
+ .data = _data,}
|
||||
+
|
||||
+#define DECL_RFK_WM(_addr, _mask, _data) \
|
||||
+ {.flag = RTW89_RFK_F_WM, \
|
||||
+ .addr = _addr, \
|
||||
+ .mask = _mask, \
|
||||
+ .data = _data,}
|
||||
+
|
||||
+#define DECL_RFK_WS(_addr, _mask) \
|
||||
+ {.flag = RTW89_RFK_F_WS, \
|
||||
+ .addr = _addr, \
|
||||
+ .mask = _mask,}
|
||||
+
|
||||
+#define DECL_RFK_WC(_addr, _mask) \
|
||||
+ {.flag = RTW89_RFK_F_WC, \
|
||||
+ .addr = _addr, \
|
||||
+ .mask = _mask,}
|
||||
+
|
||||
+#define DECL_RFK_DELAY(_data) \
|
||||
+ {.flag = RTW89_RFK_F_DELAY, \
|
||||
+ .data = _data,}
|
||||
+
|
||||
+void
|
||||
+rtw89_rfk_parser(struct rtw89_dev *rtwdev, const struct rtw89_rfk_tbl *tbl);
|
||||
+
|
||||
+#define rtw89_rfk_parser_by_cond(dev, cond, tbl_t, tbl_f) \
|
||||
+ do { \
|
||||
+ typeof(dev) __dev = (dev); \
|
||||
+ if (cond) \
|
||||
+ rtw89_rfk_parser(__dev, (tbl_t)); \
|
||||
+ else \
|
||||
+ rtw89_rfk_parser(__dev, (tbl_f)); \
|
||||
+ } while (0)
|
||||
+
|
||||
void rtw89_phy_write_reg3_tbl(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_phy_reg3_tbl *tbl);
|
||||
u8 rtw89_phy_get_txsc(struct rtw89_dev *rtwdev,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
index c021e93eb07b..aa326681b509 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
|
||||
@@ -12,66 +12,6 @@
|
||||
#include "rtw8852a_rfk_table.h"
|
||||
#include "rtw8852a_table.h"
|
||||
|
||||
-static void
|
||||
-_rfk_write_rf(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
-{
|
||||
- rtw89_write_rf(rtwdev, def->path, def->addr, def->mask, def->data);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-_rfk_write32_mask(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
-{
|
||||
- rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-_rfk_write32_set(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
-{
|
||||
- rtw89_phy_write32_set(rtwdev, def->addr, def->mask);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-_rfk_write32_clr(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
-{
|
||||
- rtw89_phy_write32_clr(rtwdev, def->addr, def->mask);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-_rfk_delay(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def)
|
||||
-{
|
||||
- udelay(def->data);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-(*_rfk_handler[])(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) = {
|
||||
- [RTW89_RFK_F_WRF] = _rfk_write_rf,
|
||||
- [RTW89_RFK_F_WM] = _rfk_write32_mask,
|
||||
- [RTW89_RFK_F_WS] = _rfk_write32_set,
|
||||
- [RTW89_RFK_F_WC] = _rfk_write32_clr,
|
||||
- [RTW89_RFK_F_DELAY] = _rfk_delay,
|
||||
-};
|
||||
-
|
||||
-static_assert(ARRAY_SIZE(_rfk_handler) == RTW89_RFK_F_NUM);
|
||||
-
|
||||
-static void
|
||||
-rtw89_rfk_parser(struct rtw89_dev *rtwdev, const struct rtw89_rfk_tbl *tbl)
|
||||
-{
|
||||
- const struct rtw89_reg5_def *p = tbl->defs;
|
||||
- const struct rtw89_reg5_def *end = tbl->defs + tbl->size;
|
||||
-
|
||||
- for (; p < end; p++)
|
||||
- _rfk_handler[p->flag](rtwdev, p);
|
||||
-}
|
||||
-
|
||||
-#define rtw89_rfk_parser_by_cond(rtwdev, cond, tbl_t, tbl_f) \
|
||||
- do { \
|
||||
- typeof(rtwdev) _dev = (rtwdev); \
|
||||
- if (cond) \
|
||||
- rtw89_rfk_parser(_dev, (tbl_t)); \
|
||||
- else \
|
||||
- rtw89_rfk_parser(_dev, (tbl_f)); \
|
||||
- } while (0)
|
||||
-
|
||||
static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x, PHY%d\n",
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.h b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.h
|
||||
index 4a4a45d778ff..33e6c404ecf9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.h
|
||||
@@ -5,54 +5,7 @@
|
||||
#ifndef __RTW89_8852A_RFK_TABLE_H__
|
||||
#define __RTW89_8852A_RFK_TABLE_H__
|
||||
|
||||
-#include "core.h"
|
||||
-
|
||||
-enum rtw89_rfk_flag {
|
||||
- RTW89_RFK_F_WRF = 0,
|
||||
- RTW89_RFK_F_WM = 1,
|
||||
- RTW89_RFK_F_WS = 2,
|
||||
- RTW89_RFK_F_WC = 3,
|
||||
- RTW89_RFK_F_DELAY = 4,
|
||||
- RTW89_RFK_F_NUM,
|
||||
-};
|
||||
-
|
||||
-struct rtw89_rfk_tbl {
|
||||
- const struct rtw89_reg5_def *defs;
|
||||
- u32 size;
|
||||
-};
|
||||
-
|
||||
-#define DECLARE_RFK_TBL(_name) \
|
||||
-const struct rtw89_rfk_tbl _name ## _tbl = { \
|
||||
- .defs = _name, \
|
||||
- .size = ARRAY_SIZE(_name), \
|
||||
-}
|
||||
-
|
||||
-#define DECL_RFK_WRF(_path, _addr, _mask, _data) \
|
||||
- {.flag = RTW89_RFK_F_WRF, \
|
||||
- .path = _path, \
|
||||
- .addr = _addr, \
|
||||
- .mask = _mask, \
|
||||
- .data = _data,}
|
||||
-
|
||||
-#define DECL_RFK_WM(_addr, _mask, _data) \
|
||||
- {.flag = RTW89_RFK_F_WM, \
|
||||
- .addr = _addr, \
|
||||
- .mask = _mask, \
|
||||
- .data = _data,}
|
||||
-
|
||||
-#define DECL_RFK_WS(_addr, _mask) \
|
||||
- {.flag = RTW89_RFK_F_WS, \
|
||||
- .addr = _addr, \
|
||||
- .mask = _mask,}
|
||||
-
|
||||
-#define DECL_RFK_WC(_addr, _mask) \
|
||||
- {.flag = RTW89_RFK_F_WC, \
|
||||
- .addr = _addr, \
|
||||
- .mask = _mask,}
|
||||
-
|
||||
-#define DECL_RFK_DELAY(_data) \
|
||||
- {.flag = RTW89_RFK_F_DELAY, \
|
||||
- .data = _data,}
|
||||
+#include "phy.h"
|
||||
|
||||
extern const struct rtw89_rfk_tbl rtw8852a_tssi_sys_defs_tbl;
|
||||
extern const struct rtw89_rfk_tbl rtw8852a_tssi_sys_defs_2g_tbl;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
From a6de0a394878050029b37fcaa56c56d6f89cb063 Mon Sep 17 00:00:00 2001
|
||||
From: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:37 +0800
|
||||
Subject: [PATCH 501/544] rtw89: modify MAC enable functions
|
||||
|
||||
Modify functions that control D-MAC (data MAC) and LDO to support variant
|
||||
chips.
|
||||
|
||||
Signed-off-by: Chia-Yuan Li <leo.li@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-7-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 29 +++++++++++++++++++-----
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 2 ++
|
||||
2 files changed, 25 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 8fbdfd983cc5..aa33ec95aa36 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -1128,18 +1128,31 @@ static int cmac_func_en(struct rtw89_dev *rtwdev, u8 mac_idx, bool en)
|
||||
|
||||
static int dmac_func_en(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
u32 val32;
|
||||
|
||||
- val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MAC_SEC_EN |
|
||||
- B_AX_DISPATCHER_EN | B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN |
|
||||
- B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN | B_AX_STA_SCH_EN |
|
||||
- B_AX_TXPKT_CTRL_EN | B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN);
|
||||
+ if (chip_id == RTL8852C)
|
||||
+ val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN |
|
||||
+ B_AX_MAC_SEC_EN | B_AX_DISPATCHER_EN |
|
||||
+ B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN |
|
||||
+ B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN |
|
||||
+ B_AX_STA_SCH_EN | B_AX_TXPKT_CTRL_EN |
|
||||
+ B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN |
|
||||
+ B_AX_DMAC_CRPRT | B_AX_H_AXIDMA_EN);
|
||||
+ else
|
||||
+ val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN |
|
||||
+ B_AX_MAC_SEC_EN | B_AX_DISPATCHER_EN |
|
||||
+ B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN |
|
||||
+ B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN |
|
||||
+ B_AX_STA_SCH_EN | B_AX_TXPKT_CTRL_EN |
|
||||
+ B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN |
|
||||
+ B_AX_DMAC_CRPRT);
|
||||
rtw89_write32(rtwdev, R_AX_DMAC_FUNC_EN, val32);
|
||||
|
||||
val32 = (B_AX_MAC_SEC_CLK_EN | B_AX_DISPATCHER_CLK_EN |
|
||||
B_AX_DLE_CPUIO_CLK_EN | B_AX_PKT_IN_CLK_EN |
|
||||
B_AX_STA_SCH_CLK_EN | B_AX_TXPKT_CTRL_CLK_EN |
|
||||
- B_AX_WD_RLS_CLK_EN);
|
||||
+ B_AX_WD_RLS_CLK_EN | B_AX_BBRPT_CLK_EN);
|
||||
rtw89_write32(rtwdev, R_AX_DMAC_CLK_EN, val32);
|
||||
|
||||
return 0;
|
||||
@@ -1147,7 +1160,11 @@ static int dmac_func_en(struct rtw89_dev *rtwdev)
|
||||
|
||||
static int chip_func_en(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
- rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL0, B_AX_OCP_L1_MASK);
|
||||
+ enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
+
|
||||
+ if (chip_id == RTL8852A)
|
||||
+ rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL0,
|
||||
+ B_AX_OCP_L1_MASK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index 26efdfa70c04..94ec7b2aad9d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -312,6 +312,7 @@
|
||||
#define R_AX_BOOT_DBG 0x83F0
|
||||
|
||||
#define R_AX_DMAC_FUNC_EN 0x8400
|
||||
+#define B_AX_DMAC_CRPRT BIT(31)
|
||||
#define B_AX_MAC_FUNC_EN BIT(30)
|
||||
#define B_AX_DMAC_FUNC_EN BIT(29)
|
||||
#define B_AX_MPDU_PROC_EN BIT(28)
|
||||
@@ -339,6 +340,7 @@
|
||||
#define B_AX_PKT_IN_CLK_EN BIT(20)
|
||||
#define B_AX_DLE_CPUIO_CLK_EN BIT(19)
|
||||
#define B_AX_DISPATCHER_CLK_EN BIT(18)
|
||||
+#define B_AX_BBRPT_CLK_EN BIT(17)
|
||||
#define B_AX_MAC_SEC_CLK_EN BIT(16)
|
||||
|
||||
#define PCI_LTR_IDLE_TIMER_1US 0
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
From 873fe671e0a2aa882158a44b54156954b6b7d361 Mon Sep 17 00:00:00 2001
|
||||
From: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Date: Thu, 17 Mar 2022 13:55:32 +0800
|
||||
Subject: [PATCH 496/544] rtw89: modify dcfo_comp to share with chips
|
||||
|
||||
The dcfo_comp is digital CFO (central frequency offset) compensation.
|
||||
Since the flow can be shared with all chips, add chip parameters to support
|
||||
variant register address and format.
|
||||
|
||||
Signed-off-by: Yuan-Han Zhang <yuanhan1020@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220317055543.40514-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 10 ++++++----
|
||||
drivers/net/wireless/realtek/rtw89/reg.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 6 ++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 6 ++++++
|
||||
5 files changed, 22 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 483cf45fbcc9..51c99e50b0ed 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -2332,6 +2332,8 @@ struct rtw89_chip_info {
|
||||
u32 c2h_ctrl_reg;
|
||||
const u32 *c2h_regs;
|
||||
const struct rtw89_page_regs *page_regs;
|
||||
+ const struct rtw89_reg_def *dcfo_comp;
|
||||
+ u8 dcfo_comp_sft;
|
||||
};
|
||||
|
||||
union rtw89_bus_info {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index c6953a78658a..6a7e08bdd00e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -1705,9 +1705,11 @@ static void rtw89_phy_cfo_reset(struct rtw89_dev *rtwdev)
|
||||
|
||||
static void rtw89_dcfo_comp(struct rtw89_dev *rtwdev, s32 curr_cfo)
|
||||
{
|
||||
+ const struct rtw89_reg_def *dcfo_comp = rtwdev->chip->dcfo_comp;
|
||||
bool is_linked = rtwdev->total_sta_assoc > 0;
|
||||
s32 cfo_avg_312;
|
||||
- s32 dcfo_comp;
|
||||
+ s32 dcfo_comp_val;
|
||||
+ u8 dcfo_comp_sft = rtwdev->chip->dcfo_comp_sft;
|
||||
int sign;
|
||||
|
||||
if (!is_linked) {
|
||||
@@ -1718,13 +1720,13 @@ static void rtw89_dcfo_comp(struct rtw89_dev *rtwdev, s32 curr_cfo)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: curr_cfo=%d\n", curr_cfo);
|
||||
if (curr_cfo == 0)
|
||||
return;
|
||||
- dcfo_comp = rtw89_phy_read32_mask(rtwdev, R_DCFO, B_DCFO);
|
||||
+ dcfo_comp_val = rtw89_phy_read32_mask(rtwdev, R_DCFO, B_DCFO);
|
||||
sign = curr_cfo > 0 ? 1 : -1;
|
||||
- cfo_avg_312 = (curr_cfo << 3) / 5 + sign * dcfo_comp;
|
||||
+ cfo_avg_312 = (curr_cfo << dcfo_comp_sft) / 5 + sign * dcfo_comp_val;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: avg_cfo=%d\n", cfo_avg_312);
|
||||
if (rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv == CHIP_CBV)
|
||||
cfo_avg_312 = -cfo_avg_312;
|
||||
- rtw89_phy_set_phy_regs(rtwdev, R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK,
|
||||
+ rtw89_phy_set_phy_regs(rtwdev, dcfo_comp->addr, dcfo_comp->mask,
|
||||
cfo_avg_312);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
index ec5e70b86600..a239bf017ac7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
|
||||
@@ -2093,6 +2093,8 @@
|
||||
#define R_CHBW_MOD 0x4978
|
||||
#define B_CHBW_MOD_PRICH GENMASK(11, 8)
|
||||
#define B_CHBW_MOD_SBW GENMASK(13, 12)
|
||||
+#define R_DCFO_COMP_S0_V1 0x4A40
|
||||
+#define B_DCFO_COMP_S0_V1_MSK GENMASK(13, 0)
|
||||
#define R_BMODE_PDTH_V1 0x4B64
|
||||
#define B_BMODE_PDTH_LOWER_BOUND_MSK_V1 GENMASK(31, 24)
|
||||
#define R_BMODE_PDTH_EN_V1 0x4B74
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
index c429eeae1b56..392f6e6e0a13 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
|
||||
@@ -402,6 +402,10 @@ static const struct rtw89_page_regs rtw8852a_page_regs = {
|
||||
.wp_page_info1 = R_AX_WP_PAGE_INFO1,
|
||||
};
|
||||
|
||||
+static const struct rtw89_reg_def rtw8852a_dcfo_comp = {
|
||||
+ R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK
|
||||
+};
|
||||
+
|
||||
static void rtw8852ae_efuse_parsing(struct rtw89_efuse *efuse,
|
||||
struct rtw8852a_efuse *map)
|
||||
{
|
||||
@@ -2091,6 +2095,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL,
|
||||
.c2h_regs = rtw8852a_c2h_regs,
|
||||
.page_regs = &rtw8852a_page_regs,
|
||||
+ .dcfo_comp = &rtw8852a_dcfo_comp,
|
||||
+ .dcfo_comp_sft = 3,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852a_chip_info);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
index 35a9f40af3c9..f37acfe7679e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
|
||||
@@ -44,6 +44,10 @@ static const struct rtw89_page_regs rtw8852c_page_regs = {
|
||||
.wp_page_info1 = R_AX_WP_PAGE_INFO1_V1,
|
||||
};
|
||||
|
||||
+static const struct rtw89_reg_def rtw8852c_dcfo_comp = {
|
||||
+ R_DCFO_COMP_S0_V1, B_DCFO_COMP_S0_V1_MSK
|
||||
+};
|
||||
+
|
||||
static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
@@ -470,6 +474,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL_V1,
|
||||
.c2h_regs = rtw8852c_c2h_regs,
|
||||
.page_regs = &rtw8852c_page_regs,
|
||||
+ .dcfo_comp = &rtw8852c_dcfo_comp,
|
||||
+ .dcfo_comp_sft = 5,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852c_chip_info);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From 038b64f8ff0d1df6d6c5f0a0173d67a8d30687eb Mon Sep 17 00:00:00 2001
|
||||
From: Po Hao Huang <phhuang@realtek.com>
|
||||
Date: Fri, 1 Apr 2022 13:50:41 +0800
|
||||
Subject: [PATCH 516/544] rtw89: packet offload handler to avoid warning
|
||||
|
||||
Add a dummy function for packet offload to eliminate warning message
|
||||
"c2h class 1 func 2 not support". This c2h is for debug purpose and
|
||||
its presence itself can do the work, so further parsing won't be
|
||||
required for now.
|
||||
|
||||
Signed-off-by: Po Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/mac.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
index 87adaa08fdb9..5f4846d609cd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
|
||||
@@ -3479,12 +3479,18 @@ rtw89_mac_c2h_bcn_cnt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
|
||||
{
|
||||
}
|
||||
|
||||
+static void
|
||||
+rtw89_mac_c2h_pkt_ofld_rsp(struct rtw89_dev *rtwdev, struct sk_buff *c2h,
|
||||
+ u32 len)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static
|
||||
void (* const rtw89_mac_c2h_ofld_handler[])(struct rtw89_dev *rtwdev,
|
||||
struct sk_buff *c2h, u32 len) = {
|
||||
[RTW89_MAC_C2H_FUNC_EFUSE_DUMP] = NULL,
|
||||
[RTW89_MAC_C2H_FUNC_READ_RSP] = NULL,
|
||||
- [RTW89_MAC_C2H_FUNC_PKT_OFLD_RSP] = NULL,
|
||||
+ [RTW89_MAC_C2H_FUNC_PKT_OFLD_RSP] = rtw89_mac_c2h_pkt_ofld_rsp,
|
||||
[RTW89_MAC_C2H_FUNC_BCN_RESEND] = NULL,
|
||||
[RTW89_MAC_C2H_FUNC_MACID_PAUSE] = rtw89_mac_c2h_macid_pause,
|
||||
[RTW89_MAC_C2H_FUNC_SCANOFLD_RSP] = rtw89_mac_c2h_scanofld_rsp,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,408 @@
|
||||
From b034548ed0b4839815a224f91ad304ea5e342c3b Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:47 +0800
|
||||
Subject: [PATCH 483/544] rtw89: pci: add V1 of PCI channel address
|
||||
|
||||
8852CE use V1 address, and flow is totally shared with 8852AE.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-4-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/pci.c | 182 ++++++++++--------
|
||||
drivers/net/wireless/realtek/rtw89/pci.h | 67 +++++++
|
||||
.../net/wireless/realtek/rtw89/rtw8852ae.c | 1 +
|
||||
.../net/wireless/realtek/rtw89/rtw8852ce.c | 1 +
|
||||
4 files changed, 175 insertions(+), 76 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
index 9f2a23e79e5d..38ad47126848 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
@@ -697,71 +697,110 @@ static irqreturn_t rtw89_pci_interrupt_handler(int irq, void *dev)
|
||||
return irqret;
|
||||
}
|
||||
|
||||
-#define case_TXCHADDRS(txch) \
|
||||
- case RTW89_TXCH_##txch: \
|
||||
- *addr_num = R_AX_##txch##_TXBD_NUM; \
|
||||
- *addr_idx = R_AX_##txch##_TXBD_IDX; \
|
||||
- *addr_bdram = R_AX_##txch##_BDRAM_CTRL; \
|
||||
- *addr_desa_l = R_AX_##txch##_TXBD_DESA_L; \
|
||||
- *addr_desa_h = R_AX_##txch##_TXBD_DESA_H; \
|
||||
- break
|
||||
-
|
||||
-static int rtw89_pci_get_txch_addrs(enum rtw89_tx_channel txch,
|
||||
- u32 *addr_num,
|
||||
- u32 *addr_idx,
|
||||
- u32 *addr_bdram,
|
||||
- u32 *addr_desa_l,
|
||||
- u32 *addr_desa_h)
|
||||
-{
|
||||
- switch (txch) {
|
||||
- case_TXCHADDRS(ACH0);
|
||||
- case_TXCHADDRS(ACH1);
|
||||
- case_TXCHADDRS(ACH2);
|
||||
- case_TXCHADDRS(ACH3);
|
||||
- case_TXCHADDRS(ACH4);
|
||||
- case_TXCHADDRS(ACH5);
|
||||
- case_TXCHADDRS(ACH6);
|
||||
- case_TXCHADDRS(ACH7);
|
||||
- case_TXCHADDRS(CH8);
|
||||
- case_TXCHADDRS(CH9);
|
||||
- case_TXCHADDRS(CH10);
|
||||
- case_TXCHADDRS(CH11);
|
||||
- case_TXCHADDRS(CH12);
|
||||
- default:
|
||||
+#define DEF_TXCHADDRS_TYPE1(info, txch, v...) \
|
||||
+ [RTW89_TXCH_##txch] = { \
|
||||
+ .num = R_AX_##txch##_TXBD_NUM ##v, \
|
||||
+ .idx = R_AX_##txch##_TXBD_IDX ##v, \
|
||||
+ .bdram = R_AX_##txch##_BDRAM_CTRL ##v, \
|
||||
+ .desa_l = R_AX_##txch##_TXBD_DESA_L ##v, \
|
||||
+ .desa_h = R_AX_##txch##_TXBD_DESA_H ##v, \
|
||||
+ }
|
||||
+
|
||||
+#define DEF_TXCHADDRS(info, txch, v...) \
|
||||
+ [RTW89_TXCH_##txch] = { \
|
||||
+ .num = R_AX_##txch##_TXBD_NUM, \
|
||||
+ .idx = R_AX_##txch##_TXBD_IDX, \
|
||||
+ .bdram = R_AX_##txch##_BDRAM_CTRL ##v, \
|
||||
+ .desa_l = R_AX_##txch##_TXBD_DESA_L ##v, \
|
||||
+ .desa_h = R_AX_##txch##_TXBD_DESA_H ##v, \
|
||||
+ }
|
||||
+
|
||||
+#define DEF_RXCHADDRS(info, rxch, v...) \
|
||||
+ [RTW89_RXCH_##rxch] = { \
|
||||
+ .num = R_AX_##rxch##_RXBD_NUM ##v, \
|
||||
+ .idx = R_AX_##rxch##_RXBD_IDX ##v, \
|
||||
+ .desa_l = R_AX_##rxch##_RXBD_DESA_L ##v, \
|
||||
+ .desa_h = R_AX_##rxch##_RXBD_DESA_H ##v, \
|
||||
+ }
|
||||
+
|
||||
+const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set = {
|
||||
+ .tx = {
|
||||
+ DEF_TXCHADDRS(info, ACH0),
|
||||
+ DEF_TXCHADDRS(info, ACH1),
|
||||
+ DEF_TXCHADDRS(info, ACH2),
|
||||
+ DEF_TXCHADDRS(info, ACH3),
|
||||
+ DEF_TXCHADDRS(info, ACH4),
|
||||
+ DEF_TXCHADDRS(info, ACH5),
|
||||
+ DEF_TXCHADDRS(info, ACH6),
|
||||
+ DEF_TXCHADDRS(info, ACH7),
|
||||
+ DEF_TXCHADDRS(info, CH8),
|
||||
+ DEF_TXCHADDRS(info, CH9),
|
||||
+ DEF_TXCHADDRS_TYPE1(info, CH10),
|
||||
+ DEF_TXCHADDRS_TYPE1(info, CH11),
|
||||
+ DEF_TXCHADDRS(info, CH12),
|
||||
+ },
|
||||
+ .rx = {
|
||||
+ DEF_RXCHADDRS(info, RXQ),
|
||||
+ DEF_RXCHADDRS(info, RPQ),
|
||||
+ },
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_pci_ch_dma_addr_set);
|
||||
+
|
||||
+const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_v1 = {
|
||||
+ .tx = {
|
||||
+ DEF_TXCHADDRS(info, ACH0, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH1, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH2, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH3, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH4, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH5, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH6, _V1),
|
||||
+ DEF_TXCHADDRS(info, ACH7, _V1),
|
||||
+ DEF_TXCHADDRS(info, CH8, _V1),
|
||||
+ DEF_TXCHADDRS(info, CH9, _V1),
|
||||
+ DEF_TXCHADDRS_TYPE1(info, CH10, _V1),
|
||||
+ DEF_TXCHADDRS_TYPE1(info, CH11, _V1),
|
||||
+ DEF_TXCHADDRS(info, CH12, _V1),
|
||||
+ },
|
||||
+ .rx = {
|
||||
+ DEF_RXCHADDRS(info, RXQ, _V1),
|
||||
+ DEF_RXCHADDRS(info, RPQ, _V1),
|
||||
+ },
|
||||
+};
|
||||
+EXPORT_SYMBOL(rtw89_pci_ch_dma_addr_set_v1);
|
||||
+
|
||||
+#undef DEF_TXCHADDRS_TYPE1
|
||||
+#undef DEF_TXCHADDRS
|
||||
+#undef DEF_RXCHADDRS
|
||||
+
|
||||
+static int rtw89_pci_get_txch_addrs(struct rtw89_dev *rtwdev,
|
||||
+ enum rtw89_tx_channel txch,
|
||||
+ const struct rtw89_pci_ch_dma_addr **addr)
|
||||
+{
|
||||
+ const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
+
|
||||
+ if (txch >= RTW89_TXCH_NUM)
|
||||
return -EINVAL;
|
||||
- }
|
||||
+
|
||||
+ *addr = &info->dma_addr_set->tx[txch];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-#undef case_TXCHADDRS
|
||||
-
|
||||
-#define case_RXCHADDRS(rxch) \
|
||||
- case RTW89_RXCH_##rxch: \
|
||||
- *addr_num = R_AX_##rxch##_RXBD_NUM; \
|
||||
- *addr_idx = R_AX_##rxch##_RXBD_IDX; \
|
||||
- *addr_desa_l = R_AX_##rxch##_RXBD_DESA_L; \
|
||||
- *addr_desa_h = R_AX_##rxch##_RXBD_DESA_H; \
|
||||
- break
|
||||
-
|
||||
-static int rtw89_pci_get_rxch_addrs(enum rtw89_rx_channel rxch,
|
||||
- u32 *addr_num,
|
||||
- u32 *addr_idx,
|
||||
- u32 *addr_desa_l,
|
||||
- u32 *addr_desa_h)
|
||||
+static int rtw89_pci_get_rxch_addrs(struct rtw89_dev *rtwdev,
|
||||
+ enum rtw89_rx_channel rxch,
|
||||
+ const struct rtw89_pci_ch_dma_addr **addr)
|
||||
{
|
||||
- switch (rxch) {
|
||||
- case_RXCHADDRS(RXQ);
|
||||
- case_RXCHADDRS(RPQ);
|
||||
- default:
|
||||
+ const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
+
|
||||
+ if (rxch >= RTW89_RXCH_NUM)
|
||||
return -EINVAL;
|
||||
- }
|
||||
+
|
||||
+ *addr = &info->dma_addr_set->rx[rxch];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-#undef case_RXCHADDRS
|
||||
-
|
||||
static u32 rtw89_pci_get_avail_txbd_num(struct rtw89_pci_tx_ring *ring)
|
||||
{
|
||||
struct rtw89_pci_dma_ring *bd_ring = &ring->bd_ring;
|
||||
@@ -2188,14 +2227,10 @@ static int rtw89_pci_alloc_tx_ring(struct rtw89_dev *rtwdev,
|
||||
u32 desc_size, u32 len,
|
||||
enum rtw89_tx_channel txch)
|
||||
{
|
||||
+ const struct rtw89_pci_ch_dma_addr *txch_addr;
|
||||
int ring_sz = desc_size * len;
|
||||
u8 *head;
|
||||
dma_addr_t dma;
|
||||
- u32 addr_num;
|
||||
- u32 addr_idx;
|
||||
- u32 addr_bdram;
|
||||
- u32 addr_desa_l;
|
||||
- u32 addr_desa_h;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_pci_alloc_tx_wd_ring(rtwdev, pdev, tx_ring, txch);
|
||||
@@ -2204,8 +2239,7 @@ static int rtw89_pci_alloc_tx_ring(struct rtw89_dev *rtwdev,
|
||||
goto err;
|
||||
}
|
||||
|
||||
- ret = rtw89_pci_get_txch_addrs(txch, &addr_num, &addr_idx, &addr_bdram,
|
||||
- &addr_desa_l, &addr_desa_h);
|
||||
+ ret = rtw89_pci_get_txch_addrs(rtwdev, txch, &txch_addr);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to get address of txch %d", txch);
|
||||
goto err_free_wd_ring;
|
||||
@@ -2222,11 +2256,11 @@ static int rtw89_pci_alloc_tx_ring(struct rtw89_dev *rtwdev,
|
||||
tx_ring->bd_ring.dma = dma;
|
||||
tx_ring->bd_ring.len = len;
|
||||
tx_ring->bd_ring.desc_size = desc_size;
|
||||
- tx_ring->bd_ring.addr_num = addr_num;
|
||||
- tx_ring->bd_ring.addr_idx = addr_idx;
|
||||
- tx_ring->bd_ring.addr_bdram = addr_bdram;
|
||||
- tx_ring->bd_ring.addr_desa_l = addr_desa_l;
|
||||
- tx_ring->bd_ring.addr_desa_h = addr_desa_h;
|
||||
+ tx_ring->bd_ring.addr_num = txch_addr->num;
|
||||
+ tx_ring->bd_ring.addr_idx = txch_addr->idx;
|
||||
+ tx_ring->bd_ring.addr_bdram = txch_addr->bdram;
|
||||
+ tx_ring->bd_ring.addr_desa_l = txch_addr->desa_l;
|
||||
+ tx_ring->bd_ring.addr_desa_h = txch_addr->desa_h;
|
||||
tx_ring->bd_ring.wp = 0;
|
||||
tx_ring->bd_ring.rp = 0;
|
||||
tx_ring->txch = txch;
|
||||
@@ -2278,20 +2312,16 @@ static int rtw89_pci_alloc_rx_ring(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_pci_rx_ring *rx_ring,
|
||||
u32 desc_size, u32 len, u32 rxch)
|
||||
{
|
||||
+ const struct rtw89_pci_ch_dma_addr *rxch_addr;
|
||||
struct sk_buff *skb;
|
||||
u8 *head;
|
||||
dma_addr_t dma;
|
||||
- u32 addr_num;
|
||||
- u32 addr_idx;
|
||||
- u32 addr_desa_l;
|
||||
- u32 addr_desa_h;
|
||||
int ring_sz = desc_size * len;
|
||||
int buf_sz = RTW89_PCI_RX_BUF_SIZE;
|
||||
int i, allocated;
|
||||
int ret;
|
||||
|
||||
- ret = rtw89_pci_get_rxch_addrs(rxch, &addr_num, &addr_idx,
|
||||
- &addr_desa_l, &addr_desa_h);
|
||||
+ ret = rtw89_pci_get_rxch_addrs(rtwdev, rxch, &rxch_addr);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to get address of rxch %d", rxch);
|
||||
return ret;
|
||||
@@ -2307,10 +2337,10 @@ static int rtw89_pci_alloc_rx_ring(struct rtw89_dev *rtwdev,
|
||||
rx_ring->bd_ring.dma = dma;
|
||||
rx_ring->bd_ring.len = len;
|
||||
rx_ring->bd_ring.desc_size = desc_size;
|
||||
- rx_ring->bd_ring.addr_num = addr_num;
|
||||
- rx_ring->bd_ring.addr_idx = addr_idx;
|
||||
- rx_ring->bd_ring.addr_desa_l = addr_desa_l;
|
||||
- rx_ring->bd_ring.addr_desa_h = addr_desa_h;
|
||||
+ rx_ring->bd_ring.addr_num = rxch_addr->num;
|
||||
+ rx_ring->bd_ring.addr_idx = rxch_addr->idx;
|
||||
+ rx_ring->bd_ring.addr_desa_l = rxch_addr->desa_l;
|
||||
+ rx_ring->bd_ring.addr_desa_h = rxch_addr->desa_h;
|
||||
rx_ring->bd_ring.wp = 0;
|
||||
rx_ring->bd_ring.rp = 0;
|
||||
rx_ring->buf_sz = buf_sz;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
index 2b8bbfa77d1b..b48306da566c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
@@ -130,6 +130,10 @@
|
||||
#define R_AX_CH10_TXBD_IDX 0x137C /* Management Queue band 1 */
|
||||
#define R_AX_CH11_TXBD_IDX 0x1380 /* HI Queue band 1 */
|
||||
#define R_AX_CH12_TXBD_IDX 0x1080 /* FWCMD Queue */
|
||||
+#define R_AX_CH10_TXBD_IDX_V1 0x11D0
|
||||
+#define R_AX_CH11_TXBD_IDX_V1 0x11D4
|
||||
+#define R_AX_RXQ_RXBD_IDX_V1 0x1218
|
||||
+#define R_AX_RPQ_RXBD_IDX_V1 0x121C
|
||||
#define TXBD_HW_IDX_MASK GENMASK(27, 16)
|
||||
#define TXBD_HOST_IDX_MASK GENMASK(11, 0)
|
||||
|
||||
@@ -163,6 +167,36 @@
|
||||
#define R_AX_RXQ_RXBD_DESA_H 0x1104
|
||||
#define R_AX_RPQ_RXBD_DESA_L 0x1108
|
||||
#define R_AX_RPQ_RXBD_DESA_H 0x110C
|
||||
+#define R_AX_RXQ_RXBD_DESA_L_V1 0x1220
|
||||
+#define R_AX_RXQ_RXBD_DESA_H_V1 0x1224
|
||||
+#define R_AX_RPQ_RXBD_DESA_L_V1 0x1228
|
||||
+#define R_AX_RPQ_RXBD_DESA_H_V1 0x122C
|
||||
+#define R_AX_ACH0_TXBD_DESA_L_V1 0x1230
|
||||
+#define R_AX_ACH0_TXBD_DESA_H_V1 0x1234
|
||||
+#define R_AX_ACH1_TXBD_DESA_L_V1 0x1238
|
||||
+#define R_AX_ACH1_TXBD_DESA_H_V1 0x123C
|
||||
+#define R_AX_ACH2_TXBD_DESA_L_V1 0x1240
|
||||
+#define R_AX_ACH2_TXBD_DESA_H_V1 0x1244
|
||||
+#define R_AX_ACH3_TXBD_DESA_L_V1 0x1248
|
||||
+#define R_AX_ACH3_TXBD_DESA_H_V1 0x124C
|
||||
+#define R_AX_ACH4_TXBD_DESA_L_V1 0x1250
|
||||
+#define R_AX_ACH4_TXBD_DESA_H_V1 0x1254
|
||||
+#define R_AX_ACH5_TXBD_DESA_L_V1 0x1258
|
||||
+#define R_AX_ACH5_TXBD_DESA_H_V1 0x125C
|
||||
+#define R_AX_ACH6_TXBD_DESA_L_V1 0x1260
|
||||
+#define R_AX_ACH6_TXBD_DESA_H_V1 0x1264
|
||||
+#define R_AX_ACH7_TXBD_DESA_L_V1 0x1268
|
||||
+#define R_AX_ACH7_TXBD_DESA_H_V1 0x126C
|
||||
+#define R_AX_CH8_TXBD_DESA_L_V1 0x1270
|
||||
+#define R_AX_CH8_TXBD_DESA_H_V1 0x1274
|
||||
+#define R_AX_CH9_TXBD_DESA_L_V1 0x1278
|
||||
+#define R_AX_CH9_TXBD_DESA_H_V1 0x127C
|
||||
+#define R_AX_CH12_TXBD_DESA_L_V1 0x1280
|
||||
+#define R_AX_CH12_TXBD_DESA_H_V1 0x1284
|
||||
+#define R_AX_CH10_TXBD_DESA_L_V1 0x1458
|
||||
+#define R_AX_CH10_TXBD_DESA_H_V1 0x145C
|
||||
+#define R_AX_CH11_TXBD_DESA_L_V1 0x1460
|
||||
+#define R_AX_CH11_TXBD_DESA_H_V1 0x1464
|
||||
#define B_AX_DESC_NUM_MSK GENMASK(11, 0)
|
||||
|
||||
#define R_AX_RXQ_RXBD_NUM 0x1020
|
||||
@@ -180,6 +214,10 @@
|
||||
#define R_AX_CH10_TXBD_NUM 0x1338
|
||||
#define R_AX_CH11_TXBD_NUM 0x133A
|
||||
#define R_AX_CH12_TXBD_NUM 0x1038
|
||||
+#define R_AX_RXQ_RXBD_NUM_V1 0x1210
|
||||
+#define R_AX_RPQ_RXBD_NUM_V1 0x1212
|
||||
+#define R_AX_CH10_TXBD_NUM_V1 0x1438
|
||||
+#define R_AX_CH11_TXBD_NUM_V1 0x143A
|
||||
|
||||
#define R_AX_ACH0_BDRAM_CTRL 0x1200
|
||||
#define R_AX_ACH1_BDRAM_CTRL 0x1204
|
||||
@@ -194,6 +232,19 @@
|
||||
#define R_AX_CH10_BDRAM_CTRL 0x1320
|
||||
#define R_AX_CH11_BDRAM_CTRL 0x1324
|
||||
#define R_AX_CH12_BDRAM_CTRL 0x1228
|
||||
+#define R_AX_ACH0_BDRAM_CTRL_V1 0x1300
|
||||
+#define R_AX_ACH1_BDRAM_CTRL_V1 0x1304
|
||||
+#define R_AX_ACH2_BDRAM_CTRL_V1 0x1308
|
||||
+#define R_AX_ACH3_BDRAM_CTRL_V1 0x130C
|
||||
+#define R_AX_ACH4_BDRAM_CTRL_V1 0x1310
|
||||
+#define R_AX_ACH5_BDRAM_CTRL_V1 0x1314
|
||||
+#define R_AX_ACH6_BDRAM_CTRL_V1 0x1318
|
||||
+#define R_AX_ACH7_BDRAM_CTRL_V1 0x131C
|
||||
+#define R_AX_CH8_BDRAM_CTRL_V1 0x1320
|
||||
+#define R_AX_CH9_BDRAM_CTRL_V1 0x1324
|
||||
+#define R_AX_CH12_BDRAM_CTRL_V1 0x1328
|
||||
+#define R_AX_CH10_BDRAM_CTRL_V1 0x1420
|
||||
+#define R_AX_CH11_BDRAM_CTRL_V1 0x1424
|
||||
#define BDRAM_SIDX_MASK GENMASK(7, 0)
|
||||
#define BDRAM_MAX_MASK GENMASK(15, 8)
|
||||
#define BDRAM_MIN_MASK GENMASK(23, 16)
|
||||
@@ -382,7 +433,21 @@ enum rtw89_pcie_clkdly_hw {
|
||||
PCIE_CLKDLY_HW_200US = 0x5,
|
||||
};
|
||||
|
||||
+struct rtw89_pci_ch_dma_addr {
|
||||
+ u32 num;
|
||||
+ u32 idx;
|
||||
+ u32 bdram;
|
||||
+ u32 desa_l;
|
||||
+ u32 desa_h;
|
||||
+};
|
||||
+
|
||||
+struct rtw89_pci_ch_dma_addr_set {
|
||||
+ struct rtw89_pci_ch_dma_addr tx[RTW89_TXCH_NUM];
|
||||
+ struct rtw89_pci_ch_dma_addr rx[RTW89_RXCH_NUM];
|
||||
+};
|
||||
+
|
||||
struct rtw89_pci_info {
|
||||
+ const struct rtw89_pci_ch_dma_addr_set *dma_addr_set;
|
||||
};
|
||||
|
||||
struct rtw89_pci_bd_ram {
|
||||
@@ -629,6 +694,8 @@ static inline bool rtw89_pci_ltr_is_err_reg_val(u32 val)
|
||||
}
|
||||
|
||||
extern const struct dev_pm_ops rtw89_pm_ops;
|
||||
+extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set;
|
||||
+extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_v1;
|
||||
|
||||
struct pci_device_id;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
index 527c0bba0aa6..48459aba441d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "rtw8852a.h"
|
||||
|
||||
static const struct rtw89_pci_info rtw8852a_pci_info = {
|
||||
+ .dma_addr_set = &rtw89_pci_ch_dma_addr_set,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852ae_info = {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
index f3ce71c822bc..e71370585b4d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "rtw8852c.h"
|
||||
|
||||
static const struct rtw89_pci_info rtw8852c_pci_info = {
|
||||
+ .dma_addr_set = &rtw89_pci_ch_dma_addr_set_v1,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852ce_info = {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
From d3c9caf740c343e81235c9a927735aeb187d919e Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:46 +0800
|
||||
Subject: [PATCH 482/544] rtw89: pci: add struct rtw89_pci_info
|
||||
|
||||
Use this struct to implement chip::ops related to PCI interface.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 7 +++++++
|
||||
drivers/net/wireless/realtek/rtw89/pci.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw89/pci.h | 3 +++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852ae.c | 6 ++++++
|
||||
drivers/net/wireless/realtek/rtw89/rtw8852ce.c | 6 ++++++
|
||||
5 files changed, 23 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index d203e4c5727d..8b36972744f8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <net/mac80211.h>
|
||||
|
||||
struct rtw89_dev;
|
||||
+struct rtw89_pci_info;
|
||||
|
||||
extern const struct ieee80211_ops rtw89_ops;
|
||||
|
||||
@@ -2306,8 +2307,13 @@ struct rtw89_chip_info {
|
||||
u8 ps_mode_supported;
|
||||
};
|
||||
|
||||
+union rtw89_bus_info {
|
||||
+ const struct rtw89_pci_info *pci;
|
||||
+};
|
||||
+
|
||||
struct rtw89_driver_info {
|
||||
const struct rtw89_chip_info *chip;
|
||||
+ union rtw89_bus_info bus;
|
||||
};
|
||||
|
||||
enum rtw89_hcifc_mode {
|
||||
@@ -2858,6 +2864,7 @@ struct rtw89_dev {
|
||||
bool dbcc_en;
|
||||
struct rtw89_hw_scan_info scan_info;
|
||||
const struct rtw89_chip_info *chip;
|
||||
+ const struct rtw89_pci_info *pci_info;
|
||||
struct rtw89_hal hal;
|
||||
struct rtw89_mac_info mac;
|
||||
struct rtw89_fw_info fw;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
index 6481085b958e..9f2a23e79e5d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
@@ -2937,6 +2937,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
info = (const struct rtw89_driver_info *)id->driver_data;
|
||||
rtwdev->chip = info->chip;
|
||||
+ rtwdev->pci_info = info->bus.pci;
|
||||
|
||||
ret = rtw89_core_init(rtwdev);
|
||||
if (ret) {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
index 7f1ee1544688..2b8bbfa77d1b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
@@ -382,6 +382,9 @@ enum rtw89_pcie_clkdly_hw {
|
||||
PCIE_CLKDLY_HW_200US = 0x5,
|
||||
};
|
||||
|
||||
+struct rtw89_pci_info {
|
||||
+};
|
||||
+
|
||||
struct rtw89_pci_bd_ram {
|
||||
u8 start_idx;
|
||||
u8 max_num;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
index de93280e0f69..527c0bba0aa6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
|
||||
@@ -8,8 +8,14 @@
|
||||
#include "pci.h"
|
||||
#include "rtw8852a.h"
|
||||
|
||||
+static const struct rtw89_pci_info rtw8852a_pci_info = {
|
||||
+};
|
||||
+
|
||||
static const struct rtw89_driver_info rtw89_8852ae_info = {
|
||||
.chip = &rtw8852a_chip_info,
|
||||
+ .bus = {
|
||||
+ .pci = &rtw8852a_pci_info,
|
||||
+ },
|
||||
};
|
||||
|
||||
static const struct pci_device_id rtw89_8852ae_id_table[] = {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
index ee700bba1eb1..f3ce71c822bc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
|
||||
@@ -9,8 +9,14 @@
|
||||
#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
|
||||
+static const struct rtw89_pci_info rtw8852c_pci_info = {
|
||||
+};
|
||||
+
|
||||
static const struct rtw89_driver_info rtw89_8852ce_info = {
|
||||
.chip = &rtw8852c_chip_info,
|
||||
+ .bus = {
|
||||
+ .pci = &rtw8852c_pci_info,
|
||||
+ },
|
||||
};
|
||||
|
||||
static const struct pci_device_id rtw89_8852ce_id_table[] = {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
From edc8094409f67b8112ead24778f1458eff6e6aa4 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:48 +0800
|
||||
Subject: [PATCH 484/544] rtw89: pci: use a struct to describe all registers
|
||||
address related to DMA channel
|
||||
|
||||
We have had a struct rtw89_pci_ch_dma_addr to describe register address,
|
||||
so use it as regular. Since the addresses should be changed dynamically
|
||||
according to operating mode, I don't change it to be constant.
|
||||
|
||||
These changes don't affect the logic, so I put them in this separated
|
||||
patch.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-5-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/pci.c | 35 ++++++++++--------------
|
||||
drivers/net/wireless/realtek/rtw89/pci.h | 6 +---
|
||||
2 files changed, 15 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
index 38ad47126848..e79bfc335b44 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.c
|
||||
@@ -62,7 +62,7 @@ static u32 rtw89_pci_txbd_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_pci_tx_ring *tx_ring)
|
||||
{
|
||||
struct rtw89_pci_dma_ring *bd_ring = &tx_ring->bd_ring;
|
||||
- u32 addr_idx = bd_ring->addr_idx;
|
||||
+ u32 addr_idx = bd_ring->addr.idx;
|
||||
u32 cnt, idx;
|
||||
|
||||
idx = rtw89_read32(rtwdev, addr_idx);
|
||||
@@ -121,7 +121,7 @@ static u32 rtw89_pci_rxbd_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_pci_rx_ring *rx_ring)
|
||||
{
|
||||
struct rtw89_pci_dma_ring *bd_ring = &rx_ring->bd_ring;
|
||||
- u32 addr_idx = bd_ring->addr_idx;
|
||||
+ u32 addr_idx = bd_ring->addr.idx;
|
||||
u32 cnt, idx;
|
||||
|
||||
idx = rtw89_read32(rtwdev, addr_idx);
|
||||
@@ -304,7 +304,7 @@ static void rtw89_pci_rxbd_deliver(struct rtw89_dev *rtwdev,
|
||||
cnt -= rx_cnt;
|
||||
}
|
||||
|
||||
- rtw89_write16(rtwdev, bd_ring->addr_idx, bd_ring->wp);
|
||||
+ rtw89_write16(rtwdev, bd_ring->addr.idx, bd_ring->wp);
|
||||
}
|
||||
|
||||
static int rtw89_pci_poll_rxq_dma(struct rtw89_dev *rtwdev,
|
||||
@@ -555,7 +555,7 @@ static void rtw89_pci_release_tx(struct rtw89_dev *rtwdev,
|
||||
cnt -= release_cnt;
|
||||
}
|
||||
|
||||
- rtw89_write16(rtwdev, bd_ring->addr_idx, bd_ring->wp);
|
||||
+ rtw89_write16(rtwdev, bd_ring->addr.idx, bd_ring->wp);
|
||||
}
|
||||
|
||||
static int rtw89_pci_poll_rpq_dma(struct rtw89_dev *rtwdev,
|
||||
@@ -598,7 +598,7 @@ static void rtw89_pci_isr_rxd_unavail(struct rtw89_dev *rtwdev,
|
||||
rx_ring = &rtwpci->rx_rings[i];
|
||||
bd_ring = &rx_ring->bd_ring;
|
||||
|
||||
- reg_idx = rtw89_read32(rtwdev, bd_ring->addr_idx);
|
||||
+ reg_idx = rtw89_read32(rtwdev, bd_ring->addr.idx);
|
||||
hw_idx = FIELD_GET(TXBD_HW_IDX_MASK, reg_idx);
|
||||
host_idx = FIELD_GET(TXBD_HOST_IDX_MASK, reg_idx);
|
||||
hw_idx_next = (hw_idx + 1) % bd_ring->len;
|
||||
@@ -876,7 +876,7 @@ static void __rtw89_pci_tx_kick_off(struct rtw89_dev *rtwdev, struct rtw89_pci_t
|
||||
struct rtw89_pci_dma_ring *bd_ring = &tx_ring->bd_ring;
|
||||
u32 host_idx, addr;
|
||||
|
||||
- addr = bd_ring->addr_idx;
|
||||
+ addr = bd_ring->addr.idx;
|
||||
host_idx = bd_ring->wp;
|
||||
rtw89_write16(rtwdev, addr, host_idx);
|
||||
}
|
||||
@@ -918,7 +918,7 @@ static void __pci_flush_txch(struct rtw89_dev *rtwdev, u8 txch, bool drop)
|
||||
* just use for loop with udelay here.
|
||||
*/
|
||||
for (i = 0; i < 60; i++) {
|
||||
- cur_idx = rtw89_read32(rtwdev, bd_ring->addr_idx);
|
||||
+ cur_idx = rtw89_read32(rtwdev, bd_ring->addr.idx);
|
||||
cur_rp = FIELD_GET(TXBD_HW_IDX_MASK, cur_idx);
|
||||
if (cur_rp == bd_ring->wp)
|
||||
return;
|
||||
@@ -1179,9 +1179,9 @@ static void rtw89_pci_reset_trx_rings(struct rtw89_dev *rtwdev)
|
||||
tx_ring = &rtwpci->tx_rings[i];
|
||||
bd_ring = &tx_ring->bd_ring;
|
||||
bd_ram = &bd_ram_table[i];
|
||||
- addr_num = bd_ring->addr_num;
|
||||
- addr_bdram = bd_ring->addr_bdram;
|
||||
- addr_desa_l = bd_ring->addr_desa_l;
|
||||
+ addr_num = bd_ring->addr.num;
|
||||
+ addr_bdram = bd_ring->addr.bdram;
|
||||
+ addr_desa_l = bd_ring->addr.desa_l;
|
||||
bd_ring->wp = 0;
|
||||
bd_ring->rp = 0;
|
||||
|
||||
@@ -1197,8 +1197,8 @@ static void rtw89_pci_reset_trx_rings(struct rtw89_dev *rtwdev)
|
||||
for (i = 0; i < RTW89_RXCH_NUM; i++) {
|
||||
rx_ring = &rtwpci->rx_rings[i];
|
||||
bd_ring = &rx_ring->bd_ring;
|
||||
- addr_num = bd_ring->addr_num;
|
||||
- addr_desa_l = bd_ring->addr_desa_l;
|
||||
+ addr_num = bd_ring->addr.num;
|
||||
+ addr_desa_l = bd_ring->addr.desa_l;
|
||||
bd_ring->wp = 0;
|
||||
bd_ring->rp = 0;
|
||||
rx_ring->diliver_skb = NULL;
|
||||
@@ -2256,11 +2256,7 @@ static int rtw89_pci_alloc_tx_ring(struct rtw89_dev *rtwdev,
|
||||
tx_ring->bd_ring.dma = dma;
|
||||
tx_ring->bd_ring.len = len;
|
||||
tx_ring->bd_ring.desc_size = desc_size;
|
||||
- tx_ring->bd_ring.addr_num = txch_addr->num;
|
||||
- tx_ring->bd_ring.addr_idx = txch_addr->idx;
|
||||
- tx_ring->bd_ring.addr_bdram = txch_addr->bdram;
|
||||
- tx_ring->bd_ring.addr_desa_l = txch_addr->desa_l;
|
||||
- tx_ring->bd_ring.addr_desa_h = txch_addr->desa_h;
|
||||
+ tx_ring->bd_ring.addr = *txch_addr;
|
||||
tx_ring->bd_ring.wp = 0;
|
||||
tx_ring->bd_ring.rp = 0;
|
||||
tx_ring->txch = txch;
|
||||
@@ -2337,10 +2333,7 @@ static int rtw89_pci_alloc_rx_ring(struct rtw89_dev *rtwdev,
|
||||
rx_ring->bd_ring.dma = dma;
|
||||
rx_ring->bd_ring.len = len;
|
||||
rx_ring->bd_ring.desc_size = desc_size;
|
||||
- rx_ring->bd_ring.addr_num = rxch_addr->num;
|
||||
- rx_ring->bd_ring.addr_idx = rxch_addr->idx;
|
||||
- rx_ring->bd_ring.addr_desa_l = rxch_addr->desa_l;
|
||||
- rx_ring->bd_ring.addr_desa_h = rxch_addr->desa_h;
|
||||
+ rx_ring->bd_ring.addr = *rxch_addr;
|
||||
rx_ring->bd_ring.wp = 0;
|
||||
rx_ring->bd_ring.rp = 0;
|
||||
rx_ring->buf_sz = buf_sz;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
index b48306da566c..b84acd0d0582 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
|
||||
@@ -537,11 +537,7 @@ struct rtw89_pci_dma_ring {
|
||||
u8 desc_size;
|
||||
dma_addr_t dma;
|
||||
|
||||
- u32 addr_num;
|
||||
- u32 addr_idx;
|
||||
- u32 addr_bdram;
|
||||
- u32 addr_desa_l;
|
||||
- u32 addr_desa_h;
|
||||
+ struct rtw89_pci_ch_dma_addr addr;
|
||||
|
||||
u32 len;
|
||||
u32 wp; /* host idx */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
From aaec063328ce9cfd5d9bac199935d826ede972b5 Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Fri, 18 Feb 2022 11:40:42 +0800
|
||||
Subject: [PATCH 474/544] rtw89: phy: handle txpwr lmt/lmt_ru of 160M bandwidth
|
||||
|
||||
Add handling to fill struct rtw89_txpwr_limit and rtw89_txpwr_limit_ru
|
||||
for 160Mhz bandwidth case. And enlarge RTW89_5G_BW_NUM because the chip
|
||||
under planning can support 160Mhz bandwidth on 5G band.
|
||||
|
||||
Moreover, refine the filling of OFDM entry of struct rtw89_txpwr_limit
|
||||
by using the value corresponding to primary channel.
|
||||
|
||||
E.g. center channel 38 (40Mhz bandwidth case)
|
||||
Originally OFDM entry was filled by value corresponding to 'ch - 2' (36)
|
||||
Now, we consider that it could be 36 or 40.
|
||||
|
||||
E.g. cneter channel 42 (80Mhz bandwidth case)
|
||||
Originally OFDM entry was filled by value corresponding to 'ch - 6' (36)
|
||||
Now, we consider that it could be 36, 40, 44, or 48.
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220218034042.9218-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 2 +-
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 115 ++++++++++++++++++++--
|
||||
2 files changed, 110 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index a193b0213cbe..32600e1a23c2 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -572,7 +572,7 @@ enum rtw89_ps_mode {
|
||||
};
|
||||
|
||||
#define RTW89_2G_BW_NUM (RTW89_CHANNEL_WIDTH_40 + 1)
|
||||
-#define RTW89_5G_BW_NUM (RTW89_CHANNEL_WIDTH_80 + 1)
|
||||
+#define RTW89_5G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1)
|
||||
#define RTW89_6G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1)
|
||||
#define RTW89_PPE_BW_NUM (RTW89_CHANNEL_WIDTH_80 + 1)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index 7cc6155aa188..719a2d6be0be 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -1226,14 +1226,14 @@ static void rtw89_phy_fill_txpwr_limit_20m(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void rtw89_phy_fill_txpwr_limit_40m(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_txpwr_limit *lmt,
|
||||
- u8 ntx, u8 ch)
|
||||
+ u8 ntx, u8 ch, u8 pri_ch)
|
||||
{
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->cck_20m, RTW89_CHANNEL_WIDTH_20,
|
||||
ntx, RTW89_RS_CCK, ch - 2);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->cck_40m, RTW89_CHANNEL_WIDTH_40,
|
||||
ntx, RTW89_RS_CCK, ch);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->ofdm, RTW89_CHANNEL_WIDTH_20,
|
||||
- ntx, RTW89_RS_OFDM, ch - 2);
|
||||
+ ntx, RTW89_RS_OFDM, pri_ch);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], RTW89_CHANNEL_WIDTH_20,
|
||||
ntx, RTW89_RS_MCS, ch - 2);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], RTW89_CHANNEL_WIDTH_20,
|
||||
@@ -1244,14 +1244,14 @@ static void rtw89_phy_fill_txpwr_limit_40m(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void rtw89_phy_fill_txpwr_limit_80m(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_txpwr_limit *lmt,
|
||||
- u8 ntx, u8 ch)
|
||||
+ u8 ntx, u8 ch, u8 pri_ch)
|
||||
{
|
||||
s8 val_0p5_n[RTW89_BF_NUM];
|
||||
s8 val_0p5_p[RTW89_BF_NUM];
|
||||
u8 i;
|
||||
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->ofdm, RTW89_CHANNEL_WIDTH_20,
|
||||
- ntx, RTW89_RS_OFDM, ch - 6);
|
||||
+ ntx, RTW89_RS_OFDM, pri_ch);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], RTW89_CHANNEL_WIDTH_20,
|
||||
ntx, RTW89_RS_MCS, ch - 6);
|
||||
__fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], RTW89_CHANNEL_WIDTH_20,
|
||||
@@ -1276,10 +1276,82 @@ static void rtw89_phy_fill_txpwr_limit_80m(struct rtw89_dev *rtwdev,
|
||||
lmt->mcs_40m_0p5[i] = min_t(s8, val_0p5_n[i], val_0p5_p[i]);
|
||||
}
|
||||
|
||||
+static void rtw89_phy_fill_txpwr_limit_160m(struct rtw89_dev *rtwdev,
|
||||
+ struct rtw89_txpwr_limit *lmt,
|
||||
+ u8 ntx, u8 ch, u8 pri_ch)
|
||||
+{
|
||||
+ s8 val_0p5_n[RTW89_BF_NUM];
|
||||
+ s8 val_0p5_p[RTW89_BF_NUM];
|
||||
+ s8 val_2p5_n[RTW89_BF_NUM];
|
||||
+ s8 val_2p5_p[RTW89_BF_NUM];
|
||||
+ u8 i;
|
||||
+
|
||||
+ /* fill ofdm section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->ofdm, RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_OFDM, pri_ch);
|
||||
+
|
||||
+ /* fill mcs 20m section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch - 14);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch - 10);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[2], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch - 6);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[3], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch - 2);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[4], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch + 2);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[5], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch + 6);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[6], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch + 10);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[7], RTW89_CHANNEL_WIDTH_20,
|
||||
+ ntx, RTW89_RS_MCS, ch + 14);
|
||||
+
|
||||
+ /* fill mcs 40m section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[0], RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch - 12);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[1], RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch - 4);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[2], RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch + 4);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[3], RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch + 12);
|
||||
+
|
||||
+ /* fill mcs 80m section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_80m[0], RTW89_CHANNEL_WIDTH_80,
|
||||
+ ntx, RTW89_RS_MCS, ch - 8);
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_80m[1], RTW89_CHANNEL_WIDTH_80,
|
||||
+ ntx, RTW89_RS_MCS, ch + 8);
|
||||
+
|
||||
+ /* fill mcs 160m section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(lmt->mcs_160m, RTW89_CHANNEL_WIDTH_160,
|
||||
+ ntx, RTW89_RS_MCS, ch);
|
||||
+
|
||||
+ /* fill mcs 40m 0p5 section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(val_0p5_n, RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch - 4);
|
||||
+ __fill_txpwr_limit_nonbf_bf(val_0p5_p, RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch + 4);
|
||||
+
|
||||
+ for (i = 0; i < RTW89_BF_NUM; i++)
|
||||
+ lmt->mcs_40m_0p5[i] = min_t(s8, val_0p5_n[i], val_0p5_p[i]);
|
||||
+
|
||||
+ /* fill mcs 40m 2p5 section */
|
||||
+ __fill_txpwr_limit_nonbf_bf(val_2p5_n, RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch - 8);
|
||||
+ __fill_txpwr_limit_nonbf_bf(val_2p5_p, RTW89_CHANNEL_WIDTH_40,
|
||||
+ ntx, RTW89_RS_MCS, ch + 8);
|
||||
+
|
||||
+ for (i = 0; i < RTW89_BF_NUM; i++)
|
||||
+ lmt->mcs_40m_2p5[i] = min_t(s8, val_2p5_n[i], val_2p5_p[i]);
|
||||
+}
|
||||
+
|
||||
void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_txpwr_limit *lmt,
|
||||
u8 ntx)
|
||||
{
|
||||
+ u8 pri_ch = rtwdev->hal.current_primary_channel;
|
||||
u8 ch = rtwdev->hal.current_channel;
|
||||
u8 bw = rtwdev->hal.current_band_width;
|
||||
|
||||
@@ -1290,10 +1362,13 @@ void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_fill_txpwr_limit_20m(rtwdev, lmt, ntx, ch);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_40:
|
||||
- rtw89_phy_fill_txpwr_limit_40m(rtwdev, lmt, ntx, ch);
|
||||
+ rtw89_phy_fill_txpwr_limit_40m(rtwdev, lmt, ntx, ch, pri_ch);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_80:
|
||||
- rtw89_phy_fill_txpwr_limit_80m(rtwdev, lmt, ntx, ch);
|
||||
+ rtw89_phy_fill_txpwr_limit_80m(rtwdev, lmt, ntx, ch, pri_ch);
|
||||
+ break;
|
||||
+ case RTW89_CHANNEL_WIDTH_160:
|
||||
+ rtw89_phy_fill_txpwr_limit_160m(rtwdev, lmt, ntx, ch, pri_ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1401,6 +1476,31 @@ rtw89_phy_fill_txpwr_limit_ru_80m(struct rtw89_dev *rtwdev,
|
||||
ntx, ch + 6);
|
||||
}
|
||||
|
||||
+static void
|
||||
+rtw89_phy_fill_txpwr_limit_ru_160m(struct rtw89_dev *rtwdev,
|
||||
+ struct rtw89_txpwr_limit_ru *lmt_ru,
|
||||
+ u8 ntx, u8 ch)
|
||||
+{
|
||||
+ static const int ofst[] = { -14, -10, -6, -2, 2, 6, 10, 14 };
|
||||
+ int i;
|
||||
+
|
||||
+ static_assert(ARRAY_SIZE(ofst) == RTW89_RU_SEC_NUM);
|
||||
+ for (i = 0; i < RTW89_RU_SEC_NUM; i++) {
|
||||
+ lmt_ru->ru26[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev,
|
||||
+ RTW89_RU26,
|
||||
+ ntx,
|
||||
+ ch + ofst[i]);
|
||||
+ lmt_ru->ru52[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev,
|
||||
+ RTW89_RU52,
|
||||
+ ntx,
|
||||
+ ch + ofst[i]);
|
||||
+ lmt_ru->ru106[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev,
|
||||
+ RTW89_RU106,
|
||||
+ ntx,
|
||||
+ ch + ofst[i]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_txpwr_limit_ru *lmt_ru,
|
||||
u8 ntx)
|
||||
@@ -1420,6 +1520,9 @@ void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
case RTW89_CHANNEL_WIDTH_80:
|
||||
rtw89_phy_fill_txpwr_limit_ru_80m(rtwdev, lmt_ru, ntx, ch);
|
||||
break;
|
||||
+ case RTW89_CHANNEL_WIDTH_160:
|
||||
+ rtw89_phy_fill_txpwr_limit_ru_160m(rtwdev, lmt_ru, ntx, ch);
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit_ru);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
From 978ac5d688ae54c84296622d8e5a791949c4a1fe Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Fri, 18 Feb 2022 11:40:16 +0800
|
||||
Subject: [PATCH 473/544] rtw89: phy: handle txpwr lmt/lmt_ru of 6G band
|
||||
|
||||
Add declarations of 6G stuff and extend rtw89_channel_to_idx() to
|
||||
map 6G's channels to 6G channel indexes. While 6G, correspondingly
|
||||
read 6G's entry for tx power limit and limit_ru.
|
||||
|
||||
After this, we should pay attention to chip_info::support_bands.
|
||||
If a chip declares 6G support, it must configure txpwr_lmt_6g and
|
||||
txpwr_lmt_ru_6g in case accessing NULL pointer while setting tx power
|
||||
limit/limit_ru on 6G band.
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220218034017.9160-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.h | 25 ++++++++++++
|
||||
drivers/net/wireless/realtek/rtw89/phy.c | 46 +++++++++++++++++++++--
|
||||
2 files changed, 68 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
index 4aca2062b65d..a193b0213cbe 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
||||
@@ -371,6 +371,25 @@ enum rtw89_hw_rate {
|
||||
*/
|
||||
#define RTW89_5G_CH_NUM 53
|
||||
|
||||
+/* 6G channels,
|
||||
+ * 1, 3, 5, 7, 9, 11, 13, 15,
|
||||
+ * 17, 19, 21, 23, 25, 27, 29, 33,
|
||||
+ * 35, 37, 39, 41, 43, 45, 47, 49,
|
||||
+ * 51, 53, 55, 57, 59, 61, 65, 67,
|
||||
+ * 69, 71, 73, 75, 77, 79, 81, 83,
|
||||
+ * 85, 87, 89, 91, 93, 97, 99, 101,
|
||||
+ * 103, 105, 107, 109, 111, 113, 115, 117,
|
||||
+ * 119, 121, 123, 125, 129, 131, 133, 135,
|
||||
+ * 137, 139, 141, 143, 145, 147, 149, 151,
|
||||
+ * 153, 155, 157, 161, 163, 165, 167, 169,
|
||||
+ * 171, 173, 175, 177, 179, 181, 183, 185,
|
||||
+ * 187, 189, 193, 195, 197, 199, 201, 203,
|
||||
+ * 205, 207, 209, 211, 213, 215, 217, 219,
|
||||
+ * 221, 225, 227, 229, 231, 233, 235, 237,
|
||||
+ * 239, 241, 243, 245, 247, 249, 251, 253,
|
||||
+ */
|
||||
+#define RTW89_6G_CH_NUM 120
|
||||
+
|
||||
enum rtw89_rate_section {
|
||||
RTW89_RS_CCK,
|
||||
RTW89_RS_OFDM,
|
||||
@@ -554,6 +573,7 @@ enum rtw89_ps_mode {
|
||||
|
||||
#define RTW89_2G_BW_NUM (RTW89_CHANNEL_WIDTH_40 + 1)
|
||||
#define RTW89_5G_BW_NUM (RTW89_CHANNEL_WIDTH_80 + 1)
|
||||
+#define RTW89_6G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1)
|
||||
#define RTW89_PPE_BW_NUM (RTW89_CHANNEL_WIDTH_80 + 1)
|
||||
|
||||
enum rtw89_ru_bandwidth {
|
||||
@@ -2246,10 +2266,15 @@ struct rtw89_chip_info {
|
||||
const s8 (*txpwr_lmt_5g)[RTW89_5G_BW_NUM][RTW89_NTX_NUM]
|
||||
[RTW89_RS_LMT_NUM][RTW89_BF_NUM]
|
||||
[RTW89_REGD_NUM][RTW89_5G_CH_NUM];
|
||||
+ const s8 (*txpwr_lmt_6g)[RTW89_6G_BW_NUM][RTW89_NTX_NUM]
|
||||
+ [RTW89_RS_LMT_NUM][RTW89_BF_NUM]
|
||||
+ [RTW89_REGD_NUM][RTW89_6G_CH_NUM];
|
||||
const s8 (*txpwr_lmt_ru_2g)[RTW89_RU_NUM][RTW89_NTX_NUM]
|
||||
[RTW89_REGD_NUM][RTW89_2G_CH_NUM];
|
||||
const s8 (*txpwr_lmt_ru_5g)[RTW89_RU_NUM][RTW89_NTX_NUM]
|
||||
[RTW89_REGD_NUM][RTW89_5G_CH_NUM];
|
||||
+ const s8 (*txpwr_lmt_ru_6g)[RTW89_RU_NUM][RTW89_NTX_NUM]
|
||||
+ [RTW89_REGD_NUM][RTW89_6G_CH_NUM];
|
||||
|
||||
u8 txpwr_factor_rf;
|
||||
u8 txpwr_factor_mac;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
index d1d3ebb5e226..7cc6155aa188 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
|
||||
@@ -1115,8 +1115,36 @@ s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_read_txpwr_byrate);
|
||||
|
||||
-static u8 rtw89_channel_to_idx(struct rtw89_dev *rtwdev, u8 channel)
|
||||
+static u8 rtw89_channel_6g_to_idx(struct rtw89_dev *rtwdev, u8 channel_6g)
|
||||
+{
|
||||
+ switch (channel_6g) {
|
||||
+ case 1 ... 29:
|
||||
+ return (channel_6g - 1) / 2;
|
||||
+ case 33 ... 61:
|
||||
+ return (channel_6g - 3) / 2;
|
||||
+ case 65 ... 93:
|
||||
+ return (channel_6g - 5) / 2;
|
||||
+ case 97 ... 125:
|
||||
+ return (channel_6g - 7) / 2;
|
||||
+ case 129 ... 157:
|
||||
+ return (channel_6g - 9) / 2;
|
||||
+ case 161 ... 189:
|
||||
+ return (channel_6g - 11) / 2;
|
||||
+ case 193 ... 221:
|
||||
+ return (channel_6g - 13) / 2;
|
||||
+ case 225 ... 253:
|
||||
+ return (channel_6g - 15) / 2;
|
||||
+ default:
|
||||
+ rtw89_warn(rtwdev, "unknown 6g channel: %d\n", channel_6g);
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static u8 rtw89_channel_to_idx(struct rtw89_dev *rtwdev, u8 band, u8 channel)
|
||||
{
|
||||
+ if (band == RTW89_BAND_6G)
|
||||
+ return rtw89_channel_6g_to_idx(rtwdev, channel);
|
||||
+
|
||||
switch (channel) {
|
||||
case 1 ... 14:
|
||||
return channel - 1;
|
||||
@@ -1136,8 +1164,8 @@ s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev,
|
||||
u8 bw, u8 ntx, u8 rs, u8 bf, u8 ch)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
- u8 ch_idx = rtw89_channel_to_idx(rtwdev, ch);
|
||||
u8 band = rtwdev->hal.current_band_type;
|
||||
+ u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch);
|
||||
u8 regd = rtw89_regd_get(rtwdev, band);
|
||||
s8 lmt = 0, sar;
|
||||
|
||||
@@ -1154,6 +1182,12 @@ s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev,
|
||||
lmt = (*chip->txpwr_lmt_5g)[bw][ntx][rs][bf]
|
||||
[RTW89_WW][ch_idx];
|
||||
break;
|
||||
+ case RTW89_BAND_6G:
|
||||
+ lmt = (*chip->txpwr_lmt_6g)[bw][ntx][rs][bf][regd][ch_idx];
|
||||
+ if (!lmt)
|
||||
+ lmt = (*chip->txpwr_lmt_6g)[bw][ntx][rs][bf]
|
||||
+ [RTW89_WW][ch_idx];
|
||||
+ break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unknown band type: %d\n", band);
|
||||
return 0;
|
||||
@@ -1269,8 +1303,8 @@ static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
u8 ru, u8 ntx, u8 ch)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
- u8 ch_idx = rtw89_channel_to_idx(rtwdev, ch);
|
||||
u8 band = rtwdev->hal.current_band_type;
|
||||
+ u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch);
|
||||
u8 regd = rtw89_regd_get(rtwdev, band);
|
||||
s8 lmt_ru = 0, sar;
|
||||
|
||||
@@ -1287,6 +1321,12 @@ static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
lmt_ru = (*chip->txpwr_lmt_ru_5g)[ru][ntx]
|
||||
[RTW89_WW][ch_idx];
|
||||
break;
|
||||
+ case RTW89_BAND_6G:
|
||||
+ lmt_ru = (*chip->txpwr_lmt_ru_6g)[ru][ntx][regd][ch_idx];
|
||||
+ if (!lmt_ru)
|
||||
+ lmt_ru = (*chip->txpwr_lmt_ru_6g)[ru][ntx]
|
||||
+ [RTW89_WW][ch_idx];
|
||||
+ break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unknown band type: %d\n", band);
|
||||
return 0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 3b346940e75d5edec8cca327c96d2ef324aa2fc2 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Mon, 7 Mar 2022 14:04:49 +0800
|
||||
Subject: [PATCH 485/544] rtw89: read chip version depends on chip ID
|
||||
|
||||
Only 8852A may get wrong chip version if power isn't on, so it needs
|
||||
additional actions to correct the version. Later chips don't need those.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220307060457.56789-6-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw89/core.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
index a93555b0a2bf..bcefc968576e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
||||
@@ -2732,10 +2732,11 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
u8 cv;
|
||||
|
||||
cv = rtw89_read32_mask(rtwdev, R_AX_SYS_CFG1, B_AX_CHIP_VER_MASK);
|
||||
- if (cv <= CHIP_CBV) {
|
||||
+ if (chip->chip_id == RTL8852A && cv <= CHIP_CBV) {
|
||||
if (rtw89_read32(rtwdev, R_AX_GPIO0_7_FUNC_SEL) == RTW89_R32_DEAD)
|
||||
cv = CHIP_CAV;
|
||||
else
|
||||
--
|
||||
2.34.1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user