mirror of https://gitee.com/openkylin/linux.git
net: dsa: mv88e6xxx: factorize GLOBAL_CONTROL setup
All switch models configure the GLOBAL_CONTROL register with slightly differences. Discarding packets with excessive collisions (GLOBAL_CONTROL_DISCARD_EXCESS) is specific to 6352 and similar switches, and setting a maximum frame size (GLOBAL_CONTROL_MAX_FRAME_1632) is specific to 6185 and similar switches. As we are centralizing the chips setup, skip these settings and don't discard any frames yet, until we found out that such discarding by the hardware is necessary. Assume a common setup to enable the PHY Polling Unit if present, don't discard any packets, and mask all interrupt sources. Tested on 88E6352 and 88E6185. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
08a012619a
commit
119477bd98
|
@ -58,14 +58,6 @@ static int mv88e6123_setup_global(struct dsa_switch *ds)
|
||||||
int ret;
|
int ret;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
/* Disable the PHY polling unit (since there won't be any
|
|
||||||
* external PHYs to poll), don't discard packets with
|
|
||||||
* excessive collisions, and mask all interrupt sources.
|
|
||||||
*/
|
|
||||||
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CONTROL, 0x0000);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Configure the upstream port, and configure the upstream
|
/* Configure the upstream port, and configure the upstream
|
||||||
* port as the port to which ingress and egress monitor frames
|
* port as the port to which ingress and egress monitor frames
|
||||||
* are to be sent.
|
* are to be sent.
|
||||||
|
|
|
@ -65,17 +65,6 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
|
||||||
int ret;
|
int ret;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
/* Enable the PHY polling unit, don't discard packets with
|
|
||||||
* excessive collisions, use a weighted fair queueing scheme
|
|
||||||
* to arbitrate between packet queues, set the maximum frame
|
|
||||||
* size to 1632, and mask all interrupt sources.
|
|
||||||
*/
|
|
||||||
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CONTROL,
|
|
||||||
GLOBAL_CONTROL_PPU_ENABLE |
|
|
||||||
GLOBAL_CONTROL_MAX_FRAME_1632);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Set the VLAN ethertype to 0x8100. */
|
/* Set the VLAN ethertype to 0x8100. */
|
||||||
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CORE_TAG_TYPE, 0x8100);
|
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CORE_TAG_TYPE, 0x8100);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -65,15 +65,6 @@ static int mv88e6171_setup_global(struct dsa_switch *ds)
|
||||||
int ret;
|
int ret;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
/* Discard packets with excessive collisions, mask all
|
|
||||||
* interrupt sources, enable PPU.
|
|
||||||
*/
|
|
||||||
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CONTROL,
|
|
||||||
GLOBAL_CONTROL_PPU_ENABLE |
|
|
||||||
GLOBAL_CONTROL_DISCARD_EXCESS);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Configure the upstream port, and configure the upstream
|
/* Configure the upstream port, and configure the upstream
|
||||||
* port as the port to which ingress and egress monitor frames
|
* port as the port to which ingress and egress monitor frames
|
||||||
* are to be sent.
|
* are to be sent.
|
||||||
|
|
|
@ -84,15 +84,6 @@ static int mv88e6352_setup_global(struct dsa_switch *ds)
|
||||||
int ret;
|
int ret;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
/* Discard packets with excessive collisions,
|
|
||||||
* mask all interrupt sources, enable PPU (bit 14, undocumented).
|
|
||||||
*/
|
|
||||||
ret = mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CONTROL,
|
|
||||||
GLOBAL_CONTROL_PPU_ENABLE |
|
|
||||||
GLOBAL_CONTROL_DISCARD_EXCESS);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Configure the upstream port, and configure the upstream
|
/* Configure the upstream port, and configure the upstream
|
||||||
* port as the port to which ingress and egress monitor frames
|
* port as the port to which ingress and egress monitor frames
|
||||||
* are to be sent.
|
* are to be sent.
|
||||||
|
|
|
@ -2922,9 +2922,22 @@ int mv88e6xxx_setup_ports(struct dsa_switch *ds)
|
||||||
|
|
||||||
static int mv88e6xxx_setup_global(struct mv88e6xxx_priv_state *ps)
|
static int mv88e6xxx_setup_global(struct mv88e6xxx_priv_state *ps)
|
||||||
{
|
{
|
||||||
|
u16 reg;
|
||||||
int err;
|
int err;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Enable the PHY Polling Unit if present, don't discard any packets,
|
||||||
|
* and mask all interrupt sources.
|
||||||
|
*/
|
||||||
|
reg = 0;
|
||||||
|
if (mv88e6xxx_has(ps, MV88E6XXX_FLAG_PPU) ||
|
||||||
|
mv88e6xxx_has(ps, MV88E6XXX_FLAG_PPU_ACTIVE))
|
||||||
|
reg |= GLOBAL_CONTROL_PPU_ENABLE;
|
||||||
|
|
||||||
|
err = _mv88e6xxx_reg_write(ps, REG_GLOBAL, GLOBAL_CONTROL, reg);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
/* Set the default address aging time to 5 minutes, and
|
/* Set the default address aging time to 5 minutes, and
|
||||||
* enable address learn messages to be sent to all message
|
* enable address learn messages to be sent to all message
|
||||||
* ports.
|
* ports.
|
||||||
|
|
Loading…
Reference in New Issue