]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/net/dsa/mv88e6xxx/global2.c
Merge tag 'iommu-updates-v4.13' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / net / dsa / mv88e6xxx / global2.c
1 /*
2  * Marvell 88E6xxx Switch Global 2 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/interrupt.h>
17 #include <linux/irqdomain.h>
18
19 #include "chip.h"
20 #include "global1.h" /* for MV88E6XXX_G1_STS_IRQ_DEVICE */
21 #include "global2.h"
22
23 static int mv88e6xxx_g2_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
24 {
25         return mv88e6xxx_read(chip, MV88E6XXX_G2, reg, val);
26 }
27
28 static int mv88e6xxx_g2_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
29 {
30         return mv88e6xxx_write(chip, MV88E6XXX_G2, reg, val);
31 }
32
33 static int mv88e6xxx_g2_update(struct mv88e6xxx_chip *chip, int reg, u16 update)
34 {
35         return mv88e6xxx_update(chip, MV88E6XXX_G2, reg, update);
36 }
37
38 static int mv88e6xxx_g2_wait(struct mv88e6xxx_chip *chip, int reg, u16 mask)
39 {
40         return mv88e6xxx_wait(chip, MV88E6XXX_G2, reg, mask);
41 }
42
43 /* Offset 0x02: Management Enable 2x */
44 /* Offset 0x03: Management Enable 0x */
45
46 int mv88e6095_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
47 {
48         int err;
49
50         /* Consider the frames with reserved multicast destination
51          * addresses matching 01:80:c2:00:00:2x as MGMT.
52          */
53         if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X)) {
54                 err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_2X, 0xffff);
55                 if (err)
56                         return err;
57         }
58
59         /* Consider the frames with reserved multicast destination
60          * addresses matching 01:80:c2:00:00:0x as MGMT.
61          */
62         if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X))
63                 return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_0X,
64                                           0xffff);
65
66         return 0;
67 }
68
69 /* Offset 0x06: Device Mapping Table register */
70
71 static int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
72                                              int target, int port)
73 {
74         u16 val = (target << 8) | (port & 0xf);
75
76         return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_DEVICE_MAPPING, val);
77 }
78
79 static int mv88e6xxx_g2_set_device_mapping(struct mv88e6xxx_chip *chip)
80 {
81         int target, port;
82         int err;
83
84         /* Initialize the routing port to the 32 possible target devices */
85         for (target = 0; target < 32; ++target) {
86                 port = 0xf;
87
88                 if (target < DSA_MAX_SWITCHES) {
89                         port = chip->ds->rtable[target];
90                         if (port == DSA_RTABLE_NONE)
91                                 port = 0xf;
92                 }
93
94                 err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
95                 if (err)
96                         break;
97         }
98
99         return err;
100 }
101
102 /* Offset 0x07: Trunk Mask Table register */
103
104 static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
105                                          bool hash, u16 mask)
106 {
107         u16 val = (num << 12) | (mask & mv88e6xxx_port_mask(chip));
108
109         if (hash)
110                 val |= MV88E6XXX_G2_TRUNK_MASK_HASH;
111
112         return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_TRUNK_MASK, val);
113 }
114
115 /* Offset 0x08: Trunk Mapping Table register */
116
117 static int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
118                                             u16 map)
119 {
120         const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
121         u16 val = (id << 11) | (map & port_mask);
122
123         return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_TRUNK_MAPPING, val);
124 }
125
126 static int mv88e6xxx_g2_clear_trunk(struct mv88e6xxx_chip *chip)
127 {
128         const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
129         int i, err;
130
131         /* Clear all eight possible Trunk Mask vectors */
132         for (i = 0; i < 8; ++i) {
133                 err = mv88e6xxx_g2_trunk_mask_write(chip, i, false, port_mask);
134                 if (err)
135                         return err;
136         }
137
138         /* Clear all sixteen possible Trunk ID routing vectors */
139         for (i = 0; i < 16; ++i) {
140                 err = mv88e6xxx_g2_trunk_mapping_write(chip, i, 0);
141                 if (err)
142                         return err;
143         }
144
145         return 0;
146 }
147
148 /* Offset 0x09: Ingress Rate Command register
149  * Offset 0x0A: Ingress Rate Data register
150  */
151
152 static int mv88e6xxx_g2_irl_wait(struct mv88e6xxx_chip *chip)
153 {
154         return mv88e6xxx_g2_wait(chip, MV88E6XXX_G2_IRL_CMD,
155                                  MV88E6XXX_G2_IRL_CMD_BUSY);
156 }
157
158 static int mv88e6xxx_g2_irl_op(struct mv88e6xxx_chip *chip, u16 op, int port,
159                                int res, int reg)
160 {
161         int err;
162
163         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_IRL_CMD,
164                                  MV88E6XXX_G2_IRL_CMD_BUSY | op | (port << 8) |
165                                  (res << 5) | reg);
166         if (err)
167                 return err;
168
169         return mv88e6xxx_g2_irl_wait(chip);
170 }
171
172 int mv88e6352_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
173 {
174         return mv88e6xxx_g2_irl_op(chip, MV88E6352_G2_IRL_CMD_OP_INIT_ALL, port,
175                                    0, 0);
176 }
177
178 int mv88e6390_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
179 {
180         return mv88e6xxx_g2_irl_op(chip, MV88E6390_G2_IRL_CMD_OP_INIT_ALL, port,
181                                    0, 0);
182 }
183
184 /* Offset 0x0B: Cross-chip Port VLAN (Addr) Register
185  * Offset 0x0C: Cross-chip Port VLAN Data Register
186  */
187
188 static int mv88e6xxx_g2_pvt_op_wait(struct mv88e6xxx_chip *chip)
189 {
190         return mv88e6xxx_g2_wait(chip, MV88E6XXX_G2_PVT_ADDR,
191                                  MV88E6XXX_G2_PVT_ADDR_BUSY);
192 }
193
194 static int mv88e6xxx_g2_pvt_op(struct mv88e6xxx_chip *chip, int src_dev,
195                                int src_port, u16 op)
196 {
197         int err;
198
199         /* 9-bit Cross-chip PVT pointer: with MV88E6XXX_G2_MISC_5_BIT_PORT
200          * cleared, source device is 5-bit, source port is 4-bit.
201          */
202         op |= MV88E6XXX_G2_PVT_ADDR_BUSY;
203         op |= (src_dev & 0x1f) << 4;
204         op |= (src_port & 0xf);
205
206         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_ADDR, op);
207         if (err)
208                 return err;
209
210         return mv88e6xxx_g2_pvt_op_wait(chip);
211 }
212
213 int mv88e6xxx_g2_pvt_write(struct mv88e6xxx_chip *chip, int src_dev,
214                            int src_port, u16 data)
215 {
216         int err;
217
218         err = mv88e6xxx_g2_pvt_op_wait(chip);
219         if (err)
220                 return err;
221
222         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_DATA, data);
223         if (err)
224                 return err;
225
226         return mv88e6xxx_g2_pvt_op(chip, src_dev, src_port,
227                                    MV88E6XXX_G2_PVT_ADDR_OP_WRITE_PVLAN);
228 }
229
230 /* Offset 0x0D: Switch MAC/WoL/WoF register */
231
232 static int mv88e6xxx_g2_switch_mac_write(struct mv88e6xxx_chip *chip,
233                                          unsigned int pointer, u8 data)
234 {
235         u16 val = (pointer << 8) | data;
236
237         return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_SWITCH_MAC, val);
238 }
239
240 int mv88e6xxx_g2_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
241 {
242         int i, err;
243
244         for (i = 0; i < 6; i++) {
245                 err = mv88e6xxx_g2_switch_mac_write(chip, i, addr[i]);
246                 if (err)
247                         break;
248         }
249
250         return err;
251 }
252
253 /* Offset 0x0F: Priority Override Table */
254
255 static int mv88e6xxx_g2_pot_write(struct mv88e6xxx_chip *chip, int pointer,
256                                   u8 data)
257 {
258         u16 val = (pointer << 8) | (data & 0x7);
259
260         return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_PRIO_OVERRIDE, val);
261 }
262
263 static int mv88e6xxx_g2_clear_pot(struct mv88e6xxx_chip *chip)
264 {
265         int i, err;
266
267         /* Clear all sixteen possible Priority Override entries */
268         for (i = 0; i < 16; i++) {
269                 err = mv88e6xxx_g2_pot_write(chip, i, 0);
270                 if (err)
271                         break;
272         }
273
274         return err;
275 }
276
277 /* Offset 0x14: EEPROM Command
278  * Offset 0x15: EEPROM Data (for 16-bit data access)
279  * Offset 0x15: EEPROM Addr (for 8-bit data access)
280  */
281
282 static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
283 {
284         return mv88e6xxx_g2_wait(chip, MV88E6XXX_G2_EEPROM_CMD,
285                                  MV88E6XXX_G2_EEPROM_CMD_BUSY |
286                                  MV88E6XXX_G2_EEPROM_CMD_RUNNING);
287 }
288
289 static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
290 {
291         int err;
292
293         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_EEPROM_CMD,
294                                  MV88E6XXX_G2_EEPROM_CMD_BUSY | cmd);
295         if (err)
296                 return err;
297
298         return mv88e6xxx_g2_eeprom_wait(chip);
299 }
300
301 static int mv88e6xxx_g2_eeprom_read8(struct mv88e6xxx_chip *chip,
302                                      u16 addr, u8 *data)
303 {
304         u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ;
305         int err;
306
307         err = mv88e6xxx_g2_eeprom_wait(chip);
308         if (err)
309                 return err;
310
311         err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
312         if (err)
313                 return err;
314
315         err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
316         if (err)
317                 return err;
318
319         err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &cmd);
320         if (err)
321                 return err;
322
323         *data = cmd & 0xff;
324
325         return 0;
326 }
327
328 static int mv88e6xxx_g2_eeprom_write8(struct mv88e6xxx_chip *chip,
329                                       u16 addr, u8 data)
330 {
331         u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE |
332                 MV88E6XXX_G2_EEPROM_CMD_WRITE_EN;
333         int err;
334
335         err = mv88e6xxx_g2_eeprom_wait(chip);
336         if (err)
337                 return err;
338
339         err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
340         if (err)
341                 return err;
342
343         return mv88e6xxx_g2_eeprom_cmd(chip, cmd | data);
344 }
345
346 static int mv88e6xxx_g2_eeprom_read16(struct mv88e6xxx_chip *chip,
347                                       u8 addr, u16 *data)
348 {
349         u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ | addr;
350         int err;
351
352         err = mv88e6xxx_g2_eeprom_wait(chip);
353         if (err)
354                 return err;
355
356         err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
357         if (err)
358                 return err;
359
360         return mv88e6xxx_g2_read(chip, MV88E6352_G2_EEPROM_DATA, data);
361 }
362
363 static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip,
364                                        u8 addr, u16 data)
365 {
366         u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE | addr;
367         int err;
368
369         err = mv88e6xxx_g2_eeprom_wait(chip);
370         if (err)
371                 return err;
372
373         err = mv88e6xxx_g2_write(chip, MV88E6352_G2_EEPROM_DATA, data);
374         if (err)
375                 return err;
376
377         return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
378 }
379
380 int mv88e6xxx_g2_get_eeprom8(struct mv88e6xxx_chip *chip,
381                              struct ethtool_eeprom *eeprom, u8 *data)
382 {
383         unsigned int offset = eeprom->offset;
384         unsigned int len = eeprom->len;
385         int err;
386
387         eeprom->len = 0;
388
389         while (len) {
390                 err = mv88e6xxx_g2_eeprom_read8(chip, offset, data);
391                 if (err)
392                         return err;
393
394                 eeprom->len++;
395                 offset++;
396                 data++;
397                 len--;
398         }
399
400         return 0;
401 }
402
403 int mv88e6xxx_g2_set_eeprom8(struct mv88e6xxx_chip *chip,
404                              struct ethtool_eeprom *eeprom, u8 *data)
405 {
406         unsigned int offset = eeprom->offset;
407         unsigned int len = eeprom->len;
408         int err;
409
410         eeprom->len = 0;
411
412         while (len) {
413                 err = mv88e6xxx_g2_eeprom_write8(chip, offset, *data);
414                 if (err)
415                         return err;
416
417                 eeprom->len++;
418                 offset++;
419                 data++;
420                 len--;
421         }
422
423         return 0;
424 }
425
426 int mv88e6xxx_g2_get_eeprom16(struct mv88e6xxx_chip *chip,
427                               struct ethtool_eeprom *eeprom, u8 *data)
428 {
429         unsigned int offset = eeprom->offset;
430         unsigned int len = eeprom->len;
431         u16 val;
432         int err;
433
434         eeprom->len = 0;
435
436         if (offset & 1) {
437                 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
438                 if (err)
439                         return err;
440
441                 *data++ = (val >> 8) & 0xff;
442
443                 offset++;
444                 len--;
445                 eeprom->len++;
446         }
447
448         while (len >= 2) {
449                 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
450                 if (err)
451                         return err;
452
453                 *data++ = val & 0xff;
454                 *data++ = (val >> 8) & 0xff;
455
456                 offset += 2;
457                 len -= 2;
458                 eeprom->len += 2;
459         }
460
461         if (len) {
462                 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
463                 if (err)
464                         return err;
465
466                 *data++ = val & 0xff;
467
468                 offset++;
469                 len--;
470                 eeprom->len++;
471         }
472
473         return 0;
474 }
475
476 int mv88e6xxx_g2_set_eeprom16(struct mv88e6xxx_chip *chip,
477                               struct ethtool_eeprom *eeprom, u8 *data)
478 {
479         unsigned int offset = eeprom->offset;
480         unsigned int len = eeprom->len;
481         u16 val;
482         int err;
483
484         /* Ensure the RO WriteEn bit is set */
485         err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &val);
486         if (err)
487                 return err;
488
489         if (!(val & MV88E6XXX_G2_EEPROM_CMD_WRITE_EN))
490                 return -EROFS;
491
492         eeprom->len = 0;
493
494         if (offset & 1) {
495                 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
496                 if (err)
497                         return err;
498
499                 val = (*data++ << 8) | (val & 0xff);
500
501                 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
502                 if (err)
503                         return err;
504
505                 offset++;
506                 len--;
507                 eeprom->len++;
508         }
509
510         while (len >= 2) {
511                 val = *data++;
512                 val |= *data++ << 8;
513
514                 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
515                 if (err)
516                         return err;
517
518                 offset += 2;
519                 len -= 2;
520                 eeprom->len += 2;
521         }
522
523         if (len) {
524                 err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
525                 if (err)
526                         return err;
527
528                 val = (val & 0xff00) | *data++;
529
530                 err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
531                 if (err)
532                         return err;
533
534                 offset++;
535                 len--;
536                 eeprom->len++;
537         }
538
539         return 0;
540 }
541
542 /* Offset 0x18: SMI PHY Command Register
543  * Offset 0x19: SMI PHY Data Register
544  */
545
546 static int mv88e6xxx_g2_smi_phy_wait(struct mv88e6xxx_chip *chip)
547 {
548         return mv88e6xxx_g2_wait(chip, MV88E6XXX_G2_SMI_PHY_CMD,
549                                  MV88E6XXX_G2_SMI_PHY_CMD_BUSY);
550 }
551
552 static int mv88e6xxx_g2_smi_phy_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
553 {
554         int err;
555
556         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_CMD,
557                                  MV88E6XXX_G2_SMI_PHY_CMD_BUSY | cmd);
558         if (err)
559                 return err;
560
561         return mv88e6xxx_g2_smi_phy_wait(chip);
562 }
563
564 static int mv88e6xxx_g2_smi_phy_access(struct mv88e6xxx_chip *chip,
565                                        bool external, bool c45, u16 op, int dev,
566                                        int reg)
567 {
568         u16 cmd = op;
569
570         if (external)
571                 cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_EXTERNAL;
572         else
573                 cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_INTERNAL; /* empty mask */
574
575         if (c45)
576                 cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_45; /* empty mask */
577         else
578                 cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_22;
579
580         dev <<= __bf_shf(MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK);
581         cmd |= dev & MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK;
582         cmd |= reg & MV88E6XXX_G2_SMI_PHY_CMD_REG_ADDR_MASK;
583
584         return mv88e6xxx_g2_smi_phy_cmd(chip, cmd);
585 }
586
587 static int mv88e6xxx_g2_smi_phy_access_c22(struct mv88e6xxx_chip *chip,
588                                            bool external, u16 op, int dev,
589                                            int reg)
590 {
591         return mv88e6xxx_g2_smi_phy_access(chip, external, false, op, dev, reg);
592 }
593
594 /* IEEE 802.3 Clause 22 Read Data Register */
595 static int mv88e6xxx_g2_smi_phy_read_data_c22(struct mv88e6xxx_chip *chip,
596                                               bool external, int dev, int reg,
597                                               u16 *data)
598 {
599         u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_READ_DATA;
600         int err;
601
602         err = mv88e6xxx_g2_smi_phy_wait(chip);
603         if (err)
604                 return err;
605
606         err = mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
607         if (err)
608                 return err;
609
610         return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
611 }
612
613 /* IEEE 802.3 Clause 22 Write Data Register */
614 static int mv88e6xxx_g2_smi_phy_write_data_c22(struct mv88e6xxx_chip *chip,
615                                                bool external, int dev, int reg,
616                                                u16 data)
617 {
618         u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_WRITE_DATA;
619         int err;
620
621         err = mv88e6xxx_g2_smi_phy_wait(chip);
622         if (err)
623                 return err;
624
625         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
626         if (err)
627                 return err;
628
629         return mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
630 }
631
632 static int mv88e6xxx_g2_smi_phy_access_c45(struct mv88e6xxx_chip *chip,
633                                            bool external, u16 op, int port,
634                                            int dev)
635 {
636         return mv88e6xxx_g2_smi_phy_access(chip, external, true, op, port, dev);
637 }
638
639 /* IEEE 802.3 Clause 45 Write Address Register */
640 static int mv88e6xxx_g2_smi_phy_write_addr_c45(struct mv88e6xxx_chip *chip,
641                                                bool external, int port, int dev,
642                                                int addr)
643 {
644         u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_ADDR;
645         int err;
646
647         err = mv88e6xxx_g2_smi_phy_wait(chip);
648         if (err)
649                 return err;
650
651         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, addr);
652         if (err)
653                 return err;
654
655         return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
656 }
657
658 /* IEEE 802.3 Clause 45 Read Data Register */
659 static int mv88e6xxx_g2_smi_phy_read_data_c45(struct mv88e6xxx_chip *chip,
660                                               bool external, int port, int dev,
661                                               u16 *data)
662 {
663         u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_READ_DATA;
664         int err;
665
666         err = mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
667         if (err)
668                 return err;
669
670         return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
671 }
672
673 static int mv88e6xxx_g2_smi_phy_read_c45(struct mv88e6xxx_chip *chip,
674                                          bool external, int port, int reg,
675                                          u16 *data)
676 {
677         int dev = (reg >> 16) & 0x1f;
678         int addr = reg & 0xffff;
679         int err;
680
681         err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
682                                                   addr);
683         if (err)
684                 return err;
685
686         return mv88e6xxx_g2_smi_phy_read_data_c45(chip, external, port, dev,
687                                                   data);
688 }
689
690 /* IEEE 802.3 Clause 45 Write Data Register */
691 static int mv88e6xxx_g2_smi_phy_write_data_c45(struct mv88e6xxx_chip *chip,
692                                                bool external, int port, int dev,
693                                                u16 data)
694 {
695         u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_DATA;
696         int err;
697
698         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
699         if (err)
700                 return err;
701
702         return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
703 }
704
705 static int mv88e6xxx_g2_smi_phy_write_c45(struct mv88e6xxx_chip *chip,
706                                           bool external, int port, int reg,
707                                           u16 data)
708 {
709         int dev = (reg >> 16) & 0x1f;
710         int addr = reg & 0xffff;
711         int err;
712
713         err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
714                                                   addr);
715         if (err)
716                 return err;
717
718         return mv88e6xxx_g2_smi_phy_write_data_c45(chip, external, port, dev,
719                                                    data);
720 }
721
722 int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
723                               int addr, int reg, u16 *val)
724 {
725         struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
726         bool external = mdio_bus->external;
727
728         if (reg & MII_ADDR_C45)
729                 return mv88e6xxx_g2_smi_phy_read_c45(chip, external, addr, reg,
730                                                      val);
731
732         return mv88e6xxx_g2_smi_phy_read_data_c22(chip, external, addr, reg,
733                                                   val);
734 }
735
736 int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
737                                int addr, int reg, u16 val)
738 {
739         struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
740         bool external = mdio_bus->external;
741
742         if (reg & MII_ADDR_C45)
743                 return mv88e6xxx_g2_smi_phy_write_c45(chip, external, addr, reg,
744                                                       val);
745
746         return mv88e6xxx_g2_smi_phy_write_data_c22(chip, external, addr, reg,
747                                                    val);
748 }
749
750 static int mv88e6097_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
751 {
752         u16 reg;
753
754         mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, &reg);
755
756         dev_info(chip->dev, "Watchdog event: 0x%04x", reg);
757
758         return IRQ_HANDLED;
759 }
760
761 static void mv88e6097_watchdog_free(struct mv88e6xxx_chip *chip)
762 {
763         u16 reg;
764
765         mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, &reg);
766
767         reg &= ~(MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
768                  MV88E6352_G2_WDOG_CTL_QC_ENABLE);
769
770         mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL, reg);
771 }
772
773 static int mv88e6097_watchdog_setup(struct mv88e6xxx_chip *chip)
774 {
775         return mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL,
776                                   MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
777                                   MV88E6352_G2_WDOG_CTL_QC_ENABLE |
778                                   MV88E6352_G2_WDOG_CTL_SWRESET);
779 }
780
781 const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops = {
782         .irq_action = mv88e6097_watchdog_action,
783         .irq_setup = mv88e6097_watchdog_setup,
784         .irq_free = mv88e6097_watchdog_free,
785 };
786
787 static int mv88e6390_watchdog_setup(struct mv88e6xxx_chip *chip)
788 {
789         return mv88e6xxx_g2_update(chip, MV88E6390_G2_WDOG_CTL,
790                                    MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE |
791                                    MV88E6390_G2_WDOG_CTL_CUT_THROUGH |
792                                    MV88E6390_G2_WDOG_CTL_QUEUE_CONTROLLER |
793                                    MV88E6390_G2_WDOG_CTL_EGRESS |
794                                    MV88E6390_G2_WDOG_CTL_FORCE_IRQ);
795 }
796
797 static int mv88e6390_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
798 {
799         int err;
800         u16 reg;
801
802         mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
803                            MV88E6390_G2_WDOG_CTL_PTR_EVENT);
804         err = mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, &reg);
805
806         dev_info(chip->dev, "Watchdog event: 0x%04x",
807                  reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
808
809         mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
810                            MV88E6390_G2_WDOG_CTL_PTR_HISTORY);
811         err = mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, &reg);
812
813         dev_info(chip->dev, "Watchdog history: 0x%04x",
814                  reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
815
816         /* Trigger a software reset to try to recover the switch */
817         if (chip->info->ops->reset)
818                 chip->info->ops->reset(chip);
819
820         mv88e6390_watchdog_setup(chip);
821
822         return IRQ_HANDLED;
823 }
824
825 static void mv88e6390_watchdog_free(struct mv88e6xxx_chip *chip)
826 {
827         mv88e6xxx_g2_update(chip, MV88E6390_G2_WDOG_CTL,
828                             MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE);
829 }
830
831 const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops = {
832         .irq_action = mv88e6390_watchdog_action,
833         .irq_setup = mv88e6390_watchdog_setup,
834         .irq_free = mv88e6390_watchdog_free,
835 };
836
837 static irqreturn_t mv88e6xxx_g2_watchdog_thread_fn(int irq, void *dev_id)
838 {
839         struct mv88e6xxx_chip *chip = dev_id;
840         irqreturn_t ret = IRQ_NONE;
841
842         mutex_lock(&chip->reg_lock);
843         if (chip->info->ops->watchdog_ops->irq_action)
844                 ret = chip->info->ops->watchdog_ops->irq_action(chip, irq);
845         mutex_unlock(&chip->reg_lock);
846
847         return ret;
848 }
849
850 static void mv88e6xxx_g2_watchdog_free(struct mv88e6xxx_chip *chip)
851 {
852         mutex_lock(&chip->reg_lock);
853         if (chip->info->ops->watchdog_ops->irq_free)
854                 chip->info->ops->watchdog_ops->irq_free(chip);
855         mutex_unlock(&chip->reg_lock);
856
857         free_irq(chip->watchdog_irq, chip);
858         irq_dispose_mapping(chip->watchdog_irq);
859 }
860
861 static int mv88e6xxx_g2_watchdog_setup(struct mv88e6xxx_chip *chip)
862 {
863         int err;
864
865         chip->watchdog_irq = irq_find_mapping(chip->g2_irq.domain,
866                                               MV88E6XXX_G2_INT_SOURCE_WATCHDOG);
867         if (chip->watchdog_irq < 0)
868                 return chip->watchdog_irq;
869
870         err = request_threaded_irq(chip->watchdog_irq, NULL,
871                                    mv88e6xxx_g2_watchdog_thread_fn,
872                                    IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
873                                    "mv88e6xxx-watchdog", chip);
874         if (err)
875                 return err;
876
877         mutex_lock(&chip->reg_lock);
878         if (chip->info->ops->watchdog_ops->irq_setup)
879                 err = chip->info->ops->watchdog_ops->irq_setup(chip);
880         mutex_unlock(&chip->reg_lock);
881
882         return err;
883 }
884
885 /* Offset 0x1D: Misc Register */
886
887 static int mv88e6xxx_g2_misc_5_bit_port(struct mv88e6xxx_chip *chip,
888                                         bool port_5_bit)
889 {
890         u16 val;
891         int err;
892
893         err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_MISC, &val);
894         if (err)
895                 return err;
896
897         if (port_5_bit)
898                 val |= MV88E6XXX_G2_MISC_5_BIT_PORT;
899         else
900                 val &= ~MV88E6XXX_G2_MISC_5_BIT_PORT;
901
902         return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MISC, val);
903 }
904
905 int mv88e6xxx_g2_misc_4_bit_port(struct mv88e6xxx_chip *chip)
906 {
907         return mv88e6xxx_g2_misc_5_bit_port(chip, false);
908 }
909
910 static void mv88e6xxx_g2_irq_mask(struct irq_data *d)
911 {
912         struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
913         unsigned int n = d->hwirq;
914
915         chip->g2_irq.masked |= (1 << n);
916 }
917
918 static void mv88e6xxx_g2_irq_unmask(struct irq_data *d)
919 {
920         struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
921         unsigned int n = d->hwirq;
922
923         chip->g2_irq.masked &= ~(1 << n);
924 }
925
926 static irqreturn_t mv88e6xxx_g2_irq_thread_fn(int irq, void *dev_id)
927 {
928         struct mv88e6xxx_chip *chip = dev_id;
929         unsigned int nhandled = 0;
930         unsigned int sub_irq;
931         unsigned int n;
932         int err;
933         u16 reg;
934
935         mutex_lock(&chip->reg_lock);
936         err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_INT_SOURCE, &reg);
937         mutex_unlock(&chip->reg_lock);
938         if (err)
939                 goto out;
940
941         for (n = 0; n < 16; ++n) {
942                 if (reg & (1 << n)) {
943                         sub_irq = irq_find_mapping(chip->g2_irq.domain, n);
944                         handle_nested_irq(sub_irq);
945                         ++nhandled;
946                 }
947         }
948 out:
949         return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
950 }
951
952 static void mv88e6xxx_g2_irq_bus_lock(struct irq_data *d)
953 {
954         struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
955
956         mutex_lock(&chip->reg_lock);
957 }
958
959 static void mv88e6xxx_g2_irq_bus_sync_unlock(struct irq_data *d)
960 {
961         struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
962
963         mv88e6xxx_g2_write(chip, MV88E6XXX_G2_INT_MASK, ~chip->g2_irq.masked);
964
965         mutex_unlock(&chip->reg_lock);
966 }
967
968 static struct irq_chip mv88e6xxx_g2_irq_chip = {
969         .name                   = "mv88e6xxx-g2",
970         .irq_mask               = mv88e6xxx_g2_irq_mask,
971         .irq_unmask             = mv88e6xxx_g2_irq_unmask,
972         .irq_bus_lock           = mv88e6xxx_g2_irq_bus_lock,
973         .irq_bus_sync_unlock    = mv88e6xxx_g2_irq_bus_sync_unlock,
974 };
975
976 static int mv88e6xxx_g2_irq_domain_map(struct irq_domain *d,
977                                        unsigned int irq,
978                                        irq_hw_number_t hwirq)
979 {
980         struct mv88e6xxx_chip *chip = d->host_data;
981
982         irq_set_chip_data(irq, d->host_data);
983         irq_set_chip_and_handler(irq, &chip->g2_irq.chip, handle_level_irq);
984         irq_set_noprobe(irq);
985
986         return 0;
987 }
988
989 static const struct irq_domain_ops mv88e6xxx_g2_irq_domain_ops = {
990         .map    = mv88e6xxx_g2_irq_domain_map,
991         .xlate  = irq_domain_xlate_twocell,
992 };
993
994 void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip)
995 {
996         int irq, virq;
997
998         mv88e6xxx_g2_watchdog_free(chip);
999
1000         free_irq(chip->device_irq, chip);
1001         irq_dispose_mapping(chip->device_irq);
1002
1003         for (irq = 0; irq < 16; irq++) {
1004                 virq = irq_find_mapping(chip->g2_irq.domain, irq);
1005                 irq_dispose_mapping(virq);
1006         }
1007
1008         irq_domain_remove(chip->g2_irq.domain);
1009 }
1010
1011 int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
1012 {
1013         int err, irq, virq;
1014
1015         if (!chip->dev->of_node)
1016                 return -EINVAL;
1017
1018         chip->g2_irq.domain = irq_domain_add_simple(
1019                 chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip);
1020         if (!chip->g2_irq.domain)
1021                 return -ENOMEM;
1022
1023         for (irq = 0; irq < 16; irq++)
1024                 irq_create_mapping(chip->g2_irq.domain, irq);
1025
1026         chip->g2_irq.chip = mv88e6xxx_g2_irq_chip;
1027         chip->g2_irq.masked = ~0;
1028
1029         chip->device_irq = irq_find_mapping(chip->g1_irq.domain,
1030                                             MV88E6XXX_G1_STS_IRQ_DEVICE);
1031         if (chip->device_irq < 0) {
1032                 err = chip->device_irq;
1033                 goto out;
1034         }
1035
1036         err = request_threaded_irq(chip->device_irq, NULL,
1037                                    mv88e6xxx_g2_irq_thread_fn,
1038                                    IRQF_ONESHOT, "mv88e6xxx-g1", chip);
1039         if (err)
1040                 goto out;
1041
1042         return mv88e6xxx_g2_watchdog_setup(chip);
1043
1044 out:
1045         for (irq = 0; irq < 16; irq++) {
1046                 virq = irq_find_mapping(chip->g2_irq.domain, irq);
1047                 irq_dispose_mapping(virq);
1048         }
1049
1050         irq_domain_remove(chip->g2_irq.domain);
1051
1052         return err;
1053 }
1054
1055 int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
1056 {
1057         u16 reg;
1058         int err;
1059
1060         /* Ignore removed tag data on doubly tagged packets, disable
1061          * flow control messages, force flow control priority to the
1062          * highest, and send all special multicast frames to the CPU
1063          * port at the highest priority.
1064          */
1065         reg = MV88E6XXX_G2_SWITCH_MGMT_FORCE_FLOW_CTL_PRI | (0x7 << 4);
1066         if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X) ||
1067             mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X))
1068                 reg |= MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU | 0x7;
1069         err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MGMT, reg);
1070         if (err)
1071                 return err;
1072
1073         /* Program the DSA routing table. */
1074         err = mv88e6xxx_g2_set_device_mapping(chip);
1075         if (err)
1076                 return err;
1077
1078         /* Clear all trunk masks and mapping. */
1079         err = mv88e6xxx_g2_clear_trunk(chip);
1080         if (err)
1081                 return err;
1082
1083         if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_POT)) {
1084                 /* Clear the priority override table. */
1085                 err = mv88e6xxx_g2_clear_pot(chip);
1086                 if (err)
1087                         return err;
1088         }
1089
1090         return 0;
1091 }