Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
482b69f47e
@ -77,7 +77,8 @@ endef
|
||||
DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc)
|
||||
|
||||
define Build/Compile/Trusted-Firmware-A
|
||||
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
||||
+unset CC; \
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS) \
|
||||
OPENSSL_DIR=$(STAGING_DIR_HOST) \
|
||||
$(if $(DTC),DTC="$(DTC)") \
|
||||
|
@ -66,7 +66,7 @@ get_mac_ascii() {
|
||||
local key="$2"
|
||||
local mac_dirty
|
||||
|
||||
mac_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
|
||||
mac_dirty=$(strings "$part" | tr -d ' \t' | sed -n 's/^'"$key"'=//p' | head -n 1)
|
||||
|
||||
# "canonicalize" mac
|
||||
[ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
|
||||
|
@ -18,12 +18,12 @@ cambiumnetworks,xe3-4)
|
||||
linksys,mr7350)
|
||||
idx="$(find_mtd_index u_env)"
|
||||
[ -n "$idx" ] && \
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000" "2"
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000"
|
||||
;;
|
||||
netgear,wax214)
|
||||
idx="$(find_mtd_index 0:appsblenv)"
|
||||
[ -n "$idx" ] && \
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000" "2"
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000"
|
||||
;;
|
||||
yuncore,fap650)
|
||||
idx="$(find_mtd_index 0:appsblenv)"
|
||||
|
@ -520,7 +520,7 @@
|
||||
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title [33m$ver[0m"
|
||||
--- /dev/null
|
||||
+++ b/openwrt-one-spi-nand_env
|
||||
@@ -0,0 +1,61 @@
|
||||
@@ -0,0 +1,62 @@
|
||||
+ethaddr_factory=mtd read factory 0x46000000 0x0 0x20000 && env readmem -b ethaddr 0x4600002a 0x6 ; setenv ethaddr_factory
|
||||
+ipaddr=192.168.11.11
|
||||
+serverip=192.168.11.23
|
||||
@ -562,6 +562,7 @@
|
||||
+check_buttons=if button front ; then run boot_recovery ; run boot_tftp ; run led_loop_error ; else if button back ; then ; run usb_recover ; run led_loop_error ; fi ; fi
|
||||
+led_boot=led green on ; led white on ; led red on
|
||||
+led_done=led green on ; led white off ; led red off
|
||||
+led_loop_done=led white off ; led green on ; echo done ; while true ; do sleep 1 ; done
|
||||
+led_loop_error=led white off ; led green off ; while true ; do led red on ; sleep 1 ; led red off ; sleep 1 ; done
|
||||
+led_start=led white on ; led green off ; led red off
|
||||
+preboot=run led_boot
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- /dev/null
|
||||
+++ b/configs/mt7981_routerich_ax3000_defconfig
|
||||
@@ -0,0 +1,107 @@
|
||||
@@ -0,0 +1,108 @@
|
||||
+CONFIG_ARM=y
|
||||
+CONFIG_SYS_HAS_NONCACHED_MEMORY=y
|
||||
+CONFIG_POSITION_INDEPENDENT=y
|
||||
|
@ -233,6 +233,23 @@ endef
|
||||
$(eval $(call KernelPackage,leds-pwm))
|
||||
|
||||
|
||||
define KernelPackage/leds-st1202
|
||||
SUBMENU:=LED modules
|
||||
TITLE:=LED support for ST LED1202 I2C chips
|
||||
DEPENDS:=+kmod-i2c-core +kmod-ledtrig-pattern
|
||||
KCONFIG:=CONFIG_LEDS_ST1202
|
||||
FILES:= $(LINUX_DIR)/drivers/leds/leds-st1202.ko
|
||||
AUTOLOAD:=$(call AutoProbe,leds-st1202)
|
||||
endef
|
||||
|
||||
define KernelPackage/leds-st1202/description
|
||||
This option enables support for LEDs connected to LED1202
|
||||
LED driver chips accessed via the I2C bus.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,leds-st1202))
|
||||
|
||||
|
||||
define KernelPackage/leds-tlc591xx
|
||||
SUBMENU:=$(LEDS_MENU)
|
||||
TITLE:=LED driver for TLC59108 and TLC59116 controllers
|
||||
|
@ -970,7 +970,7 @@ $(eval $(call KernelPackage,8139cp))
|
||||
define KernelPackage/r8169
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=RealTek RTL-8169 PCI Gigabit Ethernet Adapter kernel support
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +kmod-mdio-devres
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +kmod-mdio-devres +kmod-hwmon-core
|
||||
KCONFIG:= \
|
||||
CONFIG_R8169 \
|
||||
CONFIG_R8169_LEDS=y
|
||||
|
@ -0,0 +1,257 @@
|
||||
From 654653e718f6c55c6f29fd94cc8152a92c8166ac Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Tue, 24 Dec 2024 08:36:32 +0800
|
||||
Subject: [PATCH 1/2] rt2x00: respect the rt2800 hardware TX queue index
|
||||
|
||||
The Ralink TX queue register index is different from the Linux
|
||||
IEEE80211 queue id definition. Their conversion table is as follows:
|
||||
|
||||
Queue IEEE80211 Ralink
|
||||
AC_VO 0 3
|
||||
AC_VI 1 2
|
||||
AC_BE 2 0
|
||||
AC_BK 3 1
|
||||
|
||||
The TX queues are still functioning properly under the current
|
||||
configuration. I don't have evidence, but I believe there should
|
||||
be some differences in the internal hardware implementation of
|
||||
different TX queues, e.g. interrupt priority. so it's better to
|
||||
respect the queue index defined by the Ralink when we construct
|
||||
the TX rings and descriptors.
|
||||
|
||||
And the more important thing is that we are using the wrong queue
|
||||
index to calculate the register offset and mask in .conf_tx(),
|
||||
which resulted in writing incorrect AIFSN, CWMAX, CWMIN and TXOP
|
||||
values for all TX queues. This patch introduces a index conversion
|
||||
table to fix these parameters.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800.h | 24 ++++++------
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 20 +++++++---
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 38 ++++++++++---------
|
||||
.../net/wireless/ralink/rt2x00/rt2x00queue.h | 20 ++++++++++
|
||||
4 files changed, 67 insertions(+), 35 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
@@ -379,10 +379,10 @@
|
||||
|
||||
/*
|
||||
* WMM_AIFSN_CFG: Aifsn for each EDCA AC
|
||||
- * AIFSN0: AC_VO
|
||||
- * AIFSN1: AC_VI
|
||||
- * AIFSN2: AC_BE
|
||||
- * AIFSN3: AC_BK
|
||||
+ * AIFSN0: AC_BE
|
||||
+ * AIFSN1: AC_BK
|
||||
+ * AIFSN2: AC_VI
|
||||
+ * AIFSN3: AC_VO
|
||||
*/
|
||||
#define WMM_AIFSN_CFG 0x0214
|
||||
#define WMM_AIFSN_CFG_AIFSN0 FIELD32(0x0000000f)
|
||||
@@ -392,10 +392,10 @@
|
||||
|
||||
/*
|
||||
* WMM_CWMIN_CSR: CWmin for each EDCA AC
|
||||
- * CWMIN0: AC_VO
|
||||
- * CWMIN1: AC_VI
|
||||
- * CWMIN2: AC_BE
|
||||
- * CWMIN3: AC_BK
|
||||
+ * CWMIN0: AC_BE
|
||||
+ * CWMIN1: AC_BK
|
||||
+ * CWMIN2: AC_VI
|
||||
+ * CWMIN3: AC_VO
|
||||
*/
|
||||
#define WMM_CWMIN_CFG 0x0218
|
||||
#define WMM_CWMIN_CFG_CWMIN0 FIELD32(0x0000000f)
|
||||
@@ -405,10 +405,10 @@
|
||||
|
||||
/*
|
||||
* WMM_CWMAX_CSR: CWmax for each EDCA AC
|
||||
- * CWMAX0: AC_VO
|
||||
- * CWMAX1: AC_VI
|
||||
- * CWMAX2: AC_BE
|
||||
- * CWMAX3: AC_BK
|
||||
+ * CWMAX0: AC_BE
|
||||
+ * CWMAX1: AC_BK
|
||||
+ * CWMAX2: AC_VI
|
||||
+ * CWMAX3: AC_VO
|
||||
*/
|
||||
#define WMM_CWMAX_CFG 0x021c
|
||||
#define WMM_CWMAX_CFG_CWMAX0 FIELD32(0x0000000f)
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -835,7 +835,8 @@ void rt2800_write_tx_data(struct queue_e
|
||||
txdesc->key_idx : txdesc->u.ht.wcid);
|
||||
rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT,
|
||||
txdesc->length);
|
||||
- rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE, entry->queue->qid);
|
||||
+ rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE,
|
||||
+ rt2x00_ac_to_hwq(entry->queue->qid));
|
||||
rt2x00_set_field32(&word, TXWI_W1_PACKETID_ENTRY, (entry->entry_idx % 3) + 1);
|
||||
rt2x00_desc_write(txwi, 1, word);
|
||||
|
||||
@@ -1125,6 +1126,12 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
||||
u32 reg;
|
||||
u8 qid;
|
||||
bool match;
|
||||
+ static const u8 rt2ac[] = {
|
||||
+ IEEE80211_AC_BE,
|
||||
+ IEEE80211_AC_BK,
|
||||
+ IEEE80211_AC_VI,
|
||||
+ IEEE80211_AC_VO,
|
||||
+ };
|
||||
|
||||
while (quota-- > 0 && kfifo_get(&rt2x00dev->txstatus_fifo, ®)) {
|
||||
/*
|
||||
@@ -1132,6 +1139,8 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
||||
* guaranteed to be one of the TX QIDs .
|
||||
*/
|
||||
qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE);
|
||||
+ /* Convert Ralink hardware queue index to IEEE80211 queue id. */
|
||||
+ qid = rt2ac[qid];
|
||||
queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
|
||||
|
||||
if (unlikely(rt2x00queue_empty(queue))) {
|
||||
@@ -12188,8 +12197,9 @@ int rt2800_conf_tx(struct ieee80211_hw *
|
||||
queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
|
||||
|
||||
/* Update WMM TXOP register */
|
||||
- offset = WMM_TXOP0_CFG + (sizeof(u32) * (!!(queue_idx & 2)));
|
||||
- field.bit_offset = (queue_idx & 1) * 16;
|
||||
+ offset = WMM_TXOP0_CFG +
|
||||
+ (sizeof(u32) * (!!(rt2x00_ac_to_hwq(queue_idx) & 2)));
|
||||
+ field.bit_offset = (rt2x00_ac_to_hwq(queue_idx) & 1) * 16;
|
||||
field.bit_mask = 0xffff << field.bit_offset;
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, offset);
|
||||
@@ -12197,7 +12207,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
|
||||
rt2800_register_write(rt2x00dev, offset, reg);
|
||||
|
||||
/* Update WMM registers */
|
||||
- field.bit_offset = queue_idx * 4;
|
||||
+ field.bit_offset = rt2x00_ac_to_hwq(queue_idx) * 4;
|
||||
field.bit_mask = 0xf << field.bit_offset;
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, WMM_AIFSN_CFG);
|
||||
@@ -12213,7 +12223,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
|
||||
rt2800_register_write(rt2x00dev, WMM_CWMAX_CFG, reg);
|
||||
|
||||
/* Update EDCA registers */
|
||||
- offset = EDCA_AC0_CFG + (sizeof(u32) * queue_idx);
|
||||
+ offset = EDCA_AC0_CFG + (sizeof(u32) * rt2x00_ac_to_hwq(queue_idx));
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, offset);
|
||||
rt2x00_set_field32(®, EDCA_AC0_CFG_TX_OP, queue->txop);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
@@ -35,7 +35,7 @@ unsigned int rt2800mmio_get_dma_done(str
|
||||
case QID_AC_VI:
|
||||
case QID_AC_BE:
|
||||
case QID_AC_BK:
|
||||
- qid = queue->qid;
|
||||
+ qid = rt2x00_ac_to_hwq(queue->qid);
|
||||
idx = rt2x00mmio_register_read(rt2x00dev, TX_DTX_IDX(qid));
|
||||
break;
|
||||
case QID_MGMT:
|
||||
@@ -456,6 +456,7 @@ void rt2800mmio_kick_queue(struct data_q
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
|
||||
struct queue_entry *entry;
|
||||
+ u8 qid;
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
@@ -464,7 +465,8 @@ void rt2800mmio_kick_queue(struct data_q
|
||||
case QID_AC_BK:
|
||||
WARN_ON_ONCE(rt2x00queue_empty(queue));
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
|
||||
+ qid = rt2x00_ac_to_hwq(queue->qid);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(qid),
|
||||
entry->entry_idx);
|
||||
hrtimer_start(&rt2x00dev->txstatus_timer,
|
||||
TXSTATUS_TIMEOUT, HRTIMER_MODE_REL);
|
||||
@@ -666,36 +668,36 @@ int rt2800mmio_init_queues(struct rt2x00
|
||||
* Initialize registers.
|
||||
*/
|
||||
entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR0,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR3,
|
||||
entry_priv->desc_dma);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT0,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT3,
|
||||
rt2x00dev->tx[0].limit);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX0, 0);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX0, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX3, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX3, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR1,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR2,
|
||||
entry_priv->desc_dma);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT1,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT2,
|
||||
rt2x00dev->tx[1].limit);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX1, 0);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX1, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX2, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX2, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[2].entries[0].priv_data;
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR2,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR0,
|
||||
entry_priv->desc_dma);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT2,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT0,
|
||||
rt2x00dev->tx[2].limit);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX2, 0);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX2, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX0, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX0, 0);
|
||||
|
||||
entry_priv = rt2x00dev->tx[3].entries[0].priv_data;
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR3,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR1,
|
||||
entry_priv->desc_dma);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT3,
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT1,
|
||||
rt2x00dev->tx[3].limit);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX3, 0);
|
||||
- rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX3, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX1, 0);
|
||||
+ rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX1, 0);
|
||||
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR4, 0);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT4, 0);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
|
||||
@@ -57,6 +57,26 @@ enum data_queue_qid {
|
||||
};
|
||||
|
||||
/**
|
||||
+ * rt2x00_ac_to_hwq - Convert IEEE80211 queue id to Ralink hardware
|
||||
+ * queue register index.
|
||||
+ * @ac: TX queue id.
|
||||
+ */
|
||||
+static inline u8 rt2x00_ac_to_hwq(enum data_queue_qid ac)
|
||||
+{
|
||||
+ static const u8 ralink_queue_map[] = {
|
||||
+ [IEEE80211_AC_BE] = 0,
|
||||
+ [IEEE80211_AC_BK] = 1,
|
||||
+ [IEEE80211_AC_VI] = 2,
|
||||
+ [IEEE80211_AC_VO] = 3,
|
||||
+ };
|
||||
+
|
||||
+ if (unlikely(ac >= IEEE80211_NUM_ACS))
|
||||
+ return ac;
|
||||
+
|
||||
+ return ralink_queue_map[ac];
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* enum skb_frame_desc_flags: Flags for &struct skb_frame_desc
|
||||
*
|
||||
* @SKBDESC_DMA_MAPPED_RX: &skb_dma field has been mapped for RX
|
@ -0,0 +1,74 @@
|
||||
From aec50d1a30349759de0ac535f54c3441bf7ebef7 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 2/2] rt2x00: increase the watchdog sampling frequency
|
||||
|
||||
Increase the sampling frequency of the watchdog when the hung
|
||||
counter reaches the threshold to avoid some unnecessary resets.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 45 +++++++++++++------
|
||||
1 file changed, 32 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1320,26 +1320,45 @@ static bool rt2800_watchdog_hung(struct
|
||||
return true;
|
||||
}
|
||||
|
||||
+static inline bool check_dma_busy_rx(u32 reg_cfg, u32 reg_int)
|
||||
+{
|
||||
+ return (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_RX_DMA_BUSY) &&
|
||||
+ rt2x00_get_field32(reg_int, INT_SOURCE_CSR_RX_COHERENT));
|
||||
+}
|
||||
+
|
||||
+static inline bool check_dma_busy_tx(u32 reg_cfg, u32 reg_int)
|
||||
+{
|
||||
+ return (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
|
||||
+ rt2x00_get_field32(reg_int, INT_SOURCE_CSR_TX_COHERENT));
|
||||
+}
|
||||
+
|
||||
static bool rt2800_watchdog_dma_busy(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
bool busy_rx, busy_tx;
|
||||
u32 reg_cfg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
|
||||
u32 reg_int = rt2800_register_read(rt2x00dev, INT_SOURCE_CSR);
|
||||
|
||||
- if (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_RX_DMA_BUSY) &&
|
||||
- rt2x00_get_field32(reg_int, INT_SOURCE_CSR_RX_COHERENT))
|
||||
- rt2x00dev->rxdma_busy++;
|
||||
- else
|
||||
- rt2x00dev->rxdma_busy = 0;
|
||||
-
|
||||
- if (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
|
||||
- rt2x00_get_field32(reg_int, INT_SOURCE_CSR_TX_COHERENT))
|
||||
- rt2x00dev->txdma_busy++;
|
||||
- else
|
||||
- rt2x00dev->txdma_busy = 0;
|
||||
+ rt2x00dev->rxdma_busy = check_dma_busy_rx(reg_cfg, reg_int) ?
|
||||
+ rt2x00dev->rxdma_busy + 1 : 0;
|
||||
+ rt2x00dev->txdma_busy = check_dma_busy_tx(reg_cfg, reg_int) ?
|
||||
+ rt2x00dev->txdma_busy + 1 : 0;
|
||||
+
|
||||
+ if (rt2x00dev->rxdma_busy > 25 || rt2x00dev->txdma_busy > 25) {
|
||||
+ int cnt;
|
||||
+ for (cnt = 0; cnt < 10; cnt++) {
|
||||
+ msleep(5);
|
||||
+ reg_cfg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
|
||||
+ reg_int = rt2800_register_read(rt2x00dev, INT_SOURCE_CSR);
|
||||
+
|
||||
+ if (!check_dma_busy_rx(reg_cfg, reg_int))
|
||||
+ rt2x00dev->rxdma_busy = 0;
|
||||
+ if (!check_dma_busy_tx(reg_cfg, reg_int))
|
||||
+ rt2x00dev->txdma_busy = 0;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- busy_rx = rt2x00dev->rxdma_busy > 30;
|
||||
- busy_tx = rt2x00dev->txdma_busy > 30;
|
||||
+ busy_rx = rt2x00dev->rxdma_busy > 40;
|
||||
+ busy_tx = rt2x00dev->txdma_busy > 40;
|
||||
|
||||
if (!busy_rx && !busy_tx)
|
||||
return false;
|
@ -0,0 +1,77 @@
|
||||
From 2c5aad0f9990724cce48e0a53b66bc0438e4603d Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 1/4] rt2x00: always calibrate MT7620 when switching channel
|
||||
|
||||
Perform calibration work after each channel switching operation.
|
||||
This should help improve the rx/tx signal strength for MT7620.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 24 ++++++++++++++-----
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -5704,6 +5704,9 @@ static void rt2800_config_ps(struct rt2x
|
||||
}
|
||||
}
|
||||
|
||||
+static void rt2800_calibration_rt6352_stage1(struct rt2x00_dev *rt2x00dev);
|
||||
+static void rt2800_calibration_rt6352_stage2(struct rt2x00_dev *rt2x00dev);
|
||||
+
|
||||
void rt2800_config(struct rt2x00_dev *rt2x00dev,
|
||||
struct rt2x00lib_conf *libconf,
|
||||
const unsigned int flags)
|
||||
@@ -5718,10 +5721,18 @@ void rt2800_config(struct rt2x00_dev *rt
|
||||
*/
|
||||
rt2800_update_survey(rt2x00dev);
|
||||
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352) &&
|
||||
+ !test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
+ rt2800_calibration_rt6352_stage1(rt2x00dev);
|
||||
+
|
||||
rt2800_config_channel(rt2x00dev, libconf->conf,
|
||||
&libconf->rf, &libconf->channel);
|
||||
rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
|
||||
libconf->conf->power_level);
|
||||
+
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352) &&
|
||||
+ !test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
+ rt2800_calibration_rt6352_stage2(rt2x00dev);
|
||||
}
|
||||
if (flags & IEEE80211_CONF_CHANGE_POWER)
|
||||
rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
|
||||
@@ -10427,15 +10438,19 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
}
|
||||
}
|
||||
|
||||
-static void rt2800_calibration_rt6352(struct rt2x00_dev *rt2x00dev)
|
||||
+static void rt2800_calibration_rt6352_stage1(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
- u32 reg;
|
||||
-
|
||||
if (rt2x00_has_cap_external_pa(rt2x00dev) ||
|
||||
rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
rt2800_restore_rf_bbp_rt6352(rt2x00dev);
|
||||
|
||||
rt2800_r_calibration(rt2x00dev);
|
||||
+}
|
||||
+
|
||||
+static void rt2800_calibration_rt6352_stage2(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ u32 reg;
|
||||
+
|
||||
rt2800_rf_self_txdc_cal(rt2x00dev);
|
||||
rt2800_rxdcoc_calibration(rt2x00dev);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, true);
|
||||
@@ -10766,9 +10781,6 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
|
||||
-
|
||||
- /* Do calibration and init PA/LNA */
|
||||
- rt2800_calibration_rt6352(rt2x00dev);
|
||||
}
|
||||
|
||||
static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
|
@ -0,0 +1,48 @@
|
||||
From aaa57924324c1ee77afa5e3effc95cc86158ddcc Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 2/4] rt2x00: rework link tuner for MT7620
|
||||
|
||||
Correct the VGC gain value for MT7620 and only do gain calibration
|
||||
for supported devices.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -5561,6 +5561,9 @@ static void rt2800_config_txpower(struct
|
||||
|
||||
void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ return;
|
||||
+
|
||||
rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
|
||||
rt2x00dev->tx_power);
|
||||
}
|
||||
@@ -5773,9 +5776,10 @@ static u8 rt2800_get_default_vgc(struct
|
||||
rt2x00_rt(rt2x00dev, RT3593) ||
|
||||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
- rt2x00_rt(rt2x00dev, RT5592) ||
|
||||
- rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ rt2x00_rt(rt2x00dev, RT5592))
|
||||
vgc = 0x1c + (2 * rt2x00dev->lna_gain);
|
||||
+ else if(rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ vgc = 0x04 + (2 * rt2x00dev->lna_gain);
|
||||
else
|
||||
vgc = 0x2e + rt2x00dev->lna_gain;
|
||||
} else { /* 5GHZ band */
|
||||
@@ -5828,7 +5832,8 @@ void rt2800_link_tuner(struct rt2x00_dev
|
||||
{
|
||||
u8 vgc;
|
||||
|
||||
- if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C))
|
||||
+ if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT6352))
|
||||
return;
|
||||
|
||||
/* When RSSI is better than a certain threshold, increase VGC
|
@ -0,0 +1,25 @@
|
||||
From b672507ca9f06bb17213036b16bc4f5c5bc65357 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 3/4] rt2x00: correct MT7620 SDM mode register value
|
||||
|
||||
rt2x00_set_field8() is a mask writing function. If we want to set
|
||||
the BIT(7) for the SDM mode register here, we only need to fill "4"
|
||||
in the mask.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3848,7 +3848,7 @@ static void rt2800_config_channel_rf7620
|
||||
|
||||
/* Default: XO=20MHz , SDM mode */
|
||||
rfcsr = rt2800_rfcsr_read(rt2x00dev, 16);
|
||||
- rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 4);
|
||||
rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
|
||||
|
||||
rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
|
@ -0,0 +1,60 @@
|
||||
From 2585ada646e4dcf152ab813a24d667e6903105f4 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 4/4] rt2x00: fix register operation on RXIQ calibration
|
||||
|
||||
In rt2800_rxiq_calibration(), some variables are overwritten
|
||||
before being used. Based on the values of the relevant registers
|
||||
in other functions, I believe the correct operation should be
|
||||
bit mask writing.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8846,7 +8846,7 @@ static void rt2800_rxiq_calibration(stru
|
||||
rt2x00_warn(rt2x00dev, "Timeout waiting for MAC status in RXIQ calibration\n");
|
||||
|
||||
bbpval = bbp4 & (~0x18);
|
||||
- bbpval = bbp4 | 0x00;
|
||||
+ bbpval = bbpval | 0x00;
|
||||
rt2800_bbp_write(rt2x00dev, 4, bbpval);
|
||||
|
||||
bbpval = rt2800_bbp_read(rt2x00dev, 21);
|
||||
@@ -8928,13 +8928,13 @@ static void rt2800_rxiq_calibration(stru
|
||||
for (ch_idx = 0; ch_idx < 2; ch_idx = ch_idx + 1) {
|
||||
if (ch_idx == 0) {
|
||||
rfval = rfb0r1 & (~0x3);
|
||||
- rfval = rfb0r1 | 0x1;
|
||||
+ rfval = rfval | 0x1;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval);
|
||||
rfval = rfb0r2 & (~0x33);
|
||||
- rfval = rfb0r2 | 0x11;
|
||||
+ rfval = rfval | 0x11;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval);
|
||||
rfval = rfb0r42 & (~0x50);
|
||||
- rfval = rfb0r42 | 0x10;
|
||||
+ rfval = rfval | 0x10;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval);
|
||||
|
||||
rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006);
|
||||
@@ -8947,13 +8947,13 @@ static void rt2800_rxiq_calibration(stru
|
||||
rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x00);
|
||||
} else {
|
||||
rfval = rfb0r1 & (~0x3);
|
||||
- rfval = rfb0r1 | 0x2;
|
||||
+ rfval = rfval | 0x2;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval);
|
||||
rfval = rfb0r2 & (~0x33);
|
||||
- rfval = rfb0r2 | 0x22;
|
||||
+ rfval = rfval | 0x22;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval);
|
||||
rfval = rfb0r42 & (~0x50);
|
||||
- rfval = rfb0r42 | 0x40;
|
||||
+ rfval = rfval | 0x40;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval);
|
||||
|
||||
rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006);
|
@ -0,0 +1,230 @@
|
||||
From b48887d5de9921d0ff9e88068e3cd555a383d702 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 1/2] rt2x00: fix RFCSR register init values for RT5592
|
||||
|
||||
Based on Raink proprietary driver 2.7.1.5, correct the initial
|
||||
values of some RFCSR registers for RT5592.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 122 ++++++++----------
|
||||
1 file changed, 53 insertions(+), 69 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3576,9 +3576,8 @@ static void rt2800_config_channel_rf55xx
|
||||
|
||||
/* TODO RF27 <- tssi */
|
||||
|
||||
- rfcsr = rf->channel <= 10 ? 0x07 : 0x06;
|
||||
- rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59, rfcsr);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 23, rf->channel <= 10 ? 0x08 : 0x07);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59, rf->channel <= 4 ? 0x06 : 0x04);
|
||||
|
||||
if (is_11b) {
|
||||
/* CCK */
|
||||
@@ -3599,7 +3598,7 @@ static void rt2800_config_channel_rf55xx
|
||||
power_bound = POWER_BOUND;
|
||||
ep_reg = 0x2;
|
||||
} else {
|
||||
- rt2800_rfcsr_write(rt2x00dev, 10, 0x97);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 10, 0x95);
|
||||
/* FIMXE: RF11 overwrite */
|
||||
rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
|
||||
rt2800_rfcsr_write(rt2x00dev, 25, 0xBF);
|
||||
@@ -3608,13 +3607,15 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2800_rfcsr_write(rt2x00dev, 37, 0x04);
|
||||
rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
|
||||
rt2800_rfcsr_write(rt2x00dev, 40, 0x42);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 41, 0xBB);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 41, 0xAB);
|
||||
rt2800_rfcsr_write(rt2x00dev, 42, 0xD7);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 45, 0x41);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 45, 0x01);
|
||||
rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 57, 0x77);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, 0x19);
|
||||
rt2800_rfcsr_write(rt2x00dev, 60, 0x05);
|
||||
rt2800_rfcsr_write(rt2x00dev, 61, 0x01);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 62, 0x19);
|
||||
|
||||
/* TODO RF27 <- tssi */
|
||||
|
||||
@@ -3623,82 +3624,59 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2800_rfcsr_write(rt2x00dev, 12, 0x2E);
|
||||
rt2800_rfcsr_write(rt2x00dev, 13, 0x22);
|
||||
rt2800_rfcsr_write(rt2x00dev, 22, 0x60);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 23, 0x7F);
|
||||
- if (rf->channel <= 50)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 24, 0x09);
|
||||
- else if (rf->channel >= 52)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 24, 0x07);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 23, 0x7E);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 24, 0x07);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0x1C);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x5B);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 44, 0X40);
|
||||
rt2800_rfcsr_write(rt2x00dev, 46, 0X00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0xFE);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x0C);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 54, 0xF8);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, 0xFD);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x0E);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, 0x04);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59, 0x7C);
|
||||
+
|
||||
if (rf->channel <= 50) {
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x06),
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0xD3);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 44, 0X32);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, 0xF9);
|
||||
} else if (rf->channel >= 52) {
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x04);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 44, 0X2A);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, 0xF8);
|
||||
}
|
||||
-
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59, 0x7F);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
|
||||
-
|
||||
} else if (rf->channel >= 100 && rf->channel <= 165) {
|
||||
-
|
||||
rt2800_rfcsr_write(rt2x00dev, 12, 0x0E);
|
||||
rt2800_rfcsr_write(rt2x00dev, 13, 0x42);
|
||||
rt2800_rfcsr_write(rt2x00dev, 22, 0x40);
|
||||
- if (rf->channel <= 153) {
|
||||
- rt2800_rfcsr_write(rt2x00dev, 23, 0x3C);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 24, 0x06);
|
||||
- } else if (rf->channel >= 155) {
|
||||
- rt2800_rfcsr_write(rt2x00dev, 23, 0x38);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 24, 0x05);
|
||||
- }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, 0x01);
|
||||
+
|
||||
if (rf->channel <= 138) {
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 23, 0x7C);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0x1A);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x3B);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 44, 0x20);
|
||||
rt2800_rfcsr_write(rt2x00dev, 46, 0x18);
|
||||
- } else if (rf->channel >= 140) {
|
||||
+ } else {
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 23, 0x78);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0x18);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x1B);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 44, 0x10);
|
||||
rt2800_rfcsr_write(rt2x00dev, 46, 0X08);
|
||||
}
|
||||
- if (rf->channel <= 124)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0xFC);
|
||||
- else if (rf->channel >= 126)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0xEC);
|
||||
- if (rf->channel <= 138)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
|
||||
- else if (rf->channel >= 140)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 54, 0xEB);
|
||||
- if (rf->channel <= 138)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x01);
|
||||
- else if (rf->channel >= 140)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x00);
|
||||
- if (rf->channel <= 128)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
|
||||
- else if (rf->channel >= 130)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0xAB);
|
||||
- if (rf->channel <= 116)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x1D);
|
||||
- else if (rf->channel >= 118)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
|
||||
- if (rf->channel <= 138)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59, 0x3F);
|
||||
- else if (rf->channel >= 140)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59, 0x7C);
|
||||
- if (rf->channel <= 116)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 62, 0x1D);
|
||||
- else if (rf->channel >= 118)
|
||||
- rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
|
||||
+
|
||||
+ if (rf->channel <= 114) {
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 24, 0x02);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x1A);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, 0xEA);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, 0xB3);
|
||||
+ } else {
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 24, 0x03);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x0A);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, 0xF9);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, 0x9B);
|
||||
+ }
|
||||
+
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, rf->channel <= 124 ? 0xFC : 0xEC);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, rf->channel <= 116 ? 0x1D : 0x15);
|
||||
+ rfcsr = (rf->channel >= 116 && rf->channel <= 138) ? 0x7E : 0x7C;
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59, rfcsr);
|
||||
}
|
||||
|
||||
power_bound = POWER_BOUND_5G;
|
||||
@@ -3710,7 +3688,7 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2x00_set_field8(&rfcsr, RFCSR49_TX, power_bound);
|
||||
else
|
||||
rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
|
||||
- if (is_type_ep)
|
||||
+ if (!is_type_ep)
|
||||
rt2x00_set_field8(&rfcsr, RFCSR49_EP, ep_reg);
|
||||
rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
|
||||
|
||||
@@ -3719,7 +3697,7 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2x00_set_field8(&rfcsr, RFCSR50_TX, power_bound);
|
||||
else
|
||||
rt2x00_set_field8(&rfcsr, RFCSR50_TX, info->default_power2);
|
||||
- if (is_type_ep)
|
||||
+ if (!is_type_ep)
|
||||
rt2x00_set_field8(&rfcsr, RFCSR50_EP, ep_reg);
|
||||
rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
|
||||
|
||||
@@ -3740,7 +3718,6 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
|
||||
|
||||
rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 6, 0xe4);
|
||||
|
||||
if (conf_is_ht40(conf))
|
||||
rt2800_rfcsr_write(rt2x00dev, 30, 0x16);
|
||||
@@ -8505,12 +8482,15 @@ static void rt2800_init_rfcsr_5392(struc
|
||||
|
||||
static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
+ u16 eeprom;
|
||||
+
|
||||
rt2800_rf_init_calibration(rt2x00dev, 30);
|
||||
|
||||
rt2800_rfcsr_write(rt2x00dev, 1, 0x3F);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
|
||||
rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 6, 0xE4);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 6, 0xE0);
|
||||
rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
|
||||
@@ -8526,9 +8506,13 @@ static void rt2800_init_rfcsr_5592(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
|
||||
rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
|
||||
rt2800_rfcsr_write(rt2x00dev, 47, 0x0C);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 53, 0x22);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
|
||||
rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
|
||||
|
||||
+ eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2);
|
||||
+ if (!rt2x00_get_field16(eeprom, EEPROM_NIC_CONF2_CRYSTAL))
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 6, 0xE4);
|
||||
+
|
||||
rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
|
||||
msleep(1);
|
||||
|
@ -0,0 +1,119 @@
|
||||
From 1847d817df5585f9d957d16ed2a56ceb41cf6df7 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sun, 22 Dec 2024 17:06:59 +0800
|
||||
Subject: [PATCH 2/2] rt2x00: fix BBP register init values for RT5592
|
||||
|
||||
Based on Raink proprietary driver 2.7.1.5, correct the initial
|
||||
values of some BBP registers for RT5592.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 32 +++++++++----------
|
||||
1 file changed, 15 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3746,6 +3746,7 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2800_bbp_write(rt2x00dev, 80, (rf->channel <= 14) ? 0x0E : 0x08);
|
||||
rt2800_bbp_write(rt2x00dev, 81, (rf->channel <= 14) ? 0x3A : 0x38);
|
||||
rt2800_bbp_write(rt2x00dev, 82, (rf->channel <= 14) ? 0x62 : 0x92);
|
||||
+ rt2800_bbp_write(rt2x00dev, 95, (rf->channel <= 14) ? 0x9A : 0x1A);
|
||||
|
||||
/* GLRT band configuration */
|
||||
rt2800_bbp_write(rt2x00dev, 195, 128);
|
||||
@@ -3758,7 +3759,7 @@ static void rt2800_config_channel_rf55xx
|
||||
rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x32 : 0x20);
|
||||
rt2800_bbp_write(rt2x00dev, 195, 133);
|
||||
rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x28 : 0x7F);
|
||||
- rt2800_bbp_write(rt2x00dev, 195, 124);
|
||||
+ rt2800_bbp_write(rt2x00dev, 195, 134);
|
||||
rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
|
||||
}
|
||||
|
||||
@@ -4304,7 +4305,8 @@ static void rt2800_config_channel(struct
|
||||
rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
|
||||
rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
|
||||
rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
|
||||
- if (rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5592) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT6352))
|
||||
rt2800_bbp_write(rt2x00dev, 86, 0x38);
|
||||
else
|
||||
rt2800_bbp_write(rt2x00dev, 86, 0);
|
||||
@@ -4313,6 +4315,7 @@ static void rt2800_config_channel(struct
|
||||
if (rf->channel <= 14) {
|
||||
if (!rt2x00_rt(rt2x00dev, RT5390) &&
|
||||
!rt2x00_rt(rt2x00dev, RT5392) &&
|
||||
+ !rt2x00_rt(rt2x00dev, RT5592) &&
|
||||
!rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_bbp_write(rt2x00dev, 82, 0x62);
|
||||
@@ -4336,17 +4339,20 @@ static void rt2800_config_channel(struct
|
||||
else if (rt2x00_rt(rt2x00dev, RT3593) ||
|
||||
rt2x00_rt(rt2x00dev, RT3883))
|
||||
rt2800_bbp_write(rt2x00dev, 82, 0x82);
|
||||
- else if (!rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ else if (!rt2x00_rt(rt2x00dev, RT5592) &&
|
||||
+ !rt2x00_rt(rt2x00dev, RT6352))
|
||||
rt2800_bbp_write(rt2x00dev, 82, 0xf2);
|
||||
|
||||
if (rt2x00_rt(rt2x00dev, RT3593) ||
|
||||
rt2x00_rt(rt2x00dev, RT3883))
|
||||
rt2800_bbp_write(rt2x00dev, 83, 0x9a);
|
||||
|
||||
- if (rt2x00_has_cap_external_lna_a(rt2x00dev))
|
||||
- rt2800_bbp_write(rt2x00dev, 75, 0x46);
|
||||
- else
|
||||
- rt2800_bbp_write(rt2x00dev, 75, 0x50);
|
||||
+ if (!rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
+ if (rt2x00_has_cap_external_lna_a(rt2x00dev))
|
||||
+ rt2800_bbp_write(rt2x00dev, 75, 0x46);
|
||||
+ else
|
||||
+ rt2800_bbp_write(rt2x00dev, 75, 0x50);
|
||||
+ }
|
||||
}
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, TX_BAND_CFG);
|
||||
@@ -5783,12 +5789,10 @@ static inline void rt2800_set_vgc(struct
|
||||
if (rt2x00_rt(rt2x00dev, RT3572) ||
|
||||
rt2x00_rt(rt2x00dev, RT3593) ||
|
||||
rt2x00_rt(rt2x00dev, RT3883) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT5592) ||
|
||||
rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
|
||||
vgc_level);
|
||||
- } else if (rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
- rt2800_bbp_write(rt2x00dev, 83, qual->rssi > -65 ? 0x4a : 0x7a);
|
||||
- rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level);
|
||||
} else {
|
||||
rt2800_bbp_write(rt2x00dev, 66, vgc_level);
|
||||
}
|
||||
@@ -7016,7 +7020,6 @@ static void rt2800_init_bbp_5592(struct
|
||||
rt2800_bbp_write(rt2x00dev, 88, 0x90);
|
||||
rt2800_bbp_write(rt2x00dev, 91, 0x04);
|
||||
rt2800_bbp_write(rt2x00dev, 92, 0x02);
|
||||
- rt2800_bbp_write(rt2x00dev, 95, 0x9a);
|
||||
rt2800_bbp_write(rt2x00dev, 98, 0x12);
|
||||
rt2800_bbp_write(rt2x00dev, 103, 0xC0);
|
||||
rt2800_bbp_write(rt2x00dev, 104, 0x92);
|
||||
@@ -7027,6 +7030,7 @@ static void rt2800_init_bbp_5592(struct
|
||||
rt2800_bbp_write(rt2x00dev, 134, 0xD0);
|
||||
rt2800_bbp_write(rt2x00dev, 135, 0xF6);
|
||||
rt2800_bbp_write(rt2x00dev, 137, 0x0F);
|
||||
+ rt2800_bbp_write(rt2x00dev, 148, 0x84);
|
||||
|
||||
/* Initialize GLRT (Generalized Likehood Radio Test) */
|
||||
rt2800_init_bbp_5592_glrt(rt2x00dev);
|
||||
@@ -7051,12 +7055,6 @@ static void rt2800_init_bbp_5592(struct
|
||||
rt2x00_set_field8(&value, BBP254_BIT7, 1);
|
||||
rt2800_bbp_write(rt2x00dev, 254, value);
|
||||
}
|
||||
-
|
||||
- rt2800_init_freq_calibration(rt2x00dev);
|
||||
-
|
||||
- rt2800_bbp_write(rt2x00dev, 84, 0x19);
|
||||
- if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
|
||||
- rt2800_bbp_write(rt2x00dev, 103, 0xc0);
|
||||
}
|
||||
|
||||
static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
|
@ -52,9 +52,9 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
|
||||
[EEPROM_CHIP_ID] = 0x0000,
|
||||
[EEPROM_VERSION] = 0x0001,
|
||||
@@ -10404,8 +10422,10 @@ static void rt2800_calibration_rt6352(st
|
||||
u32 reg;
|
||||
|
||||
@@ -10428,8 +10446,10 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
static void rt2800_calibration_rt6352_stage1(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
if (rt2x00_has_cap_external_pa(rt2x00dev) ||
|
||||
- rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
@ -63,8 +63,8 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
+ }
|
||||
|
||||
rt2800_r_calibration(rt2x00dev);
|
||||
rt2800_rf_self_txdc_cal(rt2x00dev);
|
||||
@@ -10423,6 +10443,8 @@ static void rt2800_calibration_rt6352(st
|
||||
}
|
||||
@@ -10453,6 +10473,8 @@ static void rt2800_calibration_rt6352_st
|
||||
!rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
return;
|
||||
|
||||
|
@ -14,13 +14,13 @@
|
||||
*/
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3836,14 +3836,16 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3842,14 +3842,16 @@ static void rt2800_config_channel_rf7620
|
||||
rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
|
||||
rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
|
||||
|
||||
- /* Default: XO=20MHz , SDM mode */
|
||||
- rfcsr = rt2800_rfcsr_read(rt2x00dev, 16);
|
||||
- rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80);
|
||||
- rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 4);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
|
||||
-
|
||||
- rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
|
||||
@ -29,7 +29,7 @@
|
||||
+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) {
|
||||
+ /* Default: XO=20MHz , SDM mode */
|
||||
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 16);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 4);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
|
||||
+
|
||||
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
|
||||
@@ -3877,18 +3879,23 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3883,18 +3885,23 @@ static void rt2800_config_channel_rf7620
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
|
||||
}
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
|
||||
if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
|
||||
if (conf_is_ht40(conf)) {
|
||||
@@ -4002,25 +4009,29 @@ static void rt2800_config_alc_rt6352(str
|
||||
@@ -4008,25 +4015,29 @@ static void rt2800_config_alc_rt6352(str
|
||||
if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
|
||||
rt2x00_warn(rt2x00dev, "RF busy while configuring ALC\n");
|
||||
|
||||
@ -121,7 +121,7 @@
|
||||
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
|
||||
|
||||
rt2800_vco_calibration(rt2x00dev);
|
||||
@@ -4513,7 +4524,8 @@ static void rt2800_config_channel(struct
|
||||
@@ -4524,7 +4535,8 @@ static void rt2800_config_channel(struct
|
||||
if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
/* BBP for GLRT BW */
|
||||
bbp = conf_is_ht40(conf) ?
|
||||
@ -131,7 +131,7 @@
|
||||
0x15 : 0x1a;
|
||||
rt2800_bbp_glrt_write(rt2x00dev, 141, bbp);
|
||||
|
||||
@@ -6017,18 +6029,33 @@ static int rt2800_init_registers(struct
|
||||
@@ -6042,18 +6054,34 @@ static int rt2800_init_registers(struct
|
||||
} else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
} else if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
@ -162,7 +162,8 @@
|
||||
+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
|
||||
+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
|
||||
+ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
|
||||
+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
|
||||
+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150f0f);
|
||||
+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606);
|
||||
+ rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
|
||||
+ rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0);
|
||||
+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN,
|
||||
@ -177,7 +178,7 @@
|
||||
reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
|
||||
rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
|
||||
@@ -7141,14 +7168,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
@@ -7160,14 +7188,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
rt2800_bbp_write(rt2x00dev, 188, 0x00);
|
||||
rt2800_bbp_write(rt2x00dev, 189, 0x00);
|
||||
|
||||
@ -202,7 +203,7 @@
|
||||
|
||||
/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
|
||||
rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
|
||||
@@ -10378,6 +10407,9 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
@@ -10404,6 +10434,9 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0);
|
||||
}
|
||||
|
||||
@ -212,7 +213,7 @@
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16);
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23);
|
||||
@@ -10455,6 +10487,9 @@ static void rt2800_calibration_rt6352(st
|
||||
@@ -10485,6 +10518,9 @@ static void rt2800_calibration_rt6352_st
|
||||
rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
|
||||
}
|
||||
|
||||
@ -222,7 +223,7 @@
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
|
||||
@@ -10545,31 +10580,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10575,31 +10611,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
|
||||
|
||||
@ -284,7 +285,7 @@
|
||||
|
||||
/* Initialize RF channel register to default value */
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
|
||||
@@ -10635,63 +10675,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10665,63 +10706,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
|
||||
|
||||
@ -411,7 +412,7 @@
|
||||
|
||||
/* Initialize RF DC calibration register to default value */
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
|
||||
@@ -10754,12 +10802,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10784,12 +10833,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
|
||||
|
||||
@ -431,6 +432,6 @@
|
||||
+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
|
||||
+ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Do calibration and init PA/LNA */
|
||||
rt2800_calibration_rt6352(rt2x00dev);
|
||||
static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
|
||||
|
@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/openwrt/mt76
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2024-12-30
|
||||
PKG_SOURCE_VERSION:=f8563589c72d93c35f9316c65de361061b785699
|
||||
PKG_MIRROR_HASH:=aba3906b44d7dc952add8786ab46a27512d04efbd3e6a7a40526707a2ff87445
|
||||
PKG_SOURCE_DATE:=2025-01-04
|
||||
PKG_SOURCE_VERSION:=e354436db4402552bcb0cbe9abab2a46fb1ad31c
|
||||
PKG_MIRROR_HASH:=7e3894e1f2641e172f87be1ae0cc6adda318d989350ebd53500a7df02f0afd8f
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_USE_NINJA:=0
|
||||
|
@ -195,6 +195,7 @@ function setup_phy(phy, config, data) {
|
||||
log(`Configuring '${phy}' txantenna: ${config.txantenna}, rxantenna: ${config.rxantenna} distance: ${config.distance}`);
|
||||
system(`iw phy ${phy} set antenna ${config.txantenna} ${config.rxantenna}`);
|
||||
system(`iw phy ${phy} set distance ${config.distance}`);
|
||||
system(`iw phy ${phy} set txpower ${config.txpower}`);
|
||||
|
||||
if (config.frag)
|
||||
system(`iw phy ${phy} set frag ${frag}`);
|
||||
|
@ -849,6 +849,11 @@ mac80211_setup_mesh() {
|
||||
[ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
|
||||
[ -n "$mesh_id" ] && ssid="$mesh_id"
|
||||
|
||||
brstr=
|
||||
for br in $basic_rate_list; do
|
||||
wpa_supplicant_add_rate brstr "$br"
|
||||
done
|
||||
|
||||
local prev
|
||||
json_set_namespace wdev_uc prev
|
||||
|
||||
@ -859,6 +864,7 @@ mac80211_setup_mesh() {
|
||||
json_add_string freq "$freq"
|
||||
json_add_string htmode "$iw_htmode"
|
||||
[ -n "$mcval" ] && json_add_string mcast-rate "$mcval"
|
||||
[ -n "$brstr" ] && json_add_string basic-rates "$brstr"
|
||||
json_add_int beacon-interval "$beacon_int"
|
||||
mac80211_add_mesh_params
|
||||
|
||||
@ -1210,6 +1216,14 @@ drv_mac80211_setup() {
|
||||
wdev_tool "$phy$phy_suffix" set_config "$(json_dump)" $active_ifnames
|
||||
json_set_namespace "$prev"
|
||||
|
||||
[ -z "$phy_suffix" ] && {
|
||||
if [ -n "$txpower" ]; then
|
||||
iw phy "$phy" set txpower fixed "${txpower%%.*}00"
|
||||
else
|
||||
iw phy "$phy" set txpower auto
|
||||
fi
|
||||
}
|
||||
|
||||
for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower
|
||||
wireless_set_up
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ function iface_start(wdev)
|
||||
system(cmd);
|
||||
} else if (wdev.mode == "mesh") {
|
||||
let cmd = [ "iw", "dev", ifname, "mesh", "join", wdev.ssid, "freq", wdev.freq, htmode ];
|
||||
for (let key in [ "mcast-rate", "beacon-interval" ])
|
||||
for (let key in [ "basic-rates", "mcast-rate", "beacon-interval" ])
|
||||
if (wdev[key])
|
||||
push(cmd, key, wdev[key]);
|
||||
system(cmd);
|
||||
|
@ -9,14 +9,14 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=ppp
|
||||
PKG_VERSION:=2.5.1
|
||||
PKG_VERSION:=2.5.2
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/ppp-project/ppp
|
||||
PKG_SOURCE_DATE:=2024-09-18
|
||||
PKG_SOURCE_VERSION:=d5aeec65752d4a9b3bb46771d0b221c4a4a6539e
|
||||
PKG_MIRROR_HASH:=b98125933d8160ff3476b053414e787e65a94948c0ecee53f6261cd403ff4b03
|
||||
PKG_SOURCE_DATE:=2024-12-31
|
||||
PKG_SOURCE_VERSION:=9f612dc02c34509f062ed63b60bcc7e937e25178
|
||||
PKG_MIRROR_HASH:=677b71d23b668db986146e13b0c651f2ac506eb4fb244ffba1ff406cbae3511b
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_LICENSE:=BSD-4-Clause
|
||||
@ -30,17 +30,22 @@ PKG_FIXUP:=autoreconf
|
||||
PKG_INSTALL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
CONFIGURE_VARS += \
|
||||
enable_eaptls=no \
|
||||
enable_microsoft_extensions=yes \
|
||||
enable_peap=no
|
||||
|
||||
CONFIGURE_ARGS += \
|
||||
with_openssl=no \
|
||||
with_pam=no \
|
||||
with_pcap=no \
|
||||
with_srp=no \
|
||||
with_static_pcap=yes
|
||||
--disable-cbcp \
|
||||
--disable-eaptls \
|
||||
--disable-mslanman \
|
||||
--disable-openssl-engine \
|
||||
--disable-peap \
|
||||
--disable-systemd \
|
||||
--enable-ipv6cp \
|
||||
--enable-microsoft-extensions \
|
||||
--enable-plugins \
|
||||
--with-atm \
|
||||
--with-static-pcap \
|
||||
--without-openssl \
|
||||
--without-pam \
|
||||
--without-pcap \
|
||||
--without-srp
|
||||
|
||||
define Package/ppp/Default
|
||||
SECTION:=net
|
||||
@ -185,8 +190,8 @@ not initiate a session. Can be useful to debug pppoe.
|
||||
endef
|
||||
|
||||
ifeq ($(BUILD_VARIANT),multilink)
|
||||
CONFIGURE_VARS += \
|
||||
enable_multilink=yes
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-multilink
|
||||
endif
|
||||
|
||||
define Build/InstallDev
|
||||
|
@ -1,45 +0,0 @@
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Fri, 4 Oct 2024 12:19:42 +0000
|
||||
Subject: [PATCH] pppd/crypto: fix build without openssl
|
||||
|
||||
Compile openssl relevant code only when PPP_WITH_OPENSSL is defined.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
pppd/crypto.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/pppd/crypto.c
|
||||
+++ b/pppd/crypto.c
|
||||
@@ -199,6 +199,7 @@ int PPP_crypto_init()
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
+#ifdef PPP_WITH_OPENSSL
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||
g_crypto_ctx.legacy = OSSL_PROVIDER_load(NULL, "legacy");
|
||||
if (g_crypto_ctx.legacy == NULL)
|
||||
@@ -214,6 +215,7 @@ int PPP_crypto_init()
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
retval = 1;
|
||||
|
||||
@@ -224,6 +226,7 @@ done:
|
||||
|
||||
int PPP_crypto_deinit()
|
||||
{
|
||||
+#ifdef PPP_WITH_OPENSSL
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||
if (g_crypto_ctx.legacy) {
|
||||
OSSL_PROVIDER_unload(g_crypto_ctx.legacy);
|
||||
@@ -239,6 +242,7 @@ int PPP_crypto_deinit()
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
ERR_free_strings();
|
||||
#endif
|
||||
+#endif
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Fri, 4 Oct 2024 14:02:14 +0000
|
||||
Subject: [PATCH] pppd: make pid directory before create the pid file
|
||||
|
||||
If multilink feature is not enabled, the '/var/run/pppd' directory
|
||||
won't be created before adding pid file.
|
||||
|
||||
Fixes error message:
|
||||
'Failed to create pid file /var/run/pppd/pppoe-wan.pid: No such file or directory'
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
---
|
||||
pppd/main.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/pppd/main.c
|
||||
+++ b/pppd/main.c
|
||||
@@ -921,6 +921,9 @@ create_pidfile(int pid)
|
||||
{
|
||||
FILE *pidfile;
|
||||
|
||||
+#ifndef PPP_WITH_TDB
|
||||
+ mkdir_recursive(PPP_PATH_VARRUN);
|
||||
+#endif
|
||||
slprintf(pidfilename, sizeof(pidfilename), "%s/%s.pid",
|
||||
PPP_PATH_VARRUN, ifname);
|
||||
if ((pidfile = fopen(pidfilename, "w")) != NULL) {
|
@ -1,42 +0,0 @@
|
||||
From: Tan Zien <nabsdh9@gmail.com>
|
||||
Date: Tue, 1 Oct 2024 10:38:45 +0800
|
||||
Subject: [PATCH] pppd/crypto: fix gcc 14 build
|
||||
|
||||
fix this:
|
||||
|
||||
crypto.c: In function 'PPP_crypto_error':
|
||||
crypto.c:178:11: error: implicit declaration of function 'vsnprintf' [-Wimplicit-function-declaration]
|
||||
178 | off = vsnprintf(buf, len, fmt, args);
|
||||
| ^~~~~~~~~
|
||||
crypto.c:41:1: note: include '<stdio.h>' or provide a declaration of 'vsnprintf'
|
||||
40 | #include "crypto-priv.h"
|
||||
+++ |+#include <stdio.h>
|
||||
41 |
|
||||
crypto.c:178:26: warning: 'vsnprintf' argument 2 type is 'int' where 'long unsigned int' is expected in a call to built-in function declared without prototype [-Wbuiltin-declaration-mismatch]
|
||||
178 | off = vsnprintf(buf, len, fmt, args);
|
||||
| ^~~
|
||||
<built-in>: note: built-in 'vsnprintf' declared here
|
||||
|
||||
Signed-off-by: Tan Zien <nabsdh9@gmail.com>
|
||||
---
|
||||
pppd/crypto.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/pppd/crypto.c
|
||||
+++ b/pppd/crypto.c
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
+#include <stdio.h>
|
||||
|
||||
#include "pppd.h"
|
||||
#include "crypto.h"
|
||||
@@ -247,7 +248,6 @@ int PPP_crypto_deinit()
|
||||
}
|
||||
|
||||
#ifdef UNIT_TEST
|
||||
-#include <stdio.h>
|
||||
|
||||
int debug;
|
||||
int error_count;
|
@ -1,6 +1,6 @@
|
||||
--- a/pppd/demand.c
|
||||
+++ b/pppd/demand.c
|
||||
@@ -40,6 +40,8 @@
|
||||
@@ -34,6 +34,8 @@
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <netdb.h>
|
||||
@ -9,7 +9,7 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
@@ -47,6 +49,8 @@
|
||||
@@ -41,6 +43,8 @@
|
||||
#include <sys/resource.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
@ -18,7 +18,7 @@
|
||||
#ifdef PPP_WITH_FILTER
|
||||
#include <pcap-bpf.h>
|
||||
#endif
|
||||
@@ -223,6 +227,14 @@ loop_chars(unsigned char *p, int n)
|
||||
@@ -217,6 +221,14 @@ loop_chars(unsigned char *p, int n)
|
||||
int c, rv;
|
||||
|
||||
rv = 0;
|
||||
@ -33,7 +33,7 @@
|
||||
for (; n > 0; --n) {
|
||||
c = *p++;
|
||||
if (c == PPP_FLAG) {
|
||||
@@ -299,16 +311,100 @@ loop_frame(unsigned char *frame, int len
|
||||
@@ -293,16 +305,100 @@ loop_frame(unsigned char *frame, int len
|
||||
* loopback, now that the real serial link is up.
|
||||
*/
|
||||
void
|
||||
@ -159,7 +159,7 @@
|
||||
} else {
|
||||
--- a/pppd/pppd-private.h
|
||||
+++ b/pppd/pppd-private.h
|
||||
@@ -368,7 +368,7 @@ void demand_conf(void); /* config interf
|
||||
@@ -370,7 +370,7 @@ void demand_conf(void); /* config interf
|
||||
void demand_block(void); /* set all NPs to queue up packets */
|
||||
void demand_unblock(void); /* set all NPs to pass packets */
|
||||
void demand_discard(void); /* set all NPs to discard packets */
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/pppd/plugins/radius/config.c
|
||||
+++ b/pppd/plugins/radius/config.c
|
||||
@@ -381,31 +381,37 @@ static int test_config(char *filename)
|
||||
@@ -379,31 +379,37 @@ static int test_config(char *filename)
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
}
|
||||
--- a/pppd/plugins/radius/options.h
|
||||
+++ b/pppd/plugins/radius/options.h
|
||||
@@ -31,24 +31,21 @@ typedef struct _option {
|
||||
@@ -29,24 +29,21 @@ typedef struct _option {
|
||||
static SERVER acctserver = {0};
|
||||
static SERVER authserver = {0};
|
||||
|
||||
|
@ -12,13 +12,13 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
--- a/pppd/main.c
|
||||
+++ b/pppd/main.c
|
||||
@@ -1152,7 +1152,8 @@ get_input(void)
|
||||
@@ -1150,7 +1150,8 @@ get_input(void)
|
||||
}
|
||||
notice("Modem hangup");
|
||||
hungup = 1;
|
||||
- code = EXIT_HANGUP;
|
||||
+ if (code == EXIT_OK)
|
||||
+ code = EXIT_HANGUP;
|
||||
need_holdoff = 0;
|
||||
lcp_lowerdown(0); /* serial link is no longer available */
|
||||
link_terminated(0);
|
||||
return;
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
#
|
||||
# SunOS provides a version of libpcap that would work, but SunOS has no support for activity filter
|
||||
AM_CONDITIONAL([PPP_WITH_FILTER], [ test "x${with_pcap}" = "xyes" && test "x${build_sunos}" != "xyes" ])
|
||||
@@ -359,6 +362,7 @@ $PACKAGE_NAME version $PACKAGE_VERSION
|
||||
@@ -348,6 +351,7 @@ $PACKAGE_NAME version $PACKAGE_VERSION
|
||||
With libatm..........: ${with_atm:-no}
|
||||
With libpam..........: ${with_pam:-no}
|
||||
With libpcap.........: ${with_pcap:-no}
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
Linker...............: $LD $LDFLAGS $LIBS
|
||||
--- a/pppd/Makefile.am
|
||||
+++ b/pppd/Makefile.am
|
||||
@@ -138,6 +138,12 @@ pppd_LDFLAGS += $(PCAP_LDFLAGS)
|
||||
@@ -137,6 +137,12 @@ pppd_LDFLAGS += $(PCAP_LDFLAGS)
|
||||
pppd_LIBS += $(PCAP_LIBS)
|
||||
endif
|
||||
|
||||
|
@ -8,7 +8,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
2 files changed, 53 insertions(+), 14 deletions(-)
|
||||
--- a/pppd/multilink.c
|
||||
+++ b/pppd/multilink.c
|
||||
@@ -40,6 +40,7 @@
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <signal.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
@ -16,7 +16,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
|
||||
#include "pppd-private.h"
|
||||
#include "fsm.h"
|
||||
@@ -62,7 +63,8 @@ static void iterate_bundle_links(void (*
|
||||
@@ -58,7 +59,8 @@ static void iterate_bundle_links(void (*
|
||||
|
||||
static int get_default_epdisc(struct epdisc *);
|
||||
static int parse_num(char *str, const char *key, int *valp);
|
||||
@ -26,7 +26,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
|
||||
#define set_ip_epdisc(ep, addr) do { \
|
||||
ep->length = 4; \
|
||||
@@ -215,35 +217,38 @@ mp_join_bundle(void)
|
||||
@@ -211,35 +213,38 @@ mp_join_bundle(void)
|
||||
key.dptr = bundle_id;
|
||||
key.dsize = p - bundle_id;
|
||||
pid = tdb_fetch(pppdb, key);
|
||||
@ -73,7 +73,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
}
|
||||
|
||||
/* we have to make a new bundle */
|
||||
@@ -423,20 +428,39 @@ parse_num(char *str, const char *key, in
|
||||
@@ -419,20 +424,39 @@ parse_num(char *str, const char *key, in
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -119,7 +119,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
&& memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
|
||||
--- a/pppd/sys-linux.c
|
||||
+++ b/pppd/sys-linux.c
|
||||
@@ -984,6 +984,16 @@ void cfg_bundle(int mrru, int mtru, int
|
||||
@@ -980,6 +980,16 @@ void cfg_bundle(int mrru, int mtru, int
|
||||
add_fd(ppp_dev_fd);
|
||||
}
|
||||
|
||||
@ -136,7 +136,7 @@ Signed-off-by: George Kashperko <george@znau.edu.ua>
|
||||
/*
|
||||
* make_new_bundle - create a new PPP unit (i.e. a bundle)
|
||||
* and connect our channel to it. This should only get called
|
||||
@@ -1002,6 +1012,8 @@ void make_new_bundle(int mrru, int mtru,
|
||||
@@ -998,6 +1008,8 @@ void make_new_bundle(int mrru, int mtru,
|
||||
|
||||
/* set the mrru and flags */
|
||||
cfg_bundle(mrru, mtru, rssn, tssn);
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
--- a/pppd/sys-linux.c
|
||||
+++ b/pppd/sys-linux.c
|
||||
@@ -2251,6 +2251,9 @@ int sifdefaultroute (int unit, u_int32_t
|
||||
@@ -2247,6 +2247,9 @@ int sifdefaultroute (int unit, u_int32_t
|
||||
memset (&rt, 0, sizeof (rt));
|
||||
SET_SA_FAMILY (rt.rt_dst, AF_INET);
|
||||
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
rt.rt_dev = ifname;
|
||||
rt.rt_metric = dfl_route_metric + 1; /* +1 for binary compatibility */
|
||||
|
||||
@@ -2259,7 +2262,7 @@ int sifdefaultroute (int unit, u_int32_t
|
||||
@@ -2255,7 +2258,7 @@ int sifdefaultroute (int unit, u_int32_t
|
||||
SIN_ADDR(rt.rt_genmask) = 0L;
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
--- a/pppd/sys-linux.c
|
||||
+++ b/pppd/sys-linux.c
|
||||
@@ -224,14 +224,10 @@ static fd_set in_fds; /* set of fds tha
|
||||
@@ -220,14 +220,10 @@ static fd_set in_fds; /* set of fds tha
|
||||
static int max_in_fd; /* highest fd set in in_fds */
|
||||
|
||||
static int has_proxy_arp = 0;
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
static char loop_name[20];
|
||||
static unsigned char inbuf[512]; /* buffer for chars read from loopback */
|
||||
@@ -249,9 +245,8 @@ static int dynaddr_set; /* 1 if ip_dyna
|
||||
@@ -245,9 +241,8 @@ static int dynaddr_set; /* 1 if ip_dyna
|
||||
static int looped; /* 1 if using loop */
|
||||
static int link_mtu; /* mtu for the link (not bundle) */
|
||||
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
#define MAX_IFS 100
|
||||
|
||||
@@ -1970,11 +1965,12 @@ int ccp_fatal_error (int unit)
|
||||
@@ -1966,11 +1961,12 @@ int ccp_fatal_error (int unit)
|
||||
*
|
||||
* path_to_procfs - find the path to the proc file system mount point
|
||||
*/
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
struct mntent *mntent;
|
||||
FILE *fp;
|
||||
|
||||
@@ -1996,6 +1992,7 @@ static char *path_to_procfs(const char *
|
||||
@@ -1992,6 +1988,7 @@ static char *path_to_procfs(const char *
|
||||
fclose (fp);
|
||||
}
|
||||
}
|
||||
@ -60,7 +60,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
strlcpy(proc_path + proc_path_len, tail,
|
||||
sizeof(proc_path) - proc_path_len);
|
||||
@@ -2889,6 +2886,8 @@ ppp_registered(void)
|
||||
@@ -2883,6 +2880,8 @@ ppp_registered(void)
|
||||
|
||||
int ppp_check_kernel_support(void)
|
||||
{
|
||||
@ -69,7 +69,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
int s, ok, fd;
|
||||
struct ifreq ifr;
|
||||
int size;
|
||||
@@ -3016,6 +3015,7 @@ int ppp_check_kernel_support(void)
|
||||
@@ -3010,6 +3009,7 @@ int ppp_check_kernel_support(void)
|
||||
}
|
||||
close(s);
|
||||
return ok;
|
||||
@ -77,7 +77,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
}
|
||||
|
||||
#ifndef HAVE_LOGWTMP
|
||||
@@ -3577,6 +3577,7 @@ get_pty(int *master_fdp, int *slave_fdp,
|
||||
@@ -3571,6 +3571,7 @@ get_pty(int *master_fdp, int *slave_fdp,
|
||||
}
|
||||
#endif /* TIOCGPTN */
|
||||
|
||||
@ -85,7 +85,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
if (sfd < 0) {
|
||||
/* the old way - scan through the pty name space */
|
||||
for (i = 0; i < 64; ++i) {
|
||||
@@ -3601,6 +3602,7 @@ get_pty(int *master_fdp, int *slave_fdp,
|
||||
@@ -3595,6 +3596,7 @@ get_pty(int *master_fdp, int *slave_fdp,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -93,7 +93,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
if (sfd < 0)
|
||||
return 0;
|
||||
@@ -3716,6 +3718,7 @@ get_host_seed(void)
|
||||
@@ -3710,6 +3712,7 @@ get_host_seed(void)
|
||||
int
|
||||
sys_check_options(void)
|
||||
{
|
||||
@ -101,7 +101,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
if (demand && driver_is_old) {
|
||||
ppp_option_error("demand dialling is not supported by kernel driver "
|
||||
"version %d.%d.%d", driver_version, driver_modification,
|
||||
@@ -3726,6 +3729,7 @@ sys_check_options(void)
|
||||
@@ -3720,6 +3723,7 @@ sys_check_options(void)
|
||||
warn("Warning: multilink is not supported by the kernel driver");
|
||||
multilink = 0;
|
||||
}
|
||||
@ -124,7 +124,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
#endif
|
||||
--- a/pppd/plugins/pppoe/plugin.c
|
||||
+++ b/pppd/plugins/pppoe/plugin.c
|
||||
@@ -57,9 +57,6 @@ static char const RCSID[] =
|
||||
@@ -54,9 +54,6 @@
|
||||
|
||||
char pppd_version[] = PPPD_VERSION;
|
||||
|
||||
@ -134,7 +134,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
char *pppd_pppoe_service = NULL;
|
||||
static char *acName = NULL;
|
||||
static char *existingSession = NULL;
|
||||
@@ -421,10 +418,6 @@ PPPoEDevnameHook(char *cmd, char **argv,
|
||||
@@ -418,10 +415,6 @@ PPPoEDevnameHook(char *cmd, char **argv,
|
||||
void
|
||||
plugin_init(void)
|
||||
{
|
||||
|
@ -7,7 +7,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
--- a/pppd/pppd-private.h
|
||||
+++ b/pppd/pppd-private.h
|
||||
@@ -187,7 +187,6 @@ extern int holdoff; /* Dead time before
|
||||
@@ -189,7 +189,6 @@ extern int holdoff; /* Dead time before
|
||||
extern bool holdoff_specified; /* true if user gave a holdoff value */
|
||||
extern bool notty; /* Stdin/out is not a tty */
|
||||
extern char *pty_socket; /* Socket to connect to pty */
|
||||
@ -17,7 +17,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
extern bool tune_kernel; /* May alter kernel settings as necessary */
|
||||
--- a/pppd/tty.c
|
||||
+++ b/pppd/tty.c
|
||||
@@ -150,7 +150,7 @@ char *disconnect_script = NULL; /* Scrip
|
||||
@@ -146,7 +146,7 @@ char *disconnect_script = NULL; /* Scrip
|
||||
char *welcomer = NULL; /* Script to run after phys link estab. */
|
||||
char *ptycommand = NULL; /* Command to run on other side of pty */
|
||||
bool notty = 0; /* Stdin/out is not a tty */
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
int max_data_rate; /* max bytes/sec through charshunt */
|
||||
bool sync_serial = 0; /* Device is synchronous serial device */
|
||||
char *pty_socket = NULL; /* Socket to connect to pty */
|
||||
@@ -206,8 +206,10 @@ static struct option tty_options[] = {
|
||||
@@ -202,8 +202,10 @@ static struct option tty_options[] = {
|
||||
"Send and receive over socket, arg is host:port",
|
||||
OPT_PRIO | OPT_DEVNAM },
|
||||
|
||||
|
@ -7,7 +7,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
|
||||
--- a/pppd/main.c
|
||||
+++ b/pppd/main.c
|
||||
@@ -984,14 +984,17 @@ struct protocol_list {
|
||||
@@ -982,14 +982,17 @@ struct protocol_list {
|
||||
const char *name;
|
||||
} protocol_list[] = {
|
||||
{ 0x21, "IP" },
|
||||
@ -25,7 +25,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x33, "Stream Protocol ST-II" },
|
||||
{ 0x35, "Banyan Vines" },
|
||||
{ 0x39, "AppleTalk EDDP" },
|
||||
@@ -1005,8 +1008,11 @@ struct protocol_list {
|
||||
@@ -1003,8 +1006,11 @@ struct protocol_list {
|
||||
{ 0x49, "Serial Data Transport Protocol (PPP-SDTP)" },
|
||||
{ 0x4b, "SNA over 802.2" },
|
||||
{ 0x4d, "SNA" },
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x53, "Encryption" },
|
||||
{ 0x55, "Individual Link Encryption" },
|
||||
{ 0x57, "IPv6" },
|
||||
@@ -1017,12 +1023,15 @@ struct protocol_list {
|
||||
@@ -1015,12 +1021,15 @@ struct protocol_list {
|
||||
{ 0x65, "RTP IPHC Compressed non-TCP" },
|
||||
{ 0x67, "RTP IPHC Compressed UDP 8" },
|
||||
{ 0x69, "RTP IPHC Compressed RTP 8" },
|
||||
@ -53,7 +53,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x0203, "IBM Source Routing BPDU" },
|
||||
{ 0x0205, "DEC LANBridge100 Spanning Tree" },
|
||||
{ 0x0207, "Cisco Discovery Protocol" },
|
||||
@@ -1034,15 +1043,19 @@ struct protocol_list {
|
||||
@@ -1032,15 +1041,19 @@ struct protocol_list {
|
||||
{ 0x0231, "Luxcom" },
|
||||
{ 0x0233, "Sigma Network Systems" },
|
||||
{ 0x0235, "Apple Client Server Protocol" },
|
||||
@ -73,7 +73,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x4001, "Cray Communications Control Protocol" },
|
||||
{ 0x4003, "CDPD Mobile Network Registration Protocol" },
|
||||
{ 0x4005, "Expand accelerator protocol" },
|
||||
@@ -1053,8 +1066,10 @@ struct protocol_list {
|
||||
@@ -1051,8 +1064,10 @@ struct protocol_list {
|
||||
{ 0x4023, "RefTek Protocol" },
|
||||
{ 0x4025, "Fibre Channel" },
|
||||
{ 0x4027, "EMIT Protocols" },
|
||||
@ -84,7 +84,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x8023, "OSI Network Layer Control Protocol" },
|
||||
{ 0x8025, "Xerox NS IDP Control Protocol" },
|
||||
{ 0x8027, "DECnet Phase IV Control Protocol" },
|
||||
@@ -1063,7 +1078,9 @@ struct protocol_list {
|
||||
@@ -1061,7 +1076,9 @@ struct protocol_list {
|
||||
{ 0x8031, "Bridging NCP" },
|
||||
{ 0x8033, "Stream Protocol Control Protocol" },
|
||||
{ 0x8035, "Banyan Vines Control Protocol" },
|
||||
@ -94,7 +94,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x803f, "NETBIOS Framing Control Protocol" },
|
||||
{ 0x8041, "Cisco Systems Control Protocol" },
|
||||
{ 0x8043, "Ascom Timeplex" },
|
||||
@@ -1072,18 +1089,24 @@ struct protocol_list {
|
||||
@@ -1070,18 +1087,24 @@ struct protocol_list {
|
||||
{ 0x8049, "Serial Data Control Protocol (PPP-SDCP)" },
|
||||
{ 0x804b, "SNA over 802.2 Control Protocol" },
|
||||
{ 0x804d, "SNA Control Protocol" },
|
||||
@ -119,7 +119,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
||||
{ 0x8207, "Cisco Discovery Protocol Control" },
|
||||
{ 0x8209, "Netcs Twin Routing" },
|
||||
{ 0x820b, "STP - Control Protocol" },
|
||||
@@ -1092,24 +1115,29 @@ struct protocol_list {
|
||||
@@ -1090,24 +1113,29 @@ struct protocol_list {
|
||||
{ 0x8281, "MPLSCP" },
|
||||
{ 0x8285, "IEEE p1284.4 standard - Protocol Control" },
|
||||
{ 0x8287, "ETSI TETRA TNP1 Control Protocol" },
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -344,6 +344,7 @@ AC_CONFIG_FILES([
|
||||
@@ -333,6 +333,7 @@ AC_CONFIG_FILES([
|
||||
pppd/plugins/pppoatm/Makefile
|
||||
pppd/plugins/pppol2tp/Makefile
|
||||
pppd/plugins/radius/Makefile
|
||||
@ -10,7 +10,7 @@
|
||||
scripts/Makefile
|
||||
--- a/pppd/plugins/Makefile.am
|
||||
+++ b/pppd/plugins/Makefile.am
|
||||
@@ -21,5 +21,5 @@ winbind_la_LDFLAGS = $(PLUGIN_LDFLAGS)
|
||||
@@ -17,5 +17,5 @@ winbind_la_LDFLAGS = $(PLUGIN_LDFLAGS)
|
||||
winbind_la_SOURCES = winbind.c
|
||||
|
||||
if !SUNOS
|
||||
|
@ -481,6 +481,7 @@ define Device/tplink_tl-wr941-v2
|
||||
$(Device/tplink-4m)
|
||||
SOC := ar9132
|
||||
DEVICE_MODEL := TL-WR941ND
|
||||
DEVICE_PACKAGES := kmod-dsa-mv88e6060
|
||||
DEVICE_VARIANT := v2/v3
|
||||
DEVICE_ALT0_VENDOR := TP-Link
|
||||
DEVICE_ALT0_MODEL := TL-WR941N
|
||||
|
@ -0,0 +1,104 @@
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Tue, 2 Jan 2025 19:22:40 +0100
|
||||
Subject: [PATCH] reset: ath79: reset ETH switch for AR9344
|
||||
|
||||
According to datasheet, on AR9344 the switch and switch analog need to
|
||||
be reset first before initiating a full reset.
|
||||
|
||||
Resetting these systems fixes spurious reset hangs on Atheros AR9344
|
||||
SoCs.
|
||||
|
||||
Link: https://github.com/freifunk-gluon/gluon/issues/2904
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/drivers/reset/reset-ath79.c
|
||||
+++ b/drivers/reset/reset-ath79.c
|
||||
@@ -12,8 +12,11 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/reboot.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
struct ath79_reset {
|
||||
+ struct platform_device *pdev;
|
||||
struct reset_controller_dev rcdev;
|
||||
struct notifier_block restart_nb;
|
||||
void __iomem *base;
|
||||
@@ -21,16 +24,13 @@ struct ath79_reset {
|
||||
};
|
||||
|
||||
#define FULL_CHIP_RESET 24
|
||||
+#define ETH_SWITCH_RESET 8
|
||||
+#define ETH_SWITCH_ARESET 12
|
||||
|
||||
-static int ath79_reset_update(struct reset_controller_dev *rcdev,
|
||||
+static void __ath79_reset_update_unlocked(struct ath79_reset *ath79_reset,
|
||||
unsigned long id, bool assert)
|
||||
{
|
||||
- struct ath79_reset *ath79_reset =
|
||||
- container_of(rcdev, struct ath79_reset, rcdev);
|
||||
- unsigned long flags;
|
||||
u32 val;
|
||||
-
|
||||
- spin_lock_irqsave(&ath79_reset->lock, flags);
|
||||
val = readl(ath79_reset->base);
|
||||
if (assert)
|
||||
val |= BIT(id);
|
||||
@@ -39,6 +39,17 @@ static int ath79_reset_update(struct res
|
||||
writel(val, ath79_reset->base);
|
||||
/* Flush cache */
|
||||
readl(ath79_reset->base);
|
||||
+}
|
||||
+
|
||||
+static int ath79_reset_update(struct reset_controller_dev *rcdev,
|
||||
+ unsigned long id, bool assert)
|
||||
+{
|
||||
+ struct ath79_reset *ath79_reset =
|
||||
+ container_of(rcdev, struct ath79_reset, rcdev);
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ spin_lock_irqsave(&ath79_reset->lock, flags);
|
||||
+ __ath79_reset_update_unlocked(ath79_reset, id, assert);
|
||||
spin_unlock_irqrestore(&ath79_reset->lock, flags);
|
||||
|
||||
return 0;
|
||||
@@ -79,8 +90,27 @@ static int ath79_reset_restart_handler(s
|
||||
{
|
||||
struct ath79_reset *ath79_reset =
|
||||
container_of(nb, struct ath79_reset, restart_nb);
|
||||
+ unsigned long flags;
|
||||
|
||||
- ath79_reset_assert(&ath79_reset->rcdev, FULL_CHIP_RESET);
|
||||
+ spin_lock_irqsave(&ath79_reset->lock, flags);
|
||||
+
|
||||
+ if (of_device_is_compatible(ath79_reset->pdev->dev.of_node, "qca,ar9340-reset")) {
|
||||
+ /**
|
||||
+ * AR9344 has been observed to hang on reboot in rare cases.
|
||||
+ *
|
||||
+ * Datasheet states to reset the ETH switch systems before asserting
|
||||
+ * full chip reset. See page 111 of the AR9344 datasheet.
|
||||
+ */
|
||||
+ __ath79_reset_update_unlocked(ath79_reset, ETH_SWITCH_RESET, true);
|
||||
+ mdelay(10);
|
||||
+ __ath79_reset_update_unlocked(ath79_reset, ETH_SWITCH_ARESET, true);
|
||||
+ mdelay(10);
|
||||
+ }
|
||||
+
|
||||
+ __ath79_reset_update_unlocked(ath79_reset, FULL_CHIP_RESET, true);
|
||||
+ mdelay(10);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&ath79_reset->lock, flags);
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
@@ -95,6 +125,8 @@ static int ath79_reset_probe(struct plat
|
||||
if (!ath79_reset)
|
||||
return -ENOMEM;
|
||||
|
||||
+ ath79_reset->pdev = pdev;
|
||||
+
|
||||
ath79_reset->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(ath79_reset->base))
|
||||
return PTR_ERR(ath79_reset->base);
|
@ -13,7 +13,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
|
||||
|
||||
--- a/drivers/leds/Kconfig
|
||||
+++ b/drivers/leds/Kconfig
|
||||
@@ -901,6 +901,17 @@ source "drivers/leds/flash/Kconfig"
|
||||
@@ -911,6 +911,17 @@ source "drivers/leds/flash/Kconfig"
|
||||
comment "RGB LED drivers"
|
||||
source "drivers/leds/rgb/Kconfig"
|
||||
|
||||
@ -176,7 +176,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
|
||||
+MODULE_ALIAS("platform:leds-reset");
|
||||
--- a/drivers/leds/Makefile
|
||||
+++ b/drivers/leds/Makefile
|
||||
@@ -88,6 +88,7 @@ obj-$(CONFIG_LEDS_TURRIS_OMNIA) += leds
|
||||
@@ -89,6 +89,7 @@ obj-$(CONFIG_LEDS_TURRIS_OMNIA) += leds
|
||||
obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
|
||||
obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
|
||||
obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
|
||||
|
@ -1,9 +1,6 @@
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_MV88E6060=y
|
||||
CONFIG_NET_DSA_TAG_TRAILER=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_NVMEM_U_BOOT_ENV=y
|
||||
|
@ -239,7 +239,7 @@ CONFIG_FB_DEVICE=y
|
||||
CONFIG_FB_IOMEM_FOPS=y
|
||||
CONFIG_FB_IOMEM_HELPERS=y
|
||||
CONFIG_FB_SIMPLE=y
|
||||
CONFIG_FIRMWARE_RP1=y
|
||||
# CONFIG_FIRMWARE_RP1 is not set
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FONT_8x16=y
|
||||
@ -372,7 +372,7 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MBOX_RP1=y
|
||||
# CONFIG_MBOX_RP1 is not set
|
||||
CONFIG_MDIO_BCM_UNIMAC=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
@ -537,7 +537,7 @@ CONFIG_RESET_RASPBERRYPI=y
|
||||
CONFIG_RESET_SIMPLE=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||
CONFIG_RP1_PIO=y
|
||||
# CONFIG_RP1_PIO is not set
|
||||
# CONFIG_RPI_POE_POWER is not set
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
@ -550,7 +550,7 @@ CONFIG_SCSI_COMMON=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SENSORS_RASPBERRYPI_HWMON=y
|
||||
CONFIG_SENSORS_RP1_ADC=y
|
||||
# CONFIG_SENSORS_RP1_ADC is not set
|
||||
CONFIG_SERIAL_8250_BCM2835AUX=y
|
||||
CONFIG_SERIAL_8250_BCM7271=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
|
@ -2,6 +2,23 @@
|
||||
#
|
||||
# Copyright (C) 2019 OpenWrt.org
|
||||
|
||||
define KernelPackage/rp1-adc
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 ADC and temperature sensor driver
|
||||
KCONFIG:=CONFIG_SENSORS_RP1_ADC
|
||||
FILES:=$(LINUX_DIR)/drivers/hwmon/rp1-adc.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-adc)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-adc/description
|
||||
Kernel module for RP1 silicon providing ADC and
|
||||
temperature monitoring.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-adc))
|
||||
|
||||
|
||||
define KernelPackage/hwmon-raspberrypi
|
||||
TITLE:=Raspberry Pi voltage monitor
|
||||
KCONFIG:=CONFIG_SENSORS_RASPBERRYPI_HWMON
|
||||
|
@ -55,13 +55,46 @@ endef
|
||||
$(eval $(call KernelPackage,smi-bcm2835-dev))
|
||||
|
||||
|
||||
define KernelPackage/rp1
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 firmware
|
||||
KCONFIG:=CONFIG_FIRMWARE_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/firmware/rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1/description
|
||||
This driver provides a firmware interface to the RP1 processor using shared
|
||||
memory and a mailbox.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1))
|
||||
|
||||
|
||||
define KernelPackage/rp1-pio
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 PIO block support
|
||||
KCONFIG:=CONFIG_RP1_PIO
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/rp1-pio.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-pio)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-pio/description
|
||||
Driver providing control of the Raspberry Pi PIO block, as found in RP1
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-pio))
|
||||
|
||||
|
||||
define KernelPackage/pwm-pio-rp1
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 PWM support
|
||||
KCONFIG:=CONFIG_PWM_PIO_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/pwm/pwm-pio-rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,pwm-pio-rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/pwm-pio-rp1/description
|
||||
@ -80,7 +113,7 @@ define KernelPackage/ws2812-pio-rp1
|
||||
KCONFIG:=CONFIG_WS2812_PIO_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/ws2812-pio-rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,ws2812-pio-rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/ws2812-pio-rp1/description
|
||||
@ -90,3 +123,19 @@ define KernelPackage/ws2812-pio-rp1/description
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,ws2812-pio-rp1))
|
||||
|
||||
|
||||
define KernelPackage/rp1-mailbox
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 mailbox IPC driver
|
||||
KCONFIG:=CONFIG_MBOX_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/mailbox/rp1-mailbox.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-mailbox)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-mailbox/description
|
||||
This is a RP1 mailbox IPC driver.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-mailbox))
|
||||
|
@ -175,7 +175,7 @@ define KernelPackage/drm-rp1-dpi
|
||||
CONFIG_DRM_TTM_HELPER=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/rp1/rp1-dpi/drm-rp1-dpi.ko
|
||||
AUTOLOAD:=$(call AutoLoad,67,drm-rp1-dpi)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-drm-vc4
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-drm-vc4 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/drm-rp1-dpi/description
|
||||
|
@ -71,11 +71,6 @@ bcm53xx_setup_macs()
|
||||
etXmacaddr=$(nvram get et0macaddr)
|
||||
offset=5
|
||||
;;
|
||||
meraki,mr26)
|
||||
label_mac="$(mtd_get_mac_binary_ubi board-config 0x66)"
|
||||
ucidef_set_interface_macaddr "lan" "$label_mac"
|
||||
ucidef_set_label_macaddr "$label_mac"
|
||||
;;
|
||||
meraki,mx64 | \
|
||||
meraki,mx64-a0 | \
|
||||
meraki,mx65)
|
||||
|
@ -1,18 +0,0 @@
|
||||
#!/bin/ash
|
||||
|
||||
[ "$ACTION" = "add" ] || exit 0
|
||||
|
||||
PHYNBR=${DEVPATH##*/phy}
|
||||
|
||||
[ -n $PHYNBR ] || exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
meraki,mr26)
|
||||
macaddr_add "$(macaddr_setbit_la $(mtd_get_mac_binary_ubi 'board-config' 0x66))" $(($PHYNBR * 8 + 1)) > /sys${DEVPATH}/macaddress
|
||||
;;
|
||||
esac
|
@ -0,0 +1,52 @@
|
||||
From ad1915e2070cf832bfb81dcbeb44b073c09e6dcc Mon Sep 17 00:00:00 2001
|
||||
From: Rosen Penev <rosenp@gmail.com>
|
||||
Date: Sun, 20 Oct 2024 18:51:47 -0700
|
||||
Subject: [PATCH] ARM: dts: meraki-mr26: set mac address for gmac0
|
||||
|
||||
Currently this needs to be done in userspace.
|
||||
|
||||
Signed-off-by: Rosen Penev <rosenp@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20241021015147.172700-1-rosenp@gmail.com
|
||||
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||
---
|
||||
.../dts/broadcom/bcm53015-meraki-mr26.dts | 20 +++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts
|
||||
+++ b/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts
|
||||
@@ -59,6 +59,9 @@
|
||||
|
||||
&gmac0 {
|
||||
status = "okay";
|
||||
+
|
||||
+ nvmem-cells = <&macaddr_board_config_66>;
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
&gmac1 {
|
||||
@@ -102,8 +105,25 @@
|
||||
};
|
||||
|
||||
partition@800000 {
|
||||
+ compatible = "linux,ubi";
|
||||
label = "ubi";
|
||||
reg = <0x800000 0x7780000>;
|
||||
+
|
||||
+ volumes {
|
||||
+ ubi-volume-board-config {
|
||||
+ volname = "board-config";
|
||||
+
|
||||
+ nvmem-layout {
|
||||
+ compatible = "fixed-layout";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ macaddr_board_config_66: macaddr@66 {
|
||||
+ reg = <0x66 0x6>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
@ -0,0 +1,67 @@
|
||||
From c18e0b14b466fb0aa17c8ca6e61f16ba1254aebd Mon Sep 17 00:00:00 2001
|
||||
From: Rosen Penev <rosenp@gmail.com>
|
||||
Date: Sun, 24 Nov 2024 12:58:51 -0800
|
||||
Subject: [PATCH] ARM: dts: meraki-mr26: wifi MACs in dts
|
||||
|
||||
OPENWRT HACK. Probably will not be accepted upstream.
|
||||
|
||||
Signed-off-by: Rosen Penev <rosenp@gmail.com>
|
||||
---
|
||||
.../dts/broadcom/bcm53015-meraki-mr26.dts | 31 ++++++++++++++++++-
|
||||
1 file changed, 30 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts
|
||||
+++ b/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts
|
||||
@@ -60,7 +60,7 @@
|
||||
&gmac0 {
|
||||
status = "okay";
|
||||
|
||||
- nvmem-cells = <&macaddr_board_config_66>;
|
||||
+ nvmem-cells = <&macaddr_board_config_66 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
@@ -74,6 +74,33 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+&pcie0 {
|
||||
+ wifi@0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ compatible = "brcm,bcm43431";
|
||||
+ nvmem-cells = <&macaddr_board_config_66 1>;
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ wifi@0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ compatible = "brcm,bcm43431";
|
||||
+ nvmem-cells = <&macaddr_board_config_66 2>;
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ wifi@0,0 {
|
||||
+ reg = <0x0000 0 0 0 0>;
|
||||
+ compatible = "brcm,bcm43428";
|
||||
+ nvmem-cells = <&macaddr_board_config_66 3>;
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&nandcs {
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
@@ -119,7 +146,9 @@
|
||||
#size-cells = <1>;
|
||||
|
||||
macaddr_board_config_66: macaddr@66 {
|
||||
+ compatible = "mac-base";
|
||||
reg = <0x66 0x6>;
|
||||
+ #nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
@ -40,6 +40,6 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
|
||||
obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o
|
||||
+obj-$(CONFIG_LEDS_SERCOMM_MSP430) += leds-sercomm-msp430.o
|
||||
obj-$(CONFIG_LEDS_ST1202) += leds-st1202.o
|
||||
obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o
|
||||
obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o
|
||||
obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 1ffcc8d41306fd2e5f140b276820714a26a11cc4 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Mon, 7 Oct 2024 20:34:12 +0200
|
||||
Subject: [PATCH] r8169: add support for the temperature sensor being available
|
||||
from RTL8125B
|
||||
|
||||
This adds support for the temperature sensor being available from
|
||||
RTL8125B. Register information was taken from r8125 vendor driver.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 44 +++++++++++++++++++++++
|
||||
1 file changed, 44 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ethtool.h>
|
||||
+#include <linux/hwmon.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/in.h>
|
||||
@@ -5373,6 +5374,43 @@ static bool rtl_aspm_is_safe(struct rtl8
|
||||
return false;
|
||||
}
|
||||
|
||||
+static umode_t r8169_hwmon_is_visible(const void *drvdata,
|
||||
+ enum hwmon_sensor_types type,
|
||||
+ u32 attr, int channel)
|
||||
+{
|
||||
+ return 0444;
|
||||
+}
|
||||
+
|
||||
+static int r8169_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
+ u32 attr, int channel, long *val)
|
||||
+{
|
||||
+ struct rtl8169_private *tp = dev_get_drvdata(dev);
|
||||
+ int val_raw;
|
||||
+
|
||||
+ val_raw = phy_read_paged(tp->phydev, 0xbd8, 0x12) & 0x3ff;
|
||||
+ if (val_raw >= 512)
|
||||
+ val_raw -= 1024;
|
||||
+
|
||||
+ *val = 1000 * val_raw / 2;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct hwmon_ops r8169_hwmon_ops = {
|
||||
+ .is_visible = r8169_hwmon_is_visible,
|
||||
+ .read = r8169_hwmon_read,
|
||||
+};
|
||||
+
|
||||
+static const struct hwmon_channel_info * const r8169_hwmon_info[] = {
|
||||
+ HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
+static const struct hwmon_chip_info r8169_hwmon_chip_info = {
|
||||
+ .ops = &r8169_hwmon_ops,
|
||||
+ .info = r8169_hwmon_info,
|
||||
+};
|
||||
+
|
||||
static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct rtl8169_private *tp;
|
||||
@@ -5547,6 +5585,12 @@ static int rtl_init_one(struct pci_dev *
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
+ /* The temperature sensor is available from RTl8125B */
|
||||
+ if (IS_REACHABLE(CONFIG_HWMON) && tp->mac_version >= RTL_GIGA_MAC_VER_63)
|
||||
+ /* ignore errors */
|
||||
+ devm_hwmon_device_register_with_info(&pdev->dev, "nic_temp", tp,
|
||||
+ &r8169_hwmon_chip_info,
|
||||
+ NULL);
|
||||
rc = register_netdev(dev);
|
||||
if (rc)
|
||||
return rc;
|
@ -0,0 +1,33 @@
|
||||
From 854d71c555dfc3383c1fde7d9989b6046e21093d Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 9 Oct 2024 07:48:05 +0200
|
||||
Subject: [PATCH] r8169: remove original workaround for RTL8125 broken rx issue
|
||||
|
||||
Now that we have b9c7ac4fe22c ("r8169: disable ALDPS per default for
|
||||
RTL8125"), the first attempt to fix the issue shouldn't be needed
|
||||
any longer. So let's effectively revert 621735f59064 ("r8169: fix
|
||||
rare issue with broken rx after link-down on RTL8125") and see
|
||||
whether anybody complains.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/382d8c88-cbce-400f-ad62-fda0181c7e38@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -4779,11 +4779,7 @@ static void r8169_phylink_handler(struct
|
||||
if (netif_carrier_ok(ndev)) {
|
||||
rtl_link_chg_patch(tp);
|
||||
pm_request_resume(d);
|
||||
- netif_wake_queue(tp->dev);
|
||||
} else {
|
||||
- /* In few cases rx is broken after link-down otherwise */
|
||||
- if (rtl_is_8125(tp))
|
||||
- rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE);
|
||||
pm_runtime_idle(d);
|
||||
}
|
||||
|
@ -0,0 +1,52 @@
|
||||
From b8bf38440ba94e8ed8e2ae55c5dfb0276d30e843 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 10 Oct 2024 12:58:02 +0200
|
||||
Subject: [PATCH] r8169: enable SG/TSO on selected chip versions per default
|
||||
|
||||
Due to problem reports in the past SG and TSO/TSO6 are disabled per
|
||||
default. It's not fully clear which chip versions are affected, so we
|
||||
may impact also users of unaffected chip versions, unless they know
|
||||
how to use ethtool for enabling SG/TSO/TSO6.
|
||||
Vendor drivers r8168/r8125 enable SG/TSO/TSO6 for selected chip
|
||||
versions per default, I'd interpret this as confirmation that these
|
||||
chip versions are unaffected. So let's do the same here.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -5529,11 +5529,6 @@ static int rtl_init_one(struct pci_dev *
|
||||
|
||||
dev->features |= dev->hw_features;
|
||||
|
||||
- /* There has been a number of reports that using SG/TSO results in
|
||||
- * tx timeouts. However for a lot of people SG/TSO works fine.
|
||||
- * Therefore disable both features by default, but allow users to
|
||||
- * enable them. Use at own risk!
|
||||
- */
|
||||
if (rtl_chip_supports_csum_v2(tp)) {
|
||||
dev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6;
|
||||
netif_set_tso_max_size(dev, RTL_GSO_MAX_SIZE_V2);
|
||||
@@ -5544,6 +5539,17 @@ static int rtl_init_one(struct pci_dev *
|
||||
netif_set_tso_max_segs(dev, RTL_GSO_MAX_SEGS_V1);
|
||||
}
|
||||
|
||||
+ /* There has been a number of reports that using SG/TSO results in
|
||||
+ * tx timeouts. However for a lot of people SG/TSO works fine.
|
||||
+ * It's not fully clear which chip versions are affected. Vendor
|
||||
+ * drivers enable SG/TSO for certain chip versions per default,
|
||||
+ * let's mimic this here. On other chip versions users can
|
||||
+ * use ethtool to enable SG/TSO, use at own risk!
|
||||
+ */
|
||||
+ if (tp->mac_version >= RTL_GIGA_MAC_VER_46 &&
|
||||
+ tp->mac_version != RTL_GIGA_MAC_VER_61)
|
||||
+ dev->features |= dev->hw_features;
|
||||
+
|
||||
dev->hw_features |= NETIF_F_RXALL;
|
||||
dev->hw_features |= NETIF_F_RXFCS;
|
||||
|
@ -0,0 +1,130 @@
|
||||
From e3fc5139bd8ffaa1498adc21be4e8ecbc6aed508 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Sun, 13 Oct 2024 11:17:39 +0200
|
||||
Subject: [PATCH] r8169: implement additional ethtool stats ops
|
||||
|
||||
This adds support for ethtool standard statistics, and makes use of the
|
||||
extended hardware statistics being available from RTl8125.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/58e0da73-a7dd-4be3-82ae-d5b3f9069bde@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 82 +++++++++++++++++++++++
|
||||
1 file changed, 82 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -2162,6 +2162,19 @@ static void rtl8169_get_ringparam(struct
|
||||
data->tx_pending = NUM_TX_DESC;
|
||||
}
|
||||
|
||||
+static void rtl8169_get_pause_stats(struct net_device *dev,
|
||||
+ struct ethtool_pause_stats *pause_stats)
|
||||
+{
|
||||
+ struct rtl8169_private *tp = netdev_priv(dev);
|
||||
+
|
||||
+ if (!rtl_is_8125(tp))
|
||||
+ return;
|
||||
+
|
||||
+ rtl8169_update_counters(tp);
|
||||
+ pause_stats->tx_pause_frames = le32_to_cpu(tp->counters->tx_pause_on);
|
||||
+ pause_stats->rx_pause_frames = le32_to_cpu(tp->counters->rx_pause_on);
|
||||
+}
|
||||
+
|
||||
static void rtl8169_get_pauseparam(struct net_device *dev,
|
||||
struct ethtool_pauseparam *data)
|
||||
{
|
||||
@@ -2188,6 +2201,69 @@ static int rtl8169_set_pauseparam(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void rtl8169_get_eth_mac_stats(struct net_device *dev,
|
||||
+ struct ethtool_eth_mac_stats *mac_stats)
|
||||
+{
|
||||
+ struct rtl8169_private *tp = netdev_priv(dev);
|
||||
+
|
||||
+ rtl8169_update_counters(tp);
|
||||
+
|
||||
+ mac_stats->FramesTransmittedOK =
|
||||
+ le64_to_cpu(tp->counters->tx_packets);
|
||||
+ mac_stats->SingleCollisionFrames =
|
||||
+ le32_to_cpu(tp->counters->tx_one_collision);
|
||||
+ mac_stats->MultipleCollisionFrames =
|
||||
+ le32_to_cpu(tp->counters->tx_multi_collision);
|
||||
+ mac_stats->FramesReceivedOK =
|
||||
+ le64_to_cpu(tp->counters->rx_packets);
|
||||
+ mac_stats->AlignmentErrors =
|
||||
+ le16_to_cpu(tp->counters->align_errors);
|
||||
+ mac_stats->FramesLostDueToIntMACXmitError =
|
||||
+ le64_to_cpu(tp->counters->tx_errors);
|
||||
+ mac_stats->BroadcastFramesReceivedOK =
|
||||
+ le64_to_cpu(tp->counters->rx_broadcast);
|
||||
+ mac_stats->MulticastFramesReceivedOK =
|
||||
+ le32_to_cpu(tp->counters->rx_multicast);
|
||||
+
|
||||
+ if (!rtl_is_8125(tp))
|
||||
+ return;
|
||||
+
|
||||
+ mac_stats->AlignmentErrors =
|
||||
+ le32_to_cpu(tp->counters->align_errors32);
|
||||
+ mac_stats->OctetsTransmittedOK =
|
||||
+ le64_to_cpu(tp->counters->tx_octets);
|
||||
+ mac_stats->LateCollisions =
|
||||
+ le32_to_cpu(tp->counters->tx_late_collision);
|
||||
+ mac_stats->FramesAbortedDueToXSColls =
|
||||
+ le32_to_cpu(tp->counters->tx_aborted32);
|
||||
+ mac_stats->OctetsReceivedOK =
|
||||
+ le64_to_cpu(tp->counters->rx_octets);
|
||||
+ mac_stats->FramesLostDueToIntMACRcvError =
|
||||
+ le32_to_cpu(tp->counters->rx_mac_error);
|
||||
+ mac_stats->MulticastFramesXmittedOK =
|
||||
+ le64_to_cpu(tp->counters->tx_multicast64);
|
||||
+ mac_stats->BroadcastFramesXmittedOK =
|
||||
+ le64_to_cpu(tp->counters->tx_broadcast64);
|
||||
+ mac_stats->MulticastFramesReceivedOK =
|
||||
+ le64_to_cpu(tp->counters->rx_multicast64);
|
||||
+ mac_stats->FrameTooLongErrors =
|
||||
+ le32_to_cpu(tp->counters->rx_frame_too_long);
|
||||
+}
|
||||
+
|
||||
+static void rtl8169_get_eth_ctrl_stats(struct net_device *dev,
|
||||
+ struct ethtool_eth_ctrl_stats *ctrl_stats)
|
||||
+{
|
||||
+ struct rtl8169_private *tp = netdev_priv(dev);
|
||||
+
|
||||
+ if (!rtl_is_8125(tp))
|
||||
+ return;
|
||||
+
|
||||
+ rtl8169_update_counters(tp);
|
||||
+
|
||||
+ ctrl_stats->UnsupportedOpcodesReceived =
|
||||
+ le32_to_cpu(tp->counters->rx_unknown_opcode);
|
||||
+}
|
||||
+
|
||||
static const struct ethtool_ops rtl8169_ethtool_ops = {
|
||||
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
|
||||
ETHTOOL_COALESCE_MAX_FRAMES,
|
||||
@@ -2209,8 +2285,11 @@ static const struct ethtool_ops rtl8169_
|
||||
.get_link_ksettings = phy_ethtool_get_link_ksettings,
|
||||
.set_link_ksettings = phy_ethtool_set_link_ksettings,
|
||||
.get_ringparam = rtl8169_get_ringparam,
|
||||
+ .get_pause_stats = rtl8169_get_pause_stats,
|
||||
.get_pauseparam = rtl8169_get_pauseparam,
|
||||
.set_pauseparam = rtl8169_set_pauseparam,
|
||||
+ .get_eth_mac_stats = rtl8169_get_eth_mac_stats,
|
||||
+ .get_eth_ctrl_stats = rtl8169_get_eth_ctrl_stats,
|
||||
};
|
||||
|
||||
static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
|
||||
@@ -3895,6 +3974,9 @@ static void rtl_hw_start_8125(struct rtl
|
||||
break;
|
||||
}
|
||||
|
||||
+ /* enable extended tally counter */
|
||||
+ r8168_mac_ocp_modify(tp, 0xea84, 0, BIT(1) | BIT(0));
|
||||
+
|
||||
rtl_hw_config(tp);
|
||||
}
|
||||
|
@ -0,0 +1,50 @@
|
||||
From ac48430368c1a4f4e6c2fa92243b4b93fd25bee4 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 16 Oct 2024 22:05:57 +0200
|
||||
Subject: [PATCH] r8169: don't take RTNL lock in rtl_task()
|
||||
|
||||
There's not really a benefit here in taking the RTNL lock. The task
|
||||
handler does exception handling only, so we're in trouble anyway when
|
||||
we come here, and there's no need to protect against e.g. a parallel
|
||||
ethtool call.
|
||||
A benefit of removing the RTNL lock here is that we now can
|
||||
synchronously cancel the workqueue from a context holding the RTNL mutex.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 8 ++------
|
||||
1 file changed, 2 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -4802,10 +4802,8 @@ static void rtl_task(struct work_struct
|
||||
container_of(work, struct rtl8169_private, wk.work);
|
||||
int ret;
|
||||
|
||||
- rtnl_lock();
|
||||
-
|
||||
if (!test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
|
||||
- goto out_unlock;
|
||||
+ return;
|
||||
|
||||
if (test_and_clear_bit(RTL_FLAG_TASK_TX_TIMEOUT, tp->wk.flags)) {
|
||||
/* if chip isn't accessible, reset bus to revive it */
|
||||
@@ -4814,7 +4812,7 @@ static void rtl_task(struct work_struct
|
||||
if (ret < 0) {
|
||||
netdev_err(tp->dev, "Can't reset secondary PCI bus, detach NIC\n");
|
||||
netif_device_detach(tp->dev);
|
||||
- goto out_unlock;
|
||||
+ return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4833,8 +4831,6 @@ reset:
|
||||
} else if (test_and_clear_bit(RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE, tp->wk.flags)) {
|
||||
rtl_reset_work(tp);
|
||||
}
|
||||
-out_unlock:
|
||||
- rtnl_unlock();
|
||||
}
|
||||
|
||||
static int rtl8169_poll(struct napi_struct *napi, int budget)
|
@ -0,0 +1,41 @@
|
||||
From 1c105bacb160b5918e917ab811552b7be69fc69c Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 16 Oct 2024 22:29:39 +0200
|
||||
Subject: [PATCH] r8169: avoid duplicated messages if loading firmware fails
|
||||
and switch to warn level
|
||||
|
||||
In case of a problem with firmware loading we inform at the driver level,
|
||||
in addition the firmware load code itself issues warnings. Therefore
|
||||
switch to firmware_request_nowarn() to avoid duplicated error messages.
|
||||
In addition switch to warn level because the firmware is optional and
|
||||
typically just fixes compatibility issues.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Message-ID: <d9c5094c-89a6-40e2-b5fe-8df7df4624ef@gmail.com>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_firmware.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_firmware.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_firmware.c
|
||||
@@ -215,7 +215,7 @@ int rtl_fw_request_firmware(struct rtl_f
|
||||
{
|
||||
int rc;
|
||||
|
||||
- rc = request_firmware(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev);
|
||||
+ rc = firmware_request_nowarn(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
@@ -227,7 +227,7 @@ int rtl_fw_request_firmware(struct rtl_f
|
||||
|
||||
return 0;
|
||||
out:
|
||||
- dev_err(rtl_fw->dev, "Unable to load firmware %s (%d)\n",
|
||||
- rtl_fw->fw_name, rc);
|
||||
+ dev_warn(rtl_fw->dev, "Unable to load firmware %s (%d)\n",
|
||||
+ rtl_fw->fw_name, rc);
|
||||
return rc;
|
||||
}
|
@ -0,0 +1,82 @@
|
||||
From d64113c6bb5ea5a70b7c9c3a6bcadef307638187 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 16 Oct 2024 22:31:10 +0200
|
||||
Subject: [PATCH] r8169: remove rtl_dash_loop_wait_high/low
|
||||
|
||||
Remove rtl_dash_loop_wait_high/low to simplify the code.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Message-ID: <fb8c490c-2d92-48f5-8bbf-1fc1f2ee1649@gmail.com>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 35 ++++++-----------------
|
||||
1 file changed, 8 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -1347,40 +1347,19 @@ static void rtl8168ep_stop_cmac(struct r
|
||||
RTL_W8(tp, IBCR0, RTL_R8(tp, IBCR0) & ~0x01);
|
||||
}
|
||||
|
||||
-static void rtl_dash_loop_wait(struct rtl8169_private *tp,
|
||||
- const struct rtl_cond *c,
|
||||
- unsigned long usecs, int n, bool high)
|
||||
-{
|
||||
- if (!tp->dash_enabled)
|
||||
- return;
|
||||
- rtl_loop_wait(tp, c, usecs, n, high);
|
||||
-}
|
||||
-
|
||||
-static void rtl_dash_loop_wait_high(struct rtl8169_private *tp,
|
||||
- const struct rtl_cond *c,
|
||||
- unsigned long d, int n)
|
||||
-{
|
||||
- rtl_dash_loop_wait(tp, c, d, n, true);
|
||||
-}
|
||||
-
|
||||
-static void rtl_dash_loop_wait_low(struct rtl8169_private *tp,
|
||||
- const struct rtl_cond *c,
|
||||
- unsigned long d, int n)
|
||||
-{
|
||||
- rtl_dash_loop_wait(tp, c, d, n, false);
|
||||
-}
|
||||
-
|
||||
static void rtl8168dp_driver_start(struct rtl8169_private *tp)
|
||||
{
|
||||
r8168dp_oob_notify(tp, OOB_CMD_DRIVER_START);
|
||||
- rtl_dash_loop_wait_high(tp, &rtl_dp_ocp_read_cond, 10000, 10);
|
||||
+ if (tp->dash_enabled)
|
||||
+ rtl_loop_wait_high(tp, &rtl_dp_ocp_read_cond, 10000, 10);
|
||||
}
|
||||
|
||||
static void rtl8168ep_driver_start(struct rtl8169_private *tp)
|
||||
{
|
||||
r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_START);
|
||||
r8168ep_ocp_write(tp, 0x01, 0x30, r8168ep_ocp_read(tp, 0x30) | 0x01);
|
||||
- rtl_dash_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10000, 30);
|
||||
+ if (tp->dash_enabled)
|
||||
+ rtl_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10000, 30);
|
||||
}
|
||||
|
||||
static void rtl8168_driver_start(struct rtl8169_private *tp)
|
||||
@@ -1394,7 +1373,8 @@ static void rtl8168_driver_start(struct
|
||||
static void rtl8168dp_driver_stop(struct rtl8169_private *tp)
|
||||
{
|
||||
r8168dp_oob_notify(tp, OOB_CMD_DRIVER_STOP);
|
||||
- rtl_dash_loop_wait_low(tp, &rtl_dp_ocp_read_cond, 10000, 10);
|
||||
+ if (tp->dash_enabled)
|
||||
+ rtl_loop_wait_low(tp, &rtl_dp_ocp_read_cond, 10000, 10);
|
||||
}
|
||||
|
||||
static void rtl8168ep_driver_stop(struct rtl8169_private *tp)
|
||||
@@ -1402,7 +1382,8 @@ static void rtl8168ep_driver_stop(struct
|
||||
rtl8168ep_stop_cmac(tp);
|
||||
r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_STOP);
|
||||
r8168ep_ocp_write(tp, 0x01, 0x30, r8168ep_ocp_read(tp, 0x30) | 0x01);
|
||||
- rtl_dash_loop_wait_low(tp, &rtl_ep_ocp_read_cond, 10000, 10);
|
||||
+ if (tp->dash_enabled)
|
||||
+ rtl_loop_wait_low(tp, &rtl_ep_ocp_read_cond, 10000, 10);
|
||||
}
|
||||
|
||||
static void rtl8168_driver_stop(struct rtl8169_private *tp)
|
@ -0,0 +1,28 @@
|
||||
From c4e64095c00cb2de413cd6b90be047c273bcd491 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 17 Oct 2024 22:27:44 +0200
|
||||
Subject: [PATCH] r8169: enable EEE at 2.5G per default on RTL8125B
|
||||
|
||||
Register a6d/12 is shadowing register MDIO_AN_EEE_ADV2. So this line
|
||||
disables advertisement of EEE at 2.5G. Latest vendor driver r8125
|
||||
doesn't do this (any longer?), so this mode seems to be safe.
|
||||
EEE saves quite some energy, therefore enable this mode per default.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Message-ID: <95dd5a0c-09ea-4847-94d9-b7aa3063e8ff@gmail.com>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_phy_config.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
@@ -99,7 +99,6 @@ static void rtl8125a_config_eee_phy(stru
|
||||
|
||||
static void rtl8125b_config_eee_phy(struct phy_device *phydev)
|
||||
{
|
||||
- phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
|
||||
phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
|
||||
phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
|
||||
phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
|
@ -0,0 +1,143 @@
|
||||
From f75d1fbe7809bc5ed134204b920fd9e2fc5db1df Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 24 Oct 2024 22:42:33 +0200
|
||||
Subject: [PATCH] r8169: add support for RTL8125D
|
||||
|
||||
This adds support for new chip version RTL8125D, which can be found on
|
||||
boards like Gigabyte X870E AORUS ELITE WIFI7. Firmware rtl8125d-1.fw
|
||||
for this chip version is available in linux-firmware already.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/d0306912-e88e-4c25-8b5d-545ae8834c0c@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169.h | 1 +
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 23 +++++++++++++------
|
||||
.../net/ethernet/realtek/r8169_phy_config.c | 10 ++++++++
|
||||
3 files changed, 27 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169.h
|
||||
+++ b/drivers/net/ethernet/realtek/r8169.h
|
||||
@@ -68,6 +68,7 @@ enum mac_version {
|
||||
/* support for RTL_GIGA_MAC_VER_60 has been removed */
|
||||
RTL_GIGA_MAC_VER_61,
|
||||
RTL_GIGA_MAC_VER_63,
|
||||
+ RTL_GIGA_MAC_VER_64,
|
||||
RTL_GIGA_MAC_VER_65,
|
||||
RTL_GIGA_MAC_VER_66,
|
||||
RTL_GIGA_MAC_NONE
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -56,6 +56,7 @@
|
||||
#define FIRMWARE_8107E_2 "rtl_nic/rtl8107e-2.fw"
|
||||
#define FIRMWARE_8125A_3 "rtl_nic/rtl8125a-3.fw"
|
||||
#define FIRMWARE_8125B_2 "rtl_nic/rtl8125b-2.fw"
|
||||
+#define FIRMWARE_8125D_1 "rtl_nic/rtl8125d-1.fw"
|
||||
#define FIRMWARE_8126A_2 "rtl_nic/rtl8126a-2.fw"
|
||||
#define FIRMWARE_8126A_3 "rtl_nic/rtl8126a-3.fw"
|
||||
|
||||
@@ -139,6 +140,7 @@ static const struct {
|
||||
[RTL_GIGA_MAC_VER_61] = {"RTL8125A", FIRMWARE_8125A_3},
|
||||
/* reserve 62 for CFG_METHOD_4 in the vendor driver */
|
||||
[RTL_GIGA_MAC_VER_63] = {"RTL8125B", FIRMWARE_8125B_2},
|
||||
+ [RTL_GIGA_MAC_VER_64] = {"RTL8125D", FIRMWARE_8125D_1},
|
||||
[RTL_GIGA_MAC_VER_65] = {"RTL8126A", FIRMWARE_8126A_2},
|
||||
[RTL_GIGA_MAC_VER_66] = {"RTL8126A", FIRMWARE_8126A_3},
|
||||
};
|
||||
@@ -708,6 +710,7 @@ MODULE_FIRMWARE(FIRMWARE_8168FP_3);
|
||||
MODULE_FIRMWARE(FIRMWARE_8107E_2);
|
||||
MODULE_FIRMWARE(FIRMWARE_8125A_3);
|
||||
MODULE_FIRMWARE(FIRMWARE_8125B_2);
|
||||
+MODULE_FIRMWARE(FIRMWARE_8125D_1);
|
||||
MODULE_FIRMWARE(FIRMWARE_8126A_2);
|
||||
MODULE_FIRMWARE(FIRMWARE_8126A_3);
|
||||
|
||||
@@ -2080,10 +2083,7 @@ static void rtl_set_eee_txidle_timer(str
|
||||
tp->tx_lpi_timer = timer_val;
|
||||
r8168_mac_ocp_write(tp, 0xe048, timer_val);
|
||||
break;
|
||||
- case RTL_GIGA_MAC_VER_61:
|
||||
- case RTL_GIGA_MAC_VER_63:
|
||||
- case RTL_GIGA_MAC_VER_65:
|
||||
- case RTL_GIGA_MAC_VER_66:
|
||||
+ case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_66:
|
||||
tp->tx_lpi_timer = timer_val;
|
||||
RTL_W16(tp, EEE_TXIDLE_TIMER_8125, timer_val);
|
||||
break;
|
||||
@@ -2295,6 +2295,9 @@ static enum mac_version rtl8169_get_mac_
|
||||
{ 0x7cf, 0x64a, RTL_GIGA_MAC_VER_66 },
|
||||
{ 0x7cf, 0x649, RTL_GIGA_MAC_VER_65 },
|
||||
|
||||
+ /* 8125D family. */
|
||||
+ { 0x7cf, 0x688, RTL_GIGA_MAC_VER_64 },
|
||||
+
|
||||
/* 8125B family. */
|
||||
{ 0x7cf, 0x641, RTL_GIGA_MAC_VER_63 },
|
||||
|
||||
@@ -2562,9 +2565,7 @@ static void rtl_init_rxcfg(struct rtl816
|
||||
case RTL_GIGA_MAC_VER_61:
|
||||
RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST);
|
||||
break;
|
||||
- case RTL_GIGA_MAC_VER_63:
|
||||
- case RTL_GIGA_MAC_VER_65:
|
||||
- case RTL_GIGA_MAC_VER_66:
|
||||
+ case RTL_GIGA_MAC_VER_63 ... RTL_GIGA_MAC_VER_66:
|
||||
RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST |
|
||||
RX_PAUSE_SLOT_ON);
|
||||
break;
|
||||
@@ -3876,6 +3877,12 @@ static void rtl_hw_start_8125b(struct rt
|
||||
rtl_hw_start_8125_common(tp);
|
||||
}
|
||||
|
||||
+static void rtl_hw_start_8125d(struct rtl8169_private *tp)
|
||||
+{
|
||||
+ rtl_set_def_aspm_entry_latency(tp);
|
||||
+ rtl_hw_start_8125_common(tp);
|
||||
+}
|
||||
+
|
||||
static void rtl_hw_start_8126a(struct rtl8169_private *tp)
|
||||
{
|
||||
rtl_set_def_aspm_entry_latency(tp);
|
||||
@@ -3924,6 +3931,7 @@ static void rtl_hw_config(struct rtl8169
|
||||
[RTL_GIGA_MAC_VER_53] = rtl_hw_start_8117,
|
||||
[RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2,
|
||||
[RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b,
|
||||
+ [RTL_GIGA_MAC_VER_64] = rtl_hw_start_8125d,
|
||||
[RTL_GIGA_MAC_VER_65] = rtl_hw_start_8126a,
|
||||
[RTL_GIGA_MAC_VER_66] = rtl_hw_start_8126a,
|
||||
};
|
||||
@@ -3941,6 +3949,7 @@ static void rtl_hw_start_8125(struct rtl
|
||||
/* disable interrupt coalescing */
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_61:
|
||||
+ case RTL_GIGA_MAC_VER_64:
|
||||
for (i = 0xa00; i < 0xb00; i += 4)
|
||||
RTL_W32(tp, i, 0);
|
||||
break;
|
||||
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
@@ -1103,6 +1103,15 @@ static void rtl8125b_hw_phy_config(struc
|
||||
rtl8125b_config_eee_phy(phydev);
|
||||
}
|
||||
|
||||
+static void rtl8125d_hw_phy_config(struct rtl8169_private *tp,
|
||||
+ struct phy_device *phydev)
|
||||
+{
|
||||
+ r8169_apply_firmware(tp);
|
||||
+ rtl8125_legacy_force_mode(phydev);
|
||||
+ rtl8168g_disable_aldps(phydev);
|
||||
+ rtl8125b_config_eee_phy(phydev);
|
||||
+}
|
||||
+
|
||||
static void rtl8126a_hw_phy_config(struct rtl8169_private *tp,
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
@@ -1159,6 +1168,7 @@ void r8169_hw_phy_config(struct rtl8169_
|
||||
[RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config,
|
||||
+ [RTL_GIGA_MAC_VER_64] = rtl8125d_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_65] = rtl8126a_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_66] = rtl8126a_hw_phy_config,
|
||||
};
|
@ -0,0 +1,30 @@
|
||||
From b8bd8c44a266c9a7dcb907eab10fbb119e3f6494 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 24 Oct 2024 22:48:59 +0200
|
||||
Subject: [PATCH] r8169: fix inconsistent indenting in
|
||||
rtl8169_get_eth_mac_stats
|
||||
|
||||
This fixes an inconsistent indenting introduced with e3fc5139bd8f
|
||||
("r8169: implement additional ethtool stats ops").
|
||||
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Closes: https://lore.kernel.org/oe-kbuild-all/202410220413.1gAxIJ4t-lkp@intel.com/
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/20fd6f39-3c1b-4af0-9adc-7d1f49728fad@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -2227,7 +2227,7 @@ static void rtl8169_get_eth_mac_stats(st
|
||||
le64_to_cpu(tp->counters->tx_broadcast64);
|
||||
mac_stats->MulticastFramesReceivedOK =
|
||||
le64_to_cpu(tp->counters->rx_multicast64);
|
||||
- mac_stats->FrameTooLongErrors =
|
||||
+ mac_stats->FrameTooLongErrors =
|
||||
le32_to_cpu(tp->counters->rx_frame_too_long);
|
||||
}
|
||||
|
@ -0,0 +1,49 @@
|
||||
From eb90f876b7961d702d7fc549e14614860f531e60 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 31 Oct 2024 22:42:52 +0100
|
||||
Subject: [PATCH] r8169: align RTL8125 EEE config with vendor driver
|
||||
|
||||
Align the EEE config for RTL8125A/RTL8125B with vendor driver r8125.
|
||||
This should help to avoid compatibility issues.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/044c925e-8669-4b98-87df-95b4056f4f5f@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
.../net/ethernet/realtek/r8169_phy_config.c | 18 ++++++++++++------
|
||||
1 file changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
@@ -89,19 +89,25 @@ static void rtl8168h_config_eee_phy(stru
|
||||
phy_modify_paged(phydev, 0xa42, 0x14, 0x0000, 0x0080);
|
||||
}
|
||||
|
||||
-static void rtl8125a_config_eee_phy(struct phy_device *phydev)
|
||||
+static void rtl8125_common_config_eee_phy(struct phy_device *phydev)
|
||||
{
|
||||
- rtl8168h_config_eee_phy(phydev);
|
||||
+ phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
|
||||
+ phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
|
||||
+ phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
|
||||
+}
|
||||
|
||||
+static void rtl8125a_config_eee_phy(struct phy_device *phydev)
|
||||
+{
|
||||
+ rtl8168g_config_eee_phy(phydev);
|
||||
+ /* disable EEE at 2.5Gbps */
|
||||
phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
|
||||
- phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
|
||||
+ rtl8125_common_config_eee_phy(phydev);
|
||||
}
|
||||
|
||||
static void rtl8125b_config_eee_phy(struct phy_device *phydev)
|
||||
{
|
||||
- phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000);
|
||||
- phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000);
|
||||
- phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
|
||||
+ rtl8168g_config_eee_phy(phydev);
|
||||
+ rtl8125_common_config_eee_phy(phydev);
|
||||
}
|
||||
|
||||
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp,
|
@ -0,0 +1,46 @@
|
||||
From 4af2f60bf7378bd5c92b15a528d8c6c7d02bed6c Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 31 Oct 2024 22:43:45 +0100
|
||||
Subject: [PATCH] r8169: align RTL8125/RTL8126 PHY config with vendor driver
|
||||
|
||||
This aligns some parameters with vendor driver r8125/r8126 to avoid
|
||||
compatibility issues. Note that for RTL8125B there's no functional
|
||||
change, just the open-coded version of the function is replaced.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/a8a9d896-fbe6-41f2-bf87-666567d3cdb3@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_phy_config.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
@@ -1073,8 +1073,8 @@ static void rtl8125b_hw_phy_config(struc
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
r8169_apply_firmware(tp);
|
||||
+ rtl8168g_enable_gphy_10m(phydev);
|
||||
|
||||
- phy_modify_paged(phydev, 0xa44, 0x11, 0x0000, 0x0800);
|
||||
phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090);
|
||||
phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001);
|
||||
|
||||
@@ -1113,6 +1113,7 @@ static void rtl8125d_hw_phy_config(struc
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
r8169_apply_firmware(tp);
|
||||
+ rtl8168g_enable_gphy_10m(phydev);
|
||||
rtl8125_legacy_force_mode(phydev);
|
||||
rtl8168g_disable_aldps(phydev);
|
||||
rtl8125b_config_eee_phy(phydev);
|
||||
@@ -1122,6 +1123,9 @@ static void rtl8126a_hw_phy_config(struc
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
r8169_apply_firmware(tp);
|
||||
+ rtl8168g_enable_gphy_10m(phydev);
|
||||
+ rtl8125_legacy_force_mode(phydev);
|
||||
+ rtl8168g_disable_aldps(phydev);
|
||||
}
|
||||
|
||||
void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
|
@ -0,0 +1,25 @@
|
||||
From a3d8520e6a19ab018da6c7fc22512c913697a829 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 31 Oct 2024 22:44:36 +0100
|
||||
Subject: [PATCH] r8169: align RTL8126 EEE config with vendor driver
|
||||
|
||||
Align the EEE config for RTL8126A with vendor driver r8126 to avoid
|
||||
compatibility issues.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/71e4859e-4cd0-4b6b-b7fa-621d7721992f@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_phy_config.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
|
||||
@@ -1126,6 +1126,7 @@ static void rtl8126a_hw_phy_config(struc
|
||||
rtl8168g_enable_gphy_10m(phydev);
|
||||
rtl8125_legacy_force_mode(phydev);
|
||||
rtl8168g_disable_aldps(phydev);
|
||||
+ rtl8125_common_config_eee_phy(phydev);
|
||||
}
|
||||
|
||||
void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
|
@ -0,0 +1,38 @@
|
||||
From 2cd02f2fdd8a92e5b6b85ff64eab0fc549b30c07 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Sat, 2 Nov 2024 14:49:01 +0100
|
||||
Subject: [PATCH] r8169: improve initialization of RSS registers on
|
||||
RTL8125/RTL8126
|
||||
|
||||
Replace the register addresses with the names used in r8125/r8126
|
||||
vendor driver, and consider that RSS_CTRL_8125 is a 32 bit register.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/3bf2f340-b369-4174-97bf-fd38d4217492@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -347,6 +347,8 @@ enum rtl8125_registers {
|
||||
TxPoll_8125 = 0x90,
|
||||
LEDSEL3 = 0x96,
|
||||
MAC0_BKP = 0x19e0,
|
||||
+ RSS_CTRL_8125 = 0x4500,
|
||||
+ Q_NUM_CTRL_8125 = 0x4800,
|
||||
EEE_TXIDLE_TIMER_8125 = 0x6048,
|
||||
};
|
||||
|
||||
@@ -3770,8 +3772,8 @@ static void rtl_hw_start_8125_common(str
|
||||
rtl_pcie_state_l2l3_disable(tp);
|
||||
|
||||
RTL_W16(tp, 0x382, 0x221b);
|
||||
- RTL_W8(tp, 0x4500, 0);
|
||||
- RTL_W16(tp, 0x4800, 0);
|
||||
+ RTL_W32(tp, RSS_CTRL_8125, 0);
|
||||
+ RTL_W16(tp, Q_NUM_CTRL_8125, 0);
|
||||
|
||||
/* disable UPS */
|
||||
r8168_mac_ocp_modify(tp, 0xd40a, 0x0010, 0x0000);
|
@ -0,0 +1,113 @@
|
||||
From 83cb4b470c66b37b19a347a35cea01e0cbdd258d Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Mon, 4 Nov 2024 23:16:20 +0100
|
||||
Subject: [PATCH] r8169: remove leftover locks after reverted change
|
||||
|
||||
After e31a9fedc7d8 ("Revert "r8169: disable ASPM during NAPI poll"")
|
||||
these locks aren't needed any longer.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/680f2606-ac7d-4ced-8694-e5033855da9b@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 29 ++---------------------
|
||||
1 file changed, 2 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -663,13 +663,9 @@ struct rtl8169_private {
|
||||
struct work_struct work;
|
||||
} wk;
|
||||
|
||||
- raw_spinlock_t config25_lock;
|
||||
raw_spinlock_t mac_ocp_lock;
|
||||
struct mutex led_lock; /* serialize LED ctrl RMW access */
|
||||
|
||||
- raw_spinlock_t cfg9346_usage_lock;
|
||||
- int cfg9346_usage_count;
|
||||
-
|
||||
unsigned supports_gmii:1;
|
||||
unsigned aspm_manageable:1;
|
||||
unsigned dash_enabled:1;
|
||||
@@ -723,22 +719,12 @@ static inline struct device *tp_to_dev(s
|
||||
|
||||
static void rtl_lock_config_regs(struct rtl8169_private *tp)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- raw_spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
|
||||
- if (!--tp->cfg9346_usage_count)
|
||||
- RTL_W8(tp, Cfg9346, Cfg9346_Lock);
|
||||
- raw_spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
|
||||
+ RTL_W8(tp, Cfg9346, Cfg9346_Lock);
|
||||
}
|
||||
|
||||
static void rtl_unlock_config_regs(struct rtl8169_private *tp)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- raw_spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
|
||||
- if (!tp->cfg9346_usage_count++)
|
||||
- RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
|
||||
- raw_spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
|
||||
+ RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
|
||||
}
|
||||
|
||||
static void rtl_pci_commit(struct rtl8169_private *tp)
|
||||
@@ -749,24 +735,18 @@ static void rtl_pci_commit(struct rtl816
|
||||
|
||||
static void rtl_mod_config2(struct rtl8169_private *tp, u8 clear, u8 set)
|
||||
{
|
||||
- unsigned long flags;
|
||||
u8 val;
|
||||
|
||||
- raw_spin_lock_irqsave(&tp->config25_lock, flags);
|
||||
val = RTL_R8(tp, Config2);
|
||||
RTL_W8(tp, Config2, (val & ~clear) | set);
|
||||
- raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
|
||||
}
|
||||
|
||||
static void rtl_mod_config5(struct rtl8169_private *tp, u8 clear, u8 set)
|
||||
{
|
||||
- unsigned long flags;
|
||||
u8 val;
|
||||
|
||||
- raw_spin_lock_irqsave(&tp->config25_lock, flags);
|
||||
val = RTL_R8(tp, Config5);
|
||||
RTL_W8(tp, Config5, (val & ~clear) | set);
|
||||
- raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
|
||||
}
|
||||
|
||||
static bool rtl_is_8125(struct rtl8169_private *tp)
|
||||
@@ -1572,7 +1552,6 @@ static void __rtl8169_set_wol(struct rtl
|
||||
{ WAKE_MAGIC, Config3, MagicPacket }
|
||||
};
|
||||
unsigned int i, tmp = ARRAY_SIZE(cfg);
|
||||
- unsigned long flags;
|
||||
u8 options;
|
||||
|
||||
rtl_unlock_config_regs(tp);
|
||||
@@ -1591,14 +1570,12 @@ static void __rtl8169_set_wol(struct rtl
|
||||
r8168_mac_ocp_modify(tp, 0xc0b6, BIT(0), 0);
|
||||
}
|
||||
|
||||
- raw_spin_lock_irqsave(&tp->config25_lock, flags);
|
||||
for (i = 0; i < tmp; i++) {
|
||||
options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
|
||||
if (wolopts & cfg[i].opt)
|
||||
options |= cfg[i].mask;
|
||||
RTL_W8(tp, cfg[i].reg, options);
|
||||
}
|
||||
- raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
|
||||
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
|
||||
@@ -5498,8 +5475,6 @@ static int rtl_init_one(struct pci_dev *
|
||||
tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
|
||||
tp->ocp_base = OCP_STD_PHY_BASE;
|
||||
|
||||
- raw_spin_lock_init(&tp->cfg9346_usage_lock);
|
||||
- raw_spin_lock_init(&tp->config25_lock);
|
||||
raw_spin_lock_init(&tp->mac_ocp_lock);
|
||||
mutex_init(&tp->led_lock);
|
||||
|
@ -0,0 +1,108 @@
|
||||
From c507e96b5763b36b63ad50ad804341f72ea000e4 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 6 Nov 2024 17:55:45 +0100
|
||||
Subject: [PATCH] r8169: improve __rtl8169_set_wol
|
||||
|
||||
Add helper r8169_mod_reg8_cond() what allows to significantly simplify
|
||||
__rtl8169_set_wol().
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/697b197a-8eac-40c6-8847-27093cacec36@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 55 ++++++++++-------------
|
||||
1 file changed, 24 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -749,6 +749,20 @@ static void rtl_mod_config5(struct rtl81
|
||||
RTL_W8(tp, Config5, (val & ~clear) | set);
|
||||
}
|
||||
|
||||
+static void r8169_mod_reg8_cond(struct rtl8169_private *tp, int reg,
|
||||
+ u8 bits, bool cond)
|
||||
+{
|
||||
+ u8 val, old_val;
|
||||
+
|
||||
+ old_val = RTL_R8(tp, reg);
|
||||
+ if (cond)
|
||||
+ val = old_val | bits;
|
||||
+ else
|
||||
+ val = old_val & ~bits;
|
||||
+ if (val != old_val)
|
||||
+ RTL_W8(tp, reg, val);
|
||||
+}
|
||||
+
|
||||
static bool rtl_is_8125(struct rtl8169_private *tp)
|
||||
{
|
||||
return tp->mac_version >= RTL_GIGA_MAC_VER_61;
|
||||
@@ -1539,58 +1553,37 @@ static void rtl8169_get_wol(struct net_d
|
||||
|
||||
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
|
||||
{
|
||||
- static const struct {
|
||||
- u32 opt;
|
||||
- u16 reg;
|
||||
- u8 mask;
|
||||
- } cfg[] = {
|
||||
- { WAKE_PHY, Config3, LinkUp },
|
||||
- { WAKE_UCAST, Config5, UWF },
|
||||
- { WAKE_BCAST, Config5, BWF },
|
||||
- { WAKE_MCAST, Config5, MWF },
|
||||
- { WAKE_ANY, Config5, LanWake },
|
||||
- { WAKE_MAGIC, Config3, MagicPacket }
|
||||
- };
|
||||
- unsigned int i, tmp = ARRAY_SIZE(cfg);
|
||||
- u8 options;
|
||||
-
|
||||
rtl_unlock_config_regs(tp);
|
||||
|
||||
if (rtl_is_8168evl_up(tp)) {
|
||||
- tmp--;
|
||||
if (wolopts & WAKE_MAGIC)
|
||||
rtl_eri_set_bits(tp, 0x0dc, MagicPacket_v2);
|
||||
else
|
||||
rtl_eri_clear_bits(tp, 0x0dc, MagicPacket_v2);
|
||||
} else if (rtl_is_8125(tp)) {
|
||||
- tmp--;
|
||||
if (wolopts & WAKE_MAGIC)
|
||||
r8168_mac_ocp_modify(tp, 0xc0b6, 0, BIT(0));
|
||||
else
|
||||
r8168_mac_ocp_modify(tp, 0xc0b6, BIT(0), 0);
|
||||
+ } else {
|
||||
+ r8169_mod_reg8_cond(tp, Config3, MagicPacket,
|
||||
+ wolopts & WAKE_MAGIC);
|
||||
}
|
||||
|
||||
- for (i = 0; i < tmp; i++) {
|
||||
- options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
|
||||
- if (wolopts & cfg[i].opt)
|
||||
- options |= cfg[i].mask;
|
||||
- RTL_W8(tp, cfg[i].reg, options);
|
||||
- }
|
||||
+ r8169_mod_reg8_cond(tp, Config3, LinkUp, wolopts & WAKE_PHY);
|
||||
+ r8169_mod_reg8_cond(tp, Config5, UWF, wolopts & WAKE_UCAST);
|
||||
+ r8169_mod_reg8_cond(tp, Config5, BWF, wolopts & WAKE_BCAST);
|
||||
+ r8169_mod_reg8_cond(tp, Config5, MWF, wolopts & WAKE_MCAST);
|
||||
+ r8169_mod_reg8_cond(tp, Config5, LanWake, wolopts);
|
||||
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
|
||||
- options = RTL_R8(tp, Config1) & ~PMEnable;
|
||||
- if (wolopts)
|
||||
- options |= PMEnable;
|
||||
- RTL_W8(tp, Config1, options);
|
||||
+ r8169_mod_reg8_cond(tp, Config1, PMEnable, wolopts);
|
||||
break;
|
||||
case RTL_GIGA_MAC_VER_34:
|
||||
case RTL_GIGA_MAC_VER_37:
|
||||
case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_66:
|
||||
- if (wolopts)
|
||||
- rtl_mod_config2(tp, 0, PME_SIGNAL);
|
||||
- else
|
||||
- rtl_mod_config2(tp, PME_SIGNAL, 0);
|
||||
+ r8169_mod_reg8_cond(tp, Config2, PME_SIGNAL, wolopts);
|
||||
break;
|
||||
default:
|
||||
break;
|
@ -0,0 +1,44 @@
|
||||
From 330dc2297c82953dff402e0b4176a5383a618538 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 6 Nov 2024 17:56:28 +0100
|
||||
Subject: [PATCH] r8169: improve rtl_set_d3_pll_down
|
||||
|
||||
Make use of new helper r8169_mod_reg8_cond() and move from a switch()
|
||||
to an if() clause. Benefit is that we don't have to touch this piece of
|
||||
code each time support for a new chip version is added.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/e1ccdb85-a4ed-4800-89c2-89770ff06452@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 18 +++++-------------
|
||||
1 file changed, 5 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -1432,19 +1432,11 @@ static enum rtl_dash_type rtl_get_dash_t
|
||||
|
||||
static void rtl_set_d3_pll_down(struct rtl8169_private *tp, bool enable)
|
||||
{
|
||||
- switch (tp->mac_version) {
|
||||
- case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
|
||||
- case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
|
||||
- case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_37:
|
||||
- case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_66:
|
||||
- if (enable)
|
||||
- RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~D3_NO_PLL_DOWN);
|
||||
- else
|
||||
- RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | D3_NO_PLL_DOWN);
|
||||
- break;
|
||||
- default:
|
||||
- break;
|
||||
- }
|
||||
+ if (tp->mac_version >= RTL_GIGA_MAC_VER_25 &&
|
||||
+ tp->mac_version != RTL_GIGA_MAC_VER_28 &&
|
||||
+ tp->mac_version != RTL_GIGA_MAC_VER_31 &&
|
||||
+ tp->mac_version != RTL_GIGA_MAC_VER_38)
|
||||
+ r8169_mod_reg8_cond(tp, PMCH, D3_NO_PLL_DOWN, !enable);
|
||||
}
|
||||
|
||||
static void rtl_reset_packet_filter(struct rtl8169_private *tp)
|
@ -0,0 +1,29 @@
|
||||
From e3e9e9039fa6ae885c7d5c954d7b9f105fa23e8f Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 6 Nov 2024 17:57:08 +0100
|
||||
Subject: [PATCH] r8169: align WAKE_PHY handling with r8125/r8126 vendor
|
||||
drivers
|
||||
|
||||
Vendor drivers r8125/r8126 apply this additional magic setting when
|
||||
enabling WAKE_PHY, so do the same here.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/51130715-45be-4db5-abb7-05d87e1f5df9@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -1563,6 +1563,9 @@ static void __rtl8169_set_wol(struct rtl
|
||||
}
|
||||
|
||||
r8169_mod_reg8_cond(tp, Config3, LinkUp, wolopts & WAKE_PHY);
|
||||
+ if (rtl_is_8125(tp))
|
||||
+ r8168_mac_ocp_modify(tp, 0xe0c6, 0x3f,
|
||||
+ wolopts & WAKE_PHY ? 0x13 : 0);
|
||||
r8169_mod_reg8_cond(tp, Config5, UWF, wolopts & WAKE_UCAST);
|
||||
r8169_mod_reg8_cond(tp, Config5, BWF, wolopts & WAKE_BCAST);
|
||||
r8169_mod_reg8_cond(tp, Config5, MWF, wolopts & WAKE_MCAST);
|
@ -0,0 +1,117 @@
|
||||
From 7a3bcd39ae1f0e3ab896d9df62339ab4297a0bfd Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Sat, 9 Nov 2024 23:12:12 +0100
|
||||
Subject: [PATCH] r8169: use helper r8169_mod_reg8_cond to simplify
|
||||
rtl_jumbo_config
|
||||
|
||||
Use recently added helper r8169_mod_reg8_cond() to simplify jumbo
|
||||
mode configuration.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://patch.msgid.link/3df1d484-a02e-46e7-8f75-db5b428e422e@gmail.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/ethernet/realtek/r8169_main.c | 77 ++++-------------------
|
||||
1 file changed, 11 insertions(+), 66 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/realtek/r8169_main.c
|
||||
+++ b/drivers/net/ethernet/realtek/r8169_main.c
|
||||
@@ -2547,86 +2547,31 @@ static void rtl8169_init_ring_indexes(st
|
||||
tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;
|
||||
}
|
||||
|
||||
-static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
|
||||
-}
|
||||
-
|
||||
-static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
|
||||
-}
|
||||
-
|
||||
-static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
|
||||
-}
|
||||
-
|
||||
-static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
|
||||
-}
|
||||
-
|
||||
-static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, MaxTxPacketSize, 0x24);
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01);
|
||||
-}
|
||||
-
|
||||
-static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, MaxTxPacketSize, 0x3f);
|
||||
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01);
|
||||
-}
|
||||
-
|
||||
-static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
|
||||
-}
|
||||
-
|
||||
-static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
|
||||
-{
|
||||
- RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
|
||||
-}
|
||||
-
|
||||
static void rtl_jumbo_config(struct rtl8169_private *tp)
|
||||
{
|
||||
bool jumbo = tp->dev->mtu > ETH_DATA_LEN;
|
||||
int readrq = 4096;
|
||||
|
||||
+ if (jumbo && tp->mac_version >= RTL_GIGA_MAC_VER_17 &&
|
||||
+ tp->mac_version <= RTL_GIGA_MAC_VER_26)
|
||||
+ readrq = 512;
|
||||
+
|
||||
rtl_unlock_config_regs(tp);
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_17:
|
||||
- if (jumbo) {
|
||||
- readrq = 512;
|
||||
- r8168b_1_hw_jumbo_enable(tp);
|
||||
- } else {
|
||||
- r8168b_1_hw_jumbo_disable(tp);
|
||||
- }
|
||||
+ r8169_mod_reg8_cond(tp, Config4, BIT(0), jumbo);
|
||||
break;
|
||||
case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_26:
|
||||
- if (jumbo) {
|
||||
- readrq = 512;
|
||||
- r8168c_hw_jumbo_enable(tp);
|
||||
- } else {
|
||||
- r8168c_hw_jumbo_disable(tp);
|
||||
- }
|
||||
+ r8169_mod_reg8_cond(tp, Config3, Jumbo_En0, jumbo);
|
||||
+ r8169_mod_reg8_cond(tp, Config4, Jumbo_En1, jumbo);
|
||||
break;
|
||||
case RTL_GIGA_MAC_VER_28:
|
||||
- if (jumbo)
|
||||
- r8168dp_hw_jumbo_enable(tp);
|
||||
- else
|
||||
- r8168dp_hw_jumbo_disable(tp);
|
||||
+ r8169_mod_reg8_cond(tp, Config3, Jumbo_En0, jumbo);
|
||||
break;
|
||||
case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_33:
|
||||
- if (jumbo)
|
||||
- r8168e_hw_jumbo_enable(tp);
|
||||
- else
|
||||
- r8168e_hw_jumbo_disable(tp);
|
||||
+ RTL_W8(tp, MaxTxPacketSize, jumbo ? 0x24 : 0x3f);
|
||||
+ r8169_mod_reg8_cond(tp, Config3, Jumbo_En0, jumbo);
|
||||
+ r8169_mod_reg8_cond(tp, Config4, BIT(0), jumbo);
|
||||
break;
|
||||
default:
|
||||
break;
|
@ -0,0 +1,136 @@
|
||||
From f87a17ed3b51fba4dfdd8f8b643b5423a85fc551 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Tue, 15 Oct 2024 07:47:14 +0200
|
||||
Subject: [PATCH] net: phy: realtek: merge the drivers for internal NBase-T
|
||||
PHY's
|
||||
|
||||
The Realtek RTL8125/RTL8126 NBase-T MAC/PHY chips have internal PHY's
|
||||
which are register-compatible, at least for the registers we use here.
|
||||
So let's use just one PHY driver to support all of them.
|
||||
These internal PHY's exist also as external C45 PHY's, but on the
|
||||
internal PHY's no access to MMD registers is possible. This can be
|
||||
used to differentiate between the internal and external version.
|
||||
|
||||
As a side effect the drivers for two now external-only drivers don't
|
||||
require read_mmd/write_mmd hooks any longer.
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Link: https://patch.msgid.link/c57081a6-811f-4571-ab35-34f4ca6de9af@gmail.com
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/realtek.c | 53 +++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 43 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -95,6 +95,7 @@
|
||||
|
||||
#define RTL_GENERIC_PHYID 0x001cc800
|
||||
#define RTL_8211FVD_PHYID 0x001cc878
|
||||
+#define RTL_8221B 0x001cc840
|
||||
#define RTL_8221B_VB_CG 0x001cc849
|
||||
#define RTL_8221B_VN_CG 0x001cc84a
|
||||
#define RTL_8251B 0x001cc862
|
||||
@@ -1077,6 +1078,23 @@ static bool rtlgen_supports_2_5gbps(stru
|
||||
return val >= 0 && val & MDIO_PMA_SPEED_2_5G;
|
||||
}
|
||||
|
||||
+/* On internal PHY's MMD reads over C22 always return 0.
|
||||
+ * Check a MMD register which is known to be non-zero.
|
||||
+ */
|
||||
+static bool rtlgen_supports_mmd(struct phy_device *phydev)
|
||||
+{
|
||||
+ int val;
|
||||
+
|
||||
+ phy_lock_mdio_bus(phydev);
|
||||
+ __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS);
|
||||
+ __phy_write(phydev, MII_MMD_DATA, MDIO_PCS_EEE_ABLE);
|
||||
+ __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS | MII_MMD_CTRL_NOINCR);
|
||||
+ val = __phy_read(phydev, MII_MMD_DATA);
|
||||
+ phy_unlock_mdio_bus(phydev);
|
||||
+
|
||||
+ return val > 0;
|
||||
+}
|
||||
+
|
||||
static int rtlgen_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
return phydev->phy_id == RTL_GENERIC_PHYID &&
|
||||
@@ -1086,7 +1104,8 @@ static int rtlgen_match_phy_device(struc
|
||||
static int rtl8226_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
return phydev->phy_id == RTL_GENERIC_PHYID &&
|
||||
- rtlgen_supports_2_5gbps(phydev);
|
||||
+ rtlgen_supports_2_5gbps(phydev) &&
|
||||
+ rtlgen_supports_mmd(phydev);
|
||||
}
|
||||
|
||||
static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
|
||||
@@ -1098,6 +1117,11 @@ static int rtlgen_is_c45_match(struct ph
|
||||
return !is_c45 && (id == phydev->phy_id);
|
||||
}
|
||||
|
||||
+static int rtl8221b_match_phy_device(struct phy_device *phydev)
|
||||
+{
|
||||
+ return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev);
|
||||
+}
|
||||
+
|
||||
static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false);
|
||||
@@ -1118,9 +1142,21 @@ static int rtl8221b_vn_cg_c45_match_phy_
|
||||
return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true);
|
||||
}
|
||||
|
||||
-static int rtl8251b_c22_match_phy_device(struct phy_device *phydev)
|
||||
+static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
- return rtlgen_is_c45_match(phydev, RTL_8251B, false);
|
||||
+ if (phydev->is_c45)
|
||||
+ return false;
|
||||
+
|
||||
+ switch (phydev->phy_id) {
|
||||
+ case RTL_GENERIC_PHYID:
|
||||
+ case RTL_8221B:
|
||||
+ case RTL_8251B:
|
||||
+ break;
|
||||
+ default:
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev);
|
||||
}
|
||||
|
||||
static int rtl8251b_c45_match_phy_device(struct phy_device *phydev)
|
||||
@@ -1382,10 +1418,8 @@ static struct phy_driver realtek_drvs[]
|
||||
.resume = rtlgen_resume,
|
||||
.read_page = rtl821x_read_page,
|
||||
.write_page = rtl821x_write_page,
|
||||
- .read_mmd = rtl822x_read_mmd,
|
||||
- .write_mmd = rtl822x_write_mmd,
|
||||
}, {
|
||||
- PHY_ID_MATCH_EXACT(0x001cc840),
|
||||
+ .match_phy_device = rtl8221b_match_phy_device,
|
||||
.name = "RTL8226B_RTL8221B 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@@ -1396,8 +1430,6 @@ static struct phy_driver realtek_drvs[]
|
||||
.resume = rtlgen_resume,
|
||||
.read_page = rtl821x_read_page,
|
||||
.write_page = rtl821x_write_page,
|
||||
- .read_mmd = rtl822x_read_mmd,
|
||||
- .write_mmd = rtl822x_write_mmd,
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc838),
|
||||
.name = "RTL8226-CG 2.5Gbps PHY",
|
||||
@@ -1475,8 +1507,9 @@ static struct phy_driver realtek_drvs[]
|
||||
.read_page = rtl821x_read_page,
|
||||
.write_page = rtl821x_write_page,
|
||||
}, {
|
||||
- .match_phy_device = rtl8251b_c22_match_phy_device,
|
||||
- .name = "RTL8126A-internal 5Gbps PHY",
|
||||
+ .match_phy_device = rtl_internal_nbaset_match_phy_device,
|
||||
+ .name = "Realtek Internal NBASE-T PHY",
|
||||
+ .flags = PHY_IS_INTERNAL,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.read_status = rtl822x_read_status,
|
@ -0,0 +1,29 @@
|
||||
From 8989bad541133c43550bff2b80edbe37b8fb9659 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Thu, 17 Oct 2024 18:01:13 +0200
|
||||
Subject: [PATCH] net: phy: realtek: add RTL8125D-internal PHY
|
||||
|
||||
The first boards show up with Realtek's RTL8125D. This MAC/PHY chip
|
||||
comes with an integrated 2.5Gbps PHY with ID 0x001cc841. It's not
|
||||
clear yet whether there's an external version of this PHY and how
|
||||
Realtek calls it, therefore use the numeric id for now.
|
||||
|
||||
Link: https://lore.kernel.org/netdev/2ada65e1-5dfa-456c-9334-2bc51272e9da@gmail.com/T/
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Message-ID: <7d2924de-053b-44d2-a479-870dc3878170@gmail.com>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/phy/realtek.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1151,6 +1151,7 @@ static int rtl_internal_nbaset_match_phy
|
||||
case RTL_GENERIC_PHYID:
|
||||
case RTL_8221B:
|
||||
case RTL_8251B:
|
||||
+ case 0x001cc841:
|
||||
break;
|
||||
default:
|
||||
return false;
|
@ -0,0 +1,43 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Fri, 3 Jan 2025 19:29:00 +0100
|
||||
Subject: [PATCH] net: page_pool: try to free deferred skbs while waiting for
|
||||
pool release
|
||||
|
||||
The NAPI defer list can accumulate no longer used skbs, which can be reused
|
||||
during alloc. If this happens on a CPU that otherwise does not do any
|
||||
rx softirq processing, skbs can be held indefinitely, causing warnings
|
||||
on releasing page pools.
|
||||
Deal with this by scheduling rx softirq on all CPUs.
|
||||
|
||||
Patch by Lorenzo Bianconi
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/core/page_pool.c
|
||||
+++ b/net/core/page_pool.c
|
||||
@@ -862,12 +862,23 @@ static void page_pool_release_retry(stru
|
||||
{
|
||||
struct delayed_work *dwq = to_delayed_work(wq);
|
||||
struct page_pool *pool = container_of(dwq, typeof(*pool), release_dw);
|
||||
- int inflight;
|
||||
+ int cpu, inflight;
|
||||
|
||||
inflight = page_pool_release(pool);
|
||||
if (!inflight)
|
||||
return;
|
||||
|
||||
+ /* Run NET_RX_SOFTIRQ in order to free pending skbs in softnet_data
|
||||
+ * defer_list that can stay in the list until we have enough queued
|
||||
+ * traffic.
|
||||
+ */
|
||||
+ for_each_online_cpu(cpu) {
|
||||
+ struct softnet_data *sd = &per_cpu(softnet_data, cpu);
|
||||
+
|
||||
+ if (!cmpxchg(&sd->defer_ipi_scheduled, 0, 1))
|
||||
+ smp_call_function_single_async(cpu, &sd->defer_csd);
|
||||
+ }
|
||||
+
|
||||
/* Periodic warning */
|
||||
if (time_after_eq(jiffies, pool->defer_warn)) {
|
||||
int sec = (s32)((u32)jiffies - (u32)pool->defer_start) / HZ;
|
@ -15,7 +15,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1375,6 +1375,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1412,6 +1412,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.name = "RTL8226 2.5Gbps PHY",
|
||||
.match_phy_device = rtl8226_match_phy_device,
|
||||
@ -23,15 +23,15 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.read_status = rtl822x_read_status,
|
||||
@@ -1387,6 +1388,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1422,6 +1423,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc840),
|
||||
.match_phy_device = rtl8221b_match_phy_device,
|
||||
.name = "RTL8226B_RTL8221B 2.5Gbps PHY",
|
||||
+ .soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl822xb_config_init,
|
||||
@@ -1401,6 +1403,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1434,6 +1436,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc838),
|
||||
.name = "RTL8226-CG 2.5Gbps PHY",
|
||||
@ -39,7 +39,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.read_status = rtl822x_read_status,
|
||||
@@ -1411,6 +1414,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1444,6 +1447,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc848),
|
||||
.name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
|
||||
@ -47,7 +47,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl822xb_config_init,
|
||||
@@ -1423,6 +1427,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1456,6 +1460,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl822xb_config_init,
|
||||
@@ -1435,6 +1440,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1468,6 +1473,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
|
||||
@ -63,7 +63,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.config_init = rtl822xb_config_init,
|
||||
.get_rate_matching = rtl822xb_get_rate_matching,
|
||||
.get_features = rtl822x_c45_get_features,
|
||||
@@ -1445,6 +1451,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1478,6 +1484,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
|
||||
@ -71,7 +71,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl822xb_config_init,
|
||||
@@ -1457,6 +1464,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1490,6 +1497,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
|
||||
|
@ -20,7 +20,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -814,8 +814,8 @@ static int rtl822x_write_mmd(struct phy_
|
||||
@@ -815,8 +815,8 @@ static int rtl822x_write_mmd(struct phy_
|
||||
static int rtl822xb_config_init(struct phy_device *phydev)
|
||||
{
|
||||
bool has_2500, has_sgmii;
|
||||
@ -30,7 +30,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
has_2500 = test_bit(PHY_INTERFACE_MODE_2500BASEX,
|
||||
phydev->host_interfaces) ||
|
||||
@@ -865,7 +865,29 @@ static int rtl822xb_config_init(struct p
|
||||
@@ -866,7 +866,29 @@ static int rtl822xb_config_init(struct p
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1092,9 +1092,11 @@ static bool rtlgen_supports_2_5gbps(stru
|
||||
@@ -1093,9 +1093,11 @@ static bool rtlgen_supports_2_5gbps(stru
|
||||
{
|
||||
int val;
|
||||
|
||||
|
@ -24,7 +24,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
#define RTL8366RB_POWER_SAVE 0x15
|
||||
#define RTL8366RB_POWER_SAVE_ON BIT(12)
|
||||
|
||||
@@ -1152,6 +1156,25 @@ static int rtl8251b_c45_match_phy_device
|
||||
@@ -1189,6 +1193,25 @@ static int rtl8251b_c45_match_phy_device
|
||||
return rtlgen_is_c45_match(phydev, RTL_8251B, true);
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static int rtlgen_resume(struct phy_device *phydev)
|
||||
{
|
||||
int ret = genphy_resume(phydev);
|
||||
@@ -1427,6 +1450,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1460,6 +1483,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc838),
|
||||
.name = "RTL8226-CG 2.5Gbps PHY",
|
||||
@ -58,7 +58,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@@ -1438,6 +1462,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1471,6 +1495,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc848),
|
||||
.name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
|
||||
@ -66,7 +66,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@@ -1451,6 +1476,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1484,6 +1509,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
|
||||
@ -74,7 +74,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@@ -1464,6 +1490,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1497,6 +1523,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
|
||||
@ -82,7 +82,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.config_init = rtl822xb_config_init,
|
||||
.get_rate_matching = rtl822xb_get_rate_matching,
|
||||
@@ -1475,6 +1502,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1508,6 +1535,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
|
||||
@ -90,7 +90,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@@ -1488,6 +1516,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1521,6 +1549,7 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1120,10 +1120,32 @@ static int rtl8226_match_phy_device(stru
|
||||
@@ -1139,10 +1139,32 @@ static int rtl8226_match_phy_device(stru
|
||||
static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
|
||||
bool is_c45)
|
||||
{
|
||||
@ -49,4 +49,4 @@ Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
|
||||
+ }
|
||||
}
|
||||
|
||||
static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
|
||||
static int rtl8221b_match_phy_device(struct phy_device *phydev)
|
||||
|
@ -12,7 +12,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1332,6 +1332,51 @@ static irqreturn_t rtl9000a_handle_inter
|
||||
@@ -1369,6 +1369,51 @@ static irqreturn_t rtl9000a_handle_inter
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
static struct phy_driver realtek_drvs[] = {
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(0x00008201),
|
||||
@@ -1498,6 +1543,8 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1531,6 +1576,8 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
|
||||
@ -73,7 +73,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
.probe = rtl822x_probe,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
@@ -1512,6 +1559,8 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1545,6 +1592,8 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
|
||||
@ -82,7 +82,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
.probe = rtl822x_probe,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.config_init = rtl822xb_config_init,
|
||||
@@ -1524,6 +1573,8 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1557,6 +1606,8 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
|
||||
.name = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
|
||||
@ -91,7 +91,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
.probe = rtl822x_probe,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.get_features = rtl822x_get_features,
|
||||
@@ -1538,6 +1589,8 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1571,6 +1622,8 @@ static struct phy_driver realtek_drvs[]
|
||||
}, {
|
||||
.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
|
||||
.name = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
|
||||
|
@ -0,0 +1,181 @@
|
||||
From: Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>
|
||||
To: Pavel Machek <pavel@ucw.cz>, Lee Jones <lee@kernel.org>,
|
||||
Rob Herring <robh@kernel.org>,
|
||||
Krzysztof Kozlowski <krzk+dt@kernel.org>,
|
||||
Conor Dooley <conor+dt@kernel.org>,
|
||||
Jonathan Corbet <corbet@lwn.net>,
|
||||
Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>,
|
||||
linux-leds@vger.kernel.org, devicetree@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org
|
||||
Cc: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Subject: [PATCH v11 2/3] dt-bindings: leds: Add LED1202 LED Controller
|
||||
Date: Wed, 18 Dec 2024 18:33:58 +0000 [thread overview]
|
||||
Message-ID: <20241218183401.41687-3-vicentiu.galanopulo@remote-tech.co.uk> (raw)
|
||||
In-Reply-To: <20241218183401.41687-1-vicentiu.galanopulo@remote-tech.co.uk>
|
||||
|
||||
The LED1202 is a 12-channel low quiescent current LED driver with:
|
||||
* Supply range from 2.6 V to 5 V
|
||||
* 20 mA current capability per channel
|
||||
* 1.8 V compatible I2C control interface
|
||||
* 8-bit analog dimming individual control
|
||||
* 12-bit local PWM resolution
|
||||
* 8 programmable patterns
|
||||
|
||||
If the led node is present in the controller then the channel is
|
||||
set to active.
|
||||
|
||||
Signed-off-by: Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
---
|
||||
v1: https://lore.kernel.org/lkml/ZnCnnQfwuRueCIQ0@admins-Air/T/
|
||||
v2: https://lore.kernel.org/all/ZniNdGgKyUMV-hjq@admins-Air/T/
|
||||
v3: https://lore.kernel.org/all/ZniNdGgKyUMV-hjq@admins-Air/T/
|
||||
|
||||
Changes in v4:
|
||||
- remove label property, use devm_led_classdev_register_ext instead
|
||||
Changes in v3:
|
||||
- remove active property
|
||||
Changes in v2:
|
||||
- renamed label to remove color from it
|
||||
- add color property for each node
|
||||
- add function and function-enumerator property for each node
|
||||
|
||||
.../devicetree/bindings/leds/st,led1202.yaml | 132 ++++++++++++++++++
|
||||
1 file changed, 132 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/leds/st,led1202.yaml
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/leds/st,led1202.yaml
|
||||
@@ -0,0 +1,132 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/leds/st,led1202.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: ST LED1202 LED controllers
|
||||
+
|
||||
+maintainers:
|
||||
+ - Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>
|
||||
+
|
||||
+description: |
|
||||
+ The LED1202 is a 12-channel low quiescent current LED controller
|
||||
+ programmable via I2C; The output current can be adjusted separately
|
||||
+ for each channel by 8-bit analog and 12-bit digital dimming control.
|
||||
+ Datasheet available at
|
||||
+ https://www.st.com/en/power-management/led1202.html
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: st,led1202
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ "#address-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+ "#size-cells":
|
||||
+ const: 0
|
||||
+
|
||||
+patternProperties:
|
||||
+ "^led@[0-9a-f]$":
|
||||
+ type: object
|
||||
+ $ref: common.yaml#
|
||||
+ unevaluatedProperties: false
|
||||
+
|
||||
+ properties:
|
||||
+ reg:
|
||||
+ minimum: 0
|
||||
+ maximum: 11
|
||||
+
|
||||
+ required:
|
||||
+ - reg
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - "#address-cells"
|
||||
+ - "#size-cells"
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/leds/common.h>
|
||||
+
|
||||
+ i2c {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ led-controller@58 {
|
||||
+ compatible = "st,led1202";
|
||||
+ reg = <0x58>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ led@0 {
|
||||
+ reg = <0x0>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_RED>;
|
||||
+ function-enumerator = <1>;
|
||||
+ };
|
||||
+
|
||||
+ led@1 {
|
||||
+ reg = <0x1>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ function-enumerator = <2>;
|
||||
+ };
|
||||
+
|
||||
+ led@2 {
|
||||
+ reg = <0x2>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_BLUE>;
|
||||
+ function-enumerator = <3>;
|
||||
+ };
|
||||
+
|
||||
+ led@3 {
|
||||
+ reg = <0x3>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_RED>;
|
||||
+ function-enumerator = <4>;
|
||||
+ };
|
||||
+
|
||||
+ led@4 {
|
||||
+ reg = <0x4>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ function-enumerator = <5>;
|
||||
+ };
|
||||
+
|
||||
+ led@5 {
|
||||
+ reg = <0x5>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_BLUE>;
|
||||
+ function-enumerator = <6>;
|
||||
+ };
|
||||
+
|
||||
+ led@6 {
|
||||
+ reg = <0x6>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_RED>;
|
||||
+ function-enumerator = <7>;
|
||||
+ };
|
||||
+
|
||||
+ led@7 {
|
||||
+ reg = <0x7>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ function-enumerator = <8>;
|
||||
+ };
|
||||
+
|
||||
+ led@8 {
|
||||
+ reg = <0x8>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_BLUE>;
|
||||
+ function-enumerator = <9>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+...
|
@ -0,0 +1,513 @@
|
||||
From: Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>
|
||||
To: Pavel Machek <pavel@ucw.cz>, Lee Jones <lee@kernel.org>,
|
||||
Rob Herring <robh@kernel.org>,
|
||||
Krzysztof Kozlowski <krzk+dt@kernel.org>,
|
||||
Conor Dooley <conor+dt@kernel.org>,
|
||||
Jonathan Corbet <corbet@lwn.net>,
|
||||
Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>,
|
||||
linux-leds@vger.kernel.org, devicetree@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org
|
||||
Subject: [PATCH v11 3/3] leds: Add LED1202 I2C driver
|
||||
Date: Wed, 18 Dec 2024 18:33:59 +0000 [thread overview]
|
||||
Message-ID: <20241218183401.41687-4-vicentiu.galanopulo@remote-tech.co.uk> (raw)
|
||||
In-Reply-To: <20241218183401.41687-1-vicentiu.galanopulo@remote-tech.co.uk>
|
||||
|
||||
The output current can be adjusted separately for each channel by 8-bit
|
||||
analog (current sink input) and 12-bit digital (PWM) dimming control. The
|
||||
LED1202 implements 12 low-side current generators with independent dimming
|
||||
control.
|
||||
Internal volatile memory allows the user to store up to 8 different patterns,
|
||||
each pattern is a particular output configuration in terms of PWM
|
||||
duty-cycle (on 4096 steps). Analog dimming (on 256 steps) is per channel but
|
||||
common to all patterns. Each device tree LED node will have a corresponding
|
||||
entry in /sys/class/leds with the label name. The brightness property
|
||||
corresponds to the per channel analog dimming, while the patterns[1-8] to the
|
||||
PWM dimming control.
|
||||
|
||||
Signed-off-by: Vicentiu Galanopulo <vicentiu.galanopulo@remote-tech.co.uk>
|
||||
---
|
||||
Changes in v10:
|
||||
- update description help in Kconfig
|
||||
- move st1202_led and st1202_chip into one line, declaration and definition
|
||||
Changes in v9:
|
||||
- log errors directly in st1202_write_reg and st1202_read_reg
|
||||
- use mutex guards instead of lock/unlock
|
||||
- remove i2c_set_clientdata
|
||||
Changes in v7:
|
||||
- fix st1202_brightness_get() error: uninitialized symbol 'value'
|
||||
Changes in v6:
|
||||
- fix build error
|
||||
Changes in v5:
|
||||
- remove unused macros
|
||||
- switch to using devm_led_classdev_register_ext (struct st1202_led update)
|
||||
- add prescalar_to_milliseconds (convert [22..5660]ms to [0..255] reg value)
|
||||
- remove register range check in dt_init (range protected by yaml)
|
||||
- address all review comments in v4
|
||||
Changes in v4:
|
||||
- Remove attributes/extended attributes implementation
|
||||
- Use /sys/class/leds/<led>/hw_pattern (Pavel suggestion)
|
||||
- Implement review findings of Christophe JAILLET
|
||||
Changes in v3:
|
||||
- Rename all ll1202 to st1202, including driver file name
|
||||
- Convert all magic numbers to defines
|
||||
- Refactor the show/store callbacks as per Lee's and Thomas's review
|
||||
- Remove ll1202_get_channel and use dev_ext_attributes instead
|
||||
- Log all error values for all the functions
|
||||
- Use sysfs_emit for show callbacks
|
||||
Changes in v2:
|
||||
- Fix build error for device_attribute modes
|
||||
|
||||
drivers/leds/Kconfig | 10 +
|
||||
drivers/leds/Makefile | 1 +
|
||||
drivers/leds/leds-st1202.c | 416 +++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 427 insertions(+)
|
||||
create mode 100644 drivers/leds/leds-st1202.c
|
||||
|
||||
--- a/drivers/leds/Kconfig
|
||||
+++ b/drivers/leds/Kconfig
|
||||
@@ -865,6 +865,16 @@ config LEDS_LM36274
|
||||
Say Y to enable the LM36274 LED driver for TI LMU devices.
|
||||
This supports the LED device LM36274.
|
||||
|
||||
+config LEDS_ST1202
|
||||
+ tristate "LED Support for STMicroelectronics LED1202 I2C chips"
|
||||
+ depends on LEDS_CLASS
|
||||
+ depends on I2C
|
||||
+ depends on OF
|
||||
+ select LEDS_TRIGGERS
|
||||
+ help
|
||||
+ Say Y to enable support for LEDs connected to LED1202
|
||||
+ LED driver chips accessed via the I2C bus.
|
||||
+
|
||||
config LEDS_TPS6105X
|
||||
tristate "LED support for TI TPS6105X"
|
||||
depends on LEDS_CLASS
|
||||
--- a/drivers/leds/Makefile
|
||||
+++ b/drivers/leds/Makefile
|
||||
@@ -78,6 +78,7 @@ obj-$(CONFIG_LEDS_POWERNV) += leds-powe
|
||||
obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
|
||||
obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
|
||||
obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o
|
||||
+obj-$(CONFIG_LEDS_ST1202) += leds-st1202.o
|
||||
obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o
|
||||
obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o
|
||||
obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/leds/leds-st1202.c
|
||||
@@ -0,0 +1,416 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * LED driver for STMicroelectronics LED1202 chip
|
||||
+ *
|
||||
+ * Copyright (C) 2024 Remote-Tech Ltd. UK
|
||||
+ */
|
||||
+
|
||||
+#include <linux/cleanup.h>
|
||||
+#include <linux/ctype.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/string.h>
|
||||
+
|
||||
+#define ST1202_CHAN_DISABLE_ALL 0x00
|
||||
+#define ST1202_CHAN_ENABLE_HIGH 0x03
|
||||
+#define ST1202_CHAN_ENABLE_LOW 0x02
|
||||
+#define ST1202_CONFIG_REG 0x04
|
||||
+/* PATS: Pattern sequence feature enable */
|
||||
+#define ST1202_CONFIG_REG_PATS BIT(7)
|
||||
+/* PATSR: Pattern sequence runs (self-clear when sequence is finished) */
|
||||
+#define ST1202_CONFIG_REG_PATSR BIT(6)
|
||||
+#define ST1202_CONFIG_REG_SHFT BIT(3)
|
||||
+#define ST1202_DEV_ENABLE 0x01
|
||||
+#define ST1202_DEV_ENABLE_ON BIT(0)
|
||||
+#define ST1202_DEV_ENABLE_RESET BIT(7)
|
||||
+#define ST1202_DEVICE_ID 0x00
|
||||
+#define ST1202_ILED_REG0 0x09
|
||||
+#define ST1202_MAX_LEDS 12
|
||||
+#define ST1202_MAX_PATTERNS 8
|
||||
+#define ST1202_MILLIS_PATTERN_DUR_MAX 5660
|
||||
+#define ST1202_MILLIS_PATTERN_DUR_MIN 22
|
||||
+#define ST1202_PATTERN_DUR 0x16
|
||||
+#define ST1202_PATTERN_PWM 0x1E
|
||||
+#define ST1202_PATTERN_REP 0x15
|
||||
+
|
||||
+struct st1202_led {
|
||||
+ struct fwnode_handle *fwnode;
|
||||
+ struct led_classdev led_cdev;
|
||||
+ struct st1202_chip *chip;
|
||||
+ bool is_active;
|
||||
+ int led_num;
|
||||
+};
|
||||
+
|
||||
+struct st1202_chip {
|
||||
+ struct i2c_client *client;
|
||||
+ struct mutex lock;
|
||||
+ struct st1202_led leds[ST1202_MAX_LEDS];
|
||||
+};
|
||||
+
|
||||
+static struct st1202_led *cdev_to_st1202_led(struct led_classdev *cdev)
|
||||
+{
|
||||
+ return container_of(cdev, struct st1202_led, led_cdev);
|
||||
+}
|
||||
+
|
||||
+static int st1202_read_reg(struct st1202_chip *chip, int reg, uint8_t *val)
|
||||
+{
|
||||
+ struct device *dev = &chip->client->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = i2c_smbus_read_byte_data(chip->client, reg);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "Failed to read register [0x%x]: %d\n", reg, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ *val = (uint8_t)ret;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_write_reg(struct st1202_chip *chip, int reg, uint8_t val)
|
||||
+{
|
||||
+ struct device *dev = &chip->client->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = i2c_smbus_write_byte_data(chip->client, reg, val);
|
||||
+ if (ret != 0)
|
||||
+ dev_err(dev, "Failed to write %d to register [0x%x]: %d\n", val, reg, ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static uint8_t st1202_prescalar_to_miliseconds(unsigned int value)
|
||||
+{
|
||||
+ return value / ST1202_MILLIS_PATTERN_DUR_MIN - 1;
|
||||
+}
|
||||
+
|
||||
+static int st1202_pwm_pattern_write(struct st1202_chip *chip, int led_num,
|
||||
+ int pattern, unsigned int value)
|
||||
+{
|
||||
+ u8 value_l, value_h;
|
||||
+ int ret;
|
||||
+
|
||||
+ value_l = (u8)value;
|
||||
+ value_h = (u8)(value >> 8);
|
||||
+
|
||||
+ /*
|
||||
+ * Datasheet: Register address low = 1Eh + 2*(xh) + 18h*(yh),
|
||||
+ * where x is the channel number (led number) in hexadecimal (x = 00h .. 0Bh)
|
||||
+ * and y is the pattern number in hexadecimal (y = 00h .. 07h)
|
||||
+ */
|
||||
+ ret = st1202_write_reg(chip, (ST1202_PATTERN_PWM + (led_num * 2) + 0x18 * pattern),
|
||||
+ value_l);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Datasheet: Register address high = 1Eh + 01h + 2(xh) +18h*(yh),
|
||||
+ * where x is the channel number in hexadecimal (x = 00h .. 0Bh)
|
||||
+ * and y is the pattern number in hexadecimal (y = 00h .. 07h)
|
||||
+ */
|
||||
+ ret = st1202_write_reg(chip, (ST1202_PATTERN_PWM + 0x1 + (led_num * 2) + 0x18 * pattern),
|
||||
+ value_h);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_duration_pattern_write(struct st1202_chip *chip, int pattern,
|
||||
+ unsigned int value)
|
||||
+{
|
||||
+ return st1202_write_reg(chip, (ST1202_PATTERN_DUR + pattern),
|
||||
+ st1202_prescalar_to_miliseconds(value));
|
||||
+}
|
||||
+
|
||||
+static void st1202_brightness_set(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness value)
|
||||
+{
|
||||
+ struct st1202_led *led = cdev_to_st1202_led(led_cdev);
|
||||
+ struct st1202_chip *chip = led->chip;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ st1202_write_reg(chip, ST1202_ILED_REG0 + led->led_num, value);
|
||||
+}
|
||||
+
|
||||
+static enum led_brightness st1202_brightness_get(struct led_classdev *led_cdev)
|
||||
+{
|
||||
+ struct st1202_led *led = cdev_to_st1202_led(led_cdev);
|
||||
+ struct st1202_chip *chip = led->chip;
|
||||
+ u8 value = 0;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ st1202_read_reg(chip, ST1202_ILED_REG0 + led->led_num, &value);
|
||||
+
|
||||
+ return value;
|
||||
+}
|
||||
+
|
||||
+static int st1202_channel_set(struct st1202_chip *chip, int led_num, bool active)
|
||||
+{
|
||||
+ u8 chan_low, chan_high;
|
||||
+ int ret;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ if (led_num <= 7) {
|
||||
+ ret = st1202_read_reg(chip, ST1202_CHAN_ENABLE_LOW, &chan_low);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ chan_low = active ? chan_low | BIT(led_num) : chan_low & ~BIT(led_num);
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_CHAN_ENABLE_LOW, chan_low);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ } else {
|
||||
+ ret = st1202_read_reg(chip, ST1202_CHAN_ENABLE_HIGH, &chan_high);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ chan_high = active ? chan_high | (BIT(led_num) >> 8) :
|
||||
+ chan_high & ~(BIT(led_num) >> 8);
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_CHAN_ENABLE_HIGH, chan_high);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_led_set(struct led_classdev *ldev, enum led_brightness value)
|
||||
+{
|
||||
+ struct st1202_led *led = cdev_to_st1202_led(ldev);
|
||||
+ struct st1202_chip *chip = led->chip;
|
||||
+
|
||||
+ return st1202_channel_set(chip, led->led_num, value == LED_OFF ? false : true);
|
||||
+}
|
||||
+
|
||||
+static int st1202_led_pattern_clear(struct led_classdev *ldev)
|
||||
+{
|
||||
+ struct st1202_led *led = cdev_to_st1202_led(ldev);
|
||||
+ struct st1202_chip *chip = led->chip;
|
||||
+ int ret;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ for (int patt = 0; patt < ST1202_MAX_PATTERNS; patt++) {
|
||||
+ ret = st1202_pwm_pattern_write(chip, led->led_num, patt, LED_OFF);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_duration_pattern_write(chip, patt, ST1202_MILLIS_PATTERN_DUR_MIN);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_led_pattern_set(struct led_classdev *ldev,
|
||||
+ struct led_pattern *pattern,
|
||||
+ u32 len, int repeat)
|
||||
+{
|
||||
+ struct st1202_led *led = cdev_to_st1202_led(ldev);
|
||||
+ struct st1202_chip *chip = led->chip;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (len > ST1202_MAX_PATTERNS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ for (int patt = 0; patt < len; patt++) {
|
||||
+ if (pattern[patt].delta_t < ST1202_MILLIS_PATTERN_DUR_MIN ||
|
||||
+ pattern[patt].delta_t > ST1202_MILLIS_PATTERN_DUR_MAX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ret = st1202_pwm_pattern_write(chip, led->led_num, patt, pattern[patt].brightness);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_duration_pattern_write(chip, patt, pattern[patt].delta_t);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_PATTERN_REP, repeat);
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_CONFIG_REG, (ST1202_CONFIG_REG_PATSR |
|
||||
+ ST1202_CONFIG_REG_PATS | ST1202_CONFIG_REG_SHFT));
|
||||
+ if (ret != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_dt_init(struct st1202_chip *chip)
|
||||
+{
|
||||
+ struct device *dev = &chip->client->dev;
|
||||
+ struct st1202_led *led;
|
||||
+ int err, reg;
|
||||
+
|
||||
+ for_each_available_child_of_node_scoped(dev_of_node(dev), child) {
|
||||
+ struct led_init_data init_data = {};
|
||||
+
|
||||
+ err = of_property_read_u32(child, "reg", ®);
|
||||
+ if (err)
|
||||
+ return dev_err_probe(dev, err, "Invalid register\n");
|
||||
+
|
||||
+ led = &chip->leds[reg];
|
||||
+ led->is_active = true;
|
||||
+ led->fwnode = of_fwnode_handle(child);
|
||||
+
|
||||
+ led->led_cdev.max_brightness = U8_MAX;
|
||||
+ led->led_cdev.brightness_set_blocking = st1202_led_set;
|
||||
+ led->led_cdev.pattern_set = st1202_led_pattern_set;
|
||||
+ led->led_cdev.pattern_clear = st1202_led_pattern_clear;
|
||||
+ led->led_cdev.default_trigger = "pattern";
|
||||
+
|
||||
+ init_data.fwnode = led->fwnode;
|
||||
+ init_data.devicename = "st1202";
|
||||
+ init_data.default_label = ":";
|
||||
+
|
||||
+ err = devm_led_classdev_register_ext(dev, &led->led_cdev, &init_data);
|
||||
+ if (err < 0)
|
||||
+ return dev_err_probe(dev, err, "Failed to register LED class device\n");
|
||||
+
|
||||
+ led->led_cdev.brightness_set = st1202_brightness_set;
|
||||
+ led->led_cdev.brightness_get = st1202_brightness_get;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_setup(struct st1202_chip *chip)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ guard(mutex)(&chip->lock);
|
||||
+
|
||||
+ /*
|
||||
+ * Once the supply voltage is applied, the LED1202 executes some internal checks,
|
||||
+ * afterwords it stops the oscillator and puts the internal LDO in quiescent mode.
|
||||
+ * To start the device, EN bit must be set inside the “Device Enable” register at
|
||||
+ * address 01h. As soon as EN is set, the LED1202 loads the adjustment parameters
|
||||
+ * from the internal non-volatile memory and performs an auto-calibration procedure
|
||||
+ * in order to increase the output current precision.
|
||||
+ * Such initialization lasts about 6.5 ms.
|
||||
+ */
|
||||
+
|
||||
+ /* Reset the chip during setup */
|
||||
+ ret = st1202_write_reg(chip, ST1202_DEV_ENABLE, ST1202_DEV_ENABLE_RESET);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Enable phase-shift delay feature */
|
||||
+ ret = st1202_write_reg(chip, ST1202_CONFIG_REG, ST1202_CONFIG_REG_SHFT);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Enable the device */
|
||||
+ ret = st1202_write_reg(chip, ST1202_DEV_ENABLE, ST1202_DEV_ENABLE_ON);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Duration of initialization */
|
||||
+ usleep_range(6500, 10000);
|
||||
+
|
||||
+ /* Deactivate all LEDS (channels) and activate only the ones found in Device Tree */
|
||||
+ ret = st1202_write_reg(chip, ST1202_CHAN_ENABLE_LOW, ST1202_CHAN_DISABLE_ALL);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_CHAN_ENABLE_HIGH, ST1202_CHAN_DISABLE_ALL);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_write_reg(chip, ST1202_CONFIG_REG,
|
||||
+ ST1202_CONFIG_REG_PATS | ST1202_CONFIG_REG_PATSR);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int st1202_probe(struct i2c_client *client)
|
||||
+{
|
||||
+ struct st1202_chip *chip;
|
||||
+ struct st1202_led *led;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
+ return dev_err_probe(&client->dev, -EIO, "SMBUS Byte Data not Supported\n");
|
||||
+
|
||||
+ chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
|
||||
+ if (!chip)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ devm_mutex_init(&client->dev, &chip->lock);
|
||||
+ chip->client = client;
|
||||
+
|
||||
+ ret = st1202_dt_init(chip);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = st1202_setup(chip);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ for (int i = 0; i < ST1202_MAX_LEDS; i++) {
|
||||
+ led = &chip->leds[i];
|
||||
+ led->chip = chip;
|
||||
+ led->led_num = i;
|
||||
+
|
||||
+ if (!led->is_active)
|
||||
+ continue;
|
||||
+
|
||||
+ ret = st1202_channel_set(led->chip, led->led_num, true);
|
||||
+ if (ret < 0)
|
||||
+ return dev_err_probe(&client->dev, ret,
|
||||
+ "Failed to activate LED channel\n");
|
||||
+
|
||||
+ ret = st1202_led_pattern_clear(&led->led_cdev);
|
||||
+ if (ret < 0)
|
||||
+ return dev_err_probe(&client->dev, ret,
|
||||
+ "Failed to clear LED pattern\n");
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_device_id st1202_id[] = {
|
||||
+ { "st1202-i2c" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(i2c, st1202_id);
|
||||
+
|
||||
+static const struct of_device_id st1202_dt_ids[] = {
|
||||
+ { .compatible = "st,led1202" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, st1202_dt_ids);
|
||||
+
|
||||
+static struct i2c_driver st1202_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "leds-st1202",
|
||||
+ .of_match_table = of_match_ptr(st1202_dt_ids),
|
||||
+ },
|
||||
+ .probe = st1202_probe,
|
||||
+ .id_table = st1202_id,
|
||||
+};
|
||||
+module_i2c_driver(st1202_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Remote Tech LTD");
|
||||
+MODULE_DESCRIPTION("STMicroelectronics LED1202 : 12-channel constant current LED driver");
|
||||
+MODULE_LICENSE("GPL");
|
@ -52,6 +52,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_status_green;
|
||||
led-failsafe = &led_status_green;
|
||||
led-running = &led_status_green;
|
||||
|
@ -15,6 +15,8 @@
|
||||
led-failsafe = &status;
|
||||
led-running = &status;
|
||||
led-upgrade = &status;
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
ethernet1 = &swport5;
|
||||
};
|
||||
|
||||
|
@ -21,6 +21,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_user;
|
||||
led-failsafe = &led_user;
|
||||
led-running = &led_user;
|
||||
|
@ -11,6 +11,8 @@
|
||||
compatible = "ezviz,cs-w3-wd1200g-eup";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_status_green;
|
||||
led-failsafe = &led_status_red;
|
||||
led-running = &led_status_blue;
|
||||
|
@ -11,6 +11,8 @@
|
||||
compatible = "dlink,dap-2610";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_red;
|
||||
led-failsafe = &led_red;
|
||||
led-running = &led_green;
|
||||
|
@ -11,6 +11,8 @@
|
||||
compatible = "linksys,ea6350v3";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &power;
|
||||
led-failsafe = &power;
|
||||
led-running = &power;
|
||||
|
@ -41,6 +41,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &power;
|
||||
led-failsafe = &power;
|
||||
led-running = &power;
|
||||
|
@ -46,6 +46,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &power_amber;
|
||||
led-failsafe = &power_amber;
|
||||
led-running = &power_green;
|
||||
|
@ -11,6 +11,7 @@
|
||||
compatible = "avm,fritzbox-4040";
|
||||
|
||||
aliases {
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &power;
|
||||
led-failsafe = &flash;
|
||||
led-running = &power;
|
||||
|
@ -11,6 +11,8 @@
|
||||
compatible = "glinet,gl-a1300", "qcom,ipq4019";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_run;
|
||||
led-failsafe = &led_run;
|
||||
led-running = &led_run;
|
||||
|
@ -11,6 +11,8 @@
|
||||
compatible = "glinet,gl-ap1300";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
|
@ -21,6 +21,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_user;
|
||||
led-failsafe = &led_user;
|
||||
led-running = &led_user;
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
ethernet1 = &swport5;
|
||||
};
|
||||
|
||||
|
@ -9,6 +9,11 @@
|
||||
model = "devolo Magic 2 WiFi next";
|
||||
compatible = "devolo,magic-2-wifi-next";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x80000000 0x10000000>;
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_status;
|
||||
led-failsafe = &led_status;
|
||||
led-running = &led_status;
|
||||
|
@ -21,6 +21,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &power;
|
||||
led-failsafe = &power;
|
||||
led-running = &power;
|
||||
|
@ -52,6 +52,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_status_purple;
|
||||
led-failsafe = &led_status_yellow;
|
||||
led-running = &led_status_cyan;
|
||||
|
@ -16,6 +16,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
|
@ -7,6 +7,8 @@
|
||||
compatible = "teltonika,rutx50";
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_rssi0;
|
||||
led-failsafe = &led_rssi0;
|
||||
led-running = &led_rssi0;
|
||||
|
@ -21,6 +21,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_user;
|
||||
led-failsafe = &led_user;
|
||||
led-running = &led_user;
|
||||
|
@ -16,6 +16,8 @@
|
||||
led-failsafe = &led_power_amber;
|
||||
led-running = &led_power_green;
|
||||
led-upgrade = &led_power_amber;
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
ethernet1 = &swport5;
|
||||
};
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
// TODO: Verify if the ethernet0 alias is needed
|
||||
ethernet0 = &gmac;
|
||||
led-boot = &led_user;
|
||||
led-failsafe = &led_user;
|
||||
led-running = &led_user;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user