Skip to content

Commit 6090701

Browse files
elkablodavem330
authored andcommitted
net: dsa: mv88e6xxx: update code operating on hidden registers
This patch moves the functions operating on the hidden debug registers into it's own file, port_hidden.c. The functions prefix is renamed from mv88e6390_hidden_ to mv88e6xxx_port_hidden_, to be consistent with the rest of this driver. The macros are prefixed with MV88E6XXX_ prefix, and are changed not to use the BIT() macro nor bit shifts, since the rest of the port.h file does not use it. We also add the support for setting the Block Address field when operating hidden registers. Marvell's mdio examples for SERDES settings on Topaz use Block Address 0x7 when reading/writing hidden registers, and although the specification says that block must be set to 0xf, those settings are reachable only with Block Address 0x7. Signed-off-by: Marek Behún <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Tested-by: Vivien Didelot <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4e6da79 commit 6090701

File tree

4 files changed

+87
-64
lines changed

4 files changed

+87
-64
lines changed

drivers/net/dsa/mv88e6xxx/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_GLOBAL2) += global2_scratch.o
1010
mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += hwtstamp.o
1111
mv88e6xxx-objs += phy.o
1212
mv88e6xxx-objs += port.o
13+
mv88e6xxx-objs += port_hidden.o
1314
mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += ptp.o
1415
mv88e6xxx-objs += serdes.o
1516
mv88e6xxx-objs += smi.o

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,60 +2317,6 @@ static int mv88e6xxx_stats_setup(struct mv88e6xxx_chip *chip)
23172317
return mv88e6xxx_g1_stats_clear(chip);
23182318
}
23192319

2320-
/* The mv88e6390 has some hidden registers used for debug and
2321-
* development. The errata also makes use of them.
2322-
*/
2323-
static int mv88e6390_hidden_write(struct mv88e6xxx_chip *chip, int port,
2324-
int reg, u16 val)
2325-
{
2326-
u16 ctrl;
2327-
int err;
2328-
2329-
err = mv88e6xxx_port_write(chip, PORT_RESERVED_1A_DATA_PORT,
2330-
PORT_RESERVED_1A, val);
2331-
if (err)
2332-
return err;
2333-
2334-
ctrl = PORT_RESERVED_1A_BUSY | PORT_RESERVED_1A_WRITE |
2335-
PORT_RESERVED_1A_BLOCK | port << PORT_RESERVED_1A_PORT_SHIFT |
2336-
reg;
2337-
2338-
return mv88e6xxx_port_write(chip, PORT_RESERVED_1A_CTRL_PORT,
2339-
PORT_RESERVED_1A, ctrl);
2340-
}
2341-
2342-
static int mv88e6390_hidden_wait(struct mv88e6xxx_chip *chip)
2343-
{
2344-
int bit = __bf_shf(PORT_RESERVED_1A_BUSY);
2345-
2346-
return mv88e6xxx_wait_bit(chip, PORT_RESERVED_1A_CTRL_PORT,
2347-
PORT_RESERVED_1A, bit, 0);
2348-
}
2349-
2350-
2351-
static int mv88e6390_hidden_read(struct mv88e6xxx_chip *chip, int port,
2352-
int reg, u16 *val)
2353-
{
2354-
u16 ctrl;
2355-
int err;
2356-
2357-
ctrl = PORT_RESERVED_1A_BUSY | PORT_RESERVED_1A_READ |
2358-
PORT_RESERVED_1A_BLOCK | port << PORT_RESERVED_1A_PORT_SHIFT |
2359-
reg;
2360-
2361-
err = mv88e6xxx_port_write(chip, PORT_RESERVED_1A_CTRL_PORT,
2362-
PORT_RESERVED_1A, ctrl);
2363-
if (err)
2364-
return err;
2365-
2366-
err = mv88e6390_hidden_wait(chip);
2367-
if (err)
2368-
return err;
2369-
2370-
return mv88e6xxx_port_read(chip, PORT_RESERVED_1A_DATA_PORT,
2371-
PORT_RESERVED_1A, val);
2372-
}
2373-
23742320
/* Check if the errata has already been applied. */
23752321
static bool mv88e6390_setup_errata_applied(struct mv88e6xxx_chip *chip)
23762322
{
@@ -2379,7 +2325,7 @@ static bool mv88e6390_setup_errata_applied(struct mv88e6xxx_chip *chip)
23792325
u16 val;
23802326

23812327
for (port = 0; port < mv88e6xxx_num_ports(chip); port++) {
2382-
err = mv88e6390_hidden_read(chip, port, 0, &val);
2328+
err = mv88e6xxx_port_hidden_read(chip, 0xf, port, 0, &val);
23832329
if (err) {
23842330
dev_err(chip->dev,
23852331
"Error reading hidden register: %d\n", err);
@@ -2412,7 +2358,7 @@ static int mv88e6390_setup_errata(struct mv88e6xxx_chip *chip)
24122358
}
24132359

24142360
for (port = 0; port < mv88e6xxx_num_ports(chip); port++) {
2415-
err = mv88e6390_hidden_write(chip, port, 0, 0x01c0);
2361+
err = mv88e6xxx_port_hidden_write(chip, 0xf, port, 0, 0x01c0);
24162362
if (err)
24172363
return err;
24182364
}

drivers/net/dsa/mv88e6xxx/port.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,14 @@
261261
#define MV88E6095_PORT_IEEE_PRIO_REMAP_4567 0x19
262262

263263
/* Offset 0x1a: Magic undocumented errata register */
264-
#define PORT_RESERVED_1A 0x1a
265-
#define PORT_RESERVED_1A_BUSY BIT(15)
266-
#define PORT_RESERVED_1A_WRITE BIT(14)
267-
#define PORT_RESERVED_1A_READ 0
268-
#define PORT_RESERVED_1A_PORT_SHIFT 5
269-
#define PORT_RESERVED_1A_BLOCK (0xf << 10)
270-
#define PORT_RESERVED_1A_CTRL_PORT 4
271-
#define PORT_RESERVED_1A_DATA_PORT 5
264+
#define MV88E6XXX_PORT_RESERVED_1A 0x1a
265+
#define MV88E6XXX_PORT_RESERVED_1A_BUSY 0x8000
266+
#define MV88E6XXX_PORT_RESERVED_1A_WRITE 0x4000
267+
#define MV88E6XXX_PORT_RESERVED_1A_READ 0x0000
268+
#define MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT 5
269+
#define MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT 10
270+
#define MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT 0x04
271+
#define MV88E6XXX_PORT_RESERVED_1A_DATA_PORT 0x05
272272

273273
int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
274274
u16 *val);
@@ -353,4 +353,10 @@ int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
353353
int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port);
354354
int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port);
355355

