2019-05-27 08:55:21 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2017-04-07 16:45:09 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2017 Sean Wang <sean.wang@mediatek.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __MT7530_H
|
|
|
|
#define __MT7530_H
|
|
|
|
|
|
|
|
#define MT7530_NUM_PORTS 7
|
2021-05-19 11:32:00 +08:00
|
|
|
#define MT7530_NUM_PHYS 5
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_NUM_FDB_RECORDS 2048
|
2017-12-15 12:47:00 +08:00
|
|
|
#define MT7530_ALL_MEMBERS 0xff
|
2017-04-07 16:45:09 +08:00
|
|
|
|
2020-11-03 13:06:18 +08:00
|
|
|
#define MTK_HDR_LEN 4
|
|
|
|
#define MT7530_MAX_MTU (15 * 1024 - ETH_HLEN - ETH_FCS_LEN - MTK_HDR_LEN)
|
|
|
|
|
2020-09-11 21:48:52 +08:00
|
|
|
enum mt753x_id {
|
2019-01-30 11:24:05 +10:00
|
|
|
ID_MT7530 = 0,
|
|
|
|
ID_MT7621 = 1,
|
2020-09-11 21:48:54 +08:00
|
|
|
ID_MT7531 = 2,
|
2023-04-03 02:19:40 +01:00
|
|
|
ID_MT7988 = 3,
|
2019-01-30 11:24:05 +10:00
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define NUM_TRGMII_CTRL 5
|
|
|
|
|
|
|
|
#define TRGMII_BASE(x) (0x10000 + (x))
|
|
|
|
|
|
|
|
/* Registers to ethsys access */
|
|
|
|
#define ETHSYS_CLKCFG0 0x2c
|
|
|
|
#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
|
|
|
|
|
|
|
|
#define SYSC_REG_RSTCTRL 0x34
|
|
|
|
#define RESET_MCM BIT(2)
|
|
|
|
|
2024-04-13 16:01:39 +03:00
|
|
|
/* Register for ARL global control */
|
|
|
|
#define MT753X_AGC 0xc
|
|
|
|
#define LOCAL_EN BIT(7)
|
|
|
|
|
2024-04-22 10:15:12 +03:00
|
|
|
/* Register for MAC forward control */
|
|
|
|
#define MT753X_MFC 0x10
|
|
|
|
#define BC_FFP_MASK GENMASK(31, 24)
|
|
|
|
#define BC_FFP(x) FIELD_PREP(BC_FFP_MASK, x)
|
|
|
|
#define UNM_FFP_MASK GENMASK(23, 16)
|
|
|
|
#define UNM_FFP(x) FIELD_PREP(UNM_FFP_MASK, x)
|
|
|
|
#define UNU_FFP_MASK GENMASK(15, 8)
|
|
|
|
#define UNU_FFP(x) FIELD_PREP(UNU_FFP_MASK, x)
|
|
|
|
#define MT7530_CPU_EN BIT(7)
|
|
|
|
#define MT7530_CPU_PORT_MASK GENMASK(6, 4)
|
|
|
|
#define MT7530_CPU_PORT(x) FIELD_PREP(MT7530_CPU_PORT_MASK, x)
|
|
|
|
#define MT7530_MIRROR_EN BIT(3)
|
|
|
|
#define MT7530_MIRROR_PORT_MASK GENMASK(2, 0)
|
|
|
|
#define MT7530_MIRROR_PORT_GET(x) FIELD_GET(MT7530_MIRROR_PORT_MASK, x)
|
|
|
|
#define MT7530_MIRROR_PORT_SET(x) FIELD_PREP(MT7530_MIRROR_PORT_MASK, x)
|
|
|
|
#define MT7531_QRY_FFP_MASK GENMASK(7, 0)
|
|
|
|
#define MT7531_QRY_FFP(x) FIELD_PREP(MT7531_QRY_FFP_MASK, x)
|
|
|
|
|
|
|
|
/* Register for CPU forward control */
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_CFC 0x4
|
|
|
|
#define MT7531_MIRROR_EN BIT(19)
|
2024-04-22 10:15:12 +03:00
|
|
|
#define MT7531_MIRROR_PORT_MASK GENMASK(18, 16)
|
|
|
|
#define MT7531_MIRROR_PORT_GET(x) FIELD_GET(MT7531_MIRROR_PORT_MASK, x)
|
|
|
|
#define MT7531_MIRROR_PORT_SET(x) FIELD_PREP(MT7531_MIRROR_PORT_MASK, x)
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_CPU_PMAP_MASK GENMASK(7, 0)
|
2023-06-17 09:26:44 +03:00
|
|
|
#define MT7531_CPU_PMAP(x) FIELD_PREP(MT7531_CPU_PMAP_MASK, x)
|
2020-09-11 21:48:54 +08:00
|
|
|
|
2024-04-22 10:15:12 +03:00
|
|
|
#define MT753X_MIRROR_REG(id) ((id == ID_MT7531 || \
|
|
|
|
id == ID_MT7988) ? \
|
|
|
|
MT7531_CFC : MT753X_MFC)
|
|
|
|
|
|
|
|
#define MT753X_MIRROR_EN(id) ((id == ID_MT7531 || \
|
|
|
|
id == ID_MT7988) ? \
|
|
|
|
MT7531_MIRROR_EN : MT7530_MIRROR_EN)
|
|
|
|
|
|
|
|
#define MT753X_MIRROR_PORT_MASK(id) ((id == ID_MT7531 || \
|
|
|
|
id == ID_MT7988) ? \
|
|
|
|
MT7531_MIRROR_PORT_MASK : \
|
|
|
|
MT7530_MIRROR_PORT_MASK)
|
|
|
|
|
|
|
|
#define MT753X_MIRROR_PORT_GET(id, val) ((id == ID_MT7531 || \
|
|
|
|
id == ID_MT7988) ? \
|
|
|
|
MT7531_MIRROR_PORT_GET(val) : \
|
|
|
|
MT7530_MIRROR_PORT_GET(val))
|
|
|
|
|
|
|
|
#define MT753X_MIRROR_PORT_SET(id, val) ((id == ID_MT7531 || \
|
|
|
|
id == ID_MT7988) ? \
|
|
|
|
MT7531_MIRROR_PORT_SET(val) : \
|
|
|
|
MT7530_MIRROR_PORT_SET(val))
|
2020-09-11 21:48:54 +08:00
|
|
|
|
2024-04-22 10:15:11 +03:00
|
|
|
/* Register for BPDU and PAE frame control */
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT753X_BPC 0x24
|
2024-04-22 10:15:11 +03:00
|
|
|
#define PAE_BPDU_FR BIT(25)
|
|
|
|
#define PAE_EG_TAG_MASK GENMASK(24, 22)
|
|
|
|
#define PAE_EG_TAG(x) FIELD_PREP(PAE_EG_TAG_MASK, x)
|
|
|
|
#define PAE_PORT_FW_MASK GENMASK(18, 16)
|
|
|
|
#define PAE_PORT_FW(x) FIELD_PREP(PAE_PORT_FW_MASK, x)
|
|
|
|
#define BPDU_EG_TAG_MASK GENMASK(8, 6)
|
|
|
|
#define BPDU_EG_TAG(x) FIELD_PREP(BPDU_EG_TAG_MASK, x)
|
|
|
|
#define BPDU_PORT_FW_MASK GENMASK(2, 0)
|
|
|
|
|
|
|
|
/* Register for 01-80-C2-00-00-[01,02] MAC DA frame control */
|
net: dsa: mt7530: fix handling of all link-local frames
Currently, the MT753X switches treat frames with :01-0D and :0F MAC DAs as
regular multicast frames, therefore flooding them to user ports.
On page 205, section "8.6.3 Frame filtering" of the active standard, IEEE
Std 802.1Q™-2022, it is stated that frames with 01:80:C2:00:00:00-0F as MAC
DA must only be propagated to C-VLAN and MAC Bridge components. That means
VLAN-aware and VLAN-unaware bridges. On the switch designs with CPU ports,
these frames are supposed to be processed by the CPU (software). So we make
the switch only forward them to the CPU port. And if received from a CPU
port, forward to a single port. The software is responsible of making the
switch conform to the latter by setting a single port as destination port
on the special tag.
This switch intellectual property cannot conform to this part of the
standard fully. Whilst the REV_UN frame tag covers the remaining :04-0D and
:0F MAC DAs, it also includes :22-FF which the scope of propagation is not
supposed to be restricted for these MAC DAs.
Set frames with :01-03 MAC DAs to be trapped to the CPU port(s). Add a
comment for the remaining MAC DAs.
Note that the ingress port must have a PVID assigned to it for the switch
to forward untagged frames. A PVID is set by default on VLAN-aware and
VLAN-unaware ports. However, when the network interface that pertains to
the ingress port is attached to a vlan_filtering enabled bridge, the user
can remove the PVID assignment from it which would prevent the link-local
frames from being trapped to the CPU port. I am yet to see a way to forward
link-local frames while preventing other untagged frames from being
forwarded too.
Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch")
Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2024-03-14 12:33:42 +03:00
|
|
|
#define MT753X_RGAC1 0x28
|
2024-04-22 10:15:11 +03:00
|
|
|
#define R02_BPDU_FR BIT(25)
|
|
|
|
#define R02_EG_TAG_MASK GENMASK(24, 22)
|
|
|
|
#define R02_EG_TAG(x) FIELD_PREP(R02_EG_TAG_MASK, x)
|
|
|
|
#define R02_PORT_FW_MASK GENMASK(18, 16)
|
|
|
|
#define R02_PORT_FW(x) FIELD_PREP(R02_PORT_FW_MASK, x)
|
|
|
|
#define R01_BPDU_FR BIT(9)
|
|
|
|
#define R01_EG_TAG_MASK GENMASK(8, 6)
|
|
|
|
#define R01_EG_TAG(x) FIELD_PREP(R01_EG_TAG_MASK, x)
|
|
|
|
#define R01_PORT_FW_MASK GENMASK(2, 0)
|
|
|
|
|
|
|
|
/* Register for 01-80-C2-00-00-[03,0E] MAC DA frame control */
|
2023-06-17 09:26:47 +03:00
|
|
|
#define MT753X_RGAC2 0x2c
|
2024-04-22 10:15:11 +03:00
|
|
|
#define R0E_BPDU_FR BIT(25)
|
|
|
|
#define R0E_EG_TAG_MASK GENMASK(24, 22)
|
|
|
|
#define R0E_EG_TAG(x) FIELD_PREP(R0E_EG_TAG_MASK, x)
|
|
|
|
#define R0E_PORT_FW_MASK GENMASK(18, 16)
|
|
|
|
#define R0E_PORT_FW(x) FIELD_PREP(R0E_PORT_FW_MASK, x)
|
|
|
|
#define R03_BPDU_FR BIT(9)
|
|
|
|
#define R03_EG_TAG_MASK GENMASK(8, 6)
|
|
|
|
#define R03_EG_TAG(x) FIELD_PREP(R03_EG_TAG_MASK, x)
|
|
|
|
#define R03_PORT_FW_MASK GENMASK(2, 0)
|
|
|
|
|
|
|
|
enum mt753x_to_cpu_fw {
|
|
|
|
TO_CPU_FW_SYSTEM_DEFAULT,
|
|
|
|
TO_CPU_FW_CPU_EXCLUDE = 4,
|
|
|
|
TO_CPU_FW_CPU_INCLUDE = 5,
|
|
|
|
TO_CPU_FW_CPU_ONLY = 6,
|
|
|
|
TO_CPU_FW_DROP = 7,
|
2020-09-11 21:48:54 +08:00
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Registers for address table access */
|
|
|
|
#define MT7530_ATA1 0x74
|
|
|
|
#define STATIC_EMP 0
|
|
|
|
#define STATIC_ENT 3
|
|
|
|
#define MT7530_ATA2 0x78
|
2021-07-16 17:36:39 +02:00
|
|
|
#define ATA2_IVL BIT(15)
|
2021-08-04 00:04:04 +08:00
|
|
|
#define ATA2_FID(x) (((x) & 0x7) << 12)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
/* Register for address table write data */
|
|
|
|
#define MT7530_ATWD 0x7c
|
|
|
|
|
|
|
|
/* Register for address table control */
|
|
|
|
#define MT7530_ATC 0x80
|
|
|
|
#define ATC_HASH (((x) & 0xfff) << 16)
|
|
|
|
#define ATC_BUSY BIT(15)
|
|
|
|
#define ATC_SRCH_END BIT(14)
|
|
|
|
#define ATC_SRCH_HIT BIT(13)
|
|
|
|
#define ATC_INVALID BIT(12)
|
|
|
|
#define ATC_MAT(x) (((x) & 0xf) << 8)
|
|
|
|
#define ATC_MAT_MACTAB ATC_MAT(0)
|
|
|
|
|
|
|
|
enum mt7530_fdb_cmd {
|
|
|
|
MT7530_FDB_READ = 0,
|
|
|
|
MT7530_FDB_WRITE = 1,
|
|
|
|
MT7530_FDB_FLUSH = 2,
|
|
|
|
MT7530_FDB_START = 4,
|
|
|
|
MT7530_FDB_NEXT = 5,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Registers for table search read address */
|
|
|
|
#define MT7530_TSRA1 0x84
|
|
|
|
#define MAC_BYTE_0 24
|
|
|
|
#define MAC_BYTE_1 16
|
|
|
|
#define MAC_BYTE_2 8
|
|
|
|
#define MAC_BYTE_3 0
|
|
|
|
#define MAC_BYTE_MASK 0xff
|
|
|
|
|
|
|
|
#define MT7530_TSRA2 0x88
|
|
|
|
#define MAC_BYTE_4 24
|
|
|
|
#define MAC_BYTE_5 16
|
|
|
|
#define CVID 0
|
|
|
|
#define CVID_MASK 0xfff
|
|
|
|
|
|
|
|
#define MT7530_ATRD 0x8C
|
|
|
|
#define AGE_TIMER 24
|
|
|
|
#define AGE_TIMER_MASK 0xff
|
|
|
|
#define PORT_MAP 4
|
|
|
|
#define PORT_MAP_MASK 0xff
|
|
|
|
#define ENT_STATUS 2
|
|
|
|
#define ENT_STATUS_MASK 0x3
|
|
|
|
|
|
|
|
/* Register for vlan table control */
|
|
|
|
#define MT7530_VTCR 0x90
|
|
|
|
#define VTCR_BUSY BIT(31)
|
2017-12-15 12:47:00 +08:00
|
|
|
#define VTCR_INVALID BIT(16)
|
|
|
|
#define VTCR_FUNC(x) (((x) & 0xf) << 12)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define VTCR_VID ((x) & 0xfff)
|
|
|
|
|
2017-12-15 12:47:00 +08:00
|
|
|
enum mt7530_vlan_cmd {
|
|
|
|
/* Read/Write the specified VID entry from VAWD register based
|
|
|
|
* on VID.
|
|
|
|
*/
|
|
|
|
MT7530_VTCR_RD_VID = 0,
|
|
|
|
MT7530_VTCR_WR_VID = 1,
|
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Register for setup vlan and acl write data */
|
|
|
|
#define MT7530_VAWD1 0x94
|
|
|
|
#define PORT_STAG BIT(31)
|
2017-12-15 12:47:00 +08:00
|
|
|
/* Independent VLAN Learning */
|
2017-04-07 16:45:09 +08:00
|
|
|
#define IVL_MAC BIT(30)
|
2021-08-25 00:52:52 +08:00
|
|
|
/* Egress Tag Consistent */
|
|
|
|
#define EG_CON BIT(29)
|
2017-12-15 12:47:00 +08:00
|
|
|
/* Per VLAN Egress Tag Control */
|
|
|
|
#define VTAG_EN BIT(28)
|
|
|
|
/* VLAN Member Control */
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PORT_MEM(x) (((x) & 0xff) << 16)
|
net: dsa: mt7530: use independent VLAN learning on VLAN-unaware bridges
Consider the following bridge configuration, where bond0 is not
offloaded:
+-- br0 --+
/ / | \
/ / | \
/ | | bond0
/ | | / \
swp0 swp1 swp2 swp3 swp4
. . .
. . .
A B C
Ideally, when the switch receives a packet from swp3 or swp4, it should
forward the packet to the CPU, according to the port matrix and unknown
unicast flood settings.
But packet loss will happen if the destination address is at one of the
offloaded ports (swp0~2). For example, when client C sends a packet to
A, the FDB lookup will indicate that it should be forwarded to swp0, but
the port matrix of swp3 and swp4 is configured to only allow the CPU to
be its destination, so it is dropped.
However, this issue does not happen if the bridge is VLAN-aware. That is
because VLAN-aware bridges use independent VLAN learning, i.e. use VID
for FDB lookup, on offloaded ports. As swp3 and swp4 are not offloaded,
shared VLAN learning with default filter ID of 0 is used instead. So the
lookup for A with filter ID 0 never hits and the packet can be forwarded
to the CPU.
In the current code, only two combinations were used to toggle user
ports' VLAN awareness: one is PCR.PORT_VLAN set to port matrix mode with
PVC.VLAN_ATTR set to transparent port, the other is PCR.PORT_VLAN set to
security mode with PVC.VLAN_ATTR set to user port.
It turns out that only PVC.VLAN_ATTR contributes to VLAN awareness, and
port matrix mode just skips the VLAN table lookup. The reference manual
is somehow misleading when describing PORT_VLAN modes. It states that
PORT_MEM (VLAN port member) is used for destination if the VLAN table
lookup hits, but actually **PORT_MEM & PORT_MATRIX** (bitwise AND of
VLAN port member and port matrix) is used instead, which means we can
have two or more separate VLAN-aware bridges with the same PVID and
traffic won't leak between them.
Therefore, to solve this, enable independent VLAN learning with PVID 0
on VLAN-unaware bridges, by setting their PCR.PORT_VLAN to fallback
mode, while leaving standalone ports in port matrix mode. The CPU port
is always set to fallback mode to serve those bridges.
During testing, it is found that FDB lookup with filter ID of 0 will
also hit entries with VID 0 even with independent VLAN learning. To
avoid that, install all VLANs with filter ID of 1.
Signed-off-by: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-08-04 00:04:02 +08:00
|
|
|
/* Filter ID */
|
|
|
|
#define FID(x) (((x) & 0x7) << 1)
|
2017-12-15 12:47:00 +08:00
|
|
|
/* VLAN Entry Valid */
|
|
|
|
#define VLAN_VALID BIT(0)
|
|
|
|
#define PORT_MEM_SHFT 16
|
|
|
|
#define PORT_MEM_MASK 0xff
|
2017-04-07 16:45:09 +08:00
|
|
|
|
net: dsa: mt7530: use independent VLAN learning on VLAN-unaware bridges
Consider the following bridge configuration, where bond0 is not
offloaded:
+-- br0 --+
/ / | \
/ / | \
/ | | bond0
/ | | / \
swp0 swp1 swp2 swp3 swp4
. . .
. . .
A B C
Ideally, when the switch receives a packet from swp3 or swp4, it should
forward the packet to the CPU, according to the port matrix and unknown
unicast flood settings.
But packet loss will happen if the destination address is at one of the
offloaded ports (swp0~2). For example, when client C sends a packet to
A, the FDB lookup will indicate that it should be forwarded to swp0, but
the port matrix of swp3 and swp4 is configured to only allow the CPU to
be its destination, so it is dropped.
However, this issue does not happen if the bridge is VLAN-aware. That is
because VLAN-aware bridges use independent VLAN learning, i.e. use VID
for FDB lookup, on offloaded ports. As swp3 and swp4 are not offloaded,
shared VLAN learning with default filter ID of 0 is used instead. So the
lookup for A with filter ID 0 never hits and the packet can be forwarded
to the CPU.
In the current code, only two combinations were used to toggle user
ports' VLAN awareness: one is PCR.PORT_VLAN set to port matrix mode with
PVC.VLAN_ATTR set to transparent port, the other is PCR.PORT_VLAN set to
security mode with PVC.VLAN_ATTR set to user port.
It turns out that only PVC.VLAN_ATTR contributes to VLAN awareness, and
port matrix mode just skips the VLAN table lookup. The reference manual
is somehow misleading when describing PORT_VLAN modes. It states that
PORT_MEM (VLAN port member) is used for destination if the VLAN table
lookup hits, but actually **PORT_MEM & PORT_MATRIX** (bitwise AND of
VLAN port member and port matrix) is used instead, which means we can
have two or more separate VLAN-aware bridges with the same PVID and
traffic won't leak between them.
Therefore, to solve this, enable independent VLAN learning with PVID 0
on VLAN-unaware bridges, by setting their PCR.PORT_VLAN to fallback
mode, while leaving standalone ports in port matrix mode. The CPU port
is always set to fallback mode to serve those bridges.
During testing, it is found that FDB lookup with filter ID of 0 will
also hit entries with VID 0 even with independent VLAN learning. To
avoid that, install all VLANs with filter ID of 1.
Signed-off-by: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-08-04 00:04:02 +08:00
|
|
|
enum mt7530_fid {
|
|
|
|
FID_STANDALONE = 0,
|
|
|
|
FID_BRIDGED = 1,
|
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_VAWD2 0x98
|
2017-12-15 12:47:00 +08:00
|
|
|
/* Egress Tag Control */
|
|
|
|
#define ETAG_CTRL_P(p, x) (((x) & 0x3) << ((p) << 1))
|
|
|
|
#define ETAG_CTRL_P_MASK(p) ETAG_CTRL_P(p, 3)
|
|
|
|
|
|
|
|
enum mt7530_vlan_egress_attr {
|
|
|
|
MT7530_VLAN_EGRESS_UNTAG = 0,
|
|
|
|
MT7530_VLAN_EGRESS_TAG = 2,
|
|
|
|
MT7530_VLAN_EGRESS_STACK = 3,
|
|
|
|
};
|
2017-04-07 16:45:09 +08:00
|
|
|
|
2020-12-08 15:00:28 +08:00
|
|
|
/* Register for address age control */
|
|
|
|
#define MT7530_AAC 0xa0
|
|
|
|
/* Disable ageing */
|
|
|
|
#define AGE_DIS BIT(20)
|
|
|
|
/* Age count */
|
|
|
|
#define AGE_CNT_MASK GENMASK(19, 12)
|
|
|
|
#define AGE_CNT_MAX 0xff
|
|
|
|
#define AGE_CNT(x) (AGE_CNT_MASK & ((x) << 12))
|
|
|
|
/* Age unit */
|
|
|
|
#define AGE_UNIT_MASK GENMASK(11, 0)
|
|
|
|
#define AGE_UNIT_MAX 0xfff
|
|
|
|
#define AGE_UNIT(x) (AGE_UNIT_MASK & (x))
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Register for port STP state control */
|
|
|
|
#define MT7530_SSP_P(x) (0x2000 + ((x) * 0x100))
|
2021-08-04 00:04:03 +08:00
|
|
|
#define FID_PST(fid, state) (((state) & 0x3) << ((fid) * 2))
|
|
|
|
#define FID_PST_MASK(fid) FID_PST(fid, 0x3)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
enum mt7530_stp_state {
|
|
|
|
MT7530_STP_DISABLED = 0,
|
|
|
|
MT7530_STP_BLOCKING = 1,
|
|
|
|
MT7530_STP_LISTENING = 1,
|
|
|
|
MT7530_STP_LEARNING = 2,
|
|
|
|
MT7530_STP_FORWARDING = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Register for port control */
|
|
|
|
#define MT7530_PCR_P(x) (0x2004 + ((x) * 0x100))
|
2020-03-06 20:35:35 +08:00
|
|
|
#define PORT_TX_MIR BIT(9)
|
|
|
|
#define PORT_RX_MIR BIT(8)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PORT_VLAN(x) ((x) & 0x3)
|
2017-12-15 12:47:00 +08:00
|
|
|
|
|
|
|
enum mt7530_port_mode {
|
|
|
|
/* Port Matrix Mode: Frames are forwarded by the PCR_MATRIX members. */
|
|
|
|
MT7530_PORT_MATRIX_MODE = PORT_VLAN(0),
|
|
|
|
|
2020-05-13 23:37:17 +08:00
|
|
|
/* Fallback Mode: Forward received frames with ingress ports that do
|
|
|
|
* not belong to the VLAN member. Frames whose VID is not listed on
|
|
|
|
* the VLAN table are forwarded by the PCR_MATRIX members.
|
|
|
|
*/
|
|
|
|
MT7530_PORT_FALLBACK_MODE = PORT_VLAN(1),
|
|
|
|
|
2017-12-15 12:47:00 +08:00
|
|
|
/* Security Mode: Discard any frame due to ingress membership
|
|
|
|
* violation or VID missed on the VLAN table.
|
|
|
|
*/
|
|
|
|
MT7530_PORT_SECURITY_MODE = PORT_VLAN(3),
|
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PCR_MATRIX(x) (((x) & 0xff) << 16)
|
|
|
|
#define PORT_PRI(x) (((x) & 0x7) << 24)
|
|
|
|
#define EG_TAG(x) (((x) & 0x3) << 28)
|
|
|
|
#define PCR_MATRIX_MASK PCR_MATRIX(0xff)
|
|
|
|
#define PCR_MATRIX_CLR PCR_MATRIX(0)
|
2017-12-15 12:47:00 +08:00
|
|
|
#define PCR_PORT_VLAN_MASK PORT_VLAN(3)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
/* Register for port security control */
|
|
|
|
#define MT7530_PSC_P(x) (0x200c + ((x) * 0x100))
|
|
|
|
#define SA_DIS BIT(4)
|
|
|
|
|
|
|
|
/* Register for port vlan control */
|
|
|
|
#define MT7530_PVC_P(x) (0x2010 + ((x) * 0x100))
|
|
|
|
#define PORT_SPEC_TAG BIT(5)
|
2020-04-14 14:34:08 +08:00
|
|
|
#define PVC_EG_TAG(x) (((x) & 0x7) << 8)
|
|
|
|
#define PVC_EG_TAG_MASK PVC_EG_TAG(7)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define VLAN_ATTR(x) (((x) & 0x3) << 6)
|
2017-12-15 12:47:00 +08:00
|
|
|
#define VLAN_ATTR_MASK VLAN_ATTR(3)
|
2021-08-06 11:47:11 +08:00
|
|
|
#define ACC_FRM_MASK GENMASK(1, 0)
|
2017-12-15 12:47:00 +08:00
|
|
|
|
2020-04-14 14:34:08 +08:00
|
|
|
enum mt7530_vlan_port_eg_tag {
|
|
|
|
MT7530_VLAN_EG_DISABLED = 0,
|
|
|
|
MT7530_VLAN_EG_CONSISTENT = 1,
|
net: dsa: mt7530: fix link-local frames that ingress vlan filtering ports
Whether VLAN-aware or not, on every VID VLAN table entry that has the CPU
port as a member of it, frames are set to egress the CPU port with the VLAN
tag stacked. This is so that VLAN tags can be appended after hardware
special tag (called DSA tag in the context of Linux drivers).
For user ports on a VLAN-unaware bridge, frame ingressing the user port
egresses CPU port with only the special tag.
For user ports on a VLAN-aware bridge, frame ingressing the user port
egresses CPU port with the special tag and the VLAN tag.
This causes issues with link-local frames, specifically BPDUs, because the
software expects to receive them VLAN-untagged.
There are two options to make link-local frames egress untagged. Setting
CONSISTENT or UNTAGGED on the EG_TAG bits on the relevant register.
CONSISTENT means frames egress exactly as they ingress. That means
egressing with the VLAN tag they had at ingress or egressing untagged if
they ingressed untagged. Although link-local frames are not supposed to be
transmitted VLAN-tagged, if they are done so, when egressing through a CPU
port, the special tag field will be broken.
BPDU egresses CPU port with VLAN tag egressing stacked, received on
software:
00:01:25.104821 AF Unknown (382365846), length 106:
| STAG | | VLAN |
0x0000: 0000 6c27 614d 4143 0001 0000 8100 0001 ..l'aMAC........
0x0010: 0026 4242 0300 0000 0000 0000 6c27 614d .&BB........l'aM
0x0020: 4143 0000 0000 0000 6c27 614d 4143 0000 AC......l'aMAC..
0x0030: 0000 1400 0200 0f00 0000 0000 0000 0000 ................
BPDU egresses CPU port with VLAN tag egressing untagged, received on
software:
00:23:56.628708 AF Unknown (25215488), length 64:
| STAG |
0x0000: 0000 6c27 614d 4143 0001 0000 0026 4242 ..l'aMAC.....&BB
0x0010: 0300 0000 0000 0000 6c27 614d 4143 0000 ........l'aMAC..
0x0020: 0000 0000 6c27 614d 4143 0000 0000 1400 ....l'aMAC......
0x0030: 0200 0f00 0000 0000 0000 0000 ............
BPDU egresses CPU port with VLAN tag egressing tagged, received on
software:
00:01:34.311963 AF Unknown (25215488), length 64:
| Mess |
0x0000: 0000 6c27 614d 4143 0001 0001 0026 4242 ..l'aMAC.....&BB
0x0010: 0300 0000 0000 0000 6c27 614d 4143 0000 ........l'aMAC..
0x0020: 0000 0000 6c27 614d 4143 0000 0000 1400 ....l'aMAC......
0x0030: 0200 0f00 0000 0000 0000 0000 ............
To prevent confusing the software, force the frame to egress UNTAGGED
instead of CONSISTENT. This way, frames can't possibly be received TAGGED
by software which would have the special tag field broken.
VLAN Tag Egress Procedure
For all frames, one of these options set the earliest in this order will
apply to the frame:
- EG_TAG in certain registers for certain frames.
This will apply to frame with matching MAC DA or EtherType.
- EG_TAG in the address table.
This will apply to frame at its incoming port.
- EG_TAG in the PVC register.
This will apply to frame at its incoming port.
- EG_CON and [EG_TAG per port] in the VLAN table.
This will apply to frame at its outgoing port.
- EG_TAG in the PCR register.
This will apply to frame at its outgoing port.
EG_TAG in certain registers for certain frames:
PPPoE Discovery_ARP/RARP: PPP_EG_TAG and ARP_EG_TAG in the APC register.
IGMP_MLD: IGMP_EG_TAG and MLD_EG_TAG in the IMC register.
BPDU and PAE: BPDU_EG_TAG and PAE_EG_TAG in the BPC register.
REV_01 and REV_02: R01_EG_TAG and R02_EG_TAG in the RGAC1 register.
REV_03 and REV_0E: R03_EG_TAG and R0E_EG_TAG in the RGAC2 register.
REV_10 and REV_20: R10_EG_TAG and R20_EG_TAG in the RGAC3 register.
REV_21 and REV_UN: R21_EG_TAG and RUN_EG_TAG in the RGAC4 register.
With this change, it can be observed that a bridge interface with stp_state
and vlan_filtering enabled will properly block ports now.
Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch")
Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2024-03-14 12:33:41 +03:00
|
|
|
MT7530_VLAN_EG_UNTAGGED = 4,
|
2020-04-14 14:34:08 +08:00
|
|
|
};
|
|
|
|
|
2017-12-15 12:47:00 +08:00
|
|
|
enum mt7530_vlan_port_attr {
|
|
|
|
MT7530_VLAN_USER = 0,
|
|
|
|
MT7530_VLAN_TRANSPARENT = 3,
|
|
|
|
};
|
|
|
|
|
2021-08-06 11:47:11 +08:00
|
|
|
enum mt7530_vlan_port_acc_frm {
|
|
|
|
MT7530_VLAN_ACC_ALL = 0,
|
|
|
|
MT7530_VLAN_ACC_TAGGED = 1,
|
|
|
|
MT7530_VLAN_ACC_UNTAGGED = 2,
|
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define STAG_VPID (((x) & 0xffff) << 16)
|
|
|
|
|
|
|
|
/* Register for port port-and-protocol based vlan 1 control */
|
|
|
|
#define MT7530_PPBV1_P(x) (0x2014 + ((x) * 0x100))
|
2017-12-15 12:47:00 +08:00
|
|
|
#define G0_PORT_VID(x) (((x) & 0xfff) << 0)
|
|
|
|
#define G0_PORT_VID_MASK G0_PORT_VID(0xfff)
|
net: dsa: mt7530: use independent VLAN learning on VLAN-unaware bridges
Consider the following bridge configuration, where bond0 is not
offloaded:
+-- br0 --+
/ / | \
/ / | \
/ | | bond0
/ | | / \
swp0 swp1 swp2 swp3 swp4
. . .
. . .
A B C
Ideally, when the switch receives a packet from swp3 or swp4, it should
forward the packet to the CPU, according to the port matrix and unknown
unicast flood settings.
But packet loss will happen if the destination address is at one of the
offloaded ports (swp0~2). For example, when client C sends a packet to
A, the FDB lookup will indicate that it should be forwarded to swp0, but
the port matrix of swp3 and swp4 is configured to only allow the CPU to
be its destination, so it is dropped.
However, this issue does not happen if the bridge is VLAN-aware. That is
because VLAN-aware bridges use independent VLAN learning, i.e. use VID
for FDB lookup, on offloaded ports. As swp3 and swp4 are not offloaded,
shared VLAN learning with default filter ID of 0 is used instead. So the
lookup for A with filter ID 0 never hits and the packet can be forwarded
to the CPU.
In the current code, only two combinations were used to toggle user
ports' VLAN awareness: one is PCR.PORT_VLAN set to port matrix mode with
PVC.VLAN_ATTR set to transparent port, the other is PCR.PORT_VLAN set to
security mode with PVC.VLAN_ATTR set to user port.
It turns out that only PVC.VLAN_ATTR contributes to VLAN awareness, and
port matrix mode just skips the VLAN table lookup. The reference manual
is somehow misleading when describing PORT_VLAN modes. It states that
PORT_MEM (VLAN port member) is used for destination if the VLAN table
lookup hits, but actually **PORT_MEM & PORT_MATRIX** (bitwise AND of
VLAN port member and port matrix) is used instead, which means we can
have two or more separate VLAN-aware bridges with the same PVID and
traffic won't leak between them.
Therefore, to solve this, enable independent VLAN learning with PVID 0
on VLAN-unaware bridges, by setting their PCR.PORT_VLAN to fallback
mode, while leaving standalone ports in port matrix mode. The CPU port
is always set to fallback mode to serve those bridges.
During testing, it is found that FDB lookup with filter ID of 0 will
also hit entries with VID 0 even with independent VLAN learning. To
avoid that, install all VLANs with filter ID of 1.
Signed-off-by: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-08-04 00:04:02 +08:00
|
|
|
#define G0_PORT_VID_DEF G0_PORT_VID(0)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
/* Register for port MAC control register */
|
2024-04-22 10:15:09 +03:00
|
|
|
#define MT753X_PMCR_P(x) (0x3000 + ((x) * 0x100))
|
|
|
|
#define PMCR_IFG_XMIT_MASK GENMASK(19, 18)
|
|
|
|
#define PMCR_IFG_XMIT(x) FIELD_PREP(PMCR_IFG_XMIT_MASK, x)
|
2019-09-02 15:02:26 +02:00
|
|
|
#define PMCR_EXT_PHY BIT(17)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PMCR_MAC_MODE BIT(16)
|
2024-04-22 10:15:09 +03:00
|
|
|
#define MT7530_FORCE_MODE BIT(15)
|
|
|
|
#define PMCR_MAC_TX_EN BIT(14)
|
|
|
|
#define PMCR_MAC_RX_EN BIT(13)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PMCR_BACKOFF_EN BIT(9)
|
|
|
|
#define PMCR_BACKPR_EN BIT(8)
|
2021-04-12 08:50:31 +02:00
|
|
|
#define PMCR_FORCE_EEE1G BIT(7)
|
|
|
|
#define PMCR_FORCE_EEE100 BIT(6)
|
2024-04-22 10:15:09 +03:00
|
|
|
#define PMCR_FORCE_RX_FC_EN BIT(5)
|
|
|
|
#define PMCR_FORCE_TX_FC_EN BIT(4)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PMCR_FORCE_SPEED_1000 BIT(3)
|
2017-08-07 16:20:49 +02:00
|
|
|
#define PMCR_FORCE_SPEED_100 BIT(2)
|
2017-04-07 16:45:09 +08:00
|
|
|
#define PMCR_FORCE_FDX BIT(1)
|
|
|
|
#define PMCR_FORCE_LNK BIT(0)
|
2024-04-22 10:15:09 +03:00
|
|
|
#define MT7531_FORCE_MODE_LNK BIT(31)
|
|
|
|
#define MT7531_FORCE_MODE_SPD BIT(30)
|
|
|
|
#define MT7531_FORCE_MODE_DPX BIT(29)
|
|
|
|
#define MT7531_FORCE_MODE_RX_FC BIT(28)
|
|
|
|
#define MT7531_FORCE_MODE_TX_FC BIT(27)
|
|
|
|
#define MT7531_FORCE_MODE_EEE100 BIT(26)
|
|
|
|
#define MT7531_FORCE_MODE_EEE1G BIT(25)
|
|
|
|
#define MT7531_FORCE_MODE_MASK (MT7531_FORCE_MODE_LNK | \
|
|
|
|
MT7531_FORCE_MODE_SPD | \
|
|
|
|
MT7531_FORCE_MODE_DPX | \
|
|
|
|
MT7531_FORCE_MODE_RX_FC | \
|
|
|
|
MT7531_FORCE_MODE_TX_FC | \
|
|
|
|
MT7531_FORCE_MODE_EEE100 | \
|
|
|
|
MT7531_FORCE_MODE_EEE1G)
|
|
|
|
#define PMCR_LINK_SETTINGS_MASK (PMCR_MAC_TX_EN | PMCR_MAC_RX_EN | \
|
|
|
|
PMCR_FORCE_EEE1G | \
|
|
|
|
PMCR_FORCE_EEE100 | \
|
|
|
|
PMCR_FORCE_RX_FC_EN | \
|
|
|
|
PMCR_FORCE_TX_FC_EN | \
|
|
|
|
PMCR_FORCE_SPEED_1000 | \
|
|
|
|
PMCR_FORCE_SPEED_100 | \
|
|
|
|
PMCR_FORCE_FDX | PMCR_FORCE_LNK)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
2024-04-22 10:15:18 +03:00
|
|
|
#define MT753X_PMEEECR_P(x) (0x3004 + (x) * 0x100)
|
|
|
|
#define WAKEUP_TIME_1000_MASK GENMASK(31, 24)
|
|
|
|
#define WAKEUP_TIME_1000(x) FIELD_PREP(WAKEUP_TIME_1000_MASK, x)
|
|
|
|
#define WAKEUP_TIME_100_MASK GENMASK(23, 16)
|
|
|
|
#define WAKEUP_TIME_100(x) FIELD_PREP(WAKEUP_TIME_100_MASK, x)
|
2021-04-12 08:50:31 +02:00
|
|
|
#define LPI_THRESH_MASK GENMASK(15, 4)
|
2024-04-22 10:15:18 +03:00
|
|
|
#define LPI_THRESH_GET(x) FIELD_GET(LPI_THRESH_MASK, x)
|
|
|
|
#define LPI_THRESH_SET(x) FIELD_PREP(LPI_THRESH_MASK, x)
|
2021-04-12 08:50:31 +02:00
|
|
|
#define LPI_MODE_EN BIT(0)
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_PMSR_P(x) (0x3008 + (x) * 0x100)
|
2019-09-02 15:02:24 +02:00
|
|
|
#define PMSR_EEE1G BIT(7)
|
|
|
|
#define PMSR_EEE100M BIT(6)
|
|
|
|
#define PMSR_RX_FC BIT(5)
|
|
|
|
#define PMSR_TX_FC BIT(4)
|
|
|
|
#define PMSR_SPEED_1000 BIT(3)
|
|
|
|
#define PMSR_SPEED_100 BIT(2)
|
|
|
|
#define PMSR_SPEED_10 0x00
|
|
|
|
#define PMSR_SPEED_MASK (PMSR_SPEED_100 | PMSR_SPEED_1000)
|
|
|
|
#define PMSR_DPX BIT(1)
|
|
|
|
#define PMSR_LINK BIT(0)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
/* Register for port debug count */
|
|
|
|
#define MT7531_DBG_CNT(x) (0x3018 + (x) * 0x100)
|
|
|
|
#define MT7531_DIS_CLR BIT(31)
|
|
|
|
|
2020-11-03 13:06:18 +08:00
|
|
|
#define MT7530_GMACCR 0x30e0
|
|
|
|
#define MAX_RX_JUMBO(x) ((x) << 2)
|
|
|
|
#define MAX_RX_JUMBO_MASK GENMASK(5, 2)
|
|
|
|
#define MAX_RX_PKT_LEN_MASK GENMASK(1, 0)
|
|
|
|
#define MAX_RX_PKT_LEN_1522 0x0
|
|
|
|
#define MAX_RX_PKT_LEN_1536 0x1
|
|
|
|
#define MAX_RX_PKT_LEN_1552 0x2
|
|
|
|
#define MAX_RX_PKT_LEN_JUMBO 0x3
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Register for MIB */
|
|
|
|
#define MT7530_PORT_MIB_COUNTER(x) (0x4000 + (x) * 0x100)
|
|
|
|
#define MT7530_MIB_CCR 0x4fe0
|
|
|
|
#define CCR_MIB_ENABLE BIT(31)
|
|
|
|
#define CCR_RX_OCT_CNT_GOOD BIT(7)
|
|
|
|
#define CCR_RX_OCT_CNT_BAD BIT(6)
|
|
|
|
#define CCR_TX_OCT_CNT_GOOD BIT(5)
|
|
|
|
#define CCR_TX_OCT_CNT_BAD BIT(4)
|
|
|
|
#define CCR_MIB_FLUSH (CCR_RX_OCT_CNT_GOOD | \
|
|
|
|
CCR_RX_OCT_CNT_BAD | \
|
|
|
|
CCR_TX_OCT_CNT_GOOD | \
|
|
|
|
CCR_TX_OCT_CNT_BAD)
|
|
|
|
#define CCR_MIB_ACTIVATE (CCR_MIB_ENABLE | \
|
|
|
|
CCR_RX_OCT_CNT_GOOD | \
|
|
|
|
CCR_RX_OCT_CNT_BAD | \
|
|
|
|
CCR_TX_OCT_CNT_GOOD | \
|
|
|
|
CCR_TX_OCT_CNT_BAD)
|
2020-09-11 21:48:54 +08:00
|
|
|
|
|
|
|
/* MT7531 SGMII register group */
|
2023-03-19 12:58:43 +00:00
|
|
|
#define MT7531_SGMII_REG_BASE(p) (0x5000 + ((p) - 5) * 0x1000)
|
|
|
|
#define MT7531_PHYA_CTRL_SIGNAL3 0x128
|
2020-09-11 21:48:54 +08:00
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Register for system reset */
|
|
|
|
#define MT7530_SYS_CTRL 0x7000
|
|
|
|
#define SYS_CTRL_PHY_RST BIT(2)
|
|
|
|
#define SYS_CTRL_SW_RST BIT(1)
|
|
|
|
#define SYS_CTRL_REG_RST BIT(0)
|
|
|
|
|
2021-05-19 11:32:00 +08:00
|
|
|
/* Register for system interrupt */
|
|
|
|
#define MT7530_SYS_INT_EN 0x7008
|
|
|
|
|
|
|
|
/* Register for system interrupt status */
|
|
|
|
#define MT7530_SYS_INT_STS 0x700c
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
/* Register for PHY Indirect Access Control */
|
|
|
|
#define MT7531_PHY_IAC 0x701C
|
|
|
|
#define MT7531_PHY_ACS_ST BIT(31)
|
|
|
|
#define MT7531_MDIO_REG_ADDR_MASK (0x1f << 25)
|
|
|
|
#define MT7531_MDIO_PHY_ADDR_MASK (0x1f << 20)
|
|
|
|
#define MT7531_MDIO_CMD_MASK (0x3 << 18)
|
|
|
|
#define MT7531_MDIO_ST_MASK (0x3 << 16)
|
|
|
|
#define MT7531_MDIO_RW_DATA_MASK (0xffff)
|
|
|
|
#define MT7531_MDIO_REG_ADDR(x) (((x) & 0x1f) << 25)
|
|
|
|
#define MT7531_MDIO_DEV_ADDR(x) (((x) & 0x1f) << 25)
|
|
|
|
#define MT7531_MDIO_PHY_ADDR(x) (((x) & 0x1f) << 20)
|
|
|
|
#define MT7531_MDIO_CMD(x) (((x) & 0x3) << 18)
|
|
|
|
#define MT7531_MDIO_ST(x) (((x) & 0x3) << 16)
|
|
|
|
|
|
|
|
enum mt7531_phy_iac_cmd {
|
|
|
|
MT7531_MDIO_ADDR = 0,
|
|
|
|
MT7531_MDIO_WRITE = 1,
|
|
|
|
MT7531_MDIO_READ = 2,
|
|
|
|
MT7531_MDIO_READ_CL45 = 3,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* MDIO_ST: MDIO start field */
|
|
|
|
enum mt7531_mdio_st {
|
|
|
|
MT7531_MDIO_ST_CL45 = 0,
|
|
|
|
MT7531_MDIO_ST_CL22 = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define MT7531_MDIO_CL22_READ (MT7531_MDIO_ST(MT7531_MDIO_ST_CL22) | \
|
|
|
|
MT7531_MDIO_CMD(MT7531_MDIO_READ))
|
|
|
|
#define MT7531_MDIO_CL22_WRITE (MT7531_MDIO_ST(MT7531_MDIO_ST_CL22) | \
|
|
|
|
MT7531_MDIO_CMD(MT7531_MDIO_WRITE))
|
|
|
|
#define MT7531_MDIO_CL45_ADDR (MT7531_MDIO_ST(MT7531_MDIO_ST_CL45) | \
|
|
|
|
MT7531_MDIO_CMD(MT7531_MDIO_ADDR))
|
|
|
|
#define MT7531_MDIO_CL45_READ (MT7531_MDIO_ST(MT7531_MDIO_ST_CL45) | \
|
|
|
|
MT7531_MDIO_CMD(MT7531_MDIO_READ))
|
|
|
|
#define MT7531_MDIO_CL45_WRITE (MT7531_MDIO_ST(MT7531_MDIO_ST_CL45) | \
|
|
|
|
MT7531_MDIO_CMD(MT7531_MDIO_WRITE))
|
|
|
|
|
|
|
|
/* Register for RGMII clock phase */
|
|
|
|
#define MT7531_CLKGEN_CTRL 0x7500
|
|
|
|
#define CLK_SKEW_OUT(x) (((x) & 0x3) << 8)
|
|
|
|
#define CLK_SKEW_OUT_MASK GENMASK(9, 8)
|
|
|
|
#define CLK_SKEW_IN(x) (((x) & 0x3) << 6)
|
|
|
|
#define CLK_SKEW_IN_MASK GENMASK(7, 6)
|
|
|
|
#define RXCLK_NO_DELAY BIT(5)
|
|
|
|
#define TXCLK_NO_REVERSE BIT(4)
|
|
|
|
#define GP_MODE(x) (((x) & 0x3) << 1)
|
|
|
|
#define GP_MODE_MASK GENMASK(2, 1)
|
|
|
|
#define GP_CLK_EN BIT(0)
|
|
|
|
|
|
|
|
enum mt7531_gp_mode {
|
|
|
|
MT7531_GP_MODE_RGMII = 0,
|
|
|
|
MT7531_GP_MODE_MII = 1,
|
|
|
|
MT7531_GP_MODE_REV_MII = 2
|
|
|
|
};
|
|
|
|
|
|
|
|
enum mt7531_clk_skew {
|
|
|
|
MT7531_CLK_SKEW_NO_CHG = 0,
|
|
|
|
MT7531_CLK_SKEW_DLY_100PPS = 1,
|
|
|
|
MT7531_CLK_SKEW_DLY_200PPS = 2,
|
|
|
|
MT7531_CLK_SKEW_REVERSE = 3,
|
|
|
|
};
|
|
|
|
|
2024-04-22 10:15:13 +03:00
|
|
|
/* Register for trap status */
|
|
|
|
#define MT753X_TRAP 0x7800
|
|
|
|
#define MT7530_XTAL_MASK (BIT(10) | BIT(9))
|
|
|
|
#define MT7530_XTAL_25MHZ (BIT(10) | BIT(9))
|
|
|
|
#define MT7530_XTAL_40MHZ BIT(10)
|
|
|
|
#define MT7530_XTAL_20MHZ BIT(9)
|
|
|
|
#define MT7531_XTAL25 BIT(7)
|
|
|
|
|
|
|
|
/* Register for trap modification */
|
|
|
|
#define MT753X_MTRAP 0x7804
|
|
|
|
#define MT7530_P5_PHY0_SEL BIT(20)
|
|
|
|
#define MT7530_CHG_TRAP BIT(16)
|
|
|
|
#define MT7530_P5_MAC_SEL BIT(13)
|
|
|
|
#define MT7530_P6_DIS BIT(8)
|
|
|
|
#define MT7530_P5_RGMII_MODE BIT(7)
|
|
|
|
#define MT7530_P5_DIS BIT(6)
|
|
|
|
#define MT7530_PHY_INDIRECT_ACCESS BIT(5)
|
|
|
|
#define MT7531_CHG_STRAP BIT(8)
|
|
|
|
#define MT7531_PHY_EN BIT(6)
|
|
|
|
|
|
|
|
enum mt7531_xtal_fsel {
|
|
|
|
MT7531_XTAL_FSEL_25MHZ,
|
|
|
|
MT7531_XTAL_FSEL_40MHZ,
|
|
|
|
};
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
/* Register for TOP signal control */
|
|
|
|
#define MT7530_TOP_SIG_CTRL 0x7808
|
|
|
|
#define TOP_SIG_CTRL_NORMAL (BIT(17) | BIT(16))
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_TOP_SIG_SR 0x780c
|
|
|
|
#define PAD_DUAL_SGMII_EN BIT(1)
|
|
|
|
#define PAD_MCM_SMI_EN BIT(0)
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_IO_DRV_CR 0x7810
|
|
|
|
#define P5_IO_CLK_DRV(x) ((x) & 0x3)
|
|
|
|
#define P5_IO_DATA_DRV(x) (((x) & 0x3) << 4)
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_CHIP_REV 0x781C
|
|
|
|
|
|
|
|
#define MT7531_PLLGP_EN 0x7820
|
|
|
|
#define EN_COREPLL BIT(2)
|
|
|
|
#define SW_CLKSW BIT(1)
|
|
|
|
#define SW_PLLGP BIT(0)
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_P6ECR 0x7830
|
|
|
|
#define P6_INTF_MODE_MASK 0x3
|
|
|
|
#define P6_INTF_MODE(x) ((x) & 0x3)
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_PLLGP_CR0 0x78a8
|
|
|
|
#define RG_COREPLL_EN BIT(22)
|
|
|
|
#define RG_COREPLL_POSDIV_S 23
|
|
|
|
#define RG_COREPLL_POSDIV_M 0x3800000
|
|
|
|
#define RG_COREPLL_SDM_PCW_S 1
|
|
|
|
#define RG_COREPLL_SDM_PCW_M 0x3ffffe
|
|
|
|
#define RG_COREPLL_SDM_PCW_CHG BIT(0)
|
|
|
|
|
|
|
|
/* Registers for RGMII and SGMII PLL clock */
|
|
|
|
#define MT7531_ANA_PLLGP_CR2 0x78b0
|
|
|
|
#define MT7531_ANA_PLLGP_CR5 0x78bc
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Registers for TRGMII on the both side */
|
|
|
|
#define MT7530_TRGMII_RCK_CTRL 0x7a00
|
|
|
|
#define RX_RST BIT(31)
|
|
|
|
#define RXC_DQSISEL BIT(30)
|
|
|
|
#define DQSI1_TAP_MASK (0x7f << 8)
|
|
|
|
#define DQSI0_TAP_MASK 0x7f
|
|
|
|
#define DQSI1_TAP(x) (((x) & 0x7f) << 8)
|
|
|
|
#define DQSI0_TAP(x) ((x) & 0x7f)
|
|
|
|
|
|
|
|
#define MT7530_TRGMII_RCK_RTT 0x7a04
|
|
|
|
#define DQS1_GATE BIT(31)
|
|
|
|
#define DQS0_GATE BIT(30)
|
|
|
|
|
|
|
|
#define MT7530_TRGMII_RD(x) (0x7a10 + (x) * 8)
|
|
|
|
#define BSLIP_EN BIT(31)
|
|
|
|
#define EDGE_CHK BIT(30)
|
|
|
|
#define RD_TAP_MASK 0x7f
|
|
|
|
#define RD_TAP(x) ((x) & 0x7f)
|
|
|
|
|
|
|
|
#define MT7530_TRGMII_TXCTRL 0x7a40
|
|
|
|
#define TRAIN_TXEN BIT(31)
|
|
|
|
#define TXC_INV BIT(30)
|
|
|
|
#define TX_RST BIT(28)
|
|
|
|
|
|
|
|
#define MT7530_TRGMII_TD_ODT(i) (0x7a54 + 8 * (i))
|
|
|
|
#define TD_DM_DRVP(x) ((x) & 0xf)
|
|
|
|
#define TD_DM_DRVN(x) (((x) & 0xf) << 4)
|
|
|
|
|
|
|
|
#define MT7530_TRGMII_TCK_CTRL 0x7a78
|
|
|
|
#define TCK_TAP(x) (((x) & 0xf) << 8)
|
|
|
|
|
|
|
|
#define MT7530_P5RGMIIRXCR 0x7b00
|
|
|
|
#define CSR_RGMII_EDGE_ALIGN BIT(8)
|
|
|
|
#define CSR_RGMII_RXC_0DEG_CFG(x) ((x) & 0xf)
|
|
|
|
|
|
|
|
#define MT7530_P5RGMIITXCR 0x7b04
|
|
|
|
#define CSR_RGMII_TXC_CFG(x) ((x) & 0x1f)
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
/* Registers for GPIO mode */
|
|
|
|
#define MT7531_GPIO_MODE0 0x7c0c
|
|
|
|
#define MT7531_GPIO0_MASK GENMASK(3, 0)
|
|
|
|
#define MT7531_GPIO0_INTERRUPT 1
|
|
|
|
|
|
|
|
#define MT7531_GPIO_MODE1 0x7c10
|
|
|
|
#define MT7531_GPIO11_RG_RXD2_MASK GENMASK(15, 12)
|
|
|
|
#define MT7531_EXT_P_MDC_11 (2 << 12)
|
|
|
|
#define MT7531_GPIO12_RG_RXD3_MASK GENMASK(19, 16)
|
|
|
|
#define MT7531_EXT_P_MDIO_12 (2 << 16)
|
|
|
|
|
2021-01-25 12:43:22 +08:00
|
|
|
/* Registers for LED GPIO control (MT7530 only)
|
|
|
|
* All registers follow this pattern:
|
|
|
|
* [ 2: 0] port 0
|
|
|
|
* [ 6: 4] port 1
|
|
|
|
* [10: 8] port 2
|
|
|
|
* [14:12] port 3
|
|
|
|
* [18:16] port 4
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* LED enable, 0: Disable, 1: Enable (Default) */
|
|
|
|
#define MT7530_LED_EN 0x7d00
|
|
|
|
/* LED mode, 0: GPIO mode, 1: PHY mode (Default) */
|
|
|
|
#define MT7530_LED_IO_MODE 0x7d04
|
|
|
|
/* GPIO direction, 0: Input, 1: Output */
|
|
|
|
#define MT7530_LED_GPIO_DIR 0x7d10
|
|
|
|
/* GPIO output enable, 0: Disable, 1: Enable */
|
|
|
|
#define MT7530_LED_GPIO_OE 0x7d14
|
|
|
|
/* GPIO value, 0: Low, 1: High */
|
|
|
|
#define MT7530_LED_GPIO_DATA 0x7d18
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#define MT7530_CREV 0x7ffc
|
|
|
|
#define CHIP_NAME_SHIFT 16
|
|
|
|
#define MT7530_ID 0x7530
|
|
|
|
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_CREV 0x781C
|
|
|
|
#define CHIP_REV_M 0x0f
|
|
|
|
#define MT7531_ID 0x7531
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* Registers for core PLL access through mmd indirect */
|
|
|
|
#define CORE_PLL_GROUP2 0x401
|
|
|
|
#define RG_SYSPLL_EN_NORMAL BIT(15)
|
|
|
|
#define RG_SYSPLL_VODEN BIT(14)
|
|
|
|
#define RG_SYSPLL_LF BIT(13)
|
|
|
|
#define RG_SYSPLL_RST_DLY(x) (((x) & 0x3) << 12)
|
|
|
|
#define RG_SYSPLL_LVROD_EN BIT(10)
|
|
|
|
#define RG_SYSPLL_PREDIV(x) (((x) & 0x3) << 8)
|
|
|
|
#define RG_SYSPLL_POSDIV(x) (((x) & 0x3) << 5)
|
|
|
|
#define RG_SYSPLL_FBKSEL BIT(4)
|
|
|
|
#define RT_SYSPLL_EN_AFE_OLT BIT(0)
|
|
|
|
|
|
|
|
#define CORE_PLL_GROUP4 0x403
|
|
|
|
#define RG_SYSPLL_DDSFBK_EN BIT(12)
|
|
|
|
#define RG_SYSPLL_BIAS_EN BIT(11)
|
|
|
|
#define RG_SYSPLL_BIAS_LPF_EN BIT(10)
|
2024-04-08 10:08:53 +03:00
|
|
|
#define MT7531_RG_SYSPLL_DMY2 BIT(6)
|
2020-09-11 21:48:54 +08:00
|
|
|
#define MT7531_PHY_PLL_OFF BIT(5)
|
|
|
|
#define MT7531_PHY_PLL_BYPASS_MODE BIT(4)
|
|
|
|
|
2024-04-18 08:35:30 +03:00
|
|
|
#define MT753X_CTRL_PHY_ADDR(addr) ((addr + 1) & 0x1f)
|
2017-04-07 16:45:09 +08:00
|
|
|
|
|
|
|
#define CORE_PLL_GROUP5 0x404
|
|
|
|
#define RG_LCDDS_PCW_NCPO1(x) ((x) & 0xffff)
|
|
|
|
|
|
|
|
#define CORE_PLL_GROUP6 0x405
|
|
|
|
#define RG_LCDDS_PCW_NCPO0(x) ((x) & 0xffff)
|
|
|
|
|
|
|
|
#define CORE_PLL_GROUP7 0x406
|
|
|
|
#define RG_LCDDS_PWDB BIT(15)
|
|
|
|
#define RG_LCDDS_ISO_EN BIT(13)
|
|
|
|
#define RG_LCCDS_C(x) (((x) & 0x7) << 4)
|
|
|
|
#define RG_LCDDS_PCW_NCPO_CHG BIT(3)
|
|
|
|
|
|
|
|
#define CORE_PLL_GROUP10 0x409
|
|
|
|
#define RG_LCDDS_SSC_DELTA(x) ((x) & 0xfff)
|
|
|
|
|
|
|
|
#define CORE_PLL_GROUP11 0x40a
|
|
|
|
#define RG_LCDDS_SSC_DELTA1(x) ((x) & 0xfff)
|
|
|
|
|
|
|
|
#define CORE_GSWPLL_GRP1 0x40d
|
|
|
|
#define RG_GSWPLL_PREDIV(x) (((x) & 0x3) << 14)
|
|
|
|
#define RG_GSWPLL_POSDIV_200M(x) (((x) & 0x3) << 12)
|
|
|
|
#define RG_GSWPLL_EN_PRE BIT(11)
|
|
|
|
#define RG_GSWPLL_FBKSEL BIT(10)
|
|
|
|
#define RG_GSWPLL_BP BIT(9)
|
|
|
|
#define RG_GSWPLL_BR BIT(8)
|
|
|
|
#define RG_GSWPLL_FBKDIV_200M(x) ((x) & 0xff)
|
|
|
|
|
|
|
|
#define CORE_GSWPLL_GRP2 0x40e
|
|
|
|
#define RG_GSWPLL_POSDIV_500M(x) (((x) & 0x3) << 8)
|
|
|
|
#define RG_GSWPLL_FBKDIV_500M(x) ((x) & 0xff)
|
|
|
|
|
|
|
|
#define CORE_TRGMII_GSW_CLK_CG 0x410
|
|
|
|
#define REG_GSWCK_EN BIT(0)
|
|
|
|
#define REG_TRGMIICK_EN BIT(1)
|
|
|
|
|
|
|
|
#define MIB_DESC(_s, _o, _n) \
|
|
|
|
{ \
|
|
|
|
.size = (_s), \
|
|
|
|
.offset = (_o), \
|
|
|
|
.name = (_n), \
|
|
|
|
}
|
|
|
|
|
|
|
|
struct mt7530_mib_desc {
|
|
|
|
unsigned int size;
|
|
|
|
unsigned int offset;
|
|
|
|
const char *name;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mt7530_fdb {
|
|
|
|
u16 vid;
|
|
|
|
u8 port_mask;
|
|
|
|
u8 aging;
|
|
|
|
u8 mac[6];
|
|
|
|
bool noarp;
|
|
|
|
};
|
|
|
|
|
2017-12-15 12:47:00 +08:00
|
|
|
/* struct mt7530_port - This is the main data structure for holding the state
|
|
|
|
* of the port.
|
|
|
|
* @enable: The status used for show port is enabled or not.
|
|
|
|
* @pm: The matrix used to show all connections with the port.
|
|
|
|
* @pvid: The VLAN specified is to be considered a PVID at ingress. Any
|
|
|
|
* untagged frames will be assigned to the related VLAN.
|
2023-03-19 12:58:43 +00:00
|
|
|
* @sgmii_pcs: Pointer to PCS instance for SerDes ports
|
2017-12-15 12:47:00 +08:00
|
|
|
*/
|
2017-04-07 16:45:09 +08:00
|
|
|
struct mt7530_port {
|
|
|
|
bool enable;
|
|
|
|
u32 pm;
|
2017-12-15 12:47:00 +08:00
|
|
|
u16 pvid;
|
2023-03-19 12:58:43 +00:00
|
|
|
struct phylink_pcs *sgmii_pcs;
|
2017-04-07 16:45:09 +08:00
|
|
|
};
|
|
|
|
|
2024-04-22 10:15:10 +03:00
|
|
|
/* Port 5 mode definitions of the MT7530 switch */
|
|
|
|
enum mt7530_p5_mode {
|
|
|
|
GMAC5,
|
|
|
|
MUX_PHY_P0,
|
|
|
|
MUX_PHY_P4,
|
2019-09-02 15:02:26 +02:00
|
|
|
};
|
|
|
|
|
2021-05-19 11:32:00 +08:00
|
|
|
struct mt7530_priv;
|
|
|
|
|
2022-04-11 10:46:27 +01:00
|
|
|
struct mt753x_pcs {
|
|
|
|
struct phylink_pcs pcs;
|
|
|
|
struct mt7530_priv *priv;
|
|
|
|
int port;
|
|
|
|
};
|
|
|
|
|
2020-09-11 21:48:52 +08:00
|
|
|
/* struct mt753x_info - This is the main data structure for holding the specific
|
|
|
|
* part for each supported device
|
2024-04-22 10:15:19 +03:00
|
|
|
* @id: Holding the identifier to a switch model
|
|
|
|
* @pcs_ops: Holding the pointer to the MAC PCS operations structure
|
2020-09-11 21:48:52 +08:00
|
|
|
* @sw_setup: Holding the handler to a device initialization
|
2023-01-17 00:52:16 +01:00
|
|
|
* @phy_read_c22: Holding the way reading PHY port using C22
|
|
|
|
* @phy_write_c22: Holding the way writing PHY port using C22
|
|
|
|
* @phy_read_c45: Holding the way reading PHY port using C45
|
|
|
|
* @phy_write_c45: Holding the way writing PHY port using C45
|
2024-04-22 10:15:19 +03:00
|
|
|
* @mac_port_get_caps: Holding the handler that provides MAC capabilities
|
2020-09-11 21:48:52 +08:00
|
|
|
* @mac_port_config: Holding the way setting up the PHY attribute to a
|
|
|
|
* certain MAC port
|
|
|
|
*/
|
|
|
|
struct mt753x_info {
|
|
|
|
enum mt753x_id id;
|
|
|
|
|
2022-04-11 10:46:27 +01:00
|
|
|
const struct phylink_pcs_ops *pcs_ops;
|
|
|
|
|
2020-09-11 21:48:52 +08:00
|
|
|
int (*sw_setup)(struct dsa_switch *ds);
|
2023-01-17 00:52:16 +01:00
|
|
|
int (*phy_read_c22)(struct mt7530_priv *priv, int port, int regnum);
|
|
|
|
int (*phy_write_c22)(struct mt7530_priv *priv, int port, int regnum,
|
|
|
|
u16 val);
|
|
|
|
int (*phy_read_c45)(struct mt7530_priv *priv, int port, int devad,
|
|
|
|
int regnum);
|
|
|
|
int (*phy_write_c45)(struct mt7530_priv *priv, int port, int devad,
|
|
|
|
int regnum, u16 val);
|
2022-04-11 10:46:01 +01:00
|
|
|
void (*mac_port_get_caps)(struct dsa_switch *ds, int port,
|
|
|
|
struct phylink_config *config);
|
2024-03-01 12:43:00 +02:00
|
|
|
void (*mac_port_config)(struct dsa_switch *ds, int port,
|
|
|
|
unsigned int mode,
|
|
|
|
phy_interface_t interface);
|
2020-09-11 21:48:52 +08:00
|
|
|
};
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
/* struct mt7530_priv - This is the main data structure for holding the state
|
|
|
|
* of the driver
|
|
|
|
* @dev: The device pointer
|
|
|
|
* @ds: The pointer to the dsa core structure
|
|
|
|
* @bus: The bus used for the device and built-in PHY
|
2023-04-03 02:17:52 +01:00
|
|
|
* @regmap: The regmap instance representing all switch registers
|
2017-04-07 16:45:09 +08:00
|
|
|
* @rstc: The pointer to reset control used by MCM
|
|
|
|
* @core_pwr: The power supplied into the core
|
|
|
|
* @io_pwr: The power supplied into the I/O
|
|
|
|
* @reset: The descriptor for GPIO line tied to its reset pin
|
|
|
|
* @mcm: Flag for distinguishing if standalone IC or module
|
|
|
|
* coupling
|
|
|
|
* @ports: Holding the state among ports
|
|
|
|
* @reg_mutex: The lock for protecting among process accessing
|
|
|
|
* registers
|
2024-04-22 10:15:10 +03:00
|
|
|
* @p5_mode: Holding the current mode of port 5 of the MT7530 switch
|
2024-01-22 08:35:54 +03:00
|
|
|
* @p5_sgmii: Flag for distinguishing if port 5 of the MT7531 switch
|
|
|
|
* has got SGMII
|
2021-05-19 11:32:00 +08:00
|
|
|
* @irq: IRQ number of the switch
|
|
|
|
* @irq_domain: IRQ domain of the switch irq_chip
|
|
|
|
* @irq_enable: IRQ enable bits, synced to SYS_INT_EN
|
2023-04-16 13:08:14 +01:00
|
|
|
* @create_sgmii: Pointer to function creating SGMII PCS instance(s)
|
2024-01-22 08:35:52 +03:00
|
|
|
* @active_cpu_ports: Holding the active CPU ports
|
2024-04-18 08:35:30 +03:00
|
|
|
* @mdiodev: The pointer to the MDIO device structure
|
2017-04-07 16:45:09 +08:00
|
|
|
*/
|
|
|
|
struct mt7530_priv {
|
|
|
|
struct device *dev;
|
|
|
|
struct dsa_switch *ds;
|
|
|
|
struct mii_bus *bus;
|
2023-04-03 02:17:52 +01:00
|
|
|
struct regmap *regmap;
|
2017-04-07 16:45:09 +08:00
|
|
|
struct reset_control *rstc;
|
|
|
|
struct regulator *core_pwr;
|
|
|
|
struct regulator *io_pwr;
|
|
|
|
struct gpio_desc *reset;
|
2020-09-11 21:48:52 +08:00
|
|
|
const struct mt753x_info *info;
|
2019-01-30 11:24:05 +10:00
|
|
|
unsigned int id;
|
2017-04-07 16:45:09 +08:00
|
|
|
bool mcm;
|
2024-04-22 10:15:10 +03:00
|
|
|
enum mt7530_p5_mode p5_mode;
|
2024-01-22 08:35:54 +03:00
|
|
|
bool p5_sgmii;
|
2020-03-06 20:35:35 +08:00
|
|
|
u8 mirror_rx;
|
|
|
|
u8 mirror_tx;
|
2017-04-07 16:45:09 +08:00
|
|
|
struct mt7530_port ports[MT7530_NUM_PORTS];
|
2022-04-11 10:46:27 +01:00
|
|
|
struct mt753x_pcs pcs[MT7530_NUM_PORTS];
|
2017-04-07 16:45:09 +08:00
|
|
|
/* protect among processes for registers access*/
|
|
|
|
struct mutex reg_mutex;
|
2021-05-19 11:32:00 +08:00
|
|
|
int irq;
|
|
|
|
struct irq_domain *irq_domain;
|
|
|
|
u32 irq_enable;
|
2024-01-22 08:35:54 +03:00
|
|
|
int (*create_sgmii)(struct mt7530_priv *priv);
|
2024-01-22 08:35:52 +03:00
|
|
|
u8 active_cpu_ports;
|
2024-04-18 08:35:30 +03:00
|
|
|
struct mdio_device *mdiodev;
|
2017-04-07 16:45:09 +08:00
|
|
|
};
|
|
|
|
|
2017-12-15 12:47:00 +08:00
|
|
|
struct mt7530_hw_vlan_entry {
|
|
|
|
int port;
|
|
|
|
u8 old_members;
|
|
|
|
bool untagged;
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline void mt7530_hw_vlan_entry_init(struct mt7530_hw_vlan_entry *e,
|
|
|
|
int port, bool untagged)
|
|
|
|
{
|
|
|
|
e->port = port;
|
|
|
|
e->untagged = untagged;
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef void (*mt7530_vlan_op)(struct mt7530_priv *,
|
|
|
|
struct mt7530_hw_vlan_entry *);
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
struct mt7530_hw_stats {
|
|
|
|
const char *string;
|
|
|
|
u16 reg;
|
|
|
|
u8 sizeof_stat;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mt7530_dummy_poll {
|
|
|
|
struct mt7530_priv *priv;
|
|
|
|
u32 reg;
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline void INIT_MT7530_DUMMY_POLL(struct mt7530_dummy_poll *p,
|
|
|
|
struct mt7530_priv *priv, u32 reg)
|
|
|
|
{
|
|
|
|
p->priv = priv;
|
|
|
|
p->reg = reg;
|
|
|
|
}
|
|
|
|
|
2023-04-03 02:19:13 +01:00
|
|
|
int mt7530_probe_common(struct mt7530_priv *priv);
|
|
|
|
void mt7530_remove_common(struct mt7530_priv *priv);
|
|
|
|
|
|
|
|
extern const struct dsa_switch_ops mt7530_switch_ops;
|
|
|
|
extern const struct mt753x_info mt753x_table[];
|
|
|
|
|
2017-04-07 16:45:09 +08:00
|
|
|
#endif /* __MT7530_H */
|