aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-09-29 12:21:53 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-30 01:25:59 -0400
commita935c0523c852feb619a050597bb545e7c818d81 (patch)
tree0765242b08388a3ddbc9a66de8ce55c4dbdf48d3
parent31fbe81fe3426dfb7f8056a7f5106c6b1841a9aa (diff)
net: dsa: mv88e6xxx: add global1 helpers
The Global (1) internal SMI device is an extended set of registers containing ATU, PPU, VTU, STU, etc. It is present on every switches, usually at SMI address 0x1B. But old models such as 88E6060 access it at address 0xF, thus using REG_GLOBAL is erroneous. Add a global1_addr info member used by mv88e6xxx_g1_{read,write} and mv88e6xxx_g1_wait helpers in a new global1.c file. This patch finally removes _mv88e6xxx_reg_{read,write}, in favor on the appropriate helpers. No functional changes here. 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/Makefile1
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c505
-rw-r--r--drivers/net/dsa/mv88e6xxx/global1.c34
-rw-r--r--drivers/net/dsa/mv88e6xxx/global1.h23
-rw-r--r--drivers/net/dsa/mv88e6xxx/mv88e6xxx.h2
5 files changed, 306 insertions, 259 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/Makefile b/drivers/net/dsa/mv88e6xxx/Makefile
index 697103934317..10ce820daa48 100644
--- a/drivers/net/dsa/mv88e6xxx/Makefile
+++ b/drivers/net/dsa/mv88e6xxx/Makefile
@@ -1,3 +1,4 @@
1obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o 1obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o
2mv88e6xxx-objs := chip.o 2mv88e6xxx-objs := chip.o
3mv88e6xxx-objs += global1.o
3mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_GLOBAL2) += global2.o 4mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_GLOBAL2) += global2.o
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index b2c25daef294..98dee2c63163 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -31,6 +31,7 @@
31#include <net/switchdev.h> 31#include <net/switchdev.h>
32 32
33#include "mv88e6xxx.h" 33#include "mv88e6xxx.h"
34#include "global1.h"
34#include "global2.h" 35#include "global2.h"
35 36
36static void assert_reg_lock(struct mv88e6xxx_chip *chip) 37static void assert_reg_lock(struct mv88e6xxx_chip *chip)
@@ -361,46 +362,27 @@ int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, u16 update)
361 return mv88e6xxx_write(chip, addr, reg, val); 362 return mv88e6xxx_write(chip, addr, reg, val);
362} 363}
363 364
364static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg) 365static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
365{ 366{
366 u16 val; 367 u16 val;
367 int err; 368 int i, err;
368 369
369 err = mv88e6xxx_read(chip, addr, reg, &val); 370 err = mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, &val);
370 if (err) 371 if (err)
371 return err; 372 return err;
372 373
373 return val; 374 err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL,
374} 375 val & ~GLOBAL_CONTROL_PPU_ENABLE);
375 376 if (err)
376static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr, 377 return err;
377 int reg, u16 val)
378{
379 return mv88e6xxx_write(chip, addr, reg, val);
380}
381
382static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
383{
384 int ret;
385 int i;
386
387 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
388 if (ret < 0)
389 return ret;
390
391 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
392 ret & ~GLOBAL_CONTROL_PPU_ENABLE);
393 if (ret)
394 return ret;
395 378
396 for (i = 0; i < 16; i++) { 379 for (i = 0; i < 16; i++) {
397 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS); 380 err = mv88e6xxx_g1_read(chip, GLOBAL_STATUS, &val);
398 if (ret < 0) 381 if (err)
399 return ret; 382 return err;
400 383
401 usleep_range(1000, 2000); 384 usleep_range(1000, 2000);
402 if ((ret & GLOBAL_STATUS_PPU_MASK) != 385 if ((val & GLOBAL_STATUS_PPU_MASK) != GLOBAL_STATUS_PPU_POLLING)
403 GLOBAL_STATUS_PPU_POLLING)
404 return 0; 386 return 0;
405 } 387 }
406 388
@@ -409,25 +391,25 @@ static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
409 391
410static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip) 392static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
411{ 393{
412 int ret, err, i; 394 u16 val;
395 int i, err;
413 396
414 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL); 397 err = mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, &val);
415 if (ret < 0) 398 if (err)
416 return ret; 399 return err;
417 400
418 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, 401 err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL,
419 ret | GLOBAL_CONTROL_PPU_ENABLE); 402 val | GLOBAL_CONTROL_PPU_ENABLE);
420 if (err) 403 if (err)
421 return err; 404 return err;
422 405
423 for (i = 0; i < 16; i++) { 406 for (i = 0; i < 16; i++) {
424 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS); 407 err = mv88e6xxx_g1_read(chip, GLOBAL_STATUS, &val);
425 if (ret < 0) 408 if (err)
426 return ret; 409 return err;
427 410
428 usleep_range(1000, 2000); 411 usleep_range(1000, 2000);
429 if ((ret & GLOBAL_STATUS_PPU_MASK) == 412 if ((val & GLOBAL_STATUS_PPU_MASK) == GLOBAL_STATUS_PPU_POLLING)
430 GLOBAL_STATUS_PPU_POLLING)
431 return 0; 413 return 0;
432 } 414 }
433 415
@@ -663,12 +645,12 @@ out:
663 645
664static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip) 646static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
665{ 647{
666 int ret; 648 u16 val;
667 int i; 649 int i, err;
668 650
669 for (i = 0; i < 10; i++) { 651 for (i = 0; i < 10; i++) {
670 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP); 652 err = mv88e6xxx_g1_read(chip, GLOBAL_STATS_OP, &val);
671 if ((ret & GLOBAL_STATS_OP_BUSY) == 0) 653 if ((val & GLOBAL_STATS_OP_BUSY) == 0)
672 return 0; 654 return 0;
673 } 655 }
674 656
@@ -677,55 +659,52 @@ static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
677 659
678static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port) 660static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
679{ 661{
680 int ret; 662 int err;
681 663
682 if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip)) 664 if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
683 port = (port + 1) << 5; 665 port = (port + 1) << 5;
684 666
685 /* Snapshot the hardware statistics counters for this port. */ 667 /* Snapshot the hardware statistics counters for this port. */
686 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP, 668 err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
687 GLOBAL_STATS_OP_CAPTURE_PORT | 669 GLOBAL_STATS_OP_CAPTURE_PORT |
688 GLOBAL_STATS_OP_HIST_RX_TX | port); 670 GLOBAL_STATS_OP_HIST_RX_TX | port);
689 if (ret < 0) 671 if (err)
690 return ret; 672 return err;
691 673
692 /* Wait for the snapshotting to complete. */ 674 /* Wait for the snapshotting to complete. */
693 ret = _mv88e6xxx_stats_wait(chip); 675 return _mv88e6xxx_stats_wait(chip);
694 if (ret < 0)
695 return ret;
696
697 return 0;
698} 676}
699 677
700static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip, 678static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
701 int stat, u32 *val) 679 int stat, u32 *val)
702{ 680{
703 u32 _val; 681 u32 value;
704 int ret; 682 u16 reg;
683 int err;
705 684
706 *val = 0; 685 *val = 0;
707 686
708 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP, 687 err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
709 GLOBAL_STATS_OP_READ_CAPTURED | 688 GLOBAL_STATS_OP_READ_CAPTURED |
710 GLOBAL_STATS_OP_HIST_RX_TX | stat); 689 GLOBAL_STATS_OP_HIST_RX_TX | stat);
711 if (ret < 0) 690 if (err)
712 return; 691 return;
713 692
714 ret = _mv88e6xxx_stats_wait(chip); 693 err = _mv88e6xxx_stats_wait(chip);
715 if (ret < 0) 694 if (err)
716 return; 695 return;
717 696
718 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32); 697 err = mv88e6xxx_g1_read(chip, GLOBAL_STATS_COUNTER_32, &reg);
719 if (ret < 0) 698 if (err)
720 return; 699 return;
721 700
722 _val = ret << 16; 701 value = reg << 16;
723 702
724 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01); 703 err = mv88e6xxx_g1_read(chip, GLOBAL_STATS_COUNTER_01, &reg);
725 if (ret < 0) 704 if (err)
726 return; 705 return;
727 706
728 *val = _val | ret; 707 *val = value | reg;
729} 708}
730 709
731static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = { 710static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
@@ -932,8 +911,7 @@ static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
932 911
933static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip) 912static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
934{ 913{
935 return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP, 914 return mv88e6xxx_g1_wait(chip, GLOBAL_ATU_OP, GLOBAL_ATU_OP_BUSY);
936 GLOBAL_ATU_OP_BUSY);
937} 915}
938 916
939static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port, 917static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
@@ -997,32 +975,31 @@ out:
997 975
998static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd) 976static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
999{ 977{
1000 int ret; 978 u16 val;
979 int err;
1001 980
1002 if (mv88e6xxx_has_fid_reg(chip)) { 981 if (mv88e6xxx_has_fid_reg(chip)) {
1003 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID, 982 err = mv88e6xxx_g1_write(chip, GLOBAL_ATU_FID, fid);
1004 fid); 983 if (err)
1005 if (ret < 0) 984 return err;
1006 return ret;
1007 } else if (mv88e6xxx_num_databases(chip) == 256) { 985 } else if (mv88e6xxx_num_databases(chip) == 256) {
1008 /* ATU DBNum[7:4] are located in ATU Control 15:12 */ 986 /* ATU DBNum[7:4] are located in ATU Control 15:12 */
1009 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL); 987 err = mv88e6xxx_g1_read(chip, GLOBAL_ATU_CONTROL, &val);
1010 if (ret < 0) 988 if (err)
1011 return ret; 989 return err;
1012 990
1013 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, 991 err = mv88e6xxx_g1_write(chip, GLOBAL_ATU_CONTROL,
1014 (ret & 0xfff) | 992 (val & 0xfff) | ((fid << 8) & 0xf000));
1015 ((fid << 8) & 0xf000)); 993 if (err)
1016 if (ret < 0) 994 return err;
1017 return ret;
1018 995
1019 /* ATU DBNum[3:0] are located in ATU Operation 3:0 */ 996 /* ATU DBNum[3:0] are located in ATU Operation 3:0 */
1020 cmd |= fid & 0xf; 997 cmd |= fid & 0xf;
1021 } 998 }
1022 999
1023 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd); 1000 err = mv88e6xxx_g1_write(chip, GLOBAL_ATU_OP, cmd);
1024 if (ret < 0) 1001 if (err)
1025 return ret; 1002 return err;
1026 1003
1027 return _mv88e6xxx_atu_wait(chip); 1004 return _mv88e6xxx_atu_wait(chip);
1028} 1005}
@@ -1047,7 +1024,7 @@ static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
1047 data |= (entry->portv_trunkid << shift) & mask; 1024 data |= (entry->portv_trunkid << shift) & mask;
1048 } 1025 }
1049 1026
1050 return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data); 1027 return mv88e6xxx_g1_write(chip, GLOBAL_ATU_DATA, data);
1051} 1028}
1052 1029
1053static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip, 1030static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
@@ -1277,17 +1254,16 @@ static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
1277 1254
1278static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip) 1255static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
1279{ 1256{
1280 return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP, 1257 return mv88e6xxx_g1_wait(chip, GLOBAL_VTU_OP, GLOBAL_VTU_OP_BUSY);
1281 GLOBAL_VTU_OP_BUSY);
1282} 1258}
1283 1259
1284static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op) 1260static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
1285{ 1261{
1286 int ret; 1262 int err;
1287 1263
1288 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op); 1264 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_OP, op);
1289 if (ret < 0) 1265 if (err)
1290 return ret; 1266 return err;
1291 1267
1292 return _mv88e6xxx_vtu_wait(chip); 1268 return _mv88e6xxx_vtu_wait(chip);
1293} 1269}
@@ -1308,16 +1284,14 @@ static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
1308 unsigned int nibble_offset) 1284 unsigned int nibble_offset)
1309{ 1285{
1310 u16 regs[3]; 1286 u16 regs[3];
1311 int i; 1287 int i, err;
1312 int ret;
1313 1288
1314 for (i = 0; i < 3; ++i) { 1289 for (i = 0; i < 3; ++i) {
1315 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 1290 u16 *reg = &regs[i];
1316 GLOBAL_VTU_DATA_0_3 + i);
1317 if (ret < 0)
1318 return ret;
1319 1291
1320 regs[i] = ret; 1292 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
1293 if (err)
1294 return err;
1321 } 1295 }
1322 1296
1323 for (i = 0; i < chip->info->num_ports; ++i) { 1297 for (i = 0; i < chip->info->num_ports; ++i) {
@@ -1347,8 +1321,7 @@ static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1347 unsigned int nibble_offset) 1321 unsigned int nibble_offset)
1348{ 1322{
1349 u16 regs[3] = { 0 }; 1323 u16 regs[3] = { 0 };
1350 int i; 1324 int i, err;
1351 int ret;
1352 1325
1353 for (i = 0; i < chip->info->num_ports; ++i) { 1326 for (i = 0; i < chip->info->num_ports; ++i) {
1354 unsigned int shift = (i % 4) * 4 + nibble_offset; 1327 unsigned int shift = (i % 4) * 4 + nibble_offset;
@@ -1358,10 +1331,11 @@ static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
1358 } 1331 }
1359 1332
1360 for (i = 0; i < 3; ++i) { 1333 for (i = 0; i < 3; ++i) {
1361 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 1334 u16 reg = regs[i];
1362 GLOBAL_VTU_DATA_0_3 + i, regs[i]); 1335
1363 if (ret < 0) 1336 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
1364 return ret; 1337 if (err)
1338 return err;
1365 } 1339 }
1366 1340
1367 return 0; 1341 return 0;
@@ -1381,63 +1355,61 @@ static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
1381 1355
1382static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid) 1356static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
1383{ 1357{
1384 return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, 1358 return mv88e6xxx_g1_write(chip, GLOBAL_VTU_VID,
1385 vid & GLOBAL_VTU_VID_MASK); 1359 vid & GLOBAL_VTU_VID_MASK);
1386} 1360}
1387 1361
1388static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip, 1362static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
1389 struct mv88e6xxx_vtu_stu_entry *entry) 1363 struct mv88e6xxx_vtu_stu_entry *entry)
1390{ 1364{
1391 struct mv88e6xxx_vtu_stu_entry next = { 0 }; 1365 struct mv88e6xxx_vtu_stu_entry next = { 0 };
1392 int ret; 1366 u16 val;
1367 int err;
1393 1368
1394 ret = _mv88e6xxx_vtu_wait(chip); 1369 err = _mv88e6xxx_vtu_wait(chip);
1395 if (ret < 0) 1370 if (err)
1396 return ret; 1371 return err;
1397 1372
1398 ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT); 1373 err = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
1399 if (ret < 0) 1374 if (err)
1400 return ret; 1375 return err;
1401 1376
1402 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID); 1377 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_VID, &val);
1403 if (ret < 0) 1378 if (err)
1404 return ret; 1379 return err;
1405 1380
1406 next.vid = ret & GLOBAL_VTU_VID_MASK; 1381 next.vid = val & GLOBAL_VTU_VID_MASK;
1407 next.valid = !!(ret & GLOBAL_VTU_VID_VALID); 1382 next.valid = !!(val & GLOBAL_VTU_VID_VALID);
1408 1383
1409 if (next.valid) { 1384 if (next.valid) {
1410 ret = mv88e6xxx_vtu_data_read(chip, &next); 1385 err = mv88e6xxx_vtu_data_read(chip, &next);
1411 if (ret < 0) 1386 if (err)
1412 return ret; 1387 return err;
1413 1388
1414 if (mv88e6xxx_has_fid_reg(chip)) { 1389 if (mv88e6xxx_has_fid_reg(chip)) {
1415 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 1390 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_FID, &val);
1416 GLOBAL_VTU_FID); 1391 if (err)
1417 if (ret < 0) 1392 return err;
1418 return ret;
1419 1393
1420 next.fid = ret & GLOBAL_VTU_FID_MASK; 1394 next.fid = val & GLOBAL_VTU_FID_MASK;
1421 } else if (mv88e6xxx_num_databases(chip) == 256) { 1395 } else if (mv88e6xxx_num_databases(chip) == 256) {
1422 /* VTU DBNum[7:4] are located in VTU Operation 11:8, and 1396 /* VTU DBNum[7:4] are located in VTU Operation 11:8, and
1423 * VTU DBNum[3:0] are located in VTU Operation 3:0 1397 * VTU DBNum[3:0] are located in VTU Operation 3:0
1424 */ 1398 */
1425 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 1399 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_OP, &val);
1426 GLOBAL_VTU_OP); 1400 if (err)
1427 if (ret < 0) 1401 return err;
1428 return ret;
1429 1402
1430 next.fid = (ret & 0xf00) >> 4; 1403 next.fid = (val & 0xf00) >> 4;
1431 next.fid |= ret & 0xf; 1404 next.fid |= val & 0xf;
1432 } 1405 }
1433 1406
1434 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) { 1407 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1435 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 1408 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_SID, &val);
1436 GLOBAL_VTU_SID); 1409 if (err)
1437 if (ret < 0) 1410 return err;
1438 return ret;
1439 1411
1440 next.sid = ret & GLOBAL_VTU_SID_MASK; 1412 next.sid = val & GLOBAL_VTU_SID_MASK;
1441 } 1413 }
1442 } 1414 }
1443 1415
@@ -1505,34 +1477,32 @@ static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1505{ 1477{
1506 u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE; 1478 u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
1507 u16 reg = 0; 1479 u16 reg = 0;
1508 int ret; 1480 int err;
1509 1481
1510 ret = _mv88e6xxx_vtu_wait(chip); 1482 err = _mv88e6xxx_vtu_wait(chip);
1511 if (ret < 0) 1483 if (err)
1512 return ret; 1484 return err;
1513 1485
1514 if (!entry->valid) 1486 if (!entry->valid)
1515 goto loadpurge; 1487 goto loadpurge;
1516 1488
1517 /* Write port member tags */ 1489 /* Write port member tags */
1518 ret = mv88e6xxx_vtu_data_write(chip, entry); 1490 err = mv88e6xxx_vtu_data_write(chip, entry);
1519 if (ret < 0) 1491 if (err)
1520 return ret; 1492 return err;
1521 1493
1522 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) { 1494 if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
1523 reg = entry->sid & GLOBAL_VTU_SID_MASK; 1495 reg = entry->sid & GLOBAL_VTU_SID_MASK;
1524 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, 1496 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_SID, reg);
1525 reg); 1497 if (err)
1526 if (ret < 0) 1498 return err;
1527 return ret;
1528 } 1499 }
1529 1500
1530 if (mv88e6xxx_has_fid_reg(chip)) { 1501 if (mv88e6xxx_has_fid_reg(chip)) {
1531 reg = entry->fid & GLOBAL_VTU_FID_MASK; 1502 reg = entry->fid & GLOBAL_VTU_FID_MASK;
1532 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID, 1503 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_FID, reg);
1533 reg); 1504 if (err)
1534 if (ret < 0) 1505 return err;
1535 return ret;
1536 } else if (mv88e6xxx_num_databases(chip) == 256) { 1506 } else if (mv88e6xxx_num_databases(chip) == 256) {
1537 /* VTU DBNum[7:4] are located in VTU Operation 11:8, and 1507 /* VTU DBNum[7:4] are located in VTU Operation 11:8, and
1538 * VTU DBNum[3:0] are located in VTU Operation 3:0 1508 * VTU DBNum[3:0] are located in VTU Operation 3:0
@@ -1544,9 +1514,9 @@ static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
1544 reg = GLOBAL_VTU_VID_VALID; 1514 reg = GLOBAL_VTU_VID_VALID;
1545loadpurge: 1515loadpurge:
1546 reg |= entry->vid & GLOBAL_VTU_VID_MASK; 1516 reg |= entry->vid & GLOBAL_VTU_VID_MASK;
1547 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg); 1517 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_VID, reg);
1548 if (ret < 0) 1518 if (err)
1549 return ret; 1519 return err;
1550 1520
1551 return _mv88e6xxx_vtu_cmd(chip, op); 1521 return _mv88e6xxx_vtu_cmd(chip, op);
1552} 1522}
@@ -1555,37 +1525,38 @@ static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
1555 struct mv88e6xxx_vtu_stu_entry *entry) 1525 struct mv88e6xxx_vtu_stu_entry *entry)
1556{ 1526{
1557 struct mv88e6xxx_vtu_stu_entry next = { 0 }; 1527 struct mv88e6xxx_vtu_stu_entry next = { 0 };
1558 int ret; 1528 u16 val;
1529 int err;
1559 1530
1560 ret = _mv88e6xxx_vtu_wait(chip); 1531 err = _mv88e6xxx_vtu_wait(chip);
1561 if (ret < 0) 1532 if (err)
1562 return ret; 1533 return err;
1563 1534
1564 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, 1535 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_SID,
1565 sid & GLOBAL_VTU_SID_MASK); 1536 sid & GLOBAL_VTU_SID_MASK);
1566 if (ret < 0) 1537 if (err)
1567 return ret; 1538 return err;
1568 1539
1569 ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT); 1540 err = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
1570 if (ret < 0) 1541 if (err)
1571 return ret; 1542 return err;
1572 1543
1573 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID); 1544 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_SID, &val);
1574 if (ret < 0) 1545 if (err)
1575 return ret; 1546 return err;
1576 1547
1577 next.sid = ret & GLOBAL_VTU_SID_MASK; 1548 next.sid = val & GLOBAL_VTU_SID_MASK;
1578 1549
1579 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID); 1550 err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_VID, &val);
1580 if (ret < 0) 1551 if (err)
1581 return ret; 1552 return err;
1582 1553
1583 next.valid = !!(ret & GLOBAL_VTU_VID_VALID); 1554 next.valid = !!(val & GLOBAL_VTU_VID_VALID);
1584 1555
1585 if (next.valid) { 1556 if (next.valid) {
1586 ret = mv88e6xxx_stu_data_read(chip, &next); 1557 err = mv88e6xxx_stu_data_read(chip, &next);
1587 if (ret < 0) 1558 if (err)
1588 return ret; 1559 return err;
1589 } 1560 }
1590 1561
1591 *entry = next; 1562 *entry = next;
@@ -1596,30 +1567,30 @@ static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
1596 struct mv88e6xxx_vtu_stu_entry *entry) 1567 struct mv88e6xxx_vtu_stu_entry *entry)
1597{ 1568{
1598 u16 reg = 0; 1569 u16 reg = 0;
1599 int ret; 1570 int err;
1600 1571
1601 ret = _mv88e6xxx_vtu_wait(chip); 1572 err = _mv88e6xxx_vtu_wait(chip);
1602 if (ret < 0) 1573 if (err)
1603 return ret; 1574 return err;
1604 1575
1605 if (!entry->valid) 1576 if (!entry->valid)
1606 goto loadpurge; 1577 goto loadpurge;
1607 1578
1608 /* Write port states */ 1579 /* Write port states */
1609 ret = mv88e6xxx_stu_data_write(chip, entry); 1580 err = mv88e6xxx_stu_data_write(chip, entry);
1610 if (ret < 0) 1581 if (err)
1611 return ret; 1582 return err;
1612 1583
1613 reg = GLOBAL_VTU_VID_VALID; 1584 reg = GLOBAL_VTU_VID_VALID;
1614loadpurge: 1585loadpurge:
1615 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg); 1586 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_VID, reg);
1616 if (ret < 0) 1587 if (err)
1617 return ret; 1588 return err;
1618 1589
1619 reg = entry->sid & GLOBAL_VTU_SID_MASK; 1590 reg = entry->sid & GLOBAL_VTU_SID_MASK;
1620 ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg); 1591 err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_SID, reg);
1621 if (ret < 0) 1592 if (err)
1622 return ret; 1593 return err;
1623 1594
1624 return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE); 1595 return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
1625} 1596}
@@ -2057,14 +2028,13 @@ unlock:
2057static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip, 2028static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2058 const unsigned char *addr) 2029 const unsigned char *addr)
2059{ 2030{
2060 int i, ret; 2031 int i, err;
2061 2032
2062 for (i = 0; i < 3; i++) { 2033 for (i = 0; i < 3; i++) {
2063 ret = _mv88e6xxx_reg_write( 2034 err = mv88e6xxx_g1_write(chip, GLOBAL_ATU_MAC_01 + i,
2064 chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i, 2035 (addr[i * 2] << 8) | addr[i * 2 + 1]);
2065 (addr[i * 2] << 8) | addr[i * 2 + 1]); 2036 if (err)
2066 if (ret < 0) 2037 return err;
2067 return ret;
2068 } 2038 }
2069 2039
2070 return 0; 2040 return 0;
@@ -2073,15 +2043,16 @@ static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
2073static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip, 2043static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
2074 unsigned char *addr) 2044 unsigned char *addr)
2075{ 2045{
2076 int i, ret; 2046 u16 val;
2047 int i, err;
2077 2048
2078 for (i = 0; i < 3; i++) { 2049 for (i = 0; i < 3; i++) {
2079 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 2050 err = mv88e6xxx_g1_read(chip, GLOBAL_ATU_MAC_01 + i, &val);
2080 GLOBAL_ATU_MAC_01 + i); 2051 if (err)
2081 if (ret < 0) 2052 return err;
2082 return ret; 2053
2083 addr[i * 2] = ret >> 8; 2054 addr[i * 2] = val >> 8;
2084 addr[i * 2 + 1] = ret & 0xff; 2055 addr[i * 2 + 1] = val & 0xff;
2085 } 2056 }
2086 2057
2087 return 0; 2058 return 0;
@@ -2217,31 +2188,32 @@ static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2217 struct mv88e6xxx_atu_entry *entry) 2188 struct mv88e6xxx_atu_entry *entry)
2218{ 2189{
2219 struct mv88e6xxx_atu_entry next = { 0 }; 2190 struct mv88e6xxx_atu_entry next = { 0 };
2220 int ret; 2191 u16 val;
2192 int err;
2221 2193
2222 next.fid = fid; 2194 next.fid = fid;
2223 2195
2224 ret = _mv88e6xxx_atu_wait(chip); 2196 err = _mv88e6xxx_atu_wait(chip);
2225 if (ret < 0) 2197 if (err)
2226 return ret; 2198 return err;
2227 2199
2228 ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB); 2200 err = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
2229 if (ret < 0) 2201 if (err)
2230 return ret; 2202 return err;
2231 2203
2232 ret = _mv88e6xxx_atu_mac_read(chip, next.mac); 2204 err = _mv88e6xxx_atu_mac_read(chip, next.mac);
2233 if (ret < 0) 2205 if (err)
2234 return ret; 2206 return err;
2235 2207
2236 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA); 2208 err = mv88e6xxx_g1_read(chip, GLOBAL_ATU_DATA, &val);
2237 if (ret < 0) 2209 if (err)
2238 return ret; 2210 return err;
2239 2211
2240 next.state = ret & GLOBAL_ATU_DATA_STATE_MASK; 2212 next.state = val & GLOBAL_ATU_DATA_STATE_MASK;
2241 if (next.state != GLOBAL_ATU_DATA_STATE_UNUSED) { 2213 if (next.state != GLOBAL_ATU_DATA_STATE_UNUSED) {
2242 unsigned int mask, shift; 2214 unsigned int mask, shift;
2243 2215
2244 if (ret & GLOBAL_ATU_DATA_TRUNK) { 2216 if (val & GLOBAL_ATU_DATA_TRUNK) {
2245 next.trunk = true; 2217 next.trunk = true;
2246 mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK; 2218 mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK;
2247 shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT; 2219 shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT;
@@ -2251,7 +2223,7 @@ static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2251 shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT; 2223 shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT;
2252 } 2224 }
2253 2225
2254 next.portv_trunkid = (ret & mask) >> shift; 2226 next.portv_trunkid = (val & mask) >> shift;
2255 } 2227 }
2256 2228
2257 *entry = next; 2229 *entry = next;
@@ -2422,8 +2394,8 @@ static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2422 u16 is_reset = (ppu_active ? 0x8800 : 0xc800); 2394 u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
2423 struct gpio_desc *gpiod = chip->reset; 2395 struct gpio_desc *gpiod = chip->reset;
2424 unsigned long timeout; 2396 unsigned long timeout;
2425 int err, ret;
2426 u16 reg; 2397 u16 reg;
2398 int err;
2427 int i; 2399 int i;
2428 2400
2429 /* Set all ports to the disabled state. */ 2401 /* Set all ports to the disabled state. */
@@ -2454,20 +2426,20 @@ static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
2454 * through global registers 0x18 and 0x19. 2426 * through global registers 0x18 and 0x19.
2455 */ 2427 */
2456 if (ppu_active) 2428 if (ppu_active)
2457 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000); 2429 err = mv88e6xxx_g1_write(chip, 0x04, 0xc000);
2458 else 2430 else
2459 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400); 2431 err = mv88e6xxx_g1_write(chip, 0x04, 0xc400);
2460 if (err) 2432 if (err)
2461 return err; 2433 return err;
2462 2434
2463 /* Wait up to one second for reset to complete. */ 2435 /* Wait up to one second for reset to complete. */
2464 timeout = jiffies + 1 * HZ; 2436 timeout = jiffies + 1 * HZ;
2465 while (time_before(jiffies, timeout)) { 2437 while (time_before(jiffies, timeout)) {
2466 ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00); 2438 err = mv88e6xxx_g1_read(chip, 0x00, &reg);
2467 if (ret < 0) 2439 if (err)
2468 return ret; 2440 return err;
2469 2441
2470 if ((ret & is_reset) == is_reset) 2442 if ((reg & is_reset) == is_reset)
2471 break; 2443 break;
2472 usleep_range(1000, 2000); 2444 usleep_range(1000, 2000);
2473 } 2445 }
@@ -2749,22 +2721,23 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
2749 return mv88e6xxx_port_write(chip, port, PORT_DEFAULT_VLAN, 0x0000); 2721 return mv88e6xxx_port_write(chip, port, PORT_DEFAULT_VLAN, 0x0000);
2750} 2722}
2751 2723
2752static int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr) 2724int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
2753{ 2725{
2754 int err; 2726 int err;
2755 2727
2756 err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_01, 2728 err = mv88e6xxx_g1_write(chip, GLOBAL_MAC_01, (addr[0] << 8) | addr[1]);
2757 (addr[0] << 8) | addr[1]);
2758 if (err) 2729 if (err)
2759 return err; 2730 return err;
2760 2731
2761 err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_23, 2732 err = mv88e6xxx_g1_write(chip, GLOBAL_MAC_23, (addr[2] << 8) | addr[3]);
2762 (addr[2] << 8) | addr[3]);
2763 if (err) 2733 if (err)
2764 return err; 2734 return err;
2765 2735
2766 return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_45, 2736 err = mv88e6xxx_g1_write(chip, GLOBAL_MAC_45, (addr[4] << 8) | addr[5]);
2767 (addr[4] << 8) | addr[5]); 2737 if (err)
2738 return err;
2739
2740 return 0;
2768} 2741}
2769 2742
2770static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip, 2743static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
@@ -2783,7 +2756,7 @@ static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
2783 /* Round to nearest multiple of coeff */ 2756 /* Round to nearest multiple of coeff */
2784 age_time = (msecs + coeff / 2) / coeff; 2757 age_time = (msecs + coeff / 2) / coeff;
2785 2758
2786 err = mv88e6xxx_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, &val); 2759 err = mv88e6xxx_g1_read(chip, GLOBAL_ATU_CONTROL, &val);
2787 if (err) 2760 if (err)
2788 return err; 2761 return err;
2789 2762
@@ -2791,7 +2764,7 @@ static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
2791 val &= ~0xff0; 2764 val &= ~0xff0;
2792 val |= age_time << 4; 2765 val |= age_time << 4;
2793 2766
2794 return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, val); 2767 return mv88e6xxx_g1_write(chip, GLOBAL_ATU_CONTROL, val);
2795} 2768}
2796 2769
2797static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds, 2770static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
@@ -2822,7 +2795,7 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2822 mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE)) 2795 mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
2823 reg |= GLOBAL_CONTROL_PPU_ENABLE; 2796 reg |= GLOBAL_CONTROL_PPU_ENABLE;
2824 2797
2825 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg); 2798 err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL, reg);
2826 if (err) 2799 if (err)
2827 return err; 2800 return err;
2828 2801
@@ -2832,15 +2805,14 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2832 reg = upstream_port << GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT | 2805 reg = upstream_port << GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT |
2833 upstream_port << GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT | 2806 upstream_port << GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT |
2834 upstream_port << GLOBAL_MONITOR_CONTROL_ARP_SHIFT; 2807 upstream_port << GLOBAL_MONITOR_CONTROL_ARP_SHIFT;
2835 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL, 2808 err = mv88e6xxx_g1_write(chip, GLOBAL_MONITOR_CONTROL, reg);
2836 reg);
2837 if (err) 2809 if (err)
2838 return err; 2810 return err;
2839 2811
2840 /* Disable remote management, and set the switch's DSA device number. */ 2812 /* Disable remote management, and set the switch's DSA device number. */
2841 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2, 2813 err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL_2,
2842 GLOBAL_CONTROL_2_MULTIPLE_CASCADE | 2814 GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
2843 (ds->index & 0x1f)); 2815 (ds->index & 0x1f));
2844 if (err) 2816 if (err)
2845 return err; 2817 return err;
2846 2818
@@ -2853,8 +2825,8 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2853 * enable address learn messages to be sent to all message 2825 * enable address learn messages to be sent to all message
2854 * ports. 2826 * ports.
2855 */ 2827 */
2856 err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, 2828 err = mv88e6xxx_g1_write(chip, GLOBAL_ATU_CONTROL,
2857 GLOBAL_ATU_CONTROL_LEARN2ALL); 2829 GLOBAL_ATU_CONTROL_LEARN2ALL);
2858 if (err) 2830 if (err)
2859 return err; 2831 return err;
2860 2832
@@ -2868,39 +2840,39 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
2868 return err; 2840 return err;
2869 2841
2870 /* Configure the IP ToS mapping registers. */ 2842 /* Configure the IP ToS mapping registers. */
2871 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000); 2843 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_0, 0x0000);
2872 if (err) 2844 if (err)
2873 return err; 2845 return err;
2874 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000); 2846 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_1, 0x0000);
2875 if (err) 2847 if (err)
2876 return err; 2848 return err;
2877 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555); 2849 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_2, 0x5555);
2878 if (err) 2850 if (err)
2879 return err; 2851 return err;
2880 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555); 2852 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_3, 0x5555);
2881 if (err) 2853 if (err)
2882 return err; 2854 return err;
2883 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa); 2855 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_4, 0xaaaa);
2884 if (err) 2856 if (err)
2885 return err; 2857 return err;
2886 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa); 2858 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_5, 0xaaaa);
2887 if (err) 2859 if (err)
2888 return err; 2860 return err;
2889 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff); 2861 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_6, 0xffff);
2890 if (err) 2862 if (err)
2891 return err; 2863 return err;
2892 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff); 2864 err = mv88e6xxx_g1_write(chip, GLOBAL_IP_PRI_7, 0xffff);
2893 if (err) 2865 if (err)
2894 return err; 2866 return err;
2895 2867
2896 /* Configure the IEEE 802.1p priority mapping register. */ 2868 /* Configure the IEEE 802.1p priority mapping register. */
2897 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41); 2869 err = mv88e6xxx_g1_write(chip, GLOBAL_IEEE_PRI, 0xfa41);
2898 if (err) 2870 if (err)
2899 return err; 2871 return err;
2900 2872
2901 /* Clear the statistics counters for all ports */ 2873 /* Clear the statistics counters for all ports */
2902 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP, 2874 err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
2903 GLOBAL_STATS_OP_FLUSH_ALL); 2875 GLOBAL_STATS_OP_FLUSH_ALL);
2904 if (err) 2876 if (err)
2905 return err; 2877 return err;
2906 2878
@@ -3265,6 +3237,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3265 .num_databases = 4096, 3237 .num_databases = 4096,
3266 .num_ports = 10, 3238 .num_ports = 10,
3267 .port_base_addr = 0x10, 3239 .port_base_addr = 0x10,
3240 .global1_addr = 0x1b,
3268 .age_time_coeff = 15000, 3241 .age_time_coeff = 15000,
3269 .flags = MV88E6XXX_FLAGS_FAMILY_6097, 3242 .flags = MV88E6XXX_FLAGS_FAMILY_6097,
3270 }, 3243 },
@@ -3276,6 +3249,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3276 .num_databases = 256, 3249 .num_databases = 256,
3277 .num_ports = 11, 3250 .num_ports = 11,
3278 .port_base_addr = 0x10, 3251 .port_base_addr = 0x10,
3252 .global1_addr = 0x1b,
3279 .age_time_coeff = 15000, 3253 .age_time_coeff = 15000,
3280 .flags = MV88E6XXX_FLAGS_FAMILY_6095, 3254 .flags = MV88E6XXX_FLAGS_FAMILY_6095,
3281 }, 3255 },
@@ -3287,6 +3261,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3287 .num_databases = 4096, 3261 .num_databases = 4096,
3288 .num_ports = 3, 3262 .num_ports = 3,
3289 .port_base_addr = 0x10, 3263 .port_base_addr = 0x10,
3264 .global1_addr = 0x1b,
3290 .age_time_coeff = 15000, 3265 .age_time_coeff = 15000,
3291 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3266 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3292 }, 3267 },
@@ -3298,6 +3273,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3298 .num_databases = 256, 3273 .num_databases = 256,
3299 .num_ports = 8, 3274 .num_ports = 8,
3300 .port_base_addr = 0x10, 3275 .port_base_addr = 0x10,
3276 .global1_addr = 0x1b,
3301 .age_time_coeff = 15000, 3277 .age_time_coeff = 15000,
3302 .flags = MV88E6XXX_FLAGS_FAMILY_6185, 3278 .flags = MV88E6XXX_FLAGS_FAMILY_6185,
3303 }, 3279 },
@@ -3309,6 +3285,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3309 .num_databases = 4096, 3285 .num_databases = 4096,
3310 .num_ports = 6, 3286 .num_ports = 6,
3311 .port_base_addr = 0x10, 3287 .port_base_addr = 0x10,
3288 .global1_addr = 0x1b,
3312 .age_time_coeff = 15000, 3289 .age_time_coeff = 15000,
3313 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3290 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3314 }, 3291 },
@@ -3320,6 +3297,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3320 .num_databases = 4096, 3297 .num_databases = 4096,
3321 .num_ports = 6, 3298 .num_ports = 6,
3322 .port_base_addr = 0x10, 3299 .port_base_addr = 0x10,
3300 .global1_addr = 0x1b,
3323 .age_time_coeff = 15000, 3301 .age_time_coeff = 15000,
3324 .flags = MV88E6XXX_FLAGS_FAMILY_6165, 3302 .flags = MV88E6XXX_FLAGS_FAMILY_6165,
3325 }, 3303 },
@@ -3331,6 +3309,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3331 .num_databases = 4096, 3309 .num_databases = 4096,
3332 .num_ports = 7, 3310 .num_ports = 7,
3333 .port_base_addr = 0x10, 3311 .port_base_addr = 0x10,
3312 .global1_addr = 0x1b,
3334 .age_time_coeff = 15000, 3313 .age_time_coeff = 15000,
3335 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3314 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3336 }, 3315 },
@@ -3342,6 +3321,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3342 .num_databases = 4096, 3321 .num_databases = 4096,
3343 .num_ports = 7, 3322 .num_ports = 7,
3344 .port_base_addr = 0x10, 3323 .port_base_addr = 0x10,
3324 .global1_addr = 0x1b,
3345 .age_time_coeff = 15000, 3325 .age_time_coeff = 15000,
3346 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3326 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3347 }, 3327 },
@@ -3353,6 +3333,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3353 .num_databases = 4096, 3333 .num_databases = 4096,
3354 .num_ports = 7, 3334 .num_ports = 7,
3355 .port_base_addr = 0x10, 3335 .port_base_addr = 0x10,
3336 .global1_addr = 0x1b,
3356 .age_time_coeff = 15000, 3337 .age_time_coeff = 15000,
3357 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3338 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3358 }, 3339 },
@@ -3364,6 +3345,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3364 .num_databases = 4096, 3345 .num_databases = 4096,
3365 .num_ports = 7, 3346 .num_ports = 7,
3366 .port_base_addr = 0x10, 3347 .port_base_addr = 0x10,
3348 .global1_addr = 0x1b,
3367 .age_time_coeff = 15000, 3349 .age_time_coeff = 15000,
3368 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3350 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3369 }, 3351 },
@@ -3375,6 +3357,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3375 .num_databases = 256, 3357 .num_databases = 256,
3376 .num_ports = 10, 3358 .num_ports = 10,
3377 .port_base_addr = 0x10, 3359 .port_base_addr = 0x10,
3360 .global1_addr = 0x1b,
3378 .age_time_coeff = 15000, 3361 .age_time_coeff = 15000,
3379 .flags = MV88E6XXX_FLAGS_FAMILY_6185, 3362 .flags = MV88E6XXX_FLAGS_FAMILY_6185,
3380 }, 3363 },
@@ -3386,6 +3369,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3386 .num_databases = 4096, 3369 .num_databases = 4096,
3387 .num_ports = 7, 3370 .num_ports = 7,
3388 .port_base_addr = 0x10, 3371 .port_base_addr = 0x10,
3372 .global1_addr = 0x1b,
3389 .age_time_coeff = 15000, 3373 .age_time_coeff = 15000,
3390 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3374 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3391 }, 3375 },
@@ -3397,6 +3381,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3397 .num_databases = 4096, 3381 .num_databases = 4096,
3398 .num_ports = 7, 3382 .num_ports = 7,
3399 .port_base_addr = 0x10, 3383 .port_base_addr = 0x10,
3384 .global1_addr = 0x1b,
3400 .age_time_coeff = 15000, 3385 .age_time_coeff = 15000,
3401 .flags = MV88E6XXX_FLAGS_FAMILY_6320, 3386 .flags = MV88E6XXX_FLAGS_FAMILY_6320,
3402 }, 3387 },
@@ -3408,6 +3393,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3408 .num_databases = 4096, 3393 .num_databases = 4096,
3409 .num_ports = 7, 3394 .num_ports = 7,
3410 .port_base_addr = 0x10, 3395 .port_base_addr = 0x10,
3396 .global1_addr = 0x1b,
3411 .age_time_coeff = 15000, 3397 .age_time_coeff = 15000,
3412 .flags = MV88E6XXX_FLAGS_FAMILY_6320, 3398 .flags = MV88E6XXX_FLAGS_FAMILY_6320,
3413 }, 3399 },
@@ -3419,6 +3405,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3419 .num_databases = 4096, 3405 .num_databases = 4096,
3420 .num_ports = 7, 3406 .num_ports = 7,
3421 .port_base_addr = 0x10, 3407 .port_base_addr = 0x10,
3408 .global1_addr = 0x1b,
3422 .age_time_coeff = 15000, 3409 .age_time_coeff = 15000,
3423 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3410 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3424 }, 3411 },
@@ -3430,6 +3417,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3430 .num_databases = 4096, 3417 .num_databases = 4096,
3431 .num_ports = 7, 3418 .num_ports = 7,
3432 .port_base_addr = 0x10, 3419 .port_base_addr = 0x10,
3420 .global1_addr = 0x1b,
3433 .age_time_coeff = 15000, 3421 .age_time_coeff = 15000,
3434 .flags = MV88E6XXX_FLAGS_FAMILY_6351, 3422 .flags = MV88E6XXX_FLAGS_FAMILY_6351,
3435 }, 3423 },
@@ -3441,6 +3429,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
3441 .num_databases = 4096, 3429 .num_databases = 4096,
3442 .num_ports = 7, 3430 .num_ports = 7,
3443 .port_base_addr = 0x10, 3431 .port_base_addr = 0x10,
3432 .global1_addr = 0x1b,
3444 .age_time_coeff = 15000, 3433 .age_time_coeff = 15000,
3445 .flags = MV88E6XXX_FLAGS_FAMILY_6352, 3434 .flags = MV88E6XXX_FLAGS_FAMILY_6352,
3446 }, 3435 },
diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c
new file mode 100644
index 000000000000..d358720b6c2d
--- /dev/null
+++ b/drivers/net/dsa/mv88e6xxx/global1.c
@@ -0,0 +1,34 @@
1/*
2 * Marvell 88E6xxx Switch Global (1) Registers support
3 *
4 * Copyright (c) 2008 Marvell Semiconductor
5 *
6 * Copyright (c) 2016 Vivien Didelot <vivien.didelot@savoirfairelinux.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 */
13
14#include "mv88e6xxx.h"
15#include "global1.h"
16
17int mv88e6xxx_g1_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
18{
19 int addr = chip->info->global1_addr;
20
21 return mv88e6xxx_read(chip, addr, reg, val);
22}
23
24int mv88e6xxx_g1_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
25{
26 int addr = chip->info->global1_addr;
27
28 return mv88e6xxx_write(chip, addr, reg, val);
29}
30
31int mv88e6xxx_g1_wait(struct mv88e6xxx_chip *chip, int reg, u16 mask)
32{
33 return mv88e6xxx_wait(chip, chip->info->global1_addr, reg, mask);
34}
diff --git a/drivers/net/dsa/mv88e6xxx/global1.h b/drivers/net/dsa/mv88e6xxx/global1.h
new file mode 100644
index 000000000000..62291e6fe3a3
--- /dev/null
+++ b/drivers/net/dsa/mv88e6xxx/global1.h
@@ -0,0 +1,23 @@
1/*
2 * Marvell 88E6xxx Switch Global (1) Registers support
3 *
4 * Copyright (c) 2008 Marvell Semiconductor
5 *
6 * Copyright (c) 2016 Vivien Didelot <vivien.didelot@savoirfairelinux.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 */
13
14#ifndef _MV88E6XXX_GLOBAL1_H
15#define _MV88E6XXX_GLOBAL1_H
16
17#include "mv88e6xxx.h"
18
19int mv88e6xxx_g1_read(struct mv88e6xxx_chip *chip, int reg, u16 *val);
20int mv88e6xxx_g1_write(struct mv88e6xxx_chip *chip, int reg, u16 val);
21int mv88e6xxx_g1_wait(struct mv88e6xxx_chip *chip, int reg, u16 mask);
22
23#endif /* _MV88E6XXX_GLOBAL1_H */
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
index 827988397fd8..bf78f6dc18cf 100644
--- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
@@ -159,7 +159,6 @@
159#define PORT_TAG_REGMAP_0123 0x18 159#define PORT_TAG_REGMAP_0123 0x18
160#define PORT_TAG_REGMAP_4567 0x19 160#define PORT_TAG_REGMAP_4567 0x19
161 161
162#define REG_GLOBAL 0x1b
163#define GLOBAL_STATUS 0x00 162#define GLOBAL_STATUS 0x00
164#define GLOBAL_STATUS_PPU_STATE BIT(15) /* 6351 and 6171 */ 163#define GLOBAL_STATUS_PPU_STATE BIT(15) /* 6351 and 6171 */
165/* Two bits for 6165, 6185 etc */ 164/* Two bits for 6165, 6185 etc */
@@ -613,6 +612,7 @@ struct mv88e6xxx_info {
613 unsigned int num_databases; 612 unsigned int num_databases;
614 unsigned int num_ports; 613 unsigned int num_ports;
615 unsigned int port_base_addr; 614 unsigned int port_base_addr;
615 unsigned int global1_addr;
616 unsigned int age_time_coeff; 616 unsigned int age_time_coeff;
617 unsigned long long flags; 617 unsigned long long flags;
618}; 618};