Lines Matching +full:port +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2019 Microchip Technology Inc.
11 #include <linux/platform_data/microchip-ksz.h>
23 #define IS_9893 BIT(2)
69 regmap_update_bits(dev->regmap[0], addr, bits, set ? bits : 0); in ksz_cfg()
72 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits, in ksz_port_cfg() argument
75 regmap_update_bits(dev->regmap[0], PORT_CTRL_ADDR(port, offset), in ksz_port_cfg()
81 regmap_update_bits(dev->regmap[2], addr, bits, set ? bits : 0); in ksz9477_cfg32()
84 static void ksz9477_port_cfg32(struct ksz_device *dev, int port, int offset, in ksz9477_port_cfg32() argument
87 regmap_update_bits(dev->regmap[2], PORT_CTRL_ADDR(port, offset), in ksz9477_port_cfg32()
95 return regmap_read_poll_timeout(dev->regmap[0], REG_SW_VLAN_CTRL, in ksz9477_wait_vlan_ctrl_ready()
104 mutex_lock(&dev->vlan_mutex); in ksz9477_get_vlan_table()
112 dev_dbg(dev->dev, "Failed to read vlan table\n"); in ksz9477_get_vlan_table()
118 ksz_read32(dev, REG_SW_VLAN_ENTRY_PORTS__4, &vlan_table[2]); in ksz9477_get_vlan_table()
123 mutex_unlock(&dev->vlan_mutex); in ksz9477_get_vlan_table()
133 mutex_lock(&dev->vlan_mutex); in ksz9477_set_vlan_table()
137 ksz_write32(dev, REG_SW_VLAN_ENTRY_PORTS__4, vlan_table[2]); in ksz9477_set_vlan_table()
145 dev_dbg(dev->dev, "Failed to write vlan table\n"); in ksz9477_set_vlan_table()
152 dev->vlan_cache[vid].table[0] = vlan_table[0]; in ksz9477_set_vlan_table()
153 dev->vlan_cache[vid].table[1] = vlan_table[1]; in ksz9477_set_vlan_table()
154 dev->vlan_cache[vid].table[2] = vlan_table[2]; in ksz9477_set_vlan_table()
157 mutex_unlock(&dev->vlan_mutex); in ksz9477_set_vlan_table()
166 ksz_read32(dev, REG_SW_ALU_VAL_C, &table[2]); in ksz9477_read_table()
174 ksz_write32(dev, REG_SW_ALU_VAL_C, table[2]); in ksz9477_write_table()
182 return regmap_read_poll_timeout(dev->regmap[2], REG_SW_ALU_CTRL__4, in ksz9477_wait_alu_ready()
190 return regmap_read_poll_timeout(dev->regmap[2], in ksz9477_wait_alu_sta_ready()
205 regmap_update_bits(dev->regmap[0], REG_SW_GLOBAL_SERIAL_CTRL_0, in ksz9477_reset_switch()
220 regmap_update_bits(dev->regmap[1], REG_SW_MAC_CTRL_2, in ksz9477_reset_switch()
225 if (dev->synclko_125) in ksz9477_reset_switch()
232 static void ksz9477_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, in ksz9477_r_mib_cnt() argument
235 struct ksz_port *p = &dev->ports[port]; in ksz9477_r_mib_cnt()
241 data = p->freeze ? MIB_COUNTER_FLUSH_FREEZE : 0; in ksz9477_r_mib_cnt()
244 ksz_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, data); in ksz9477_r_mib_cnt()
246 ret = regmap_read_poll_timeout(dev->regmap[2], in ksz9477_r_mib_cnt()
247 PORT_CTRL_ADDR(port, REG_PORT_MIB_CTRL_STAT__4), in ksz9477_r_mib_cnt()
251 dev_dbg(dev->dev, "Failed to get MIB\n"); in ksz9477_r_mib_cnt()
256 ksz_pread32(dev, port, REG_PORT_MIB_DATA, &data); in ksz9477_r_mib_cnt()
260 static void ksz9477_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, in ksz9477_r_mib_pkt() argument
264 ksz9477_r_mib_cnt(dev, port, addr, cnt); in ksz9477_r_mib_pkt()
267 static void ksz9477_freeze_mib(struct ksz_device *dev, int port, bool freeze) in ksz9477_freeze_mib() argument
270 struct ksz_port *p = &dev->ports[port]; in ksz9477_freeze_mib()
272 /* enable/disable the port for flush/freeze function */ in ksz9477_freeze_mib()
273 mutex_lock(&p->mib.cnt_mutex); in ksz9477_freeze_mib()
274 ksz_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, val); in ksz9477_freeze_mib()
277 p->freeze = freeze; in ksz9477_freeze_mib()
278 mutex_unlock(&p->mib.cnt_mutex); in ksz9477_freeze_mib()
281 static void ksz9477_port_init_cnt(struct ksz_device *dev, int port) in ksz9477_port_init_cnt() argument
283 struct ksz_port_mib *mib = &dev->ports[port].mib; in ksz9477_port_init_cnt()
285 /* flush all enabled port MIB counters */ in ksz9477_port_init_cnt()
286 mutex_lock(&mib->cnt_mutex); in ksz9477_port_init_cnt()
287 ksz_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, in ksz9477_port_init_cnt()
290 ksz_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, 0); in ksz9477_port_init_cnt()
291 mutex_unlock(&mib->cnt_mutex); in ksz9477_port_init_cnt()
293 mib->cnt_ptr = 0; in ksz9477_port_init_cnt()
294 memset(mib->counters, 0, dev->mib_cnt * sizeof(u64)); in ksz9477_port_init_cnt()
298 int port, in ksz9477_get_tag_protocol() argument
302 struct ksz_device *dev = ds->priv; in ksz9477_get_tag_protocol()
304 if (dev->features & IS_9893) in ksz9477_get_tag_protocol()
311 struct ksz_device *dev = ds->priv; in ksz9477_phy_read16()
316 * still called for that port during initialization. in ksz9477_phy_read16()
320 if (addr >= dev->phy_port_cnt) { in ksz9477_phy_read16()
321 struct ksz_port *p = &dev->ports[addr]; in ksz9477_phy_read16()
346 if (p->phydev.speed == SPEED_1000) in ksz9477_phy_read16()
362 struct ksz_device *dev = ds->priv; in ksz9477_phy_write16()
365 if (addr >= dev->phy_port_cnt) in ksz9477_phy_write16()
369 if (!(dev->features & GBIT_SUPPORT) && reg == MII_CTRL1000) in ksz9477_phy_write16()
376 static void ksz9477_get_strings(struct dsa_switch *ds, int port, in ksz9477_get_strings() argument
390 static void ksz9477_cfg_port_member(struct ksz_device *dev, int port, in ksz9477_cfg_port_member() argument
393 ksz_pwrite32(dev, port, REG_PORT_VLAN_MEMBERSHIP__4, member); in ksz9477_cfg_port_member()
394 dev->ports[port].member = member; in ksz9477_cfg_port_member()
397 static void ksz9477_port_stp_state_set(struct dsa_switch *ds, int port, in ksz9477_port_stp_state_set() argument
400 struct ksz_device *dev = ds->priv; in ksz9477_port_stp_state_set()
401 struct ksz_port *p = &dev->ports[port]; in ksz9477_port_stp_state_set()
403 int member = -1; in ksz9477_port_stp_state_set()
404 int forward = dev->member; in ksz9477_port_stp_state_set()
406 ksz_pread8(dev, port, P_STP_CTRL, &data); in ksz9477_port_stp_state_set()
412 if (port != dev->cpu_port) in ksz9477_port_stp_state_set()
417 if (port != dev->cpu_port && in ksz9477_port_stp_state_set()
418 p->stp_state == BR_STATE_DISABLED) in ksz9477_port_stp_state_set()
419 member = dev->host_mask | p->vid_member; in ksz9477_port_stp_state_set()
428 if (port == dev->cpu_port) in ksz9477_port_stp_state_set()
431 member = dev->host_mask | p->vid_member; in ksz9477_port_stp_state_set()
432 mutex_lock(&dev->dev_mutex); in ksz9477_port_stp_state_set()
434 /* Port is a member of a bridge. */ in ksz9477_port_stp_state_set()
435 if (dev->br_member & (1 << port)) { in ksz9477_port_stp_state_set()
436 dev->member |= (1 << port); in ksz9477_port_stp_state_set()
437 member = dev->member; in ksz9477_port_stp_state_set()
439 mutex_unlock(&dev->dev_mutex); in ksz9477_port_stp_state_set()
443 if (port != dev->cpu_port && in ksz9477_port_stp_state_set()
444 p->stp_state == BR_STATE_DISABLED) in ksz9477_port_stp_state_set()
445 member = dev->host_mask | p->vid_member; in ksz9477_port_stp_state_set()
448 dev_err(ds->dev, "invalid STP state: %d\n", state); in ksz9477_port_stp_state_set()
452 ksz_pwrite8(dev, port, P_STP_CTRL, data); in ksz9477_port_stp_state_set()
453 p->stp_state = state; in ksz9477_port_stp_state_set()
454 mutex_lock(&dev->dev_mutex); in ksz9477_port_stp_state_set()
455 /* Port membership may share register with STP state. */ in ksz9477_port_stp_state_set()
456 if (member >= 0 && member != p->member) in ksz9477_port_stp_state_set()
457 ksz9477_cfg_port_member(dev, port, (u8)member); in ksz9477_port_stp_state_set()
461 if (dev->br_member & (1 << port)) in ksz9477_port_stp_state_set()
462 dev->member &= ~(1 << port); in ksz9477_port_stp_state_set()
466 * should be called to modify port forwarding behavior. in ksz9477_port_stp_state_set()
468 if (forward != dev->member) in ksz9477_port_stp_state_set()
469 ksz_update_port_member(dev, port); in ksz9477_port_stp_state_set()
470 mutex_unlock(&dev->dev_mutex); in ksz9477_port_stp_state_set()
473 static void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port) in ksz9477_flush_dyn_mac_table() argument
477 regmap_update_bits(dev->regmap[0], REG_SW_LUE_CTRL_2, in ksz9477_flush_dyn_mac_table()
481 if (port < dev->mib_port_cnt) { in ksz9477_flush_dyn_mac_table()
482 /* flush individual port */ in ksz9477_flush_dyn_mac_table()
483 ksz_pread8(dev, port, P_STP_CTRL, &data); in ksz9477_flush_dyn_mac_table()
485 ksz_pwrite8(dev, port, P_STP_CTRL, in ksz9477_flush_dyn_mac_table()
488 ksz_pwrite8(dev, port, P_STP_CTRL, data); in ksz9477_flush_dyn_mac_table()
495 static int ksz9477_port_vlan_filtering(struct dsa_switch *ds, int port, in ksz9477_port_vlan_filtering() argument
499 struct ksz_device *dev = ds->priv; in ksz9477_port_vlan_filtering()
505 ksz_port_cfg(dev, port, REG_PORT_LUE_CTRL, in ksz9477_port_vlan_filtering()
510 ksz_port_cfg(dev, port, REG_PORT_LUE_CTRL, in ksz9477_port_vlan_filtering()
517 static void ksz9477_port_vlan_add(struct dsa_switch *ds, int port, in ksz9477_port_vlan_add() argument
520 struct ksz_device *dev = ds->priv; in ksz9477_port_vlan_add()
523 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; in ksz9477_port_vlan_add()
525 for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { in ksz9477_port_vlan_add()
527 dev_dbg(dev->dev, "Failed to get vlan table\n"); in ksz9477_port_vlan_add()
533 vlan_table[1] |= BIT(port); in ksz9477_port_vlan_add()
535 vlan_table[1] &= ~BIT(port); in ksz9477_port_vlan_add()
536 vlan_table[1] &= ~(BIT(dev->cpu_port)); in ksz9477_port_vlan_add()
538 vlan_table[2] |= BIT(port) | BIT(dev->cpu_port); in ksz9477_port_vlan_add()
541 dev_dbg(dev->dev, "Failed to set vlan table\n"); in ksz9477_port_vlan_add()
546 if (vlan->flags & BRIDGE_VLAN_INFO_PVID) in ksz9477_port_vlan_add()
547 ksz_pwrite16(dev, port, REG_PORT_DEFAULT_VID, vid); in ksz9477_port_vlan_add()
551 static int ksz9477_port_vlan_del(struct dsa_switch *ds, int port, in ksz9477_port_vlan_del() argument
554 struct ksz_device *dev = ds->priv; in ksz9477_port_vlan_del()
555 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; in ksz9477_port_vlan_del()
560 ksz_pread16(dev, port, REG_PORT_DEFAULT_VID, &pvid); in ksz9477_port_vlan_del()
563 for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { in ksz9477_port_vlan_del()
565 dev_dbg(dev->dev, "Failed to get vlan table\n"); in ksz9477_port_vlan_del()
566 return -ETIMEDOUT; in ksz9477_port_vlan_del()
569 vlan_table[2] &= ~BIT(port); in ksz9477_port_vlan_del()
575 vlan_table[1] &= ~BIT(port); in ksz9477_port_vlan_del()
578 dev_dbg(dev->dev, "Failed to set vlan table\n"); in ksz9477_port_vlan_del()
579 return -ETIMEDOUT; in ksz9477_port_vlan_del()
583 ksz_pwrite16(dev, port, REG_PORT_DEFAULT_VID, pvid); in ksz9477_port_vlan_del()
588 static int ksz9477_port_fdb_add(struct dsa_switch *ds, int port, in ksz9477_port_fdb_add() argument
591 struct ksz_device *dev = ds->priv; in ksz9477_port_fdb_add()
596 mutex_lock(&dev->alu_mutex); in ksz9477_port_fdb_add()
603 data = ((addr[2] << 24) | (addr[3] << 16)); in ksz9477_port_fdb_add()
613 dev_dbg(dev->dev, "Failed to read ALU\n"); in ksz9477_port_fdb_add()
622 alu_table[1] |= BIT(port); in ksz9477_port_fdb_add()
625 alu_table[2] = (vid << ALU_V_FID_S); in ksz9477_port_fdb_add()
626 alu_table[2] |= ((addr[0] << 8) | addr[1]); in ksz9477_port_fdb_add()
627 alu_table[3] = ((addr[2] << 24) | (addr[3] << 16)); in ksz9477_port_fdb_add()
637 dev_dbg(dev->dev, "Failed to write ALU\n"); in ksz9477_port_fdb_add()
640 mutex_unlock(&dev->alu_mutex); in ksz9477_port_fdb_add()
645 static int ksz9477_port_fdb_del(struct dsa_switch *ds, int port, in ksz9477_port_fdb_del() argument
648 struct ksz_device *dev = ds->priv; in ksz9477_port_fdb_del()
653 mutex_lock(&dev->alu_mutex); in ksz9477_port_fdb_del()
660 data = ((addr[2] << 24) | (addr[3] << 16)); in ksz9477_port_fdb_del()
670 dev_dbg(dev->dev, "Failed to read ALU\n"); in ksz9477_port_fdb_del()
677 ksz_read32(dev, REG_SW_ALU_VAL_C, &alu_table[2]); in ksz9477_port_fdb_del()
680 /* clear forwarding port */ in ksz9477_port_fdb_del()
681 alu_table[2] &= ~BIT(port); in ksz9477_port_fdb_del()
683 /* if there is no port to forward, clear table */ in ksz9477_port_fdb_del()
684 if ((alu_table[2] & ALU_V_PORT_MAP) == 0) { in ksz9477_port_fdb_del()
687 alu_table[2] = 0; in ksz9477_port_fdb_del()
693 alu_table[2] = 0; in ksz9477_port_fdb_del()
704 dev_dbg(dev->dev, "Failed to write ALU\n"); in ksz9477_port_fdb_del()
707 mutex_unlock(&dev->alu_mutex); in ksz9477_port_fdb_del()
714 alu->is_static = !!(alu_table[0] & ALU_V_STATIC_VALID); in ksz9477_convert_alu()
715 alu->is_src_filter = !!(alu_table[0] & ALU_V_SRC_FILTER); in ksz9477_convert_alu()
716 alu->is_dst_filter = !!(alu_table[0] & ALU_V_DST_FILTER); in ksz9477_convert_alu()
717 alu->prio_age = (alu_table[0] >> ALU_V_PRIO_AGE_CNT_S) & in ksz9477_convert_alu()
719 alu->mstp = alu_table[0] & ALU_V_MSTP_M; in ksz9477_convert_alu()
721 alu->is_override = !!(alu_table[1] & ALU_V_OVERRIDE); in ksz9477_convert_alu()
722 alu->is_use_fid = !!(alu_table[1] & ALU_V_USE_FID); in ksz9477_convert_alu()
723 alu->port_forward = alu_table[1] & ALU_V_PORT_MAP; in ksz9477_convert_alu()
725 alu->fid = (alu_table[2] >> ALU_V_FID_S) & ALU_V_FID_M; in ksz9477_convert_alu()
727 alu->mac[0] = (alu_table[2] >> 8) & 0xFF; in ksz9477_convert_alu()
728 alu->mac[1] = alu_table[2] & 0xFF; in ksz9477_convert_alu()
729 alu->mac[2] = (alu_table[3] >> 24) & 0xFF; in ksz9477_convert_alu()
730 alu->mac[3] = (alu_table[3] >> 16) & 0xFF; in ksz9477_convert_alu()
731 alu->mac[4] = (alu_table[3] >> 8) & 0xFF; in ksz9477_convert_alu()
732 alu->mac[5] = alu_table[3] & 0xFF; in ksz9477_convert_alu()
735 static int ksz9477_port_fdb_dump(struct dsa_switch *ds, int port, in ksz9477_port_fdb_dump() argument
738 struct ksz_device *dev = ds->priv; in ksz9477_port_fdb_dump()
745 mutex_lock(&dev->alu_mutex); in ksz9477_port_fdb_dump()
757 } while (timeout-- > 0); in ksz9477_port_fdb_dump()
760 dev_dbg(dev->dev, "Failed to search ALU\n"); in ksz9477_port_fdb_dump()
761 ret = -ETIMEDOUT; in ksz9477_port_fdb_dump()
773 if (alu.port_forward & BIT(port)) { in ksz9477_port_fdb_dump()
785 mutex_unlock(&dev->alu_mutex); in ksz9477_port_fdb_dump()
790 static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, in ksz9477_port_mdb_add() argument
793 struct ksz_device *dev = ds->priv; in ksz9477_port_mdb_add()
799 mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]); in ksz9477_port_mdb_add()
800 mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16)); in ksz9477_port_mdb_add()
801 mac_lo |= ((mdb->addr[4] << 8) | mdb->addr[5]); in ksz9477_port_mdb_add()
803 mutex_lock(&dev->alu_mutex); in ksz9477_port_mdb_add()
805 for (index = 0; index < dev->num_statics; index++) { in ksz9477_port_mdb_add()
813 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_add()
822 if (((static_table[2] >> ALU_V_FID_S) == mdb->vid) && in ksz9477_port_mdb_add()
823 ((static_table[2] & ALU_V_MAC_ADDR_HI) == mac_hi) && in ksz9477_port_mdb_add()
835 if (index == dev->num_statics) in ksz9477_port_mdb_add()
840 static_table[1] |= BIT(port); in ksz9477_port_mdb_add()
841 if (mdb->vid) in ksz9477_port_mdb_add()
843 static_table[2] = (mdb->vid << ALU_V_FID_S); in ksz9477_port_mdb_add()
844 static_table[2] |= mac_hi; in ksz9477_port_mdb_add()
854 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_add()
857 mutex_unlock(&dev->alu_mutex); in ksz9477_port_mdb_add()
860 static int ksz9477_port_mdb_del(struct dsa_switch *ds, int port, in ksz9477_port_mdb_del() argument
863 struct ksz_device *dev = ds->priv; in ksz9477_port_mdb_del()
870 mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]); in ksz9477_port_mdb_del()
871 mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16)); in ksz9477_port_mdb_del()
872 mac_lo |= ((mdb->addr[4] << 8) | mdb->addr[5]); in ksz9477_port_mdb_del()
874 mutex_lock(&dev->alu_mutex); in ksz9477_port_mdb_del()
876 for (index = 0; index < dev->num_statics; index++) { in ksz9477_port_mdb_del()
885 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_del()
895 if (((static_table[2] >> ALU_V_FID_S) == mdb->vid) && in ksz9477_port_mdb_del()
896 ((static_table[2] & ALU_V_MAC_ADDR_HI) == mac_hi) && in ksz9477_port_mdb_del()
905 if (index == dev->num_statics) in ksz9477_port_mdb_del()
908 /* clear port */ in ksz9477_port_mdb_del()
909 static_table[1] &= ~BIT(port); in ksz9477_port_mdb_del()
915 static_table[2] = 0; in ksz9477_port_mdb_del()
927 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_del()
930 mutex_unlock(&dev->alu_mutex); in ksz9477_port_mdb_del()
935 static int ksz9477_port_mirror_add(struct dsa_switch *ds, int port, in ksz9477_port_mirror_add() argument
939 struct ksz_device *dev = ds->priv; in ksz9477_port_mirror_add()
942 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true); in ksz9477_port_mirror_add()
944 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true); in ksz9477_port_mirror_add()
946 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false); in ksz9477_port_mirror_add()
948 /* configure mirror port */ in ksz9477_port_mirror_add()
949 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz9477_port_mirror_add()
957 static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port, in ksz9477_port_mirror_del() argument
960 struct ksz_device *dev = ds->priv; in ksz9477_port_mirror_del()
963 if (mirror->ingress) in ksz9477_port_mirror_del()
964 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false); in ksz9477_port_mirror_del()
966 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false); in ksz9477_port_mirror_del()
968 ksz_pread8(dev, port, P_MIRROR_CTRL, &data); in ksz9477_port_mirror_del()
971 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz9477_port_mirror_del()
979 if (dev->features & NEW_XMII) in ksz9477_get_gbit()
988 if (dev->features & NEW_XMII) { in ksz9477_set_gbit()
1005 if (dev->features & NEW_XMII) { in ksz9477_get_xmii()
1014 mode = 2; in ksz9477_get_xmii()
1028 mode = 2; in ksz9477_get_xmii()
1041 if (dev->features & NEW_XMII) { in ksz9477_set_xmii()
1049 case 2: in ksz9477_set_xmii()
1064 case 2: in ksz9477_set_xmii()
1076 static phy_interface_t ksz9477_get_interface(struct ksz_device *dev, int port) in ksz9477_get_interface() argument
1083 if (port < dev->phy_port_cnt) in ksz9477_get_interface()
1085 ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); in ksz9477_get_interface()
1089 case 2: in ksz9477_get_interface()
1114 static void ksz9477_port_mmd_write(struct ksz_device *dev, int port, in ksz9477_port_mmd_write() argument
1117 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_SETUP, in ksz9477_port_mmd_write()
1119 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_INDEX_DATA, reg_addr); in ksz9477_port_mmd_write()
1120 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_SETUP, in ksz9477_port_mmd_write()
1122 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_INDEX_DATA, val); in ksz9477_port_mmd_write()
1125 static void ksz9477_phy_errata_setup(struct ksz_device *dev, int port) in ksz9477_phy_errata_setup() argument
1133 ksz9477_port_mmd_write(dev, port, 0x01, 0x6f, 0xdd0b); in ksz9477_phy_errata_setup()
1134 ksz9477_port_mmd_write(dev, port, 0x01, 0x8f, 0x6032); in ksz9477_phy_errata_setup()
1135 ksz9477_port_mmd_write(dev, port, 0x01, 0x9d, 0x248c); in ksz9477_phy_errata_setup()
1136 ksz9477_port_mmd_write(dev, port, 0x01, 0x75, 0x0060); in ksz9477_phy_errata_setup()
1137 ksz9477_port_mmd_write(dev, port, 0x01, 0xd3, 0x7777); in ksz9477_phy_errata_setup()
1138 ksz9477_port_mmd_write(dev, port, 0x1c, 0x06, 0x3008); in ksz9477_phy_errata_setup()
1139 ksz9477_port_mmd_write(dev, port, 0x1c, 0x08, 0x2001); in ksz9477_phy_errata_setup()
1142 * (1000BASE-T, 100BASE-TX, 10BASE-Te) in ksz9477_phy_errata_setup()
1144 ksz9477_port_mmd_write(dev, port, 0x1c, 0x04, 0x00d0); in ksz9477_phy_errata_setup()
1149 if (dev->features & GBIT_SUPPORT) in ksz9477_phy_errata_setup()
1150 ksz9477_port_mmd_write(dev, port, 0x07, 0x3c, 0x0000); in ksz9477_phy_errata_setup()
1155 ksz9477_port_mmd_write(dev, port, 0x1c, 0x13, 0x6eff); in ksz9477_phy_errata_setup()
1156 ksz9477_port_mmd_write(dev, port, 0x1c, 0x14, 0xe6ff); in ksz9477_phy_errata_setup()
1157 ksz9477_port_mmd_write(dev, port, 0x1c, 0x15, 0x6eff); in ksz9477_phy_errata_setup()
1158 ksz9477_port_mmd_write(dev, port, 0x1c, 0x16, 0xe6ff); in ksz9477_phy_errata_setup()
1159 ksz9477_port_mmd_write(dev, port, 0x1c, 0x17, 0x00ff); in ksz9477_phy_errata_setup()
1160 ksz9477_port_mmd_write(dev, port, 0x1c, 0x18, 0x43ff); in ksz9477_phy_errata_setup()
1161 ksz9477_port_mmd_write(dev, port, 0x1c, 0x19, 0xc3ff); in ksz9477_phy_errata_setup()
1162 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1a, 0x6fff); in ksz9477_phy_errata_setup()
1163 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1b, 0x07ff); in ksz9477_phy_errata_setup()
1164 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1c, 0x0fff); in ksz9477_phy_errata_setup()
1165 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1d, 0xe7ff); in ksz9477_phy_errata_setup()
1166 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1e, 0xefff); in ksz9477_phy_errata_setup()
1167 ksz9477_port_mmd_write(dev, port, 0x1c, 0x20, 0xeeee); in ksz9477_phy_errata_setup()
1170 static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) in ksz9477_port_setup() argument
1175 struct ksz_port *p = &dev->ports[port]; in ksz9477_port_setup()
1177 /* enable tag tail for host port */ in ksz9477_port_setup()
1179 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, PORT_TAIL_TAG_ENABLE, in ksz9477_port_setup()
1182 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, PORT_MAC_LOOPBACK, false); in ksz9477_port_setup()
1185 ksz_port_cfg(dev, port, REG_PORT_MAC_CTRL_1, PORT_BACK_PRESSURE, true); in ksz9477_port_setup()
1188 ksz_port_cfg(dev, port, P_BCAST_STORM_CTRL, PORT_BROADCAST_STORM, true); in ksz9477_port_setup()
1191 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_DIFFSERV_PRIO_ENABLE, false); in ksz9477_port_setup()
1194 ksz_port_cfg(dev, port, REG_PORT_MRI_MAC_CTRL, PORT_USER_PRIO_CEILING, in ksz9477_port_setup()
1196 ksz9477_port_cfg32(dev, port, REG_PORT_MTI_QUEUE_CTRL_0__4, in ksz9477_port_setup()
1200 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_PRIO_ENABLE, true); in ksz9477_port_setup()
1202 if (port < dev->phy_port_cnt) { in ksz9477_port_setup()
1204 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, in ksz9477_port_setup()
1208 if (dev->phy_errata_9477) in ksz9477_port_setup()
1209 ksz9477_phy_errata_setup(dev, port); in ksz9477_port_setup()
1212 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, in ksz9477_port_setup()
1217 ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); in ksz9477_port_setup()
1218 switch (p->interface) { in ksz9477_port_setup()
1222 p->phydev.speed = SPEED_100; in ksz9477_port_setup()
1227 p->phydev.speed = SPEED_100; in ksz9477_port_setup()
1230 ksz9477_set_xmii(dev, 2, &data8); in ksz9477_port_setup()
1232 p->phydev.speed = SPEED_1000; in ksz9477_port_setup()
1239 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || in ksz9477_port_setup()
1240 p->interface == PHY_INTERFACE_MODE_RGMII_RXID) in ksz9477_port_setup()
1242 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || in ksz9477_port_setup()
1243 p->interface == PHY_INTERFACE_MODE_RGMII_TXID) in ksz9477_port_setup()
1245 /* On KSZ9893, disable RGMII in-band status support */ in ksz9477_port_setup()
1246 if (dev->features & IS_9893) in ksz9477_port_setup()
1248 p->phydev.speed = SPEED_1000; in ksz9477_port_setup()
1251 ksz_pwrite8(dev, port, REG_PORT_XMII_CTRL_1, data8); in ksz9477_port_setup()
1252 p->phydev.duplex = 1; in ksz9477_port_setup()
1254 mutex_lock(&dev->dev_mutex); in ksz9477_port_setup()
1256 member = dev->port_mask; in ksz9477_port_setup()
1258 member = dev->host_mask | p->vid_member; in ksz9477_port_setup()
1259 mutex_unlock(&dev->dev_mutex); in ksz9477_port_setup()
1260 ksz9477_cfg_port_member(dev, port, member); in ksz9477_port_setup()
1263 if (port < dev->phy_port_cnt) in ksz9477_port_setup()
1264 ksz_pread16(dev, port, REG_PORT_PHY_INT_ENABLE, &data16); in ksz9477_port_setup()
1269 struct ksz_device *dev = ds->priv; in ksz9477_config_cpu_port()
1273 ds->num_ports = dev->port_cnt; in ksz9477_config_cpu_port()
1275 for (i = 0; i < dev->port_cnt; i++) { in ksz9477_config_cpu_port()
1276 if (dsa_is_cpu_port(ds, i) && (dev->cpu_ports & (1 << i))) { in ksz9477_config_cpu_port()
1281 dev->cpu_port = i; in ksz9477_config_cpu_port()
1282 dev->host_mask = (1 << dev->cpu_port); in ksz9477_config_cpu_port()
1283 dev->port_mask |= dev->host_mask; in ksz9477_config_cpu_port()
1284 p = &dev->ports[i]; in ksz9477_config_cpu_port()
1286 /* Read from XMII register to determine host port in ksz9477_config_cpu_port()
1291 if (!p->interface) { in ksz9477_config_cpu_port()
1292 if (dev->compat_interface) { in ksz9477_config_cpu_port()
1293 dev_warn(dev->dev, in ksz9477_config_cpu_port()
1294 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. " in ksz9477_config_cpu_port()
1297 p->interface = dev->compat_interface; in ksz9477_config_cpu_port()
1299 p->interface = interface; in ksz9477_config_cpu_port()
1302 if (interface && interface != p->interface) { in ksz9477_config_cpu_port()
1309 dev_info(dev->dev, in ksz9477_config_cpu_port()
1310 "Port%d: using phy mode %s%s%s\n", in ksz9477_config_cpu_port()
1312 phy_modes(p->interface), in ksz9477_config_cpu_port()
1316 /* enable cpu port */ in ksz9477_config_cpu_port()
1318 p->vid_member = dev->port_mask; in ksz9477_config_cpu_port()
1319 p->on = 1; in ksz9477_config_cpu_port()
1323 dev->member = dev->host_mask; in ksz9477_config_cpu_port()
1325 for (i = 0; i < dev->mib_port_cnt; i++) { in ksz9477_config_cpu_port()
1326 if (i == dev->cpu_port) in ksz9477_config_cpu_port()
1328 p = &dev->ports[i]; in ksz9477_config_cpu_port()
1330 /* Initialize to non-zero so that ksz_cfg_port_member() will in ksz9477_config_cpu_port()
1333 p->vid_member = (1 << i); in ksz9477_config_cpu_port()
1334 p->member = dev->port_mask; in ksz9477_config_cpu_port()
1336 p->on = 1; in ksz9477_config_cpu_port()
1337 if (i < dev->phy_port_cnt) in ksz9477_config_cpu_port()
1338 p->phy = 1; in ksz9477_config_cpu_port()
1339 if (dev->chip_id == 0x00947700 && i == 6) { in ksz9477_config_cpu_port()
1340 p->sgmii = 1; in ksz9477_config_cpu_port()
1343 p->phy = 0; in ksz9477_config_cpu_port()
1350 struct ksz_device *dev = ds->priv; in ksz9477_setup()
1353 dev->vlan_cache = devm_kcalloc(dev->dev, sizeof(struct vlan_table), in ksz9477_setup()
1354 dev->num_vlans, GFP_KERNEL); in ksz9477_setup()
1355 if (!dev->vlan_cache) in ksz9477_setup()
1356 return -ENOMEM; in ksz9477_setup()
1360 dev_err(ds->dev, "failed to reset switch\n"); in ksz9477_setup()
1364 /* Required for port partitioning. */ in ksz9477_setup()
1420 static u32 ksz9477_get_port_addr(int port, int offset) in ksz9477_get_port_addr() argument
1422 return PORT_CTRL_ADDR(port, offset); in ksz9477_get_port_addr()
1452 dev->mib_port_cnt = TOTAL_PORT_NUM; in ksz9477_switch_detect()
1453 dev->phy_port_cnt = 5; in ksz9477_switch_detect()
1456 dev->features = GBIT_SUPPORT; in ksz9477_switch_detect()
1458 dev_dbg(dev->dev, "Switch detect: ID=%08x%02x\n", id32, data8); in ksz9477_switch_detect()
1463 dev_info(dev->dev, "Found KSZ9893\n"); in ksz9477_switch_detect()
1464 dev->features |= IS_9893; in ksz9477_switch_detect()
1468 dev->features &= ~GBIT_SUPPORT; in ksz9477_switch_detect()
1469 dev->mib_port_cnt = 3; in ksz9477_switch_detect()
1470 dev->phy_port_cnt = 2; in ksz9477_switch_detect()
1472 dev_info(dev->dev, "Found KSZ9477 or compatible\n"); in ksz9477_switch_detect()
1474 dev->features |= NEW_XMII; in ksz9477_switch_detect()
1478 dev->features &= ~GBIT_SUPPORT; in ksz9477_switch_detect()
1484 dev->chip_id = id32; in ksz9477_switch_detect()
1507 .cpu_ports = 0x7F, /* can be configured as cpu port */
1508 .port_cnt = 7, /* total physical port count */
1517 .cpu_ports = 0x7F, /* can be configured as cpu port */
1518 .port_cnt = 7, /* total physical port count */
1527 .cpu_ports = 0x07, /* can be configured as cpu port */
1528 .port_cnt = 3, /* total port count */
1536 .cpu_ports = 0x7F, /* can be configured as cpu port */
1537 .port_cnt = 7, /* total physical port count */
1546 dev->ds->ops = &ksz9477_switch_ops; in ksz9477_switch_init()
1551 if (dev->chip_id == chip->chip_id) { in ksz9477_switch_init()
1552 dev->name = chip->dev_name; in ksz9477_switch_init()
1553 dev->num_vlans = chip->num_vlans; in ksz9477_switch_init()
1554 dev->num_alus = chip->num_alus; in ksz9477_switch_init()
1555 dev->num_statics = chip->num_statics; in ksz9477_switch_init()
1556 dev->port_cnt = chip->port_cnt; in ksz9477_switch_init()
1557 dev->cpu_ports = chip->cpu_ports; in ksz9477_switch_init()
1558 dev->phy_errata_9477 = chip->phy_errata_9477; in ksz9477_switch_init()
1565 if (!dev->port_cnt) in ksz9477_switch_init()
1566 return -ENODEV; in ksz9477_switch_init()
1568 dev->port_mask = (1 << dev->port_cnt) - 1; in ksz9477_switch_init()
1570 dev->reg_mib_cnt = SWITCH_COUNTER_NUM; in ksz9477_switch_init()
1571 dev->mib_cnt = TOTAL_SWITCH_COUNTER_NUM; in ksz9477_switch_init()
1573 i = dev->mib_port_cnt; in ksz9477_switch_init()
1574 dev->ports = devm_kzalloc(dev->dev, sizeof(struct ksz_port) * i, in ksz9477_switch_init()
1576 if (!dev->ports) in ksz9477_switch_init()
1577 return -ENOMEM; in ksz9477_switch_init()
1578 for (i = 0; i < dev->mib_port_cnt; i++) { in ksz9477_switch_init()
1579 mutex_init(&dev->ports[i].mib.cnt_mutex); in ksz9477_switch_init()
1580 dev->ports[i].mib.counters = in ksz9477_switch_init()
1581 devm_kzalloc(dev->dev, in ksz9477_switch_init()
1585 if (!dev->ports[i].mib.counters) in ksz9477_switch_init()
1586 return -ENOMEM; in ksz9477_switch_init()
1590 dev->ds->num_ports = dev->port_cnt; in ksz9477_switch_init()
1624 for (i = 0; i < dev->phy_port_cnt; ++i) { in ksz9477_switch_register()
1625 if (!dsa_is_user_port(dev->ds, i)) in ksz9477_switch_register()
1628 phydev = dsa_to_port(dev->ds, i)->slave->phydev; in ksz9477_switch_register()
1630 /* The MAC actually cannot run in 1000 half-duplex mode. */ in ksz9477_switch_register()
1635 if (!(dev->features & GBIT_SUPPORT)) in ksz9477_switch_register()