]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blame - drivers/net/dsa/mv88e6xxx/port.c
net: dsa: mv88e6xxx: unconditionally set ATU trunk
[mirror_ubuntu-eoan-kernel.git] / drivers / net / dsa / mv88e6xxx / port.c
CommitLineData
18abed21
VD
1/*
2 * Marvell 88E6xxx Switch Port 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
f39908d3 14#include <linux/phy.h>
18abed21
VD
15#include "mv88e6xxx.h"
16#include "port.h"
17
18int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
19 u16 *val)
20{
21 int addr = chip->info->port_base_addr + port;
22
23 return mv88e6xxx_read(chip, addr, reg, val);
24}
25
26int mv88e6xxx_port_write(struct mv88e6xxx_chip *chip, int port, int reg,
27 u16 val)
28{
29 int addr = chip->info->port_base_addr + port;
30
31 return mv88e6xxx_write(chip, addr, reg, val);
32}
e28def33 33
08ef7f10
VD
34/* Offset 0x01: MAC (or PCS or Physical) Control Register
35 *
36 * Link, Duplex and Flow Control have one force bit, one value bit.
96a2b40c
VD
37 *
38 * For port's MAC speed, ForceSpd (or SpdValue) bits 1:0 program the value.
39 * Alternative values require the 200BASE (or AltSpeed) bit 12 set.
40 * Newer chips need a ForcedSpd bit 13 set to consider the value.
08ef7f10
VD
41 */
42
a0a0f622
VD
43static int mv88e6xxx_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
44 phy_interface_t mode)
45{
46 u16 reg;
47 int err;
48
49 err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
50 if (err)
51 return err;
52
53 reg &= ~(PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
54 PORT_PCS_CTRL_RGMII_DELAY_TXCLK);
55
56 switch (mode) {
57 case PHY_INTERFACE_MODE_RGMII_RXID:
58 reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK;
59 break;
60 case PHY_INTERFACE_MODE_RGMII_TXID:
61 reg |= PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
62 break;
63 case PHY_INTERFACE_MODE_RGMII_ID:
64 reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
65 PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
66 break;
fedf1865 67 case PHY_INTERFACE_MODE_RGMII:
a0a0f622 68 break;
fedf1865
AL
69 default:
70 return 0;
a0a0f622
VD
71 }
72
73 err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
74 if (err)
75 return err;
76
77 netdev_dbg(chip->ds->ports[port].netdev, "delay RXCLK %s, TXCLK %s\n",
78 reg & PORT_PCS_CTRL_RGMII_DELAY_RXCLK ? "yes" : "no",
79 reg & PORT_PCS_CTRL_RGMII_DELAY_TXCLK ? "yes" : "no");
80
81 return 0;
82}
83
84int mv88e6352_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
85 phy_interface_t mode)
86{
87 if (port < 5)
88 return -EOPNOTSUPP;
89
90 return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
91}
92
93int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
94 phy_interface_t mode)
95{
96 if (port != 0)
97 return -EOPNOTSUPP;
98
99 return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
100}
101
08ef7f10
VD
102int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
103{
104 u16 reg;
105 int err;
106
107 err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
108 if (err)
109 return err;
110
111 reg &= ~(PORT_PCS_CTRL_FORCE_LINK | PORT_PCS_CTRL_LINK_UP);
112
113 switch (link) {
114 case LINK_FORCED_DOWN:
115 reg |= PORT_PCS_CTRL_FORCE_LINK;
116 break;
117 case LINK_FORCED_UP:
118 reg |= PORT_PCS_CTRL_FORCE_LINK | PORT_PCS_CTRL_LINK_UP;
119 break;
120 case LINK_UNFORCED:
121 /* normal link detection */
122 break;
123 default:
124 return -EINVAL;
125 }
126
127 err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
128 if (err)
129 return err;
130
131 netdev_dbg(chip->ds->ports[port].netdev, "%s link %s\n",
132 reg & PORT_PCS_CTRL_FORCE_LINK ? "Force" : "Unforce",
133 reg & PORT_PCS_CTRL_LINK_UP ? "up" : "down");
134
135 return 0;
136}
137
7f1ae07b
VD
138int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup)
139{
140 u16 reg;
141 int err;
142
143 err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
144 if (err)
145 return err;
146
147 reg &= ~(PORT_PCS_CTRL_FORCE_DUPLEX | PORT_PCS_CTRL_DUPLEX_FULL);
148
149 switch (dup) {
150 case DUPLEX_HALF:
151 reg |= PORT_PCS_CTRL_FORCE_DUPLEX;
152 break;
153 case DUPLEX_FULL:
154 reg |= PORT_PCS_CTRL_FORCE_DUPLEX | PORT_PCS_CTRL_DUPLEX_FULL;
155 break;
156 case DUPLEX_UNFORCED:
157 /* normal duplex detection */
158 break;
159 default:
160 return -EINVAL;
161 }
162
163 err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
164 if (err)
165 return err;
166
167 netdev_dbg(chip->ds->ports[port].netdev, "%s %s duplex\n",
168 reg & PORT_PCS_CTRL_FORCE_DUPLEX ? "Force" : "Unforce",
169 reg & PORT_PCS_CTRL_DUPLEX_FULL ? "full" : "half");
170
171 return 0;
172}
173
96a2b40c
VD
174static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port,
175 int speed, bool alt_bit, bool force_bit)
176{
177 u16 reg, ctrl;
178 int err;
179
180 switch (speed) {
181 case 10:
182 ctrl = PORT_PCS_CTRL_SPEED_10;
183 break;
184 case 100:
185 ctrl = PORT_PCS_CTRL_SPEED_100;
186 break;
187 case 200:
188 if (alt_bit)
189 ctrl = PORT_PCS_CTRL_SPEED_100 | PORT_PCS_CTRL_ALTSPEED;
190 else
191 ctrl = PORT_PCS_CTRL_SPEED_200;
192 break;
193 case 1000:
194 ctrl = PORT_PCS_CTRL_SPEED_1000;
195 break;
196 case 2500:
740117a8 197 ctrl = PORT_PCS_CTRL_SPEED_10000 | PORT_PCS_CTRL_ALTSPEED;
96a2b40c
VD
198 break;
199 case 10000:
200 /* all bits set, fall through... */
201 case SPEED_UNFORCED:
202 ctrl = PORT_PCS_CTRL_SPEED_UNFORCED;
203 break;
204 default:
205 return -EOPNOTSUPP;
206 }
207
208 err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
209 if (err)
210 return err;
211
212 reg &= ~PORT_PCS_CTRL_SPEED_MASK;
213 if (alt_bit)
214 reg &= ~PORT_PCS_CTRL_ALTSPEED;
215 if (force_bit) {
216 reg &= ~PORT_PCS_CTRL_FORCE_SPEED;
0b6e3d03 217 if (speed != SPEED_UNFORCED)
96a2b40c
VD
218 ctrl |= PORT_PCS_CTRL_FORCE_SPEED;
219 }
220 reg |= ctrl;
221
222 err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
223 if (err)
224 return err;
225
226 if (speed)
227 netdev_dbg(chip->ds->ports[port].netdev,
228 "Speed set to %d Mbps\n", speed);
229 else
230 netdev_dbg(chip->ds->ports[port].netdev, "Speed unforced\n");
231
232 return 0;
233}
234
235/* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
236int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
237{
238 if (speed == SPEED_MAX)
239 speed = 200;
240
241 if (speed > 200)
242 return -EOPNOTSUPP;
243
244 /* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
245 return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
246}
247
248/* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
249int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
250{
251 if (speed == SPEED_MAX)
252 speed = 1000;
253
254 if (speed == 200 || speed > 1000)
255 return -EOPNOTSUPP;
256
257 return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
258}
259
260/* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
261int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
262{
263 if (speed == SPEED_MAX)
264 speed = 1000;
265
266 if (speed > 1000)
267 return -EOPNOTSUPP;
268
269 if (speed == 200 && port < 5)
270 return -EOPNOTSUPP;
271
272 return mv88e6xxx_port_set_speed(chip, port, speed, true, false);
273}
274
275/* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6390) */
276int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
277{
278 if (speed == SPEED_MAX)
279 speed = port < 9 ? 1000 : 2500;
280
281 if (speed > 2500)
282 return -EOPNOTSUPP;
283
284 if (speed == 200 && port != 0)
285 return -EOPNOTSUPP;
286
287 if (speed == 2500 && port < 9)
288 return -EOPNOTSUPP;
289
290 return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
291}
292
293/* Support 10, 100, 200, 1000, 2500, 10000 Mbps (e.g. 88E6190X) */
294int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
295{
296 if (speed == SPEED_MAX)
297 speed = port < 9 ? 1000 : 10000;
298
299 if (speed == 200 && port != 0)
300 return -EOPNOTSUPP;
301
302 if (speed >= 2500 && port < 9)
303 return -EOPNOTSUPP;
304
305 return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
306}
307
f39908d3
AL
308int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
309 phy_interface_t mode)
310{
311 u16 reg;
312 u16 cmode;
313 int err;
314
315 if (mode == PHY_INTERFACE_MODE_NA)
316 return 0;
317
318 if (port != 9 && port != 10)
319 return -EOPNOTSUPP;
320
321 switch (mode) {
322 case PHY_INTERFACE_MODE_1000BASEX:
323 cmode = PORT_STATUS_CMODE_1000BASE_X;
324 break;
325 case PHY_INTERFACE_MODE_SGMII:
326 cmode = PORT_STATUS_CMODE_SGMII;
327 break;
328 case PHY_INTERFACE_MODE_2500BASEX:
329 cmode = PORT_STATUS_CMODE_2500BASEX;
330 break;
331 case PHY_INTERFACE_MODE_XGMII:
332 cmode = PORT_STATUS_CMODE_XAUI;
333 break;
334 case PHY_INTERFACE_MODE_RXAUI:
335 cmode = PORT_STATUS_CMODE_RXAUI;
336 break;
337 default:
338 cmode = 0;
339 }
340
341 if (cmode) {
342 err = mv88e6xxx_port_read(chip, port, PORT_STATUS, &reg);
343 if (err)
344 return err;
345
346 reg &= ~PORT_STATUS_CMODE_MASK;
347 reg |= cmode;
348
349 err = mv88e6xxx_port_write(chip, port, PORT_STATUS, reg);
350 if (err)
351 return err;
352 }
353
354 return 0;
355}
356
357int mv88e6xxx_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
358{
359 int err;
360 u16 reg;
361
362 err = mv88e6xxx_port_read(chip, port, PORT_STATUS, &reg);
363 if (err)
364 return err;
365
366 *cmode = reg & PORT_STATUS_CMODE_MASK;
367
368 return 0;
369}
370
b35d322a
AL
371/* Offset 0x02: Pause Control
372 *
373 * Do not limit the period of time that this port can be paused for by
374 * the remote end or the period of time that this port can pause the
375 * remote end.
376 */
377int mv88e6097_port_pause_config(struct mv88e6xxx_chip *chip, int port)
378{
379 return mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL, 0x0000);
380}
381
3ce0e65e
AL
382int mv88e6390_port_pause_config(struct mv88e6xxx_chip *chip, int port)
383{
384 int err;
385
386 err = mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL,
387 PORT_FLOW_CTRL_LIMIT_IN | 0);
388 if (err)
389 return err;
390
391 return mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL,
392 PORT_FLOW_CTRL_LIMIT_OUT | 0);
393}
394
e28def33
VD
395/* Offset 0x04: Port Control Register */
396
397static const char * const mv88e6xxx_port_state_names[] = {
398 [PORT_CONTROL_STATE_DISABLED] = "Disabled",
399 [PORT_CONTROL_STATE_BLOCKING] = "Blocking/Listening",
400 [PORT_CONTROL_STATE_LEARNING] = "Learning",
401 [PORT_CONTROL_STATE_FORWARDING] = "Forwarding",
402};
403
404int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state)
405{
406 u16 reg;
407 int err;
408
409 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
410 if (err)
411 return err;
412
413 reg &= ~PORT_CONTROL_STATE_MASK;
414 reg |= state;
415
416 err = mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
417 if (err)
418 return err;
419
420 netdev_dbg(chip->ds->ports[port].netdev, "PortState set to %s\n",
421 mv88e6xxx_port_state_names[state]);
422
423 return 0;
424}
5a7921f4 425
56995cbc
AL
426int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,
427 u16 mode)
428{
429 int err;
430 u16 reg;
431
432 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
433 if (err)
434 return err;
435
436 reg &= ~PORT_CONTROL_EGRESS_MASK;
437 reg |= mode;
438
439 return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
440}
441
442int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
443 enum mv88e6xxx_frame_mode mode)
444{
445 int err;
446 u16 reg;
447
448 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
449 if (err)
450 return err;
451
452 reg &= ~PORT_CONTROL_FRAME_MODE_DSA;
453
454 switch (mode) {
455 case MV88E6XXX_FRAME_MODE_NORMAL:
456 reg |= PORT_CONTROL_FRAME_MODE_NORMAL;
457 break;
458 case MV88E6XXX_FRAME_MODE_DSA:
459 reg |= PORT_CONTROL_FRAME_MODE_DSA;
460 break;
461 default:
462 return -EINVAL;
463 }
464
465 return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
466}
467
468int mv88e6351_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
469 enum mv88e6xxx_frame_mode mode)
470{
471 int err;
472 u16 reg;
473
474 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
475 if (err)
476 return err;
477
478 reg &= ~PORT_CONTROL_FRAME_MASK;
479
480 switch (mode) {
481 case MV88E6XXX_FRAME_MODE_NORMAL:
482 reg |= PORT_CONTROL_FRAME_MODE_NORMAL;
483 break;
484 case MV88E6XXX_FRAME_MODE_DSA:
485 reg |= PORT_CONTROL_FRAME_MODE_DSA;
486 break;
487 case MV88E6XXX_FRAME_MODE_PROVIDER:
488 reg |= PORT_CONTROL_FRAME_MODE_PROVIDER;
489 break;
490 case MV88E6XXX_FRAME_MODE_ETHERTYPE:
491 reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA;
492 break;
493 default:
494 return -EINVAL;
495 }
496
497 return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
498}
499
601aeed3
VD
500static int mv88e6185_port_set_forward_unknown(struct mv88e6xxx_chip *chip,
501 int port, bool unicast)
56995cbc
AL
502{
503 int err;
504 u16 reg;
505
506 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
507 if (err)
508 return err;
509
601aeed3 510 if (unicast)
56995cbc
AL
511 reg |= PORT_CONTROL_FORWARD_UNKNOWN;
512 else
513 reg &= ~PORT_CONTROL_FORWARD_UNKNOWN;
514
515 return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
516}
517
601aeed3
VD
518int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
519 bool unicast, bool multicast)
56995cbc
AL
520{
521 int err;
522 u16 reg;
523
524 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
525 if (err)
526 return err;
527
601aeed3
VD
528 reg &= ~PORT_CONTROL_EGRESS_FLOODS_MASK;
529
530 if (unicast && multicast)
531 reg |= PORT_CONTROL_EGRESS_FLOODS_ALL_UNKNOWN_DA;
532 else if (unicast)
533 reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_MC_DA;
534 else if (multicast)
535 reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_UC_DA;
56995cbc 536 else
601aeed3 537 reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_DA;
56995cbc
AL
538
539 return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
540}
541
b4e48c50
VD
542/* Offset 0x05: Port Control 1 */
543
ea698f4f
VD
544int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,
545 bool message_port)
546{
547 u16 val;
548 int err;
549
550 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &val);
551 if (err)
552 return err;
553
554 if (message_port)
555 val |= PORT_CONTROL_1_MESSAGE_PORT;
556 else
557 val &= ~PORT_CONTROL_1_MESSAGE_PORT;
558
559 return mv88e6xxx_port_write(chip, port, PORT_CONTROL_1, val);
560}
561
5a7921f4
VD
562/* Offset 0x06: Port Based VLAN Map */
563
564int mv88e6xxx_port_set_vlan_map(struct mv88e6xxx_chip *chip, int port, u16 map)
565{
4d294af2 566 const u16 mask = mv88e6xxx_port_mask(chip);
5a7921f4
VD
567 u16 reg;
568 int err;
569
570 err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
571 if (err)
572 return err;
573
574 reg &= ~mask;
575 reg |= map & mask;
576
577 err = mv88e6xxx_port_write(chip, port, PORT_BASE_VLAN, reg);
578 if (err)
579 return err;
580
581 netdev_dbg(chip->ds->ports[port].netdev, "VLANTable set to %.3x\n",
582 map);
583
584 return 0;
585}
b4e48c50
VD
586
587int mv88e6xxx_port_get_fid(struct mv88e6xxx_chip *chip, int port, u16 *fid)
588{
589 const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
590 u16 reg;
591 int err;
592
593 /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
594 err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
595 if (err)
596 return err;
597
598 *fid = (reg & 0xf000) >> 12;
599
600 /* Port's default FID upper bits are located in reg 0x05, offset 0 */
601 if (upper_mask) {
602 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &reg);
603 if (err)
604 return err;
605
606 *fid |= (reg & upper_mask) << 4;
607 }
608
609 return 0;
610}
611
612int mv88e6xxx_port_set_fid(struct mv88e6xxx_chip *chip, int port, u16 fid)
613{
614 const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
615 u16 reg;
616 int err;
617
618 if (fid >= mv88e6xxx_num_databases(chip))
619 return -EINVAL;
620
621 /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
622 err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
623 if (err)
624 return err;
625
626 reg &= 0x0fff;
627 reg |= (fid & 0x000f) << 12;
628
629 err = mv88e6xxx_port_write(chip, port, PORT_BASE_VLAN, reg);
630 if (err)
631 return err;
632
633 /* Port's default FID upper bits are located in reg 0x05, offset 0 */
634 if (upper_mask) {
635 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &reg);
636 if (err)
637 return err;
638
639 reg &= ~upper_mask;
640 reg |= (fid >> 4) & upper_mask;
641
642 err = mv88e6xxx_port_write(chip, port, PORT_CONTROL_1, reg);
643 if (err)
644 return err;
645 }
646
647 netdev_dbg(chip->ds->ports[port].netdev, "FID set to %u\n", fid);
648
649 return 0;
650}
77064f37
VD
651
652/* Offset 0x07: Default Port VLAN ID & Priority */
653
654int mv88e6xxx_port_get_pvid(struct mv88e6xxx_chip *chip, int port, u16 *pvid)
655{
656 u16 reg;
657 int err;
658
659 err = mv88e6xxx_port_read(chip, port, PORT_DEFAULT_VLAN, &reg);
660 if (err)
661 return err;
662
663 *pvid = reg & PORT_DEFAULT_VLAN_MASK;
664
665 return 0;
666}
667
668int mv88e6xxx_port_set_pvid(struct mv88e6xxx_chip *chip, int port, u16 pvid)
669{
670 u16 reg;
671 int err;
672
673 err = mv88e6xxx_port_read(chip, port, PORT_DEFAULT_VLAN, &reg);
674 if (err)
675 return err;
676
677 reg &= ~PORT_DEFAULT_VLAN_MASK;
678 reg |= pvid & PORT_DEFAULT_VLAN_MASK;
679
680 err = mv88e6xxx_port_write(chip, port, PORT_DEFAULT_VLAN, reg);
681 if (err)
682 return err;
683
684 netdev_dbg(chip->ds->ports[port].netdev, "DefaultVID set to %u\n",
685 pvid);
686
687 return 0;
688}
385a0995
VD
689
690/* Offset 0x08: Port Control 2 Register */
691
692static const char * const mv88e6xxx_port_8021q_mode_names[] = {
693 [PORT_CONTROL_2_8021Q_DISABLED] = "Disabled",
694 [PORT_CONTROL_2_8021Q_FALLBACK] = "Fallback",
695 [PORT_CONTROL_2_8021Q_CHECK] = "Check",
696 [PORT_CONTROL_2_8021Q_SECURE] = "Secure",
697};
698
601aeed3
VD
699static int mv88e6185_port_set_default_forward(struct mv88e6xxx_chip *chip,
700 int port, bool multicast)
a23b2961
AL
701{
702 int err;
703 u16 reg;
704
705 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
706 if (err)
707 return err;
708
601aeed3
VD
709 if (multicast)
710 reg |= PORT_CONTROL_2_DEFAULT_FORWARD;
a23b2961 711 else
601aeed3 712 reg &= ~PORT_CONTROL_2_DEFAULT_FORWARD;
a23b2961
AL
713
714 return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
715}
716
601aeed3
VD
717int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
718 bool unicast, bool multicast)
719{
720 int err;
721
722 err = mv88e6185_port_set_forward_unknown(chip, port, unicast);
723 if (err)
724 return err;
725
726 return mv88e6185_port_set_default_forward(chip, port, multicast);
727}
728
a23b2961
AL
729int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
730 int upstream_port)
731{
732 int err;
733 u16 reg;
734
735 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
736 if (err)
737 return err;
738
739 reg &= ~PORT_CONTROL_2_UPSTREAM_MASK;
740 reg |= upstream_port;
741
742 return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
743}
744
385a0995
VD
745int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
746 u16 mode)
747{
748 u16 reg;
749 int err;
750
751 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
752 if (err)
753 return err;
754
755 reg &= ~PORT_CONTROL_2_8021Q_MASK;
756 reg |= mode & PORT_CONTROL_2_8021Q_MASK;
757
758 err = mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
759 if (err)
760 return err;
761
762 netdev_dbg(chip->ds->ports[port].netdev, "802.1QMode set to %s\n",
763 mv88e6xxx_port_8021q_mode_names[mode]);
764
765 return 0;
766}
ef0a7318 767
a23b2961
AL
768int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
769{
770 u16 reg;
771 int err;
772
773 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
774 if (err)
775 return err;
776
777 reg |= PORT_CONTROL_2_MAP_DA;
778
779 return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
780}
781
5f436666
AL
782int mv88e6165_port_jumbo_config(struct mv88e6xxx_chip *chip, int port)
783{
784 u16 reg;
785 int err;
786
787 err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
788 if (err)
789 return err;
790
791 reg |= PORT_CONTROL_2_JUMBO_10240;
792
793 return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
794}
795
ef70b111
AL
796/* Offset 0x09: Port Rate Control */
797
798int mv88e6095_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
799{
800 return mv88e6xxx_port_write(chip, port, PORT_RATE_CONTROL, 0x0000);
801}
802
803int mv88e6097_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
804{
805 return mv88e6xxx_port_write(chip, port, PORT_RATE_CONTROL, 0x0001);
806}
807
c8c94891
VD
808/* Offset 0x0C: Port ATU Control */
809
810int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port)
811{
812 return mv88e6xxx_port_write(chip, port, PORT_ATU_CONTROL, 0);
813}
814
9dbfb4e1
VD
815/* Offset 0x0D: (Priority) Override Register */
816
817int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port)
818{
819 return mv88e6xxx_port_write(chip, port, PORT_PRI_OVERRIDE, 0);
820}
821
56995cbc
AL
822/* Offset 0x0f: Port Ether type */
823
824int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
825 u16 etype)
826{
827 return mv88e6xxx_port_write(chip, port, PORT_ETH_TYPE, etype);
828}
829
ef0a7318
AL
830/* Offset 0x18: Port IEEE Priority Remapping Registers [0-3]
831 * Offset 0x19: Port IEEE Priority Remapping Registers [4-7]
832 */
833
834int mv88e6095_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
835{
836 int err;
837
838 /* Use a direct priority mapping for all IEEE tagged frames */
839 err = mv88e6xxx_port_write(chip, port, PORT_TAG_REGMAP_0123, 0x3210);
840 if (err)
841 return err;
842
843 return mv88e6xxx_port_write(chip, port, PORT_TAG_REGMAP_4567, 0x7654);
844}
845
846static int mv88e6xxx_port_ieeepmt_write(struct mv88e6xxx_chip *chip,
847 int port, u16 table,
848 u8 pointer, u16 data)
849{
850 u16 reg;
851
852 reg = PORT_IEEE_PRIO_MAP_TABLE_UPDATE |
853 table |
854 (pointer << PORT_IEEE_PRIO_MAP_TABLE_POINTER_SHIFT) |
855 data;
856
857 return mv88e6xxx_port_write(chip, port, PORT_IEEE_PRIO_MAP_TABLE, reg);
858}
859
860int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
861{
862 int err, i;
863
864 for (i = 0; i <= 7; i++) {
865 err = mv88e6xxx_port_ieeepmt_write(
866 chip, port, PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP,
867 i, (i | i << 4));
868 if (err)
869 return err;
870
871 err = mv88e6xxx_port_ieeepmt_write(
872 chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP,
873 i, i);
874 if (err)
875 return err;
876
877 err = mv88e6xxx_port_ieeepmt_write(
878 chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP,
879 i, i);
880 if (err)
881 return err;
882
883 err = mv88e6xxx_port_ieeepmt_write(
884 chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP,
885 i, i);
886 if (err)
887 return err;
888 }
889
890 return 0;
891}