1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Marvell 88E6xxx Switch Port 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>
12 #include <linux/if_bridge.h>
13 #include <linux/phy.h>
14 #include <linux/phylink.h>
20 int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
23 int addr = chip->info->port_base_addr + port;
25 return mv88e6xxx_read(chip, addr, reg, val);
28 int mv88e6xxx_port_write(struct mv88e6xxx_chip *chip, int port, int reg,
31 int addr = chip->info->port_base_addr + port;
33 return mv88e6xxx_write(chip, addr, reg, val);
36 /* Offset 0x00: MAC (or PCS or Physical) Status Register
38 * For most devices, this is read only. However the 6185 has the MyPause
41 int mv88e6185_port_set_pause(struct mv88e6xxx_chip *chip, int port,
47 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
52 reg |= MV88E6XXX_PORT_STS_MY_PAUSE;
54 reg &= ~MV88E6XXX_PORT_STS_MY_PAUSE;
56 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
59 /* Offset 0x01: MAC (or PCS or Physical) Control Register
61 * Link, Duplex and Flow Control have one force bit, one value bit.
63 * For port's MAC speed, ForceSpd (or SpdValue) bits 1:0 program the value.
64 * Alternative values require the 200BASE (or AltSpeed) bit 12 set.
65 * Newer chips need a ForcedSpd bit 13 set to consider the value.
68 static int mv88e6xxx_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
74 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, ®);
78 reg &= ~(MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
79 MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK);
82 case PHY_INTERFACE_MODE_RGMII_RXID:
83 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK;
85 case PHY_INTERFACE_MODE_RGMII_TXID:
86 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
88 case PHY_INTERFACE_MODE_RGMII_ID:
89 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
90 MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
92 case PHY_INTERFACE_MODE_RGMII:
98 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
102 dev_dbg(chip->dev, "p%d: delay RXCLK %s, TXCLK %s\n", port,
103 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK ? "yes" : "no",
104 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK ? "yes" : "no");
109 int mv88e6352_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
110 phy_interface_t mode)
115 return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
118 int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
119 phy_interface_t mode)
124 return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
127 int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
132 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, ®);
136 reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
137 MV88E6XXX_PORT_MAC_CTL_LINK_UP);
140 case LINK_FORCED_DOWN:
141 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK;
144 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
145 MV88E6XXX_PORT_MAC_CTL_LINK_UP;
148 /* normal link detection */
154 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
158 dev_dbg(chip->dev, "p%d: %s link %s\n", port,
159 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_LINK ? "Force" : "Unforce",
160 reg & MV88E6XXX_PORT_MAC_CTL_LINK_UP ? "up" : "down");
165 static int mv88e6xxx_port_set_speed_duplex(struct mv88e6xxx_chip *chip,
166 int port, int speed, bool alt_bit,
167 bool force_bit, int duplex)
174 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_10;
177 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100;
181 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100 |
182 MV88E6390_PORT_MAC_CTL_ALTSPEED;
184 ctrl = MV88E6065_PORT_MAC_CTL_SPEED_200;
187 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_1000;
191 ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 |
192 MV88E6390_PORT_MAC_CTL_ALTSPEED;
194 ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000;
197 /* all bits set, fall through... */
199 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_UNFORCED;
207 ctrl |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX;
210 ctrl |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
211 MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL;
213 case DUPLEX_UNFORCED:
214 /* normal duplex detection */
220 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, ®);
224 reg &= ~(MV88E6XXX_PORT_MAC_CTL_SPEED_MASK |
225 MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
226 MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL);
229 reg &= ~MV88E6390_PORT_MAC_CTL_ALTSPEED;
231 reg &= ~MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
232 if (speed != SPEED_UNFORCED)
233 ctrl |= MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
237 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
242 dev_dbg(chip->dev, "p%d: Speed set to %d Mbps\n", port, speed);
244 dev_dbg(chip->dev, "p%d: Speed unforced\n", port);
245 dev_dbg(chip->dev, "p%d: %s %s duplex\n", port,
246 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX ? "Force" : "Unforce",
247 reg & MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL ? "full" : "half");
252 /* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
253 int mv88e6065_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
254 int speed, int duplex)
256 if (speed == SPEED_MAX)
262 /* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
263 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, false, false,
267 /* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
268 int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
269 int speed, int duplex)
271 if (speed == SPEED_MAX)
274 if (speed == 200 || speed > 1000)
277 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, false, false,
281 /* Support 10, 100 Mbps (e.g. 88E6250 family) */
282 int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
283 int speed, int duplex)
285 if (speed == SPEED_MAX)
291 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, false, false,
295 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6341) */
296 int mv88e6341_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
297 int speed, int duplex)
299 if (speed == SPEED_MAX)
300 speed = port < 5 ? 1000 : 2500;
305 if (speed == 200 && port != 0)
308 if (speed == 2500 && port < 5)
311 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, !port, true,
315 phy_interface_t mv88e6341_port_max_speed_mode(int port)
318 return PHY_INTERFACE_MODE_2500BASEX;
320 return PHY_INTERFACE_MODE_NA;
323 /* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
324 int mv88e6352_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
325 int speed, int duplex)
327 if (speed == SPEED_MAX)
333 if (speed == 200 && port < 5)
336 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, true, false,
340 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6390) */
341 int mv88e6390_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
342 int speed, int duplex)
344 if (speed == SPEED_MAX)
345 speed = port < 9 ? 1000 : 2500;
350 if (speed == 200 && port != 0)
353 if (speed == 2500 && port < 9)
356 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, true, true,
360 phy_interface_t mv88e6390_port_max_speed_mode(int port)
362 if (port == 9 || port == 10)
363 return PHY_INTERFACE_MODE_2500BASEX;
365 return PHY_INTERFACE_MODE_NA;
368 /* Support 10, 100, 200, 1000, 2500, 10000 Mbps (e.g. 88E6190X) */
369 int mv88e6390x_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
370 int speed, int duplex)
372 if (speed == SPEED_MAX)
373 speed = port < 9 ? 1000 : 10000;
375 if (speed == 200 && port != 0)
378 if (speed >= 2500 && port < 9)
381 return mv88e6xxx_port_set_speed_duplex(chip, port, speed, true, true,
385 phy_interface_t mv88e6390x_port_max_speed_mode(int port)
387 if (port == 9 || port == 10)
388 return PHY_INTERFACE_MODE_XAUI;
390 return PHY_INTERFACE_MODE_NA;
393 static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
394 phy_interface_t mode, bool force)
401 /* Default to a slow mode, so freeing up SERDES interfaces for
402 * other ports which might use them for SFPs.
404 if (mode == PHY_INTERFACE_MODE_NA)
405 mode = PHY_INTERFACE_MODE_1000BASEX;
408 case PHY_INTERFACE_MODE_1000BASEX:
409 cmode = MV88E6XXX_PORT_STS_CMODE_1000BASEX;
411 case PHY_INTERFACE_MODE_SGMII:
412 cmode = MV88E6XXX_PORT_STS_CMODE_SGMII;
414 case PHY_INTERFACE_MODE_2500BASEX:
415 cmode = MV88E6XXX_PORT_STS_CMODE_2500BASEX;
417 case PHY_INTERFACE_MODE_XGMII:
418 case PHY_INTERFACE_MODE_XAUI:
419 cmode = MV88E6XXX_PORT_STS_CMODE_XAUI;
421 case PHY_INTERFACE_MODE_RXAUI:
422 cmode = MV88E6XXX_PORT_STS_CMODE_RXAUI;
428 /* cmode doesn't change, nothing to do for us unless forced */
429 if (cmode == chip->ports[port].cmode && !force)
432 lane = mv88e6xxx_serdes_get_lane(chip, port);
434 if (chip->ports[port].serdes_irq) {
435 err = mv88e6xxx_serdes_irq_disable(chip, port, lane);
440 err = mv88e6xxx_serdes_power_down(chip, port, lane);
445 chip->ports[port].cmode = 0;
448 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
452 reg &= ~MV88E6XXX_PORT_STS_CMODE_MASK;
455 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
459 chip->ports[port].cmode = cmode;
461 lane = mv88e6xxx_serdes_get_lane(chip, port);
465 err = mv88e6xxx_serdes_power_up(chip, port, lane);
469 if (chip->ports[port].serdes_irq) {
470 err = mv88e6xxx_serdes_irq_enable(chip, port, lane);
479 int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
480 phy_interface_t mode)
482 if (port != 9 && port != 10)
485 return mv88e6xxx_port_set_cmode(chip, port, mode, false);
488 int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
489 phy_interface_t mode)
491 if (port != 9 && port != 10)
495 case PHY_INTERFACE_MODE_NA:
497 case PHY_INTERFACE_MODE_XGMII:
498 case PHY_INTERFACE_MODE_XAUI:
499 case PHY_INTERFACE_MODE_RXAUI:
505 return mv88e6xxx_port_set_cmode(chip, port, mode, false);
508 static int mv88e6341_port_set_cmode_writable(struct mv88e6xxx_chip *chip,
517 addr = chip->info->port_base_addr + port;
519 err = mv88e6xxx_port_hidden_read(chip, 0x7, addr, 0, ®);
523 bits = MV88E6341_PORT_RESERVED_1A_FORCE_CMODE |
524 MV88E6341_PORT_RESERVED_1A_SGMII_AN;
526 if ((reg & bits) == bits)
530 return mv88e6xxx_port_hidden_write(chip, 0x7, addr, 0, reg);
533 int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
534 phy_interface_t mode)
542 case PHY_INTERFACE_MODE_NA:
544 case PHY_INTERFACE_MODE_XGMII:
545 case PHY_INTERFACE_MODE_XAUI:
546 case PHY_INTERFACE_MODE_RXAUI:
552 err = mv88e6341_port_set_cmode_writable(chip, port);
556 return mv88e6xxx_port_set_cmode(chip, port, mode, true);
559 int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
564 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
568 *cmode = reg & MV88E6185_PORT_STS_CMODE_MASK;
573 int mv88e6352_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
578 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
582 *cmode = reg & MV88E6XXX_PORT_STS_CMODE_MASK;
587 /* Offset 0x02: Jamming Control
589 * Do not limit the period of time that this port can be paused for by
590 * the remote end or the period of time that this port can pause the
593 int mv88e6097_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
596 return mv88e6xxx_port_write(chip, port, MV88E6097_PORT_JAM_CTL,
600 int mv88e6390_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
605 err = mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
606 MV88E6390_PORT_FLOW_CTL_UPDATE |
607 MV88E6390_PORT_FLOW_CTL_LIMIT_IN | in);
611 return mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
612 MV88E6390_PORT_FLOW_CTL_UPDATE |
613 MV88E6390_PORT_FLOW_CTL_LIMIT_OUT | out);
616 /* Offset 0x04: Port Control Register */
618 static const char * const mv88e6xxx_port_state_names[] = {
619 [MV88E6XXX_PORT_CTL0_STATE_DISABLED] = "Disabled",
620 [MV88E6XXX_PORT_CTL0_STATE_BLOCKING] = "Blocking/Listening",
621 [MV88E6XXX_PORT_CTL0_STATE_LEARNING] = "Learning",
622 [MV88E6XXX_PORT_CTL0_STATE_FORWARDING] = "Forwarding",
625 int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state)
630 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
634 reg &= ~MV88E6XXX_PORT_CTL0_STATE_MASK;
637 case BR_STATE_DISABLED:
638 state = MV88E6XXX_PORT_CTL0_STATE_DISABLED;
640 case BR_STATE_BLOCKING:
641 case BR_STATE_LISTENING:
642 state = MV88E6XXX_PORT_CTL0_STATE_BLOCKING;
644 case BR_STATE_LEARNING:
645 state = MV88E6XXX_PORT_CTL0_STATE_LEARNING;
647 case BR_STATE_FORWARDING:
648 state = MV88E6XXX_PORT_CTL0_STATE_FORWARDING;
656 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
660 dev_dbg(chip->dev, "p%d: PortState set to %s\n", port,
661 mv88e6xxx_port_state_names[state]);
666 int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,
667 enum mv88e6xxx_egress_mode mode)
672 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
676 reg &= ~MV88E6XXX_PORT_CTL0_EGRESS_MODE_MASK;
679 case MV88E6XXX_EGRESS_MODE_UNMODIFIED:
680 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNMODIFIED;
682 case MV88E6XXX_EGRESS_MODE_UNTAGGED:
683 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNTAGGED;
685 case MV88E6XXX_EGRESS_MODE_TAGGED:
686 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_TAGGED;
688 case MV88E6XXX_EGRESS_MODE_ETHERTYPE:
689 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_ETHER_TYPE_DSA;
695 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
698 int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
699 enum mv88e6xxx_frame_mode mode)
704 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
708 reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
711 case MV88E6XXX_FRAME_MODE_NORMAL:
712 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
714 case MV88E6XXX_FRAME_MODE_DSA:
715 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
721 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
724 int mv88e6351_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
725 enum mv88e6xxx_frame_mode mode)
730 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
734 reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
737 case MV88E6XXX_FRAME_MODE_NORMAL:
738 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
740 case MV88E6XXX_FRAME_MODE_DSA:
741 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
743 case MV88E6XXX_FRAME_MODE_PROVIDER:
744 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_PROVIDER;
746 case MV88E6XXX_FRAME_MODE_ETHERTYPE:
747 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_ETHER_TYPE_DSA;
753 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
756 static int mv88e6185_port_set_forward_unknown(struct mv88e6xxx_chip *chip,
757 int port, bool unicast)
762 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
767 reg |= MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
769 reg &= ~MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
771 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
774 int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
775 bool unicast, bool multicast)
780 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, ®);
784 reg &= ~MV88E6352_PORT_CTL0_EGRESS_FLOODS_MASK;
786 if (unicast && multicast)
787 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_ALL_UNKNOWN_DA;
789 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_MC_DA;
791 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_UC_DA;
793 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_DA;
795 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
798 /* Offset 0x05: Port Control 1 */
800 int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,
806 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1, &val);
811 val |= MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
813 val &= ~MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
815 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1, val);
818 /* Offset 0x06: Port Based VLAN Map */
820 int mv88e6xxx_port_set_vlan_map(struct mv88e6xxx_chip *chip, int port, u16 map)
822 const u16 mask = mv88e6xxx_port_mask(chip);
826 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, ®);
833 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
837 dev_dbg(chip->dev, "p%d: VLANTable set to %.3x\n", port, map);
842 int mv88e6xxx_port_get_fid(struct mv88e6xxx_chip *chip, int port, u16 *fid)
844 const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
848 /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
849 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, ®);
853 *fid = (reg & 0xf000) >> 12;
855 /* Port's default FID upper bits are located in reg 0x05, offset 0 */
857 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
862 *fid |= (reg & upper_mask) << 4;
868 int mv88e6xxx_port_set_fid(struct mv88e6xxx_chip *chip, int port, u16 fid)
870 const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
874 if (fid >= mv88e6xxx_num_databases(chip))
877 /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
878 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, ®);
883 reg |= (fid & 0x000f) << 12;
885 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
889 /* Port's default FID upper bits are located in reg 0x05, offset 0 */
891 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
897 reg |= (fid >> 4) & upper_mask;
899 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1,
905 dev_dbg(chip->dev, "p%d: FID set to %u\n", port, fid);
910 /* Offset 0x07: Default Port VLAN ID & Priority */
912 int mv88e6xxx_port_get_pvid(struct mv88e6xxx_chip *chip, int port, u16 *pvid)
917 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
922 *pvid = reg & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
927 int mv88e6xxx_port_set_pvid(struct mv88e6xxx_chip *chip, int port, u16 pvid)
932 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
937 reg &= ~MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
938 reg |= pvid & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
940 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
945 dev_dbg(chip->dev, "p%d: DefaultVID set to %u\n", port, pvid);
950 /* Offset 0x08: Port Control 2 Register */
952 static const char * const mv88e6xxx_port_8021q_mode_names[] = {
953 [MV88E6XXX_PORT_CTL2_8021Q_MODE_DISABLED] = "Disabled",
954 [MV88E6XXX_PORT_CTL2_8021Q_MODE_FALLBACK] = "Fallback",
955 [MV88E6XXX_PORT_CTL2_8021Q_MODE_CHECK] = "Check",
956 [MV88E6XXX_PORT_CTL2_8021Q_MODE_SECURE] = "Secure",
959 static int mv88e6185_port_set_default_forward(struct mv88e6xxx_chip *chip,
960 int port, bool multicast)
965 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
970 reg |= MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
972 reg &= ~MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
974 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
977 int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
978 bool unicast, bool multicast)
982 err = mv88e6185_port_set_forward_unknown(chip, port, unicast);
986 return mv88e6185_port_set_default_forward(chip, port, multicast);
989 int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
995 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
999 reg &= ~MV88E6095_PORT_CTL2_CPU_PORT_MASK;
1000 reg |= upstream_port;
1002 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1005 int mv88e6xxx_port_set_mirror(struct mv88e6xxx_chip *chip, int port,
1006 enum mv88e6xxx_egress_direction direction,
1014 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
1018 switch (direction) {
1019 case MV88E6XXX_EGRESS_DIR_INGRESS:
1020 bit = MV88E6XXX_PORT_CTL2_INGRESS_MONITOR;
1021 mirror_port = &chip->ports[port].mirror_ingress;
1023 case MV88E6XXX_EGRESS_DIR_EGRESS:
1024 bit = MV88E6XXX_PORT_CTL2_EGRESS_MONITOR;
1025 mirror_port = &chip->ports[port].mirror_egress;
1035 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1037 *mirror_port = mirror;
1042 int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
1048 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
1052 reg &= ~MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
1053 reg |= mode & MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
1055 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1059 dev_dbg(chip->dev, "p%d: 802.1QMode set to %s\n", port,
1060 mv88e6xxx_port_8021q_mode_names[mode]);
1065 int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
1070 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
1074 reg |= MV88E6XXX_PORT_CTL2_MAP_DA;
1076 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1079 int mv88e6165_port_set_jumbo_size(struct mv88e6xxx_chip *chip, int port,
1085 size += VLAN_ETH_HLEN + ETH_FCS_LEN;
1087 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, ®);
1091 reg &= ~MV88E6XXX_PORT_CTL2_JUMBO_MODE_MASK;
1094 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_1522;
1095 else if (size <= 2048)
1096 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_2048;
1097 else if (size <= 10240)
1098 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_10240;
1102 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1105 /* Offset 0x09: Port Rate Control */
1107 int mv88e6095_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
1109 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
1113 int mv88e6097_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
1115 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
1119 /* Offset 0x0C: Port ATU Control */
1121 int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port)
1123 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ATU_CTL, 0);
1126 /* Offset 0x0D: (Priority) Override Register */
1128 int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port)
1130 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_PRI_OVERRIDE, 0);
1133 /* Offset 0x0f: Port Ether type */
1135 int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
1138 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ETH_TYPE, etype);
1141 /* Offset 0x18: Port IEEE Priority Remapping Registers [0-3]
1142 * Offset 0x19: Port IEEE Priority Remapping Registers [4-7]
1145 int mv88e6095_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
1149 /* Use a direct priority mapping for all IEEE tagged frames */
1150 err = mv88e6xxx_port_write(chip, port,
1151 MV88E6095_PORT_IEEE_PRIO_REMAP_0123,
1156 return mv88e6xxx_port_write(chip, port,
1157 MV88E6095_PORT_IEEE_PRIO_REMAP_4567,
1161 static int mv88e6xxx_port_ieeepmt_write(struct mv88e6xxx_chip *chip,
1162 int port, u16 table, u8 ptr, u16 data)
1166 reg = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_UPDATE | table |
1167 (ptr << __bf_shf(MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_PTR_MASK)) |
1168 (data & MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_DATA_MASK);
1170 return mv88e6xxx_port_write(chip, port,
1171 MV88E6390_PORT_IEEE_PRIO_MAP_TABLE, reg);
1174 int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
1179 for (i = 0; i <= 7; i++) {
1180 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP;
1181 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i,
1186 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP;
1187 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1191 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP;
1192 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1196 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP;
1197 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1205 /* Offset 0x0E: Policy Control Register */
1207 int mv88e6352_port_set_policy(struct mv88e6xxx_chip *chip, int port,
1208 enum mv88e6xxx_policy_mapping mapping,
1209 enum mv88e6xxx_policy_action action)
1216 case MV88E6XXX_POLICY_MAPPING_DA:
1217 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_DA_MASK);
1218 mask = MV88E6XXX_PORT_POLICY_CTL_DA_MASK;
1220 case MV88E6XXX_POLICY_MAPPING_SA:
1221 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_SA_MASK);
1222 mask = MV88E6XXX_PORT_POLICY_CTL_SA_MASK;
1224 case MV88E6XXX_POLICY_MAPPING_VTU:
1225 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VTU_MASK);
1226 mask = MV88E6XXX_PORT_POLICY_CTL_VTU_MASK;
1228 case MV88E6XXX_POLICY_MAPPING_ETYPE:
1229 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK);
1230 mask = MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK;
1232 case MV88E6XXX_POLICY_MAPPING_PPPOE:
1233 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK);
1234 mask = MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK;
1236 case MV88E6XXX_POLICY_MAPPING_VBAS:
1237 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK);
1238 mask = MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK;
1240 case MV88E6XXX_POLICY_MAPPING_OPT82:
1241 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK);
1242 mask = MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK;
1244 case MV88E6XXX_POLICY_MAPPING_UDP:
1245 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_UDP_MASK);
1246 mask = MV88E6XXX_PORT_POLICY_CTL_UDP_MASK;
1253 case MV88E6XXX_POLICY_ACTION_NORMAL:
1254 val = MV88E6XXX_PORT_POLICY_CTL_NORMAL;
1256 case MV88E6XXX_POLICY_ACTION_MIRROR:
1257 val = MV88E6XXX_PORT_POLICY_CTL_MIRROR;
1259 case MV88E6XXX_POLICY_ACTION_TRAP:
1260 val = MV88E6XXX_PORT_POLICY_CTL_TRAP;
1262 case MV88E6XXX_POLICY_ACTION_DISCARD:
1263 val = MV88E6XXX_PORT_POLICY_CTL_DISCARD;
1269 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_POLICY_CTL, ®);
1274 reg |= (val << shift) & mask;
1276 return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_POLICY_CTL, reg);