Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
@@ -276,13 +276,13 @@ Signed-off-by: Kenneth Kasilag <kenneth@kasilag.me>
|
||||
+
|
||||
+ ubi@700000 {
|
||||
+ label = "ubi";
|
||||
+ reg = <0x00700000 0x1f700000>;
|
||||
+ reg = <0x00700000 0x1b700000>;
|
||||
+ };
|
||||
+
|
||||
+ /* reserved for bad block table */
|
||||
+ reserved_bmt@1fe00000 {
|
||||
+ reserved_bmt@1be00000 {
|
||||
+ label = "reserved_bmt";
|
||||
+ reg = <0x1fe00000 0x00200000>;
|
||||
+ reg = <0x1be00000 0x04200000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ };
|
||||
|
||||
@@ -718,7 +718,7 @@ define U-Boot/mt7981_qihoo_360t7-ubi
|
||||
BUILD_DEVICES:=qihoo_360t7-ubi
|
||||
UBOOT_CONFIG:=mt7981_qihoo-360t7-ubi
|
||||
UBOOT_IMAGE:=u-boot.fip
|
||||
BL2_BOOTDEV:=spim-nand
|
||||
BL2_BOOTDEV:=spim-nand-ubi
|
||||
BL2_SOC:=mt7981
|
||||
BL2_DDRTYPE:=ddr3-1866
|
||||
DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ubi-ddr3-1866
|
||||
|
||||
@@ -187,7 +187,7 @@ endef
|
||||
define KernelPackage/mt7622-firmware
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7622 firmware
|
||||
DEPENDS+=+kmod-mt7615e
|
||||
DEPENDS+=@TARGET_mediatek_mt7622 +kmod-mt7615e
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7663-firmware-ap
|
||||
|
||||
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_NAME:=dnsmasq
|
||||
PKG_UPSTREAM_VERSION:=2.92
|
||||
PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION)))
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq/
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
commit ec2fbfbbdaa7d7db1c707dce26ce1a37cfe09660
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Fri Apr 10 16:29:31 2026 +0100
|
||||
|
||||
Fix buffer overflow in struct bigname. CVE-2026-2291
|
||||
|
||||
All buffers capable of holding a domain name should be
|
||||
at least MAXDNAME*2 + 1 bytes long, where MAXDNAME is the maximum
|
||||
size of a domain name. The accounts for the trailing zero and the
|
||||
fact that some characters are escaped in the internal representation
|
||||
of a domain name in dnsmasq.
|
||||
|
||||
The declaration of struct bigname get this wrong, with the effect
|
||||
that a remote attacker capable of asking DNS queries or answering DNS
|
||||
queries can cause a large OOB write in the heap.
|
||||
|
||||
This was first spotted by Andrew S. Fasano.
|
||||
|
||||
--- a/src/dnsmasq.h
|
||||
+++ b/src/dnsmasq.h
|
||||
@@ -479,7 +479,7 @@ struct interface_name {
|
||||
};
|
||||
|
||||
union bigname {
|
||||
- char name[MAXDNAME];
|
||||
+ char name[(2*MAXDNAME) + 1];
|
||||
union bigname *next; /* freelist */
|
||||
};
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
commit 4fdb707633afe8028118bcaf39b4882f634b5999
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Fri Apr 10 16:24:02 2026 +0100
|
||||
|
||||
Fix NSEC bitmap parsing infinite loop. CVE-2026-4890
|
||||
|
||||
Report from Royce M <royce@xchglabs.com>.
|
||||
|
||||
Location: dnssec.c:1290-1306, dnssec.c:1450-1463
|
||||
|
||||
The bitmap window iteration advances by p[1] instead of p[1]+2
|
||||
(missing the 2-byte window header). With bitmap_length=0, both rdlen and p are
|
||||
unchanged, causing an infinite loop and dnsmasq stops responding to all queries.
|
||||
|
||||
Reachable before RRSIG validation
|
||||
(confirmed by the source comment at line 2125), so no valid
|
||||
DNSSEC signatures are needed.
|
||||
|
||||
--- a/src/dnssec.c
|
||||
+++ b/src/dnssec.c
|
||||
@@ -1344,8 +1344,8 @@ static int prove_non_existence_nsec(stru
|
||||
break; /* finished checking */
|
||||
}
|
||||
|
||||
- rdlen -= p[1];
|
||||
- p += p[1];
|
||||
+ rdlen -= p[1] + 2;
|
||||
+ p += p[1] + 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1508,8 +1508,8 @@ static int check_nsec3_coverage(struct d
|
||||
break; /* finished checking */
|
||||
}
|
||||
|
||||
- rdlen -= p[1];
|
||||
- p += p[1];
|
||||
+ rdlen -= p[1] + 2;
|
||||
+ p += p[1] + 2;
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -0,0 +1,32 @@
|
||||
commit 2cacea42e4d45717bd0ce3ccfe8e78960245e5da
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Wed Mar 25 23:04:08 2026 +0000
|
||||
|
||||
Verify rdlen field in RRSIG packets. CVE-2026-4891
|
||||
|
||||
Bug report from Royce M <royce@xchglabs.com>
|
||||
|
||||
This avoids crafted packets which give a value for rdlen _less_
|
||||
then the space taken up by the fixed data and the signer's name
|
||||
and engender a negative calculated length for the signature.
|
||||
|
||||
--- a/src/dnssec.c
|
||||
+++ b/src/dnssec.c
|
||||
@@ -546,10 +546,14 @@ static int validate_rrset(time_t now, st
|
||||
|
||||
*ttl_out = ttl;
|
||||
}
|
||||
-
|
||||
+
|
||||
+ /* Don't trust rdlen not to be too small and give us a negative sig_len
|
||||
+ It has already been checked that it doesn't run us off the end
|
||||
+ of the packet. */
|
||||
+ if ((sig_len = rdlen - (p - psav)) <= 0)
|
||||
+ return STAT_BOGUS;
|
||||
+
|
||||
sig = p;
|
||||
- sig_len = rdlen - (p - psav);
|
||||
-
|
||||
nsigttl = htonl(orig_ttl);
|
||||
|
||||
hash->update(ctx, 18, psav);
|
||||
@@ -0,0 +1,28 @@
|
||||
commit 011a36c51438c986535a7248ed2e7f424f8e1078
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Wed Mar 25 23:16:35 2026 +0000
|
||||
|
||||
Fix buffer overflow in helper.c with large CLIDs. CVE-2026-4892
|
||||
|
||||
Bug reported bt Royce M <royce@xchglabs.com>
|
||||
|
||||
Location: helper.c:265-270
|
||||
DHCPv6 CLIDs can be up to 65535 bytes. When --dhcp-script is configured,
|
||||
the helper hex-encodes raw CLID bytes via sprintf("%.2x") into daemon->packet (5131 bytes).
|
||||
A 1000-byte CLID writes ~3000 bytes. The helper process retains root privileges.
|
||||
|
||||
Note: log6_packet() correctly caps CLID to 100 bytes for logging, but the helper code path was missed.
|
||||
|
||||
--- a/src/helper.c
|
||||
+++ b/src/helper.c
|
||||
@@ -261,8 +261,8 @@ int create_helper(int event_fd, int err_
|
||||
data.hostname_len + data.ed_len + data.clid_len, RW_READ))
|
||||
continue;
|
||||
|
||||
- /* CLID into packet */
|
||||
- for (p = daemon->packet, i = 0; i < data.clid_len; i++)
|
||||
+ /* CLID into packet: limit to 100 bytes to avoid overflowing buffer. */
|
||||
+ for (p = daemon->packet, i = 0; i < data.clid_len && i < 100; i++)
|
||||
{
|
||||
p += sprintf(p, "%.2x", buf[i]);
|
||||
if (i != data.clid_len - 1)
|
||||
@@ -0,0 +1,26 @@
|
||||
commit 434d68f2eb1a58744470698483a3ae09b5a9a870
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Wed Mar 25 23:22:37 2026 +0000
|
||||
|
||||
Fix broken client subnet validation. CVE-2026-4893
|
||||
|
||||
Bug report from Royce M <royce@xchglabs.com>
|
||||
|
||||
Location: forward.c:713, edns0.c:421
|
||||
|
||||
With --add-subnet enabled, process_reply() passes the OPT record
|
||||
length (~23 bytes) instead of the packet length to check_source().
|
||||
All internal bounds checks fail, and the function always returns 1.
|
||||
ECS source validation per RFC 7871 Section 9.2 is completely bypassed.
|
||||
|
||||
--- a/src/forward.c
|
||||
+++ b/src/forward.c
|
||||
@@ -724,7 +724,7 @@ static size_t process_reply(struct dns_h
|
||||
/* Get extended RCODE. */
|
||||
rcode |= sizep[2] << 4;
|
||||
|
||||
- if (option_bool(OPT_CLIENT_SUBNET) && !check_source(header, plen, pheader, query_source))
|
||||
+ if (option_bool(OPT_CLIENT_SUBNET) && !check_source(header, n, pheader, query_source))
|
||||
{
|
||||
my_syslog(LOG_WARNING, _("discarding DNS reply: subnet option mismatch"));
|
||||
return 0;
|
||||
@@ -0,0 +1,26 @@
|
||||
commit fa3c8ddef6712b52f562813317e6a997e1210123
|
||||
Author: Simon Kelley <simon@thekelleys.org.uk>
|
||||
Date: Mon Mar 30 16:24:33 2026 +0100
|
||||
|
||||
Fix buffer overflow vulnerability in extract_addresses() CVE-2026-5172
|
||||
|
||||
Thanks to Hugo Martinez Ray for spotting this.
|
||||
|
||||
The value of rdlen for an RR can be a lie, allowing the
|
||||
call to extract_name() at rfc1025.c:952 to advance the value of p1
|
||||
past the calculated end of the record. The makes the calculation
|
||||
of bytes remaining in the RR underflow to a huge number and results
|
||||
in a massive heap OOB read and certain crash.
|
||||
|
||||
--- a/src/rfc1035.c
|
||||
+++ b/src/rfc1035.c
|
||||
@@ -943,7 +943,8 @@ int extract_addresses(struct dns_header
|
||||
/* Name, extract it then re-encode. */
|
||||
int len;
|
||||
|
||||
- if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0))
|
||||
+ /* rdlen may lie, and extract_name() advances p1 past where it says the record ends. */
|
||||
+ if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0) || (p1 > endrr))
|
||||
{
|
||||
blockdata_free(addr.rrblock.rrdata);
|
||||
return 2;
|
||||
@@ -53,7 +53,7 @@ check_peer_activity() {
|
||||
last_handshake=$(wg show ${iface} latest-handshakes | grep ${public_key} | awk '{print $2}')
|
||||
[ -z ${last_handshake} ] && return 0;
|
||||
idle_seconds=$(($(date +%s)-${last_handshake}))
|
||||
[ ${idle_seconds} -lt 150 ] && return 0;
|
||||
[ ${idle_seconds} -lt 180 ] && return 0;
|
||||
logger -t "wireguard_monitor" "${iface} endpoint ${endpoint_host}:${endpoint_port} is not responding for ${idle_seconds} seconds, trying to re-resolve hostname"
|
||||
wg set ${iface} peer ${public_key} endpoint "${endpoint_host}:${endpoint_port}"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# Copyright (C) 2020 OpenWrt.org
|
||||
#
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/uci-defaults.sh
|
||||
|
||||
board_config_update
|
||||
|
||||
case "$(board_name)" in
|
||||
gemtek,w1700k-ubi)
|
||||
ucidef_set_compat_version "2.0"
|
||||
;;
|
||||
esac
|
||||
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
partition@700000 {
|
||||
label = "ubi";
|
||||
reg = <0x00700000 0x1f700000>;
|
||||
reg = <0x00700000 0x1b700000>;
|
||||
compatible = "linux,ubi";
|
||||
|
||||
volumes {
|
||||
@@ -211,9 +211,9 @@
|
||||
};
|
||||
|
||||
/* reserved for bad block table */
|
||||
reserved_bmt@1fe00000 {
|
||||
reserved_bmt@1be00000 {
|
||||
label = "reserved_bmt";
|
||||
reg = <0x1fe00000 0x00200000>;
|
||||
reg = <0x1be00000 0x04200000>;
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -474,15 +474,17 @@
|
||||
<0x0 0x1fa86000 0x0 0x300>,
|
||||
<0x0 0x1fa8a000 0x0 0x1000>,
|
||||
<0x0 0x1fa8b000 0x0 0x1000>;
|
||||
reg-names = "xfi_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
reg-names = "pcs_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
"multi_sgmii", "usxgmii",
|
||||
"hsgmii_rate_adp", "xfi_ana", "xfi_pma";
|
||||
"hsgmii_rate_adp", "pcs_ana", "pcs_pma";
|
||||
|
||||
resets = <&scuclk EN7581_XPON_MAC_RST>,
|
||||
<&scuclk EN7581_XPON_PHY_RST>;
|
||||
reset-names = "mac", "phy";
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <0>;
|
||||
};
|
||||
|
||||
eth_pcs: pcs@1fa09000 {
|
||||
@@ -495,15 +497,70 @@
|
||||
<0x0 0x1fa76000 0x0 0x300>,
|
||||
<0x0 0x1fa7a000 0x0 0x1000>,
|
||||
<0x0 0x1fa7b000 0x0 0x1000>;
|
||||
reg-names = "xfi_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
reg-names = "pcs_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
"multi_sgmii", "usxgmii",
|
||||
"hsgmii_rate_adp", "xfi_ana", "xfi_pma";
|
||||
"hsgmii_rate_adp", "pcs_ana", "pcs_pma";
|
||||
|
||||
resets = <&scuclk EN7581_XSI_MAC_RST>,
|
||||
<&scuclk EN7581_XSI_PHY_RST>;
|
||||
reset-names = "mac", "phy";
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <0>;
|
||||
};
|
||||
|
||||
pcie_pcs: pcs@1fa04000 {
|
||||
compatible = "airoha,an7581-pcs-pcie";
|
||||
reg = <0x0 0x1fa04000 0x0 0x1000>,
|
||||
<0x0 0x1fa50000 0x0 0x60>,
|
||||
<0x0 0x1fa50a00 0x0 0x164>,
|
||||
<0x0 0x1fa54000 0x0 0x450>,
|
||||
<0x0 0x1fa55900 0x0 0x338>,
|
||||
<0x0 0x1fa56000 0x0 0x300>,
|
||||
<0x0 0x1fa05000 0x0 0x1000>,
|
||||
<0x0 0x1fa60000 0x0 0x60>,
|
||||
<0x0 0x1fa60a00 0x0 0x164>,
|
||||
<0x0 0x1fa64000 0x0 0x450>,
|
||||
<0x0 0x1fa65900 0x0 0x338>,
|
||||
<0x0 0x1fa66000 0x0 0x300>,
|
||||
<0x0 0x1fa5a000 0x0 0x1000>,
|
||||
<0x0 0x1fa5b000 0x0 0x1000>,
|
||||
<0x0 0x1fa5c000 0x0 0x1000>;
|
||||
reg-names = "pcs_mac0", "hsgmii_an0", "hsgmii_pcs0",
|
||||
"multi_sgmii0", "usxgmii0",
|
||||
"hsgmii_rate_adp0",
|
||||
"pcs_mac1", "hsgmii_an1", "hsgmii_pcs1",
|
||||
"multi_sgmii1", "usxgmii1",
|
||||
"hsgmii_rate_adp1",
|
||||
"pcs_ana", "pcs_pma0", "pcs_pma1";
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <1>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb_pcs: pcs@1fa07000 {
|
||||
compatible = "airoha,an7581-pcs-usb";
|
||||
reg = <0x0 0x1fa07000 0x0 0x1000>,
|
||||
<0x0 0x1fa90000 0x0 0x60>,
|
||||
<0x0 0x1fa90a00 0x0 0x164>,
|
||||
<0x0 0x1fa94000 0x0 0x450>,
|
||||
<0x0 0x1fa96000 0x0 0x300>,
|
||||
<0x0 0x1fa9a000 0x0 0x600>;
|
||||
reg-names = "pcs_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
"multi_sgmii",
|
||||
"hsgmii_rate_adp","pcs_ana";
|
||||
|
||||
phys = <&usb0_phy PHY_TYPE_USB3>;
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
chip_scu: syscon@1fa20000 {
|
||||
@@ -918,7 +975,7 @@
|
||||
gdm2: ethernet@2 {
|
||||
compatible = "airoha,eth-mac";
|
||||
reg = <2>;
|
||||
pcs = <&pon_pcs>;
|
||||
pcs-handle = <&pon_pcs>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -926,7 +983,7 @@
|
||||
gdm4: ethernet@4 {
|
||||
compatible = "airoha,eth-mac";
|
||||
reg = <4>;
|
||||
pcs = <ð_pcs>;
|
||||
pcs-handle = <ð_pcs>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -580,9 +580,9 @@
|
||||
<0x0 0x1fa86000 0x0 0x300>,
|
||||
<0x0 0x1fa8f000 0x0 0x1000>,
|
||||
<0x0 0x1fa8e000 0x0 0x1000>;
|
||||
reg-names = "xfi_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
reg-names = "pcs_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
"multi_sgmii", "usxgmii",
|
||||
"hsgmii_rate_adp", "xfi_ana", "xfi_pma";
|
||||
"hsgmii_rate_adp", "pcs_ana", "pcs_pma";
|
||||
|
||||
resets = <&scuclk AN7583_XPON_MAC_RST>,
|
||||
<&scuclk AN7583_XPON_PHY_RST>,
|
||||
@@ -590,6 +590,8 @@
|
||||
reset-names = "mac", "phy", "xfi";
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <0>;
|
||||
};
|
||||
|
||||
eth_pcs: pcs@1fa09000 {
|
||||
@@ -602,15 +604,17 @@
|
||||
<0x0 0x1fa76000 0x0 0x300>,
|
||||
<0x0 0x1fa7f000 0x0 0x1000>,
|
||||
<0x0 0x1fa7e000 0x0 0x1000>;
|
||||
reg-names = "xfi_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
reg-names = "pcs_mac", "hsgmii_an", "hsgmii_pcs",
|
||||
"multi_sgmii", "usxgmii",
|
||||
"hsgmii_rate_adp", "xfi_ana", "xfi_pma";
|
||||
"hsgmii_rate_adp", "pcs_ana", "pcs_pma";
|
||||
|
||||
resets = <&scuclk AN7583_XSI_MAC_RST>,
|
||||
<&scuclk AN7583_XSI_PHY_RST>;
|
||||
reset-names = "mac", "phy";
|
||||
|
||||
airoha,scu = <&scuclk>;
|
||||
|
||||
#pcs-cells = <0>;
|
||||
};
|
||||
|
||||
eth: ethernet@1fb50000 {
|
||||
|
||||
@@ -97,6 +97,10 @@ define Device/gemtek_w1700k-ubi
|
||||
DEVICE_ALT2_MODEL := W1700K
|
||||
DEVICE_ALT2_VARIANT := UBI
|
||||
DEVICE_DTS := an7581-w1700k-ubi
|
||||
DEVICE_COMPAT_VERSION := 2.0
|
||||
DEVICE_COMPAT_MESSAGE := Partition table has been changed to cooperate \
|
||||
with the vendor bootloader with regard to the BMT/BBT partition at \
|
||||
the end of flash. A reinstall including corrected chainloader is needed.
|
||||
DEVICE_PACKAGES := airoha-en7581-mt7996-npu-firmware \
|
||||
fitblk kmod-i2c-an7581 kmod-hwmon-nct7802 \
|
||||
kmod-mt7996-firmware kmod-phy-rtl8261n \
|
||||
|
||||
+4793
File diff suppressed because it is too large
Load Diff
-3369
File diff suppressed because it is too large
Load Diff
+85
-56
@@ -1,25 +1,39 @@
|
||||
From bdcad9ab6b0f071e8492d88064a58323d7155aa7 Mon Sep 17 00:00:00 2001
|
||||
From ee93671d30d7741a39026c2aaaa6a7729929c347 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Fri, 17 Jan 2025 13:23:13 +0100
|
||||
Subject: [PATCH] net: airoha: add phylink support for GDM2/4
|
||||
Subject: [PATCH 2/2] net: airoha: add phylink support for GDM2/3/4
|
||||
|
||||
Add phylink support for GDM2/4 port that require configuration of the
|
||||
Add phylink support for GDM2/3/4 port that require configuration of the
|
||||
PCS to make the external PHY or attached SFP cage work.
|
||||
|
||||
These needs to be defined in the GDM port node using the pcs-handle
|
||||
property.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/airoha/airoha_eth.c | 133 ++++++++++++++++++++++
|
||||
drivers/net/ethernet/airoha/airoha_eth.h | 4 +
|
||||
drivers/net/ethernet/airoha/Kconfig | 1 +
|
||||
drivers/net/ethernet/airoha/airoha_eth.c | 146 +++++++++++++++++++++-
|
||||
drivers/net/ethernet/airoha/airoha_eth.h | 3 +
|
||||
drivers/net/ethernet/airoha/airoha_regs.h | 12 ++
|
||||
3 files changed, 149 insertions(+)
|
||||
4 files changed, 161 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/airoha/Kconfig
|
||||
+++ b/drivers/net/ethernet/airoha/Kconfig
|
||||
@@ -20,6 +20,7 @@ config NET_AIROHA
|
||||
depends on NET_DSA || !NET_DSA
|
||||
select NET_AIROHA_NPU
|
||||
select PAGE_POOL
|
||||
+ select PHYLINK
|
||||
help
|
||||
This driver supports the gigabit ethernet MACs in the
|
||||
Airoha SoC family.
|
||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/tcp.h>
|
||||
+#include <linux/pcs/pcs-airoha.h>
|
||||
+#include <linux/pcs/pcs.h>
|
||||
#include <linux/u64_stats_sync.h>
|
||||
#include <net/dst_metadata.h>
|
||||
#include <net/page_pool/helpers.h>
|
||||
@@ -65,19 +79,10 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2922,6 +2944,20 @@ static const struct ethtool_ops airoha_e
|
||||
@@ -2922,6 +2944,11 @@ static const struct ethtool_ops airoha_e
|
||||
.get_link = ethtool_op_get_link,
|
||||
};
|
||||
|
||||
+static struct phylink_pcs *airoha_phylink_mac_select_pcs(struct phylink_config *config,
|
||||
+ phy_interface_t interface)
|
||||
+{
|
||||
+ struct airoha_gdm_port *port = container_of(config, struct airoha_gdm_port,
|
||||
+ phylink_config);
|
||||
+
|
||||
+ return port->pcs;
|
||||
+}
|
||||
+
|
||||
+static void airoha_mac_config(struct phylink_config *config, unsigned int mode,
|
||||
+ const struct phylink_link_state *state)
|
||||
+{
|
||||
@@ -86,7 +91,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
|
||||
{
|
||||
int i;
|
||||
@@ -2966,6 +3002,99 @@ bool airoha_is_valid_gdm_port(struct air
|
||||
@@ -2966,6 +2993,124 @@ bool airoha_is_valid_gdm_port(struct air
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -100,6 +105,9 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+ struct airoha_eth *eth = qdma->eth;
|
||||
+ u32 frag_size_tx, frag_size_rx;
|
||||
+
|
||||
+ if (port->id != 4)
|
||||
+ return;
|
||||
+
|
||||
+ switch (speed) {
|
||||
+ case SPEED_10000:
|
||||
+ case SPEED_5000:
|
||||
@@ -116,13 +124,15 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+ }
|
||||
+
|
||||
+ /* Configure TX/RX frag based on speed */
|
||||
+ if (port->id == 4) {
|
||||
+ airoha_fe_rmw(eth, REG_GDMA4_TMBI_FRAG, GDMA4_SGMII0_TX_FRAG_SIZE,
|
||||
+ FIELD_PREP(GDMA4_SGMII0_TX_FRAG_SIZE, frag_size_tx));
|
||||
+ airoha_fe_rmw(eth, REG_GDMA4_TMBI_FRAG,
|
||||
+ GDMA4_SGMII0_TX_FRAG_SIZE_MASK,
|
||||
+ FIELD_PREP(GDMA4_SGMII0_TX_FRAG_SIZE_MASK,
|
||||
+ frag_size_tx));
|
||||
+
|
||||
+ airoha_fe_rmw(eth, REG_GDMA4_RMBI_FRAG, GDMA4_SGMII0_RX_FRAG_SIZE,
|
||||
+ FIELD_PREP(GDMA4_SGMII0_RX_FRAG_SIZE, frag_size_rx));
|
||||
+ }
|
||||
+ airoha_fe_rmw(eth, REG_GDMA4_RMBI_FRAG,
|
||||
+ GDMA4_SGMII0_RX_FRAG_SIZE_MASK,
|
||||
+ FIELD_PREP(GDMA4_SGMII0_RX_FRAG_SIZE_MASK,
|
||||
+ frag_size_rx));
|
||||
+}
|
||||
+
|
||||
+static void airoha_mac_link_down(struct phylink_config *config, unsigned int mode,
|
||||
@@ -131,7 +141,6 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+}
|
||||
+
|
||||
+static const struct phylink_mac_ops airoha_phylink_ops = {
|
||||
+ .mac_select_pcs = airoha_phylink_mac_select_pcs,
|
||||
+ .mac_config = airoha_mac_config,
|
||||
+ .mac_link_up = airoha_mac_link_up,
|
||||
+ .mac_link_down = airoha_mac_link_down,
|
||||
@@ -141,8 +150,10 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+{
|
||||
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||
+ struct device_node *np = dev->dev.of_node;
|
||||
+ struct phylink_pcs **available_pcs;
|
||||
+ phy_interface_t phy_mode;
|
||||
+ struct phylink *phylink;
|
||||
+ unsigned int num_pcs;
|
||||
+ int err;
|
||||
+
|
||||
+ err = of_get_phy_mode(np, &phy_mode);
|
||||
@@ -157,36 +168,55 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+ MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD |
|
||||
+ MAC_5000FD | MAC_10000FD;
|
||||
+
|
||||
+ err = fwnode_phylink_pcs_parse(dev_fwnode(&dev->dev), NULL, &num_pcs);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ available_pcs = kcalloc(num_pcs, sizeof(*available_pcs), GFP_KERNEL);
|
||||
+ if (!available_pcs)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ err = fwnode_phylink_pcs_parse(dev_fwnode(&dev->dev), available_pcs,
|
||||
+ &num_pcs);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ port->phylink_config.available_pcs = available_pcs;
|
||||
+ port->phylink_config.num_available_pcs = num_pcs;
|
||||
+
|
||||
+ __set_bit(PHY_INTERFACE_MODE_SGMII,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+ __set_bit(PHY_INTERFACE_MODE_USXGMII,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+ __set_bit(PHY_INTERFACE_MODE_10GBASER,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+ __set_bit(PHY_INTERFACE_MODE_USXGMII,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+
|
||||
+ port->pcs = airoha_pcs_create(&dev->dev);
|
||||
+ if (IS_ERR(port->pcs))
|
||||
+ return PTR_ERR(port->pcs);
|
||||
+ phy_interface_copy(port->phylink_config.pcs_interfaces,
|
||||
+ port->phylink_config.supported_interfaces);
|
||||
+
|
||||
+ phylink = phylink_create(&port->phylink_config,
|
||||
+ of_fwnode_handle(np),
|
||||
+ phy_mode, &airoha_phylink_ops);
|
||||
+ if (IS_ERR(phylink))
|
||||
+ return PTR_ERR(phylink);
|
||||
+ if (IS_ERR(phylink)) {
|
||||
+ err = PTR_ERR(phylink);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ port->phylink = phylink;
|
||||
+out:
|
||||
+ kfree(available_pcs);
|
||||
+
|
||||
+ return 0;
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
||||
struct device_node *np)
|
||||
{
|
||||
@@ -3039,6 +3168,12 @@ static int airoha_alloc_gdm_port(struct
|
||||
@@ -3039,6 +3184,12 @@ static int airoha_alloc_gdm_port(struct
|
||||
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
||||
eth->ports[p] = port;
|
||||
|
||||
@@ -199,37 +229,36 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
return airoha_metadata_dst_alloc(port);
|
||||
}
|
||||
|
||||
@@ -3168,6 +3303,10 @@ error_napi_stop:
|
||||
@@ -3166,8 +3317,11 @@ error_napi_stop:
|
||||
if (!port)
|
||||
continue;
|
||||
|
||||
if (port->dev->reg_state == NETREG_REGISTERED)
|
||||
- if (port->dev->reg_state == NETREG_REGISTERED)
|
||||
+ if (port->dev->reg_state == NETREG_REGISTERED) {
|
||||
+ if (airhoa_is_phy_external(port))
|
||||
+ phylink_destroy(port->phylink);
|
||||
unregister_netdev(port->dev);
|
||||
+ if (airhoa_is_phy_external(port)) {
|
||||
+ phylink_destroy(port->phylink);
|
||||
+ airoha_pcs_destroy(port->pcs);
|
||||
+ }
|
||||
airoha_metadata_dst_free(port);
|
||||
}
|
||||
airoha_hw_cleanup(eth);
|
||||
@@ -3194,6 +3333,10 @@ static void airoha_remove(struct platfor
|
||||
@@ -3192,6 +3346,8 @@ static void airoha_remove(struct platfor
|
||||
if (!port)
|
||||
continue;
|
||||
|
||||
+ if (airhoa_is_phy_external(port))
|
||||
+ phylink_destroy(port->phylink);
|
||||
unregister_netdev(port->dev);
|
||||
airoha_metadata_dst_free(port);
|
||||
+ if (airhoa_is_phy_external(port)) {
|
||||
+ phylink_destroy(port->phylink);
|
||||
+ airoha_pcs_destroy(port->pcs);
|
||||
+ }
|
||||
}
|
||||
airoha_hw_cleanup(eth);
|
||||
|
||||
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
||||
@@ -540,6 +540,10 @@ struct airoha_gdm_port {
|
||||
@@ -540,6 +540,9 @@ struct airoha_gdm_port {
|
||||
int id;
|
||||
int nbq;
|
||||
|
||||
+ struct phylink *phylink;
|
||||
+ struct phylink_config phylink_config;
|
||||
+ struct phylink_pcs *pcs;
|
||||
+
|
||||
struct airoha_hw_stats stats;
|
||||
|
||||
@@ -241,16 +270,16 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
#define IP_FRAGMENT_NBQ_MASK GENMASK(4, 0)
|
||||
|
||||
+#define REG_GDMA4_TMBI_FRAG 0x2028
|
||||
+#define GDMA4_SGMII1_TX_WEIGHT GENMASK(31, 26)
|
||||
+#define GDMA4_SGMII1_TX_FRAG_SIZE GENMASK(25, 16)
|
||||
+#define GDMA4_SGMII0_TX_WEIGHT GENMASK(15, 10)
|
||||
+#define GDMA4_SGMII0_TX_FRAG_SIZE GENMASK(9, 0)
|
||||
+#define GDMA4_SGMII1_TX_WEIGHT_MASK GENMASK(31, 26)
|
||||
+#define GDMA4_SGMII1_TX_FRAG_SIZE_MASK GENMASK(25, 16)
|
||||
+#define GDMA4_SGMII0_TX_WEIGHT_MASK GENMASK(15, 10)
|
||||
+#define GDMA4_SGMII0_TX_FRAG_SIZE_MASK GENMASK(9, 0)
|
||||
+
|
||||
+#define REG_GDMA4_RMBI_FRAG 0x202c
|
||||
+#define GDMA4_SGMII1_RX_WEIGHT GENMASK(31, 26)
|
||||
+#define GDMA4_SGMII1_RX_FRAG_SIZE GENMASK(25, 16)
|
||||
+#define GDMA4_SGMII0_RX_WEIGHT GENMASK(15, 10)
|
||||
+#define GDMA4_SGMII0_RX_FRAG_SIZE GENMASK(9, 0)
|
||||
+#define GDMA4_SGMII1_RX_WEIGHT_MASK GENMASK(31, 26)
|
||||
+#define GDMA4_SGMII1_RX_FRAG_SIZE_MASK GENMASK(25, 16)
|
||||
+#define GDMA4_SGMII0_RX_WEIGHT_MASK GENMASK(15, 10)
|
||||
+#define GDMA4_SGMII0_RX_FRAG_SIZE_MASK GENMASK(9, 0)
|
||||
+
|
||||
#define REG_MC_VLAN_EN 0x2100
|
||||
#define MC_VLAN_EN_MASK BIT(0)
|
||||
+973
-589
File diff suppressed because it is too large
Load Diff
+7
-7
@@ -18,7 +18,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/pcs/airoha/pcs-airoha-common.c
|
||||
+++ b/drivers/net/pcs/airoha/pcs-airoha-common.c
|
||||
@@ -82,6 +82,10 @@ static int airoha_pcs_setup_scu(struct a
|
||||
@@ -144,6 +144,10 @@ static int airoha_pcs_setup_scu(struct a
|
||||
const struct airoha_pcs_match_data *data = priv->data;
|
||||
int ret;
|
||||
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
switch (data->port_type) {
|
||||
case AIROHA_PCS_ETH:
|
||||
airoha_pcs_setup_scu_eth(priv, interface);
|
||||
@@ -91,6 +95,10 @@ static int airoha_pcs_setup_scu(struct a
|
||||
@@ -161,6 +165,10 @@ static int airoha_pcs_setup_scu(struct a
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* TODO better handle reset from MAC */
|
||||
ret = reset_control_bulk_assert(ARRAY_SIZE(priv->rsts),
|
||||
priv->rsts);
|
||||
@@ -1003,6 +1011,10 @@ static int airoha_pcs_probe(struct platf
|
||||
@@ -1298,6 +1306,10 @@ static int airoha_pcs_probe(struct platf
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to get bulk reset lines\n");
|
||||
|
||||
@@ -53,11 +53,11 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
* any SoC revision before E2.
|
||||
--- a/drivers/net/pcs/airoha/pcs-airoha.h
|
||||
+++ b/drivers/net/pcs/airoha/pcs-airoha.h
|
||||
@@ -1184,6 +1184,7 @@ struct airoha_pcs_priv {
|
||||
struct regmap *xfi_pma;
|
||||
struct regmap *xfi_ana;
|
||||
@@ -1654,6 +1654,7 @@ struct airoha_pcs_priv {
|
||||
struct regmap *pcs_ana;
|
||||
struct regmap_field **pcs_ana_fields[2];
|
||||
|
||||
+ struct reset_control *xfi_rst;
|
||||
struct reset_control_bulk_data rsts[AIROHA_PCS_MAX_NUM_RSTS];
|
||||
|
||||
bool manual_rx_calib;
|
||||
struct phy *phy;
|
||||
|
||||
+19
-40
@@ -57,23 +57,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2947,6 +2953,7 @@ static const struct ethtool_ops airoha_e
|
||||
.get_link = ethtool_op_get_link,
|
||||
};
|
||||
|
||||
+#if defined(CONFIG_PCS_AIROHA)
|
||||
static struct phylink_pcs *airoha_phylink_mac_select_pcs(struct phylink_config *config,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
@@ -2960,6 +2967,7 @@ static void airoha_mac_config(struct phy
|
||||
const struct phylink_link_state *state)
|
||||
{
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
|
||||
{
|
||||
@@ -3005,6 +3013,7 @@ bool airoha_is_valid_gdm_port(struct air
|
||||
@@ -2996,6 +3002,7 @@ bool airoha_is_valid_gdm_port(struct air
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -81,15 +65,15 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
||||
static void airoha_mac_link_up(struct phylink_config *config, struct phy_device *phy,
|
||||
unsigned int mode, phy_interface_t interface,
|
||||
int speed, int duplex, bool tx_pause, bool rx_pause)
|
||||
@@ -3097,6 +3106,7 @@ static int airoha_setup_phylink(struct n
|
||||
@@ -3113,6 +3120,7 @@ out:
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
||||
struct device_node *np)
|
||||
@@ -3171,11 +3181,13 @@ static int airoha_alloc_gdm_port(struct
|
||||
@@ -3187,11 +3195,13 @@ static int airoha_alloc_gdm_port(struct
|
||||
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
||||
eth->ports[p] = port;
|
||||
|
||||
@@ -103,42 +87,37 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
||||
|
||||
return airoha_metadata_dst_alloc(port);
|
||||
}
|
||||
@@ -3306,10 +3318,12 @@ error_napi_stop:
|
||||
@@ -3321,8 +3331,10 @@ error_napi_stop:
|
||||
continue;
|
||||
|
||||
if (port->dev->reg_state == NETREG_REGISTERED)
|
||||
unregister_netdev(port->dev);
|
||||
if (port->dev->reg_state == NETREG_REGISTERED) {
|
||||
+#if defined(CONFIG_PCS_AIROHA)
|
||||
if (airhoa_is_phy_external(port)) {
|
||||
phylink_destroy(port->phylink);
|
||||
airoha_pcs_destroy(port->pcs);
|
||||
}
|
||||
if (airhoa_is_phy_external(port))
|
||||
phylink_destroy(port->phylink);
|
||||
+#endif
|
||||
unregister_netdev(port->dev);
|
||||
}
|
||||
airoha_metadata_dst_free(port);
|
||||
}
|
||||
airoha_hw_cleanup(eth);
|
||||
@@ -3336,10 +3350,12 @@ static void airoha_remove(struct platfor
|
||||
@@ -3349,8 +3361,10 @@ static void airoha_remove(struct platfor
|
||||
if (!port)
|
||||
continue;
|
||||
|
||||
+#if defined(CONFIG_PCS_AIROHA)
|
||||
if (airhoa_is_phy_external(port))
|
||||
phylink_destroy(port->phylink);
|
||||
+#endif
|
||||
unregister_netdev(port->dev);
|
||||
airoha_metadata_dst_free(port);
|
||||
+#if defined(CONFIG_PCS_AIROHA)
|
||||
if (airhoa_is_phy_external(port)) {
|
||||
phylink_destroy(port->phylink);
|
||||
airoha_pcs_destroy(port->pcs);
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
airoha_hw_cleanup(eth);
|
||||
|
||||
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
||||
@@ -540,9 +540,11 @@ struct airoha_gdm_port {
|
||||
@@ -540,8 +540,10 @@ struct airoha_gdm_port {
|
||||
int id;
|
||||
int nbq;
|
||||
|
||||
+#if defined(CONFIG_PCS_AIROHA)
|
||||
struct phylink *phylink;
|
||||
struct phylink_config phylink_config;
|
||||
struct phylink_pcs *pcs;
|
||||
+#endif
|
||||
|
||||
struct airoha_hw_stats stats;
|
||||
|
||||
@@ -458,8 +458,7 @@ tplink,cpe510-v3)
|
||||
ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "green:link3" "wlan0" "51" "100" "-50" "13"
|
||||
ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "green:link4" "wlan0" "76" "100" "-75" "13"
|
||||
;;
|
||||
comfast,cf-e380ac-v2|\
|
||||
tplink,tl-wr902ac-v1)
|
||||
comfast,cf-e380ac-v2)
|
||||
ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth0"
|
||||
ucidef_set_led_netdev "internet" "Internet" "green:internet" "eth0"
|
||||
;;
|
||||
|
||||
@@ -101,7 +101,6 @@ ath79_setup_interfaces()
|
||||
tplink,re450-v3|\
|
||||
tplink,re455-v1|\
|
||||
tplink,tl-wa1201-v2|\
|
||||
tplink,tl-wr902ac-v1|\
|
||||
ubnt,bullet-ac|\
|
||||
ubnt,bullet-m-xw|\
|
||||
ubnt,lap-120|\
|
||||
|
||||
@@ -873,20 +873,6 @@ define Device/tplink_tl-wr842n-v3
|
||||
endef
|
||||
TARGET_DEVICES += tplink_tl-wr842n-v3
|
||||
|
||||
define Device/tplink_tl-wr902ac-v1
|
||||
$(Device/tplink-safeloader)
|
||||
SOC := qca9531
|
||||
DEVICE_MODEL := TL-WR902AC
|
||||
DEVICE_VARIANT := v1
|
||||
DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport \
|
||||
kmod-ath10k-ct-smallbuffers ath10k-firmware-qca9887-ct \
|
||||
-swconfig -uboot-envtools
|
||||
TPLINK_BOARD_ID := TL-WR902AC-V1
|
||||
IMAGE_SIZE := 7360k
|
||||
SUPPORTED_DEVICES += tl-wr902ac-v1
|
||||
endef
|
||||
TARGET_DEVICES += tplink_tl-wr902ac-v1
|
||||
|
||||
define Device/tplink_tl-wr941hp-v1
|
||||
$(Device/tplink-safeloader)
|
||||
SOC := tp9343
|
||||
|
||||
@@ -479,6 +479,20 @@ define Device/tplink_tl-wr841-v12
|
||||
endef
|
||||
TARGET_DEVICES += tplink_tl-wr841-v12
|
||||
|
||||
define Device/tplink_tl-wr902ac-v1
|
||||
$(Device/tplink-safeloader)
|
||||
SOC := qca9531
|
||||
DEVICE_MODEL := TL-WR902AC
|
||||
DEVICE_VARIANT := v1
|
||||
DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport \
|
||||
kmod-ath10k-ct-smallbuffers ath10k-firmware-qca9887-ct \
|
||||
-swconfig -uboot-envtools
|
||||
TPLINK_BOARD_ID := TL-WR902AC-V1
|
||||
IMAGE_SIZE := 7360k
|
||||
SUPPORTED_DEVICES += tl-wr902ac-v1
|
||||
endef
|
||||
TARGET_DEVICES += tplink_tl-wr902ac-v1
|
||||
|
||||
define Device/tplink_tl-wr940n-v3
|
||||
$(Device/tplink-4mlzma)
|
||||
SOC := tp9343
|
||||
|
||||
@@ -118,6 +118,10 @@ tplink,tl-wpa8630p-v2.0-eu|\
|
||||
tplink,tl-wpa8630p-v2.1-eu)
|
||||
ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x3c"
|
||||
;;
|
||||
tplink,tl-wr902ac-v1)
|
||||
ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth0"
|
||||
ucidef_set_led_netdev "internet" "Internet" "green:internet" "eth0"
|
||||
;;
|
||||
tplink,tl-wr940n-v3|\
|
||||
tplink,tl-wr940n-v4|\
|
||||
tplink,tl-wr941nd-v6)
|
||||
|
||||
@@ -39,6 +39,7 @@ ath79_setup_interfaces()
|
||||
tplink,tl-wr703n|\
|
||||
tplink,tl-wr802n-v1|\
|
||||
tplink,tl-wr802n-v2|\
|
||||
tplink,tl-wr902ac-v1|\
|
||||
ubnt,bullet-m-ar7240|\
|
||||
ubnt,bullet-m-ar7241|\
|
||||
ubnt,nanobridge-m|\
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
From 486dc391ef439d45db3f7eda2229560fd2b52a78 Mon Sep 17 00:00:00 2001
|
||||
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
||||
Date: Wed, 16 Oct 2024 10:58:34 +0100
|
||||
Subject: [PATCH] net: phylink: allow mac_select_pcs() to remove a PCS
|
||||
|
||||
phylink has historically not permitted a PCS to be removed. An attempt
|
||||
to permit this with phylink_set_pcs() resulted in comments indicating
|
||||
that there was no need for this. This behaviour has been propagated
|
||||
forward to the mac_select_pcs() approach as it was believed from these
|
||||
comments that changing this would be NAK'd.
|
||||
|
||||
However, with mac_select_pcs(), it takes more code and thus complexity
|
||||
to maintain this behaviour, which can - and in this case has - resulted
|
||||
in a bug. If mac_select_pcs() returns NULL for a particular interface
|
||||
type, but there is already a PCS in-use, then we skip the pcs_validate()
|
||||
method, but continue using the old PCS. Also, it wouldn't be expected
|
||||
behaviour by implementers of mac_select_pcs().
|
||||
|
||||
Allow this by removing this old unnecessary restriction.
|
||||
|
||||
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
|
||||
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -1375,7 +1375,7 @@ static void phylink_major_config(struct
|
||||
return;
|
||||
}
|
||||
|
||||
- pcs_changed = pcs && pl->pcs != pcs;
|
||||
+ pcs_changed = pl->pcs != pcs;
|
||||
}
|
||||
|
||||
phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising);
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
From fbb9a9d263a68f60a16c8ba5a51d6198d67171cd Mon Sep 17 00:00:00 2001
|
||||
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
||||
Date: Fri, 3 Jan 2025 11:16:31 +0000
|
||||
Subject: [PATCH] net: phylink: add support for PCS supported_interfaces bitmap
|
||||
|
||||
Add support for the PCS to specify which interfaces it supports, which
|
||||
can be used by MAC drivers to build the main supported_interfaces
|
||||
bitmap. Phylink also validates that the PCS returned by the MAC driver
|
||||
supports the interface that the MAC was asked for.
|
||||
|
||||
An empty supported_interfaces bitmap from the PCS indicates that it
|
||||
does not provide this information, and we handle that appropriately.
|
||||
|
||||
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
|
||||
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/E1tTffL-007RoD-1Y@rmk-PC.armlinux.org.uk
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 11 +++++++++++
|
||||
include/linux/phylink.h | 3 +++
|
||||
2 files changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -701,6 +701,17 @@ static int phylink_validate_mac_and_pcs(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ /* Ensure that this PCS supports the interface which the MAC
|
||||
+ * returned it for. It is an error for the MAC to return a PCS
|
||||
+ * that does not support the interface mode.
|
||||
+ */
|
||||
+ if (!phy_interface_empty(pcs->supported_interfaces) &&
|
||||
+ !test_bit(state->interface, pcs->supported_interfaces)) {
|
||||
+ phylink_err(pl, "MAC returned PCS which does not support %s\n",
|
||||
+ phy_modes(state->interface));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
/* Validate the link parameters with the PCS */
|
||||
if (pcs->ops->pcs_validate) {
|
||||
ret = pcs->ops->pcs_validate(pcs, supported, state);
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -393,6 +393,8 @@ struct phylink_pcs_ops;
|
||||
|
||||
/**
|
||||
* struct phylink_pcs - PHYLINK PCS instance
|
||||
+ * @supported_interfaces: describing which PHY_INTERFACE_MODE_xxx
|
||||
+ * are supported by this PCS.
|
||||
* @ops: a pointer to the &struct phylink_pcs_ops structure
|
||||
* @phylink: pointer to &struct phylink_config
|
||||
* @neg_mode: provide PCS neg mode via "mode" argument
|
||||
@@ -409,6 +411,7 @@ struct phylink_pcs_ops;
|
||||
* the PCS driver.
|
||||
*/
|
||||
struct phylink_pcs {
|
||||
+ DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
|
||||
const struct phylink_pcs_ops *ops;
|
||||
struct phylink *phylink;
|
||||
bool neg_mode;
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
From f1ae32a709e0b525d7963207eb3a4747626f4818 Mon Sep 17 00:00:00 2001
|
||||
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
||||
Date: Mon, 24 Mar 2025 16:40:08 +0000
|
||||
Subject: [PATCH] net: phylink: force link down on major_config failure
|
||||
|
||||
If we fail to configure the MAC or PCS according to the desired mode,
|
||||
do not allow the network link to come up until we have successfully
|
||||
configured the MAC and PCS. This improves phylink's behaviour when an
|
||||
error occurs.
|
||||
|
||||
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/E1twkqO-0006FI-Gm@rmk-PC.armlinux.org.uk
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 42 +++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 34 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -82,6 +82,7 @@ struct phylink {
|
||||
|
||||
bool link_failed;
|
||||
bool using_mac_select_pcs;
|
||||
+ bool major_config_failed;
|
||||
|
||||
struct sfp_bus *sfp_bus;
|
||||
bool sfp_may_have_phy;
|
||||
@@ -1377,12 +1378,16 @@ static void phylink_major_config(struct
|
||||
phylink_an_mode_str(pl->req_link_an_mode),
|
||||
phy_modes(state->interface));
|
||||
|
||||
+ pl->major_config_failed = false;
|
||||
+
|
||||
if (pl->using_mac_select_pcs) {
|
||||
pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
|
||||
if (IS_ERR(pcs)) {
|
||||
phylink_err(pl,
|
||||
"mac_select_pcs unexpectedly failed: %pe\n",
|
||||
pcs);
|
||||
+
|
||||
+ pl->major_config_failed = true;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1404,6 +1409,7 @@ static void phylink_major_config(struct
|
||||
if (err < 0) {
|
||||
phylink_err(pl, "mac_prepare failed: %pe\n",
|
||||
ERR_PTR(err));
|
||||
+ pl->major_config_failed = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1427,8 +1433,15 @@ static void phylink_major_config(struct
|
||||
|
||||
phylink_mac_config(pl, state);
|
||||
|
||||
- if (pl->pcs)
|
||||
- phylink_pcs_post_config(pl->pcs, state->interface);
|
||||
+ if (pl->pcs) {
|
||||
+ err = phylink_pcs_post_config(pl->pcs, state->interface);
|
||||
+ if (err < 0) {
|
||||
+ phylink_err(pl, "pcs_post_config failed: %pe\n",
|
||||
+ ERR_PTR(err));
|
||||
+
|
||||
+ pl->major_config_failed = true;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed)
|
||||
phylink_pcs_enable(pl->pcs);
|
||||
@@ -1439,11 +1452,12 @@ static void phylink_major_config(struct
|
||||
|
||||
err = phylink_pcs_config(pl->pcs, neg_mode, state,
|
||||
!!(pl->link_config.pause & MLO_PAUSE_AN));
|
||||
- if (err < 0)
|
||||
- phylink_err(pl, "pcs_config failed: %pe\n",
|
||||
- ERR_PTR(err));
|
||||
- else if (err > 0)
|
||||
+ if (err < 0) {
|
||||
+ phylink_err(pl, "pcs_config failed: %pe\n", ERR_PTR(err));
|
||||
+ pl->major_config_failed = true;
|
||||
+ } else if (err > 0) {
|
||||
restart = true;
|
||||
+ }
|
||||
|
||||
if (restart)
|
||||
phylink_pcs_an_restart(pl);
|
||||
@@ -1451,16 +1465,22 @@ static void phylink_major_config(struct
|
||||
if (pl->mac_ops->mac_finish) {
|
||||
err = pl->mac_ops->mac_finish(pl->config, pl->act_link_an_mode,
|
||||
state->interface);
|
||||
- if (err < 0)
|
||||
+ if (err < 0) {
|
||||
phylink_err(pl, "mac_finish failed: %pe\n",
|
||||
ERR_PTR(err));
|
||||
+
|
||||
+ pl->major_config_failed = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (pl->phydev && pl->phy_ib_mode) {
|
||||
err = phy_config_inband(pl->phydev, pl->phy_ib_mode);
|
||||
- if (err < 0)
|
||||
+ if (err < 0) {
|
||||
phylink_err(pl, "phy_config_inband: %pe\n",
|
||||
ERR_PTR(err));
|
||||
+
|
||||
+ pl->major_config_failed = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (pl->sfp_bus) {
|
||||
@@ -1762,6 +1782,12 @@ static void phylink_resolve(struct work_
|
||||
}
|
||||
}
|
||||
|
||||
+ /* If configuration of the interface failed, force the link down
|
||||
+ * until we get a successful configuration.
|
||||
+ */
|
||||
+ if (pl->major_config_failed)
|
||||
+ link_state.link = false;
|
||||
+
|
||||
if (link_state.link != cur_link_state) {
|
||||
pl->old_link_state = link_state.link;
|
||||
if (!link_state.link)
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
From 7bf588dc62a05c1866efe098e1b188fd879aa2cf Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Date: Mon, 19 Jan 2026 14:19:51 +0200
|
||||
Subject: [PATCH] net: phylink: simplify phylink_resolve() ->
|
||||
phylink_major_config() path
|
||||
|
||||
This is a trivial change with no functional effect which replaces the
|
||||
pattern:
|
||||
|
||||
if (a) {
|
||||
if (b) {
|
||||
do_stuff();
|
||||
}
|
||||
}
|
||||
|
||||
with:
|
||||
|
||||
if (a && b) {
|
||||
do_stuff();
|
||||
};
|
||||
|
||||
The purpose is to reduce the delta of a subsequent functional change.
|
||||
|
||||
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/20260119121954.1624535-2-vladimir.oltean@nxp.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 20 +++++++++-----------
|
||||
1 file changed, 9 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -1768,18 +1768,16 @@ static void phylink_resolve(struct work_
|
||||
if (pl->act_link_an_mode != MLO_AN_FIXED)
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
- if (mac_config) {
|
||||
- if (link_state.interface != pl->link_config.interface) {
|
||||
- /* The interface has changed, force the link down and
|
||||
- * then reconfigure.
|
||||
- */
|
||||
- if (cur_link_state) {
|
||||
- phylink_link_down(pl);
|
||||
- cur_link_state = false;
|
||||
- }
|
||||
- phylink_major_config(pl, false, &link_state);
|
||||
- pl->link_config.interface = link_state.interface;
|
||||
+ if (mac_config && link_state.interface != pl->link_config.interface) {
|
||||
+ /* The interface has changed, so force the link down and then
|
||||
+ * reconfigure.
|
||||
+ */
|
||||
+ if (cur_link_state) {
|
||||
+ phylink_link_down(pl);
|
||||
+ cur_link_state = false;
|
||||
}
|
||||
+ phylink_major_config(pl, false, &link_state);
|
||||
+ pl->link_config.interface = link_state.interface;
|
||||
}
|
||||
|
||||
/* If configuration of the interface failed, force the link down
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
From 96969b132bf1a5b875ab84fcb41a5c4972c3be9e Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Date: Mon, 19 Jan 2026 14:19:52 +0200
|
||||
Subject: [PATCH 2/2] net: phylink: introduce helpers for replaying link
|
||||
callbacks
|
||||
|
||||
Some drivers of MAC + tightly integrated PCS (example: SJA1105 + XPCS
|
||||
covered by same reset domain) need to perform resets at runtime.
|
||||
|
||||
The reset is triggered by the MAC driver, and it needs to restore its
|
||||
and the PCS' registers, all invisible to phylink.
|
||||
|
||||
However, there is a desire to simplify the API through which the MAC and
|
||||
the PCS interact, so this becomes challenging.
|
||||
|
||||
Phylink holds all the necessary state to help with this operation, and
|
||||
can offer two helpers which walk the MAC and PCS drivers again through
|
||||
the callbacks required during a destructive reset operation. The
|
||||
procedure is as follows:
|
||||
|
||||
Before reset, MAC driver calls phylink_replay_link_begin():
|
||||
- Triggers phylink mac_link_down() and pcs_link_down() methods
|
||||
|
||||
After reset, MAC driver calls phylink_replay_link_end():
|
||||
- Triggers phylink mac_config() -> pcs_config() -> mac_link_up() ->
|
||||
pcs_link_up() methods.
|
||||
|
||||
MAC and PCS registers are restored with no other custom driver code.
|
||||
|
||||
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/20260119121954.1624535-3-vladimir.oltean@nxp.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 61 +++++++++++++++++++++++++++++++++++++--
|
||||
include/linux/phylink.h | 5 ++++
|
||||
2 files changed, 63 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -34,6 +34,7 @@ enum {
|
||||
PHYLINK_DISABLE_STOPPED,
|
||||
PHYLINK_DISABLE_LINK,
|
||||
PHYLINK_DISABLE_MAC_WOL,
|
||||
+ PHYLINK_DISABLE_REPLAY,
|
||||
|
||||
PCS_STATE_DOWN = 0,
|
||||
PCS_STATE_STARTING,
|
||||
@@ -83,6 +84,7 @@ struct phylink {
|
||||
bool link_failed;
|
||||
bool using_mac_select_pcs;
|
||||
bool major_config_failed;
|
||||
+ bool force_major_config;
|
||||
|
||||
struct sfp_bus *sfp_bus;
|
||||
bool sfp_may_have_phy;
|
||||
@@ -1768,9 +1770,10 @@ static void phylink_resolve(struct work_
|
||||
if (pl->act_link_an_mode != MLO_AN_FIXED)
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
- if (mac_config && link_state.interface != pl->link_config.interface) {
|
||||
- /* The interface has changed, so force the link down and then
|
||||
- * reconfigure.
|
||||
+ if ((mac_config && link_state.interface != pl->link_config.interface) ||
|
||||
+ pl->force_major_config) {
|
||||
+ /* The interface has changed or a forced major configuration
|
||||
+ * was requested, so force the link down and then reconfigure.
|
||||
*/
|
||||
if (cur_link_state) {
|
||||
phylink_link_down(pl);
|
||||
@@ -1778,6 +1781,7 @@ static void phylink_resolve(struct work_
|
||||
}
|
||||
phylink_major_config(pl, false, &link_state);
|
||||
pl->link_config.interface = link_state.interface;
|
||||
+ pl->force_major_config = false;
|
||||
}
|
||||
|
||||
/* If configuration of the interface failed, force the link down
|
||||
@@ -4130,6 +4134,57 @@ void phylink_mii_c45_pcs_get_state(struc
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_mii_c45_pcs_get_state);
|
||||
|
||||
+/**
|
||||
+ * phylink_replay_link_begin() - begin replay of link callbacks for driver
|
||||
+ * which loses state
|
||||
+ * @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
+ *
|
||||
+ * Helper for MAC drivers which may perform a destructive reset at runtime.
|
||||
+ * Both the own driver's mac_link_down() method is called, as well as the
|
||||
+ * pcs_link_down() method of the split PCS (if any).
|
||||
+ *
|
||||
+ * This is similar to phylink_stop(), except it does not alter the state of
|
||||
+ * the phylib PHY (it is assumed that it is not affected by the MAC destructive
|
||||
+ * reset).
|
||||
+ */
|
||||
+void phylink_replay_link_begin(struct phylink *pl)
|
||||
+{
|
||||
+ ASSERT_RTNL();
|
||||
+
|
||||
+ phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_REPLAY);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(phylink_replay_link_begin);
|
||||
+
|
||||
+/**
|
||||
+ * phylink_replay_link_end() - end replay of link callbacks for driver
|
||||
+ * which lost state
|
||||
+ * @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
+ *
|
||||
+ * Helper for MAC drivers which may perform a destructive reset at runtime.
|
||||
+ * Both the own driver's mac_config() and mac_link_up() methods, as well as the
|
||||
+ * pcs_config() and pcs_link_up() method of the split PCS (if any), are called.
|
||||
+ *
|
||||
+ * This is similar to phylink_start(), except it does not alter the state of
|
||||
+ * the phylib PHY.
|
||||
+ *
|
||||
+ * One must call this method only within the same rtnl_lock() critical section
|
||||
+ * as a previous phylink_replay_link_start().
|
||||
+ */
|
||||
+void phylink_replay_link_end(struct phylink *pl)
|
||||
+{
|
||||
+ ASSERT_RTNL();
|
||||
+
|
||||
+ if (WARN(!test_bit(PHYLINK_DISABLE_REPLAY,
|
||||
+ &pl->phylink_disable_state),
|
||||
+ "phylink_replay_link_end() called without a prior phylink_replay_link_begin()\n"))
|
||||
+ return;
|
||||
+
|
||||
+ pl->force_major_config = true;
|
||||
+ phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_REPLAY);
|
||||
+ flush_work(&pl->resolve);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(phylink_replay_link_end);
|
||||
+
|
||||
static int __init phylink_init(void)
|
||||
{
|
||||
for (int i = 0; i < ARRAY_SIZE(phylink_sfp_interface_preference); ++i)
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -707,4 +707,9 @@ void phylink_mii_c45_pcs_get_state(struc
|
||||
|
||||
void phylink_decode_usxgmii_word(struct phylink_link_state *state,
|
||||
uint16_t lpa);
|
||||
+
|
||||
+void phylink_replay_link_begin(struct phylink *pl);
|
||||
+
|
||||
+void phylink_replay_link_end(struct phylink *pl);
|
||||
+
|
||||
#endif
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
From 0e4d7df2f3b2e59c1bccc09ea099b7a6c2dda886 Mon Sep 17 00:00:00 2001
|
||||
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
||||
Date: Wed, 28 Jan 2026 10:51:56 +0000
|
||||
Subject: [PATCH] net: phylink: fix NULL pointer deref in
|
||||
phylink_major_config()
|
||||
|
||||
When a MAC driver returns a PCS for an interface mode, and then we
|
||||
attempt to switch to a different mode that doesn't require a PCS,
|
||||
this causes phylink to oops:
|
||||
|
||||
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
|
||||
Mem abort info:
|
||||
ESR = 0x0000000096000044
|
||||
EC = 0x25: DABT (current EL), IL = 32 bits
|
||||
SET = 0, FnV = 0
|
||||
EA = 0, S1PTW = 0
|
||||
FSC = 0x04: level 0 translation fault
|
||||
Data abort info:
|
||||
ISV = 0, ISS = 0x00000044, ISS2 = 0x00000000
|
||||
CM = 0, WnR = 1, TnD = 0, TagAccess = 0
|
||||
GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
|
||||
user pgtable: 4k pages, 48-bit VAs, pgdp=0000000137f96000
|
||||
[0000000000000010] pgd=0000000000000000, p4d=0000000000000000
|
||||
Internal error: Oops: 0000000096000044 [#1] SMP
|
||||
Modules linked in: --
|
||||
CPU: 1 UID: 0 PID: 55 Comm: kworker/u33:0 Not tainted 6.19.0-rc5-00581-g73cb8467a63e #1 PREEMPT
|
||||
Hardware name: Qualcomm Technologies, Inc. Lemans Ride Rev3 (DT)
|
||||
Workqueue: events_power_efficient phylink_resolve
|
||||
pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS +BTYPE=--)
|
||||
pc : phylink_major_config+0x408/0x948
|
||||
lr : phylink_major_config+0x3fc/0x948
|
||||
sp : ffff800080353c60
|
||||
x29: ffff800080353cb0 x28: ffffb305068a8a00 x27: ffffb305068a8000
|
||||
x26: ffff000080092100 x25: 0000000000000000 x24: 0000000000000000
|
||||
x23: 0000000000000001 x22: 0000000000000000 x21: ffffb3050555b3d0
|
||||
x20: ffff800080353d10 x19: ffff0000b6059400 x18: 00000000ffffffff
|
||||
x17: 74756f2f79687020 x16: ffffb305045e4f18 x15: 6769666e6f632072
|
||||
x14: 6f6a616d203a3168 x13: 782d657361623030 x12: ffffb305068c6a98
|
||||
x11: 0000000000000583 x10: 0000000000000018 x9 : ffffb305068c6a98
|
||||
x8 : 0000000100006583 x7 : 0000000000000000 x6 : ffff00008083cc40
|
||||
x5 : ffff00008083cc40 x4 : 0000000000000001 x3 : 0000000000000001
|
||||
x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff0000b269e5a8
|
||||
Call trace:
|
||||
phylink_major_config+0x408/0x948 (P)
|
||||
phylink_resolve+0x294/0x6e4
|
||||
process_one_work+0x148/0x28c
|
||||
worker_thread+0x2d8/0x3d8
|
||||
kthread+0x134/0x208
|
||||
ret_from_fork+0x10/0x20
|
||||
Code: d63f0020 f9400e60 b4000040 f900081f (f9000ad3)
|
||||
---[ end trace 0000000000000000 ]---
|
||||
|
||||
This is caused by "pcs" being NULL when we attempt to execute:
|
||||
|
||||
pcs->phylink = pl;
|
||||
|
||||
Make this conditional on pcs being non-null.
|
||||
|
||||
Fixes: 486dc391ef43 ("net: phylink: allow mac_select_pcs() to remove a PCS")
|
||||
Reported-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
|
||||
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/E1vl39Q-00000006utm-229h@rmk-PC.armlinux.org.uk
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -1425,7 +1425,8 @@ static void phylink_major_config(struct
|
||||
if (pl->pcs)
|
||||
pl->pcs->phylink = NULL;
|
||||
|
||||
- pcs->phylink = pl;
|
||||
+ if (pcs)
|
||||
+ pcs->phylink = pl;
|
||||
|
||||
pl->pcs = pcs;
|
||||
}
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
From 96969b132bf1a5b875ab84fcb41a5c4972c3be9e Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Date: Mon, 19 Jan 2026 14:19:52 +0200
|
||||
Subject: [PATCH 2/2] net: phylink: introduce helpers for replaying link
|
||||
callbacks
|
||||
|
||||
Some drivers of MAC + tightly integrated PCS (example: SJA1105 + XPCS
|
||||
covered by same reset domain) need to perform resets at runtime.
|
||||
|
||||
The reset is triggered by the MAC driver, and it needs to restore its
|
||||
and the PCS' registers, all invisible to phylink.
|
||||
|
||||
However, there is a desire to simplify the API through which the MAC and
|
||||
the PCS interact, so this becomes challenging.
|
||||
|
||||
Phylink holds all the necessary state to help with this operation, and
|
||||
can offer two helpers which walk the MAC and PCS drivers again through
|
||||
the callbacks required during a destructive reset operation. The
|
||||
procedure is as follows:
|
||||
|
||||
Before reset, MAC driver calls phylink_replay_link_begin():
|
||||
- Triggers phylink mac_link_down() and pcs_link_down() methods
|
||||
|
||||
After reset, MAC driver calls phylink_replay_link_end():
|
||||
- Triggers phylink mac_config() -> pcs_config() -> mac_link_up() ->
|
||||
pcs_link_up() methods.
|
||||
|
||||
MAC and PCS registers are restored with no other custom driver code.
|
||||
|
||||
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Link: https://patch.msgid.link/20260119121954.1624535-3-vladimir.oltean@nxp.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 61 +++++++++++++++++++++++++++++++++++++--
|
||||
include/linux/phylink.h | 5 ++++
|
||||
2 files changed, 63 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -28,6 +28,7 @@ enum {
|
||||
PHYLINK_DISABLE_STOPPED,
|
||||
PHYLINK_DISABLE_LINK,
|
||||
PHYLINK_DISABLE_MAC_WOL,
|
||||
+ PHYLINK_DISABLE_REPLAY,
|
||||
|
||||
PCS_STATE_DOWN = 0,
|
||||
PCS_STATE_STARTING,
|
||||
@@ -77,6 +78,7 @@ struct phylink {
|
||||
|
||||
bool link_failed;
|
||||
bool suspend_link_up;
|
||||
+ bool force_major_config;
|
||||
bool major_config_failed;
|
||||
bool mac_supports_eee_ops;
|
||||
bool mac_supports_eee;
|
||||
@@ -1681,9 +1683,10 @@ static void phylink_resolve(struct work_
|
||||
if (pl->act_link_an_mode != MLO_AN_FIXED)
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
- if (mac_config && link_state.interface != pl->link_config.interface) {
|
||||
- /* The interface has changed, so force the link down and then
|
||||
- * reconfigure.
|
||||
+ if ((mac_config && link_state.interface != pl->link_config.interface) ||
|
||||
+ pl->force_major_config) {
|
||||
+ /* The interface has changed or a forced major configuration
|
||||
+ * was requested, so force the link down and then reconfigure.
|
||||
*/
|
||||
if (cur_link_state) {
|
||||
phylink_link_down(pl);
|
||||
@@ -1691,6 +1694,7 @@ static void phylink_resolve(struct work_
|
||||
}
|
||||
phylink_major_config(pl, false, &link_state);
|
||||
pl->link_config.interface = link_state.interface;
|
||||
+ pl->force_major_config = false;
|
||||
}
|
||||
|
||||
/* If configuration of the interface failed, force the link down
|
||||
@@ -4273,6 +4277,57 @@ void phylink_mii_c45_pcs_get_state(struc
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_mii_c45_pcs_get_state);
|
||||
|
||||
+/**
|
||||
+ * phylink_replay_link_begin() - begin replay of link callbacks for driver
|
||||
+ * which loses state
|
||||
+ * @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
+ *
|
||||
+ * Helper for MAC drivers which may perform a destructive reset at runtime.
|
||||
+ * Both the own driver's mac_link_down() method is called, as well as the
|
||||
+ * pcs_link_down() method of the split PCS (if any).
|
||||
+ *
|
||||
+ * This is similar to phylink_stop(), except it does not alter the state of
|
||||
+ * the phylib PHY (it is assumed that it is not affected by the MAC destructive
|
||||
+ * reset).
|
||||
+ */
|
||||
+void phylink_replay_link_begin(struct phylink *pl)
|
||||
+{
|
||||
+ ASSERT_RTNL();
|
||||
+
|
||||
+ phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_REPLAY);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(phylink_replay_link_begin);
|
||||
+
|
||||
+/**
|
||||
+ * phylink_replay_link_end() - end replay of link callbacks for driver
|
||||
+ * which lost state
|
||||
+ * @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
+ *
|
||||
+ * Helper for MAC drivers which may perform a destructive reset at runtime.
|
||||
+ * Both the own driver's mac_config() and mac_link_up() methods, as well as the
|
||||
+ * pcs_config() and pcs_link_up() method of the split PCS (if any), are called.
|
||||
+ *
|
||||
+ * This is similar to phylink_start(), except it does not alter the state of
|
||||
+ * the phylib PHY.
|
||||
+ *
|
||||
+ * One must call this method only within the same rtnl_lock() critical section
|
||||
+ * as a previous phylink_replay_link_start().
|
||||
+ */
|
||||
+void phylink_replay_link_end(struct phylink *pl)
|
||||
+{
|
||||
+ ASSERT_RTNL();
|
||||
+
|
||||
+ if (WARN(!test_bit(PHYLINK_DISABLE_REPLAY,
|
||||
+ &pl->phylink_disable_state),
|
||||
+ "phylink_replay_link_end() called without a prior phylink_replay_link_begin()\n"))
|
||||
+ return;
|
||||
+
|
||||
+ pl->force_major_config = true;
|
||||
+ phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_REPLAY);
|
||||
+ flush_work(&pl->resolve);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(phylink_replay_link_end);
|
||||
+
|
||||
static int __init phylink_init(void)
|
||||
{
|
||||
for (int i = 0; i < ARRAY_SIZE(phylink_sfp_interface_preference); ++i)
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -808,4 +808,9 @@ void phylink_mii_c45_pcs_get_state(struc
|
||||
|
||||
void phylink_decode_usxgmii_word(struct phylink_link_state *state,
|
||||
uint16_t lpa);
|
||||
+
|
||||
+void phylink_replay_link_begin(struct phylink *pl);
|
||||
+
|
||||
+void phylink_replay_link_end(struct phylink *pl);
|
||||
+
|
||||
#endif
|
||||
+2
-2
@@ -20,7 +20,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -2273,7 +2273,7 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
@@ -2313,7 +2313,7 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
{
|
||||
struct fwnode_handle *phy_fwnode;
|
||||
struct phy_device *phy_dev;
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
/* Fixed links and 802.3z are handled without needing a PHY */
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
|
||||
@@ -2303,6 +2303,25 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
@@ -2343,6 +2343,25 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
if (pl->config->mac_requires_rxc)
|
||||
flags |= PHY_F_RXC_ALWAYS_ON;
|
||||
|
||||
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
From c6f6cb55c3c316f6169e07eacc5ccb214116719a Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Mon, 31 Mar 2025 15:40:12 +0200
|
||||
Subject: [PATCH 1/7] net: phylink: keep and use MAC supported_interfaces in
|
||||
phylink struct
|
||||
|
||||
Add in phylink struct a copy of supported_interfaces from phylink_config
|
||||
and make use of that instead of relying on phylink_config value.
|
||||
|
||||
This in preparation for support of PCS handling internally to phylink
|
||||
where a PCS can be removed or added after the phylink is created and we
|
||||
need both a reference of the supported_interfaces value from
|
||||
phylink_config and an internal value that can be updated with the new
|
||||
PCS info.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -65,6 +65,11 @@ struct phylink {
|
||||
/* The link configuration settings */
|
||||
struct phylink_link_state link_config;
|
||||
|
||||
+ /* What interface are supported by the current link.
|
||||
+ * Can change on removal or addition of new PCS.
|
||||
+ */
|
||||
+ DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
|
||||
+
|
||||
/* The current settings */
|
||||
phy_interface_t cur_interface;
|
||||
|
||||
@@ -793,7 +798,7 @@ static int phylink_validate_mask(struct
|
||||
static int phylink_validate(struct phylink *pl, unsigned long *supported,
|
||||
struct phylink_link_state *state)
|
||||
{
|
||||
- const unsigned long *interfaces = pl->config->supported_interfaces;
|
||||
+ const unsigned long *interfaces = pl->supported_interfaces;
|
||||
|
||||
if (state->interface == PHY_INTERFACE_MODE_NA)
|
||||
return phylink_validate_mask(pl, NULL, supported, state,
|
||||
@@ -1948,6 +1953,9 @@ struct phylink *phylink_create(struct ph
|
||||
mutex_init(&pl->state_mutex);
|
||||
INIT_WORK(&pl->resolve, phylink_resolve);
|
||||
|
||||
+ phy_interface_copy(pl->supported_interfaces,
|
||||
+ config->supported_interfaces);
|
||||
+
|
||||
pl->config = config;
|
||||
if (config->type == PHYLINK_NETDEV) {
|
||||
pl->netdev = to_net_dev(config->dev);
|
||||
@@ -2091,7 +2099,7 @@ static int phylink_validate_phy(struct p
|
||||
* those which the host supports.
|
||||
*/
|
||||
phy_interface_and(interfaces, phy->possible_interfaces,
|
||||
- pl->config->supported_interfaces);
|
||||
+ pl->supported_interfaces);
|
||||
|
||||
if (phy_interface_empty(interfaces)) {
|
||||
phylink_err(pl, "PHY has no common interfaces\n");
|
||||
@@ -3565,14 +3573,14 @@ static int phylink_sfp_config_optical(st
|
||||
|
||||
phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
|
||||
(int)PHY_INTERFACE_MODE_MAX,
|
||||
- pl->config->supported_interfaces,
|
||||
+ pl->supported_interfaces,
|
||||
(int)PHY_INTERFACE_MODE_MAX,
|
||||
pl->sfp_interfaces);
|
||||
|
||||
/* Find the union of the supported interfaces by the PCS/MAC and
|
||||
* the SFP module.
|
||||
*/
|
||||
- phy_interface_and(interfaces, pl->config->supported_interfaces,
|
||||
+ phy_interface_and(interfaces, pl->supported_interfaces,
|
||||
pl->sfp_interfaces);
|
||||
if (phy_interface_empty(interfaces)) {
|
||||
phylink_err(pl, "unsupported SFP module: no common interface modes\n");
|
||||
@@ -3730,7 +3738,7 @@ static int phylink_sfp_connect_phy(void
|
||||
|
||||
/* Set the PHY's host supported interfaces */
|
||||
phy_interface_and(phy->host_interfaces, phylink_sfp_interfaces,
|
||||
- pl->config->supported_interfaces);
|
||||
+ pl->supported_interfaces);
|
||||
|
||||
/* Do the initial configuration */
|
||||
ret = phylink_sfp_config_phy(pl, phy);
|
||||
+376
@@ -0,0 +1,376 @@
|
||||
From d134e22b540226a7404cabb88c86a54857486b4f Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Mon, 31 Mar 2025 16:03:26 +0200
|
||||
Subject: [PATCH 2/7] net: phylink: introduce internal phylink PCS handling
|
||||
|
||||
Introduce internal handling of PCS for phylink. This is an alternative
|
||||
to .mac_select_pcs that moves the selection logic of the PCS entirely to
|
||||
phylink with the usage of supported_interface value in the PCS struct.
|
||||
|
||||
MAC should now provide an array of available PCS in phylink_config in
|
||||
.available_pcs and fill the .num_available_pcs with the number of
|
||||
elements in the array. MAC should also define a new bitmap,
|
||||
pcs_interfaces, in phylink_config to define for what interface mode a
|
||||
dedicated PCS is required.
|
||||
|
||||
On phylink_create() this array is parsed and a linked list of PCS is
|
||||
created based on the PCS passed in phylink_config.
|
||||
Also the supported_interface value in phylink struct is updated with the
|
||||
new supported_interface from the provided PCS.
|
||||
|
||||
On phylink_start() every PCS in phylink PCS list gets attached to the
|
||||
phylink instance. This is done by setting the phylink value in
|
||||
phylink_pcs struct to the phylink instance.
|
||||
|
||||
On phylink_stop(), every PCS in phylink PCS list is detached from the
|
||||
phylink instance. This is done by setting the phylink value in
|
||||
phylink_pcs struct to NULL.
|
||||
|
||||
On phylink_stop(), every PCS in phylink PCS list is removed from the
|
||||
list.
|
||||
|
||||
phylink_validate_mac_and_pcs(), phylink_major_config() and
|
||||
phylink_inband_caps() are updated to support this new implementation
|
||||
with the PCS list stored in phylink.
|
||||
|
||||
They will make use of phylink_validate_pcs_interface() that will loop
|
||||
for every PCS in the phylink PCS available list and find one that supports
|
||||
the passed interface.
|
||||
|
||||
phylink_validate_pcs_interface() apply the same logic of .mac_select_pcs
|
||||
where if a supported_interface value is not set for the PCS struct, then
|
||||
it's assumed every interface is supported.
|
||||
|
||||
It's required for a MAC that implement either a .mac_select_pcs or make
|
||||
use of the PCS list implementation. Implementing both will result in a fail
|
||||
on MAC/PCS validation.
|
||||
|
||||
phylink value in phylink_pcs struct with this implementation is used to
|
||||
track from PCS side when it's attached to a phylink instance. PCS driver
|
||||
will make use of this information to correctly detach from a phylink
|
||||
instance if needed.
|
||||
|
||||
The .mac_select_pcs implementation is not changed but it's expected that
|
||||
every MAC driver migrates to the new implementation to later deprecate
|
||||
and remove .mac_select_pcs.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 149 +++++++++++++++++++++++++++++++++-----
|
||||
include/linux/phylink.h | 11 +++
|
||||
2 files changed, 141 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -65,6 +65,9 @@ struct phylink {
|
||||
/* The link configuration settings */
|
||||
struct phylink_link_state link_config;
|
||||
|
||||
+ /* List of available PCS */
|
||||
+ struct list_head pcs_list;
|
||||
+
|
||||
/* What interface are supported by the current link.
|
||||
* Can change on removal or addition of new PCS.
|
||||
*/
|
||||
@@ -144,6 +147,8 @@ static const phy_interface_t phylink_sfp
|
||||
|
||||
static DECLARE_PHY_INTERFACE_MASK(phylink_sfp_interfaces);
|
||||
|
||||
+static void phylink_run_resolve(struct phylink *pl);
|
||||
+
|
||||
/**
|
||||
* phylink_set_port_modes() - set the port type modes in the ethtool mask
|
||||
* @mask: ethtool link mode mask
|
||||
@@ -680,24 +685,59 @@ static void phylink_validate_mask_caps(u
|
||||
linkmode_and(state->advertising, state->advertising, mask);
|
||||
}
|
||||
|
||||
+static int phylink_validate_pcs_interface(struct phylink_pcs *pcs,
|
||||
+ phy_interface_t interface)
|
||||
+{
|
||||
+ /* If PCS define an empty supported_interfaces value, assume
|
||||
+ * all interface are supported.
|
||||
+ */
|
||||
+ if (phy_interface_empty(pcs->supported_interfaces))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Ensure that this PCS supports the interface mode */
|
||||
+ if (!test_bit(interface, pcs->supported_interfaces))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int phylink_validate_mac_and_pcs(struct phylink *pl,
|
||||
unsigned long *supported,
|
||||
struct phylink_link_state *state)
|
||||
{
|
||||
unsigned long capabilities;
|
||||
struct phylink_pcs *pcs;
|
||||
+ bool pcs_found = false;
|
||||
int ret;
|
||||
|
||||
/* Get the PCS for this interface mode */
|
||||
- if (pl->using_mac_select_pcs) {
|
||||
+ if (pl->mac_ops->mac_select_pcs) {
|
||||
+ /* Make sure either PCS internal validation or .mac_select_pcs
|
||||
+ * is used. Return error if both are defined.
|
||||
+ */
|
||||
+ if (!list_empty(&pl->pcs_list)) {
|
||||
+ phylink_err(pl, "either phylink_pcs_add() or .mac_select_pcs must be used\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
|
||||
if (IS_ERR(pcs))
|
||||
return PTR_ERR(pcs);
|
||||
+
|
||||
+ pcs_found = !!pcs;
|
||||
} else {
|
||||
- pcs = pl->pcs;
|
||||
+ /* Check every assigned PCS and search for one that supports
|
||||
+ * the interface.
|
||||
+ */
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list) {
|
||||
+ if (!phylink_validate_pcs_interface(pcs, state->interface)) {
|
||||
+ pcs_found = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (pcs) {
|
||||
+ if (pcs_found) {
|
||||
/* The PCS, if present, must be setup before phylink_create()
|
||||
* has been called. If the ops is not initialised, print an
|
||||
* error and backtrace rather than oopsing the kernel.
|
||||
@@ -709,13 +749,10 @@ static int phylink_validate_mac_and_pcs(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- /* Ensure that this PCS supports the interface which the MAC
|
||||
- * returned it for. It is an error for the MAC to return a PCS
|
||||
- * that does not support the interface mode.
|
||||
- */
|
||||
- if (!phy_interface_empty(pcs->supported_interfaces) &&
|
||||
- !test_bit(state->interface, pcs->supported_interfaces)) {
|
||||
- phylink_err(pl, "MAC returned PCS which does not support %s\n",
|
||||
+ /* Recheck PCS to handle legacy way for .mac_select_pcs */
|
||||
+ ret = phylink_validate_pcs_interface(pcs, state->interface);
|
||||
+ if (ret) {
|
||||
+ phylink_err(pl, "selected PCS does not support %s\n",
|
||||
phy_modes(state->interface));
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1096,12 +1133,22 @@ static unsigned int phylink_inband_caps(
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct phylink_pcs *pcs;
|
||||
+ bool pcs_found = false;
|
||||
|
||||
- if (!pl->mac_ops->mac_select_pcs)
|
||||
- return 0;
|
||||
+ if (pl->mac_ops->mac_select_pcs) {
|
||||
+ pcs = pl->mac_ops->mac_select_pcs(pl->config,
|
||||
+ interface);
|
||||
+ pcs_found = !!pcs;
|
||||
+ } else {
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list) {
|
||||
+ if (!phylink_validate_pcs_interface(pcs, interface)) {
|
||||
+ pcs_found = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- pcs = pl->mac_ops->mac_select_pcs(pl->config, interface);
|
||||
- if (!pcs)
|
||||
+ if (!pcs_found)
|
||||
return 0;
|
||||
|
||||
return phylink_pcs_inband_caps(pcs, interface);
|
||||
@@ -1397,10 +1444,36 @@ static void phylink_major_config(struct
|
||||
pl->major_config_failed = true;
|
||||
return;
|
||||
}
|
||||
+ /* Find a PCS in available PCS list for the requested interface.
|
||||
+ * This doesn't overwrite the previous .mac_select_pcs as either
|
||||
+ * .mac_select_pcs or PCS list implementation are permitted.
|
||||
+ *
|
||||
+ * Skip searching if the MAC doesn't require a dedicaed PCS for
|
||||
+ * the requested interface.
|
||||
+ */
|
||||
+ } else if (test_bit(state->interface, pl->config->pcs_interfaces)) {
|
||||
+ bool pcs_found = false;
|
||||
+
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list) {
|
||||
+ if (!phylink_validate_pcs_interface(pcs,
|
||||
+ state->interface)) {
|
||||
+ pcs_found = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!pcs_found) {
|
||||
+ phylink_err(pl,
|
||||
+ "couldn't find a PCS for %s\n",
|
||||
+ phy_modes(state->interface));
|
||||
|
||||
- pcs_changed = pl->pcs != pcs;
|
||||
+ pl->major_config_failed = true;
|
||||
+ return;
|
||||
+ }
|
||||
}
|
||||
|
||||
+ pcs_changed = pl->pcs != pcs;
|
||||
+
|
||||
phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising);
|
||||
|
||||
phylink_dbg(pl, "major config, active %s/%s/%s\n",
|
||||
@@ -1427,11 +1500,13 @@ static void phylink_major_config(struct
|
||||
if (pcs_changed) {
|
||||
phylink_pcs_disable(pl->pcs);
|
||||
|
||||
- if (pl->pcs)
|
||||
- pl->pcs->phylink = NULL;
|
||||
+ if (pl->mac_ops->mac_select_pcs) {
|
||||
+ if (pl->pcs)
|
||||
+ pl->pcs->phylink = NULL;
|
||||
|
||||
- if (pcs)
|
||||
- pcs->phylink = pl;
|
||||
+ if (pcs)
|
||||
+ pcs->phylink = pl;
|
||||
+ }
|
||||
|
||||
pl->pcs = pcs;
|
||||
}
|
||||
@@ -1931,8 +2006,9 @@ struct phylink *phylink_create(struct ph
|
||||
const struct phylink_mac_ops *mac_ops)
|
||||
{
|
||||
bool using_mac_select_pcs = false;
|
||||
+ struct phylink_pcs *pcs;
|
||||
struct phylink *pl;
|
||||
- int ret;
|
||||
+ int i, ret;
|
||||
|
||||
/* Validate the supplied configuration */
|
||||
if (phy_interface_empty(config->supported_interfaces)) {
|
||||
@@ -1952,9 +2028,21 @@ struct phylink *phylink_create(struct ph
|
||||
|
||||
mutex_init(&pl->state_mutex);
|
||||
INIT_WORK(&pl->resolve, phylink_resolve);
|
||||
+ INIT_LIST_HEAD(&pl->pcs_list);
|
||||
+
|
||||
+ /* Fill the PCS list with available PCS from phylink config */
|
||||
+ for (i = 0; i < config->num_available_pcs; i++) {
|
||||
+ pcs = config->available_pcs[i];
|
||||
+
|
||||
+ list_add(&pcs->list, &pl->pcs_list);
|
||||
+ }
|
||||
|
||||
phy_interface_copy(pl->supported_interfaces,
|
||||
config->supported_interfaces);
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list)
|
||||
+ phy_interface_or(pl->supported_interfaces,
|
||||
+ pl->supported_interfaces,
|
||||
+ pcs->supported_interfaces);
|
||||
|
||||
pl->config = config;
|
||||
if (config->type == PHYLINK_NETDEV) {
|
||||
@@ -2024,10 +2112,16 @@ EXPORT_SYMBOL_GPL(phylink_create);
|
||||
*/
|
||||
void phylink_destroy(struct phylink *pl)
|
||||
{
|
||||
+ struct phylink_pcs *pcs, *tmp;
|
||||
+
|
||||
sfp_bus_del_upstream(pl->sfp_bus);
|
||||
if (pl->link_gpio)
|
||||
gpiod_put(pl->link_gpio);
|
||||
|
||||
+ /* Remove every PCS from phylink PCS list */
|
||||
+ list_for_each_entry_safe(pcs, tmp, &pl->pcs_list, list)
|
||||
+ list_del(&pcs->list);
|
||||
+
|
||||
cancel_work_sync(&pl->resolve);
|
||||
kfree(pl);
|
||||
}
|
||||
@@ -2472,6 +2566,7 @@ static irqreturn_t phylink_link_handler(
|
||||
*/
|
||||
void phylink_start(struct phylink *pl)
|
||||
{
|
||||
+ struct phylink_pcs *pcs;
|
||||
bool poll = false;
|
||||
|
||||
ASSERT_RTNL();
|
||||
@@ -2498,6 +2593,10 @@ void phylink_start(struct phylink *pl)
|
||||
|
||||
pl->pcs_state = PCS_STATE_STARTED;
|
||||
|
||||
+ /* link available PCS to phylink struct */
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list)
|
||||
+ pcs->phylink = pl;
|
||||
+
|
||||
phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED);
|
||||
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
|
||||
@@ -2542,6 +2641,8 @@ EXPORT_SYMBOL_GPL(phylink_start);
|
||||
*/
|
||||
void phylink_stop(struct phylink *pl)
|
||||
{
|
||||
+ struct phylink_pcs *pcs;
|
||||
+
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (pl->sfp_bus)
|
||||
@@ -2559,6 +2660,14 @@ void phylink_stop(struct phylink *pl)
|
||||
pl->pcs_state = PCS_STATE_DOWN;
|
||||
|
||||
phylink_pcs_disable(pl->pcs);
|
||||
+
|
||||
+ /* Drop link between phylink and PCS */
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list)
|
||||
+ pcs->phylink = NULL;
|
||||
+
|
||||
+ /* Restore original supported interfaces */
|
||||
+ phy_interface_copy(pl->supported_interfaces,
|
||||
+ pl->config->supported_interfaces);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_stop);
|
||||
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -147,7 +147,11 @@ enum phylink_op_type {
|
||||
* if MAC link is at %MLO_AN_FIXED mode.
|
||||
* @supported_interfaces: bitmap describing which PHY_INTERFACE_MODE_xxx
|
||||
* are supported by the MAC/PCS.
|
||||
+ * @pcs_interfaces: bitmap describing for which PHY_INTERFACE_MODE_xxx a
|
||||
+ * dedicated PCS is required.
|
||||
* @mac_capabilities: MAC pause/speed/duplex capabilities.
|
||||
+ * @available_pcs: array of available phylink_pcs PCS
|
||||
+ * @num_available_pcs: num of available phylink_pcs PCS
|
||||
*/
|
||||
struct phylink_config {
|
||||
struct device *dev;
|
||||
@@ -159,7 +163,11 @@ struct phylink_config {
|
||||
void (*get_fixed_state)(struct phylink_config *config,
|
||||
struct phylink_link_state *state);
|
||||
DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
|
||||
+ DECLARE_PHY_INTERFACE_MASK(pcs_interfaces);
|
||||
unsigned long mac_capabilities;
|
||||
+
|
||||
+ struct phylink_pcs **available_pcs;
|
||||
+ unsigned int num_available_pcs;
|
||||
};
|
||||
|
||||
void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed);
|
||||
@@ -417,6 +425,9 @@ struct phylink_pcs {
|
||||
bool neg_mode;
|
||||
bool poll;
|
||||
bool rxc_always_on;
|
||||
+
|
||||
+ /* private: */
|
||||
+ struct list_head list;
|
||||
};
|
||||
|
||||
/**
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
From 1cb4e56c3ba32ac1bce89dc9c34ef2dbc9b89ad4 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Mon, 31 Mar 2025 19:10:24 +0200
|
||||
Subject: [PATCH 3/7] net: phylink: add phylink_release_pcs() to externally
|
||||
release a PCS
|
||||
|
||||
Add phylink_release_pcs() to externally release a PCS from a phylink
|
||||
instance. This can be used to handle case when a single PCS needs to be
|
||||
removed and the phylink instance needs to be refreshed.
|
||||
|
||||
On calling phylink_release_pcs(), the PCS will be removed from the
|
||||
phylink internal PCS list and the phylink supported_interfaces value is
|
||||
reparsed with the remaining PCS interfaces.
|
||||
|
||||
Also a phylink resolve is triggered to handle the PCS removal.
|
||||
|
||||
It's also added to phylink a flag to make phylink resolve reconfigure
|
||||
the interface mode (even if it didn't change). This is needed to handle
|
||||
the special case when the current PCS used by phylink is removed and a
|
||||
major_config is needed to propagae the configuration change. With this
|
||||
option enabled we also force mac_config even if the PHY link is not up
|
||||
for the in-band case.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/phy/phylink.c | 57 ++++++++++++++++++++++++++++++++++++++-
|
||||
include/linux/phylink.h | 2 ++
|
||||
2 files changed, 58 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -93,6 +93,7 @@ struct phylink {
|
||||
bool using_mac_select_pcs;
|
||||
bool major_config_failed;
|
||||
bool force_major_config;
|
||||
+ bool reconfig_interface;
|
||||
|
||||
struct sfp_bus *sfp_bus;
|
||||
bool sfp_may_have_phy;
|
||||
@@ -1064,6 +1065,55 @@ static void phylink_resolve_an_pause(str
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * phylink_release_pcs - Removes a PCS from the phylink PCS available list
|
||||
+ * @pcs: a pointer to the phylink_pcs struct to be released
|
||||
+ *
|
||||
+ * This function release a PCS from the phylink PCS available list if
|
||||
+ * actually in use. It also refreshes the supported interfaces of the
|
||||
+ * phylink instance by copying the supported interfaces from the phylink
|
||||
+ * conf and merging the supported interfaces of the remaining available PCS
|
||||
+ * in the list and trigger a resolve.
|
||||
+ */
|
||||
+void phylink_release_pcs(struct phylink_pcs *pcs)
|
||||
+{
|
||||
+ struct phylink *pl;
|
||||
+
|
||||
+ ASSERT_RTNL();
|
||||
+
|
||||
+ pl = pcs->phylink;
|
||||
+ if (!pl)
|
||||
+ return;
|
||||
+
|
||||
+ list_del(&pcs->list);
|
||||
+ pcs->phylink = NULL;
|
||||
+
|
||||
+ /* Check if we are removing the PCS currently
|
||||
+ * in use by phylink. If this is the case,
|
||||
+ * force phylink resolve to reconfigure the interface
|
||||
+ * mode and set the phylink PCS to NULL.
|
||||
+ */
|
||||
+ if (pl->pcs == pcs) {
|
||||
+ mutex_lock(&pl->state_mutex);
|
||||
+
|
||||
+ pl->reconfig_interface = true;
|
||||
+ pl->pcs = NULL;
|
||||
+
|
||||
+ mutex_unlock(&pl->state_mutex);
|
||||
+ }
|
||||
+
|
||||
+ /* Refresh supported interfaces */
|
||||
+ phy_interface_copy(pl->supported_interfaces,
|
||||
+ pl->config->supported_interfaces);
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list)
|
||||
+ phy_interface_or(pl->supported_interfaces,
|
||||
+ pl->supported_interfaces,
|
||||
+ pcs->supported_interfaces);
|
||||
+
|
||||
+ phylink_run_resolve(pl);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(phylink_release_pcs);
|
||||
+
|
||||
static unsigned int phylink_pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
@@ -1818,6 +1868,10 @@ static void phylink_resolve(struct work_
|
||||
if (pl->phydev)
|
||||
link_state.link &= pl->phy_state.link;
|
||||
|
||||
+ /* Force mac_config if we need to reconfig the interface */
|
||||
+ if (pl->reconfig_interface)
|
||||
+ mac_config = true;
|
||||
+
|
||||
/* Only update if the PHY link is up */
|
||||
if (pl->phydev && pl->phy_state.link) {
|
||||
/* If the interface has changed, force a link down
|
||||
@@ -1852,7 +1906,7 @@ static void phylink_resolve(struct work_
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
if ((mac_config && link_state.interface != pl->link_config.interface) ||
|
||||
- pl->force_major_config) {
|
||||
+ pl->force_major_config || pl->reconfig_interface) {
|
||||
/* The interface has changed or a forced major configuration
|
||||
* was requested, so force the link down and then reconfigure.
|
||||
*/
|
||||
@@ -1863,6 +1917,7 @@ static void phylink_resolve(struct work_
|
||||
phylink_major_config(pl, false, &link_state);
|
||||
pl->link_config.interface = link_state.interface;
|
||||
pl->force_major_config = false;
|
||||
+ pl->reconfig_interface = false;
|
||||
}
|
||||
|
||||
/* If configuration of the interface failed, force the link down
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -632,6 +632,8 @@ void phylink_disconnect_phy(struct phyli
|
||||
int phylink_set_fixed_link(struct phylink *,
|
||||
const struct phylink_link_state *);
|
||||
|
||||
+void phylink_release_pcs(struct phylink_pcs *pcs);
|
||||
+
|
||||
void phylink_mac_change(struct phylink *, bool up);
|
||||
void phylink_pcs_change(struct phylink_pcs *, bool up);
|
||||
|
||||
+384
@@ -0,0 +1,384 @@
|
||||
From a90c644c73bbffd400cd3839fc17ffdfc69ea1e8 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Mon, 17 Mar 2025 01:46:53 +0100
|
||||
Subject: [PATCH 4/7] net: pcs: implement Firmware node support for PCS driver
|
||||
|
||||
Implement the foundation of Firmware node support for PCS driver.
|
||||
|
||||
To support this, implement a simple Provider API where a PCS driver can
|
||||
expose multiple PCS with an xlate .get function.
|
||||
|
||||
PCS driver will have to call fwnode_pcs_add_provider() and pass the
|
||||
firmware node pointer and a xlate function to return the correct PCS for
|
||||
the passed #pcs-cells.
|
||||
|
||||
This will register the PCS in a global list of providers so that
|
||||
consumer can access it.
|
||||
|
||||
Consumer will then use fwnode_pcs_get() to get the actual PCS by passing
|
||||
the firmware node pointer and the index for #pcs-cells.
|
||||
|
||||
For simple implementation where #pcs-cells is 0 and the PCS driver
|
||||
expose a single PCS, the xlate function fwnode_pcs_simple_get() is
|
||||
provided.
|
||||
|
||||
For advanced implementation a custom xlate function is required.
|
||||
|
||||
PCS driver on removal should first delete as a provider with
|
||||
the usage of fwnode_pcs_del_provider() and then call
|
||||
phylink_release_pcs() on every PCS the driver provides and
|
||||
|
||||
A generic function fwnode_phylink_pcs_parse() is provided for any MAC
|
||||
driver that will declare PCS in DT (or ACPI).
|
||||
This function will parse "pcs-handle" property and fill the passed array
|
||||
with the parsed PCS in availabel_pcs up to the passed num_pcs value.
|
||||
It's also possible to pass NULL as array to only parse the PCS and
|
||||
update the num_pcs value with the count of scanned PCS.
|
||||
|
||||
Co-developed-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/pcs/Kconfig | 7 ++
|
||||
drivers/net/pcs/Makefile | 1 +
|
||||
drivers/net/pcs/pcs.c | 201 +++++++++++++++++++++++++++++++
|
||||
include/linux/pcs/pcs-provider.h | 41 +++++++
|
||||
include/linux/pcs/pcs.h | 56 +++++++++
|
||||
5 files changed, 306 insertions(+)
|
||||
create mode 100644 drivers/net/pcs/pcs.c
|
||||
create mode 100644 include/linux/pcs/pcs-provider.h
|
||||
create mode 100644 include/linux/pcs/pcs.h
|
||||
|
||||
--- a/drivers/net/pcs/Kconfig
|
||||
+++ b/drivers/net/pcs/Kconfig
|
||||
@@ -5,6 +5,13 @@
|
||||
|
||||
menu "PCS device drivers"
|
||||
|
||||
+config FWNODE_PCS
|
||||
+ tristate
|
||||
+ depends on (ACPI || OF)
|
||||
+ depends on PHYLINK
|
||||
+ help
|
||||
+ Firmware node PCS accessors
|
||||
+
|
||||
config PCS_XPCS
|
||||
tristate "Synopsys DesignWare Ethernet XPCS"
|
||||
select PHYLINK
|
||||
--- a/drivers/net/pcs/Makefile
|
||||
+++ b/drivers/net/pcs/Makefile
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Makefile for Linux PCS drivers
|
||||
|
||||
+obj-$(CONFIG_FWNODE_PCS) += pcs.o
|
||||
pcs_xpcs-$(CONFIG_PCS_XPCS) := pcs-xpcs.o pcs-xpcs-plat.o \
|
||||
pcs-xpcs-nxp.o pcs-xpcs-wx.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/pcs/pcs.c
|
||||
@@ -0,0 +1,201 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+
|
||||
+#include <linux/mutex.h>
|
||||
+#include <linux/property.h>
|
||||
+#include <linux/phylink.h>
|
||||
+#include <linux/pcs/pcs.h>
|
||||
+#include <linux/pcs/pcs-provider.h>
|
||||
+
|
||||
+MODULE_DESCRIPTION("PCS library");
|
||||
+MODULE_AUTHOR("Christian Marangi <ansuelsmth@gmail.com>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+struct fwnode_pcs_provider {
|
||||
+ struct list_head link;
|
||||
+
|
||||
+ struct fwnode_handle *fwnode;
|
||||
+ struct phylink_pcs *(*get)(struct fwnode_reference_args *pcsspec,
|
||||
+ void *data);
|
||||
+
|
||||
+ void *data;
|
||||
+};
|
||||
+
|
||||
+static LIST_HEAD(fwnode_pcs_providers);
|
||||
+static DEFINE_MUTEX(fwnode_pcs_mutex);
|
||||
+
|
||||
+struct phylink_pcs *fwnode_pcs_simple_get(struct fwnode_reference_args *pcsspec,
|
||||
+ void *data)
|
||||
+{
|
||||
+ return data;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_pcs_simple_get);
|
||||
+
|
||||
+int fwnode_pcs_add_provider(struct fwnode_handle *fwnode,
|
||||
+ struct phylink_pcs *(*get)(struct fwnode_reference_args *pcsspec,
|
||||
+ void *data),
|
||||
+ void *data)
|
||||
+{
|
||||
+ struct fwnode_pcs_provider *pp;
|
||||
+
|
||||
+ if (!fwnode)
|
||||
+ return 0;
|
||||
+
|
||||
+ pp = kzalloc(sizeof(*pp), GFP_KERNEL);
|
||||
+ if (!pp)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ pp->fwnode = fwnode_handle_get(fwnode);
|
||||
+ pp->data = data;
|
||||
+ pp->get = get;
|
||||
+
|
||||
+ mutex_lock(&fwnode_pcs_mutex);
|
||||
+ list_add(&pp->link, &fwnode_pcs_providers);
|
||||
+ mutex_unlock(&fwnode_pcs_mutex);
|
||||
+ pr_debug("Added pcs provider from %pfwf\n", fwnode);
|
||||
+
|
||||
+ fwnode_dev_initialized(fwnode, true);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_pcs_add_provider);
|
||||
+
|
||||
+void fwnode_pcs_del_provider(struct fwnode_handle *fwnode)
|
||||
+{
|
||||
+ struct fwnode_pcs_provider *pp;
|
||||
+
|
||||
+ if (!fwnode)
|
||||
+ return;
|
||||
+
|
||||
+ mutex_lock(&fwnode_pcs_mutex);
|
||||
+ list_for_each_entry(pp, &fwnode_pcs_providers, link) {
|
||||
+ if (pp->fwnode == fwnode) {
|
||||
+ list_del(&pp->link);
|
||||
+ fwnode_dev_initialized(pp->fwnode, false);
|
||||
+ fwnode_handle_put(pp->fwnode);
|
||||
+ kfree(pp);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ mutex_unlock(&fwnode_pcs_mutex);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_pcs_del_provider);
|
||||
+
|
||||
+static int fwnode_parse_pcsspec(const struct fwnode_handle *fwnode, int index,
|
||||
+ const char *name,
|
||||
+ struct fwnode_reference_args *out_args)
|
||||
+{
|
||||
+ int ret = -ENOENT;
|
||||
+
|
||||
+ if (!fwnode)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ if (name)
|
||||
+ index = fwnode_property_match_string(fwnode, "pcs-names",
|
||||
+ name);
|
||||
+
|
||||
+ ret = fwnode_property_get_reference_args(fwnode, "pcs-handle",
|
||||
+ "#pcs-cells",
|
||||
+ -1, index, out_args);
|
||||
+ if (ret || (name && index < 0))
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct phylink_pcs *
|
||||
+fwnode_pcs_get_from_pcsspec(struct fwnode_reference_args *pcsspec)
|
||||
+{
|
||||
+ struct fwnode_pcs_provider *provider;
|
||||
+ struct phylink_pcs *pcs = ERR_PTR(-EPROBE_DEFER);
|
||||
+
|
||||
+ if (!pcsspec)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ mutex_lock(&fwnode_pcs_mutex);
|
||||
+ list_for_each_entry(provider, &fwnode_pcs_providers, link) {
|
||||
+ if (provider->fwnode == pcsspec->fwnode) {
|
||||
+ pcs = provider->get(pcsspec, provider->data);
|
||||
+ if (!IS_ERR(pcs))
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ mutex_unlock(&fwnode_pcs_mutex);
|
||||
+
|
||||
+ return pcs;
|
||||
+}
|
||||
+
|
||||
+static struct phylink_pcs *__fwnode_pcs_get(struct fwnode_handle *fwnode,
|
||||
+ int index, const char *con_id)
|
||||
+{
|
||||
+ struct fwnode_reference_args pcsspec;
|
||||
+ struct phylink_pcs *pcs;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = fwnode_parse_pcsspec(fwnode, index, con_id, &pcsspec);
|
||||
+ if (ret)
|
||||
+ return ERR_PTR(ret);
|
||||
+
|
||||
+ pcs = fwnode_pcs_get_from_pcsspec(&pcsspec);
|
||||
+ fwnode_handle_put(pcsspec.fwnode);
|
||||
+
|
||||
+ return pcs;
|
||||
+}
|
||||
+
|
||||
+struct phylink_pcs *fwnode_pcs_get(struct fwnode_handle *fwnode, int index)
|
||||
+{
|
||||
+ return __fwnode_pcs_get(fwnode, index, NULL);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_pcs_get);
|
||||
+
|
||||
+static int fwnode_phylink_pcs_count(struct fwnode_handle *fwnode,
|
||||
+ unsigned int *num_pcs)
|
||||
+{
|
||||
+ struct fwnode_reference_args out_args;
|
||||
+ int index = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ while (true) {
|
||||
+ ret = fwnode_property_get_reference_args(fwnode, "pcs-handle",
|
||||
+ "#pcs-cells",
|
||||
+ -1, index, &out_args);
|
||||
+ /* We expect to reach an -ENOENT error while counting */
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+
|
||||
+ fwnode_handle_put(out_args.fwnode);
|
||||
+ index++;
|
||||
+ }
|
||||
+
|
||||
+ /* Update num_pcs with parsed PCS */
|
||||
+ *num_pcs = index;
|
||||
+
|
||||
+ /* Return error if we didn't found any PCS */
|
||||
+ return index > 0 ? 0 : -ENOENT;
|
||||
+}
|
||||
+
|
||||
+int fwnode_phylink_pcs_parse(struct fwnode_handle *fwnode,
|
||||
+ struct phylink_pcs **available_pcs,
|
||||
+ unsigned int *num_pcs)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (!fwnode_property_present(fwnode, "pcs-handle"))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ /* With available_pcs NULL, only count the PCS */
|
||||
+ if (!available_pcs)
|
||||
+ return fwnode_phylink_pcs_count(fwnode, num_pcs);
|
||||
+
|
||||
+ for (i = 0; i < *num_pcs; i++) {
|
||||
+ struct phylink_pcs *pcs;
|
||||
+
|
||||
+ pcs = fwnode_pcs_get(fwnode, i);
|
||||
+ if (IS_ERR(pcs))
|
||||
+ return PTR_ERR(pcs);
|
||||
+
|
||||
+ available_pcs[i] = pcs;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_phylink_pcs_parse);
|
||||
--- /dev/null
|
||||
+++ b/include/linux/pcs/pcs-provider.h
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
+#ifndef __LINUX_PCS_PROVIDER_H
|
||||
+#define __LINUX_PCS_PROVIDER_H
|
||||
+
|
||||
+/**
|
||||
+ * fwnode_pcs_simple_get - Simple xlate function to retrieve PCS
|
||||
+ * @pcsspec: reference arguments
|
||||
+ * @data: Context data (assumed assigned to the single PCS)
|
||||
+ *
|
||||
+ * Returns the PCS. (pointed by data)
|
||||
+ */
|
||||
+struct phylink_pcs *fwnode_pcs_simple_get(struct fwnode_reference_args *pcsspec,
|
||||
+ void *data);
|
||||
+
|
||||
+/**
|
||||
+ * fwnode_pcs_add_provider - Registers a new PCS provider
|
||||
+ * @np: Firmware node
|
||||
+ * @get: xlate function to retrieve the PCS
|
||||
+ * @data: Context data
|
||||
+ *
|
||||
+ * Register and add a new PCS to the global providers list
|
||||
+ * for the firmware node. A function to get the PCS from
|
||||
+ * firmware node with the use fwnode reference arguments.
|
||||
+ * To the get function is also passed the interface type
|
||||
+ * requested for the PHY. PCS driver will use the passed
|
||||
+ * interface to understand if the PCS can support it or not.
|
||||
+ *
|
||||
+ * Returns 0 on success or -ENOMEM on allocation failure.
|
||||
+ */
|
||||
+int fwnode_pcs_add_provider(struct fwnode_handle *fwnode,
|
||||
+ struct phylink_pcs *(*get)(struct fwnode_reference_args *pcsspec,
|
||||
+ void *data),
|
||||
+ void *data);
|
||||
+
|
||||
+/**
|
||||
+ * fwnode_pcs_del_provider - Removes a PCS provider
|
||||
+ * @fwnode: Firmware node
|
||||
+ */
|
||||
+void fwnode_pcs_del_provider(struct fwnode_handle *fwnode);
|
||||
+
|
||||
+#endif /* __LINUX_PCS_PROVIDER_H */
|
||||
--- /dev/null
|
||||
+++ b/include/linux/pcs/pcs.h
|
||||
@@ -0,0 +1,56 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
+#ifndef __LINUX_PCS_H
|
||||
+#define __LINUX_PCS_H
|
||||
+
|
||||
+#include <linux/phylink.h>
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_FWNODE_PCS)
|
||||
+/**
|
||||
+ * fwnode_pcs_get - Retrieves a PCS from a firmware node
|
||||
+ * @fwnode: firmware node
|
||||
+ * @index: index fwnode PCS handle in firmware node
|
||||
+ *
|
||||
+ * Get a PCS from the firmware node at index.
|
||||
+ *
|
||||
+ * Returns a pointer to the phylink_pcs or a negative
|
||||
+ * error pointer. Can return -EPROBE_DEFER if the PCS is not
|
||||
+ * present in global providers list (either due to driver
|
||||
+ * still needs to be probed or it failed to probe/removed)
|
||||
+ */
|
||||
+struct phylink_pcs *fwnode_pcs_get(struct fwnode_handle *fwnode,
|
||||
+ int index);
|
||||
+
|
||||
+/**
|
||||
+ * fwnode_phylink_pcs_parse - generic PCS parse for fwnode PCS provider
|
||||
+ * @fwnode: firmware node
|
||||
+ * @available_pcs: pointer to preallocated array of PCS
|
||||
+ * @num_pcs: where to store count of parsed PCS
|
||||
+ *
|
||||
+ * Generic helper function to fill available_pcs array with PCS parsed
|
||||
+ * from a "pcs-handle" fwnode property defined in firmware node up to
|
||||
+ * passed num_pcs.
|
||||
+ *
|
||||
+ * If available_pcs is NULL, num_pcs is updated with the count of the
|
||||
+ * parsed PCS.
|
||||
+ *
|
||||
+ * Returns 0 or a negative error.
|
||||
+ */
|
||||
+int fwnode_phylink_pcs_parse(struct fwnode_handle *fwnode,
|
||||
+ struct phylink_pcs **available_pcs,
|
||||
+ unsigned int *num_pcs);
|
||||
+#else
|
||||
+static inline struct phylink_pcs *fwnode_pcs_get(struct fwnode_handle *fwnode,
|
||||
+ int index)
|
||||
+{
|
||||
+ return ERR_PTR(-ENOENT);
|
||||
+}
|
||||
+
|
||||
+static inline int fwnode_phylink_pcs_parse(struct fwnode_handle *fwnode,
|
||||
+ struct phylink_pcs **available_pcs,
|
||||
+ unsigned int *num_pcs)
|
||||
+{
|
||||
+ return -EOPNOTSUPP;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+#endif /* __LINUX_PCS_H */
|
||||
+254
@@ -0,0 +1,254 @@
|
||||
From 684e49a015f2c5ae95ba968bb21ffc8fc36a2c7f Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Sun, 6 Apr 2025 03:28:22 +0200
|
||||
Subject: [PATCH 5/7] net: phylink: support late PCS provider attach
|
||||
|
||||
Add support in phylink for late PCS provider attach to a phylink
|
||||
instance. This works by creating a global notifier for the PCS provider
|
||||
and making each phylink instance that makes use of fwnode subscribe to
|
||||
this notifier.
|
||||
|
||||
The PCS notifier will emit the event FWNODE_PCS_PROVIDER_ADD every time
|
||||
a new PCS provider is added.
|
||||
|
||||
phylink will then react to this event and will call the new function
|
||||
fwnode_phylink_pcs_get_from_fwnode() that will check if the PCS fwnode
|
||||
provided by the event is present in the phy-handle property of the
|
||||
phylink instance.
|
||||
|
||||
If a related PCS is found, then such PCS is added to the phylink
|
||||
instance PCS list.
|
||||
|
||||
Then we link the PCS to the phylink instance if it's not disable and we
|
||||
refresh the supported interfaces of the phylink instance.
|
||||
|
||||
Finally we check if we are in a major_config_failed scenario and trigger
|
||||
an interface reconfiguration in the next phylink resolve.
|
||||
|
||||
If link was previously torn down due to removal of PCS, the link will be
|
||||
established again as the PCS came back and is not available to phylink.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/pcs/pcs.c | 34 +++++++++++++++++++++++++
|
||||
drivers/net/phy/phylink.c | 52 +++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/pcs/pcs.h | 48 ++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 134 insertions(+)
|
||||
|
||||
--- a/drivers/net/pcs/pcs.c
|
||||
+++ b/drivers/net/pcs/pcs.c
|
||||
@@ -22,6 +22,13 @@ struct fwnode_pcs_provider {
|
||||
|
||||
static LIST_HEAD(fwnode_pcs_providers);
|
||||
static DEFINE_MUTEX(fwnode_pcs_mutex);
|
||||
+static BLOCKING_NOTIFIER_HEAD(fwnode_pcs_notify_list);
|
||||
+
|
||||
+int register_fwnode_pcs_notifier(struct notifier_block *nb)
|
||||
+{
|
||||
+ return blocking_notifier_chain_register(&fwnode_pcs_notify_list, nb);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(register_fwnode_pcs_notifier);
|
||||
|
||||
struct phylink_pcs *fwnode_pcs_simple_get(struct fwnode_reference_args *pcsspec,
|
||||
void *data)
|
||||
@@ -55,6 +62,10 @@ int fwnode_pcs_add_provider(struct fwnod
|
||||
|
||||
fwnode_dev_initialized(fwnode, true);
|
||||
|
||||
+ blocking_notifier_call_chain(&fwnode_pcs_notify_list,
|
||||
+ FWNODE_PCS_PROVIDER_ADD,
|
||||
+ fwnode);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fwnode_pcs_add_provider);
|
||||
@@ -147,6 +158,29 @@ struct phylink_pcs *fwnode_pcs_get(struc
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fwnode_pcs_get);
|
||||
|
||||
+struct phylink_pcs *
|
||||
+fwnode_phylink_pcs_get_from_fwnode(struct fwnode_handle *fwnode,
|
||||
+ struct fwnode_handle *pcs_fwnode)
|
||||
+{
|
||||
+ struct fwnode_reference_args pcsspec;
|
||||
+ int i = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ while (true) {
|
||||
+ ret = fwnode_parse_pcsspec(fwnode, i, NULL, &pcsspec);
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+
|
||||
+ if (pcsspec.fwnode == pcs_fwnode)
|
||||
+ break;
|
||||
+
|
||||
+ i++;
|
||||
+ }
|
||||
+
|
||||
+ return fwnode_pcs_get(fwnode, i);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fwnode_phylink_pcs_get_from_fwnode);
|
||||
+
|
||||
static int fwnode_phylink_pcs_count(struct fwnode_handle *fwnode,
|
||||
unsigned int *num_pcs)
|
||||
{
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_mdio.h>
|
||||
+#include <linux/pcs/pcs.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/phy_fixed.h>
|
||||
#include <linux/phylink.h>
|
||||
@@ -67,6 +68,7 @@ struct phylink {
|
||||
|
||||
/* List of available PCS */
|
||||
struct list_head pcs_list;
|
||||
+ struct notifier_block fwnode_pcs_nb;
|
||||
|
||||
/* What interface are supported by the current link.
|
||||
* Can change on removal or addition of new PCS.
|
||||
@@ -2039,6 +2041,51 @@ int phylink_set_fixed_link(struct phylin
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_set_fixed_link);
|
||||
|
||||
+static int pcs_provider_notify(struct notifier_block *self,
|
||||
+ unsigned long val, void *data)
|
||||
+{
|
||||
+ struct phylink *pl = container_of(self, struct phylink, fwnode_pcs_nb);
|
||||
+ struct fwnode_handle *pcs_fwnode = data;
|
||||
+ struct phylink_pcs *pcs;
|
||||
+
|
||||
+ /* Check if the just added PCS provider is
|
||||
+ * in the phylink instance phy-handle property
|
||||
+ */
|
||||
+ pcs = fwnode_phylink_pcs_get_from_fwnode(dev_fwnode(pl->config->dev),
|
||||
+ pcs_fwnode);
|
||||
+ if (IS_ERR(pcs))
|
||||
+ return NOTIFY_DONE;
|
||||
+
|
||||
+ /* Add the PCS */
|
||||
+ rtnl_lock();
|
||||
+
|
||||
+ list_add(&pcs->list, &pl->pcs_list);
|
||||
+
|
||||
+ /* Link phylink if we are started */
|
||||
+ if (!pl->phylink_disable_state)
|
||||
+ pcs->phylink = pl;
|
||||
+
|
||||
+ /* Refresh supported interfaces */
|
||||
+ phy_interface_copy(pl->supported_interfaces,
|
||||
+ pl->config->supported_interfaces);
|
||||
+ list_for_each_entry(pcs, &pl->pcs_list, list)
|
||||
+ phy_interface_or(pl->supported_interfaces,
|
||||
+ pl->supported_interfaces,
|
||||
+ pcs->supported_interfaces);
|
||||
+
|
||||
+ mutex_lock(&pl->state_mutex);
|
||||
+ /* Force an interface reconfig if major config fail */
|
||||
+ if (pl->major_config_failed)
|
||||
+ pl->reconfig_interface = true;
|
||||
+ mutex_unlock(&pl->state_mutex);
|
||||
+
|
||||
+ rtnl_unlock();
|
||||
+
|
||||
+ phylink_run_resolve(pl);
|
||||
+
|
||||
+ return NOTIFY_OK;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* phylink_create() - create a phylink instance
|
||||
* @config: a pointer to the target &struct phylink_config
|
||||
@@ -2099,6 +2146,11 @@ struct phylink *phylink_create(struct ph
|
||||
pl->supported_interfaces,
|
||||
pcs->supported_interfaces);
|
||||
|
||||
+ if (!phy_interface_empty(config->pcs_interfaces)) {
|
||||
+ pl->fwnode_pcs_nb.notifier_call = pcs_provider_notify;
|
||||
+ register_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
|
||||
+ }
|
||||
+
|
||||
pl->config = config;
|
||||
if (config->type == PHYLINK_NETDEV) {
|
||||
pl->netdev = to_net_dev(config->dev);
|
||||
--- a/include/linux/pcs/pcs.h
|
||||
+++ b/include/linux/pcs/pcs.h
|
||||
@@ -4,8 +4,25 @@
|
||||
|
||||
#include <linux/phylink.h>
|
||||
|
||||
+enum fwnode_pcs_notify_event {
|
||||
+ FWNODE_PCS_PROVIDER_ADD,
|
||||
+};
|
||||
+
|
||||
#if IS_ENABLED(CONFIG_FWNODE_PCS)
|
||||
/**
|
||||
+ * register_fwnode_pcs_notifier - Register a notifier block for fwnode
|
||||
+ * PCS events
|
||||
+ * @nb: pointer to the notifier block
|
||||
+ *
|
||||
+ * Registers a notifier block to the fwnode_pcs_notify_list blocking
|
||||
+ * notifier chain. This allows phylink instance to subscribe for
|
||||
+ * PCS provider events.
|
||||
+ *
|
||||
+ * Returns 0 or a negative error.
|
||||
+ */
|
||||
+int register_fwnode_pcs_notifier(struct notifier_block *nb);
|
||||
+
|
||||
+/**
|
||||
* fwnode_pcs_get - Retrieves a PCS from a firmware node
|
||||
* @fwnode: firmware node
|
||||
* @index: index fwnode PCS handle in firmware node
|
||||
@@ -21,6 +38,25 @@ struct phylink_pcs *fwnode_pcs_get(struc
|
||||
int index);
|
||||
|
||||
/**
|
||||
+ * fwnode_phylink_pcs_get_from_fwnode - Retrieves the PCS provided
|
||||
+ * by the firmware node from a
|
||||
+ * firmware node
|
||||
+ * @fwnode: firmware node
|
||||
+ * @pcs_fwnode: PCS firmware node
|
||||
+ *
|
||||
+ * Parse 'pcs-handle' in 'fwnode' and get the PCS that match
|
||||
+ * 'pcs_fwnode' firmware node.
|
||||
+ *
|
||||
+ * Returns a pointer to the phylink_pcs or a negative
|
||||
+ * error pointer. Can return -EPROBE_DEFER if the PCS is not
|
||||
+ * present in global providers list (either due to driver
|
||||
+ * still needs to be probed or it failed to probe/removed)
|
||||
+ */
|
||||
+struct phylink_pcs *
|
||||
+fwnode_phylink_pcs_get_from_fwnode(struct fwnode_handle *fwnode,
|
||||
+ struct fwnode_handle *pcs_fwnode);
|
||||
+
|
||||
+/**
|
||||
* fwnode_phylink_pcs_parse - generic PCS parse for fwnode PCS provider
|
||||
* @fwnode: firmware node
|
||||
* @available_pcs: pointer to preallocated array of PCS
|
||||
@@ -39,11 +75,23 @@ int fwnode_phylink_pcs_parse(struct fwno
|
||||
struct phylink_pcs **available_pcs,
|
||||
unsigned int *num_pcs);
|
||||
#else
|
||||
+static inline int register_fwnode_pcs_notifier(struct notifier_block *nb)
|
||||
+{
|
||||
+ return -EOPNOTSUPP;
|
||||
+}
|
||||
+
|
||||
static inline struct phylink_pcs *fwnode_pcs_get(struct fwnode_handle *fwnode,
|
||||
int index)
|
||||
{
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
+
|
||||
+static inline struct phylink_pcs *
|
||||
+fwnode_phylink_pcs_get_from_fwnode(struct fwnode_handle *fwnode,
|
||||
+ struct fwnode_handle *pcs_fwnode)
|
||||
+{
|
||||
+ return ERR_PTR(-ENOENT);
|
||||
+}
|
||||
|
||||
static inline int fwnode_phylink_pcs_parse(struct fwnode_handle *fwnode,
|
||||
struct phylink_pcs **available_pcs,
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
From c5d151dccce7deb62620a7b16418c0d6d6a59720 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Mon, 17 Mar 2025 23:07:45 +0100
|
||||
Subject: [PATCH 6/7] dt-bindings: net: ethernet-controller: permit to define
|
||||
multiple PCS
|
||||
|
||||
Drop the limitation of a single PCS in pcs-handle property. Multiple PCS
|
||||
can be defined for an ethrnet-controller node to support various PHY
|
||||
interface mode type.
|
||||
|
||||
It's very common for SoCs to have a dedicated PCS for SGMII mode and one
|
||||
for USXGMII mode.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/net/ethernet-controller.yaml | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/net/ethernet-controller.yaml
|
||||
+++ b/Documentation/devicetree/bindings/net/ethernet-controller.yaml
|
||||
@@ -110,8 +110,6 @@ properties:
|
||||
|
||||
pcs-handle:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
- items:
|
||||
- maxItems: 1
|
||||
description:
|
||||
Specifies a reference to a node representing a PCS PHY device on a MDIO
|
||||
bus to link with an external PHY (phy-handle) if exists.
|
||||
+15
-15
@@ -1,7 +1,7 @@
|
||||
From d5fb4ad1beec53ca5d3b44d9b88598ed4ab0b34d Mon Sep 17 00:00:00 2001
|
||||
From 4b1dde131a237455e41985fdc95306cd2f1b8a0a Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Fri, 9 May 2025 16:36:22 +0200
|
||||
Subject: [PATCH 1/6] net: phylink: add .pcs_link_down PCS OP
|
||||
Subject: [PATCH 7/7] net: phylink: add .pcs_link_down PCS OP
|
||||
|
||||
Permit for PCS driver to define specific operation to torn down the link
|
||||
between the MAC and the PCS.
|
||||
@@ -22,8 +22,8 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -1088,6 +1088,12 @@ static unsigned int phylink_inband_caps(
|
||||
return phylink_pcs_inband_caps(pcs, interface);
|
||||
@@ -1178,6 +1178,12 @@ static void phylink_pcs_link_up(struct p
|
||||
pcs->ops->pcs_link_up(pcs, neg_mode, interface, speed, duplex);
|
||||
}
|
||||
|
||||
+static void phylink_pcs_link_down(struct phylink_pcs *pcs)
|
||||
@@ -32,10 +32,10 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+ pcs->ops->pcs_link_down(pcs);
|
||||
+}
|
||||
+
|
||||
static void phylink_pcs_poll_stop(struct phylink *pl)
|
||||
{
|
||||
if (pl->cfg_link_an_mode == MLO_AN_INBAND)
|
||||
@@ -1651,6 +1657,8 @@ static void phylink_link_down(struct phy
|
||||
/* Query inband for a specific interface mode, asking the MAC for the
|
||||
* PCS which will be used to handle the interface mode.
|
||||
*/
|
||||
@@ -1817,6 +1823,8 @@ static void phylink_link_down(struct phy
|
||||
|
||||
if (ndev)
|
||||
netif_carrier_off(ndev);
|
||||
@@ -46,19 +46,19 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
phylink_info(pl, "Link is Down\n");
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -431,6 +431,7 @@ struct phylink_pcs {
|
||||
@@ -443,6 +443,7 @@ struct phylink_pcs {
|
||||
* @pcs_an_restart: restart 802.3z BaseX autonegotiation.
|
||||
* @pcs_link_up: program the PCS for the resolved link configuration
|
||||
* (where necessary).
|
||||
+ * @pcs_link_down: torn down link between MAC and PCS.
|
||||
* @pcs_pre_init: configure PCS components necessary for MAC hardware
|
||||
* initialization e.g. RX clock for stmmac.
|
||||
+ * @pcs_link_down: torn down link between MAC and PCS.
|
||||
*/
|
||||
struct phylink_pcs_ops {
|
||||
int (*pcs_validate)(struct phylink_pcs *pcs, unsigned long *supported,
|
||||
@@ -453,6 +454,7 @@ struct phylink_pcs_ops {
|
||||
@@ -466,6 +467,7 @@ struct phylink_pcs_ops {
|
||||
void (*pcs_an_restart)(struct phylink_pcs *pcs);
|
||||
void (*pcs_link_up)(struct phylink_pcs *pcs, unsigned int neg_mode,
|
||||
phy_interface_t interface, int speed, int duplex);
|
||||
int (*pcs_pre_init)(struct phylink_pcs *pcs);
|
||||
+ void (*pcs_link_down)(struct phylink_pcs *pcs);
|
||||
int (*pcs_pre_init)(struct phylink_pcs *pcs);
|
||||
};
|
||||
|
||||
#if 0 /* For kernel-doc purposes only. */
|
||||
+2
-2
@@ -20,7 +20,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -2278,7 +2278,7 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
@@ -2282,7 +2282,7 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
{
|
||||
struct fwnode_handle *phy_fwnode;
|
||||
struct phy_device *phy_dev;
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
/* Fixed links and 802.3z are handled without needing a PHY */
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
|
||||
@@ -2308,6 +2308,25 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
@@ -2312,6 +2312,25 @@ int phylink_fwnode_phy_connect(struct ph
|
||||
if (pl->config->mac_requires_rxc)
|
||||
flags |= PHY_F_RXC_ALWAYS_ON;
|
||||
|
||||
|
||||
+7
-7
@@ -20,7 +20,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -59,6 +59,11 @@ struct phylink {
|
||||
@@ -60,6 +60,11 @@ struct phylink {
|
||||
/* The link configuration settings */
|
||||
struct phylink_link_state link_config;
|
||||
|
||||
@@ -32,7 +32,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* The current settings */
|
||||
phy_interface_t cur_interface;
|
||||
|
||||
@@ -623,7 +628,7 @@ static int phylink_validate_mask(struct
|
||||
@@ -625,7 +630,7 @@ static int phylink_validate_mask(struct
|
||||
static int phylink_validate(struct phylink *pl, unsigned long *supported,
|
||||
struct phylink_link_state *state)
|
||||
{
|
||||
@@ -41,7 +41,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
if (state->interface == PHY_INTERFACE_MODE_NA)
|
||||
return phylink_validate_mask(pl, NULL, supported, state,
|
||||
@@ -1853,6 +1858,9 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1857,6 +1862,9 @@ struct phylink *phylink_create(struct ph
|
||||
mutex_init(&pl->state_mutex);
|
||||
INIT_WORK(&pl->resolve, phylink_resolve);
|
||||
|
||||
@@ -51,7 +51,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
pl->config = config;
|
||||
if (config->type == PHYLINK_NETDEV) {
|
||||
pl->netdev = to_net_dev(config->dev);
|
||||
@@ -2011,7 +2019,7 @@ static int phylink_validate_phy(struct p
|
||||
@@ -2015,7 +2023,7 @@ static int phylink_validate_phy(struct p
|
||||
* those which the host supports.
|
||||
*/
|
||||
phy_interface_and(interfaces, phy->possible_interfaces,
|
||||
@@ -60,7 +60,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
if (phy_interface_empty(interfaces)) {
|
||||
phylink_err(pl, "PHY has no common interfaces\n");
|
||||
@@ -2753,12 +2761,12 @@ static phy_interface_t phylink_sfp_selec
|
||||
@@ -2757,12 +2765,12 @@ static phy_interface_t phylink_sfp_selec
|
||||
return interface;
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
return PHY_INTERFACE_MODE_NA;
|
||||
}
|
||||
|
||||
@@ -3686,14 +3694,14 @@ static int phylink_sfp_config_optical(st
|
||||
@@ -3690,14 +3698,14 @@ static int phylink_sfp_config_optical(st
|
||||
|
||||
phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
|
||||
(int)PHY_INTERFACE_MODE_MAX,
|
||||
@@ -92,7 +92,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
pl->sfp_interfaces);
|
||||
if (phy_interface_empty(pl->sfp_interfaces)) {
|
||||
phylink_err(pl, "unsupported SFP module: no common interface modes\n");
|
||||
@@ -3864,7 +3872,7 @@ static int phylink_sfp_connect_phy(void
|
||||
@@ -3868,7 +3876,7 @@ static int phylink_sfp_connect_phy(void
|
||||
|
||||
/* Set the PHY's host supported interfaces */
|
||||
phy_interface_and(phy->host_interfaces, phylink_sfp_interfaces,
|
||||
|
||||
+14
-14
@@ -62,7 +62,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -59,6 +59,9 @@ struct phylink {
|
||||
@@ -60,6 +60,9 @@ struct phylink {
|
||||
/* The link configuration settings */
|
||||
struct phylink_link_state link_config;
|
||||
|
||||
@@ -72,7 +72,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* What interface are supported by the current link.
|
||||
* Can change on removal or addition of new PCS.
|
||||
*/
|
||||
@@ -149,6 +152,8 @@ static const phy_interface_t phylink_sfp
|
||||
@@ -151,6 +154,8 @@ static const phy_interface_t phylink_sfp
|
||||
|
||||
static DECLARE_PHY_INTERFACE_MASK(phylink_sfp_interfaces);
|
||||
|
||||
@@ -81,7 +81,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/**
|
||||
* phylink_set_port_modes() - set the port type modes in the ethtool mask
|
||||
* @mask: ethtool link mode mask
|
||||
@@ -512,22 +517,59 @@ static void phylink_validate_mask_caps(u
|
||||
@@ -514,22 +519,59 @@ static void phylink_validate_mask_caps(u
|
||||
linkmode_and(state->advertising, state->advertising, mask);
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* The PCS, if present, must be setup before phylink_create()
|
||||
* has been called. If the ops is not initialised, print an
|
||||
* error and backtrace rather than oopsing the kernel.
|
||||
@@ -539,13 +581,10 @@ static int phylink_validate_mac_and_pcs(
|
||||
@@ -541,13 +583,10 @@ static int phylink_validate_mac_and_pcs(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
phy_modes(state->interface));
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -959,12 +998,22 @@ static unsigned int phylink_inband_caps(
|
||||
@@ -961,12 +1000,22 @@ static unsigned int phylink_inband_caps(
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct phylink_pcs *pcs;
|
||||
@@ -188,7 +188,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
return 0;
|
||||
|
||||
return phylink_pcs_inband_caps(pcs, interface);
|
||||
@@ -1259,10 +1308,36 @@ static void phylink_major_config(struct
|
||||
@@ -1261,10 +1310,36 @@ static void phylink_major_config(struct
|
||||
pl->major_config_failed = true;
|
||||
return;
|
||||
}
|
||||
@@ -226,7 +226,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising);
|
||||
|
||||
phylink_dbg(pl, "major config, active %s/%s/%s\n",
|
||||
@@ -1289,11 +1364,13 @@ static void phylink_major_config(struct
|
||||
@@ -1291,11 +1366,13 @@ static void phylink_major_config(struct
|
||||
if (pcs_changed) {
|
||||
phylink_pcs_disable(pl->pcs);
|
||||
|
||||
@@ -244,7 +244,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
pl->pcs = pcs;
|
||||
}
|
||||
@@ -1840,8 +1917,9 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1844,8 +1921,9 @@ struct phylink *phylink_create(struct ph
|
||||
phy_interface_t iface,
|
||||
const struct phylink_mac_ops *mac_ops)
|
||||
{
|
||||
@@ -255,7 +255,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
/* Validate the supplied configuration */
|
||||
if (phy_interface_empty(config->supported_interfaces)) {
|
||||
@@ -1857,9 +1935,21 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1861,9 +1939,21 @@ struct phylink *phylink_create(struct ph
|
||||
mutex_init(&pl->phydev_mutex);
|
||||
mutex_init(&pl->state_mutex);
|
||||
INIT_WORK(&pl->resolve, phylink_resolve);
|
||||
@@ -277,7 +277,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
pl->config = config;
|
||||
if (config->type == PHYLINK_NETDEV) {
|
||||
@@ -1938,10 +2028,16 @@ EXPORT_SYMBOL_GPL(phylink_create);
|
||||
@@ -1942,10 +2032,16 @@ EXPORT_SYMBOL_GPL(phylink_create);
|
||||
*/
|
||||
void phylink_destroy(struct phylink *pl)
|
||||
{
|
||||
@@ -294,7 +294,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
cancel_work_sync(&pl->resolve);
|
||||
kfree(pl);
|
||||
}
|
||||
@@ -2443,6 +2539,7 @@ static irqreturn_t phylink_link_handler(
|
||||
@@ -2447,6 +2543,7 @@ static irqreturn_t phylink_link_handler(
|
||||
*/
|
||||
void phylink_start(struct phylink *pl)
|
||||
{
|
||||
@@ -302,7 +302,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
bool poll = false;
|
||||
|
||||
ASSERT_RTNL();
|
||||
@@ -2469,6 +2566,10 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -2473,6 +2570,10 @@ void phylink_start(struct phylink *pl)
|
||||
|
||||
pl->pcs_state = PCS_STATE_STARTED;
|
||||
|
||||
@@ -313,7 +313,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED);
|
||||
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
|
||||
@@ -2513,6 +2614,8 @@ EXPORT_SYMBOL_GPL(phylink_start);
|
||||
@@ -2517,6 +2618,8 @@ EXPORT_SYMBOL_GPL(phylink_start);
|
||||
*/
|
||||
void phylink_stop(struct phylink *pl)
|
||||
{
|
||||
@@ -322,7 +322,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (pl->sfp_bus)
|
||||
@@ -2530,6 +2633,14 @@ void phylink_stop(struct phylink *pl)
|
||||
@@ -2534,6 +2637,14 @@ void phylink_stop(struct phylink *pl)
|
||||
pl->pcs_state = PCS_STATE_DOWN;
|
||||
|
||||
phylink_pcs_disable(pl->pcs);
|
||||
|
||||
+12
-13
@@ -29,15 +29,15 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -86,6 +86,7 @@ struct phylink {
|
||||
bool link_failed;
|
||||
@@ -88,6 +88,7 @@ struct phylink {
|
||||
bool suspend_link_up;
|
||||
bool force_major_config;
|
||||
bool major_config_failed;
|
||||
+ bool reconfig_interface;
|
||||
bool mac_supports_eee_ops;
|
||||
bool mac_supports_eee;
|
||||
bool phy_enable_tx_lpi;
|
||||
@@ -917,6 +918,55 @@ static void phylink_resolve_an_pause(str
|
||||
@@ -919,6 +920,55 @@ static void phylink_resolve_an_pause(str
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
static unsigned int phylink_pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
@@ -1730,6 +1780,10 @@ static void phylink_resolve(struct work_
|
||||
@@ -1732,6 +1782,10 @@ static void phylink_resolve(struct work_
|
||||
if (phy)
|
||||
link_state.link &= pl->phy_state.link;
|
||||
|
||||
@@ -104,20 +104,19 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* Only update if the PHY link is up */
|
||||
if (phy && pl->phy_state.link) {
|
||||
/* If the interface has changed, force a link down
|
||||
@@ -1763,7 +1817,8 @@ static void phylink_resolve(struct work_
|
||||
if (pl->act_link_an_mode != MLO_AN_FIXED)
|
||||
@@ -1766,7 +1820,7 @@ static void phylink_resolve(struct work_
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
- if (mac_config && link_state.interface != pl->link_config.interface) {
|
||||
+ if ((mac_config && link_state.interface != pl->link_config.interface) ||
|
||||
+ pl->reconfig_interface) {
|
||||
/* The interface has changed, so force the link down and then
|
||||
* reconfigure.
|
||||
if ((mac_config && link_state.interface != pl->link_config.interface) ||
|
||||
- pl->force_major_config) {
|
||||
+ pl->force_major_config || pl->reconfig_interface) {
|
||||
/* The interface has changed or a forced major configuration
|
||||
* was requested, so force the link down and then reconfigure.
|
||||
*/
|
||||
@@ -1773,6 +1828,7 @@ static void phylink_resolve(struct work_
|
||||
}
|
||||
@@ -1777,6 +1831,7 @@ static void phylink_resolve(struct work_
|
||||
phylink_major_config(pl, false, &link_state);
|
||||
pl->link_config.interface = link_state.interface;
|
||||
pl->force_major_config = false;
|
||||
+ pl->reconfig_interface = false;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -102,7 +102,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/phy_fixed.h>
|
||||
#include <linux/phylink.h>
|
||||
@@ -61,6 +62,7 @@ struct phylink {
|
||||
@@ -62,6 +63,7 @@ struct phylink {
|
||||
|
||||
/* List of available PCS */
|
||||
struct list_head pcs_list;
|
||||
@@ -110,7 +110,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
/* What interface are supported by the current link.
|
||||
* Can change on removal or addition of new PCS.
|
||||
@@ -1952,6 +1954,51 @@ int phylink_set_fixed_link(struct phylin
|
||||
@@ -1955,6 +1957,51 @@ int phylink_set_fixed_link(struct phylin
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_set_fixed_link);
|
||||
|
||||
@@ -162,7 +162,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/**
|
||||
* phylink_create() - create a phylink instance
|
||||
* @config: a pointer to the target &struct phylink_config
|
||||
@@ -2007,6 +2054,11 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -2010,6 +2057,11 @@ struct phylink *phylink_create(struct ph
|
||||
pl->supported_interfaces,
|
||||
pcs->supported_interfaces);
|
||||
|
||||
|
||||
+2
-2
@@ -22,7 +22,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -1031,6 +1031,12 @@ static void phylink_pcs_link_up(struct p
|
||||
@@ -1033,6 +1033,12 @@ static void phylink_pcs_link_up(struct p
|
||||
pcs->ops->pcs_link_up(pcs, neg_mode, interface, speed, duplex);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
static void phylink_pcs_disable_eee(struct phylink_pcs *pcs)
|
||||
{
|
||||
if (pcs && pcs->ops->pcs_disable_eee)
|
||||
@@ -1723,6 +1729,8 @@ static void phylink_link_down(struct phy
|
||||
@@ -1725,6 +1731,8 @@ static void phylink_link_down(struct phy
|
||||
|
||||
phylink_deactivate_lpi(pl);
|
||||
|
||||
|
||||
@@ -60,7 +60,8 @@ mikrotik,lhgg-60ad)
|
||||
ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt"
|
||||
;;
|
||||
meraki,gx20|\
|
||||
meraki,z3)
|
||||
meraki,z3|\
|
||||
meraki,z3c)
|
||||
ucidef_set_led_netdev "wan_link" "WAN (link)" "green:wan-0" "wan" "link"
|
||||
ucidef_set_led_netdev "wan_act" "WAN (txrx)" "green:wan-1" "wan" "tx rx"
|
||||
ucidef_set_led_netdev "lan1_link" "LAN2 (link)" "green:lan-2" "lan2" "link"
|
||||
|
||||
@@ -108,7 +108,8 @@ ipq40xx_setup_interfaces()
|
||||
ucidef_set_interfaces_lan_wan "lan1 lan2" "wan"
|
||||
;;
|
||||
meraki,gx20|\
|
||||
meraki,z3)
|
||||
meraki,z3|\
|
||||
meraki,z3c)
|
||||
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan"
|
||||
;;
|
||||
meraki,mr30h)
|
||||
|
||||
@@ -22,7 +22,8 @@ compex,wpj428)
|
||||
ucidef_add_gpio_switch "sim_card_select" "SIM card select" "3" "0"
|
||||
;;
|
||||
meraki,gx20|\
|
||||
meraki,z3)
|
||||
meraki,z3|\
|
||||
meraki,z3c)
|
||||
ucidef_add_gpio_switch "lan5_poe_disable" "LAN5 PoE disable" "540" "0"
|
||||
;;
|
||||
mikrotik,cap-ac)
|
||||
|
||||
@@ -19,6 +19,15 @@ boot() {
|
||||
sleep 1
|
||||
echo "1" > /sys/class/gpio/lte_pwrkey/value
|
||||
;;
|
||||
meraki,z3c)
|
||||
echo "0" > /sys/class/gpio/lte_estop/value
|
||||
sleep 1
|
||||
echo "1" > /sys/class/gpio/lte_en/value
|
||||
sleep 1
|
||||
echo "1" > /sys/class/gpio/lte_rst/value
|
||||
sleep 1
|
||||
echo "0" > /sys/class/gpio/lte_rst/value
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -30,5 +39,9 @@ shutdown() {
|
||||
echo "1" > /sys/class/gpio/lte_pwrkey/value
|
||||
sleep 10
|
||||
;;
|
||||
meraki,z3c)
|
||||
echo "1" > /sys/class/gpio/lte_estop/value
|
||||
echo "0" > /sys/class/gpio/lte_en/value
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -191,7 +191,8 @@ platform_do_upgrade() {
|
||||
meraki,mr20|\
|
||||
meraki,mr70|\
|
||||
meraki,gx20|\
|
||||
meraki,z3)
|
||||
meraki,z3|\
|
||||
meraki,z3c)
|
||||
# DO NOT set CI_KERNPART to part.safe,
|
||||
# that is used for chain-loading an unlocked u-boot
|
||||
# if part.safe is overwritten, then u-boot is lost!
|
||||
|
||||
@@ -219,20 +219,16 @@
|
||||
};
|
||||
|
||||
serial_0_pins: serial_pinmux {
|
||||
mux {
|
||||
pins = "gpio16", "gpio17";
|
||||
function = "blsp_uart0";
|
||||
bias-disable;
|
||||
};
|
||||
pins = "gpio16", "gpio17";
|
||||
function = "blsp_uart0";
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
serial_1_pins: serial1_pinmux {
|
||||
mux {
|
||||
/* We use the i2c-0 pins for serial_1 */
|
||||
pins = "gpio8", "gpio9";
|
||||
function = "blsp_uart1";
|
||||
bias-disable;
|
||||
};
|
||||
/* We use the i2c-0 pins for serial_1 */
|
||||
pins = "gpio8", "gpio9";
|
||||
function = "blsp_uart1";
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
i2c_0_pins: i2c_0_pinmux {
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
compatible = "ti,lp5562";
|
||||
reg = <0x30>;
|
||||
clock-mode = /bits/8 <2>;
|
||||
enable-gpios = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
|
||||
@@ -80,27 +80,23 @@
|
||||
};
|
||||
};
|
||||
|
||||
gpio_export {
|
||||
compatible = "gpio-export";
|
||||
#size-cells = <0>;
|
||||
gpio_export {
|
||||
compatible = "gpio-export";
|
||||
#size-cells = <0>;
|
||||
|
||||
pse_en {
|
||||
gpio-export,name = "pse_en";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
pse_en {
|
||||
gpio-export,name = "pse_en";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
poeaf_det {
|
||||
gpio-export,name = "poeaf_det";
|
||||
gpio-export,input = <0>;
|
||||
gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
poeaf_det {
|
||||
gpio-export,name = "poeaf_det";
|
||||
gpio-export,input = <0>;
|
||||
gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
&tricolor {
|
||||
enable-gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&tricolor {
|
||||
enable-gpios = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&tricolor {
|
||||
enable-gpios = <&tlmm 14 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1,411 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Device Tree Source for Meraki "wired-arm-qca" series
|
||||
*
|
||||
* Copyright (C) 2017 Chris Blake <chrisrblake93@gmail.com>
|
||||
* Copyright (C) 2017 Christian Lamparter <chunkeey@googlemail.com>
|
||||
* Copyright (C) 2025 Hal Martin <halmartin@googlemail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "qcom-ipq4019.dtsi"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/soc/qcom,tcsr.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
led-boot = &status_green;
|
||||
led-failsafe = &status_red;
|
||||
led-running = &status_green;
|
||||
led-upgrade = &power_orange;
|
||||
};
|
||||
|
||||
soc {
|
||||
/* It is a 56-bit counter that supplies the count to the ARM arch
|
||||
timers and without upstream driver */
|
||||
counter@4a1000 {
|
||||
compatible = "qcom,qca-gcnt";
|
||||
reg = <0x4a1000 0x4>;
|
||||
};
|
||||
|
||||
ess_tcsr@1953000 {
|
||||
compatible = "qcom,tcsr";
|
||||
reg = <0x1953000 0x1000>;
|
||||
qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
|
||||
};
|
||||
|
||||
tcsr@1949000 {
|
||||
compatible = "qcom,tcsr";
|
||||
reg = <0x1949000 0x100>;
|
||||
qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
|
||||
};
|
||||
|
||||
tcsr@194b000 {
|
||||
/* select hostmode */
|
||||
compatible = "qcom,tcsr";
|
||||
reg = <0x194b000 0x100>;
|
||||
qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
tcsr@1957000 {
|
||||
compatible = "qcom,tcsr";
|
||||
reg = <0x1957000 0x100>;
|
||||
qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <KEY_RESTART>;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&blsp_dma {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&blsp1_uart1 {
|
||||
pinctrl-0 = <&serial_0_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cryptobam {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&blsp1_i2c3 {
|
||||
pinctrl-0 = <&i2c_0_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
eeprom@50 {
|
||||
compatible = "atmel,24c64";
|
||||
pagesize = <32>;
|
||||
reg = <0x50>;
|
||||
read-only; /* This holds our MAC & Meraki board-data */
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
mac_address: mac-address@66 {
|
||||
compatible = "mac-base";
|
||||
reg = <0x66 0x6>;
|
||||
#nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&blsp1_i2c4 {
|
||||
pinctrl-0 = <&i2c_1_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
tricolor: led-controller@30 {
|
||||
compatible = "ti,lp5562";
|
||||
reg = <0x30>;
|
||||
clock-mode = /bits/8 <2>;
|
||||
enable-gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* RGB led */
|
||||
status_red: chan@0 {
|
||||
chan-name = "red:status";
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <0>;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
};
|
||||
|
||||
status_green: chan@1 {
|
||||
chan-name = "green:status";
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <1>;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
};
|
||||
|
||||
chan@2 {
|
||||
chan-name = "blue:status";
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <2>;
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
|
||||
chan@3 {
|
||||
chan-name = "white:status";
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <3>;
|
||||
color = <LED_COLOR_ID_WHITE>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&nand {
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
nand@0 {
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "sbl1";
|
||||
reg = <0x00000000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "mibib";
|
||||
reg = <0x00100000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@200000 {
|
||||
label = "bootconfig";
|
||||
reg = <0x00200000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@300000 {
|
||||
label = "qsee";
|
||||
reg = <0x00300000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@400000 {
|
||||
label = "qsee_alt";
|
||||
reg = <0x00400000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@500000 {
|
||||
label = "cdt";
|
||||
reg = <0x00500000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@580000 {
|
||||
label = "cdt_alt";
|
||||
reg = <0x00580000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@600000 {
|
||||
label = "ddrparams";
|
||||
reg = <0x00600000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@700000 {
|
||||
label = "u-boot";
|
||||
reg = <0x00700000 0x00200000>;
|
||||
read-only;
|
||||
};
|
||||
partition@900000 {
|
||||
label = "u-boot-backup";
|
||||
reg = <0x00900000 0x00200000>;
|
||||
read-only;
|
||||
};
|
||||
partition@b00000 {
|
||||
label = "ART";
|
||||
reg = <0x00b00000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@c00000 {
|
||||
compatible = "linux,ubi";
|
||||
reg = <0x00c00000 0x07000000>;
|
||||
label = "ubi";
|
||||
/*
|
||||
* Do not try to allocate the remaining
|
||||
* 4 MiB to this ubi partition. It will
|
||||
* confuse the u-boot and it might not
|
||||
* find the kernel partition anymore.
|
||||
*/
|
||||
volumes {
|
||||
ubi_art: ubi-volume-art {
|
||||
volname = "ART";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&qpic_bam {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mdio {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&mdio_pins>;
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&tlmm {
|
||||
mdio_pins: mdio_pinmux {
|
||||
mux_1 {
|
||||
pins = "gpio6";
|
||||
function = "mdio";
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_2 {
|
||||
pins = "gpio7";
|
||||
function = "mdc";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
serial_0_pins: serial_pinmux {
|
||||
pins = "gpio16", "gpio17";
|
||||
function = "blsp_uart0";
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
serial_1_pins: serial1_pinmux {
|
||||
/* We use the i2c-0 pins for serial_1 */
|
||||
pins = "gpio8", "gpio9";
|
||||
function = "blsp_uart1";
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
i2c_0_pins: i2c_0_pinmux {
|
||||
function = "blsp_i2c0";
|
||||
pins = "gpio20", "gpio21";
|
||||
drive-strength = <16>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
i2c_1_pins: i2c_1_pinmux {
|
||||
function = "blsp_i2c1";
|
||||
pins = "gpio34", "gpio35";
|
||||
drive-strength = <16>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
nand_pins: nand_pins {
|
||||
/*
|
||||
* There are 18 pins. 15 pins are common between LCD and NAND.
|
||||
* The QPIC controller arbitrates between LCD and NAND. Of the
|
||||
* remaining 4, 2 are for NAND and 2 are for LCD exclusively.
|
||||
*
|
||||
* The meraki source hints that the bluetooth module claims
|
||||
* pin 52 as well. But sadly, there's no data whenever this
|
||||
* is a NAND or LCD exclusive pin or not.
|
||||
*/
|
||||
|
||||
pullups {
|
||||
pins = "gpio53", "gpio58", "gpio59";
|
||||
function = "qpic";
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
pulldowns {
|
||||
pins = "gpio55", "gpio56",
|
||||
"gpio57", "gpio60", "gpio62",
|
||||
"gpio63", "gpio64", "gpio65",
|
||||
"gpio66", "gpio67", "gpio68",
|
||||
"gpio69";
|
||||
function = "qpic";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&usb2_hs_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_hs_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_ss_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&ubi_art {
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
precal_factory_1000: precal@1000 {
|
||||
reg = <0x1000 0x2f20>;
|
||||
};
|
||||
|
||||
precal_factory_5000: precal@5000 {
|
||||
reg = <0x5000 0x2f20>;
|
||||
};
|
||||
|
||||
cal_factory_9000: cal@9000 {
|
||||
reg = <0x9000 0x844>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&wifi0 {
|
||||
status = "okay";
|
||||
nvmem-cells = <&precal_factory_1000>;
|
||||
nvmem-cell-names = "pre-calibration";
|
||||
};
|
||||
|
||||
&wifi1 {
|
||||
status = "okay";
|
||||
nvmem-cells = <&precal_factory_5000>;
|
||||
nvmem-cell-names = "pre-calibration";
|
||||
};
|
||||
|
||||
&gmac {
|
||||
status = "okay";
|
||||
nvmem-cells = <&mac_address 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
&switch {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport1 {
|
||||
label = "wan";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport2 {
|
||||
label = "lan2";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport3 {
|
||||
label = "lan3";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport4 {
|
||||
label = "lan4";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport5 {
|
||||
label = "lan5";
|
||||
status = "okay";
|
||||
};
|
||||
@@ -113,10 +113,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&tricolor {
|
||||
enable-gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&usb2_hs_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -0,0 +1,209 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
// Device Tree Source for Meraki Z3C (Heart of Gold)
|
||||
|
||||
#include "qcom-ipq4029-meraki-insect.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Meraki Z3C LTE Router";
|
||||
compatible = "meraki,z3c";
|
||||
|
||||
soc {
|
||||
ess_tcsr@1953000 {
|
||||
qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
|
||||
};
|
||||
|
||||
tcsr@194b000 {
|
||||
/* select hostmode */
|
||||
compatible = "qcom,tcsr";
|
||||
reg = <0x194b000 0x100>;
|
||||
qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
power_orange: power {
|
||||
color = <LED_COLOR_ID_ORANGE>;
|
||||
function = LED_FUNCTION_POWER;
|
||||
gpios = <&tlmm 49 GPIO_ACTIVE_LOW>;
|
||||
panic-indicator;
|
||||
};
|
||||
|
||||
led-1 {
|
||||
/* WAN left */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_WAN;
|
||||
function-enumerator = <0>;
|
||||
gpios = <&tlmm 46 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-2 {
|
||||
/* WAN right */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_WAN;
|
||||
function-enumerator = <1>;
|
||||
gpios = <&tlmm 30 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-3 {
|
||||
/* port 2 left */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <2>;
|
||||
gpios = <&tlmm 23 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-4 {
|
||||
/* port 2 right */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <3>;
|
||||
gpios = <&tlmm 22 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-5 {
|
||||
/* port 3 left */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <4>;
|
||||
gpios = <&tlmm 25 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-6 {
|
||||
/* port 3 right */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <5>;
|
||||
gpios = <&tlmm 24 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-7 {
|
||||
/* port 4 left */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <6>;
|
||||
gpios = <&tlmm 29 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-8 {
|
||||
/* port 4 right */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <7>;
|
||||
gpios = <&tlmm 26 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-9 {
|
||||
/* port 5 left */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <8>;
|
||||
gpios = <&tlmm 33 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-10 {
|
||||
/* port 5 right */
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <9>;
|
||||
gpios = <&tlmm 32 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio_export {
|
||||
compatible = "gpio-export";
|
||||
|
||||
lte_en {
|
||||
gpio-export,name = "lte_en";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
lte_rst {
|
||||
gpio-export,name = "lte_rst";
|
||||
gpio-export,output = <0>;
|
||||
gpios = <&tlmm 41 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
ble_rst {
|
||||
gpio-export,name = "ble_rst";
|
||||
gpio-export,output = <0>;
|
||||
gpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
pse_det {
|
||||
gpio-export,name = "pse_det";
|
||||
gpio-export,input = <0>;
|
||||
gpios = <&tlmm 43 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
ble_load {
|
||||
gpio-export,name = "ble_load";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 52 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
lte_estop {
|
||||
gpio-export,name = "lte_estop";
|
||||
gpio-export,output = <0>;
|
||||
gpios = <&tlmm 61 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&usb2_hs_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_hs_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_ss_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport1 {
|
||||
label = "wan";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport2 {
|
||||
label = "lan2";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport3 {
|
||||
label = "lan3";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport4 {
|
||||
label = "lan4";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&swport5 {
|
||||
label = "lan5";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wifi0 {
|
||||
status = "okay";
|
||||
qcom,ath10k-calibration-variant = "Meraki-Z3";
|
||||
};
|
||||
|
||||
&wifi1 {
|
||||
status = "okay";
|
||||
qcom,ath10k-calibration-variant = "Meraki-Z3";
|
||||
};
|
||||
@@ -885,6 +885,14 @@ define Device/meraki_gx20
|
||||
endef
|
||||
TARGET_DEVICES += meraki_gx20
|
||||
|
||||
define Device/meraki_z3c
|
||||
$(call Device/meraki_common)
|
||||
DEVICE_MODEL := Z3C
|
||||
DEVICE_DTS_CONFIG := config@3
|
||||
DEVICE_PACKAGES := kmod-usb-acm kmod-usb-net kmod-usb-net-cdc-ether -ath10k-firmware-qca9887-ct
|
||||
endef
|
||||
TARGET_DEVICES += meraki_z3c
|
||||
|
||||
define Device/mobipromo_cm520-79f
|
||||
$(call Device/FitzImage)
|
||||
$(call Device/UbiFit)
|
||||
|
||||
@@ -433,7 +433,6 @@ CONFIG_IRQ_MSI_LIB=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
# CONFIG_ISDN is not set
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_KCMP=y
|
||||
|
||||
@@ -36,7 +36,7 @@ Signed-off-by: Bhaskar Upadhaya <Bhaskar.Upadhaya@nxp.com>
|
||||
case PHY_INTERFACE_MODE_QUSGMII:
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -250,6 +250,7 @@ static int phylink_interface_max_speed(p
|
||||
@@ -266,6 +266,7 @@ static int phylink_interface_max_speed(p
|
||||
case PHY_INTERFACE_MODE_GMII:
|
||||
return SPEED_1000;
|
||||
|
||||
@@ -44,7 +44,7 @@ Signed-off-by: Bhaskar Upadhaya <Bhaskar.Upadhaya@nxp.com>
|
||||
case PHY_INTERFACE_MODE_2500BASEX:
|
||||
case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
return SPEED_2500;
|
||||
@@ -564,6 +565,7 @@ static unsigned long phylink_get_capabil
|
||||
@@ -580,6 +581,7 @@ static unsigned long phylink_get_capabil
|
||||
break;
|
||||
|
||||
case PHY_INTERFACE_MODE_2500BASEX:
|
||||
|
||||
@@ -376,7 +376,6 @@ CONFIG_IRQ_WORK=y
|
||||
# CONFIG_ISCSI_IBFT is not set
|
||||
CONFIG_ISO9660_FS=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KCMP=y
|
||||
CONFIG_KERNEL_GZIP=y
|
||||
|
||||
@@ -247,7 +247,6 @@ CONFIG_IRQ_MSI_LIB=y
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LEDS_PWM=y
|
||||
CONFIG_LEDS_SMARTRG_LED=y
|
||||
CONFIG_LEDS_TRIGGER_PATTERN=y
|
||||
|
||||
@@ -1479,7 +1479,7 @@ define Device/cudy_wr3000p-v1
|
||||
IMAGE_SIZE := 65536k
|
||||
KERNEL_IN_UBI := 1
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware automount
|
||||
endef
|
||||
TARGET_DEVICES += cudy_wr3000p-v1
|
||||
|
||||
@@ -1489,7 +1489,7 @@ define Device/cudy_wr3000p-v1-ubootmod
|
||||
DEVICE_VARIANT := v1 (OpenWrt U-Boot layout)
|
||||
DEVICE_DTS := mt7981b-cudy-wr3000p-v1-ubootmod
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware automount
|
||||
UBINIZE_OPTS := -E 5
|
||||
BLOCKSIZE := 128k
|
||||
PAGESIZE := 2048
|
||||
|
||||
@@ -240,7 +240,6 @@ CONFIG_IRQ_MSI_LIB=y
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LEDS_SMARTRG_LED=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
|
||||
@@ -37,101 +37,7 @@ Saddly for that part we have absolutely NO documentation currently.
|
||||
There is this special thing where PHY needs to be calibrated with values
|
||||
from the switch efuse. (the thing have a whole cpu timer and MCU)
|
||||
|
||||
Changes v11:
|
||||
- Address reviews from Christophe (spell mistake + dev_err_probe)
|
||||
- Fix kconfig dependency for MFD driver (depends on MDIO_DEVICE instead of MDIO)
|
||||
(indirectly fix link error for mdio APIs)
|
||||
- Fix copy-paste error for MFD driver of_table
|
||||
- Fix compilation error for PHY (move NVMEM to .config)
|
||||
- Drop unneeded NVMEM node from MDIO example schema (from Andrew)
|
||||
- Adapt MFD example schema to MDIO reg property restrictions
|
||||
Changes v10:
|
||||
- Entire rework to MFD + split to MDIO, EFUSE, SWITCH separate drivers
|
||||
- Drop EEE OPs (while Russell finish RFC for EEE changes)
|
||||
- Use new pcs_inpand OPs
|
||||
- Drop AN restart function and move to pcs_config
|
||||
- Enable assisted_learning and disable CPU learn (preparation for fdb_isolation)
|
||||
- Move EFUSE read in Internal PHY driver to .config to handle EPROBE_DEFER
|
||||
(needed now that NVMEM driver is register externally instead of internally to switch
|
||||
node)
|
||||
Changes v9:
|
||||
- Error out on using 5G speed as currently not supported
|
||||
- Add missing MAC_2500FD in phylink mac_capabilities
|
||||
- Add comment and improve if condition for an8855_phylink_mac_config
|
||||
Changes v8:
|
||||
- Add port Fast Age support
|
||||
- Add support for Port Isolation
|
||||
- Use correct register for Learning Disable
|
||||
- Add support for Ageing Time OP
|
||||
- Set default PVID to 0 by default
|
||||
- Add mdb OPs
|
||||
- Add port change MTU
|
||||
- Fix support for Upper VLAN
|
||||
Changes v7:
|
||||
- Fix devm_dsa_register_switch wrong export symbol
|
||||
Changes v6:
|
||||
- Drop standard MIB and handle with ethtool OPs (as requested by Jakub)
|
||||
- Cosmetic: use bool instead of 0 or 1
|
||||
Changes v5:
|
||||
- Add devm_dsa_register_switch() patch
|
||||
- Add Reviewed-by tag for DT patch
|
||||
Changes v4:
|
||||
- Set regmap readable_table static (mute compilation warning)
|
||||
- Add support for port_bridge flags (LEARNING, FLOOD)
|
||||
- Reset fdb struct in fdb_dump
|
||||
- Drop support_asym_pause in port_enable
|
||||
- Add define for get_phy_flags
|
||||
- Fix bug for port not inititially part of a bridge
|
||||
(in an8855_setup the port matrix was always cleared but
|
||||
the CPU port was never initially added)
|
||||
- Disable learning and flood for user port by default
|
||||
- Set CPU port to flood and learning by default
|
||||
- Correctly AND force duplex and flow control in an8855_phylink_mac_link_up
|
||||
- Drop RGMII from pcs_config
|
||||
- Check ret in "Disable AN if not in autoneg"
|
||||
- Use devm_mutex_init
|
||||
- Fix typo for AN8855_PORT_CHECK_MODE
|
||||
- Better define AN8855_STP_LISTENING = AN8855_STP_BLOCKING
|
||||
- Fix typo in AN8855_PHY_EN_DOWN_SHIFT
|
||||
- Use paged helper for PHY
|
||||
- Skip calibration in config_init if priv not defined
|
||||
Changes v3:
|
||||
- Out of RFC
|
||||
- Switch PHY code to select_page API
|
||||
- Better describe masks and bits in PHY driver for ADC register
|
||||
- Drop raw values and use define for mii read/write
|
||||
- Switch to absolute PHY address
|
||||
- Replace raw values with mask and bits for pcs_config
|
||||
- Fix typo for ext-surge property name
|
||||
- Drop support for relocating Switch base PHY address on the bus
|
||||
Changes v2:
|
||||
- Drop mutex guard patch
|
||||
- Drop guard usage in DSA driver
|
||||
- Use __mdiobus_write/read
|
||||
- Check return condition and return errors for mii read/write
|
||||
- Fix wrong logic for EEE
|
||||
- Fix link_down (don't force link down with autoneg)
|
||||
- Fix forcing speed on sgmii autoneg
|
||||
- Better document link speed for sgmii reg
|
||||
- Use standard define for sgmii reg
|
||||
- Imlement nvmem support to expose switch EFUSE
|
||||
- Rework PHY calibration with the use of NVMEM producer/consumer
|
||||
- Update DT with new NVMEM property
|
||||
- Move aneg validation for 2500-basex in pcs_config
|
||||
- Move r50Ohm table and function to PHY driver
|
||||
|
||||
Christian Marangi (9):
|
||||
dt-bindings: nvmem: Document support for Airoha AN8855 Switch EFUSE
|
||||
dt-bindings: net: Document support for Airoha AN8855 Switch Virtual
|
||||
MDIO
|
||||
dt-bindings: net: dsa: Document support for Airoha AN8855 DSA Switch
|
||||
dt-bindings: mfd: Document support for Airoha AN8855 Switch SoC
|
||||
mfd: an8855: Add support for Airoha AN8855 Switch MFD
|
||||
net: mdio: Add Airoha AN8855 Switch MDIO Passtrough
|
||||
nvmem: an8855: Add support for Airoha AN8855 Switch EFUSE
|
||||
net: dsa: Add Airoha AN8855 5-Port Gigabit DSA Switch driver
|
||||
net: phy: Add Airoha AN8855 Internal Switch Gigabit PHY
|
||||
|
||||
---
|
||||
.../bindings/mfd/airoha,an8855-mfd.yaml | 178 ++
|
||||
.../bindings/net/airoha,an8855-mdio.yaml | 56 +
|
||||
.../net/dsa/airoha,an8855-switch.yaml | 105 +
|
||||
@@ -274,3 +180,14 @@ Christian Marangi (9):
|
||||
obj-$(CONFIG_AIR_EN8811H_PHY) += air_en8811h.o
|
||||
obj-$(CONFIG_AMD_PHY) += amd.o
|
||||
obj-$(CONFIG_AMCC_QT2025_PHY) += qt2025.o
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -31,7 +31,7 @@ source "drivers/nvmem/layouts/Kconfig"
|
||||
|
||||
config NVMEM_AN8855_EFUSE
|
||||
tristate "Airoha AN8855 eFuse support"
|
||||
- depends on COMPILE_TEST
|
||||
+ depends on MFD_AIROHA_AN8855 || COMPILE_TEST
|
||||
help
|
||||
Say y here to enable support for reading eFuses on Airoha AN8855
|
||||
Switch. These are e.g. used to store factory programmed
|
||||
|
||||
@@ -149,7 +149,6 @@ CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MSI_IOMMU=y
|
||||
CONFIG_IRQ_MSI_LIB=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
|
||||
@@ -10,6 +10,7 @@ FEATURES:=fpu usb pci pcie gpio nand squashfs ramdisk boot-part rootfs-part lega
|
||||
SUBTARGETS:=cortexa9 cortexa53 cortexa72
|
||||
|
||||
KERNEL_PATCHVER:=6.12
|
||||
KERNEL_TESTING_PATCHVER:=6.18
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
|
||||
@@ -0,0 +1,453 @@
|
||||
CONFIG_AHCI_MVEBU=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_MVEBU=y
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_STACKWALK=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USES_CFI_GENERIC_LLVM_PASS=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARMADA_370_CLK=y
|
||||
CONFIG_ARMADA_370_XP_IRQ=y
|
||||
CONFIG_ARMADA_370_XP_TIMER=y
|
||||
# CONFIG_ARMADA_37XX_WATCHDOG is not set
|
||||
CONFIG_ARMADA_38X_CLK=y
|
||||
CONFIG_ARMADA_THERMAL=y
|
||||
CONFIG_ARMADA_XP_CLK=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
# CONFIG_ARM_ARMADA_37XX_CPUFREQ is not set
|
||||
# CONFIG_ARM_ARMADA_8K_CPUFREQ is not set
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER is not set
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
CONFIG_ARM_ERRATA_720789=y
|
||||
CONFIG_ARM_ERRATA_764369=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_GLOBAL_TIMER=y
|
||||
CONFIG_ARM_GT_INITIAL_PRESCALER_VAL=1
|
||||
CONFIG_ARM_HAS_GROUP_RELOCS=y
|
||||
CONFIG_ARM_HEAVY_MB=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_ARM_MVEBU_V7_CPUIDLE=y
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_ATA_LEDS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_NVME=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_BUFFER_HEAD=y
|
||||
# CONFIG_CACHE_FEROCEON_L2 is not set
|
||||
CONFIG_CACHE_L2X0=y
|
||||
CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y
|
||||
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CONTEXT_TRACKING=y
|
||||
CONFIG_CONTEXT_TRACKING_IDLE=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_CPUFREQ_DT_PLATDEV=y
|
||||
# CONFIG_CPUFREQ_VIRT is not set
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_CPU_MITIGATIONS=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PJ4B=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SPECTRE=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_CPU_THUMB_CAPABLE=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRC32_ARCH=y
|
||||
CONFIG_CRYPTO_AES_ARM=y
|
||||
CONFIG_CRYPTO_AES_ARM_BS=y
|
||||
CONFIG_CRYPTO_AUTHENC=y
|
||||
CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_CRC32=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_CRYPTD=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_DEV_MARVELL=y
|
||||
CONFIG_CRYPTO_DEV_MARVELL_CESA=y
|
||||
CONFIG_CRYPTO_ECB=y
|
||||
CONFIG_CRYPTO_ESSIV=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_HW=y
|
||||
CONFIG_CRYPTO_LIB_BLAKE2S_ARCH=y
|
||||
CONFIG_CRYPTO_LIB_DES=y
|
||||
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||
CONFIG_CRYPTO_LIB_SHA1_ARCH=y
|
||||
CONFIG_CRYPTO_LIB_SHA256_ARCH=y
|
||||
CONFIG_CRYPTO_LIB_UTILS=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_CURRENT_POINTER_IN_TPIDRURO=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_ALIGN_RODATA=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
|
||||
CONFIG_DEBUG_MVEBU_UART0=y
|
||||
# CONFIG_DEBUG_MVEBU_UART0_ALTERNATE is not set
|
||||
# CONFIG_DEBUG_MVEBU_UART1_ALTERNATE is not set
|
||||
CONFIG_DEBUG_UART_8250=y
|
||||
CONFIG_DEBUG_UART_8250_SHIFT=2
|
||||
CONFIG_DEBUG_UART_PHYS=0xd0012000
|
||||
CONFIG_DEBUG_UART_VIRT=0xfec12000
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_ENGINE_RAID=y
|
||||
CONFIG_DMA_NEED_SYNC=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_OPS_HELPERS=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_F2FS_FS=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FS_IOMAP=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FUNCTION_ALIGNMENT=0
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_FW_LOADER_SYSFS=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_ARCH_TOPOLOGY=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_CPU_DEVICES=y
|
||||
CONFIG_GENERIC_CPU_VULNERABILITIES=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_MIGRATION=y
|
||||
CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GLOB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||
CONFIG_GPIO_MVEBU=y
|
||||
CONFIG_GPIO_PCA953X=y
|
||||
CONFIG_GPIO_PCA953X_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_HIGHPTE=y
|
||||
CONFIG_HOTPLUG_CORE_SYNC=y
|
||||
CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_HWBM=y
|
||||
CONFIG_HWMON=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_MV64XXX=y
|
||||
# CONFIG_I2C_PXA is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQSTACKS=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MSI_LIB=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_KMAP_LOCAL=y
|
||||
CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_PCA963X=y
|
||||
CONFIG_LEDS_TLC591XX=y
|
||||
CONFIG_LEDS_TRIGGER_DISK=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MACH_ARMADA_370=y
|
||||
# CONFIG_MACH_ARMADA_375 is not set
|
||||
CONFIG_MACH_ARMADA_38X=y
|
||||
# CONFIG_MACH_ARMADA_39X is not set
|
||||
CONFIG_MACH_ARMADA_XP=y
|
||||
# CONFIG_MACH_DOVE is not set
|
||||
CONFIG_MACH_MVEBU_ANY=y
|
||||
CONFIG_MACH_MVEBU_V7=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MANGLE_BOOTARGS=y
|
||||
CONFIG_MARVELL_PHY=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_I2C=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_MVSDIO=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_PXAV3=y
|
||||
CONFIG_MMU_LAZY_TLB_REFCOUNT=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||
CONFIG_MTD_NAND_MARVELL=y
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_MVEBU_CLK_COMMON=y
|
||||
CONFIG_MVEBU_CLK_COREDIV=y
|
||||
CONFIG_MVEBU_CLK_CPU=y
|
||||
CONFIG_MVEBU_DEVBUS=y
|
||||
CONFIG_MVEBU_MBUS=y
|
||||
CONFIG_MVMDIO=y
|
||||
CONFIG_MVNETA=y
|
||||
CONFIG_MVNETA_BM=y
|
||||
CONFIG_MVNETA_BM_ENABLE=y
|
||||
# CONFIG_MVPP2 is not set
|
||||
CONFIG_MV_XOR=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_SRCU_NMI_SAFE=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET_EGRESS=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_INGRESS=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_XGRESS=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NOP_USB_XCEIV=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_LAYOUTS=y
|
||||
CONFIG_NVME_CORE=y
|
||||
# CONFIG_NVME_HWMON is not set
|
||||
# CONFIG_NVME_MULTIPATH is not set
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_ORION_WATCHDOG=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_BLOCK_MAX_ORDER=11
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PAGE_POOL=y
|
||||
CONFIG_PAGE_POOL_STATS=y
|
||||
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
|
||||
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_BRIDGE_EMUL=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MVEBU=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PER_VMA_LOCK=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLIB_LEDS=y
|
||||
CONFIG_PHYLINK=y
|
||||
# CONFIG_PHY_MVEBU_A3700_COMPHY is not set
|
||||
# CONFIG_PHY_MVEBU_A3700_UTMI is not set
|
||||
# CONFIG_PHY_MVEBU_A38X_COMPHY is not set
|
||||
# CONFIG_PHY_MVEBU_CP110_COMPHY is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ARMADA_370=y
|
||||
CONFIG_PINCTRL_ARMADA_38X=y
|
||||
CONFIG_PINCTRL_ARMADA_XP=y
|
||||
CONFIG_PINCTRL_MVEBU=y
|
||||
# CONFIG_PINCTRL_SINGLE is not set
|
||||
CONFIG_PJ4B_ERRATA_4742=y
|
||||
CONFIG_PL310_ERRATA_753970=y
|
||||
CONFIG_PLAT_ORION=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_GPIO=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_RANDSTRUCT_NONE=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_I2C=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_ARMADA38X=y
|
||||
# CONFIG_RTC_DRV_MV is not set
|
||||
CONFIG_RTC_I2C_AND_SPI=y
|
||||
CONFIG_RTC_MC146818_LIB=y
|
||||
CONFIG_RUSTC_HAS_COERCE_POINTEE=y
|
||||
CONFIG_RUSTC_HAS_FILE_AS_C_STR=y
|
||||
CONFIG_RUSTC_HAS_FILE_WITH_NUL=y
|
||||
CONFIG_RUSTC_HAS_SPAN_FILE=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_SATA_AHCI_PLATFORM=y
|
||||
CONFIG_SATA_HOST=y
|
||||
CONFIG_SATA_MV=y
|
||||
CONFIG_SATA_PMP=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_COMMON=y
|
||||
CONFIG_SENSORS_PWM_FAN=y
|
||||
CONFIG_SENSORS_TMP421=y
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
CONFIG_SERIAL_8250_DWLIB=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_MVEBU_CONSOLE=y
|
||||
CONFIG_SERIAL_MVEBU_UART=y
|
||||
CONFIG_SFP=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SOC_BUS=y
|
||||
CONFIG_SOFTIRQ_ON_OWN_STACK=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
# CONFIG_SPI_ARMADA_3700 is not set
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_ORION=y
|
||||
CONFIG_SPLIT_PTE_PTLOCKS=y
|
||||
CONFIG_SRAM=y
|
||||
CONFIG_SRAM_EXEC=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_HWMON=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_THREAD_INFO_IN_TASK=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_UNWINDER_ARM=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD_ORION=y
|
||||
CONFIG_USB_EHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_LEDS_TRIGGER_USBPORT=y
|
||||
CONFIG_USB_PHY=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_MVEBU=y
|
||||
CONFIG_USB_XHCI_PLATFORM=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMMON=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
||||
@@ -0,0 +1,102 @@
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y
|
||||
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
|
||||
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||
# CONFIG_ARCH_LAN969X is not set
|
||||
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||
CONFIG_ARCH_PROC_KCORE_TEXT=y
|
||||
CONFIG_ARCH_STACKWALK=y
|
||||
CONFIG_ARCH_WANTS_NO_INSTR=y
|
||||
CONFIG_ARCH_WANTS_THP_SWAP=y
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
# CONFIG_ARM64_GCS is not set
|
||||
CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
|
||||
CONFIG_ARM64_PAGE_SHIFT=12
|
||||
CONFIG_ARM64_PA_BITS=48
|
||||
CONFIG_ARM64_PA_BITS_48=y
|
||||
CONFIG_ARM64_PLATFORM_DEVICES=y
|
||||
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
CONFIG_ARMADA_37XX_CLK=y
|
||||
CONFIG_ARMADA_37XX_RWTM_MBOX=y
|
||||
CONFIG_ARMADA_37XX_WATCHDOG=y
|
||||
CONFIG_ARMADA_AP806_SYSCON=y
|
||||
CONFIG_ARMADA_AP_CP_HELPER=y
|
||||
CONFIG_ARMADA_CP110_SYSCON=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set
|
||||
CONFIG_ARM_ARMADA_37XX_CPUFREQ=y
|
||||
CONFIG_ARM_GIC_V2M=y
|
||||
CONFIG_ARM_GIC_V3=y
|
||||
CONFIG_ARM_GIC_V3_ITS=y
|
||||
CONFIG_ARM_GIC_V3_ITS_PCI=y
|
||||
# CONFIG_ARM_MHU_V2 is not set
|
||||
# CONFIG_ARM_MHU_V3 is not set
|
||||
# CONFIG_ARM_PL172_MPMC is not set
|
||||
CONFIG_ARM_PSCI_FW=y
|
||||
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||
CONFIG_CC_HAVE_SHADOW_CALL_STACK=y
|
||||
CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_DMA_DIRECT_REMAP=y
|
||||
CONFIG_F2FS_FS_COMPRESSION=y
|
||||
# CONFIG_F2FS_FS_LZ4 is not set
|
||||
# CONFIG_F2FS_FS_LZO is not set
|
||||
CONFIG_F2FS_FS_ZSTD=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
|
||||
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_IOREMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GPIO_MOXTET=y
|
||||
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MMC_SDHCI_XENON=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
CONFIG_MOXTET=y
|
||||
CONFIG_MVEBU_GICP=y
|
||||
CONFIG_MVEBU_ICU=y
|
||||
CONFIG_MVEBU_ODMI=y
|
||||
CONFIG_MVEBU_PIC=y
|
||||
CONFIG_MVEBU_SEI=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_PARTITION_PERCPU=y
|
||||
# CONFIG_PCIE_AMD_MDB is not set
|
||||
CONFIG_PCI_AARDVARK=y
|
||||
CONFIG_PGTABLE_LEVELS=3
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_PHY_MVEBU_A3700_COMPHY=y
|
||||
CONFIG_PHY_MVEBU_A3700_UTMI=y
|
||||
CONFIG_PINCTRL_AC5=y
|
||||
CONFIG_PINCTRL_ARMADA_37XX=y
|
||||
CONFIG_PINCTRL_ARMADA_AP806=y
|
||||
CONFIG_PINCTRL_ARMADA_CP110=y
|
||||
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SPI_ARMADA_3700=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_THREAD_INFO_IN_TASK=y
|
||||
CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
|
||||
CONFIG_TURRIS_MOX_RWTM=y
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_VMAP_STACK=y
|
||||
CONFIG_ZONE_DMA32=y
|
||||
@@ -0,0 +1,129 @@
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_AQUANTIA_PHY=y
|
||||
CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y
|
||||
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
|
||||
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||
# CONFIG_ARCH_LAN969X is not set
|
||||
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||
CONFIG_ARCH_PROC_KCORE_TEXT=y
|
||||
CONFIG_ARCH_STACKWALK=y
|
||||
CONFIG_ARCH_WANTS_NO_INSTR=y
|
||||
CONFIG_ARCH_WANTS_THP_SWAP=y
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
# CONFIG_ARM64_GCS is not set
|
||||
CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
|
||||
CONFIG_ARM64_PAGE_SHIFT=12
|
||||
CONFIG_ARM64_PA_BITS=48
|
||||
CONFIG_ARM64_PA_BITS_48=y
|
||||
CONFIG_ARM64_PLATFORM_DEVICES=y
|
||||
CONFIG_ARM64_SVE=y
|
||||
# CONFIG_ARM64_TAGGED_ADDR_ABI is not set
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
CONFIG_ARMADA_37XX_CLK=y
|
||||
CONFIG_ARMADA_AP806_SYSCON=y
|
||||
CONFIG_ARMADA_AP_CPU_CLK=y
|
||||
CONFIG_ARMADA_AP_CP_HELPER=y
|
||||
CONFIG_ARMADA_CP110_SYSCON=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set
|
||||
CONFIG_ARM_ARMADA_8K_CPUFREQ=y
|
||||
CONFIG_ARM_GIC_V2M=y
|
||||
CONFIG_ARM_GIC_V3=y
|
||||
CONFIG_ARM_GIC_V3_ITS=y
|
||||
CONFIG_ARM_GIC_V3_ITS_PCI=y
|
||||
# CONFIG_ARM_PL172_MPMC is not set
|
||||
CONFIG_ARM_PSCI_FW=y
|
||||
CONFIG_ARM_SBSA_WATCHDOG=y
|
||||
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||
CONFIG_CC_HAVE_SHADOW_CALL_STACK=y
|
||||
CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
|
||||
CONFIG_CMDLINE_PARTITION=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_CRC_CCITT=y
|
||||
CONFIG_DMA_DIRECT_REMAP=y
|
||||
CONFIG_EEPROM_AT24=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
|
||||
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_IOREMAP=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_HW_RANDOM_OMAP=y
|
||||
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
CONFIG_LEDS_IEI_WT61P803_PUZZLE=y
|
||||
CONFIG_LEDS_IS31FL319X=y
|
||||
CONFIG_MARVELL_10G_PHY=y
|
||||
CONFIG_MFD_CORE=y
|
||||
CONFIG_MFD_IEI_WT61P803_PUZZLE=y
|
||||
# CONFIG_MFD_QNAP_MCU is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
# CONFIG_MHZ19B is not set
|
||||
CONFIG_MIKROTIK=y
|
||||
CONFIG_MIKROTIK_RB_SYSFS=y
|
||||
# CONFIG_MIKROTIK_WLAN_DECOMPRESS_LZ77 is not set
|
||||
CONFIG_MMC_SDHCI_XENON=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
CONFIG_MTD_ROUTERBOOT_PARTS=y
|
||||
CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
|
||||
CONFIG_MVEBU_GICP=y
|
||||
CONFIG_MVEBU_ICU=y
|
||||
CONFIG_MVEBU_ODMI=y
|
||||
CONFIG_MVEBU_PIC=y
|
||||
CONFIG_MVEBU_SEI=y
|
||||
CONFIG_MVPP2=y
|
||||
CONFIG_MV_XOR_V2=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_NVMEM_LAYOUTS=y
|
||||
CONFIG_NVMEM_LAYOUT_MIKROTIK=y
|
||||
CONFIG_NVMEM_LAYOUT_ONIE_TLV=y
|
||||
CONFIG_NVMEM_LAYOUT_U_BOOT_ENV=y
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_PARTITION_PERCPU=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
# CONFIG_PCIE_AMD_MDB is not set
|
||||
CONFIG_PCIE_ARMADA_8K=y
|
||||
CONFIG_PCIE_DW=y
|
||||
# CONFIG_PCIE_DW_DEBUGFS is not set
|
||||
CONFIG_PCIE_DW_HOST=y
|
||||
# CONFIG_PCI_AARDVARK is not set
|
||||
CONFIG_PGTABLE_LEVELS=3
|
||||
CONFIG_PHYLIB_LEDS=y
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_PHY_MVEBU_CP110_COMPHY=y
|
||||
CONFIG_PHY_MVEBU_CP110_UTMI=y
|
||||
CONFIG_PINCTRL_AC5=y
|
||||
CONFIG_PINCTRL_ARMADA_37XX=y
|
||||
CONFIG_PINCTRL_ARMADA_AP806=y
|
||||
CONFIG_PINCTRL_ARMADA_CP110=y
|
||||
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_QCA808X_PHY=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
CONFIG_RAS=y
|
||||
# CONFIG_RAVE_SP_CORE is not set
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_USERSPACE_CONSUMER=y
|
||||
# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set
|
||||
CONFIG_SENSORS_IEI_WT61P803_PUZZLE_HWMON=y
|
||||
CONFIG_SERIAL_DEV_BUS=y
|
||||
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_THREAD_INFO_IN_TASK=y
|
||||
CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_VMAP_STACK=y
|
||||
CONFIG_ZONE_DMA32=y
|
||||
@@ -0,0 +1,12 @@
|
||||
CONFIG_ARM_HAS_GROUP_RELOCS=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_CURRENT_POINTER_IN_TPIDRURO=y
|
||||
CONFIG_IRQSTACKS=y
|
||||
CONFIG_LED_TRIGGER_PHY=y
|
||||
CONFIG_MTD_SPLIT_SEIL_FW=y
|
||||
CONFIG_MTD_SPLIT_UIMAGE_FW=y
|
||||
CONFIG_MTD_VIRT_CONCAT=y
|
||||
CONFIG_PHY_MVEBU_A38X_COMPHY=y
|
||||
CONFIG_POWER_RESET_QNAP=y
|
||||
CONFIG_RTC_DRV_MV=y
|
||||
CONFIG_THREAD_INFO_IN_TASK=y
|
||||
@@ -294,6 +294,7 @@ define Device/linksys_wrt1900ac-v1
|
||||
DEVICE_PACKAGES += mwlwifi-firmware-88w8864 kmod-dsa-mv88e6xxx
|
||||
KERNEL_SIZE := 4096k
|
||||
SUPPORTED_DEVICES += armada-xp-linksys-mamba linksys,mamba
|
||||
DEFAULT := n
|
||||
endef
|
||||
TARGET_DEVICES += linksys_wrt1900ac-v1
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ $(eval $(call KernelPackage,turris-omnia-mcu))
|
||||
define KernelPackage/leds-turris-omnia
|
||||
SUBMENU:=$(LEDS_MENU)
|
||||
TITLE:=LED support for CZ.NIC's Turris Omnia
|
||||
DEPENDS:=@TARGET_mvebu_cortexa9
|
||||
DEPENDS:=@TARGET_mvebu_cortexa9 kmod-turris-omnia-mcu
|
||||
KCONFIG:=CONFIG_LEDS_TURRIS_OMNIA
|
||||
FILES:=$(LINUX_DIR)/drivers/leds/leds-turris-omnia.ko
|
||||
AUTOLOAD:=$(call AutoLoad,60,leds-turris-omnia,1)
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
Subject: [PATCH v2] PCI: aardvark: Implement workaround for PCIe Completion Timeout
|
||||
Date: Tue, 2 Aug 2022 14:38:16 +0200
|
||||
Message-Id: <20220802123816.21817-1-pali@kernel.org>
|
||||
X-Mailer: git-send-email 2.20.1
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Precedence: bulk
|
||||
List-ID: <linux-pci.vger.kernel.org>
|
||||
X-Mailing-List: linux-pci@vger.kernel.org
|
||||
|
||||
Marvell Armada 3700 Functional Errata, Guidelines, and Restrictions
|
||||
document describes in erratum 3.12 PCIe Completion Timeout (Ref #: 251),
|
||||
that PCIe IP does not support a strong-ordered model for inbound posted vs.
|
||||
outbound completion.
|
||||
|
||||
As a workaround for this erratum, DIS_ORD_CHK flag in Debug Mux Control
|
||||
register must be set. It disables the ordering check in the core between
|
||||
Completions and Posted requests received from the link.
|
||||
|
||||
Marvell also suggests to do full memory barrier at the beginning of
|
||||
aardvark summary interrupt handler before calling interrupt handlers of
|
||||
endpoint drivers in order to minimize the risk for the race condition
|
||||
documented in the Erratum between the DMA done status reading and the
|
||||
completion of writing to the host memory.
|
||||
|
||||
More details about this issue and suggested workarounds are in discussion:
|
||||
https://lore.kernel.org/linux-pci/BN9PR18MB425154FE5019DCAF2028A1D5DB8D9@BN9PR18MB4251.namprd18.prod.outlook.com/t/#u
|
||||
|
||||
It was reported that enabling this workaround fixes instability issues and
|
||||
"Unhandled fault" errors when using 60 GHz WiFi 802.11ad card with Qualcomm
|
||||
QCA6335 chip under significant load which were caused by interrupt status
|
||||
stuck in the outbound CMPLT queue traced back to this erratum.
|
||||
|
||||
This workaround fixes also kernel panic triggered after some minutes of
|
||||
usage 5 GHz WiFi 802.11ax card with Mediatek MT7915 chip:
|
||||
|
||||
Internal error: synchronous external abort: 96000210 [#1] SMP
|
||||
Kernel panic - not syncing: Fatal exception in interrupt
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
Signed-off-by: Pali Rohár <pali@kernel.org>
|
||||
Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
drivers/pci/controller/pci-aardvark.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/pci/controller/pci-aardvark.c
|
||||
+++ b/drivers/pci/controller/pci-aardvark.c
|
||||
@@ -212,6 +212,8 @@ enum {
|
||||
};
|
||||
|
||||
#define VENDOR_ID_REG (LMI_BASE_ADDR + 0x44)
|
||||
+#define DEBUG_MUX_CTRL_REG (LMI_BASE_ADDR + 0x208)
|
||||
+#define DIS_ORD_CHK BIT(30)
|
||||
|
||||
/* PCIe core controller registers */
|
||||
#define CTRL_CORE_BASE_ADDR 0x18000
|
||||
@@ -559,6 +561,11 @@ static void advk_pcie_setup_hw(struct ad
|
||||
PCIE_CORE_CTRL2_TD_ENABLE;
|
||||
advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG);
|
||||
|
||||
+ /* Disable ordering checks, workaround for erratum 3.12 "PCIe completion timeout" */
|
||||
+ reg = advk_readl(pcie, DEBUG_MUX_CTRL_REG);
|
||||
+ reg |= DIS_ORD_CHK;
|
||||
+ advk_writel(pcie, reg, DEBUG_MUX_CTRL_REG);
|
||||
+
|
||||
/* Set lane X1 */
|
||||
reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
|
||||
reg &= ~LANE_CNT_MSK;
|
||||
@@ -1637,6 +1644,9 @@ static irqreturn_t advk_pcie_irq_handler
|
||||
struct advk_pcie *pcie = arg;
|
||||
u32 status;
|
||||
|
||||
+ /* Full memory barrier (ARM dsb sy), workaround for erratum 3.12 "PCIe completion timeout" */
|
||||
+ mb();
|
||||
+
|
||||
status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
|
||||
if (!(status & PCIE_IRQ_CORE_INT))
|
||||
return IRQ_NONE;
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
--- a/drivers/power/reset/linkstation-poweroff.c
|
||||
+++ b/drivers/power/reset/linkstation-poweroff.c
|
||||
@@ -142,6 +142,12 @@ static void linkstation_poweroff(void)
|
||||
}
|
||||
|
||||
static const struct of_device_id ls_poweroff_of_match[] = {
|
||||
+ { .compatible = "buffalo,ls220d",
|
||||
+ .data = &linkstation_power_off_cfg,
|
||||
+ },
|
||||
+ { .compatible = "buffalo,ls220de",
|
||||
+ .data = &linkstation_power_off_cfg,
|
||||
+ },
|
||||
{ .compatible = "buffalo,ls421d",
|
||||
.data = &linkstation_power_off_cfg,
|
||||
},
|
||||
@@ -0,0 +1,279 @@
|
||||
From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Panella <ianchi74@outlook.com>
|
||||
Date: Thu, 9 Mar 2017 09:37:17 +0100
|
||||
Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments
|
||||
|
||||
The command-line arguments provided by the boot loader will be
|
||||
appended to a new device tree property: bootloader-args.
|
||||
If there is a property "append-rootblock" in DT under /chosen
|
||||
and a root= option in bootloaders command line it will be parsed
|
||||
and added to DT bootargs with the form: <append-rootblock>XX.
|
||||
Only command line ATAG will be processed, the rest of the ATAGs
|
||||
sent by bootloader will be ignored.
|
||||
This is usefull in dual boot systems, to get the current root partition
|
||||
without afecting the rest of the system.
|
||||
|
||||
Signed-off-by: Adrian Panella <ianchi74@outlook.com>
|
||||
|
||||
This patch has been modified to be mvebu specific. The original patch
|
||||
did not pass the bootloader cmdline on if no append-rootblock stanza
|
||||
was found, resulting in blank cmdline and failure to boot.
|
||||
|
||||
Signed-off-by: Michael Gray <michael.gray@lantisproject.com>
|
||||
---
|
||||
arch/arm/Kconfig | 11 ++++
|
||||
arch/arm/boot/compressed/atags_to_fdt.c | 85 ++++++++++++++++++++++++-
|
||||
init/main.c | 16 +++++
|
||||
3 files changed, 111 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -1488,6 +1488,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN
|
||||
The command-line arguments provided by the boot loader will be
|
||||
appended to the the device tree bootargs property.
|
||||
|
||||
+config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
+ bool "Append rootblock parsing bootloader's kernel arguments"
|
||||
+ help
|
||||
+ The command-line arguments provided by the boot loader will be
|
||||
+ appended to a new device tree property: bootloader-args.
|
||||
+ If there is a property "append-rootblock" in DT under /chosen
|
||||
+ and a root= option in bootloaders command line it will be parsed
|
||||
+ and added to DT bootargs with the form: <append-rootblock>XX.
|
||||
+ Only command line ATAG will be processed, the rest of the ATAGs
|
||||
+ sent by bootloader will be ignored.
|
||||
+
|
||||
endchoice
|
||||
|
||||
config CMDLINE
|
||||
--- a/arch/arm/boot/compressed/atags_to_fdt.c
|
||||
+++ b/arch/arm/boot/compressed/atags_to_fdt.c
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND)
|
||||
#define do_extend_cmdline 1
|
||||
+#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+#define do_extend_cmdline 1
|
||||
#else
|
||||
#define do_extend_cmdline 0
|
||||
#endif
|
||||
@@ -21,6 +23,7 @@ static int node_offset(void *fdt, const
|
||||
return offset;
|
||||
}
|
||||
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
static int setprop(void *fdt, const char *node_path, const char *property,
|
||||
void *val_array, int size)
|
||||
{
|
||||
@@ -29,6 +32,7 @@ static int setprop(void *fdt, const char
|
||||
return offset;
|
||||
return fdt_setprop(fdt, offset, property, val_array, size);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int setprop_string(void *fdt, const char *node_path,
|
||||
const char *property, const char *string)
|
||||
@@ -39,6 +43,7 @@ static int setprop_string(void *fdt, con
|
||||
return fdt_setprop_string(fdt, offset, property, string);
|
||||
}
|
||||
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
static int setprop_cell(void *fdt, const char *node_path,
|
||||
const char *property, uint32_t val)
|
||||
{
|
||||
@@ -47,6 +52,7 @@ static int setprop_cell(void *fdt, const
|
||||
return offset;
|
||||
return fdt_setprop_cell(fdt, offset, property, val);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static const void *getprop(const void *fdt, const char *node_path,
|
||||
const char *property, int *len)
|
||||
@@ -59,6 +65,7 @@ static const void *getprop(const void *f
|
||||
return fdt_getprop(fdt, offset, property, len);
|
||||
}
|
||||
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
static uint32_t get_cell_size(const void *fdt)
|
||||
{
|
||||
int len;
|
||||
@@ -70,6 +77,74 @@ static uint32_t get_cell_size(const void
|
||||
return cell_size;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+
|
||||
+static char *append_rootblock(char *dest, const char *str, int len, void *fdt)
|
||||
+{
|
||||
+ const char *ptr, *end;
|
||||
+ const char *root="root=";
|
||||
+ int i, l;
|
||||
+ const char *rootblock;
|
||||
+
|
||||
+ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually
|
||||
+ ptr = str - 1;
|
||||
+
|
||||
+ do {
|
||||
+ //first find an 'r' at the begining or after a space
|
||||
+ do {
|
||||
+ ptr++;
|
||||
+ ptr = strchr(ptr, 'r');
|
||||
+ if (!ptr)
|
||||
+ goto no_append;
|
||||
+
|
||||
+ } while (ptr != str && *(ptr-1) != ' ');
|
||||
+
|
||||
+ //then check for the rest
|
||||
+ for(i = 1; i <= 4; i++)
|
||||
+ if(*(ptr+i) != *(root+i)) break;
|
||||
+
|
||||
+ } while (i != 5);
|
||||
+
|
||||
+ end = strchr(ptr, ' ');
|
||||
+ end = end ? (end - 1) : (strchr(ptr, 0) - 1);
|
||||
+
|
||||
+ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX )
|
||||
+ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++);
|
||||
+ ptr = end + 1;
|
||||
+
|
||||
+ /* if append-rootblock property is set use it to append to command line */
|
||||
+ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l);
|
||||
+ if (rootblock == NULL)
|
||||
+ goto no_append;
|
||||
+
|
||||
+ if (*dest != ' ') {
|
||||
+ *dest = ' ';
|
||||
+ dest++;
|
||||
+ len++;
|
||||
+ }
|
||||
+
|
||||
+ if (len + l + i <= COMMAND_LINE_SIZE) {
|
||||
+ memcpy(dest, rootblock, l);
|
||||
+ dest += l - 1;
|
||||
+ memcpy(dest, ptr, i);
|
||||
+ dest += i;
|
||||
+ }
|
||||
+
|
||||
+ return dest;
|
||||
+
|
||||
+no_append:
|
||||
+ len = strlen(str);
|
||||
+ if (len + 1 < COMMAND_LINE_SIZE) {
|
||||
+ memcpy(dest, str, len);
|
||||
+ dest += len;
|
||||
+ }
|
||||
+
|
||||
+ return dest;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)
|
||||
{
|
||||
char cmdline[COMMAND_LINE_SIZE];
|
||||
@@ -89,18 +164,28 @@ static void merge_fdt_bootargs(void *fdt
|
||||
|
||||
/* and append the ATAG_CMDLINE */
|
||||
if (fdt_cmdline) {
|
||||
+
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+ //save original bootloader args
|
||||
+ //and append ubi.mtd with root partition number to current cmdline
|
||||
+ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline);
|
||||
+ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt);
|
||||
+
|
||||
+#else
|
||||
len = strlen(fdt_cmdline);
|
||||
if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) {
|
||||
*ptr++ = ' ';
|
||||
memcpy(ptr, fdt_cmdline, len);
|
||||
ptr += len;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
*ptr = '\0';
|
||||
|
||||
setprop_string(fdt, "/chosen", "bootargs", cmdline);
|
||||
}
|
||||
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
static void hex_str(char *out, uint32_t value)
|
||||
{
|
||||
uint32_t digit;
|
||||
@@ -118,6 +203,7 @@ static void hex_str(char *out, uint32_t
|
||||
}
|
||||
*out = '\0';
|
||||
}
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Convert and fold provided ATAGs into the provided FDT.
|
||||
@@ -132,9 +218,11 @@ int atags_to_fdt(void *atag_list, void *
|
||||
struct tag *atag = atag_list;
|
||||
/* In the case of 64 bits memory size, need to reserve 2 cells for
|
||||
* address and size for each bank */
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
__be32 mem_reg_property[2 * 2 * NR_BANKS];
|
||||
- int memcount = 0;
|
||||
- int ret, memsize;
|
||||
+ int memsize, memcount = 0;
|
||||
+#endif
|
||||
+ int ret;
|
||||
|
||||
/* make sure we've got an aligned pointer */
|
||||
if ((u32)atag_list & 0x3)
|
||||
@@ -169,7 +257,9 @@ int atags_to_fdt(void *atag_list, void *
|
||||
else
|
||||
setprop_string(fdt, "/chosen", "bootargs",
|
||||
atag->u.cmdline.cmdline);
|
||||
- } else if (atag->hdr.tag == ATAG_MEM) {
|
||||
+ }
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
+ else if (atag->hdr.tag == ATAG_MEM) {
|
||||
if (memcount >= sizeof(mem_reg_property)/4)
|
||||
continue;
|
||||
if (!atag->u.mem.size)
|
||||
@@ -213,6 +303,10 @@ int atags_to_fdt(void *atag_list, void *
|
||||
setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
4 * memcount * memsize);
|
||||
}
|
||||
+#else
|
||||
+
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
return fdt_pack(fdt);
|
||||
}
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -116,6 +116,10 @@
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+#include <linux/of.h>
|
||||
+#endif
|
||||
+
|
||||
static int kernel_init(void *);
|
||||
|
||||
/*
|
||||
@@ -966,6 +970,18 @@ void start_kernel(void)
|
||||
boot_cpu_hotplug_init();
|
||||
|
||||
pr_notice("Kernel command line: %s\n", saved_command_line);
|
||||
+
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+ //Show bootloader's original command line for reference
|
||||
+ if(of_chosen) {
|
||||
+ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL);
|
||||
+ if(prop)
|
||||
+ pr_notice("Bootloader command line (ignored): %s\n", prop);
|
||||
+ else
|
||||
+ pr_notice("Bootloader command line not present\n");
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* parameters may set static keys */
|
||||
parse_early_param();
|
||||
after_dashes = parse_args("Booting kernel",
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/arch/arm/mach-mvebu/Kconfig
|
||||
+++ b/arch/arm/mach-mvebu/Kconfig
|
||||
@@ -66,6 +66,7 @@ config MACH_ARMADA_38X
|
||||
select HAVE_ARM_TWD if SMP
|
||||
select MACH_MVEBU_V7
|
||||
select PINCTRL_ARMADA_38X
|
||||
+ select ARCH_WANT_LIBATA_LEDS
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support boards based
|
||||
on the Marvell Armada 380/385 SoC with device tree.
|
||||
@@ -0,0 +1,770 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
@@ -212,11 +212,19 @@
|
||||
&pcie1 {
|
||||
/* Marvell 88W8864, 5GHz-only */
|
||||
status = "okay";
|
||||
+
|
||||
+ mwlwifi {
|
||||
+ marvell,2ghz = <0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&pcie2 {
|
||||
/* Marvell 88W8864, 2GHz-only */
|
||||
status = "okay";
|
||||
+
|
||||
+ mwlwifi {
|
||||
+ marvell,5ghz = <0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-caiman.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-caiman.dts
|
||||
@@ -142,3 +142,205 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <2 2>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <100 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <104 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <108 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <112 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <116 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <120 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <124 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <128 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <132 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <136 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <140 0 0x17 0x17 0x17 0x17 0x17 0x17 0x17 0x15 0x17 0x17 0x17 0x14 0x17 0x17 0x17 0x14 0 0xf>,
|
||||
+ <149 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>,
|
||||
+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>,
|
||||
+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>,
|
||||
+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>,
|
||||
+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x1a 0x1a 0x17 0x14 0 0xf>;
|
||||
+ CA =
|
||||
+ <36 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <40 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <44 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <48 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>;
|
||||
+ CN =
|
||||
+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <149 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <165 0 0x15 0x15 0x15 0x15 0x16 0x16 0x16 0x15 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <36 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <40 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <44 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <48 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <100 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>,
|
||||
+ <149 0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0 0xf>;
|
||||
+ FCC =
|
||||
+ <36 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <40 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <44 0 0x19 0x19 0x18 0x17 0x19 0x19 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <48 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x17 0x17 0x17 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x1a 0x1a 0x18 0x17 0x19 0x19 0x17 0x15 0x18 0x18 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <153 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <157 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <161 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>,
|
||||
+ <165 0 0x1a 0x1a 0x18 0x17 0x1a 0x1a 0x17 0x15 0x1a 0x1a 0x17 0x14 0x15 0x15 0x15 0x14 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <2 2>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ CA =
|
||||
+ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x00 0x00 0x00 0x00 0 0xf>,
|
||||
+ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x00 0x00 0x00 0x00 0 0xf>;
|
||||
+ CN =
|
||||
+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <14 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <1 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ FCC =
|
||||
+ <1 0 0x19 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x1a 0x19 0x18 0x17 0x19 0x19 0x17 0x16 0x14 0x14 0x14 0x14 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x19 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-cobra.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-cobra.dts
|
||||
@@ -142,3 +142,205 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>;
|
||||
+ CA =
|
||||
+ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>;
|
||||
+ CN =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>;
|
||||
+ FCC =
|
||||
+ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ CA =
|
||||
+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ CN =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ FCC =
|
||||
+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-shelby.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-shelby.dts
|
||||
@@ -142,3 +142,205 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <149 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <153 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <157 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <161 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>,
|
||||
+ <165 0 0x19 0x19 0x19 0x17 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0x19 0x19 0x16 0x15 0 0xf>;
|
||||
+ CA =
|
||||
+ <36 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <40 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <44 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <48 0 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>;
|
||||
+ CN =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <149 0 0x14 0x14 0x14 0x14 0x13 0x13 0x13 0x13 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <165 0 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x14 0x14 0x14 0x14 0x10 0x10 0x10 0x10 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <36 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <40 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <44 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <48 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <52 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <56 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <60 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <64 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <100 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <104 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <108 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <112 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <116 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <120 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <124 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <128 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <132 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <136 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <140 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>,
|
||||
+ <149 0 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xd 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0xe 0 0xf>;
|
||||
+ FCC =
|
||||
+ <36 0 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <40 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <44 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <48 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0xf 0xf 0xf 0xf 0 0xf>,
|
||||
+ <52 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <56 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <60 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <64 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <100 0 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <104 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x12 0x12 0x12 0x12 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <108 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <112 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <116 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <120 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <124 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <128 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <132 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <136 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <140 0 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0 0xf>,
|
||||
+ <149 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <153 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <157 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <161 0 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>,
|
||||
+ <165 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ AU =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ CA =
|
||||
+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ CN =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <14 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ ETSI =
|
||||
+ <1 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0xa 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ FCC =
|
||||
+ <1 0 0x17 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0xe 0xe 0xe 0xe 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x18 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x11 0x11 0x11 0x11 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x17 0x12 0x12 0x12 0x13 0x13 0x13 0x13 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
|
||||
@@ -157,6 +157,18 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&pcie1 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ mwlwifi {
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&sdhci {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdhci_pins>;
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -223,12 +223,100 @@
|
||||
pcie@2,0 {
|
||||
/* Port 0, Lane 1 */
|
||||
status = "okay";
|
||||
+
|
||||
+ mwlwifi {
|
||||
+ marvell,5ghz = <0>;
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ FCC =
|
||||
+ <1 0 0x17 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0xf 0xf 0xf 0xf 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0x17 0x16 0x16 0x16 0x16 0x16 0x16 0x14 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0x17 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x10 0x10 0x10 0x10 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+
|
||||
+ ETSI =
|
||||
+ <1 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <2 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <3 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <4 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <5 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <6 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <7 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <8 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <9 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <10 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <11 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <12 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>,
|
||||
+ <13 0 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0xb 0x0 0x0 0x0 0x0 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
/* Second mini-PCIe port */
|
||||
pcie@3,0 {
|
||||
/* Port 0, Lane 3 */
|
||||
status = "okay";
|
||||
+
|
||||
+ mwlwifi {
|
||||
+ marvell,2ghz = <0>;
|
||||
+ marvell,chainmask = <4 4>;
|
||||
+ marvell,powertable {
|
||||
+ FCC =
|
||||
+ <36 0 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <40 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <44 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <48 0 0x8 0x8 0x8 0x8 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0 0xf>,
|
||||
+ <52 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>,
|
||||
+ <56 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>,
|
||||
+ <60 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>,
|
||||
+ <64 0 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0xf 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0x12 0 0xf>,
|
||||
+ <100 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <104 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <108 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <112 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <116 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <120 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <124 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <128 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <132 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <136 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <140 0 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <149 0 0x16 0x16 0x16 0x16 0x14 0x14 0x14 0x14 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <153 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <157 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <161 0 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>,
|
||||
+ <165 0 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x16 0x15 0x15 0x15 0x15 0x14 0x14 0x14 0x14 0 0xf>;
|
||||
+
|
||||
+ ETSI =
|
||||
+ <36 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <40 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <44 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <48 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <52 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <56 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <60 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <64 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <100 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <104 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <108 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <112 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <116 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <120 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <124 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <128 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <132 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <136 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <140 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>,
|
||||
+ <149 0 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xd 0xd 0xd 0xd 0xc 0xc 0xc 0xc 0 0xf>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp.dtsi
|
||||
@@ -237,12 +237,10 @@
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
|
||||
reg = <0x11000 0x100>;
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c";
|
||||
reg = <0x11100 0x100>;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-388-rd.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-388-rd.dts
|
||||
@@ -103,6 +103,16 @@
|
||||
compatible = "st,m25p128", "jedec,spi-nor";
|
||||
reg = <0>; /* Chip select 0 */
|
||||
spi-max-frequency = <108000000>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "uboot";
|
||||
+ reg = <0 0x400000>;
|
||||
+ };
|
||||
+
|
||||
+ partition@1 {
|
||||
+ label = "firmware";
|
||||
+ reg = <0x400000 0xc00000>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 9861f93a59142a3131870df2521eb2deb73026d7 Mon Sep 17 00:00:00 2001
|
||||
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
Date: Tue, 13 Jan 2015 11:14:09 +0100
|
||||
Subject: [PATCH 2/2] ARM: mvebu: 385-ap: Add partitions
|
||||
|
||||
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
---
|
||||
arch/arm/boot/dts/marvell/armada-385-db-ap.dts | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
|
||||
@@ -218,19 +218,19 @@
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
- label = "U-Boot";
|
||||
+ label = "u-boot";
|
||||
reg = <0x00000000 0x00800000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@800000 {
|
||||
- label = "uImage";
|
||||
+ label = "kernel";
|
||||
reg = <0x00800000 0x00400000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@c00000 {
|
||||
- label = "Root";
|
||||
+ label = "ubi";
|
||||
reg = <0x00c00000 0x3f400000>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -481,3 +481,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&coherencyfab {
|
||||
+ broken-idle;
|
||||
+};
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -383,7 +383,7 @@
|
||||
|
||||
ethernet-port@4 {
|
||||
reg = <4>;
|
||||
- label = "internet";
|
||||
+ label = "wan";
|
||||
};
|
||||
|
||||
ethernet-port@5 {
|
||||
@@ -0,0 +1,50 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
@@ -14,6 +14,13 @@
|
||||
compatible = "linksys,armada385", "marvell,armada385",
|
||||
"marvell,armada380";
|
||||
|
||||
+ aliases {
|
||||
+ led-boot = &led_power;
|
||||
+ led-failsafe = &led_power;
|
||||
+ led-running = &led_power;
|
||||
+ led-upgrade = &led_power;
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -71,7 +78,7 @@
|
||||
pinctrl-0 = <&gpio_leds_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
- led-power {
|
||||
+ led_power: led-power {
|
||||
gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "on";
|
||||
};
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -26,6 +26,13 @@
|
||||
compatible = "linksys,mamba", "marvell,armadaxp-mv78230",
|
||||
"marvell,armadaxp", "marvell,armada-370-xp";
|
||||
|
||||
+ aliases {
|
||||
+ led-boot = &led_power;
|
||||
+ led-failsafe = &led_power;
|
||||
+ led-running = &led_power;
|
||||
+ led-upgrade = &led_power;
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200";
|
||||
stdout-path = &uart0;
|
||||
@@ -195,7 +202,7 @@
|
||||
pinctrl-0 = <&power_led_pin>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
- led-power {
|
||||
+ led_power: led-power {
|
||||
label = "mamba:white:power";
|
||||
gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "on";
|
||||
@@ -0,0 +1,25 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
|
||||
@@ -116,7 +116,7 @@
|
||||
};
|
||||
|
||||
ð2 {
|
||||
- status = "okay";
|
||||
+ status = "disabled";
|
||||
phy-mode = "sgmii";
|
||||
buffer-manager = <&bm>;
|
||||
bm,pool-long = <2>;
|
||||
@@ -198,10 +198,10 @@
|
||||
label = "wan";
|
||||
};
|
||||
|
||||
- ethernet-port@5 {
|
||||
- reg = <5>;
|
||||
+ ethernet-port@6 {
|
||||
+ reg = <6>;
|
||||
phy-mode = "sgmii";
|
||||
- ethernet = <ð2>;
|
||||
+ ethernet = <ð0>;
|
||||
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
@@ -0,0 +1,68 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
|
||||
@@ -12,8 +12,8 @@
|
||||
|
||||
/ {
|
||||
model = "Linksys WRT3200ACM";
|
||||
- compatible = "linksys,rango", "linksys,armada385", "marvell,armada385",
|
||||
- "marvell,armada380";
|
||||
+ compatible = "linksys,wrt3200acm", "linksys,rango", "linksys,armada385",
|
||||
+ "marvell,armada385", "marvell,armada380";
|
||||
};
|
||||
|
||||
&expander0 {
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -22,9 +22,10 @@
|
||||
#include "armada-xp-mv78230.dtsi"
|
||||
|
||||
/ {
|
||||
- model = "Linksys WRT1900AC";
|
||||
- compatible = "linksys,mamba", "marvell,armadaxp-mv78230",
|
||||
- "marvell,armadaxp", "marvell,armada-370-xp";
|
||||
+ model = "Linksys WRT1900AC v1";
|
||||
+ compatible = "linksys,wrt1900ac-v1", "linksys,mamba",
|
||||
+ "marvell,armadaxp-mv78230", "marvell,armadaxp",
|
||||
+ "marvell,armada-370-xp";
|
||||
|
||||
aliases {
|
||||
led-boot = &led_power;
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-cobra.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-cobra.dts
|
||||
@@ -9,8 +9,9 @@
|
||||
#include "armada-385-linksys.dtsi"
|
||||
|
||||
/ {
|
||||
- model = "Linksys WRT1900ACv2";
|
||||
- compatible = "linksys,cobra", "linksys,armada385", "marvell,armada385",
|
||||
+ model = "Linksys WRT1900AC v2";
|
||||
+ compatible = "linksys,wrt1900ac-v2", "linksys,cobra",
|
||||
+ "linksys,armada385", "marvell,armada385",
|
||||
"marvell,armada380";
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-caiman.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-caiman.dts
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
/ {
|
||||
model = "Linksys WRT1200AC";
|
||||
- compatible = "linksys,caiman", "linksys,armada385", "marvell,armada385",
|
||||
- "marvell,armada380";
|
||||
+ compatible = "linksys,wrt1200ac", "linksys,caiman", "linksys,armada385",
|
||||
+ "marvell,armada385", "marvell,armada380";
|
||||
};
|
||||
|
||||
&expander0 {
|
||||
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-shelby.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-shelby.dts
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
/ {
|
||||
model = "Linksys WRT1900ACS";
|
||||
- compatible = "linksys,shelby", "linksys,armada385", "marvell,armada385",
|
||||
+ compatible = "linksys,wrt1900acs", "linksys,shelby",
|
||||
+ "linksys,armada385", "marvell,armada385",
|
||||
"marvell,armada380";
|
||||
};
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
From 8137da20701c776ad3481115305a5e8e410871ba Mon Sep 17 00:00:00 2001
|
||||
From: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
Date: Tue, 29 Nov 2016 10:15:45 +0000
|
||||
Subject: ARM: dts: armada388-clearfog: emmc on clearfog base
|
||||
|
||||
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
---
|
||||
.../arm/boot/dts/marvell/armada-388-clearfog-base.dts | 1 +
|
||||
.../armada-38x-solidrun-microsom-emmc.dtsi | 62 +++++++++++++++++++
|
||||
2 files changed, 63 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom-emmc.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/marvell/armada-388-clearfog-base.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-388-clearfog-base.dts
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
#include "armada-388-clearfog.dtsi"
|
||||
+#include "armada-38x-solidrun-microsom-emmc.dtsi"
|
||||
|
||||
/ {
|
||||
model = "SolidRun Clearfog Base A1";
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom-emmc.dtsi
|
||||
@@ -0,0 +1,62 @@
|
||||
+/*
|
||||
+ * Device Tree file for SolidRun Armada 38x Microsom add-on for eMMC
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Russell King
|
||||
+ *
|
||||
+ * This board is in development; the contents of this file work with
|
||||
+ * the A1 rev 2.0 of the board, which does not represent final
|
||||
+ * production board. Things will change, don't expect this file to
|
||||
+ * remain compatible info the future.
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This file is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This file is distributed in the hope that it will be useful
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * Or, alternatively
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+/ {
|
||||
+ soc {
|
||||
+ internal-regs {
|
||||
+ sdhci@d8000 {
|
||||
+ bus-width = <4>;
|
||||
+ no-1-8-v;
|
||||
+ non-removable;
|
||||
+ pinctrl-0 = <µsom_sdhci_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+ wp-inverted;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
@@ -0,0 +1,28 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-388-helios4.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-388-helios4.dts
|
||||
@@ -15,6 +15,13 @@
|
||||
model = "Helios4";
|
||||
compatible = "kobol,helios4", "marvell,armada388",
|
||||
"marvell,armada385", "marvell,armada380";
|
||||
+
|
||||
+ aliases {
|
||||
+ led-boot = &led_status;
|
||||
+ led-failsafe = &led_status;
|
||||
+ led-running = &led_status;
|
||||
+ led-upgrade = &led_status;
|
||||
+ };
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
@@ -73,10 +80,9 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&helios_system_led_pins>;
|
||||
|
||||
- status-led {
|
||||
+ led_status: status-led {
|
||||
label = "helios4:green:status";
|
||||
gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
|
||||
- linux,default-trigger = "heartbeat";
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
From: Tomasz Maciej Nowak <tmn505@gmail.com>
|
||||
Date: Fri, 7 Jul 2023 19:06:05 +0200
|
||||
Subject: [PATCH] arm64: dts: marvell: enable heartbeat LED by default
|
||||
|
||||
Some boards could be placed in an enclosure, so enable LED18 by default,
|
||||
since that'll be the only visible indicator that the board is operating.
|
||||
|
||||
Signed-off-by: Tomasz Maciej Nowak <tmn505@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts
|
||||
+++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts
|
||||
@@ -25,6 +25,7 @@
|
||||
function = LED_FUNCTION_HEARTBEAT;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
linux,default-trigger = "heartbeat";
|
||||
+ default-state = "on";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,37 @@
|
||||
From 258233f00bcd013050efee00c5d9128ef8cd62dd Mon Sep 17 00:00:00 2001
|
||||
From: Tad <tad@spotco.us>
|
||||
Date: Fri, 5 Feb 2021 22:32:11 -0500
|
||||
Subject: [PATCH] ARM: dts: armada-xp-linksys-mamba: Increase kernel
|
||||
partition to 4MB
|
||||
|
||||
Signed-off-by: Tad Davanzo <tad@spotco.us>
|
||||
---
|
||||
arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts
|
||||
@@ -452,9 +452,9 @@
|
||||
reg = <0xa00000 0x2800000>; /* 40MB */
|
||||
};
|
||||
|
||||
- partition@d00000 {
|
||||
+ partition@e00000 {
|
||||
label = "rootfs1";
|
||||
- reg = <0xd00000 0x2500000>; /* 37MB */
|
||||
+ reg = <0xe00000 0x2400000>; /* 36MB */
|
||||
};
|
||||
|
||||
/* kernel2 overlaps with rootfs2 by design */
|
||||
@@ -463,9 +463,9 @@
|
||||
reg = <0x3200000 0x2800000>; /* 40MB */
|
||||
};
|
||||
|
||||
- partition@3500000 {
|
||||
+ partition@3600000 {
|
||||
label = "rootfs2";
|
||||
- reg = <0x3500000 0x2500000>; /* 37MB */
|
||||
+ reg = <0x3600000 0x2400000>; /* 36MB */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -0,0 +1,29 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-370.dtsi
|
||||
@@ -254,7 +254,7 @@
|
||||
clocks = <&gateclk 23>;
|
||||
clock-names = "cesa0";
|
||||
marvell,crypto-srams = <&crypto_sram>;
|
||||
- marvell,crypto-sram-size = <0x7e0>;
|
||||
+ marvell,crypto-sram-size = <0x800>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -275,12 +275,17 @@
|
||||
* cpuidle workaround.
|
||||
*/
|
||||
idle-sram@0 {
|
||||
+ status = "disabled";
|
||||
reg = <0x0 0x20>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
+&coherencyfab {
|
||||
+ broken-idle;
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Default UART pinctrl setting without RTS/CTS, can be overwritten on
|
||||
* board level if a different configuration is used.
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
--- a/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
|
||||
+++ b/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
+ append-rootblock = "nullparameter="; /* override the bootloader args */
|
||||
};
|
||||
|
||||
memory@0 {
|
||||
@@ -94,6 +95,8 @@
|
||||
status = "okay";
|
||||
phy = <&phy1>;
|
||||
phy-mode = "sgmii";
|
||||
+ nvmem-cells = <&macaddr_vendor_0>;
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
};
|
||||
|
||||
sata@a0000 {
|
||||
@@ -175,6 +178,24 @@
|
||||
phy1: ethernet-phy@1 { /* Marvell 88E1512 */
|
||||
reg = <1>;
|
||||
};
|
||||
+
|
||||
+ virtual_flash {
|
||||
+ compatible = "mtd-concat";
|
||||
+
|
||||
+ devices = <&mtd_kernel &mtd_gap &mtd_gap2>;
|
||||
+
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ compatible = "openwrt,uimage", "denx,uimage";
|
||||
+ label = "firmware";
|
||||
+ reg = <0x0 0x0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
@@ -259,48 +280,52 @@
|
||||
reg = <0>; /* Chip select 0 */
|
||||
spi-max-frequency = <20000000>;
|
||||
|
||||
- /*
|
||||
- * Warning!
|
||||
- *
|
||||
- * Synology u-boot uses its compiled-in environment
|
||||
- * and it seems Synology did not care to change u-boot
|
||||
- * default configuration in order to allow saving a
|
||||
- * modified environment at a sensible location. So,
|
||||
- * if you do a 'saveenv' under u-boot, your modified
|
||||
- * environment will be saved at 1MB after the start
|
||||
- * of the flash, i.e. in the middle of the uImage.
|
||||
- * For that reason, it is strongly advised not to
|
||||
- * change the default environment, unless you know
|
||||
- * what you are doing.
|
||||
- */
|
||||
- partition@0 { /* u-boot */
|
||||
- label = "RedBoot";
|
||||
- reg = <0x00000000 0x000c0000>; /* 768KB */
|
||||
- };
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ partition@0 { /* u-boot */
|
||||
+ label = "u-boot";
|
||||
+ reg = <0x00000000 0x000c0000>; /* 768KB */
|
||||
+ read-only;
|
||||
+ };
|
||||
|
||||
- partition@c0000 { /* uImage */
|
||||
- label = "zImage";
|
||||
- reg = <0x000c0000 0x002d0000>; /* 2880KB */
|
||||
- };
|
||||
+ mtd_gap: partition@c0000 { /* gap */
|
||||
+ label = "gap";
|
||||
+ reg = <0x000c0000 0x00040000>; /* 256KB */
|
||||
+ };
|
||||
|
||||
- partition@390000 { /* uInitramfs */
|
||||
- label = "rd.gz";
|
||||
- reg = <0x00390000 0x00440000>; /* 4250KB */
|
||||
- };
|
||||
+ partition@100000 { /* u-boot-env */
|
||||
+ label = "u-boot-env";
|
||||
+ reg = <0x00100000 0x00010000>; /* 64KB */
|
||||
+ };
|
||||
|
||||
- partition@7d0000 { /* MAC address and serial number */
|
||||
- label = "vendor";
|
||||
- reg = <0x007d0000 0x00010000>; /* 64KB */
|
||||
- };
|
||||
+ mtd_kernel: partition@110000 {
|
||||
+ label = "kernel";
|
||||
+ reg = <0x00110000 0x006c0000>; /* 6912KB */
|
||||
+ };
|
||||
|
||||
- partition@7e0000 {
|
||||
- label = "RedBoot config";
|
||||
- reg = <0x007e0000 0x00010000>; /* 64KB */
|
||||
- };
|
||||
+ partition@7d0000 { /* MAC address and serial number */
|
||||
+ reg = <0x007d0000 0x00010000>; /* 64KB */
|
||||
+ label = "vendor";
|
||||
+ read-only;
|
||||
+
|
||||
+ nvmem-layout {
|
||||
+ compatible = "fixed-layout";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ macaddr_vendor_0: macaddr@0 {
|
||||
+ reg = <0x0 0x6>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
|
||||
- partition@7f0000 {
|
||||
- label = "FIS directory";
|
||||
- reg = <0x007f0000 0x00010000>; /* 64KB */
|
||||
+ mtd_gap2: partition@7e0000 {
|
||||
+ label = "gap2";
|
||||
+ reg = <0x007e0000 0x00020000>; /* 128KB */
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
From 2c80ae23905e16eb0e545d62cb5785faa0776cbd Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
Date: Fri, 15 Aug 2025 14:54:18 +0200
|
||||
Subject: [PATCH] arm64: dts: marvell: reorder ethernet aliases for ESPRESSObin
|
||||
Ultra
|
||||
|
||||
Reorder aliases, so "ethernet[1-5] = &switch0port[1-5]" are aligned
|
||||
insead of overriding ethernet1 to the WAN port (5).
|
||||
|
||||
Signed-off-by: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
---
|
||||
.../dts/marvell/armada-3720-espressobin-ultra.dts | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts
|
||||
+++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts
|
||||
@@ -16,12 +16,12 @@
|
||||
"marvell,armada3720", "marvell,armada3710";
|
||||
|
||||
aliases {
|
||||
- /* ethernet1 is WAN port */
|
||||
- ethernet1 = &switch0port5;
|
||||
- ethernet2 = &switch0port1;
|
||||
- ethernet3 = &switch0port2;
|
||||
- ethernet4 = &switch0port3;
|
||||
- ethernet5 = &switch0port4;
|
||||
+ /* for dsa slave device */
|
||||
+ ethernet1 = &switch0port1;
|
||||
+ ethernet2 = &switch0port2;
|
||||
+ ethernet3 = &switch0port3;
|
||||
+ ethernet4 = &switch0port4;
|
||||
+ ethernet5 = &switch0port5;
|
||||
};
|
||||
|
||||
/delete-node/ regulator;
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
From cb1103762449c0d8097d58c701a06118e417a50e Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
Date: Fri, 15 Aug 2025 14:48:54 +0200
|
||||
Subject: [PATCH] arm64: dts: marvell: specity phy-mode "2500base-x" for
|
||||
Methode uDPU
|
||||
|
||||
In OpenWRT we used to have a copy of the DTS with "2500base-x" instead
|
||||
of "sgmii" for both ethernet nodes. Apply this change to the upstream
|
||||
DTS and omit the full-copy.
|
||||
|
||||
Signed-off-by: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
---
|
||||
arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts
|
||||
+++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts
|
||||
@@ -37,6 +37,10 @@
|
||||
};
|
||||
|
||||
ð0 {
|
||||
- phy-mode = "sgmii";
|
||||
+ phy-mode = "2500base-x";
|
||||
sfp = <&sfp_eth0>;
|
||||
};
|
||||
+
|
||||
+ð1 {
|
||||
+ phy-mode = "2500base-x";
|
||||
+};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user