Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
4fbf4329b0
@ -0,0 +1,219 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Fri, 30 Jun 2023 13:11:51 +0200
|
||||
Subject: [PATCH] mac80211: split mesh fast tx cache into
|
||||
local/proxied/forwarded
|
||||
|
||||
Depending on the origin of the packets (and their SA), 802.11 + mesh headers
|
||||
could be filled in differently. In order to properly deal with that, add a
|
||||
new field to the lookup key, indicating the type (local, proxied or
|
||||
forwarded). This can fix spurious packet drop issues that depend on the order
|
||||
in which nodes/hosts communicate with each other.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/mesh.c
|
||||
+++ b/net/mac80211/mesh.c
|
||||
@@ -703,6 +703,9 @@ bool ieee80211_mesh_xmit_fast(struct iee
|
||||
struct sk_buff *skb, u32 ctrl_flags)
|
||||
{
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
+ struct ieee80211_mesh_fast_tx_key key = {
|
||||
+ .type = MESH_FAST_TX_TYPE_LOCAL
|
||||
+ };
|
||||
struct ieee80211_mesh_fast_tx *entry;
|
||||
struct ieee80211s_hdr *meshhdr;
|
||||
u8 sa[ETH_ALEN] __aligned(2);
|
||||
@@ -738,7 +741,10 @@ bool ieee80211_mesh_xmit_fast(struct iee
|
||||
return false;
|
||||
}
|
||||
|
||||
- entry = mesh_fast_tx_get(sdata, skb->data);
|
||||
+ ether_addr_copy(key.addr, skb->data);
|
||||
+ if (!ether_addr_equal(skb->data + ETH_ALEN, sdata->vif.addr))
|
||||
+ key.type = MESH_FAST_TX_TYPE_PROXIED;
|
||||
+ entry = mesh_fast_tx_get(sdata, &key);
|
||||
if (!entry)
|
||||
return false;
|
||||
|
||||
--- a/net/mac80211/mesh.h
|
||||
+++ b/net/mac80211/mesh.h
|
||||
@@ -133,9 +133,33 @@ struct mesh_path {
|
||||
#define MESH_FAST_TX_CACHE_TIMEOUT 8000 /* msecs */
|
||||
|
||||
/**
|
||||
+ * enum ieee80211_mesh_fast_tx_type - cached mesh fast tx entry type
|
||||
+ *
|
||||
+ * @MESH_FAST_TX_TYPE_LOCAL: tx from the local vif address as SA
|
||||
+ * @MESH_FAST_TX_TYPE_PROXIED: local tx with a different SA (e.g. bridged)
|
||||
+ * @MESH_FAST_TX_TYPE_FORWARDED: forwarded from a different mesh point
|
||||
+ */
|
||||
+enum ieee80211_mesh_fast_tx_type {
|
||||
+ MESH_FAST_TX_TYPE_LOCAL,
|
||||
+ MESH_FAST_TX_TYPE_PROXIED,
|
||||
+ MESH_FAST_TX_TYPE_FORWARDED,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * struct ieee80211_mesh_fast_tx_key - cached mesh fast tx entry key
|
||||
+ *
|
||||
+ * @addr: The Ethernet DA for this entry
|
||||
+ * @type: cache entry type
|
||||
+ */
|
||||
+struct ieee80211_mesh_fast_tx_key {
|
||||
+ u8 addr[ETH_ALEN] __aligned(2);
|
||||
+ enum ieee80211_mesh_fast_tx_type type;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* struct ieee80211_mesh_fast_tx - cached mesh fast tx entry
|
||||
* @rhash: rhashtable pointer
|
||||
- * @addr_key: The Ethernet DA which is the key for this entry
|
||||
+ * @key: the lookup key for this cache entry
|
||||
* @fast_tx: base fast_tx data
|
||||
* @hdr: cached mesh and rfc1042 headers
|
||||
* @hdrlen: length of mesh + rfc1042
|
||||
@@ -146,7 +170,7 @@ struct mesh_path {
|
||||
*/
|
||||
struct ieee80211_mesh_fast_tx {
|
||||
struct rhash_head rhash;
|
||||
- u8 addr_key[ETH_ALEN] __aligned(2);
|
||||
+ struct ieee80211_mesh_fast_tx_key key;
|
||||
|
||||
struct ieee80211_fast_tx fast_tx;
|
||||
u8 hdr[sizeof(struct ieee80211s_hdr) + sizeof(rfc1042_header)];
|
||||
@@ -329,7 +353,8 @@ void mesh_path_tx_root_frame(struct ieee
|
||||
|
||||
bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt);
|
||||
struct ieee80211_mesh_fast_tx *
|
||||
-mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr);
|
||||
+mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_mesh_fast_tx_key *key);
|
||||
bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb, u32 ctrl_flags);
|
||||
void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,
|
||||
--- a/net/mac80211/mesh_pathtbl.c
|
||||
+++ b/net/mac80211/mesh_pathtbl.c
|
||||
@@ -36,8 +36,8 @@ static const struct rhashtable_params me
|
||||
static const struct rhashtable_params fast_tx_rht_params = {
|
||||
.nelem_hint = 10,
|
||||
.automatic_shrinking = true,
|
||||
- .key_len = ETH_ALEN,
|
||||
- .key_offset = offsetof(struct ieee80211_mesh_fast_tx, addr_key),
|
||||
+ .key_len = sizeof(struct ieee80211_mesh_fast_tx_key),
|
||||
+ .key_offset = offsetof(struct ieee80211_mesh_fast_tx, key),
|
||||
.head_offset = offsetof(struct ieee80211_mesh_fast_tx, rhash),
|
||||
.hashfn = mesh_table_hash,
|
||||
};
|
||||
@@ -426,20 +426,21 @@ static void mesh_fast_tx_entry_free(stru
|
||||
}
|
||||
|
||||
struct ieee80211_mesh_fast_tx *
|
||||
-mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr)
|
||||
+mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_mesh_fast_tx_key *key)
|
||||
{
|
||||
struct ieee80211_mesh_fast_tx *entry;
|
||||
struct mesh_tx_cache *cache;
|
||||
|
||||
cache = &sdata->u.mesh.tx_cache;
|
||||
- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
|
||||
+ entry = rhashtable_lookup(&cache->rht, key, fast_tx_rht_params);
|
||||
if (!entry)
|
||||
return NULL;
|
||||
|
||||
if (!(entry->mpath->flags & MESH_PATH_ACTIVE) ||
|
||||
mpath_expired(entry->mpath)) {
|
||||
spin_lock_bh(&cache->walk_lock);
|
||||
- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
|
||||
+ entry = rhashtable_lookup(&cache->rht, key, fast_tx_rht_params);
|
||||
if (entry)
|
||||
mesh_fast_tx_entry_free(cache, entry);
|
||||
spin_unlock_bh(&cache->walk_lock);
|
||||
@@ -484,18 +485,24 @@ void mesh_fast_tx_cache(struct ieee80211
|
||||
if (!sta)
|
||||
return;
|
||||
|
||||
+ build.key.type = MESH_FAST_TX_TYPE_LOCAL;
|
||||
if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) {
|
||||
/* This is required to keep the mppath alive */
|
||||
mppath = mpp_path_lookup(sdata, meshhdr->eaddr1);
|
||||
if (!mppath)
|
||||
return;
|
||||
build.mppath = mppath;
|
||||
+ if (!ether_addr_equal(meshhdr->eaddr2, sdata->vif.addr))
|
||||
+ build.key.type = MESH_FAST_TX_TYPE_PROXIED;
|
||||
} else if (ieee80211_has_a4(hdr->frame_control)) {
|
||||
mppath = mpath;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (!ether_addr_equal(hdr->addr4, sdata->vif.addr))
|
||||
+ build.key.type = MESH_FAST_TX_TYPE_FORWARDED;
|
||||
+
|
||||
/* rate limit, in case fast xmit can't be enabled */
|
||||
if (mppath->fast_tx_check == jiffies)
|
||||
return;
|
||||
@@ -542,7 +549,7 @@ void mesh_fast_tx_cache(struct ieee80211
|
||||
}
|
||||
}
|
||||
|
||||
- memcpy(build.addr_key, mppath->dst, ETH_ALEN);
|
||||
+ memcpy(build.key.addr, mppath->dst, ETH_ALEN);
|
||||
build.timestamp = jiffies;
|
||||
build.fast_tx.band = info->band;
|
||||
build.fast_tx.da_offs = offsetof(struct ieee80211_hdr, addr3);
|
||||
@@ -644,13 +651,19 @@ void mesh_fast_tx_flush_addr(struct ieee
|
||||
const u8 *addr)
|
||||
{
|
||||
struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;
|
||||
+ struct ieee80211_mesh_fast_tx_key key = {};
|
||||
struct ieee80211_mesh_fast_tx *entry;
|
||||
+ int i;
|
||||
|
||||
+ ether_addr_copy(key.addr, addr);
|
||||
cache = &sdata->u.mesh.tx_cache;
|
||||
spin_lock_bh(&cache->walk_lock);
|
||||
- entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
|
||||
- if (entry)
|
||||
- mesh_fast_tx_entry_free(cache, entry);
|
||||
+ for (i = MESH_FAST_TX_TYPE_LOCAL; i < MESH_FAST_TX_TYPE_FORWARDED; i++) {
|
||||
+ key.type = i;
|
||||
+ entry = rhashtable_lookup(&cache->rht, &key, fast_tx_rht_params);
|
||||
+ if (entry)
|
||||
+ mesh_fast_tx_entry_free(cache, entry);
|
||||
+ }
|
||||
spin_unlock_bh(&cache->walk_lock);
|
||||
}
|
||||
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -2726,7 +2726,10 @@ ieee80211_rx_mesh_fast_forward(struct ie
|
||||
struct sk_buff *skb, int hdrlen)
|
||||
{
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
- struct ieee80211_mesh_fast_tx *entry = NULL;
|
||||
+ struct ieee80211_mesh_fast_tx_key key = {
|
||||
+ .type = MESH_FAST_TX_TYPE_FORWARDED
|
||||
+ };
|
||||
+ struct ieee80211_mesh_fast_tx *entry;
|
||||
struct ieee80211s_hdr *mesh_hdr;
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
struct sta_info *sta;
|
||||
@@ -2735,9 +2738,13 @@ ieee80211_rx_mesh_fast_forward(struct ie
|
||||
|
||||
mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth));
|
||||
if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
|
||||
- entry = mesh_fast_tx_get(sdata, mesh_hdr->eaddr1);
|
||||
+ ether_addr_copy(key.addr, mesh_hdr->eaddr1);
|
||||
else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
|
||||
- entry = mesh_fast_tx_get(sdata, skb->data);
|
||||
+ ether_addr_copy(key.addr, skb->data);
|
||||
+ else
|
||||
+ return false;
|
||||
+
|
||||
+ entry = mesh_fast_tx_get(sdata, &key);
|
||||
if (!entry)
|
||||
return false;
|
||||
|
@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/openwrt/mt76
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2023-05-13
|
||||
PKG_SOURCE_VERSION:=969b7b5ebd129068ca56e4b0d831593a2f92382f
|
||||
PKG_MIRROR_HASH:=d28869591d1cb9a967b72f5cd8215c7b2c3388b7b31147b7b18c797018ab8ffb
|
||||
PKG_SOURCE_DATE:=2023-06-27
|
||||
PKG_SOURCE_VERSION:=f36b921692b940bc74b155575e9a17930b42140d
|
||||
PKG_MIRROR_HASH:=c26dea3a58ba03d539c8e6cc2d3c99ce0cb5bb3b1aac76cab7fea689b6a86e4c
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_USE_NINJA:=0
|
||||
@ -266,7 +266,7 @@ define KernelPackage/mt7921-common
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7615 wireless driver common code
|
||||
HIDDEN:=1
|
||||
DEPENDS+=+kmod-mt76-connac +kmod-mt7921-firmware +@DRIVER_11AX_SUPPORT
|
||||
DEPENDS+=+kmod-mt76-connac +kmod-mt7921-firmware +@DRIVER_11AX_SUPPORT +kmod-hwmon-core
|
||||
FILES:= $(PKG_BUILD_DIR)/mt7921/mt7921-common.ko
|
||||
endef
|
||||
|
||||
|
@ -5,9 +5,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
|
||||
PKG_SOURCE_DATE:=2023-06-23
|
||||
PKG_SOURCE_VERSION:=edf3aced9f9ae4b07cfbb98d3919ddc7a9e44362
|
||||
PKG_MIRROR_HASH:=cae6397d7e10d5f2659bf4c1e66b1ed7198693d2d4e448c414780fcf2a43ea94
|
||||
PKG_SOURCE_DATE:=2023-06-29
|
||||
PKG_SOURCE_VERSION:=1ab992a74b43c7b92667ec2b8480de8fa40df689
|
||||
PKG_MIRROR_HASH:=8664ca50006e654e0f250fadd479e1f280a5fe32923d76583cc4efb02694ffba
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=https://github.com/jow-/ucode.git
|
||||
PKG_SOURCE_DATE:=2023-06-23
|
||||
PKG_SOURCE_DATE:=2023-06-06
|
||||
PKG_SOURCE_VERSION:=c7d84aae09691a99ae3db427c0b2463732ef84f4
|
||||
PKG_MIRROR_HASH:=509746f573343bb63a6c75f7be2577eaa259e18a5a56c7e11b9e9ace272f29d6
|
||||
PKG_MIRROR_HASH:=38826ae70d886d1d7ada3fc6591ac807169aa28107f60f7f2e617520083525fb
|
||||
PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
|
||||
PKG_LICENSE:=ISC
|
||||
|
||||
|
@ -50,23 +50,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static int rtlgen_resume(struct phy_device *phydev)
|
||||
{
|
||||
int ret = genphy_resume(phydev);
|
||||
@@ -1013,6 +1036,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.match_phy_device = rtl8226_match_phy_device,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
+ .probe = rtl822x_probe,
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1026,6 +1050,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226B_RTL8221B 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
+ .probe = rtl822x_probe,
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1039,6 +1064,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1039,6 +1062,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226-CG 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -74,7 +58,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1050,6 +1076,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1050,6 +1074,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -82,7 +66,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1062,6 +1089,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1062,6 +1087,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_init = rtl8221b_config_init,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -90,7 +74,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1074,6 +1102,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1074,6 +1100,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl8221b_config_init,
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static int rtl822x_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
@@ -1084,7 +1116,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1082,7 +1114,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.write_page = rtl821x_write_page,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
}, {
|
||||
|
@ -50,23 +50,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static int rtlgen_resume(struct phy_device *phydev)
|
||||
{
|
||||
int ret = genphy_resume(phydev);
|
||||
@@ -1033,6 +1056,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.match_phy_device = rtl8226_match_phy_device,
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
+ .probe = rtl822x_probe,
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1046,6 +1070,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226B_RTL8221B 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
+ .probe = rtl822x_probe,
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1059,6 +1084,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1059,6 +1082,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226-CG 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -74,7 +58,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1070,6 +1096,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1070,6 +1094,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.name = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -82,7 +66,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1082,6 +1109,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1082,6 +1107,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_init = rtl8221b_config_init,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
@ -90,7 +74,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
.read_status = rtl822x_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = rtlgen_resume,
|
||||
@@ -1094,6 +1122,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1094,6 +1120,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.get_features = rtl822x_get_features,
|
||||
.config_aneg = rtl822x_config_aneg,
|
||||
.config_init = rtl8221b_config_init,
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static int rtl822x_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
@@ -1104,7 +1136,7 @@ static struct phy_driver realtek_drvs[]
|
||||
@@ -1102,7 +1134,7 @@ static struct phy_driver realtek_drvs[]
|
||||
.write_page = rtl821x_write_page,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
}, {
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) Tianling Shen <cnsztl@immortalwrt.org>
|
||||
* Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
Loading…
x
Reference in New Issue
Block a user