aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-09-29 12:22:00 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-30 01:26:00 -0400
commitb3469dd8adade11e8234854d79b43daf8ce478c9 (patch)
tree9d8d9ee013c68baadd5e0be47ca699508cd30ec6
parentc08026aba70a97925512266d29429dbd62df497d (diff)
net: dsa: mv88e6xxx: add chip-wide ops
Introduce a mv88e6xxx_ops structure to describe supported chip-wide functions and assign the correct variant to the chip models. For the moment, add only PHY access routines. This allows to get rid of the PHY ops structures and the usage of PHY flags. 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.c136
-rw-r--r--drivers/net/dsa/mv88e6xxx/mv88e6xxx.h28
2 files changed, 121 insertions, 43 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index ad31d3ed3aca..83a37693a8db 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -238,10 +238,10 @@ static int mv88e6xxx_phy_read(struct mv88e6xxx_chip *chip, int phy,
238{ 238{
239 int addr = phy; /* PHY devices addresses start at 0x0 */ 239 int addr = phy; /* PHY devices addresses start at 0x0 */
240 240
241 if (!chip->phy_ops) 241 if (!chip->info->ops->phy_read)
242 return -EOPNOTSUPP; 242 return -EOPNOTSUPP;
243 243
244 return chip->phy_ops->read(chip, addr, reg, val); 244 return chip->info->ops->phy_read(chip, addr, reg, val);
245} 245}
246 246
247static int mv88e6xxx_phy_write(struct mv88e6xxx_chip *chip, int phy, 247static int mv88e6xxx_phy_write(struct mv88e6xxx_chip *chip, int phy,
@@ -249,10 +249,10 @@ static int mv88e6xxx_phy_write(struct mv88e6xxx_chip *chip, int phy,
249{ 249{
250 int addr = phy; /* PHY devices addresses start at 0x0 */ 250 int addr = phy; /* PHY devices addresses start at 0x0 */
251 251
252 if (!chip->phy_ops) 252 if (!chip->info->ops->phy_write)
253 return -EOPNOTSUPP; 253 return -EOPNOTSUPP;
254 254
255 return chip->phy_ops->write(chip, addr, reg, val); 255 return chip->info->ops->phy_write(chip, addr, reg, val);
256} 256}
257 257
258static int mv88e6xxx_phy_page_get(struct mv88e6xxx_chip *chip, int phy, u8 page) 258static int mv88e6xxx_phy_page_get(struct mv88e6xxx_chip *chip, int phy, u8 page)
@@ -515,11 +515,6 @@ static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
515 return err; 515 return err;
516} 516}
517 517
518static const struct mv88e6xxx_bus_ops mv88e6xxx_phy_ppu_ops = {
519 .read = mv88e6xxx_phy_ppu_read,
520 .write = mv88e6xxx_phy_ppu_write,
521};
522
523static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip) 518static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
524{ 519{
525 return chip->info->family == MV88E6XXX_FAMILY_6065; 520 return chip->info->family == MV88E6XXX_FAMILY_6065;
@@ -3214,6 +3209,91 @@ static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
3214 return err; 3209 return err;
3215} 3210}
3216 3211
3212static const struct mv88e6xxx_ops mv88e6085_ops = {
3213 .phy_read = mv88e6xxx_phy_ppu_read,
3214 .phy_write = mv88e6xxx_phy_ppu_write,
3215};
3216
3217static const struct mv88e6xxx_ops mv88e6095_ops = {
3218 .phy_read = mv88e6xxx_phy_ppu_read,
3219 .phy_write = mv88e6xxx_phy_ppu_write,
3220};
3221
3222static const struct mv88e6xxx_ops mv88e6123_ops = {
3223 .phy_read = mv88e6xxx_read,
3224 .phy_write = mv88e6xxx_write,
3225};
3226
3227static const struct mv88e6xxx_ops mv88e6131_ops = {
3228 .phy_read = mv88e6xxx_phy_ppu_read,
3229 .phy_write = mv88e6xxx_phy_ppu_write,
3230};
3231
3232static const struct mv88e6xxx_ops mv88e6161_ops = {
3233 .phy_read = mv88e6xxx_read,
3234 .phy_write = mv88e6xxx_write,
3235};
3236
3237static const struct mv88e6xxx_ops mv88e6165_ops = {
3238 .phy_read = mv88e6xxx_read,
3239 .phy_write = mv88e6xxx_write,
3240};
3241
3242static const struct mv88e6xxx_ops mv88e6171_ops = {
3243 .phy_read = mv88e6xxx_g2_smi_phy_read,
3244 .phy_write = mv88e6xxx_g2_smi_phy_write,
3245};
3246
3247static const struct mv88e6xxx_ops mv88e6172_ops = {
3248 .phy_read = mv88e6xxx_g2_smi_phy_read,
3249 .phy_write = mv88e6xxx_g2_smi_phy_write,
3250};
3251
3252static const struct mv88e6xxx_ops mv88e6175_ops = {
3253 .phy_read = mv88e6xxx_g2_smi_phy_read,
3254 .phy_write = mv88e6xxx_g2_smi_phy_write,
3255};
3256
3257static const struct mv88e6xxx_ops mv88e6176_ops = {
3258 .phy_read = mv88e6xxx_g2_smi_phy_read,
3259 .phy_write = mv88e6xxx_g2_smi_phy_write,
3260};
3261
3262static const struct mv88e6xxx_ops mv88e6185_ops = {
3263 .phy_read = mv88e6xxx_phy_ppu_read,
3264 .phy_write = mv88e6xxx_phy_ppu_write,
3265};
3266
3267static const struct mv88e6xxx_ops mv88e6240_ops = {
3268 .phy_read = mv88e6xxx_g2_smi_phy_read,
3269 .phy_write = mv88e6xxx_g2_smi_phy_write,
3270};
3271
3272static const struct mv88e6xxx_ops mv88e6320_ops = {
3273 .phy_read = mv88e6xxx_g2_smi_phy_read,
3274 .phy_write = mv88e6xxx_g2_smi_phy_write,
3275};
3276
3277static const struct mv88e6xxx_ops mv88e6321_ops = {
3278 .phy_read = mv88e6xxx_g2_smi_phy_read,
3279 .phy_write = mv88e6xxx_g2_smi_phy_write,
3280};
3281
3282static const struct mv88e6xxx_ops mv88e6350_ops = {
3283 .phy_read = mv88e6xxx_g2_smi_phy_read,
3284 .phy_write = mv88e6xxx_g2_smi_phy_write,
3285};
3286
3287static const struct mv88e6xxx_ops mv88e6351_ops = {
3288 .phy_read = mv88e6xxx_g2_smi_phy_read,
3289 .phy_write = mv88e6xxx_g2_smi_phy_write,
3290};
3291
3292static const struct mv88e6xxx_ops mv88e6352_ops = {
3293 .phy_read = mv88e6xxx_g2_smi_phy_read,
3294 .phy_write = mv88e6xxx_g2_smi_phy_write,
3295};
3296
3217static const struct mv88e6xxx_info mv88e6xxx_table[] = { 3297static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3218 [MV88E6085] = { 3298 [MV88E6085] = {
3219 .prod_num = PORT_SWITCH_ID_PROD_NUM_6085, 3299 .prod_num = PORT_SWITCH_ID_PROD_NUM_6085,
@@ -3225,6 +3305,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3225 .global1_addr = 0x1b, 3305 .global1_addr = 0x1b,
3226 .age_time_coeff = 15000, 3306 .age_time_coeff = 15000,
3227 .flags = MV88E6XXX_FLAGS_FAMILY_6097, 3307 .flags = MV88E6XXX_FLAGS_FAMILY_6097,
3308 .ops = &mv88e6085_ops,
3228 }, 3309 },
3229 3310
3230 [MV88E6095] = { 3311 [MV88E6095] = {
@@ -3237,6 +3318,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3237 .global1_addr = 0x1b, 3318 .global1_addr = 0x1b,
3238 .age_time_coeff = 15000, 3319 .age_time_coeff = 15000,
3239 .flags = MV88E6XXX_FLAGS_FAMILY_6095, 3320 .flags = MV88E6XXX_FLAGS_FAMILY_6095,
3321 .ops = &mv88e6095_ops,
3240 }, 3322 },
3241 3323
3242 [MV88E6123] = { 3324 [MV88E6123] = {
@@ -3249,6 +3331,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3249 .global1_addr = 0x1b, 3331 .global1_addr = 0x1b,
3250 .age_time_coeff = 15000, 3332 .age_time_coeff = 15000,
3251 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3333 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3334 .ops = &mv88e6123_ops,
3252 }, 3335 },
3253 3336
3254 [MV88E6131] = { 3337 [MV88E6131] = {
@@ -3261,6 +3344,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3261 .global1_addr = 0x1b, 3344 .global1_addr = 0x1b,
3262 .age_time_coeff = 15000, 3345 .age_time_coeff = 15000,
3263 .flags = MV88E6XXX_FLAGS_FAMILY_6185, 3346 .flags = MV88E6XXX_FLAGS_FAMILY_6185,
3347 .ops = &mv88e6131_ops,
3264 }, 3348 },
3265 3349
3266 [MV88E6161] = { 3350 [MV88E6161] = {
@@ -3273,6 +3357,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3273 .global1_addr = 0x1b, 3357 .global1_addr = 0x1b,
3274 .age_time_coeff = 15000, 3358 .age_time_coeff = 15000,
3275 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3359 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3360 .ops = &mv88e6161_ops,
3276 }, 3361 },
3277 3362
3278 [MV88E6165] = { 3363 [MV88E6165] = {
@@ -3285,6 +3370,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3285 .global1_addr = 0x1b, 3370 .global1_addr = 0x1b,
3286 .age_time_coeff = 15000, 3371 .age_time_coeff = 15000,
3287 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3372 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3373 .ops = &mv88e6165_ops,
3288 }, 3374 },
3289 3375
3290 [MV88E6171] = { 3376 [MV88E6171] = {
@@ -3297,6 +3383,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3297 .global1_addr = 0x1b, 3383 .global1_addr = 0x1b,
3298 .age_time_coeff = 15000, 3384 .age_time_coeff = 15000,
3299 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3385 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3386 .ops = &mv88e6171_ops,
3300 }, 3387 },
3301 3388
3302 [MV88E6172] = { 3389 [MV88E6172] = {
@@ -3309,6 +3396,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3309 .global1_addr = 0x1b, 3396 .global1_addr = 0x1b,
3310 .age_time_coeff = 15000, 3397 .age_time_coeff = 15000,
3311 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3398 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3399 .ops = &mv88e6172_ops,
3312 }, 3400 },
3313 3401
3314 [MV88E6175] = { 3402 [MV88E6175] = {
@@ -3321,6 +3409,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3321 .global1_addr = 0x1b, 3409 .global1_addr = 0x1b,
3322 .age_time_coeff = 15000, 3410 .age_time_coeff = 15000,
3323 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3411 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3412 .ops = &mv88e6175_ops,
3324 }, 3413 },
3325 3414
3326 [MV88E6176] = { 3415 [MV88E6176] = {
@@ -3333,6 +3422,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3333 .global1_addr = 0x1b, 3422 .global1_addr = 0x1b,
3334 .age_time_coeff = 15000, 3423 .age_time_coeff = 15000,
3335 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3424 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3425 .ops = &mv88e6176_ops,
3336 }, 3426 },
3337 3427
3338 [MV88E6185] = { 3428 [MV88E6185] = {
@@ -3345,6 +3435,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3345 .global1_addr = 0x1b, 3435 .global1_addr = 0x1b,
3346 .age_time_coeff = 15000, 3436 .age_time_coeff = 15000,
3347 .flags = MV88E6XXX_FLAGS_FAMILY_6185, 3437 .flags = MV88E6XXX_FLAGS_FAMILY_6185,
3438 .ops = &mv88e6185_ops,
3348 }, 3439 },
3349 3440
3350 [MV88E6240] = { 3441 [MV88E6240] = {
@@ -3357,6 +3448,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3357 .global1_addr = 0x1b, 3448 .global1_addr = 0x1b,
3358 .age_time_coeff = 15000, 3449 .age_time_coeff = 15000,
3359 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3450 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3451 .ops = &mv88e6240_ops,
3360 }, 3452 },
3361 3453
3362 [MV88E6320] = { 3454 [MV88E6320] = {
@@ -3369,6 +3461,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3369 .global1_addr = 0x1b, 3461 .global1_addr = 0x1b,
3370 .age_time_coeff = 15000, 3462 .age_time_coeff = 15000,
3371 .flags = MV88E6XXX_FLAGS_FAMILY_6320, 3463 .flags = MV88E6XXX_FLAGS_FAMILY_6320,
3464 .ops = &mv88e6320_ops,
3372 }, 3465 },
3373 3466
3374 [MV88E6321] = { 3467 [MV88E6321] = {
@@ -3381,6 +3474,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3381 .global1_addr = 0x1b, 3474 .global1_addr = 0x1b,
3382 .age_time_coeff = 15000, 3475 .age_time_coeff = 15000,
3383 .flags = MV88E6XXX_FLAGS_FAMILY_6320, 3476 .flags = MV88E6XXX_FLAGS_FAMILY_6320,
3477 .ops = &mv88e6321_ops,
3384 }, 3478 },
3385 3479
3386 [MV88E6350] = { 3480 [MV88E6350] = {
@@ -3393,6 +3487,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3393 .global1_addr = 0x1b, 3487 .global1_addr = 0x1b,
3394 .age_time_coeff = 15000, 3488 .age_time_coeff = 15000,
3395 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3489 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3490 .ops = &mv88e6350_ops,
3396 }, 3491 },
3397 3492
3398 [MV88E6351] = { 3493 [MV88E6351] = {
@@ -3405,6 +3500,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3405 .global1_addr = 0x1b, 3500 .global1_addr = 0x1b,
3406 .age_time_coeff = 15000, 3501 .age_time_coeff = 15000,
3407 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3502 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3503 .ops = &mv88e6351_ops,
3408 }, 3504 },
3409 3505
3410 [MV88E6352] = { 3506 [MV88E6352] = {
@@ -3417,6 +3513,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3417 .global1_addr = 0x1b, 3513 .global1_addr = 0x1b,
3418 .age_time_coeff = 15000, 3514 .age_time_coeff = 15000,
3419 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3515 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3516 .ops = &mv88e6352_ops,
3420 }, 3517 },
3421}; 3518};
3422 3519
@@ -3479,33 +3576,16 @@ static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
3479 return chip; 3576 return chip;
3480} 3577}
3481 3578
3482static const struct mv88e6xxx_bus_ops mv88e6xxx_g2_smi_phy_ops = {
3483 .read = mv88e6xxx_g2_smi_phy_read,
3484 .write = mv88e6xxx_g2_smi_phy_write,
3485};
3486
3487static const struct mv88e6xxx_bus_ops mv88e6xxx_phy_ops = {
3488 .read = mv88e6xxx_read,
3489 .write = mv88e6xxx_write,
3490};
3491
3492static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip) 3579static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip)
3493{ 3580{
3494 if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_SMI_PHY)) { 3581 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
3495 chip->phy_ops = &mv88e6xxx_g2_smi_phy_ops;
3496 } else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
3497 chip->phy_ops = &mv88e6xxx_phy_ppu_ops;
3498 mv88e6xxx_ppu_state_init(chip); 3582 mv88e6xxx_ppu_state_init(chip);
3499 } else {
3500 chip->phy_ops = &mv88e6xxx_phy_ops;
3501 }
3502} 3583}
3503 3584
3504static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip) 3585static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
3505{ 3586{
3506 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) { 3587 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
3507 mv88e6xxx_ppu_state_destroy(chip); 3588 mv88e6xxx_ppu_state_destroy(chip);
3508 }
3509} 3589}
3510 3590
3511static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip, 3591static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
index b9ef769311d9..8e1290278ef6 100644
--- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
@@ -427,8 +427,6 @@ enum mv88e6xxx_cap {
427 MV88E6XXX_CAP_G2_POT, /* (0x0f) Priority Override Table */ 427 MV88E6XXX_CAP_G2_POT, /* (0x0f) Priority Override Table */
428 MV88E6XXX_CAP_G2_EEPROM_CMD, /* (0x14) EEPROM Command */ 428 MV88E6XXX_CAP_G2_EEPROM_CMD, /* (0x14) EEPROM Command */
429 MV88E6XXX_CAP_G2_EEPROM_DATA, /* (0x15) EEPROM Data */ 429 MV88E6XXX_CAP_G2_EEPROM_DATA, /* (0x15) EEPROM Data */
430 MV88E6XXX_CAP_G2_SMI_PHY_CMD, /* (0x18) SMI PHY Command */
431 MV88E6XXX_CAP_G2_SMI_PHY_DATA, /* (0x19) SMI PHY Data */
432 430
433 /* PHY Polling Unit. 431 /* PHY Polling Unit.
434 * See GLOBAL_CONTROL_PPU_ENABLE and GLOBAL_STATUS_PPU_POLLING. 432 * See GLOBAL_CONTROL_PPU_ENABLE and GLOBAL_STATUS_PPU_POLLING.
@@ -479,8 +477,6 @@ enum mv88e6xxx_cap {
479#define MV88E6XXX_FLAG_G2_POT BIT_ULL(MV88E6XXX_CAP_G2_POT) 477#define MV88E6XXX_FLAG_G2_POT BIT_ULL(MV88E6XXX_CAP_G2_POT)
480#define MV88E6XXX_FLAG_G2_EEPROM_CMD BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_CMD) 478#define MV88E6XXX_FLAG_G2_EEPROM_CMD BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_CMD)
481#define MV88E6XXX_FLAG_G2_EEPROM_DATA BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_DATA) 479#define MV88E6XXX_FLAG_G2_EEPROM_DATA BIT_ULL(MV88E6XXX_CAP_G2_EEPROM_DATA)
482#define MV88E6XXX_FLAG_G2_SMI_PHY_CMD BIT_ULL(MV88E6XXX_CAP_G2_SMI_PHY_CMD)
483#define MV88E6XXX_FLAG_G2_SMI_PHY_DATA BIT_ULL(MV88E6XXX_CAP_G2_SMI_PHY_DATA)
484 480
485#define MV88E6XXX_FLAG_PPU BIT_ULL(MV88E6XXX_CAP_PPU) 481#define MV88E6XXX_FLAG_PPU BIT_ULL(MV88E6XXX_CAP_PPU)
486#define MV88E6XXX_FLAG_PPU_ACTIVE BIT_ULL(MV88E6XXX_CAP_PPU_ACTIVE) 482#define MV88E6XXX_FLAG_PPU_ACTIVE BIT_ULL(MV88E6XXX_CAP_PPU_ACTIVE)
@@ -514,11 +510,6 @@ enum mv88e6xxx_cap {
514 (MV88E6XXX_FLAG_PHY_PAGE | \ 510 (MV88E6XXX_FLAG_PHY_PAGE | \
515 MV88E6XXX_FLAG_SERDES) 511 MV88E6XXX_FLAG_SERDES)
516 512
517/* Indirect PHY access via Global2 SMI PHY registers */
518#define MV88E6XXX_FLAGS_SMI_PHY \
519 (MV88E6XXX_FLAG_G2_SMI_PHY_CMD |\
520 MV88E6XXX_FLAG_G2_SMI_PHY_DATA)
521
522#define MV88E6XXX_FLAGS_FAMILY_6095 \ 513#define MV88E6XXX_FLAGS_FAMILY_6095 \
523 (MV88E6XXX_FLAG_GLOBAL2 | \ 514 (MV88E6XXX_FLAG_GLOBAL2 | \
524 MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ 515 MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
@@ -577,8 +568,7 @@ enum mv88e6xxx_cap {
577 MV88E6XXX_FLAGS_EEPROM16 | \ 568 MV88E6XXX_FLAGS_EEPROM16 | \
578 MV88E6XXX_FLAGS_IRL | \ 569 MV88E6XXX_FLAGS_IRL | \
579 MV88E6XXX_FLAGS_MULTI_CHIP | \ 570 MV88E6XXX_FLAGS_MULTI_CHIP | \
580 MV88E6XXX_FLAGS_PVT | \ 571 MV88E6XXX_FLAGS_PVT)
581 MV88E6XXX_FLAGS_SMI_PHY)
582 572
583#define MV88E6XXX_FLAGS_FAMILY_6351 \ 573#define MV88E6XXX_FLAGS_FAMILY_6351 \
584 (MV88E6XXX_FLAG_EDSA | \ 574 (MV88E6XXX_FLAG_EDSA | \
@@ -595,8 +585,7 @@ enum mv88e6xxx_cap {
595 MV88E6XXX_FLAG_VTU | \ 585 MV88E6XXX_FLAG_VTU | \
596 MV88E6XXX_FLAGS_IRL | \ 586 MV88E6XXX_FLAGS_IRL | \
597 MV88E6XXX_FLAGS_MULTI_CHIP | \ 587 MV88E6XXX_FLAGS_MULTI_CHIP | \
598 MV88E6XXX_FLAGS_PVT | \ 588 MV88E6XXX_FLAGS_PVT)
599 MV88E6XXX_FLAGS_SMI_PHY)
600 589
601#define MV88E6XXX_FLAGS_FAMILY_6352 \ 590#define MV88E6XXX_FLAGS_FAMILY_6352 \
602 (MV88E6XXX_FLAG_EDSA | \ 591 (MV88E6XXX_FLAG_EDSA | \
@@ -617,8 +606,9 @@ enum mv88e6xxx_cap {
617 MV88E6XXX_FLAGS_IRL | \ 606 MV88E6XXX_FLAGS_IRL | \
618 MV88E6XXX_FLAGS_MULTI_CHIP | \ 607 MV88E6XXX_FLAGS_MULTI_CHIP | \
619 MV88E6XXX_FLAGS_PVT | \ 608 MV88E6XXX_FLAGS_PVT | \
620 MV88E6XXX_FLAGS_SERDES | \ 609 MV88E6XXX_FLAGS_SERDES)
621 MV88E6XXX_FLAGS_SMI_PHY) 610
611struct mv88e6xxx_ops;
622 612
623struct mv88e6xxx_info { 613struct mv88e6xxx_info {
624 enum mv88e6xxx_family family; 614 enum mv88e6xxx_family family;
@@ -630,6 +620,7 @@ struct mv88e6xxx_info {
630 unsigned int global1_addr; 620 unsigned int global1_addr;
631 unsigned int age_time_coeff; 621 unsigned int age_time_coeff;
632 unsigned long long flags; 622 unsigned long long flags;
623 const struct mv88e6xxx_ops *ops;
633}; 624};
634 625
635struct mv88e6xxx_atu_entry { 626struct mv88e6xxx_atu_entry {
@@ -710,6 +701,13 @@ struct mv88e6xxx_bus_ops {
710 int (*write)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val); 701 int (*write)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val);
711}; 702};
712 703
704struct mv88e6xxx_ops {
705 int (*phy_read)(struct mv88e6xxx_chip *chip, int addr, int reg,
706 u16 *val);
707 int (*phy_write)(struct mv88e6xxx_chip *chip, int addr, int reg,
708 u16 val);
709};
710
713enum stat_type { 711enum stat_type {
714 BANK0, 712 BANK0,
715 BANK1, 713 BANK1,