Skip to content

Commit b3bc534

Browse files
committed
Merge branch 'net-dsa-microchip-add-ksz8895-ksz8864-switch-support'
Tristram Ha says: ==================== net: dsa: microchip: Add KSZ8895/KSZ8864 switch support This series of patches is to add KSZ8895/KSZ8864 switch support to the KSZ DSA driver. ==================== Link: https://patch.msgid.link/BYAPR11MB3558B8A089C88DFFFC09B067EC8B2@BYAPR11MB3558.namprd11.prod.outlook.com Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 85d4cf5 + a96c551 commit b3bc534

File tree

7 files changed

+180
-16
lines changed

7 files changed

+180
-16
lines changed

Documentation/devicetree/bindings/net/dsa/microchip,ksz.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ properties:
2222
- microchip,ksz8794
2323
- microchip,ksz8795
2424
- microchip,ksz8863
25+
- microchip,ksz8864 # 4-port version of KSZ8895 family switch
2526
- microchip,ksz8873
27+
- microchip,ksz8895 # 5-port version of KSZ8895 family switch
2628
- microchip,ksz9477
2729
- microchip,ksz9897
2830
- microchip,ksz9896

drivers/net/dsa/microchip/ksz8795.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ int ksz8_change_mtu(struct ksz_device *dev, int port, int mtu)
188188
case KSZ8765_CHIP_ID:
189189
return ksz8795_change_mtu(dev, frame_size);
190190
case KSZ8830_CHIP_ID:
191+
case KSZ8864_CHIP_ID:
192+
case KSZ8895_CHIP_ID:
191193
return ksz8863_change_mtu(dev, frame_size);
192194
}
193195

@@ -384,15 +386,15 @@ static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
384386
void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
385387
u64 *dropped, u64 *cnt)
386388
{
387-
if (ksz_is_ksz88x3(dev))
389+
if (is_ksz88xx(dev))
388390
ksz8863_r_mib_pkt(dev, port, addr, dropped, cnt);
389391
else
390392
ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt);
391393
}
392394

