1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Marvell 88E6xxx Switch Global (1) Registers support
5 * Copyright (c) 2008 Marvell Semiconductor
7 * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
8 * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
11 #include <linux/bitfield.h>
16 int mv88e6xxx_g1_read(struct mv88e6xxx_chip
*chip
, int reg
, u16
*val
)
18 int addr
= chip
->info
->global1_addr
;
20 return mv88e6xxx_read(chip
, addr
, reg
, val
);
23 int mv88e6xxx_g1_write(struct mv88e6xxx_chip
*chip
, int reg
, u16 val
)
25 int addr
= chip
->info
->global1_addr
;
27 return mv88e6xxx_write(chip
, addr
, reg
, val
);
30 int mv88e6xxx_g1_wait_bit(struct mv88e6xxx_chip
*chip
, int reg
, int
33 return mv88e6xxx_wait_bit(chip
, chip
->info
->global1_addr
, reg
,
37 int mv88e6xxx_g1_wait_mask(struct mv88e6xxx_chip
*chip
, int reg
,
40 return mv88e6xxx_wait_mask(chip
, chip
->info
->global1_addr
, reg
,
44 /* Offset 0x00: Switch Global Status Register */
46 static int mv88e6185_g1_wait_ppu_disabled(struct mv88e6xxx_chip
*chip
)
48 return mv88e6xxx_g1_wait_mask(chip
, MV88E6XXX_G1_STS
,
49 MV88E6185_G1_STS_PPU_STATE_MASK
,
50 MV88E6185_G1_STS_PPU_STATE_DISABLED
);
53 static int mv88e6185_g1_wait_ppu_polling(struct mv88e6xxx_chip
*chip
)
55 return mv88e6xxx_g1_wait_mask(chip
, MV88E6XXX_G1_STS
,
56 MV88E6185_G1_STS_PPU_STATE_MASK
,
57 MV88E6185_G1_STS_PPU_STATE_POLLING
);
60 static int mv88e6352_g1_wait_ppu_polling(struct mv88e6xxx_chip
*chip
)
62 int bit
= __bf_shf(MV88E6352_G1_STS_PPU_STATE
);
64 return mv88e6xxx_g1_wait_bit(chip
, MV88E6XXX_G1_STS
, bit
, 1);
67 static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip
*chip
)
69 int bit
= __bf_shf(MV88E6XXX_G1_STS_INIT_READY
);
71 /* Wait up to 1 second for the switch to be ready. The InitReady bit 11
72 * is set to a one when all units inside the device (ATU, VTU, etc.)
73 * have finished their initialization and are ready to accept frames.
75 return mv88e6xxx_g1_wait_bit(chip
, MV88E6XXX_G1_STS
, bit
, 1);
78 static int mv88e6250_g1_eeprom_reload(struct mv88e6xxx_chip
*chip
)
80 /* MV88E6185_G1_CTL1_RELOAD_EEPROM is also valid for 88E6250 */
81 int bit
= __bf_shf(MV88E6185_G1_CTL1_RELOAD_EEPROM
);
85 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
89 val
|= MV88E6185_G1_CTL1_RELOAD_EEPROM
;
91 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
95 return mv88e6xxx_g1_wait_bit(chip
, MV88E6XXX_G1_CTL1
, bit
, 0);
98 /* Returns 0 when done, -EBUSY when waiting, other negative codes on error */
99 static int mv88e6xxx_g1_is_eeprom_done(struct mv88e6xxx_chip
*chip
)
104 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_STS
, &val
);
106 dev_err(chip
->dev
, "Error reading status");
110 /* If the switch is still resetting, it may not
111 * respond on the bus, and so MDIO read returns
112 * 0xffff. Differentiate between that, and waiting for
113 * the EEPROM to be done by bit 0 being set.
115 if (val
== 0xffff || !(val
& BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE
)))
121 /* As the EEInt (EEPROM done) flag clears on read if the status register, this
122 * function must be called directly after a hard reset or EEPROM ReLoad request,
123 * or the done condition may have been missed
125 int mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip
*chip
)
127 const unsigned long timeout
= jiffies
+ 1 * HZ
;
130 /* Wait up to 1 second for the switch to finish reading the
133 while (time_before(jiffies
, timeout
)) {
134 ret
= mv88e6xxx_g1_is_eeprom_done(chip
);
139 dev_err(chip
->dev
, "Timeout waiting for EEPROM done");
143 int mv88e6250_g1_wait_eeprom_done_prereset(struct mv88e6xxx_chip
*chip
)
147 ret
= mv88e6xxx_g1_is_eeprom_done(chip
);
151 /* Pre-reset, we don't know the state of the switch - when
152 * mv88e6xxx_g1_is_eeprom_done() returns -EBUSY, that may be because
153 * the switch is actually busy reading the EEPROM, or because
154 * MV88E6XXX_G1_STS_IRQ_EEPROM_DONE has been cleared by an unrelated
155 * status register read already.
157 * To account for the latter case, trigger another EEPROM reload for
158 * another chance at seeing the done flag.
160 ret
= mv88e6250_g1_eeprom_reload(chip
);
164 return mv88e6xxx_g1_wait_eeprom_done(chip
);
167 /* Offset 0x01: Switch MAC Address Register Bytes 0 & 1
168 * Offset 0x02: Switch MAC Address Register Bytes 2 & 3
169 * Offset 0x03: Switch MAC Address Register Bytes 4 & 5
171 int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip
*chip
, u8
*addr
)
176 reg
= (addr
[0] << 8) | addr
[1];
177 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_MAC_01
, reg
);
181 reg
= (addr
[2] << 8) | addr
[3];
182 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_MAC_23
, reg
);
186 reg
= (addr
[4] << 8) | addr
[5];
187 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_MAC_45
, reg
);
194 /* Offset 0x04: Switch Global Control Register */
196 int mv88e6185_g1_reset(struct mv88e6xxx_chip
*chip
)
201 /* Set the SWReset bit 15 along with the PPUEn bit 14, to also restart
202 * the PPU, including re-doing PHY detection and initialization
204 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
208 val
|= MV88E6XXX_G1_CTL1_SW_RESET
;
209 val
|= MV88E6XXX_G1_CTL1_PPU_ENABLE
;
211 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
215 err
= mv88e6xxx_g1_wait_init_ready(chip
);
219 return mv88e6185_g1_wait_ppu_polling(chip
);
222 int mv88e6250_g1_reset(struct mv88e6xxx_chip
*chip
)
227 /* Set the SWReset bit 15 */
228 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
232 val
|= MV88E6XXX_G1_CTL1_SW_RESET
;
234 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
238 return mv88e6xxx_g1_wait_init_ready(chip
);
241 int mv88e6352_g1_reset(struct mv88e6xxx_chip
*chip
)
245 err
= mv88e6250_g1_reset(chip
);
249 return mv88e6352_g1_wait_ppu_polling(chip
);
252 int mv88e6185_g1_ppu_enable(struct mv88e6xxx_chip
*chip
)
257 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
261 val
|= MV88E6XXX_G1_CTL1_PPU_ENABLE
;
263 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
267 return mv88e6185_g1_wait_ppu_polling(chip
);
270 int mv88e6185_g1_ppu_disable(struct mv88e6xxx_chip
*chip
)
275 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
279 val
&= ~MV88E6XXX_G1_CTL1_PPU_ENABLE
;
281 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
285 return mv88e6185_g1_wait_ppu_disabled(chip
);
288 int mv88e6185_g1_set_max_frame_size(struct mv88e6xxx_chip
*chip
, int mtu
)
293 mtu
+= ETH_HLEN
+ ETH_FCS_LEN
;
295 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL1
, &val
);
299 val
&= ~MV88E6185_G1_CTL1_MAX_FRAME_1632
;
302 val
|= MV88E6185_G1_CTL1_MAX_FRAME_1632
;
304 return mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL1
, val
);
307 /* Offset 0x10: IP-PRI Mapping Register 0
308 * Offset 0x11: IP-PRI Mapping Register 1
309 * Offset 0x12: IP-PRI Mapping Register 2
310 * Offset 0x13: IP-PRI Mapping Register 3
311 * Offset 0x14: IP-PRI Mapping Register 4
312 * Offset 0x15: IP-PRI Mapping Register 5
313 * Offset 0x16: IP-PRI Mapping Register 6
314 * Offset 0x17: IP-PRI Mapping Register 7
317 int mv88e6085_g1_ip_pri_map(struct mv88e6xxx_chip
*chip
)
321 /* Reset the IP TOS/DiffServ/Traffic priorities to defaults */
322 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_0
, 0x0000);
326 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_1
, 0x0000);
330 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_2
, 0x5555);
334 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_3
, 0x5555);
338 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_4
, 0xaaaa);
342 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_5
, 0xaaaa);
346 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_6
, 0xffff);
350 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IP_PRI_7
, 0xffff);
357 /* Offset 0x18: IEEE-PRI Register */
359 int mv88e6085_g1_ieee_pri_map(struct mv88e6xxx_chip
*chip
)
361 /* Reset the IEEE Tag priorities to defaults */
362 return mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IEEE_PRI
, 0xfa41);
365 int mv88e6250_g1_ieee_pri_map(struct mv88e6xxx_chip
*chip
)
367 /* Reset the IEEE Tag priorities to defaults */
368 return mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_IEEE_PRI
, 0xfa50);
371 /* Offset 0x1a: Monitor Control */
372 /* Offset 0x1a: Monitor & MGMT Control on some devices */
374 int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip
*chip
,
375 enum mv88e6xxx_egress_direction direction
,
381 err
= mv88e6xxx_g1_read(chip
, MV88E6185_G1_MONITOR_CTL
, ®
);
386 case MV88E6XXX_EGRESS_DIR_INGRESS
:
387 reg
&= ~MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK
;
389 __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK
);
391 case MV88E6XXX_EGRESS_DIR_EGRESS
:
392 reg
&= ~MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK
;
394 __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK
);
400 return mv88e6xxx_g1_write(chip
, MV88E6185_G1_MONITOR_CTL
, reg
);
403 /* Older generations also call this the ARP destination. It has been
404 * generalized in more modern devices such that more than ARP can
407 int mv88e6095_g1_set_cpu_port(struct mv88e6xxx_chip
*chip
, int port
)
412 err
= mv88e6xxx_g1_read(chip
, MV88E6185_G1_MONITOR_CTL
, ®
);
416 reg
&= ~MV88E6185_G1_MONITOR_CTL_ARP_DEST_MASK
;
417 reg
|= port
<< __bf_shf(MV88E6185_G1_MONITOR_CTL_ARP_DEST_MASK
);
419 return mv88e6xxx_g1_write(chip
, MV88E6185_G1_MONITOR_CTL
, reg
);
422 static int mv88e6390_g1_monitor_write(struct mv88e6xxx_chip
*chip
,
423 u16 pointer
, u8 data
)
427 reg
= MV88E6390_G1_MONITOR_MGMT_CTL_UPDATE
| pointer
| data
;
429 return mv88e6xxx_g1_write(chip
, MV88E6390_G1_MONITOR_MGMT_CTL
, reg
);
432 int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip
*chip
,
433 enum mv88e6xxx_egress_direction direction
,
439 case MV88E6XXX_EGRESS_DIR_INGRESS
:
440 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST
;
442 case MV88E6XXX_EGRESS_DIR_EGRESS
:
443 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST
;
449 return mv88e6390_g1_monitor_write(chip
, ptr
, port
);
452 int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip
*chip
, int port
)
454 u16 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST
;
456 /* Use the default high priority for management frames sent to
459 port
|= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST_MGMTPRI
;
461 return mv88e6390_g1_monitor_write(chip
, ptr
, port
);
464 int mv88e6390_g1_set_ptp_cpu_port(struct mv88e6xxx_chip
*chip
, int port
)
466 u16 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_PTP_CPU_DEST
;
468 /* Use the default high priority for PTP frames sent to
471 port
|= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST_MGMTPRI
;
473 return mv88e6390_g1_monitor_write(chip
, ptr
, port
);
476 int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip
*chip
)
481 /* 01:80:c2:00:00:00-01:80:c2:00:00:07 are Management */
482 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200000XLO
;
483 err
= mv88e6390_g1_monitor_write(chip
, ptr
, 0xff);
487 /* 01:80:c2:00:00:08-01:80:c2:00:00:0f are Management */
488 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200000XHI
;
489 err
= mv88e6390_g1_monitor_write(chip
, ptr
, 0xff);
493 /* 01:80:c2:00:00:20-01:80:c2:00:00:27 are Management */
494 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200002XLO
;
495 err
= mv88e6390_g1_monitor_write(chip
, ptr
, 0xff);
499 /* 01:80:c2:00:00:28-01:80:c2:00:00:2f are Management */
500 ptr
= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200002XHI
;
501 err
= mv88e6390_g1_monitor_write(chip
, ptr
, 0xff);
508 /* Offset 0x1c: Global Control 2 */
510 static int mv88e6xxx_g1_ctl2_mask(struct mv88e6xxx_chip
*chip
, u16 mask
,
516 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_CTL2
, ®
);
523 return mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_CTL2
, reg
);
526 int mv88e6185_g1_set_cascade_port(struct mv88e6xxx_chip
*chip
, int port
)
528 const u16 mask
= MV88E6185_G1_CTL2_CASCADE_PORT_MASK
;
530 return mv88e6xxx_g1_ctl2_mask(chip
, mask
, port
<< __bf_shf(mask
));
533 int mv88e6085_g1_rmu_disable(struct mv88e6xxx_chip
*chip
)
535 return mv88e6xxx_g1_ctl2_mask(chip
, MV88E6085_G1_CTL2_P10RM
|
536 MV88E6085_G1_CTL2_RM_ENABLE
, 0);
539 int mv88e6352_g1_rmu_disable(struct mv88e6xxx_chip
*chip
)
541 return mv88e6xxx_g1_ctl2_mask(chip
, MV88E6352_G1_CTL2_RMU_MODE_MASK
,
542 MV88E6352_G1_CTL2_RMU_MODE_DISABLED
);
545 int mv88e6390_g1_rmu_disable(struct mv88e6xxx_chip
*chip
)
547 return mv88e6xxx_g1_ctl2_mask(chip
, MV88E6390_G1_CTL2_RMU_MODE_MASK
,
548 MV88E6390_G1_CTL2_RMU_MODE_DISABLED
);
551 int mv88e6390_g1_stats_set_histogram(struct mv88e6xxx_chip
*chip
)
553 return mv88e6xxx_g1_ctl2_mask(chip
, MV88E6390_G1_CTL2_HIST_MODE_MASK
,
554 MV88E6390_G1_CTL2_HIST_MODE_RX
);
557 int mv88e6xxx_g1_set_device_number(struct mv88e6xxx_chip
*chip
, int index
)
559 return mv88e6xxx_g1_ctl2_mask(chip
,
560 MV88E6XXX_G1_CTL2_DEVICE_NUMBER_MASK
,
564 /* Offset 0x1d: Statistics Operation 2 */
566 static int mv88e6xxx_g1_stats_wait(struct mv88e6xxx_chip
*chip
)
568 int bit
= __bf_shf(MV88E6XXX_G1_STATS_OP_BUSY
);
570 return mv88e6xxx_g1_wait_bit(chip
, MV88E6XXX_G1_STATS_OP
, bit
, 0);
573 int mv88e6095_g1_stats_set_histogram(struct mv88e6xxx_chip
*chip
)
578 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_STATS_OP
, &val
);
582 val
|= MV88E6XXX_G1_STATS_OP_HIST_RX
;
584 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_STATS_OP
, val
);
589 int mv88e6xxx_g1_stats_snapshot(struct mv88e6xxx_chip
*chip
, int port
)
593 /* Snapshot the hardware statistics counters for this port. */
594 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_STATS_OP
,
595 MV88E6XXX_G1_STATS_OP_BUSY
|
596 MV88E6XXX_G1_STATS_OP_CAPTURE_PORT
|
597 MV88E6XXX_G1_STATS_OP_HIST_RX
| port
);
601 /* Wait for the snapshotting to complete. */
602 return mv88e6xxx_g1_stats_wait(chip
);
605 int mv88e6320_g1_stats_snapshot(struct mv88e6xxx_chip
*chip
, int port
)
607 port
= (port
+ 1) << 5;
609 return mv88e6xxx_g1_stats_snapshot(chip
, port
);
612 int mv88e6390_g1_stats_snapshot(struct mv88e6xxx_chip
*chip
, int port
)
616 port
= (port
+ 1) << 5;
618 /* Snapshot the hardware statistics counters for this port. */
619 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_STATS_OP
,
620 MV88E6XXX_G1_STATS_OP_BUSY
|
621 MV88E6XXX_G1_STATS_OP_CAPTURE_PORT
| port
);
625 /* Wait for the snapshotting to complete. */
626 return mv88e6xxx_g1_stats_wait(chip
);
629 void mv88e6xxx_g1_stats_read(struct mv88e6xxx_chip
*chip
, int stat
, u32
*val
)
637 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_STATS_OP
,
638 MV88E6XXX_G1_STATS_OP_BUSY
|
639 MV88E6XXX_G1_STATS_OP_READ_CAPTURED
| stat
);
643 err
= mv88e6xxx_g1_stats_wait(chip
);
647 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_STATS_COUNTER_32
, ®
);
653 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_STATS_COUNTER_01
, ®
);
660 int mv88e6xxx_g1_stats_clear(struct mv88e6xxx_chip
*chip
)
665 err
= mv88e6xxx_g1_read(chip
, MV88E6XXX_G1_STATS_OP
, &val
);
669 /* Keep the histogram mode bits */
670 val
&= MV88E6XXX_G1_STATS_OP_HIST_RX_TX
;
671 val
|= MV88E6XXX_G1_STATS_OP_BUSY
| MV88E6XXX_G1_STATS_OP_FLUSH_ALL
;
673 err
= mv88e6xxx_g1_write(chip
, MV88E6XXX_G1_STATS_OP
, val
);
677 /* Wait for the flush to complete. */
678 return mv88e6xxx_g1_stats_wait(chip
);