1 // SPDX-License-Identifier: GPL-2.0
3 * Microchip KSZ8795 switch driver
5 * Copyright (C) 2017 Microchip Technology Inc.
9 #include <linux/delay.h>
10 #include <linux/export.h>
11 #include <linux/gpio.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/platform_data/microchip-ksz.h>
15 #include <linux/phy.h>
16 #include <linux/etherdevice.h>
17 #include <linux/if_bridge.h>
19 #include <net/switchdev.h>
21 #include "ksz_common.h"
22 #include "ksz8795_reg.h"
25 static const u8 ksz8795_regs[] = {
26 [REG_IND_CTRL_0] = 0x6E,
27 [REG_IND_DATA_8] = 0x70,
28 [REG_IND_DATA_CHECK] = 0x72,
29 [REG_IND_DATA_HI] = 0x71,
30 [REG_IND_DATA_LO] = 0x75,
31 [REG_IND_MIB_CHECK] = 0x74,
32 [P_FORCE_CTRL] = 0x0C,
33 [P_LINK_STATUS] = 0x0E,
34 [P_LOCAL_CTRL] = 0x07,
35 [P_NEG_RESTART_CTRL] = 0x0D,
36 [P_REMOTE_STATUS] = 0x08,
37 [P_SPEED_STATUS] = 0x09,
38 [S_TAIL_TAG_CTRL] = 0x0C,
41 static const u32 ksz8795_masks[] = {
42 [PORT_802_1P_REMAPPING] = BIT(7),
43 [SW_TAIL_TAG_ENABLE] = BIT(1),
44 [MIB_COUNTER_OVERFLOW] = BIT(6),
45 [MIB_COUNTER_VALID] = BIT(5),
46 [VLAN_TABLE_FID] = GENMASK(6, 0),
47 [VLAN_TABLE_MEMBERSHIP] = GENMASK(11, 7),
48 [VLAN_TABLE_VALID] = BIT(12),
49 [STATIC_MAC_TABLE_VALID] = BIT(21),
50 [STATIC_MAC_TABLE_USE_FID] = BIT(23),
51 [STATIC_MAC_TABLE_FID] = GENMASK(30, 24),
52 [STATIC_MAC_TABLE_OVERRIDE] = BIT(26),
53 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(24, 20),
54 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(6, 0),
55 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(8),
56 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
57 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 29),
58 [DYNAMIC_MAC_TABLE_FID] = GENMASK(26, 20),
59 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(26, 24),
60 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(28, 27),
63 static const u8 ksz8795_shifts[] = {
64 [VLAN_TABLE_MEMBERSHIP_S] = 7,
66 [STATIC_MAC_FWD_PORTS] = 16,
67 [STATIC_MAC_FID] = 24,
68 [DYNAMIC_MAC_ENTRIES_H] = 3,
69 [DYNAMIC_MAC_ENTRIES] = 29,
70 [DYNAMIC_MAC_FID] = 16,
71 [DYNAMIC_MAC_TIMESTAMP] = 27,
72 [DYNAMIC_MAC_SRC_PORT] = 24,
75 static const u8 ksz8863_regs[] = {
76 [REG_IND_CTRL_0] = 0x79,
77 [REG_IND_DATA_8] = 0x7B,
78 [REG_IND_DATA_CHECK] = 0x7B,
79 [REG_IND_DATA_HI] = 0x7C,
80 [REG_IND_DATA_LO] = 0x80,
81 [REG_IND_MIB_CHECK] = 0x80,
82 [P_FORCE_CTRL] = 0x0C,
83 [P_LINK_STATUS] = 0x0E,
84 [P_LOCAL_CTRL] = 0x0C,
85 [P_NEG_RESTART_CTRL] = 0x0D,
86 [P_REMOTE_STATUS] = 0x0E,
87 [P_SPEED_STATUS] = 0x0F,
88 [S_TAIL_TAG_CTRL] = 0x03,
91 static const u32 ksz8863_masks[] = {
92 [PORT_802_1P_REMAPPING] = BIT(3),
93 [SW_TAIL_TAG_ENABLE] = BIT(6),
94 [MIB_COUNTER_OVERFLOW] = BIT(7),
95 [MIB_COUNTER_VALID] = BIT(6),
96 [VLAN_TABLE_FID] = GENMASK(15, 12),
97 [VLAN_TABLE_MEMBERSHIP] = GENMASK(18, 16),
98 [VLAN_TABLE_VALID] = BIT(19),
99 [STATIC_MAC_TABLE_VALID] = BIT(19),
100 [STATIC_MAC_TABLE_USE_FID] = BIT(21),
101 [STATIC_MAC_TABLE_FID] = GENMASK(29, 26),
102 [STATIC_MAC_TABLE_OVERRIDE] = BIT(20),
103 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(18, 16),
104 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(5, 0),
105 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(7),
106 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
107 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 28),
108 [DYNAMIC_MAC_TABLE_FID] = GENMASK(19, 16),
109 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(21, 20),
110 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(23, 22),
113 static u8 ksz8863_shifts[] = {
114 [VLAN_TABLE_MEMBERSHIP_S] = 16,
115 [STATIC_MAC_FWD_PORTS] = 16,
116 [STATIC_MAC_FID] = 22,
117 [DYNAMIC_MAC_ENTRIES_H] = 3,
118 [DYNAMIC_MAC_ENTRIES] = 24,
119 [DYNAMIC_MAC_FID] = 16,
120 [DYNAMIC_MAC_TIMESTAMP] = 24,
121 [DYNAMIC_MAC_SRC_PORT] = 20,
125 char string[ETH_GSTRING_LEN];
128 static const struct mib_names ksz87xx_mib_names[] = {
167 static const struct mib_names ksz88xx_mib_names[] = {
204 static bool ksz_is_ksz88x3(struct ksz_device *dev)
206 return dev->chip_id == 0x8830;
209 static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
211 regmap_update_bits(dev->regmap[0], addr, bits, set ? bits : 0);
214 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
217 regmap_update_bits(dev->regmap[0], PORT_CTRL_ADDR(port, offset),
218 bits, set ? bits : 0);
221 static int ksz8_reset_switch(struct ksz_device *dev)
223 if (ksz_is_ksz88x3(dev)) {
225 ksz_cfg(dev, KSZ8863_REG_SW_RESET,
226 KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, true);
227 ksz_cfg(dev, KSZ8863_REG_SW_RESET,
228 KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, false);
231 ksz_write8(dev, REG_POWER_MANAGEMENT_1,
232 SW_SOFTWARE_POWER_DOWN << SW_POWER_MANAGEMENT_MODE_S);
233 ksz_write8(dev, REG_POWER_MANAGEMENT_1, 0);
239 static void ksz8795_set_prio_queue(struct ksz_device *dev, int port, int queue)
243 /* Number of queues can only be 1, 2, or 4. */
247 queue = PORT_QUEUE_SPLIT_4;
250 queue = PORT_QUEUE_SPLIT_2;
253 queue = PORT_QUEUE_SPLIT_1;
255 ksz_pread8(dev, port, REG_PORT_CTRL_0, &lo);
256 ksz_pread8(dev, port, P_DROP_TAG_CTRL, &hi);
257 lo &= ~PORT_QUEUE_SPLIT_L;
258 if (queue & PORT_QUEUE_SPLIT_2)
259 lo |= PORT_QUEUE_SPLIT_L;
260 hi &= ~PORT_QUEUE_SPLIT_H;
261 if (queue & PORT_QUEUE_SPLIT_4)
262 hi |= PORT_QUEUE_SPLIT_H;
263 ksz_pwrite8(dev, port, REG_PORT_CTRL_0, lo);
264 ksz_pwrite8(dev, port, P_DROP_TAG_CTRL, hi);
266 /* Default is port based for egress rate limit. */
267 if (queue != PORT_QUEUE_SPLIT_1)
268 ksz_cfg(dev, REG_SW_CTRL_19, SW_OUT_RATE_LIMIT_QUEUE_BASED,
272 static void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt)
274 struct ksz8 *ksz8 = dev->priv;
285 ctrl_addr = addr + dev->reg_mib_cnt * port;
286 ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
288 mutex_lock(&dev->alu_mutex);
289 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
291 /* It is almost guaranteed to always read the valid bit because of
294 for (loop = 2; loop > 0; loop--) {
295 ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check);
297 if (check & masks[MIB_COUNTER_VALID]) {
298 ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
299 if (check & masks[MIB_COUNTER_OVERFLOW])
300 *cnt += MIB_COUNTER_VALUE + 1;
301 *cnt += data & MIB_COUNTER_VALUE;
305 mutex_unlock(&dev->alu_mutex);
308 static void ksz8795_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
309 u64 *dropped, u64 *cnt)
311 struct ksz8 *ksz8 = dev->priv;
322 addr -= dev->reg_mib_cnt;
323 ctrl_addr = (KSZ8795_MIB_TOTAL_RX_1 - KSZ8795_MIB_TOTAL_RX_0) * port;
324 ctrl_addr += addr + KSZ8795_MIB_TOTAL_RX_0;
325 ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
327 mutex_lock(&dev->alu_mutex);
328 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
330 /* It is almost guaranteed to always read the valid bit because of
333 for (loop = 2; loop > 0; loop--) {
334 ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check);
336 if (check & masks[MIB_COUNTER_VALID]) {
337 ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
341 total = check & MIB_TOTAL_BYTES_H;
345 if (check & masks[MIB_COUNTER_OVERFLOW]) {
346 total = MIB_TOTAL_BYTES_H + 1;
351 if (check & masks[MIB_COUNTER_OVERFLOW])
352 *cnt += MIB_PACKET_DROPPED + 1;
353 *cnt += data & MIB_PACKET_DROPPED;
358 mutex_unlock(&dev->alu_mutex);
361 static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
362 u64 *dropped, u64 *cnt)
364 struct ksz8 *ksz8 = dev->priv;
365 const u8 *regs = ksz8->regs;
366 u32 *last = (u32 *)dropped;
371 addr -= dev->reg_mib_cnt;
372 ctrl_addr = addr ? KSZ8863_MIB_PACKET_DROPPED_TX_0 :
373 KSZ8863_MIB_PACKET_DROPPED_RX_0;
375 ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
377 mutex_lock(&dev->alu_mutex);
378 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
379 ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
380 mutex_unlock(&dev->alu_mutex);
382 data &= MIB_PACKET_DROPPED;
387 data += MIB_PACKET_DROPPED + 1;
393 static void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
394 u64 *dropped, u64 *cnt)
396 if (ksz_is_ksz88x3(dev))
397 ksz8863_r_mib_pkt(dev, port, addr, dropped, cnt);
399 ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt);
402 static void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze)
404 if (ksz_is_ksz88x3(dev))
407 /* enable the port for flush/freeze function */
409 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true);
410 ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FREEZE, freeze);
412 /* disable the port after freeze is done */
414 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false);
417 static void ksz8_port_init_cnt(struct ksz_device *dev, int port)
419 struct ksz_port_mib *mib = &dev->ports[port].mib;
422 if (!ksz_is_ksz88x3(dev)) {
423 /* flush all enabled port MIB counters */
424 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true);
425 ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FLUSH, true);
426 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false);
431 /* Some ports may not have MIB counters before SWITCH_COUNTER_NUM. */
432 while (mib->cnt_ptr < dev->reg_mib_cnt) {
433 dev->dev_ops->r_mib_cnt(dev, port, mib->cnt_ptr,
434 &mib->counters[mib->cnt_ptr]);
438 /* last one in storage */
439 dropped = &mib->counters[dev->mib_cnt];
441 /* Some ports may not have MIB counters after SWITCH_COUNTER_NUM. */
442 while (mib->cnt_ptr < dev->mib_cnt) {
443 dev->dev_ops->r_mib_pkt(dev, port, mib->cnt_ptr,
444 dropped, &mib->counters[mib->cnt_ptr]);
448 memset(mib->counters, 0, dev->mib_cnt * sizeof(u64));
451 static void ksz8_r_table(struct ksz_device *dev, int table, u16 addr, u64 *data)
453 struct ksz8 *ksz8 = dev->priv;
454 const u8 *regs = ksz8->regs;
457 ctrl_addr = IND_ACC_TABLE(table | TABLE_READ) | addr;
459 mutex_lock(&dev->alu_mutex);
460 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
461 ksz_read64(dev, regs[REG_IND_DATA_HI], data);
462 mutex_unlock(&dev->alu_mutex);
465 static void ksz8_w_table(struct ksz_device *dev, int table, u16 addr, u64 data)
467 struct ksz8 *ksz8 = dev->priv;
468 const u8 *regs = ksz8->regs;
471 ctrl_addr = IND_ACC_TABLE(table) | addr;
473 mutex_lock(&dev->alu_mutex);
474 ksz_write64(dev, regs[REG_IND_DATA_HI], data);
475 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
476 mutex_unlock(&dev->alu_mutex);
479 static int ksz8_valid_dyn_entry(struct ksz_device *dev, u8 *data)
481 struct ksz8 *ksz8 = dev->priv;
490 ksz_read8(dev, regs[REG_IND_DATA_CHECK], data);
492 } while ((*data & masks[DYNAMIC_MAC_TABLE_NOT_READY]) && timeout);
494 /* Entry is not ready for accessing. */
495 if (*data & masks[DYNAMIC_MAC_TABLE_NOT_READY]) {
497 /* Entry is ready for accessing. */
499 ksz_read8(dev, regs[REG_IND_DATA_8], data);
501 /* There is no valid entry in the table. */
502 if (*data & masks[DYNAMIC_MAC_TABLE_MAC_EMPTY])
508 static int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr,
509 u8 *mac_addr, u8 *fid, u8 *src_port,
510 u8 *timestamp, u16 *entries)
512 struct ksz8 *ksz8 = dev->priv;
513 u32 data_hi, data_lo;
521 shifts = ksz8->shifts;
525 ctrl_addr = IND_ACC_TABLE(TABLE_DYNAMIC_MAC | TABLE_READ) | addr;
527 mutex_lock(&dev->alu_mutex);
528 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
530 rc = ksz8_valid_dyn_entry(dev, &data);
534 } else if (rc == -ENXIO) {
536 /* At least one valid entry in the table. */
541 ksz_read64(dev, regs[REG_IND_DATA_HI], &buf);
542 data_hi = (u32)(buf >> 32);
545 /* Check out how many valid entry in the table. */
546 cnt = data & masks[DYNAMIC_MAC_TABLE_ENTRIES_H];
547 cnt <<= shifts[DYNAMIC_MAC_ENTRIES_H];
548 cnt |= (data_hi & masks[DYNAMIC_MAC_TABLE_ENTRIES]) >>
549 shifts[DYNAMIC_MAC_ENTRIES];
552 *fid = (data_hi & masks[DYNAMIC_MAC_TABLE_FID]) >>
553 shifts[DYNAMIC_MAC_FID];
554 *src_port = (data_hi & masks[DYNAMIC_MAC_TABLE_SRC_PORT]) >>
555 shifts[DYNAMIC_MAC_SRC_PORT];
556 *timestamp = (data_hi & masks[DYNAMIC_MAC_TABLE_TIMESTAMP]) >>
557 shifts[DYNAMIC_MAC_TIMESTAMP];
559 mac_addr[5] = (u8)data_lo;
560 mac_addr[4] = (u8)(data_lo >> 8);
561 mac_addr[3] = (u8)(data_lo >> 16);
562 mac_addr[2] = (u8)(data_lo >> 24);
564 mac_addr[1] = (u8)data_hi;
565 mac_addr[0] = (u8)(data_hi >> 8);
568 mutex_unlock(&dev->alu_mutex);
573 static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
574 struct alu_struct *alu)
576 struct ksz8 *ksz8 = dev->priv;
577 u32 data_hi, data_lo;
582 shifts = ksz8->shifts;
585 ksz8_r_table(dev, TABLE_STATIC_MAC, addr, &data);
586 data_hi = data >> 32;
588 if (data_hi & (masks[STATIC_MAC_TABLE_VALID] |
589 masks[STATIC_MAC_TABLE_OVERRIDE])) {
590 alu->mac[5] = (u8)data_lo;
591 alu->mac[4] = (u8)(data_lo >> 8);
592 alu->mac[3] = (u8)(data_lo >> 16);
593 alu->mac[2] = (u8)(data_lo >> 24);
594 alu->mac[1] = (u8)data_hi;
595 alu->mac[0] = (u8)(data_hi >> 8);
597 (data_hi & masks[STATIC_MAC_TABLE_FWD_PORTS]) >>
598 shifts[STATIC_MAC_FWD_PORTS];
600 (data_hi & masks[STATIC_MAC_TABLE_OVERRIDE]) ? 1 : 0;
602 alu->is_static = true;
604 (data_hi & masks[STATIC_MAC_TABLE_USE_FID]) ? 1 : 0;
605 alu->fid = (data_hi & masks[STATIC_MAC_TABLE_FID]) >>
606 shifts[STATIC_MAC_FID];
612 static void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr,
613 struct alu_struct *alu)
615 struct ksz8 *ksz8 = dev->priv;
616 u32 data_hi, data_lo;
621 shifts = ksz8->shifts;
624 data_lo = ((u32)alu->mac[2] << 24) |
625 ((u32)alu->mac[3] << 16) |
626 ((u32)alu->mac[4] << 8) | alu->mac[5];
627 data_hi = ((u32)alu->mac[0] << 8) | alu->mac[1];
628 data_hi |= (u32)alu->port_forward << shifts[STATIC_MAC_FWD_PORTS];
630 if (alu->is_override)
631 data_hi |= masks[STATIC_MAC_TABLE_OVERRIDE];
632 if (alu->is_use_fid) {
633 data_hi |= masks[STATIC_MAC_TABLE_USE_FID];
634 data_hi |= (u32)alu->fid << shifts[STATIC_MAC_FID];
637 data_hi |= masks[STATIC_MAC_TABLE_VALID];
639 data_hi &= ~masks[STATIC_MAC_TABLE_OVERRIDE];
641 data = (u64)data_hi << 32 | data_lo;
642 ksz8_w_table(dev, TABLE_STATIC_MAC, addr, data);
645 static void ksz8_from_vlan(struct ksz_device *dev, u32 vlan, u8 *fid,
646 u8 *member, u8 *valid)
648 struct ksz8 *ksz8 = dev->priv;
652 shifts = ksz8->shifts;
655 *fid = vlan & masks[VLAN_TABLE_FID];
656 *member = (vlan & masks[VLAN_TABLE_MEMBERSHIP]) >>
657 shifts[VLAN_TABLE_MEMBERSHIP_S];
658 *valid = !!(vlan & masks[VLAN_TABLE_VALID]);
661 static void ksz8_to_vlan(struct ksz_device *dev, u8 fid, u8 member, u8 valid,
664 struct ksz8 *ksz8 = dev->priv;
668 shifts = ksz8->shifts;
672 *vlan |= (u16)member << shifts[VLAN_TABLE_MEMBERSHIP_S];
674 *vlan |= masks[VLAN_TABLE_VALID];
677 static void ksz8_r_vlan_entries(struct ksz_device *dev, u16 addr)
679 struct ksz8 *ksz8 = dev->priv;
684 shifts = ksz8->shifts;
686 ksz8_r_table(dev, TABLE_VLAN, addr, &data);
687 addr *= dev->phy_port_cnt;
688 for (i = 0; i < dev->phy_port_cnt; i++) {
689 dev->vlan_cache[addr + i].table[0] = (u16)data;
690 data >>= shifts[VLAN_TABLE];
694 static void ksz8_r_vlan_table(struct ksz_device *dev, u16 vid, u16 *vlan)
702 addr = vid / dev->phy_port_cnt;
704 ksz8_r_table(dev, TABLE_VLAN, addr, &buf);
708 static void ksz8_w_vlan_table(struct ksz_device *dev, u16 vid, u16 vlan)
716 addr = vid / dev->phy_port_cnt;
718 ksz8_r_table(dev, TABLE_VLAN, addr, &buf);
720 dev->vlan_cache[vid].table[0] = vlan;
721 ksz8_w_table(dev, TABLE_VLAN, addr, buf);
724 static void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
726 struct ksz8 *ksz8 = dev->priv;
727 u8 restart, speed, ctrl, link;
728 const u8 *regs = ksz8->regs;
729 int processed = true;
735 ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
736 ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
737 ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
738 if (restart & PORT_PHY_LOOPBACK)
739 data |= PHY_LOOPBACK;
740 if (ctrl & PORT_FORCE_100_MBIT)
741 data |= PHY_SPEED_100MBIT;
742 if (ksz_is_ksz88x3(dev)) {
743 if ((ctrl & PORT_AUTO_NEG_ENABLE))
744 data |= PHY_AUTO_NEG_ENABLE;
746 if (!(ctrl & PORT_AUTO_NEG_DISABLE))
747 data |= PHY_AUTO_NEG_ENABLE;
749 if (restart & PORT_POWER_DOWN)
750 data |= PHY_POWER_DOWN;
751 if (restart & PORT_AUTO_NEG_RESTART)
752 data |= PHY_AUTO_NEG_RESTART;
753 if (ctrl & PORT_FORCE_FULL_DUPLEX)
754 data |= PHY_FULL_DUPLEX;
755 if (speed & PORT_HP_MDIX)
757 if (restart & PORT_FORCE_MDIX)
758 data |= PHY_FORCE_MDIX;
759 if (restart & PORT_AUTO_MDIX_DISABLE)
760 data |= PHY_AUTO_MDIX_DISABLE;
761 if (restart & PORT_TX_DISABLE)
762 data |= PHY_TRANSMIT_DISABLE;
763 if (restart & PORT_LED_OFF)
764 data |= PHY_LED_DISABLE;
767 ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
768 data = PHY_100BTX_FD_CAPABLE |
770 PHY_10BT_FD_CAPABLE |
772 PHY_AUTO_NEG_CAPABLE;
773 if (link & PORT_AUTO_NEG_COMPLETE)
774 data |= PHY_AUTO_NEG_ACKNOWLEDGE;
775 if (link & PORT_STAT_LINK_GOOD)
776 data |= PHY_LINK_STATUS;
779 data = KSZ8795_ID_HI;
782 if (ksz_is_ksz88x3(dev))
783 data = KSZ8863_ID_LO;
785 data = KSZ8795_ID_LO;
787 case PHY_REG_AUTO_NEGOTIATION:
788 ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
789 data = PHY_AUTO_NEG_802_3;
790 if (ctrl & PORT_AUTO_NEG_SYM_PAUSE)
791 data |= PHY_AUTO_NEG_SYM_PAUSE;
792 if (ctrl & PORT_AUTO_NEG_100BTX_FD)
793 data |= PHY_AUTO_NEG_100BTX_FD;
794 if (ctrl & PORT_AUTO_NEG_100BTX)
795 data |= PHY_AUTO_NEG_100BTX;
796 if (ctrl & PORT_AUTO_NEG_10BT_FD)
797 data |= PHY_AUTO_NEG_10BT_FD;
798 if (ctrl & PORT_AUTO_NEG_10BT)
799 data |= PHY_AUTO_NEG_10BT;
801 case PHY_REG_REMOTE_CAPABILITY:
802 ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
803 data = PHY_AUTO_NEG_802_3;
804 if (link & PORT_REMOTE_SYM_PAUSE)
805 data |= PHY_AUTO_NEG_SYM_PAUSE;
806 if (link & PORT_REMOTE_100BTX_FD)
807 data |= PHY_AUTO_NEG_100BTX_FD;
808 if (link & PORT_REMOTE_100BTX)
809 data |= PHY_AUTO_NEG_100BTX;
810 if (link & PORT_REMOTE_10BT_FD)
811 data |= PHY_AUTO_NEG_10BT_FD;
812 if (link & PORT_REMOTE_10BT)
813 data |= PHY_AUTO_NEG_10BT;
814 if (data & ~PHY_AUTO_NEG_802_3)
815 data |= PHY_REMOTE_ACKNOWLEDGE_NOT;
825 static void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
827 struct ksz8 *ksz8 = dev->priv;
828 u8 restart, speed, ctrl, data;
829 const u8 *regs = ksz8->regs;
835 /* Do not support PHY reset function. */
838 ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
840 if (val & PHY_HP_MDIX)
841 data |= PORT_HP_MDIX;
843 data &= ~PORT_HP_MDIX;
845 ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
846 ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
848 if (ksz_is_ksz88x3(dev)) {
849 if ((val & PHY_AUTO_NEG_ENABLE))
850 data |= PORT_AUTO_NEG_ENABLE;
852 data &= ~PORT_AUTO_NEG_ENABLE;
854 if (!(val & PHY_AUTO_NEG_ENABLE))
855 data |= PORT_AUTO_NEG_DISABLE;
857 data &= ~PORT_AUTO_NEG_DISABLE;
859 /* Fiber port does not support auto-negotiation. */
860 if (dev->ports[p].fiber)
861 data |= PORT_AUTO_NEG_DISABLE;
864 if (val & PHY_SPEED_100MBIT)
865 data |= PORT_FORCE_100_MBIT;
867 data &= ~PORT_FORCE_100_MBIT;
868 if (val & PHY_FULL_DUPLEX)
869 data |= PORT_FORCE_FULL_DUPLEX;
871 data &= ~PORT_FORCE_FULL_DUPLEX;
873 ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
874 ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
876 if (val & PHY_LED_DISABLE)
877 data |= PORT_LED_OFF;
879 data &= ~PORT_LED_OFF;
880 if (val & PHY_TRANSMIT_DISABLE)
881 data |= PORT_TX_DISABLE;
883 data &= ~PORT_TX_DISABLE;
884 if (val & PHY_AUTO_NEG_RESTART)
885 data |= PORT_AUTO_NEG_RESTART;
887 data &= ~(PORT_AUTO_NEG_RESTART);
888 if (val & PHY_POWER_DOWN)
889 data |= PORT_POWER_DOWN;
891 data &= ~PORT_POWER_DOWN;
892 if (val & PHY_AUTO_MDIX_DISABLE)
893 data |= PORT_AUTO_MDIX_DISABLE;
895 data &= ~PORT_AUTO_MDIX_DISABLE;
896 if (val & PHY_FORCE_MDIX)
897 data |= PORT_FORCE_MDIX;
899 data &= ~PORT_FORCE_MDIX;
900 if (val & PHY_LOOPBACK)
901 data |= PORT_PHY_LOOPBACK;
903 data &= ~PORT_PHY_LOOPBACK;
905 ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL], data);
907 case PHY_REG_AUTO_NEGOTIATION:
908 ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
910 data &= ~(PORT_AUTO_NEG_SYM_PAUSE |
911 PORT_AUTO_NEG_100BTX_FD |
912 PORT_AUTO_NEG_100BTX |
913 PORT_AUTO_NEG_10BT_FD |
915 if (val & PHY_AUTO_NEG_SYM_PAUSE)
916 data |= PORT_AUTO_NEG_SYM_PAUSE;
917 if (val & PHY_AUTO_NEG_100BTX_FD)
918 data |= PORT_AUTO_NEG_100BTX_FD;
919 if (val & PHY_AUTO_NEG_100BTX)
920 data |= PORT_AUTO_NEG_100BTX;
921 if (val & PHY_AUTO_NEG_10BT_FD)
922 data |= PORT_AUTO_NEG_10BT_FD;
923 if (val & PHY_AUTO_NEG_10BT)
924 data |= PORT_AUTO_NEG_10BT;
926 ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
933 static enum dsa_tag_protocol ksz8_get_tag_protocol(struct dsa_switch *ds,
935 enum dsa_tag_protocol mp)
937 struct ksz_device *dev = ds->priv;
939 /* ksz88x3 uses the same tag schema as KSZ9893 */
940 return ksz_is_ksz88x3(dev) ?
941 DSA_TAG_PROTO_KSZ9893 : DSA_TAG_PROTO_KSZ8795;
944 static void ksz8_get_strings(struct dsa_switch *ds, int port,
945 u32 stringset, uint8_t *buf)
947 struct ksz_device *dev = ds->priv;
950 for (i = 0; i < dev->mib_cnt; i++) {
951 memcpy(buf + i * ETH_GSTRING_LEN,
952 dev->mib_names[i].string, ETH_GSTRING_LEN);
956 static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
960 ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
961 data &= ~PORT_VLAN_MEMBERSHIP;
962 data |= (member & dev->port_mask);
963 ksz_pwrite8(dev, port, P_MIRROR_CTRL, data);
964 dev->ports[port].member = member;
967 static void ksz8_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
969 struct ksz_device *dev = ds->priv;
970 int forward = dev->member;
975 p = &dev->ports[port];
977 ksz_pread8(dev, port, P_STP_CTRL, &data);
978 data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
981 case BR_STATE_DISABLED:
982 data |= PORT_LEARN_DISABLE;
983 if (port < dev->phy_port_cnt)
986 case BR_STATE_LISTENING:
987 data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
988 if (port < dev->phy_port_cnt &&
989 p->stp_state == BR_STATE_DISABLED)
990 member = dev->host_mask | p->vid_member;
992 case BR_STATE_LEARNING:
993 data |= PORT_RX_ENABLE;
995 case BR_STATE_FORWARDING:
996 data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
998 /* This function is also used internally. */
999 if (port == dev->cpu_port)
1002 /* Port is a member of a bridge. */
1003 if (dev->br_member & BIT(port)) {
1004 dev->member |= BIT(port);
1005 member = dev->member;
1007 member = dev->host_mask | p->vid_member;
1010 case BR_STATE_BLOCKING:
1011 data |= PORT_LEARN_DISABLE;
1012 if (port < dev->phy_port_cnt &&
1013 p->stp_state == BR_STATE_DISABLED)
1014 member = dev->host_mask | p->vid_member;
1017 dev_err(ds->dev, "invalid STP state: %d\n", state);
1021 ksz_pwrite8(dev, port, P_STP_CTRL, data);
1022 p->stp_state = state;
1023 /* Port membership may share register with STP state. */
1024 if (member >= 0 && member != p->member)
1025 ksz8_cfg_port_member(dev, port, (u8)member);
1027 /* Check if forwarding needs to be updated. */
1028 if (state != BR_STATE_FORWARDING) {
1029 if (dev->br_member & BIT(port))
1030 dev->member &= ~BIT(port);
1033 /* When topology has changed the function ksz_update_port_member
1034 * should be called to modify port forwarding behavior.
1036 if (forward != dev->member)
1037 ksz_update_port_member(dev, port);
1040 static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
1042 u8 learn[DSA_MAX_PORTS];
1043 int first, index, cnt;
1046 if ((uint)port < dev->port_cnt) {
1050 /* Flush all ports. */
1052 cnt = dev->port_cnt;
1054 for (index = first; index < cnt; index++) {
1055 p = &dev->ports[index];
1058 ksz_pread8(dev, index, P_STP_CTRL, &learn[index]);
1059 if (!(learn[index] & PORT_LEARN_DISABLE))
1060 ksz_pwrite8(dev, index, P_STP_CTRL,
1061 learn[index] | PORT_LEARN_DISABLE);
1063 ksz_cfg(dev, S_FLUSH_TABLE_CTRL, SW_FLUSH_DYN_MAC_TABLE, true);
1064 for (index = first; index < cnt; index++) {
1065 p = &dev->ports[index];
1068 if (!(learn[index] & PORT_LEARN_DISABLE))
1069 ksz_pwrite8(dev, index, P_STP_CTRL, learn[index]);
1073 static int ksz8_port_vlan_filtering(struct dsa_switch *ds, int port, bool flag,
1074 struct netlink_ext_ack *extack)
1076 struct ksz_device *dev = ds->priv;
1078 if (ksz_is_ksz88x3(dev))
1081 ksz_cfg(dev, S_MIRROR_CTRL, SW_VLAN_ENABLE, flag);
1086 static int ksz8_port_vlan_add(struct dsa_switch *ds, int port,
1087 const struct switchdev_obj_port_vlan *vlan,
1088 struct netlink_ext_ack *extack)
1090 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1091 struct ksz_device *dev = ds->priv;
1092 u16 data, new_pvid = 0;
1093 u8 fid, member, valid;
1095 if (ksz_is_ksz88x3(dev))
1098 ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged);
1100 ksz8_r_vlan_table(dev, vlan->vid, &data);
1101 ksz8_from_vlan(dev, data, &fid, &member, &valid);
1103 /* First time to setup the VLAN entry. */
1105 /* Need to find a way to map VID to FID. */
1109 member |= BIT(port);
1111 ksz8_to_vlan(dev, fid, member, valid, &data);
1112 ksz8_w_vlan_table(dev, vlan->vid, data);
1115 if (vlan->flags & BRIDGE_VLAN_INFO_PVID)
1116 new_pvid = vlan->vid;
1121 ksz_pread16(dev, port, REG_PORT_CTRL_VID, &vid);
1124 ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, vid);
1130 static int ksz8_port_vlan_del(struct dsa_switch *ds, int port,
1131 const struct switchdev_obj_port_vlan *vlan)
1133 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1134 struct ksz_device *dev = ds->priv;
1135 u16 data, pvid, new_pvid = 0;
1136 u8 fid, member, valid;
1138 if (ksz_is_ksz88x3(dev))
1141 ksz_pread16(dev, port, REG_PORT_CTRL_VID, &pvid);
1142 pvid = pvid & 0xFFF;
1144 ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged);
1146 ksz8_r_vlan_table(dev, vlan->vid, &data);
1147 ksz8_from_vlan(dev, data, &fid, &member, &valid);
1149 member &= ~BIT(port);
1151 /* Invalidate the entry if no more member. */
1157 if (pvid == vlan->vid)
1160 ksz8_to_vlan(dev, fid, member, valid, &data);
1161 ksz8_w_vlan_table(dev, vlan->vid, data);
1163 if (new_pvid != pvid)
1164 ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, pvid);
1169 static int ksz8_port_mirror_add(struct dsa_switch *ds, int port,
1170 struct dsa_mall_mirror_tc_entry *mirror,
1173 struct ksz_device *dev = ds->priv;
1176 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true);
1177 dev->mirror_rx |= BIT(port);
1179 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true);
1180 dev->mirror_tx |= BIT(port);
1183 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false);
1185 /* configure mirror port */
1186 if (dev->mirror_rx || dev->mirror_tx)
1187 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
1188 PORT_MIRROR_SNIFFER, true);
1193 static void ksz8_port_mirror_del(struct dsa_switch *ds, int port,
1194 struct dsa_mall_mirror_tc_entry *mirror)
1196 struct ksz_device *dev = ds->priv;
1199 if (mirror->ingress) {
1200 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false);
1201 dev->mirror_rx &= ~BIT(port);
1203 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false);
1204 dev->mirror_tx &= ~BIT(port);
1207 ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
1209 if (!dev->mirror_rx && !dev->mirror_tx)
1210 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
1211 PORT_MIRROR_SNIFFER, false);
1214 static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port)
1216 struct ksz_port *p = &dev->ports[port];
1219 if (!p->interface && dev->compat_interface) {
1221 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
1222 "Please update your device tree.\n",
1224 p->interface = dev->compat_interface;
1227 /* Configure MII interface for proper network communication. */
1228 ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);
1229 data8 &= ~PORT_INTERFACE_TYPE;
1230 data8 &= ~PORT_GMII_1GPS_MODE;
1231 switch (p->interface) {
1232 case PHY_INTERFACE_MODE_MII:
1233 p->phydev.speed = SPEED_100;
1235 case PHY_INTERFACE_MODE_RMII:
1236 data8 |= PORT_INTERFACE_RMII;
1237 p->phydev.speed = SPEED_100;
1239 case PHY_INTERFACE_MODE_GMII:
1240 data8 |= PORT_GMII_1GPS_MODE;
1241 data8 |= PORT_INTERFACE_GMII;
1242 p->phydev.speed = SPEED_1000;
1245 data8 &= ~PORT_RGMII_ID_IN_ENABLE;
1246 data8 &= ~PORT_RGMII_ID_OUT_ENABLE;
1247 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
1248 p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
1249 data8 |= PORT_RGMII_ID_IN_ENABLE;
1250 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
1251 p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
1252 data8 |= PORT_RGMII_ID_OUT_ENABLE;
1253 data8 |= PORT_GMII_1GPS_MODE;
1254 data8 |= PORT_INTERFACE_RGMII;
1255 p->phydev.speed = SPEED_1000;
1258 ksz_write8(dev, REG_PORT_5_CTRL_6, data8);
1259 p->phydev.duplex = 1;
1262 static void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
1264 struct ksz_port *p = &dev->ports[port];
1265 struct ksz8 *ksz8 = dev->priv;
1269 masks = ksz8->masks;
1271 /* enable broadcast storm limit */
1272 ksz_port_cfg(dev, port, P_BCAST_STORM_CTRL, PORT_BROADCAST_STORM, true);
1274 if (!ksz_is_ksz88x3(dev))
1275 ksz8795_set_prio_queue(dev, port, 4);
1277 /* disable DiffServ priority */
1278 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_DIFFSERV_ENABLE, false);
1280 /* replace priority */
1281 ksz_port_cfg(dev, port, P_802_1P_CTRL,
1282 masks[PORT_802_1P_REMAPPING], false);
1284 /* enable 802.1p priority */
1285 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
1288 if (!ksz_is_ksz88x3(dev))
1289 ksz8795_cpu_interface_select(dev, port);
1291 member = dev->port_mask;
1293 member = dev->host_mask | p->vid_member;
1295 ksz8_cfg_port_member(dev, port, member);
1298 static void ksz8_config_cpu_port(struct dsa_switch *ds)
1300 struct ksz_device *dev = ds->priv;
1301 struct ksz8 *ksz8 = dev->priv;
1302 const u8 *regs = ksz8->regs;
1308 masks = ksz8->masks;
1310 /* Switch marks the maximum frame with extra byte as oversize. */
1311 ksz_cfg(dev, REG_SW_CTRL_2, SW_LEGAL_PACKET_DISABLE, true);
1312 ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true);
1314 p = &dev->ports[dev->cpu_port];
1315 p->vid_member = dev->port_mask;
1318 ksz8_port_setup(dev, dev->cpu_port, true);
1319 dev->member = dev->host_mask;
1321 for (i = 0; i < dev->phy_port_cnt; i++) {
1324 /* Initialize to non-zero so that ksz_cfg_port_member() will
1327 p->vid_member = BIT(i);
1328 p->member = dev->port_mask;
1329 ksz8_port_stp_state_set(ds, i, BR_STATE_DISABLED);
1331 /* Last port may be disabled. */
1332 if (i == dev->phy_port_cnt)
1337 for (i = 0; i < dev->phy_port_cnt; i++) {
1341 if (!ksz_is_ksz88x3(dev)) {
1342 ksz_pread8(dev, i, regs[P_REMOTE_STATUS], &remote);
1343 if (remote & PORT_FIBER_MODE)
1347 ksz_port_cfg(dev, i, P_STP_CTRL, PORT_FORCE_FLOW_CTRL,
1350 ksz_port_cfg(dev, i, P_STP_CTRL, PORT_FORCE_FLOW_CTRL,
1355 static int ksz8_setup(struct dsa_switch *ds)
1357 struct ksz_device *dev = ds->priv;
1358 struct alu_struct alu;
1361 dev->vlan_cache = devm_kcalloc(dev->dev, sizeof(struct vlan_table),
1362 dev->num_vlans, GFP_KERNEL);
1363 if (!dev->vlan_cache)
1366 ret = ksz8_reset_switch(dev);
1368 dev_err(ds->dev, "failed to reset switch\n");
1372 ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_FLOW_CTRL, true);
1374 /* Enable automatic fast aging when link changed detected. */
1375 ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true);
1377 /* Enable aggressive back off algorithm in half duplex mode. */
1378 regmap_update_bits(dev->regmap[0], REG_SW_CTRL_1,
1379 SW_AGGR_BACKOFF, SW_AGGR_BACKOFF);
1382 * Make sure unicast VLAN boundary is set as default and
1383 * enable no excessive collision drop.
1385 regmap_update_bits(dev->regmap[0], REG_SW_CTRL_2,
1386 UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP,
1387 UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP);
1389 ksz8_config_cpu_port(ds);
1391 ksz_cfg(dev, REG_SW_CTRL_2, MULTICAST_STORM_DISABLE, true);
1393 ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false);
1395 ksz_cfg(dev, S_MIRROR_CTRL, SW_MIRROR_RX_TX, false);
1397 /* set broadcast storm protection 10% rate */
1398 regmap_update_bits(dev->regmap[1], S_REPLACE_VID_CTRL,
1399 BROADCAST_STORM_RATE,
1400 (BROADCAST_STORM_VALUE *
1401 BROADCAST_STORM_PROT_RATE) / 100);
1403 for (i = 0; i < (dev->num_vlans / 4); i++)
1404 ksz8_r_vlan_entries(dev, i);
1406 /* Setup STP address for STP operation. */
1407 memset(&alu, 0, sizeof(alu));
1408 ether_addr_copy(alu.mac, eth_stp_addr);
1409 alu.is_static = true;
1410 alu.is_override = true;
1411 alu.port_forward = dev->host_mask;
1413 ksz8_w_sta_mac_table(dev, 0, &alu);
1415 ksz_init_mib_timer(dev);
1417 ds->configure_vlan_while_not_filtering = false;
1422 static const struct dsa_switch_ops ksz8_switch_ops = {
1423 .get_tag_protocol = ksz8_get_tag_protocol,
1424 .setup = ksz8_setup,
1425 .phy_read = ksz_phy_read16,
1426 .phy_write = ksz_phy_write16,
1427 .phylink_mac_link_down = ksz_mac_link_down,
1428 .port_enable = ksz_enable_port,
1429 .get_strings = ksz8_get_strings,
1430 .get_ethtool_stats = ksz_get_ethtool_stats,
1431 .get_sset_count = ksz_sset_count,
1432 .port_bridge_join = ksz_port_bridge_join,
1433 .port_bridge_leave = ksz_port_bridge_leave,
1434 .port_stp_state_set = ksz8_port_stp_state_set,
1435 .port_fast_age = ksz_port_fast_age,
1436 .port_vlan_filtering = ksz8_port_vlan_filtering,
1437 .port_vlan_add = ksz8_port_vlan_add,
1438 .port_vlan_del = ksz8_port_vlan_del,
1439 .port_fdb_dump = ksz_port_fdb_dump,
1440 .port_mdb_add = ksz_port_mdb_add,
1441 .port_mdb_del = ksz_port_mdb_del,
1442 .port_mirror_add = ksz8_port_mirror_add,
1443 .port_mirror_del = ksz8_port_mirror_del,
1446 static u32 ksz8_get_port_addr(int port, int offset)
1448 return PORT_CTRL_ADDR(port, offset);
1451 static int ksz8_switch_detect(struct ksz_device *dev)
1458 ret = ksz_read16(dev, REG_CHIP_ID0, &id16);
1463 id2 = id16 & SW_CHIP_ID_M;
1466 case KSZ87_FAMILY_ID:
1467 if ((id2 != CHIP_ID_94 && id2 != CHIP_ID_95))
1470 if (id2 == CHIP_ID_95) {
1474 ksz_read8(dev, REG_PORT_STATUS_0, &val);
1475 if (val & PORT_FIBER_MODE)
1477 } else if (id2 == CHIP_ID_94) {
1481 case KSZ88_FAMILY_ID:
1482 if (id2 != CHIP_ID_63)
1486 dev_err(dev->dev, "invalid family id: %d\n", id1);
1491 dev->chip_id = id16;
1496 struct ksz_chip_data {
1498 const char *dev_name;
1506 static const struct ksz_chip_data ksz8_switch_chips[] = {
1509 .dev_name = "KSZ8795",
1513 .cpu_ports = 0x10, /* can be configured as cpu port */
1514 .port_cnt = 5, /* total cpu and user ports */
1520 * KSZ8794 is similar to KSZ8795, except the port map
1521 * contains a gap between external and CPU ports, the
1522 * port map is NOT continuous. The per-port register
1523 * map is shifted accordingly too, i.e. registers at
1524 * offset 0x40 are NOT used on KSZ8794 and they ARE
1525 * used on KSZ8795 for external port 3.
1532 .dev_name = "KSZ8794",
1536 .cpu_ports = 0x10, /* can be configured as cpu port */
1537 .port_cnt = 4, /* total cpu and user ports */
1541 .dev_name = "KSZ8765",
1545 .cpu_ports = 0x10, /* can be configured as cpu port */
1546 .port_cnt = 5, /* total cpu and user ports */
1550 .dev_name = "KSZ8863/KSZ8873",
1554 .cpu_ports = 0x4, /* can be configured as cpu port */
1559 static int ksz8_switch_init(struct ksz_device *dev)
1561 struct ksz8 *ksz8 = dev->priv;
1564 dev->ds->ops = &ksz8_switch_ops;
1566 for (i = 0; i < ARRAY_SIZE(ksz8_switch_chips); i++) {
1567 const struct ksz_chip_data *chip = &ksz8_switch_chips[i];
1569 if (dev->chip_id == chip->chip_id) {
1570 dev->name = chip->dev_name;
1571 dev->num_vlans = chip->num_vlans;
1572 dev->num_alus = chip->num_alus;
1573 dev->num_statics = chip->num_statics;
1574 dev->port_cnt = fls(chip->cpu_ports);
1575 dev->cpu_port = fls(chip->cpu_ports) - 1;
1576 dev->phy_port_cnt = dev->port_cnt - 1;
1577 dev->cpu_ports = chip->cpu_ports;
1578 dev->host_mask = chip->cpu_ports;
1579 dev->port_mask = (BIT(dev->phy_port_cnt) - 1) |
1585 /* no switch found */
1586 if (!dev->cpu_ports)
1589 if (ksz_is_ksz88x3(dev)) {
1590 ksz8->regs = ksz8863_regs;
1591 ksz8->masks = ksz8863_masks;
1592 ksz8->shifts = ksz8863_shifts;
1593 dev->mib_cnt = ARRAY_SIZE(ksz88xx_mib_names);
1594 dev->mib_names = ksz88xx_mib_names;
1596 ksz8->regs = ksz8795_regs;
1597 ksz8->masks = ksz8795_masks;
1598 ksz8->shifts = ksz8795_shifts;
1599 dev->mib_cnt = ARRAY_SIZE(ksz87xx_mib_names);
1600 dev->mib_names = ksz87xx_mib_names;
1603 dev->reg_mib_cnt = MIB_COUNTER_NUM;
1605 dev->ports = devm_kzalloc(dev->dev,
1606 dev->port_cnt * sizeof(struct ksz_port),
1610 for (i = 0; i < dev->port_cnt; i++) {
1611 mutex_init(&dev->ports[i].mib.cnt_mutex);
1612 dev->ports[i].mib.counters =
1613 devm_kzalloc(dev->dev,
1617 if (!dev->ports[i].mib.counters)
1621 /* set the real number of ports */
1622 dev->ds->num_ports = dev->port_cnt;
1627 static void ksz8_switch_exit(struct ksz_device *dev)
1629 ksz8_reset_switch(dev);
1632 static const struct ksz_dev_ops ksz8_dev_ops = {
1633 .get_port_addr = ksz8_get_port_addr,
1634 .cfg_port_member = ksz8_cfg_port_member,
1635 .flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
1636 .port_setup = ksz8_port_setup,
1637 .r_phy = ksz8_r_phy,
1638 .w_phy = ksz8_w_phy,
1639 .r_dyn_mac_table = ksz8_r_dyn_mac_table,
1640 .r_sta_mac_table = ksz8_r_sta_mac_table,
1641 .w_sta_mac_table = ksz8_w_sta_mac_table,
1642 .r_mib_cnt = ksz8_r_mib_cnt,
1643 .r_mib_pkt = ksz8_r_mib_pkt,
1644 .freeze_mib = ksz8_freeze_mib,
1645 .port_init_cnt = ksz8_port_init_cnt,
1646 .shutdown = ksz8_reset_switch,
1647 .detect = ksz8_switch_detect,
1648 .init = ksz8_switch_init,
1649 .exit = ksz8_switch_exit,
1652 int ksz8_switch_register(struct ksz_device *dev)
1654 return ksz_switch_register(dev, &ksz8_dev_ops);
1656 EXPORT_SYMBOL(ksz8_switch_register);
1659 MODULE_DESCRIPTION("Microchip KSZ8795 Series Switch DSA Driver");
1660 MODULE_LICENSE("GPL");