393395
void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze)
394396
{
395-
if (ksz_is_ksz88x3(dev))
397+
if (is_ksz88xx(dev))
396398
return;
397399

398400
/* enable the port for flush/freeze function */
@@ -410,7 +412,8 @@ void ksz8_port_init_cnt(struct ksz_device *dev, int port)
410412
struct ksz_port_mib *mib = &dev->ports[port].mib;
411413
u64 *dropped;
412414

413-
if (!ksz_is_ksz88x3(dev)) {
415+
/* For KSZ8795 family. */
416+
if (ksz_is_ksz87xx(dev)) {
414417
/* flush all enabled port MIB counters */
415418
ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true);
416419
ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FLUSH, true);
@@ -609,11 +612,11 @@ static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
609612
shifts[STATIC_MAC_FWD_PORTS];
610613
alu->is_override = (data_hi & masks[STATIC_MAC_TABLE_OVERRIDE]) ? 1 : 0;
611614

612-
/* KSZ8795 family switches have STATIC_MAC_TABLE_USE_FID and
615+
/* KSZ8795/KSZ8895 family switches have STATIC_MAC_TABLE_USE_FID and
613616
* STATIC_MAC_TABLE_FID definitions off by 1 when doing read on the
614617
* static MAC table compared to doing write.
615618
*/
616-
if (ksz_is_ksz87xx(dev))
619+
if (ksz_is_ksz87xx(dev) || ksz_is_8895_family(dev))
617620
data_hi >>= 1;
618621
alu->is_static = true;
619622
alu->is_use_fid = (data_hi & masks[STATIC_MAC_TABLE_USE_FID]) ? 1 : 0;
@@ -1692,7 +1695,8 @@ void ksz8_config_cpu_port(struct dsa_switch *ds)
16921695
for (i = 0; i < dev->phy_port_cnt; i++) {
16931696
p = &dev->ports[i];
16941697

1695-
if (!ksz_is_ksz88x3(dev)) {
1698+
/* For KSZ8795 family. */
1699+
if (ksz_is_ksz87xx(dev)) {
16961700
ksz_pread8(dev, i, regs[P_REMOTE_STATUS], &remote);
16971701
if (remote & KSZ8_PORT_FIBER_MODE)
16981702
p->fiber = 1;

drivers/net/dsa/microchip/ksz_common.c

Lines changed: 128 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/*
33
* Microchip switch driver main logic
44
*
5-
* Copyright (C) 2017-2019 Microchip Technology Inc.
5+
* Copyright (C) 2017-2024 Microchip Technology Inc.
66
*/
77

88
#include <linux/delay.h>
@@ -277,7 +277,7 @@ static const struct phylink_mac_ops ksz8_phylink_mac_ops = {
277277
.mac_link_up = ksz8_phylink_mac_link_up,
278278
};
279279

280-
static const struct ksz_dev_ops ksz88x3_dev_ops = {
280+
static const struct ksz_dev_ops ksz88xx_dev_ops = {
281281
.setup = ksz8_setup,
282282
.get_port_addr = ksz8_get_port_addr,
283283
.cfg_port_member = ksz8_cfg_port_member,
@@ -572,6 +572,61 @@ static u8 ksz8863_shifts[] = {
572572
[DYNAMIC_MAC_SRC_PORT] = 20,
573573
};
574574

575+
static const u16 ksz8895_regs[] = {
576+
[REG_SW_MAC_ADDR] = 0x68,
577+
[REG_IND_CTRL_0] = 0x6E,
578+
[REG_IND_DATA_8] = 0x70,
579+
[REG_IND_DATA_CHECK] = 0x72,
580+
[REG_IND_DATA_HI] = 0x71,
581+
[REG_IND_DATA_LO] = 0x75,
582+
[REG_IND_MIB_CHECK] = 0x75,
583+
[P_FORCE_CTRL] = 0x0C,
584+
[P_LINK_STATUS] = 0x0E,
585+
[P_LOCAL_CTRL] = 0x0C,
586+
[P_NEG_RESTART_CTRL] = 0x0D,
587+
[P_REMOTE_STATUS] = 0x0E,
588+
[P_SPEED_STATUS] = 0x09,
589+
[S_TAIL_TAG_CTRL] = 0x0C,
590+
[P_STP_CTRL] = 0x02,
591+
[S_START_CTRL] = 0x01,
592+
[S_BROADCAST_CTRL] = 0x06,
593+
[S_MULTICAST_CTRL] = 0x04,
594+
};
595+
596+
static const u32 ksz8895_masks[] = {
597+
[PORT_802_1P_REMAPPING] = BIT(7),
598+
[SW_TAIL_TAG_ENABLE] = BIT(1),
599+
[MIB_COUNTER_OVERFLOW] = BIT(7),
600+
[MIB_COUNTER_VALID] = BIT(6),
601+
[VLAN_TABLE_FID] = GENMASK(6, 0),
602+
[VLAN_TABLE_MEMBERSHIP] = GENMASK(11, 7),
603+
[VLAN_TABLE_VALID] = BIT(12),
604+
[STATIC_MAC_TABLE_VALID] = BIT(21),
605+
[STATIC_MAC_TABLE_USE_FID] = BIT(23),
606+
[STATIC_MAC_TABLE_FID] = GENMASK(30, 24),
607+
[STATIC_MAC_TABLE_OVERRIDE] = BIT(22),
608+
[STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(20, 16),
609+
[DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(6, 0),
610+
[DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(7),
611+
[DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
612+
[DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 29),
613+
[DYNAMIC_MAC_TABLE_FID] = GENMASK(22, 16),
614+
[DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(26, 24),
615+
[DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(28, 27),
616+
};
617+
618+
static const u8 ksz8895_shifts[] = {
619+
[VLAN_TABLE_MEMBERSHIP_S] = 7,
620+
[VLAN_TABLE] = 13,
621+
[STATIC_MAC_FWD_PORTS] = 16,
622+
[STATIC_MAC_FID] = 24,
623+
[DYNAMIC_MAC_ENTRIES_H] = 3,
624+
[DYNAMIC_MAC_ENTRIES] = 29,
625+
[DYNAMIC_MAC_FID] = 16,
626+
[DYNAMIC_MAC_TIMESTAMP] = 27,
627+
[DYNAMIC_MAC_SRC_PORT] = 24,
628+
};
629+
575630
static const u16 ksz9477_regs[] = {
576631
[REG_SW_MAC_ADDR] = 0x0302,
577632
[P_STP_CTRL] = 0x0B04,
@@ -1397,7 +1452,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
13971452
.port_cnt = 3,
13981453
.num_tx_queues = 4,
13991454
.num_ipms = 4,
1400-
.ops = &ksz88x3_dev_ops,
1455+
.ops = &ksz88xx_dev_ops,
14011456
.phylink_mac_ops = &ksz8830_phylink_mac_ops,
14021457
.mib_names = ksz88xx_mib_names,
14031458
.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
@@ -1412,6 +1467,61 @@ const struct ksz_chip_data ksz_switch_chips[] = {
14121467
.rd_table = &ksz8873_register_set,
14131468
},
14141469

1470+
[KSZ8864] = {
1471+
/* WARNING
1472+
* =======
1473+
* KSZ8864 is similar to KSZ8895, except the first port
1474+
* does not exist.
1475+
* external cpu
1476+
* KSZ8864 1,2,3 4
1477+
* KSZ8895 0,1,2,3 4
1478+
* port_cnt is configured as 5, even though it is 4
1479+
*/
1480+
.chip_id = KSZ8864_CHIP_ID,
1481+
.dev_name = "KSZ8864",
1482+
.num_vlans = 4096,
1483+
.num_alus = 0,
1484+
.num_statics = 32,
1485+
.cpu_ports = 0x10, /* can be configured as cpu port */
1486+
.port_cnt = 5, /* total cpu and user ports */
1487+
.num_tx_queues = 4,
1488+
.num_ipms = 4,
1489+
.ops = &ksz88xx_dev_ops,
1490+
.phylink_mac_ops = &ksz8830_phylink_mac_ops,
1491+
.mib_names = ksz88xx_mib_names,
1492+
.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
1493+
.reg_mib_cnt = MIB_COUNTER_NUM,
1494+
.regs = ksz8895_regs,
1495+
.masks = ksz8895_masks,
1496+
.shifts = ksz8895_shifts,
1497+
.supports_mii = {false, false, false, false, true},
1498+
.supports_rmii = {false, false, false, false, true},
1499+
.internal_phy = {false, true, true, true, false},
1500+
},
1501+
1502+
[KSZ8895] = {
1503+
.chip_id = KSZ8895_CHIP_ID,
1504+
.dev_name = "KSZ8895",
1505+
.num_vlans = 4096,
1506+
.num_alus = 0,
1507+
.num_statics = 32,
1508+
.cpu_ports = 0x10, /* can be configured as cpu port */
1509+
.port_cnt = 5, /* total cpu and user ports */
1510+
.num_tx_queues = 4,
1511+
.num_ipms = 4,
1512+
.ops = &ksz88xx_dev_ops,
1513+
.phylink_mac_ops = &ksz8830_phylink_mac_ops,
1514+
.mib_names = ksz88xx_mib_names,
1515+
.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
1516+
.reg_mib_cnt = MIB_COUNTER_NUM,
1517+
.regs = ksz8895_regs,
1518+
.masks = ksz8895_masks,
1519+
.shifts = ksz8895_shifts,
1520+
.supports_mii = {false, false, false, false, true},
1521+
.supports_rmii = {false, false, false, false, true},
1522+
.internal_phy = {true, true, true, true, false},
1523+
},
1524+
14151525
[KSZ9477] = {
14161526
.chip_id = KSZ9477_CHIP_ID,
14171527
.dev_name = "KSZ9477",
@@ -2937,9 +3047,7 @@ static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
29373047
struct ksz_device *dev = ds->priv;
29383048
enum dsa_tag_protocol proto = DSA_TAG_PROTO_NONE;
29393049

2940-
if (dev->chip_id == KSZ8795_CHIP_ID ||
2941-
dev->chip_id == KSZ8794_CHIP_ID ||
2942-
dev->chip_id == KSZ8765_CHIP_ID)
3050+
if (ksz_is_ksz87xx(dev) || ksz_is_8895_family(dev))
29433051
proto = DSA_TAG_PROTO_KSZ8795;
29443052

29453053
if (dev->chip_id == KSZ8830_CHIP_ID ||
@@ -3055,6 +3163,8 @@ static int ksz_max_mtu(struct dsa_switch *ds, int port)
30553163
case KSZ8765_CHIP_ID:
30563164
return KSZ8795_HUGE_PACKET_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN;
30573165
case KSZ8830_CHIP_ID:
3166+
case KSZ8864_CHIP_ID:
3167+
case KSZ8895_CHIP_ID:
30583168
return KSZ8863_HUGE_PACKET_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN;
30593169
case KSZ8563_CHIP_ID:
30603170
case KSZ8567_CHIP_ID:
@@ -3412,6 +3522,18 @@ static int ksz_switch_detect(struct ksz_device *dev)
34123522
else
34133523
return -ENODEV;
34143524
break;
3525+
case KSZ8895_FAMILY_ID:
3526+
if (id2 == KSZ8895_CHIP_ID_95 ||
3527+
id2 == KSZ8895_CHIP_ID_95R)
3528+
dev->chip_id = KSZ8895_CHIP_ID;
3529+
else
3530+
return -ENODEV;
3531+
ret = ksz_read8(dev, REG_KSZ8864_CHIP_ID, &id4);
3532+
if (ret)
3533+
return ret;
3534+
if (id4 & SW_KSZ8864)
3535+
dev->chip_id = KSZ8864_CHIP_ID;
3536+
break;
34153537
default:
34163538
ret = ksz_read32(dev, REG_CHIP_ID0, &id32);
34173539
if (ret)

drivers/net/dsa/microchip/ksz_common.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* SPDX-License-Identifier: GPL-2.0 */
22
/* Microchip switch driver common header
33
*
4-
* Copyright (C) 2017-2019 Microchip Technology Inc.
4+
* Copyright (C) 2017-2024 Microchip Technology Inc.
55
*/
66

77
#ifndef __KSZ_COMMON_H
@@ -201,6 +201,8 @@ enum ksz_model {
201201
KSZ8794,
202202
KSZ8765,
203203
KSZ8830,
204+
KSZ8864,
205+
KSZ8895,
204206
KSZ9477,
205207
KSZ9896,
206208
KSZ9897,
@@ -629,9 +631,21 @@ static inline bool ksz_is_ksz88x3(struct ksz_device *dev)
629631
return dev->chip_id == KSZ8830_CHIP_ID;
630632
}
631633

634+
static inline bool ksz_is_8895_family(struct ksz_device *dev)
635+
{
636+
return dev->chip_id == KSZ8895_CHIP_ID ||
637+
dev->chip_id == KSZ8864_CHIP_ID;
638+
}
639+
632640
static inline bool is_ksz8(struct ksz_device *dev)
633641
{
634-
return ksz_is_ksz87xx(dev) || ksz_is_ksz88x3(dev);
642+
return ksz_is_ksz87xx(dev) || ksz_is_ksz88x3(dev) ||
643+
ksz_is_8895_family(dev);
644+
}
645+
646+
static inline bool is_ksz88xx(struct ksz_device *dev)
647+
{
648+
return ksz_is_ksz88x3(dev) || ksz_is_8895_family(dev);
635649
}
636650

637651
static inline bool is_ksz9477(struct ksz_device *dev)
@@ -665,6 +679,7 @@ static inline bool is_lan937x_tx_phy(struct ksz_device *dev, int port)
665679
#define SW_FAMILY_ID_M GENMASK(15, 8)
666680
#define KSZ87_FAMILY_ID 0x87
667681
#define KSZ88_FAMILY_ID 0x88
682+
#define KSZ8895_FAMILY_ID 0x95
668683

669684
#define KSZ8_PORT_STATUS_0 0x08
670685
#define KSZ8_PORT_FIBER_MODE BIT(7)
@@ -673,6 +688,12 @@ static inline bool is_lan937x_tx_phy(struct ksz_device *dev, int port)
673688
#define KSZ87_CHIP_ID_94 0x6
674689
#define KSZ87_CHIP_ID_95 0x9
675690
#define KSZ88_CHIP_ID_63 0x3
691+
#define KSZ8895_CHIP_ID_95 0x4
692+
#define KSZ8895_CHIP_ID_95R 0x6
693+
694+
/* KSZ8895 specific register */
695+
#define REG_KSZ8864_CHIP_ID 0xFE
696+
#define SW_KSZ8864 BIT(7)
676697

677698
#define SW_REV_ID_M GENMASK(7, 4)
678699

drivers/net/dsa/microchip/ksz_dcb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static void ksz_get_default_port_prio_reg(struct ksz_device *dev, int *reg,
113113
static void ksz_get_dscp_prio_reg(struct ksz_device *dev, int *reg,
114114
int *per_reg, u8 *mask)
115115
{
116-
if (ksz_is_ksz87xx(dev)) {
116+
if (ksz_is_ksz87xx(dev) || ksz_is_8895_family(dev)) {
117117
*reg = KSZ8765_REG_TOS_DSCP_CTRL;
118118
*per_reg = 4;
119119
*mask = GENMASK(1, 0);

drivers/net/dsa/microchip/ksz_spi.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/*
33
* Microchip ksz series register access through SPI
44
*
5-
* Copyright (C) 2017 Microchip Technology Inc.
5+
* Copyright (C) 2017-2024 Microchip Technology Inc.
66
* Tristram Ha <[email protected]>
77
*/
88

@@ -60,6 +60,9 @@ static int ksz_spi_probe(struct spi_device *spi)
6060
chip->chip_id == KSZ8794_CHIP_ID ||
6161
chip->chip_id == KSZ8765_CHIP_ID)
6262
regmap_config = ksz8795_regmap_config;
63+
else if (chip->chip_id == KSZ8895_CHIP_ID ||
64+
chip->chip_id == KSZ8864_CHIP_ID)
65+
regmap_config = ksz8863_regmap_config;
6366
else
6467
regmap_config = ksz9477_regmap_config;
6568

@@ -136,10 +139,18 @@ static const struct of_device_id ksz_dt_ids[] = {
136139
.compatible = "microchip,ksz8863",
137140
.data = &ksz_switch_chips[KSZ8830]
138141
},
142+
{
143+
.compatible = "microchip,ksz8864",
144+
.data = &ksz_switch_chips[KSZ8864]
145+
},
139146
{
140147
.compatible = "microchip,ksz8873",
141148
.data = &ksz_switch_chips[KSZ8830]
142149
},
150+
{
151+
.compatible = "microchip,ksz8895",
152+
.data = &ksz_switch_chips[KSZ8895]
153+
},
143154
{
144155
.compatible = "microchip,ksz9477",
145156
.data = &ksz_switch_chips[KSZ9477]
@@ -201,7 +212,9 @@ static const struct spi_device_id ksz_spi_ids[] = {
201212
{ "ksz8794" },
202213
{ "ksz8795" },
203214
{ "ksz8863" },
215+
{ "ksz8864" },
204216
{ "ksz8873" },
217+
{ "ksz8895" },
205218
{ "ksz9477" },
206219
{ "ksz9896" },
207220
{ "ksz9897" },

include/linux/platform_data/microchip-ksz.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ enum ksz_chip_id {
2828
KSZ8794_CHIP_ID = 0x8794,
2929
KSZ8765_CHIP_ID = 0x8765,
3030
KSZ8830_CHIP_ID = 0x8830,
31+
KSZ8864_CHIP_ID = 0x8864,
32+
KSZ8895_CHIP_ID = 0x8895,
3133
KSZ9477_CHIP_ID = 0x00947700,
3234
KSZ9896_CHIP_ID = 0x00989600,
3335
KSZ9897_CHIP_ID = 0x00989700,

0 commit comments

Comments
 (0)