356+
int mv88e6xxx_port_hidden_write(struct mv88e6xxx_chip *chip, int block,
357+
int port, int reg, u16 val);
358+
int mv88e6xxx_port_hidden_wait(struct mv88e6xxx_chip *chip);
359+
int mv88e6xxx_port_hidden_read(struct mv88e6xxx_chip *chip, int block, int port,
360+
int reg, u16 *val);
361+
356362
#endif /* _MV88E6XXX_PORT_H */
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
/*
3+
* Marvell 88E6xxx Switch Hidden Registers support
4+
*
5+
* Copyright (c) 2008 Marvell Semiconductor
6+
*
7+
* Copyright (c) 2019 Andrew Lunn <[email protected]>
8+
*/
9+
10+
#include <linux/bitfield.h>
11+
12+
#include "chip.h"
13+
#include "port.h"
14+
15+
/* The mv88e6390 and mv88e6341 have some hidden registers used for debug and
16+
* development. The errata also makes use of them.
17+
*/
18+
int mv88e6xxx_port_hidden_write(struct mv88e6xxx_chip *chip, int block,
19+
int port, int reg, u16 val)
20+
{
21+
u16 ctrl;
22+
int err;
23+
24+
err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
25+
MV88E6XXX_PORT_RESERVED_1A, val);
26+
if (err)
27+
return err;
28+
29+
ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
30+
MV88E6XXX_PORT_RESERVED_1A_WRITE |
31+
block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
32+
port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
33+
reg;
34+
35+
return mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
36+
MV88E6XXX_PORT_RESERVED_1A, ctrl);
37+
}
38+
39+
int mv88e6xxx_port_hidden_wait(struct mv88e6xxx_chip *chip)
40+
{
41+
int bit = __bf_shf(MV88E6XXX_PORT_RESERVED_1A_BUSY);
42+
43+
return mv88e6xxx_wait_bit(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
44+
MV88E6XXX_PORT_RESERVED_1A, bit, 0);
45+
}
46+
47+
int mv88e6xxx_port_hidden_read(struct mv88e6xxx_chip *chip, int block, int port,
48+
int reg, u16 *val)
49+
{
50+
u16 ctrl;
51+
int err;
52+
53+
ctrl = MV88E6XXX_PORT_RESERVED_1A_BUSY |
54+
MV88E6XXX_PORT_RESERVED_1A_READ |
55+
block << MV88E6XXX_PORT_RESERVED_1A_BLOCK_SHIFT |
56+
port << MV88E6XXX_PORT_RESERVED_1A_PORT_SHIFT |
57+
reg;
58+
59+
err = mv88e6xxx_port_write(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT,
60+
MV88E6XXX_PORT_RESERVED_1A, ctrl);
61+
if (err)
62+
return err;
63+
64+
err = mv88e6xxx_port_hidden_wait(chip);
65+
if (err)
66+
return err;
67+
68+
return mv88e6xxx_port_read(chip, MV88E6XXX_PORT_RESERVED_1A_DATA_PORT,
69+
MV88E6XXX_PORT_RESERVED_1A, val);
70+
}

0 commit comments

Comments
 (0)