|
|
|
@ -404,6 +404,59 @@ ar8216_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, |
|
|
|
|
(pvid << AR8216_PORT_VLAN_DEFAULT_ID_S)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
ar8216_hw_init(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8216_init_globals(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
/* standard atheros magic */ |
|
|
|
|
priv->write(priv, 0x38, 0xc000050e); |
|
|
|
|
|
|
|
|
|
ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, |
|
|
|
|
AR8216_GCTRL_MTU, 1518 + 8 + 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8216_init_port(struct ar8216_priv *priv, int port) |
|
|
|
|
{ |
|
|
|
|
/* Enable port learning and tx */ |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_CTRL(port), |
|
|
|
|
AR8216_PORT_CTRL_LEARN | |
|
|
|
|
(4 << AR8216_PORT_CTRL_STATE_S)); |
|
|
|
|
|
|
|
|
|
priv->write(priv, AR8216_REG_PORT_VLAN(port), 0); |
|
|
|
|
|
|
|
|
|
if (port == AR8216_PORT_CPU) { |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_STATUS(port), |
|
|
|
|
AR8216_PORT_STATUS_LINK_UP | |
|
|
|
|
ar8xxx_has_gige(priv) ? AR8216_PORT_SPEED_1000M : |
|
|
|
|
AR8216_PORT_SPEED_100M | |
|
|
|
|
AR8216_PORT_STATUS_TXMAC | |
|
|
|
|
AR8216_PORT_STATUS_RXMAC | |
|
|
|
|
((priv->chip_type == AR8316) ? AR8216_PORT_STATUS_RXFLOW : 0) | |
|
|
|
|
((priv->chip_type == AR8316) ? AR8216_PORT_STATUS_TXFLOW : 0) | |
|
|
|
|
AR8216_PORT_STATUS_DUPLEX); |
|
|
|
|
} else { |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_STATUS(port), |
|
|
|
|
AR8216_PORT_STATUS_LINK_AUTO); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct ar8xxx_chip ar8216_chip = { |
|
|
|
|
.hw_init = ar8216_hw_init, |
|
|
|
|
.init_globals = ar8216_init_globals, |
|
|
|
|
.init_port = ar8216_init_port, |
|
|
|
|
.setup_port = ar8216_setup_port, |
|
|
|
|
.read_port_status = ar8216_read_port_status, |
|
|
|
|
.atu_flush = ar8216_atu_flush, |
|
|
|
|
.vtu_flush = ar8216_vtu_flush, |
|
|
|
|
.vtu_load_vlan = ar8216_vtu_load_vlan, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8236_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, |
|
|
|
|
u32 members, u32 pvid) |
|
|
|
@ -427,12 +480,6 @@ ar8236_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, |
|
|
|
|
(members << AR8236_PORT_VLAN2_MEMBER_S)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
ar8216_hw_init(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
ar8236_hw_init(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
@ -456,6 +503,25 @@ ar8236_hw_init(struct ar8216_priv *priv) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8236_init_globals(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
/* enable jumbo frames */ |
|
|
|
|
ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, |
|
|
|
|
AR8316_GCTRL_MTU, 9018 + 8 + 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct ar8xxx_chip ar8236_chip = { |
|
|
|
|
.hw_init = ar8236_hw_init, |
|
|
|
|
.init_globals = ar8236_init_globals, |
|
|
|
|
.init_port = ar8216_init_port, |
|
|
|
|
.setup_port = ar8236_setup_port, |
|
|
|
|
.read_port_status = ar8216_read_port_status, |
|
|
|
|
.atu_flush = ar8216_atu_flush, |
|
|
|
|
.vtu_flush = ar8216_vtu_flush, |
|
|
|
|
.vtu_load_vlan = ar8216_vtu_load_vlan, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
ar8316_hw_init(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
@ -516,24 +582,6 @@ out: |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8216_init_globals(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
/* standard atheros magic */ |
|
|
|
|
priv->write(priv, 0x38, 0xc000050e); |
|
|
|
|
|
|
|
|
|
ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, |
|
|
|
|
AR8216_GCTRL_MTU, 1518 + 8 + 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8236_init_globals(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
|
/* enable jumbo frames */ |
|
|
|
|
ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, |
|
|
|
|
AR8316_GCTRL_MTU, 9018 + 8 + 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8316_init_globals(struct ar8216_priv *priv) |
|
|
|
|
{ |
|
|
|
@ -548,54 +596,6 @@ ar8316_init_globals(struct ar8216_priv *priv) |
|
|
|
|
AR8316_GCTRL_MTU, 9018 + 8 + 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
ar8216_init_port(struct ar8216_priv *priv, int port) |
|
|
|
|
{ |
|
|
|
|
/* Enable port learning and tx */ |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_CTRL(port), |
|
|
|
|
AR8216_PORT_CTRL_LEARN | |
|
|
|
|
(4 << AR8216_PORT_CTRL_STATE_S)); |
|
|
|
|
|
|
|
|
|
priv->write(priv, AR8216_REG_PORT_VLAN(port), 0); |
|
|
|
|
|
|
|
|
|
if (port == AR8216_PORT_CPU) { |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_STATUS(port), |
|
|
|
|
AR8216_PORT_STATUS_LINK_UP | |
|
|
|
|
ar8xxx_has_gige(priv) ? AR8216_PORT_SPEED_1000M : |
|
|
|
|
AR8216_PORT_SPEED_100M | |
|
|
|
|
AR8216_PORT_STATUS_TXMAC | |
|
|
|
|
AR8216_PORT_STATUS_RXMAC | |
|
|
|
|
((priv->chip_type == AR8316) ? AR8216_PORT_STATUS_RXFLOW : 0) | |
|
|
|
|
((priv->chip_type == AR8316) ? AR8216_PORT_STATUS_TXFLOW : 0) | |
|
|
|
|
AR8216_PORT_STATUS_DUPLEX); |
|
|
|
|
} else { |
|
|
|
|
priv->write(priv, AR8216_REG_PORT_STATUS(port), |
|
|
|
|
AR8216_PORT_STATUS_LINK_AUTO); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct ar8xxx_chip ar8216_chip = { |
|
|
|
|
.hw_init = ar8216_hw_init, |
|
|
|
|
.init_globals = ar8216_init_globals, |
|
|
|
|
.init_port = ar8216_init_port, |
|
|
|
|
.setup_port = ar8216_setup_port, |
|
|
|
|
.read_port_status = ar8216_read_port_status, |
|
|
|
|
.atu_flush = ar8216_atu_flush, |
|
|
|
|
.vtu_flush = ar8216_vtu_flush, |
|
|
|
|
.vtu_load_vlan = ar8216_vtu_load_vlan, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct ar8xxx_chip ar8236_chip = { |
|
|
|
|
.hw_init = ar8236_hw_init, |
|
|
|
|
.init_globals = ar8236_init_globals, |
|
|
|
|
.init_port = ar8216_init_port, |
|
|
|
|
.setup_port = ar8236_setup_port, |
|
|
|
|
.read_port_status = ar8216_read_port_status, |
|
|
|
|
.atu_flush = ar8216_atu_flush, |
|
|
|
|
.vtu_flush = ar8216_vtu_flush, |
|
|
|
|
.vtu_load_vlan = ar8216_vtu_load_vlan, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct ar8xxx_chip ar8316_chip = { |
|
|
|
|
.caps = AR8XXX_CAP_GIGE, |
|
|
|
|
.hw_init = ar8316_hw_init, |
|
|
|
|