Skip to content

Commit 7fa28bc

Browse files
author
Paolo Abeni
committed
Merge branch 'microchip-dsa-driver-improvements'
Oleksij Rempel says: ==================== Microchip DSA Driver Improvements changes v2: - set .max_register = U8_MAX, it should be more readable - clarify in the RMW error handling patch, logging behavior expectation. I'd like to share a set of patches for the Microchip DSA driver. These patches were chosen from a bigger set because they are simpler and should be easier to review. The goal is to make the code easier to read, get rid of unused code, and handle errors better. ==================== Link: https://lore.kernel.org/r/20230526073445.668430-1-o.rempel@pengutronix.de Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2 parents eee2e03 + d0dec33 commit 7fa28bc

8 files changed

Lines changed: 135 additions & 66 deletions

File tree

drivers/net/dsa/microchip/ksz8795.c

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@
2828

2929
static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
3030
{
31-
regmap_update_bits(dev->regmap[0], addr, bits, set ? bits : 0);
31+
regmap_update_bits(ksz_regmap_8(dev), addr, bits, set ? bits : 0);
3232
}
3333

3434
static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
3535
bool set)
3636
{
37-
regmap_update_bits(dev->regmap[0], PORT_CTRL_ADDR(port, offset),
37+
regmap_update_bits(ksz_regmap_8(dev), PORT_CTRL_ADDR(port, offset),
3838
bits, set ? bits : 0);
3939
}
4040

@@ -941,7 +941,6 @@ void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
941941
{
942942
u8 learn[DSA_MAX_PORTS];
943943
int first, index, cnt;
944-
struct ksz_port *p;
945944
const u16 *regs;
946945

947946
regs = dev->info->regs;
@@ -955,19 +954,13 @@ void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
955954
cnt = dev->info->port_cnt;
956955
}
957956
for (index = first; index < cnt; index++) {
958-
p = &dev->ports[index];
959-
if (!p->on)
960-
continue;
961957
ksz_pread8(dev, index, regs[P_STP_CTRL], &learn[index]);
962958
if (!(learn[index] & PORT_LEARN_DISABLE))
963959
ksz_pwrite8(dev, index, regs[P_STP_CTRL],
964960
learn[index] | PORT_LEARN_DISABLE);
965961
}
966962
ksz_cfg(dev, S_FLUSH_TABLE_CTRL, SW_FLUSH_DYN_MAC_TABLE, true);
967963
for (index = first; index < cnt; index++) {
968-
p = &dev->ports[index];
969-
if (!p->on)
970-
continue;
971964
if (!(learn[index] & PORT_LEARN_DISABLE))
972965
ksz_pwrite8(dev, index, regs[P_STP_CTRL], learn[index]);
973966
}
@@ -1338,25 +1331,14 @@ void ksz8_config_cpu_port(struct dsa_switch *ds)
13381331

13391332
ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true);
13401333

1341-
p = &dev->ports[dev->cpu_port];
1342-
p->on = 1;
1343-
13441334
ksz8_port_setup(dev, dev->cpu_port, true);
13451335

