diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-09-29 12:22:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-09-30 01:26:00 -0400 |
commit | ee4dc2e75337e5925e9434f28ec48374a65ffcd9 (patch) | |
tree | 5b48db1d60b9cc0ef7e1afbe6f531db431b1265a | |
parent | b073d4e2b16a42f7d5b01814307ff41012c2e1ea (diff) |
net: dsa: mv88e6xxx: add eeprom ops
Remove EEPROM flags in favor of new {get,set}_eeprom chip-wide
functions in the mv88e6xxx_ops structure.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/chip.c | 34 | ||||
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | 16 |
2 files changed, 26 insertions, 24 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index e40b71ba871c..883fd9809dd2 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c | |||
@@ -3168,13 +3168,11 @@ static int mv88e6xxx_get_eeprom(struct dsa_switch *ds, | |||
3168 | struct mv88e6xxx_chip *chip = ds->priv; | 3168 | struct mv88e6xxx_chip *chip = ds->priv; |
3169 | int err; | 3169 | int err; |
3170 | 3170 | ||
3171 | mutex_lock(&chip->reg_lock); | 3171 | if (!chip->info->ops->get_eeprom) |
3172 | 3172 | return -EOPNOTSUPP; | |
3173 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16)) | ||
3174 | err = mv88e6xxx_g2_get_eeprom16(chip, eeprom, data); | ||
3175 | else | ||
3176 | err = -EOPNOTSUPP; | ||
3177 | 3173 | ||
3174 | mutex_lock(&chip->reg_lock); | ||
3175 | err = chip->info->ops->get_eeprom(chip, eeprom, data); | ||
3178 | mutex_unlock(&chip->reg_lock); | 3176 | mutex_unlock(&chip->reg_lock); |
3179 | 3177 | ||
3180 | if (err) | 3178 | if (err) |
@@ -3191,16 +3189,14 @@ static int mv88e6xxx_set_eeprom(struct dsa_switch *ds, | |||
3191 | struct mv88e6xxx_chip *chip = ds->priv; | 3189 | struct mv88e6xxx_chip *chip = ds->priv; |
3192 | int err; | 3190 | int err; |
3193 | 3191 | ||
3192 | if (!chip->info->ops->set_eeprom) | ||
3193 | return -EOPNOTSUPP; | ||
3194 | |||
3194 | if (eeprom->magic != 0xc3ec4951) | 3195 | if (eeprom->magic != 0xc3ec4951) |
3195 | return -EINVAL; | 3196 | return -EINVAL; |
3196 | 3197 | ||
3197 | mutex_lock(&chip->reg_lock); | 3198 | mutex_lock(&chip->reg_lock); |
3198 | 3199 | err = chip->info->ops->set_eeprom(chip, eeprom, data); | |
3199 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16)) | ||
3200 | err = mv88e6xxx_g2_set_eeprom16(chip, eeprom, data); | ||
3201 | else | ||
3202 | err = -EOPNOTSUPP; | ||
3203 | |||
3204 | mutex_unlock(&chip->reg_lock); | 3200 | mutex_unlock(&chip->reg_lock); |
3205 | 3201 | ||
3206 | return err; | 3202 | return err; |
@@ -3249,6 +3245,8 @@ static const struct mv88e6xxx_ops mv88e6171_ops = { | |||
3249 | }; | 3245 | }; |
3250 | 3246 | ||
3251 | static const struct mv88e6xxx_ops mv88e6172_ops = { | 3247 | static const struct mv88e6xxx_ops mv88e6172_ops = { |
3248 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3249 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3252 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3250 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3253 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3251 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3254 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3252 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
@@ -3261,6 +3259,8 @@ static const struct mv88e6xxx_ops mv88e6175_ops = { | |||
3261 | }; | 3259 | }; |
3262 | 3260 | ||
3263 | static const struct mv88e6xxx_ops mv88e6176_ops = { | 3261 | static const struct mv88e6xxx_ops mv88e6176_ops = { |
3262 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3263 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3264 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3264 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3265 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3265 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3266 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3266 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
@@ -3273,18 +3273,24 @@ static const struct mv88e6xxx_ops mv88e6185_ops = { | |||
3273 | }; | 3273 | }; |
3274 | 3274 | ||
3275 | static const struct mv88e6xxx_ops mv88e6240_ops = { | 3275 | static const struct mv88e6xxx_ops mv88e6240_ops = { |
3276 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3277 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3276 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3278 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3277 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3279 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3278 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3280 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
3279 | }; | 3281 | }; |
3280 | 3282 | ||
3281 | static const struct mv88e6xxx_ops mv88e6320_ops = { | 3283 | static const struct mv88e6xxx_ops mv88e6320_ops = { |
3284 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3285 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3282 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3286 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3283 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3287 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3284 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3288 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
3285 | }; | 3289 | }; |
3286 | 3290 | ||
3287 | static const struct mv88e6xxx_ops mv88e6321_ops = { | 3291 | static const struct mv88e6xxx_ops mv88e6321_ops = { |
3292 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3293 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3288 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3294 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3289 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3295 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3290 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3296 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
@@ -3303,6 +3309,8 @@ static const struct mv88e6xxx_ops mv88e6351_ops = { | |||
3303 | }; | 3309 | }; |
3304 | 3310 | ||
3305 | static const struct mv88e6xxx_ops mv88e6352_ops = { | 3311 | static const struct mv88e6xxx_ops mv88e6352_ops = { |
3312 | .get_eeprom = mv88e6xxx_g2_get_eeprom16, | ||
3313 | .set_eeprom = mv88e6xxx_g2_set_eeprom16, | ||
3306 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, | 3314 | .set_switch_mac = mv88e6xxx_g2_set_switch_mac, |
3307 | .phy_read = mv88e6xxx_g2_smi_phy_read, | 3315 | .phy_read = mv88e6xxx_g2_smi_phy_read, |
3308 | .phy_write = mv88e6xxx_g2_smi_phy_write, | 3316 | .phy_write = mv88e6xxx_g2_smi_phy_write, |
@@ -3825,7 +3833,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) | |||
3825 | if (IS_ERR(chip->reset)) | 3833 | if (IS_ERR(chip->reset)) |
3826 | return PTR_ERR(chip->reset); | 3834 | return PTR_ERR(chip->reset); |
3827 | 3835 | ||
3828 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) && | 3836 | if (chip->info->ops->get_eeprom && |
3829 | !of_property_read_u32(np, "eeprom-length", &eeprom_len)) | 3837 | !of_property_read_u32(np, "eeprom-length", &eeprom_len)) |
3830 | chip->eeprom_len = eeprom_len; | 3838 | chip->eeprom_len = eeprom_len; |
3831 | 3839 | ||
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h index d04184c7e068..e572121c196e 100644 --- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h +++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | |||
@@ -424,8 +424,6 @@ enum mv88e6xxx_cap { | |||
424 | MV88E6XXX_CAP_G2_PVT_ADDR, /* (0x0b) Cross Chip Port VLAN Addr */ | 424 | MV88E6XXX_CAP_G2_PVT_ADDR, /* (0x0b) Cross Chip Port VLAN Addr */ |
425 | MV88E6XXX_CAP_G2_PVT_DATA, /* (0x0c) Cross Chip Port VLAN Data */ | 425 | MV88E6XXX_CAP_G2_PVT_DATA, /* (0x0c) Cross Chip Port VLAN Data */ |
426 | MV88E6XXX_CAP_G2_POT, /* (0x0f) Priority Override Table */ | 426 | MV88E6XXX_CAP_G2_POT, /* (0x0f) Priority Override Table */ |
427 | MV88E6XXX_CAP_G2_EEPROM_CMD, /* (0x14) EEPROM Command */ | ||
428 | MV88E6XXX_CAP_G2_EEPROM_DATA, /* (0x15) EEPROM Data */ | ||
429 | 427 | ||
430 | /* PHY Polling Unit. | 428 | /* PHY Polling Unit. |
431 | * See GLOBAL_CONTROL_PPU_ENABLE and GLOBAL_STATUS_PPU_POLLING. | 429 | * See GLOBAL_CONTROL_PPU_ENABLE and GLOBAL_STATUS_PPU_POLLING. |
@@ -473,8 +471,6 @@ enum mv88e6xxx_cap { | |||
473 | #define MV88E6XXX_FLAG_G2_PVT_ADDR BIT_ULL(MV88E6XXX_CAP_G2_PVT_ADDR) | 471 | #define MV88E6XXX_FLAG_G2_PVT_ADDR BIT_ULL(MV88E6XXX_CAP_G2_PVT_ADDR) |
474 | #define MV88E6XXX_FLAG_G2_PVT_DATA BIT_ULL(MV88E6XXX_CAP_G2_PVT_DATA) | 472 | #define MV88E6XXX_FLAG_G2_PVT_DATA BIT_ULL(MV88E6XXX_CAP_G2_PVT_DATA) |
475 | #define MV88E6XXX_FLAG_G2_POT BIT_ULL(MV88E6XXX_CAP_G2_POT) | 473 | #define MV88E6XXX_FLAG_G2_POT BIT_ULL(MV88E6XXX_CAP_G2_POT) |
476 | #define MV88E6XXX_FLAG_G2_EEPROM_CMD BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_CMD) | ||
477 | #define MV88E6XXX_FLAG_G2_EEPROM_DATA BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_DATA) | ||
478 | 474 | ||
479 | #define MV88E6XXX_FLAG_PPU BIT_ULL(MV88E6XXX_CAP_PPU) | 475 | #define MV88E6XXX_FLAG_PPU BIT_ULL(MV88E6XXX_CAP_PPU) |
480 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT_ULL(MV88E6XXX_CAP_PPU_ACTIVE) | 476 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT_ULL(MV88E6XXX_CAP_PPU_ACTIVE) |
@@ -483,11 +479,6 @@ enum mv88e6xxx_cap { | |||
483 | #define MV88E6XXX_FLAG_TEMP_LIMIT BIT_ULL(MV88E6XXX_CAP_TEMP_LIMIT) | 479 | #define MV88E6XXX_FLAG_TEMP_LIMIT BIT_ULL(MV88E6XXX_CAP_TEMP_LIMIT) |
484 | #define MV88E6XXX_FLAG_VTU BIT_ULL(MV88E6XXX_CAP_VTU) | 480 | #define MV88E6XXX_FLAG_VTU BIT_ULL(MV88E6XXX_CAP_VTU) |
485 | 481 | ||
486 | /* EEPROM Programming via Global2 with 16-bit data */ | ||
487 | #define MV88E6XXX_FLAGS_EEPROM16 \ | ||
488 | (MV88E6XXX_FLAG_G2_EEPROM_CMD | \ | ||
489 | MV88E6XXX_FLAG_G2_EEPROM_DATA) | ||
490 | |||
491 | /* Ingress Rate Limit unit */ | 482 | /* Ingress Rate Limit unit */ |
492 | #define MV88E6XXX_FLAGS_IRL \ | 483 | #define MV88E6XXX_FLAGS_IRL \ |
493 | (MV88E6XXX_FLAG_G2_IRL_CMD | \ | 484 | (MV88E6XXX_FLAG_G2_IRL_CMD | \ |
@@ -561,7 +552,6 @@ enum mv88e6xxx_cap { | |||
561 | MV88E6XXX_FLAG_TEMP | \ | 552 | MV88E6XXX_FLAG_TEMP | \ |
562 | MV88E6XXX_FLAG_TEMP_LIMIT | \ | 553 | MV88E6XXX_FLAG_TEMP_LIMIT | \ |
563 | MV88E6XXX_FLAG_VTU | \ | 554 | MV88E6XXX_FLAG_VTU | \ |
564 | MV88E6XXX_FLAGS_EEPROM16 | \ | ||
565 | MV88E6XXX_FLAGS_IRL | \ | 555 | MV88E6XXX_FLAGS_IRL | \ |
566 | MV88E6XXX_FLAGS_MULTI_CHIP | \ | 556 | MV88E6XXX_FLAGS_MULTI_CHIP | \ |
567 | MV88E6XXX_FLAGS_PVT) | 557 | MV88E6XXX_FLAGS_PVT) |
@@ -596,7 +586,6 @@ enum mv88e6xxx_cap { | |||
596 | MV88E6XXX_FLAG_TEMP | \ | 586 | MV88E6XXX_FLAG_TEMP | \ |
597 | MV88E6XXX_FLAG_TEMP_LIMIT | \ | 587 | MV88E6XXX_FLAG_TEMP_LIMIT | \ |
598 | MV88E6XXX_FLAG_VTU | \ | 588 | MV88E6XXX_FLAG_VTU | \ |
599 | MV88E6XXX_FLAGS_EEPROM16 | \ | ||
600 | MV88E6XXX_FLAGS_IRL | \ | 589 | MV88E6XXX_FLAGS_IRL | \ |
601 | MV88E6XXX_FLAGS_MULTI_CHIP | \ | 590 | MV88E6XXX_FLAGS_MULTI_CHIP | \ |
602 | MV88E6XXX_FLAGS_PVT | \ | 591 | MV88E6XXX_FLAGS_PVT | \ |
@@ -696,6 +685,11 @@ struct mv88e6xxx_bus_ops { | |||
696 | }; | 685 | }; |
697 | 686 | ||
698 | struct mv88e6xxx_ops { | 687 | struct mv88e6xxx_ops { |
688 | int (*get_eeprom)(struct mv88e6xxx_chip *chip, | ||
689 | struct ethtool_eeprom *eeprom, u8 *data); | ||
690 | int (*set_eeprom)(struct mv88e6xxx_chip *chip, | ||
691 | struct ethtool_eeprom *eeprom, u8 *data); | ||
692 | |||
699 | int (*set_switch_mac)(struct mv88e6xxx_chip *chip, u8 *addr); | 693 | int (*set_switch_mac)(struct mv88e6xxx_chip *chip, u8 *addr); |
700 | 694 | ||
701 | int (*phy_read)(struct mv88e6xxx_chip *chip, int addr, int reg, | 695 | int (*phy_read)(struct mv88e6xxx_chip *chip, int addr, int reg, |