hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/drivers/net/dsa/mv88e6xxx/global1.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Marvell 88E6xxx Switch Global (1) Registers support
34 *
....@@ -5,11 +6,6 @@
56 *
67 * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
78 * 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.
139 */
1410
1511 #include <linux/bitfield.h>
....@@ -31,100 +27,52 @@
3127 return mv88e6xxx_write(chip, addr, reg, val);
3228 }
3329
34
-int mv88e6xxx_g1_wait(struct mv88e6xxx_chip *chip, int reg, u16 mask)
30
+int mv88e6xxx_g1_wait_bit(struct mv88e6xxx_chip *chip, int reg, int
31
+ bit, int val)
3532 {
36
- return mv88e6xxx_wait(chip, chip->info->global1_addr, reg, mask);
33
+ return mv88e6xxx_wait_bit(chip, chip->info->global1_addr, reg,
34
+ bit, val);
35
+}
36
+
37
+int mv88e6xxx_g1_wait_mask(struct mv88e6xxx_chip *chip, int reg,
38
+ u16 mask, u16 val)
39
+{
40
+ return mv88e6xxx_wait_mask(chip, chip->info->global1_addr, reg,
41
+ mask, val);
3742 }
3843
3944 /* Offset 0x00: Switch Global Status Register */
4045
4146 static int mv88e6185_g1_wait_ppu_disabled(struct mv88e6xxx_chip *chip)
4247 {
43
- u16 state;
44
- int i, err;
45
-
46
- for (i = 0; i < 16; i++) {
47
- err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &state);
48
- if (err)
49
- return err;
50
-
51
- /* Check the value of the PPUState bits 15:14 */
52
- state &= MV88E6185_G1_STS_PPU_STATE_MASK;
53
- if (state != MV88E6185_G1_STS_PPU_STATE_POLLING)
54
- return 0;
55
-
56
- usleep_range(1000, 2000);
57
- }
58
-
59
- return -ETIMEDOUT;
48
+ return mv88e6xxx_g1_wait_mask(chip, MV88E6XXX_G1_STS,
49
+ MV88E6185_G1_STS_PPU_STATE_MASK,
50
+ MV88E6185_G1_STS_PPU_STATE_DISABLED);
6051 }
6152
6253 static int mv88e6185_g1_wait_ppu_polling(struct mv88e6xxx_chip *chip)
6354 {
64
- u16 state;
65
- int i, err;
66
-
67
- for (i = 0; i < 16; ++i) {
68
- err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &state);
69
- if (err)
70
- return err;
71
-
72
- /* Check the value of the PPUState bits 15:14 */
73
- state &= MV88E6185_G1_STS_PPU_STATE_MASK;
74
- if (state == MV88E6185_G1_STS_PPU_STATE_POLLING)
75
- return 0;
76
-
77
- usleep_range(1000, 2000);
78
- }
79
-
80
- return -ETIMEDOUT;
55
+ return mv88e6xxx_g1_wait_mask(chip, MV88E6XXX_G1_STS,
56
+ MV88E6185_G1_STS_PPU_STATE_MASK,
57
+ MV88E6185_G1_STS_PPU_STATE_POLLING);
8158 }
8259
8360 static int mv88e6352_g1_wait_ppu_polling(struct mv88e6xxx_chip *chip)
8461 {
85
- u16 state;
86
- int i, err;
62
+ int bit = __bf_shf(MV88E6352_G1_STS_PPU_STATE);
8763
88
- for (i = 0; i < 16; ++i) {
89
- err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &state);
90
- if (err)
91
- return err;
92
-
93
- /* Check the value of the PPUState (or InitState) bit 15 */
94
- if (state & MV88E6352_G1_STS_PPU_STATE)
95
- return 0;
96
-
97
- usleep_range(1000, 2000);
98
- }
99
-
100
- return -ETIMEDOUT;
64
+ return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1);
10165 }
10266
10367 static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip *chip)
10468 {
105
- const unsigned long timeout = jiffies + 1 * HZ;
106
- u16 val;
107
- int err;
69
+ int bit = __bf_shf(MV88E6XXX_G1_STS_INIT_READY);
10870
10971 /* Wait up to 1 second for the switch to be ready. The InitReady bit 11
11072 * is set to a one when all units inside the device (ATU, VTU, etc.)
11173 * have finished their initialization and are ready to accept frames.
11274 */
113
- while (time_before(jiffies, timeout)) {
114
- err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val);
115
- if (err)
116
- return err;
117
-
118
- if (val & MV88E6XXX_G1_STS_INIT_READY)
119
- break;
120
-
121
- usleep_range(1000, 2000);
122
- }
123
-
124
- if (time_after(jiffies, timeout))
125
- return -ETIMEDOUT;
126
-
127
- return 0;
75
+ return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1);
12876 }
12977
13078 /* Offset 0x01: Switch MAC Address Register Bytes 0 & 1
....@@ -182,7 +130,7 @@
182130 return mv88e6185_g1_wait_ppu_polling(chip);
183131 }
184132
185
-int mv88e6352_g1_reset(struct mv88e6xxx_chip *chip)
133
+int mv88e6250_g1_reset(struct mv88e6xxx_chip *chip)
186134 {
187135 u16 val;
188136 int err;
....@@ -198,7 +146,14 @@
198146 if (err)
199147 return err;
200148
201
- err = mv88e6xxx_g1_wait_init_ready(chip);
149
+ return mv88e6xxx_g1_wait_init_ready(chip);
150
+}
151
+
152
+int mv88e6352_g1_reset(struct mv88e6xxx_chip *chip)
153
+{
154
+ int err;
155
+
156
+ err = mv88e6250_g1_reset(chip);
202157 if (err)
203158 return err;
204159
....@@ -239,6 +194,25 @@
239194 return err;
240195
241196 return mv88e6185_g1_wait_ppu_disabled(chip);
197
+}
198
+
199
+int mv88e6185_g1_set_max_frame_size(struct mv88e6xxx_chip *chip, int mtu)
200
+{
201
+ u16 val;
202
+ int err;
203
+
204
+ mtu += ETH_HLEN + ETH_FCS_LEN;
205
+
206
+ err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_CTL1, &val);
207
+ if (err)
208
+ return err;
209
+
210
+ val &= ~MV88E6185_G1_CTL1_MAX_FRAME_1632;
211
+
212
+ if (mtu > 1518)
213
+ val |= MV88E6185_G1_CTL1_MAX_FRAME_1632;
214
+
215
+ return mv88e6xxx_g1_write(chip, MV88E6XXX_G1_CTL1, val);
242216 }
243217
244218 /* Offset 0x10: IP-PRI Mapping Register 0
....@@ -299,11 +273,20 @@
299273 return mv88e6xxx_g1_write(chip, MV88E6XXX_G1_IEEE_PRI, 0xfa41);
300274 }
301275
276
+int mv88e6250_g1_ieee_pri_map(struct mv88e6xxx_chip *chip)
277
+{
278
+ /* Reset the IEEE Tag priorities to defaults */
279
+ return mv88e6xxx_g1_write(chip, MV88E6XXX_G1_IEEE_PRI, 0xfa50);
280
+}
281
+
302282 /* Offset 0x1a: Monitor Control */
303283 /* Offset 0x1a: Monitor & MGMT Control on some devices */
304284
305
-int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
285
+int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip,
286
+ enum mv88e6xxx_egress_direction direction,
287
+ int port)
306288 {
289
+ int *dest_port_chip;
307290 u16 reg;
308291 int err;
309292
....@@ -311,13 +294,28 @@
311294 if (err)
312295 return err;
313296
314
- reg &= ~(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK |
315
- MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
297
+ switch (direction) {
298
+ case MV88E6XXX_EGRESS_DIR_INGRESS:
299
+ dest_port_chip = &chip->ingress_dest_port;
300
+ reg &= ~MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
301
+ reg |= port <<
302
+ __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK);
303
+ break;
304
+ case MV88E6XXX_EGRESS_DIR_EGRESS:
305
+ dest_port_chip = &chip->egress_dest_port;
306
+ reg &= ~MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
307
+ reg |= port <<
308
+ __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
309
+ break;
310
+ default:
311
+ return -EINVAL;
312
+ }
316313
317
- reg |= port << __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK) |
318
- port << __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
314
+ err = mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
315
+ if (!err)
316
+ *dest_port_chip = port;
319317
320
- return mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
318
+ return err;
321319 }
322320
323321 /* Older generations also call this the ARP destination. It has been
....@@ -349,22 +347,32 @@
349347 return mv88e6xxx_g1_write(chip, MV88E6390_G1_MONITOR_MGMT_CTL, reg);
350348 }
351349
352
-int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
350
+int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip,
351
+ enum mv88e6xxx_egress_direction direction,
352
+ int port)
353353 {
354
+ int *dest_port_chip;
354355 u16 ptr;
355356 int err;
356357
357
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
358
- err = mv88e6390_g1_monitor_write(chip, ptr, port);
359
- if (err)
360
- return err;
358
+ switch (direction) {
359
+ case MV88E6XXX_EGRESS_DIR_INGRESS:
360
+ dest_port_chip = &chip->ingress_dest_port;
361
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
362
+ break;
363
+ case MV88E6XXX_EGRESS_DIR_EGRESS:
364
+ dest_port_chip = &chip->egress_dest_port;
365
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
366
+ break;
367
+ default:
368
+ return -EINVAL;
369
+ }
361370
362
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
363371 err = mv88e6390_g1_monitor_write(chip, ptr, port);
364
- if (err)
365
- return err;
372
+ if (!err)
373
+ *dest_port_chip = port;
366374
367
- return 0;
375
+ return err;
368376 }
369377
370378 int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port)
....@@ -384,26 +392,26 @@
384392 u16 ptr;
385393 int err;
386394
387
- /* 01:c2:80:00:00:00:00-01:c2:80:00:00:00:07 are Management */
388
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C280000000XLO;
395
+ /* 01:80:c2:00:00:00-01:80:c2:00:00:07 are Management */
396
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200000XLO;
389397 err = mv88e6390_g1_monitor_write(chip, ptr, 0xff);
390398 if (err)
391399 return err;
392400
393
- /* 01:c2:80:00:00:00:08-01:c2:80:00:00:00:0f are Management */
394
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C280000000XHI;
401
+ /* 01:80:c2:00:00:08-01:80:c2:00:00:0f are Management */
402
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200000XHI;
395403 err = mv88e6390_g1_monitor_write(chip, ptr, 0xff);
396404 if (err)
397405 return err;
398406
399
- /* 01:c2:80:00:00:00:20-01:c2:80:00:00:00:27 are Management */
400
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C280000002XLO;
407
+ /* 01:80:c2:00:00:20-01:80:c2:00:00:27 are Management */
408
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200002XLO;
401409 err = mv88e6390_g1_monitor_write(chip, ptr, 0xff);
402410 if (err)
403411 return err;
404412
405
- /* 01:c2:80:00:00:00:28-01:c2:80:00:00:00:2f are Management */
406
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C280000002XHI;
413
+ /* 01:80:c2:00:00:28-01:80:c2:00:00:2f are Management */
414
+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_0180C200002XHI;
407415 err = mv88e6390_g1_monitor_write(chip, ptr, 0xff);
408416 if (err)
409417 return err;
....@@ -470,10 +478,11 @@
470478
471479 /* Offset 0x1d: Statistics Operation 2 */
472480
473
-int mv88e6xxx_g1_stats_wait(struct mv88e6xxx_chip *chip)
481
+static int mv88e6xxx_g1_stats_wait(struct mv88e6xxx_chip *chip)
474482 {
475
- return mv88e6xxx_g1_wait(chip, MV88E6XXX_G1_STATS_OP,
476
- MV88E6XXX_G1_STATS_OP_BUSY);
483
+ int bit = __bf_shf(MV88E6XXX_G1_STATS_OP_BUSY);
484
+
485
+ return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STATS_OP, bit, 0);
477486 }
478487
479488 int mv88e6095_g1_stats_set_histogram(struct mv88e6xxx_chip *chip)