13461336
for (i = 0; i < dev->phy_port_cnt; i++) {
1347-
p = &dev->ports[i];
1348-
13491337
ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED);
1350-
1351-
/* Last port may be disabled. */
1352-
if (i == dev->phy_port_cnt)
1353-
break;
1354-
p->on = 1;
13551338
}
13561339
for (i = 0; i < dev->phy_port_cnt; i++) {
13571340
p = &dev->ports[i];
1358-
if (!p->on)
1359-
continue;
1341+
13601342
if (!ksz_is_ksz88x3(dev)) {
13611343
ksz_pread8(dev, i, regs[P_REMOTE_STATUS], &remote);
13621344
if (remote & KSZ8_PORT_FIBER_MODE)
@@ -1425,14 +1407,14 @@ int ksz8_setup(struct dsa_switch *ds)
14251407
ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true);
14261408

14271409
/* Enable aggressive back off algorithm in half duplex mode. */
1428-
regmap_update_bits(dev->regmap[0], REG_SW_CTRL_1,
1410+
regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_1,
14291411
SW_AGGR_BACKOFF, SW_AGGR_BACKOFF);
14301412

14311413
/*
14321414
* Make sure unicast VLAN boundary is set as default and
14331415
* enable no excessive collision drop.
14341416
*/
1435-
regmap_update_bits(dev->regmap[0], REG_SW_CTRL_2,
1417+
regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_2,
14361418
UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP,
14371419
UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP);
14381420

drivers/net/dsa/microchip/ksz8863_smi.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ static const struct regmap_config ksz8863_regmap_config[] = {
104104
.cache_type = REGCACHE_NONE,
105105
.lock = ksz_regmap_lock,
106106
.unlock = ksz_regmap_unlock,
107+
.max_register = U8_MAX,
107108
},
108109
{
109110
.name = "#16",
@@ -113,6 +114,7 @@ static const struct regmap_config ksz8863_regmap_config[] = {
113114
.cache_type = REGCACHE_NONE,
114115
.lock = ksz_regmap_lock,
115116
.unlock = ksz_regmap_unlock,
117+
.max_register = U8_MAX,
116118
},
117119
{
118120
.name = "#32",
@@ -122,11 +124,14 @@ static const struct regmap_config ksz8863_regmap_config[] = {
122124
.cache_type = REGCACHE_NONE,
123125
.lock = ksz_regmap_lock,
124126
.unlock = ksz_regmap_unlock,
127+
.max_register = U8_MAX,
125128
}
126129
};
127130

128131
static int ksz8863_smi_probe(struct mdio_device *mdiodev)
129132
{
133+
struct device *ddev = &mdiodev->dev;
134+
const struct ksz_chip_data *chip;
130135
struct regmap_config rc;
131136
struct ksz_device *dev;
132137
int ret;
@@ -136,9 +141,15 @@ static int ksz8863_smi_probe(struct mdio_device *mdiodev)
136141
if (!dev)
137142
return -ENOMEM;
138143

139-
for (i = 0; i < ARRAY_SIZE(ksz8863_regmap_config); i++) {
144+
chip = device_get_match_data(ddev);
145+
if (!chip)
146+
return -EINVAL;
147+
148+
for (i = 0; i < __KSZ_NUM_REGMAPS; i++) {
140149
rc = ksz8863_regmap_config[i];
141150
rc.lock_arg = &dev->regmap_mutex;
151+
rc.wr_table = chip->wr_table;
152+
rc.rd_table = chip->rd_table;
142153
dev->regmap[i] = devm_regmap_init(&mdiodev->dev,
143154
&regmap_smi[i], dev,
144155
&rc);

drivers/net/dsa/microchip/ksz9477.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,25 @@
2121

2222
static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
2323
{
24-
regmap_update_bits(dev->regmap[0], addr, bits, set ? bits : 0);
24+
regmap_update_bits(ksz_regmap_8(dev), addr, bits, set ? bits : 0);
2525
}
2626

2727
static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
2828
bool set)
2929
{
30-
regmap_update_bits(dev->regmap[0], PORT_CTRL_ADDR(port, offset),
30+
regmap_update_bits(ksz_regmap_8(dev), PORT_CTRL_ADDR(port, offset),
3131
bits, set ? bits : 0);
3232
}
3333

3434
static void ksz9477_cfg32(struct ksz_device *dev, u32 addr, u32 bits, bool set)
3535
{
36-
regmap_update_bits(dev->regmap[2], addr, bits, set ? bits : 0);
36+
regmap_update_bits(ksz_regmap_32(dev), addr, bits, set ? bits : 0);
3737
}
3838

3939
static void ksz9477_port_cfg32(struct ksz_device *dev, int port, int offset,
4040
u32 bits, bool set)
4141
{
42-
regmap_update_bits(dev->regmap[2], PORT_CTRL_ADDR(port, offset),
42+
regmap_update_bits(ksz_regmap_32(dev), PORT_CTRL_ADDR(port, offset),
4343
bits, set ? bits : 0);
4444
}
4545

@@ -52,15 +52,15 @@ int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu)
5252

5353
frame_size = mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
5454

55-
return regmap_update_bits(dev->regmap[1], REG_SW_MTU__2,
55+
return regmap_update_bits(ksz_regmap_16(dev), REG_SW_MTU__2,
5656
REG_SW_MTU_MASK, frame_size);
5757
}
5858

5959
static int ksz9477_wait_vlan_ctrl_ready(struct ksz_device *dev)
6060
{
6161
unsigned int val;
6262

63-
return regmap_read_poll_timeout(dev->regmap[0], REG_SW_VLAN_CTRL,
63+
return regmap_read_poll_timeout(ksz_regmap_8(dev), REG_SW_VLAN_CTRL,
6464
val, !(val & VLAN_START), 10, 1000);
6565
}
6666

@@ -147,15 +147,15 @@ static int ksz9477_wait_alu_ready(struct ksz_device *dev)
147147
{
148148
unsigned int val;
149149

150-
return regmap_read_poll_timeout(dev->regmap[2], REG_SW_ALU_CTRL__4,
150+
return regmap_read_poll_timeout(ksz_regmap_32(dev), REG_SW_ALU_CTRL__4,
151151
val, !(val & ALU_START), 10, 1000);
152152
}
153153

154154
static int ksz9477_wait_alu_sta_ready(struct ksz_device *dev)
155155
{
156156
unsigned int val;
157157

158-
return regmap_read_poll_timeout(dev->regmap[2],
158+
return regmap_read_poll_timeout(ksz_regmap_32(dev),
159159
REG_SW_ALU_STAT_CTRL__4,
160160
val, !(val & ALU_STAT_START),
161161
10, 1000);
@@ -170,7 +170,7 @@ int ksz9477_reset_switch(struct ksz_device *dev)
170170
ksz_cfg(dev, REG_SW_OPERATION, SW_RESET, true);
171171

172172
/* turn off SPI DO Edge select */
173-
regmap_update_bits(dev->regmap[0], REG_SW_GLOBAL_SERIAL_CTRL_0,
173+
regmap_update_bits(ksz_regmap_8(dev), REG_SW_GLOBAL_SERIAL_CTRL_0,
174174
SPI_AUTO_EDGE_DETECTION, 0);
175175

176176
/* default configuration */
@@ -213,7 +213,7 @@ void ksz9477_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt)
213213
data |= (addr << MIB_COUNTER_INDEX_S);
214214
ksz_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, data);
215215

216-
ret = regmap_read_poll_timeout(dev->regmap[2],
216+
ret = regmap_read_poll_timeout(ksz_regmap_32(dev),
217217
PORT_CTRL_ADDR(port, REG_PORT_MIB_CTRL_STAT__4),
218218
val, !(val & MIB_COUNTER_READ), 10, 1000);
219219
/* failed to read MIB. get out of loop */
@@ -346,7 +346,7 @@ void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port)
346346
const u16 *regs = dev->info->regs;
347347
u8 data;
348348

349-
regmap_update_bits(dev->regmap[0], REG_SW_LUE_CTRL_2,
349+
regmap_update_bits(ksz_regmap_8(dev), REG_SW_LUE_CTRL_2,
350350
SW_FLUSH_OPTION_M << SW_FLUSH_OPTION_S,
351351
SW_FLUSH_OPTION_DYN_MAC << SW_FLUSH_OPTION_S);
352352

@@ -1165,7 +1165,7 @@ int ksz9477_setup(struct dsa_switch *ds)
11651165
ksz_cfg(dev, REG_SW_MAC_CTRL_1, SW_JUMBO_PACKET, true);
11661166

11671167
/* Now we can configure default MTU value */
1168-
ret = regmap_update_bits(dev->regmap[1], REG_SW_MTU__2, REG_SW_MTU_MASK,
1168+
ret = regmap_update_bits(ksz_regmap_16(dev), REG_SW_MTU__2, REG_SW_MTU_MASK,
11691169
VLAN_ETH_FRAME_LEN + ETH_FCS_LEN);
11701170
if (ret)
11711171
return ret;

drivers/net/dsa/microchip/ksz9477_i2c.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static int ksz9477_i2c_probe(struct i2c_client *i2c)
2424
if (!dev)
2525
return -ENOMEM;
2626

27-
for (i = 0; i < ARRAY_SIZE(ksz9477_regmap_config); i++) {
27+
for (i = 0; i < __KSZ_NUM_REGMAPS; i++) {
2828
rc = ksz9477_regmap_config[i];
2929
rc.lock_arg = &dev->regmap_mutex;
3030
dev->regmap[i] = devm_regmap_init_i2c(i2c, &rc);

drivers/net/dsa/microchip/ksz_common.c

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,45 @@ static const struct regmap_access_table ksz9896_register_set = {
10751075
.n_yes_ranges = ARRAY_SIZE(ksz9896_valid_regs),
10761076
};
10771077

1078+
static const struct regmap_range ksz8873_valid_regs[] = {
1079+
regmap_reg_range(0x00, 0x01),
1080+
/* global control register */
1081+
regmap_reg_range(0x02, 0x0f),
1082+
1083+
/* port registers */
1084+
regmap_reg_range(0x10, 0x1d),
1085+
regmap_reg_range(0x1e, 0x1f),
1086+
regmap_reg_range(0x20, 0x2d),
1087+
regmap_reg_range(0x2e, 0x2f),
1088+
regmap_reg_range(0x30, 0x39),
1089+
regmap_reg_range(0x3f, 0x3f),
1090+
1091+
/* advanced control registers */
1092+
regmap_reg_range(0x60, 0x6f),
1093+
regmap_reg_range(0x70, 0x75),
1094+
regmap_reg_range(0x76, 0x78),
1095+
regmap_reg_range(0x79, 0x7a),
1096+
regmap_reg_range(0x7b, 0x83),
1097+
regmap_reg_range(0x8e, 0x99),
1098+
regmap_reg_range(0x9a, 0xa5),
1099+
regmap_reg_range(0xa6, 0xa6),
1100+
regmap_reg_range(0xa7, 0xaa),
1101+
regmap_reg_range(0xab, 0xae),
1102+
regmap_reg_range(0xaf, 0xba),
1103+
regmap_reg_range(0xbb, 0xbc),
1104+
regmap_reg_range(0xbd, 0xbd),
1105+
regmap_reg_range(0xc0, 0xc0),
1106+
regmap_reg_range(0xc2, 0xc2),
1107+
regmap_reg_range(0xc3, 0xc3),
1108+
regmap_reg_range(0xc4, 0xc4),
1109+
regmap_reg_range(0xc6, 0xc6),
1110+
};
1111+
1112+
static const struct regmap_access_table ksz8873_register_set = {
1113+
.yes_ranges = ksz8873_valid_regs,
1114+
.n_yes_ranges = ARRAY_SIZE(ksz8873_valid_regs),
1115+
};
1116+
10781117
const struct ksz_chip_data ksz_switch_chips[] = {
10791118
[KSZ8563] = {
10801119
.chip_id = KSZ8563_CHIP_ID,
@@ -1214,6 +1253,8 @@ const struct ksz_chip_data ksz_switch_chips[] = {
12141253
.supports_mii = {false, false, true},
12151254
.supports_rmii = {false, false, true},
12161255
.internal_phy = {true, true, false},
1256+
.wr_table = &ksz8873_register_set,
1257+
.rd_table = &ksz8873_register_set,
12171258
},
12181259

12191260
[KSZ9477] = {
@@ -2095,7 +2136,7 @@ static int ksz_setup(struct dsa_switch *ds)
20952136
}
20962137

20972138
/* set broadcast storm protection 10% rate */
2098-
regmap_update_bits(dev->regmap[1], regs[S_BROADCAST_CTRL],
2139+
regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL],
20992140
BROADCAST_STORM_RATE,
21002141
(BROADCAST_STORM_VALUE *
21012142
BROADCAST_STORM_PROT_RATE) / 100);
@@ -2106,7 +2147,7 @@ static int ksz_setup(struct dsa_switch *ds)
21062147

21072148
ds->num_tx_queues = dev->info->num_tx_queues;
21082149

2109-
regmap_update_bits(dev->regmap[0], regs[S_MULTICAST_CTRL],
2150+
regmap_update_bits(ksz_regmap_8(dev), regs[S_MULTICAST_CTRL],
21102151
MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE);
21112152

21122153
ksz_init_mib_timer(dev);
@@ -2156,7 +2197,7 @@ static int ksz_setup(struct dsa_switch *ds)
21562197
}
21572198

21582199
/* start switch */
2159-
regmap_update_bits(dev->regmap[0], regs[S_START_CTRL],
2200+
regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL],
21602201
SW_START, SW_START);
21612202

21622203
return 0;

0 commit comments

Comments
 (0)