GNU Linux-libre 4.14.254-gnu1
[releases.git] / drivers / net / dsa / mv88e6xxx / port.c
1 /*
2  * Marvell 88E6xxx Switch Port Registers support
3  *
4  * Copyright (c) 2008 Marvell Semiconductor
5  *
6  * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
7  *      Vivien Didelot <vivien.didelot@savoirfairelinux.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  */
14
15 #include <linux/bitfield.h>
16 #include <linux/if_bridge.h>
17 #include <linux/phy.h>
18
19 #include "chip.h"
20 #include "port.h"
21
22 int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
23                         u16 *val)
24 {
25         int addr = chip->info->port_base_addr + port;
26
27         return mv88e6xxx_read(chip, addr, reg, val);
28 }
29
30 int mv88e6xxx_port_write(struct mv88e6xxx_chip *chip, int port, int reg,
31                          u16 val)
32 {
33         int addr = chip->info->port_base_addr + port;
34
35         return mv88e6xxx_write(chip, addr, reg, val);
36 }
37
38 /* Offset 0x01: MAC (or PCS or Physical) Control Register
39  *
40  * Link, Duplex and Flow Control have one force bit, one value bit.
41  *
42  * For port's MAC speed, ForceSpd (or SpdValue) bits 1:0 program the value.
43  * Alternative values require the 200BASE (or AltSpeed) bit 12 set.
44  * Newer chips need a ForcedSpd bit 13 set to consider the value.
45  */
46
47 static int mv88e6xxx_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
48                                           phy_interface_t mode)
49 {
50         u16 reg;
51         int err;
52
53         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
54         if (err)
55                 return err;
56
57         reg &= ~(MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
58                  MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK);
59
60         switch (mode) {
61         case PHY_INTERFACE_MODE_RGMII_RXID:
62                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK;
63                 break;
64         case PHY_INTERFACE_MODE_RGMII_TXID:
65                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
66                 break;
67         case PHY_INTERFACE_MODE_RGMII_ID:
68                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
69                         MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
70                 break;
71         case PHY_INTERFACE_MODE_RGMII:
72                 break;
73         default:
74                 return 0;
75         }
76
77         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
78         if (err)
79                 return err;
80
81         dev_dbg(chip->dev, "p%d: delay RXCLK %s, TXCLK %s\n", port,
82                 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK ? "yes" : "no",
83                 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK ? "yes" : "no");
84
85         return 0;
86 }
87
88 int mv88e6352_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
89                                    phy_interface_t mode)
90 {
91         if (port < 5)
92                 return -EOPNOTSUPP;
93
94         return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
95 }
96
97 int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
98                                    phy_interface_t mode)
99 {
100         if (port != 0)
101                 return -EOPNOTSUPP;
102
103         return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
104 }
105
106 int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
107 {
108         u16 reg;
109         int err;
110
111         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
112         if (err)
113                 return err;
114
115         reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
116                  MV88E6XXX_PORT_MAC_CTL_LINK_UP);
117
118         switch (link) {
119         case LINK_FORCED_DOWN:
120                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK;
121                 break;
122         case LINK_FORCED_UP:
123                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
124                         MV88E6XXX_PORT_MAC_CTL_LINK_UP;
125                 break;
126         case LINK_UNFORCED:
127                 /* normal link detection */
128                 break;
129         default:
130                 return -EINVAL;
131         }
132
133         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
134         if (err)
135                 return err;
136
137         dev_dbg(chip->dev, "p%d: %s link %s\n", port,
138                 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_LINK ? "Force" : "Unforce",
139                 reg & MV88E6XXX_PORT_MAC_CTL_LINK_UP ? "up" : "down");
140
141         return 0;
142 }
143
144 int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup)
145 {
146         u16 reg;
147         int err;
148
149         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
150         if (err)
151                 return err;
152
153         reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
154                  MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL);
155
156         switch (dup) {
157         case DUPLEX_HALF:
158                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX;
159                 break;
160         case DUPLEX_FULL:
161                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
162                         MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL;
163                 break;
164         case DUPLEX_UNFORCED:
165                 /* normal duplex detection */
166                 break;
167         default:
168                 return -EOPNOTSUPP;
169         }
170
171         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
172         if (err)
173                 return err;
174
175         dev_dbg(chip->dev, "p%d: %s %s duplex\n", port,
176                 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX ? "Force" : "Unforce",
177                 reg & MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL ? "full" : "half");
178
179         return 0;
180 }
181
182 static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port,
183                                     int speed, bool alt_bit, bool force_bit)
184 {
185         u16 reg, ctrl;
186         int err;
187
188         switch (speed) {
189         case 10:
190                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_10;
191                 break;
192         case 100:
193                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100;
194                 break;
195         case 200:
196                 if (alt_bit)
197                         ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100 |
198                                 MV88E6390_PORT_MAC_CTL_ALTSPEED;
199                 else
200                         ctrl = MV88E6065_PORT_MAC_CTL_SPEED_200;
201                 break;
202         case 1000:
203                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_1000;
204                 break;
205         case 2500:
206                 if (alt_bit)
207                         ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 |
208                                 MV88E6390_PORT_MAC_CTL_ALTSPEED;
209                 else
210                         ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000;
211                 break;
212         case 10000:
213                 /* all bits set, fall through... */
214         case SPEED_UNFORCED:
215                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_UNFORCED;
216                 break;
217         default:
218                 return -EOPNOTSUPP;
219         }
220
221         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
222         if (err)
223                 return err;
224
225         reg &= ~MV88E6XXX_PORT_MAC_CTL_SPEED_MASK;
226         if (alt_bit)
227                 reg &= ~MV88E6390_PORT_MAC_CTL_ALTSPEED;
228         if (force_bit) {
229                 reg &= ~MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
230                 if (speed != SPEED_UNFORCED)
231                         ctrl |= MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
232         }
233         reg |= ctrl;
234
235         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
236         if (err)
237                 return err;
238
239         if (speed)
240                 dev_dbg(chip->dev, "p%d: Speed set to %d Mbps\n", port, speed);
241         else
242                 dev_dbg(chip->dev, "p%d: Speed unforced\n", port);
243
244         return 0;
245 }
246
247 /* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
248 int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
249 {
250         if (speed == SPEED_MAX)
251                 speed = 200;
252
253         if (speed > 200)
254                 return -EOPNOTSUPP;
255
256         /* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
257         return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
258 }
259
260 /* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
261 int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
262 {
263         if (speed == SPEED_MAX)
264                 speed = 1000;
265
266         if (speed == 200 || speed > 1000)
267                 return -EOPNOTSUPP;
268
269         return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
270 }
271
272 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6341) */
273 int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
274 {
275         if (speed == SPEED_MAX)
276                 speed = port < 5 ? 1000 : 2500;
277
278         if (speed > 2500)
279                 return -EOPNOTSUPP;
280
281         if (speed == 200 && port != 0)
282                 return -EOPNOTSUPP;
283
284         if (speed == 2500 && port < 5)
285                 return -EOPNOTSUPP;
286
287         return mv88e6xxx_port_set_speed(chip, port, speed, !port, true);
288 }
289
290 /* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
291 int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
292 {
293         if (speed == SPEED_MAX)
294                 speed = 1000;
295
296         if (speed > 1000)
297                 return -EOPNOTSUPP;
298
299         if (speed == 200 && port < 5)
300                 return -EOPNOTSUPP;
301
302         return mv88e6xxx_port_set_speed(chip, port, speed, true, false);
303 }
304
305 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6390) */
306 int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
307 {
308         if (speed == SPEED_MAX)
309                 speed = port < 9 ? 1000 : 2500;
310
311         if (speed > 2500)
312                 return -EOPNOTSUPP;
313
314         if (speed == 200 && port != 0)
315                 return -EOPNOTSUPP;
316
317         if (speed == 2500 && port < 9)
318                 return -EOPNOTSUPP;
319
320         return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
321 }
322
323 /* Support 10, 100, 200, 1000, 2500, 10000 Mbps (e.g. 88E6190X) */
324 int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
325 {
326         if (speed == SPEED_MAX)
327                 speed = port < 9 ? 1000 : 10000;
328
329         if (speed == 200 && port != 0)
330                 return -EOPNOTSUPP;
331
332         if (speed >= 2500 && port < 9)
333                 return -EOPNOTSUPP;
334
335         return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
336 }
337
338 int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
339                               phy_interface_t mode)
340 {
341         u16 reg;
342         u16 cmode;
343         int err;
344
345         if (mode == PHY_INTERFACE_MODE_NA)
346                 return 0;
347
348         if (port != 9 && port != 10)
349                 return -EOPNOTSUPP;
350
351         switch (mode) {
352         case PHY_INTERFACE_MODE_1000BASEX:
353                 cmode = MV88E6XXX_PORT_STS_CMODE_1000BASE_X;
354                 break;
355         case PHY_INTERFACE_MODE_SGMII:
356                 cmode = MV88E6XXX_PORT_STS_CMODE_SGMII;
357                 break;
358         case PHY_INTERFACE_MODE_2500BASEX:
359                 cmode = MV88E6XXX_PORT_STS_CMODE_2500BASEX;
360                 break;
361         case PHY_INTERFACE_MODE_XGMII:
362                 cmode = MV88E6XXX_PORT_STS_CMODE_XAUI;
363                 break;
364         case PHY_INTERFACE_MODE_RXAUI:
365                 cmode = MV88E6XXX_PORT_STS_CMODE_RXAUI;
366                 break;
367         default:
368                 cmode = 0;
369         }
370
371         if (cmode) {
372                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
373                 if (err)
374                         return err;
375
376                 reg &= ~MV88E6XXX_PORT_STS_CMODE_MASK;
377                 reg |= cmode;
378
379                 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
380                 if (err)
381                         return err;
382         }
383
384         return 0;
385 }
386
387 int mv88e6xxx_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
388 {
389         int err;
390         u16 reg;
391
392         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
393         if (err)
394                 return err;
395
396         *cmode = reg & MV88E6XXX_PORT_STS_CMODE_MASK;
397
398         return 0;
399 }
400
401 /* Offset 0x02: Jamming Control
402  *
403  * Do not limit the period of time that this port can be paused for by
404  * the remote end or the period of time that this port can pause the
405  * remote end.
406  */
407 int mv88e6097_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
408                                u8 out)
409 {
410         return mv88e6xxx_port_write(chip, port, MV88E6097_PORT_JAM_CTL,
411                                     out << 8 | in);
412 }
413
414 int mv88e6390_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
415                                u8 out)
416 {
417         int err;
418
419         err = mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
420                                    MV88E6390_PORT_FLOW_CTL_UPDATE |
421                                    MV88E6390_PORT_FLOW_CTL_LIMIT_IN | in);
422         if (err)
423                 return err;
424
425         return mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
426                                     MV88E6390_PORT_FLOW_CTL_UPDATE |
427                                     MV88E6390_PORT_FLOW_CTL_LIMIT_OUT | out);
428 }
429
430 /* Offset 0x04: Port Control Register */
431
432 static const char * const mv88e6xxx_port_state_names[] = {
433         [MV88E6XXX_PORT_CTL0_STATE_DISABLED] = "Disabled",
434         [MV88E6XXX_PORT_CTL0_STATE_BLOCKING] = "Blocking/Listening",
435         [MV88E6XXX_PORT_CTL0_STATE_LEARNING] = "Learning",
436         [MV88E6XXX_PORT_CTL0_STATE_FORWARDING] = "Forwarding",
437 };
438
439 int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state)
440 {
441         u16 reg;
442         int err;
443
444         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
445         if (err)
446                 return err;
447
448         reg &= ~MV88E6XXX_PORT_CTL0_STATE_MASK;
449
450         switch (state) {
451         case BR_STATE_DISABLED:
452                 state = MV88E6XXX_PORT_CTL0_STATE_DISABLED;
453                 break;
454         case BR_STATE_BLOCKING:
455         case BR_STATE_LISTENING:
456                 state = MV88E6XXX_PORT_CTL0_STATE_BLOCKING;
457                 break;
458         case BR_STATE_LEARNING:
459                 state = MV88E6XXX_PORT_CTL0_STATE_LEARNING;
460                 break;
461         case BR_STATE_FORWARDING:
462                 state = MV88E6XXX_PORT_CTL0_STATE_FORWARDING;
463                 break;
464         default:
465                 return -EINVAL;
466         }
467
468         reg |= state;
469
470         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
471         if (err)
472                 return err;
473
474         dev_dbg(chip->dev, "p%d: PortState set to %s\n", port,
475                 mv88e6xxx_port_state_names[state]);
476
477         return 0;
478 }
479
480 int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,
481                                    enum mv88e6xxx_egress_mode mode)
482 {
483         int err;
484         u16 reg;
485
486         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
487         if (err)
488                 return err;
489
490         reg &= ~MV88E6XXX_PORT_CTL0_EGRESS_MODE_MASK;
491
492         switch (mode) {
493         case MV88E6XXX_EGRESS_MODE_UNMODIFIED:
494                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNMODIFIED;
495                 break;
496         case MV88E6XXX_EGRESS_MODE_UNTAGGED:
497                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNTAGGED;
498                 break;
499         case MV88E6XXX_EGRESS_MODE_TAGGED:
500                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_TAGGED;
501                 break;
502         case MV88E6XXX_EGRESS_MODE_ETHERTYPE:
503                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_ETHER_TYPE_DSA;
504                 break;
505         default:
506                 return -EINVAL;
507         }
508
509         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
510 }
511
512 int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
513                                   enum mv88e6xxx_frame_mode mode)
514 {
515         int err;
516         u16 reg;
517
518         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
519         if (err)
520                 return err;
521
522         reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
523
524         switch (mode) {
525         case MV88E6XXX_FRAME_MODE_NORMAL:
526                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
527                 break;
528         case MV88E6XXX_FRAME_MODE_DSA:
529                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
530                 break;
531         default:
532                 return -EINVAL;
533         }
534
535         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
536 }
537
538 int mv88e6351_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
539                                   enum mv88e6xxx_frame_mode mode)
540 {
541         int err;
542         u16 reg;
543
544         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
545         if (err)
546                 return err;
547
548         reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
549
550         switch (mode) {
551         case MV88E6XXX_FRAME_MODE_NORMAL:
552                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
553                 break;
554         case MV88E6XXX_FRAME_MODE_DSA:
555                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
556                 break;
557         case MV88E6XXX_FRAME_MODE_PROVIDER:
558                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_PROVIDER;
559                 break;
560         case MV88E6XXX_FRAME_MODE_ETHERTYPE:
561                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_ETHER_TYPE_DSA;
562                 break;
563         default:
564                 return -EINVAL;
565         }
566
567         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
568 }
569
570 static int mv88e6185_port_set_forward_unknown(struct mv88e6xxx_chip *chip,
571                                               int port, bool unicast)
572 {
573         int err;
574         u16 reg;
575
576         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
577         if (err)
578                 return err;
579
580         if (unicast)
581                 reg |= MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
582         else
583                 reg &= ~MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
584
585         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
586 }
587
588 int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
589                                      bool unicast, bool multicast)
590 {
591         int err;
592         u16 reg;
593
594         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
595         if (err)
596                 return err;
597
598         reg &= ~MV88E6352_PORT_CTL0_EGRESS_FLOODS_MASK;
599
600         if (unicast && multicast)
601                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_ALL_UNKNOWN_DA;
602         else if (unicast)
603                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_MC_DA;
604         else if (multicast)
605                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_UC_DA;
606         else
607                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_DA;
608
609         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
610 }
611
612 /* Offset 0x05: Port Control 1 */
613
614 int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,
615                                     bool message_port)
616 {
617         u16 val;
618         int err;
619
620         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1, &val);
621         if (err)
622                 return err;
623
624         if (message_port)
625                 val |= MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
626         else
627                 val &= ~MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
628
629         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1, val);
630 }
631
632 /* Offset 0x06: Port Based VLAN Map */
633
634 int mv88e6xxx_port_set_vlan_map(struct mv88e6xxx_chip *chip, int port, u16 map)
635 {
636         const u16 mask = mv88e6xxx_port_mask(chip);
637         u16 reg;
638         int err;
639
640         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
641         if (err)
642                 return err;
643
644         reg &= ~mask;
645         reg |= map & mask;
646
647         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
648         if (err)
649                 return err;
650
651         dev_dbg(chip->dev, "p%d: VLANTable set to %.3x\n", port, map);
652
653         return 0;
654 }
655
656 int mv88e6xxx_port_get_fid(struct mv88e6xxx_chip *chip, int port, u16 *fid)
657 {
658         const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
659         u16 reg;
660         int err;
661
662         /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
663         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
664         if (err)
665                 return err;
666
667         *fid = (reg & 0xf000) >> 12;
668
669         /* Port's default FID upper bits are located in reg 0x05, offset 0 */
670         if (upper_mask) {
671                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
672                                           &reg);
673                 if (err)
674                         return err;
675
676                 *fid |= (reg & upper_mask) << 4;
677         }
678
679         return 0;
680 }
681
682 int mv88e6xxx_port_set_fid(struct mv88e6xxx_chip *chip, int port, u16 fid)
683 {
684         const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
685         u16 reg;
686         int err;
687
688         if (fid >= mv88e6xxx_num_databases(chip))
689                 return -EINVAL;
690
691         /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
692         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
693         if (err)
694                 return err;
695
696         reg &= 0x0fff;
697         reg |= (fid & 0x000f) << 12;
698
699         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
700         if (err)
701                 return err;
702
703         /* Port's default FID upper bits are located in reg 0x05, offset 0 */
704         if (upper_mask) {
705                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
706                                           &reg);
707                 if (err)
708                         return err;
709
710                 reg &= ~upper_mask;
711                 reg |= (fid >> 4) & upper_mask;
712
713                 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1,
714                                            reg);
715                 if (err)
716                         return err;
717         }
718
719         dev_dbg(chip->dev, "p%d: FID set to %u\n", port, fid);
720
721         return 0;
722 }
723
724 /* Offset 0x07: Default Port VLAN ID & Priority */
725
726 int mv88e6xxx_port_get_pvid(struct mv88e6xxx_chip *chip, int port, u16 *pvid)
727 {
728         u16 reg;
729         int err;
730
731         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
732                                   &reg);
733         if (err)
734                 return err;
735
736         *pvid = reg & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
737
738         return 0;
739 }
740
741 int mv88e6xxx_port_set_pvid(struct mv88e6xxx_chip *chip, int port, u16 pvid)
742 {
743         u16 reg;
744         int err;
745
746         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
747                                   &reg);
748         if (err)
749                 return err;
750
751         reg &= ~MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
752         reg |= pvid & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
753
754         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
755                                    reg);
756         if (err)
757                 return err;
758
759         dev_dbg(chip->dev, "p%d: DefaultVID set to %u\n", port, pvid);
760
761         return 0;
762 }
763
764 /* Offset 0x08: Port Control 2 Register */
765
766 static const char * const mv88e6xxx_port_8021q_mode_names[] = {
767         [MV88E6XXX_PORT_CTL2_8021Q_MODE_DISABLED] = "Disabled",
768         [MV88E6XXX_PORT_CTL2_8021Q_MODE_FALLBACK] = "Fallback",
769         [MV88E6XXX_PORT_CTL2_8021Q_MODE_CHECK] = "Check",
770         [MV88E6XXX_PORT_CTL2_8021Q_MODE_SECURE] = "Secure",
771 };
772
773 static int mv88e6185_port_set_default_forward(struct mv88e6xxx_chip *chip,
774                                               int port, bool multicast)
775 {
776         int err;
777         u16 reg;
778
779         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
780         if (err)
781                 return err;
782
783         if (multicast)
784                 reg |= MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
785         else
786                 reg &= ~MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
787
788         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
789 }
790
791 int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
792                                      bool unicast, bool multicast)
793 {
794         int err;
795
796         err = mv88e6185_port_set_forward_unknown(chip, port, unicast);
797         if (err)
798                 return err;
799
800         return mv88e6185_port_set_default_forward(chip, port, multicast);
801 }
802
803 int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
804                                      int upstream_port)
805 {
806         int err;
807         u16 reg;
808
809         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
810         if (err)
811                 return err;
812
813         reg &= ~MV88E6095_PORT_CTL2_CPU_PORT_MASK;
814         reg |= upstream_port;
815
816         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
817 }
818
819 int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
820                                   u16 mode)
821 {
822         u16 reg;
823         int err;
824
825         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
826         if (err)
827                 return err;
828
829         reg &= ~MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
830         reg |= mode & MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
831
832         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
833         if (err)
834                 return err;
835
836         dev_dbg(chip->dev, "p%d: 802.1QMode set to %s\n", port,
837                 mv88e6xxx_port_8021q_mode_names[mode]);
838
839         return 0;
840 }
841
842 int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
843 {
844         u16 reg;
845         int err;
846
847         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
848         if (err)
849                 return err;
850
851         reg |= MV88E6XXX_PORT_CTL2_MAP_DA;
852
853         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
854 }
855
856 int mv88e6165_port_set_jumbo_size(struct mv88e6xxx_chip *chip, int port,
857                                   size_t size)
858 {
859         u16 reg;
860         int err;
861
862         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
863         if (err)
864                 return err;
865
866         reg &= ~MV88E6XXX_PORT_CTL2_JUMBO_MODE_MASK;
867
868         if (size <= 1522)
869                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_1522;
870         else if (size <= 2048)
871                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_2048;
872         else if (size <= 10240)
873                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_10240;
874         else
875                 return -ERANGE;
876
877         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
878 }
879
880 /* Offset 0x09: Port Rate Control */
881
882 int mv88e6095_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
883 {
884         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
885                                     0x0000);
886 }
887
888 int mv88e6097_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
889 {
890         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
891                                     0x0001);
892 }
893
894 /* Offset 0x0C: Port ATU Control */
895
896 int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port)
897 {
898         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ATU_CTL, 0);
899 }
900
901 /* Offset 0x0D: (Priority) Override Register */
902
903 int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port)
904 {
905         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_PRI_OVERRIDE, 0);
906 }
907
908 /* Offset 0x0f: Port Ether type */
909
910 int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
911                                   u16 etype)
912 {
913         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ETH_TYPE, etype);
914 }
915
916 /* Offset 0x18: Port IEEE Priority Remapping Registers [0-3]
917  * Offset 0x19: Port IEEE Priority Remapping Registers [4-7]
918  */
919
920 int mv88e6095_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
921 {
922         int err;
923
924         /* Use a direct priority mapping for all IEEE tagged frames */
925         err = mv88e6xxx_port_write(chip, port,
926                                    MV88E6095_PORT_IEEE_PRIO_REMAP_0123,
927                                    0x3210);
928         if (err)
929                 return err;
930
931         return mv88e6xxx_port_write(chip, port,
932                                     MV88E6095_PORT_IEEE_PRIO_REMAP_4567,
933                                     0x7654);
934 }
935
936 static int mv88e6xxx_port_ieeepmt_write(struct mv88e6xxx_chip *chip,
937                                         int port, u16 table, u8 ptr, u16 data)
938 {
939         u16 reg;
940
941         reg = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_UPDATE | table |
942                 (ptr << __bf_shf(MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_PTR_MASK)) |
943                 (data & MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_DATA_MASK);
944
945         return mv88e6xxx_port_write(chip, port,
946                                     MV88E6390_PORT_IEEE_PRIO_MAP_TABLE, reg);
947 }
948
949 int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
950 {
951         int err, i;
952         u16 table;
953
954         for (i = 0; i <= 7; i++) {
955                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP;
956                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i,
957                                                    (i | i << 4));
958                 if (err)
959                         return err;
960
961                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP;
962                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
963                 if (err)
964                         return err;
965
966                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP;
967                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
968                 if (err)
969                         return err;
970
971                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP;
972                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
973                 if (err)
974                         return err;
975         }
976
977         return 0;
978 }