Commit 1d13a06e authored by Vivien Didelot's avatar Vivien Didelot Committed by David S. Miller

net: dsa: mv88e6xxx: factorize MAC address setting

Some switch models have a dedicated register for Switch MAC/WoF/WoL.
This register, when present, is used to indirectly set the switch MAC
address, instead of a direct write to 3 global registers.

Identify this feature and share a common mv88e6xxx_set_addr function.
Signed-off-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6594f615
...@@ -114,7 +114,7 @@ struct dsa_switch_driver mv88e6123_switch_driver = { ...@@ -114,7 +114,7 @@ struct dsa_switch_driver mv88e6123_switch_driver = {
.tag_protocol = DSA_TAG_PROTO_EDSA, .tag_protocol = DSA_TAG_PROTO_EDSA,
.probe = mv88e6123_drv_probe, .probe = mv88e6123_drv_probe,
.setup = mv88e6123_setup, .setup = mv88e6123_setup,
.set_addr = mv88e6xxx_set_addr_indirect, .set_addr = mv88e6xxx_set_addr,
.phy_read = mv88e6xxx_phy_read, .phy_read = mv88e6xxx_phy_read,
.phy_write = mv88e6xxx_phy_write, .phy_write = mv88e6xxx_phy_write,
.get_strings = mv88e6xxx_get_strings, .get_strings = mv88e6xxx_get_strings,
......
...@@ -147,7 +147,7 @@ struct dsa_switch_driver mv88e6131_switch_driver = { ...@@ -147,7 +147,7 @@ struct dsa_switch_driver mv88e6131_switch_driver = {
.tag_protocol = DSA_TAG_PROTO_DSA, .tag_protocol = DSA_TAG_PROTO_DSA,
.probe = mv88e6131_drv_probe, .probe = mv88e6131_drv_probe,
.setup = mv88e6131_setup, .setup = mv88e6131_setup,
.set_addr = mv88e6xxx_set_addr_direct, .set_addr = mv88e6xxx_set_addr,
.phy_read = mv88e6xxx_phy_read, .phy_read = mv88e6xxx_phy_read,
.phy_write = mv88e6xxx_phy_write, .phy_write = mv88e6xxx_phy_write,
.get_strings = mv88e6xxx_get_strings, .get_strings = mv88e6xxx_get_strings,
......
...@@ -123,7 +123,7 @@ struct dsa_switch_driver mv88e6171_switch_driver = { ...@@ -123,7 +123,7 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
.tag_protocol = DSA_TAG_PROTO_EDSA, .tag_protocol = DSA_TAG_PROTO_EDSA,
.probe = mv88e6171_drv_probe, .probe = mv88e6171_drv_probe,
.setup = mv88e6171_setup, .setup = mv88e6171_setup,
.set_addr = mv88e6xxx_set_addr_indirect, .set_addr = mv88e6xxx_set_addr,
.phy_read = mv88e6xxx_phy_read, .phy_read = mv88e6xxx_phy_read,
.phy_write = mv88e6xxx_phy_write, .phy_write = mv88e6xxx_phy_write,
.get_strings = mv88e6xxx_get_strings, .get_strings = mv88e6xxx_get_strings,
......
...@@ -140,7 +140,7 @@ struct dsa_switch_driver mv88e6352_switch_driver = { ...@@ -140,7 +140,7 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
.tag_protocol = DSA_TAG_PROTO_EDSA, .tag_protocol = DSA_TAG_PROTO_EDSA,
.probe = mv88e6352_drv_probe, .probe = mv88e6352_drv_probe,
.setup = mv88e6352_setup, .setup = mv88e6352_setup,
.set_addr = mv88e6xxx_set_addr_indirect, .set_addr = mv88e6xxx_set_addr,
.phy_read = mv88e6xxx_phy_read, .phy_read = mv88e6xxx_phy_read,
.phy_write = mv88e6xxx_phy_write, .phy_write = mv88e6xxx_phy_write,
.get_strings = mv88e6xxx_get_strings, .get_strings = mv88e6xxx_get_strings,
......
...@@ -173,7 +173,7 @@ int mv88e6xxx_reg_write(struct mv88e6xxx_priv_state *ps, int addr, ...@@ -173,7 +173,7 @@ int mv88e6xxx_reg_write(struct mv88e6xxx_priv_state *ps, int addr,
return ret; return ret;
} }
int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr) static int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr)
{ {
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
int err; int err;
...@@ -192,7 +192,7 @@ int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr) ...@@ -192,7 +192,7 @@ int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr)
(addr[4] << 8) | addr[5]); (addr[4] << 8) | addr[5]);
} }
int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr) static int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr)
{ {
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
int ret; int ret;
...@@ -225,6 +225,16 @@ int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr) ...@@ -225,6 +225,16 @@ int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr)
return 0; return 0;
} }
int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
{
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
if (mv88e6xxx_has(ps, MV88E6XXX_FLAG_SWITCH_MAC))
return mv88e6xxx_set_addr_indirect(ds, addr);
else
return mv88e6xxx_set_addr_direct(ds, addr);
}
static int _mv88e6xxx_phy_read(struct mv88e6xxx_priv_state *ps, int addr, static int _mv88e6xxx_phy_read(struct mv88e6xxx_priv_state *ps, int addr,
int regnum) int regnum)
{ {
......
...@@ -367,6 +367,13 @@ enum mv88e6xxx_cap { ...@@ -367,6 +367,13 @@ enum mv88e6xxx_cap {
*/ */
MV88E6XXX_CAP_SMI_PHY, MV88E6XXX_CAP_SMI_PHY,
/* Switch MAC/WoL/WoF register.
* This requires an indirect access to set the switch MAC address
* through GLOBAL2_SWITCH_MAC, otherwise GLOBAL_MAC_01, GLOBAL_MAC_23,
* and GLOBAL_MAC_45 are used with a direct access.
*/
MV88E6XXX_CAP_SWITCH_MAC_WOL_WOF,
/* Internal temperature sensor. /* Internal temperature sensor.
* Available from any enabled port's PHY register 26, page 6. * Available from any enabled port's PHY register 26, page 6.
*/ */
...@@ -378,6 +385,7 @@ enum mv88e6xxx_cap { ...@@ -378,6 +385,7 @@ enum mv88e6xxx_cap {
#define MV88E6XXX_FLAG_EEPROM BIT(MV88E6XXX_CAP_EEPROM) #define MV88E6XXX_FLAG_EEPROM BIT(MV88E6XXX_CAP_EEPROM)
#define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU) #define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU)
#define MV88E6XXX_FLAG_SMI_PHY BIT(MV88E6XXX_CAP_SMI_PHY) #define MV88E6XXX_FLAG_SMI_PHY BIT(MV88E6XXX_CAP_SMI_PHY)
#define MV88E6XXX_FLAG_SWITCH_MAC BIT(MV88E6XXX_CAP_SWITCH_MAC_WOL_WOF)
#define MV88E6XXX_FLAG_TEMP BIT(MV88E6XXX_CAP_TEMP) #define MV88E6XXX_FLAG_TEMP BIT(MV88E6XXX_CAP_TEMP)
#define MV88E6XXX_FLAG_TEMP_LIMIT BIT(MV88E6XXX_CAP_TEMP_LIMIT) #define MV88E6XXX_FLAG_TEMP_LIMIT BIT(MV88E6XXX_CAP_TEMP_LIMIT)
...@@ -388,7 +396,8 @@ enum mv88e6xxx_cap { ...@@ -388,7 +396,8 @@ enum mv88e6xxx_cap {
MV88E6XXX_FLAG_PPU MV88E6XXX_FLAG_PPU
#define MV88E6XXX_FLAGS_FAMILY_6165 \ #define MV88E6XXX_FLAGS_FAMILY_6165 \
MV88E6XXX_FLAG_TEMP (MV88E6XXX_FLAG_SWITCH_MAC | \
MV88E6XXX_FLAG_TEMP)
#define MV88E6XXX_FLAGS_FAMILY_6185 \ #define MV88E6XXX_FLAGS_FAMILY_6185 \
MV88E6XXX_FLAG_PPU MV88E6XXX_FLAG_PPU
...@@ -396,16 +405,19 @@ enum mv88e6xxx_cap { ...@@ -396,16 +405,19 @@ enum mv88e6xxx_cap {
#define MV88E6XXX_FLAGS_FAMILY_6320 \ #define MV88E6XXX_FLAGS_FAMILY_6320 \
(MV88E6XXX_FLAG_EEPROM | \ (MV88E6XXX_FLAG_EEPROM | \
MV88E6XXX_FLAG_SMI_PHY | \ MV88E6XXX_FLAG_SMI_PHY | \
MV88E6XXX_FLAG_SWITCH_MAC | \
MV88E6XXX_FLAG_TEMP | \ MV88E6XXX_FLAG_TEMP | \
MV88E6XXX_FLAG_TEMP_LIMIT) MV88E6XXX_FLAG_TEMP_LIMIT)
#define MV88E6XXX_FLAGS_FAMILY_6351 \ #define MV88E6XXX_FLAGS_FAMILY_6351 \
(MV88E6XXX_FLAG_SMI_PHY | \ (MV88E6XXX_FLAG_SMI_PHY | \
MV88E6XXX_FLAG_SWITCH_MAC | \
MV88E6XXX_FLAG_TEMP) MV88E6XXX_FLAG_TEMP)
#define MV88E6XXX_FLAGS_FAMILY_6352 \ #define MV88E6XXX_FLAGS_FAMILY_6352 \
(MV88E6XXX_FLAG_EEPROM | \ (MV88E6XXX_FLAG_EEPROM | \
MV88E6XXX_FLAG_SMI_PHY | \ MV88E6XXX_FLAG_SMI_PHY | \
MV88E6XXX_FLAG_SWITCH_MAC | \
MV88E6XXX_FLAG_TEMP | \ MV88E6XXX_FLAG_TEMP | \
MV88E6XXX_FLAG_TEMP_LIMIT) MV88E6XXX_FLAG_TEMP_LIMIT)
...@@ -525,8 +537,7 @@ int mv88e6xxx_setup_global(struct dsa_switch *ds); ...@@ -525,8 +537,7 @@ int mv88e6xxx_setup_global(struct dsa_switch *ds);
int mv88e6xxx_reg_read(struct mv88e6xxx_priv_state *ps, int addr, int reg); int mv88e6xxx_reg_read(struct mv88e6xxx_priv_state *ps, int addr, int reg);
int mv88e6xxx_reg_write(struct mv88e6xxx_priv_state *ps, int addr, int mv88e6xxx_reg_write(struct mv88e6xxx_priv_state *ps, int addr,
int reg, u16 val); int reg, u16 val);
int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr); int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr);
int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr);
int mv88e6xxx_phy_read(struct dsa_switch *ds, int port, int regnum); int mv88e6xxx_phy_read(struct dsa_switch *ds, int port, int regnum);
int mv88e6xxx_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val); int mv88e6xxx_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val);
void mv88e6xxx_get_strings(struct dsa_switch *ds, int port, uint8_t *data); void mv88e6xxx_get_strings(struct dsa_switch *ds, int port, uint8_t *data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment