• Home
  • Raw
  • Download

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()
770 if (alu.port_forward & BIT(port)) { in ksz9477_port_fdb_dump()
782 mutex_unlock(&dev->alu_mutex); in ksz9477_port_fdb_dump()
787 static void ksz9477_port_mdb_add(struct dsa_switch *ds, int port, in ksz9477_port_mdb_add() argument
790 struct ksz_device *dev = ds->priv; in ksz9477_port_mdb_add()
796 mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]); in ksz9477_port_mdb_add()
797 mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16)); in ksz9477_port_mdb_add()
798 mac_lo |= ((mdb->addr[4] << 8) | mdb->addr[5]); in ksz9477_port_mdb_add()
800 mutex_lock(&dev->alu_mutex); in ksz9477_port_mdb_add()
802 for (index = 0; index < dev->num_statics; index++) { in ksz9477_port_mdb_add()
810 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_add()
819 if (((static_table[2] >> ALU_V_FID_S) == mdb->vid) && in ksz9477_port_mdb_add()
820 ((static_table[2] & ALU_V_MAC_ADDR_HI) == mac_hi) && in ksz9477_port_mdb_add()
832 if (index == dev->num_statics) in ksz9477_port_mdb_add()
837 static_table[1] |= BIT(port); in ksz9477_port_mdb_add()
838 if (mdb->vid) in ksz9477_port_mdb_add()
840 static_table[2] = (mdb->vid << ALU_V_FID_S); in ksz9477_port_mdb_add()
841 static_table[2] |= mac_hi; in ksz9477_port_mdb_add()
851 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_add()
854 mutex_unlock(&dev->alu_mutex); in ksz9477_port_mdb_add()
857 static int ksz9477_port_mdb_del(struct dsa_switch *ds, int port, in ksz9477_port_mdb_del() argument
860 struct ksz_device *dev = ds->priv; in ksz9477_port_mdb_del()
867 mac_hi = ((mdb->addr[0] << 8) | mdb->addr[1]); in ksz9477_port_mdb_del()
868 mac_lo = ((mdb->addr[2] << 24) | (mdb->addr[3] << 16)); in ksz9477_port_mdb_del()
869 mac_lo |= ((mdb->addr[4] << 8) | mdb->addr[5]); in ksz9477_port_mdb_del()
871 mutex_lock(&dev->alu_mutex); in ksz9477_port_mdb_del()
873 for (index = 0; index < dev->num_statics; index++) { in ksz9477_port_mdb_del()
882 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_del()
892 if (((static_table[2] >> ALU_V_FID_S) == mdb->vid) && in ksz9477_port_mdb_del()
893 ((static_table[2] & ALU_V_MAC_ADDR_HI) == mac_hi) && in ksz9477_port_mdb_del()
902 if (index == dev->num_statics) in ksz9477_port_mdb_del()
905 /* clear port */ in ksz9477_port_mdb_del()
906 static_table[1] &= ~BIT(port); in ksz9477_port_mdb_del()
912 static_table[2] = 0; in ksz9477_port_mdb_del()
924 dev_dbg(dev->dev, "Failed to read ALU STATIC\n"); in ksz9477_port_mdb_del()
927 mutex_unlock(&dev->alu_mutex); in ksz9477_port_mdb_del()
932 static int ksz9477_port_mirror_add(struct dsa_switch *ds, int port, in ksz9477_port_mirror_add() argument
936 struct ksz_device *dev = ds->priv; in ksz9477_port_mirror_add()
939 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true); in ksz9477_port_mirror_add()
941 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true); in ksz9477_port_mirror_add()
943 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false); in ksz9477_port_mirror_add()
945 /* configure mirror port */ in ksz9477_port_mirror_add()
946 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz9477_port_mirror_add()
954 static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port, in ksz9477_port_mirror_del() argument
957 struct ksz_device *dev = ds->priv; in ksz9477_port_mirror_del()
960 if (mirror->ingress) in ksz9477_port_mirror_del()
961 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false); in ksz9477_port_mirror_del()
963 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false); in ksz9477_port_mirror_del()
965 ksz_pread8(dev, port, P_MIRROR_CTRL, &data); in ksz9477_port_mirror_del()
968 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz9477_port_mirror_del()
976 if (dev->features & NEW_XMII) in ksz9477_get_gbit()
985 if (dev->features & NEW_XMII) { in ksz9477_set_gbit()
1002 if (dev->features & NEW_XMII) { in ksz9477_get_xmii()
1011 mode = 2; in ksz9477_get_xmii()
1025 mode = 2; in ksz9477_get_xmii()
1038 if (dev->features & NEW_XMII) { in ksz9477_set_xmii()
1046 case 2: in ksz9477_set_xmii()
1061 case 2: in ksz9477_set_xmii()
1073 static phy_interface_t ksz9477_get_interface(struct ksz_device *dev, int port) in ksz9477_get_interface() argument
1080 if (port < dev->phy_port_cnt) in ksz9477_get_interface()
1082 ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); in ksz9477_get_interface()
1086 case 2: in ksz9477_get_interface()
1111 static void ksz9477_port_mmd_write(struct ksz_device *dev, int port, in ksz9477_port_mmd_write() argument
1114 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_SETUP, in ksz9477_port_mmd_write()
1116 ksz_pwrite16(dev, port, REG_PORT_PHY_MMD_INDEX_DATA, reg_addr); in ksz9477_port_mmd_write()
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, val); in ksz9477_port_mmd_write()
1122 static void ksz9477_phy_errata_setup(struct ksz_device *dev, int port) in ksz9477_phy_errata_setup() argument
1130 ksz9477_port_mmd_write(dev, port, 0x01, 0x6f, 0xdd0b); in ksz9477_phy_errata_setup()
1131 ksz9477_port_mmd_write(dev, port, 0x01, 0x8f, 0x6032); in ksz9477_phy_errata_setup()
1132 ksz9477_port_mmd_write(dev, port, 0x01, 0x9d, 0x248c); in ksz9477_phy_errata_setup()
1133 ksz9477_port_mmd_write(dev, port, 0x01, 0x75, 0x0060); in ksz9477_phy_errata_setup()
1134 ksz9477_port_mmd_write(dev, port, 0x01, 0xd3, 0x7777); in ksz9477_phy_errata_setup()
1135 ksz9477_port_mmd_write(dev, port, 0x1c, 0x06, 0x3008); in ksz9477_phy_errata_setup()
1136 ksz9477_port_mmd_write(dev, port, 0x1c, 0x08, 0x2001); in ksz9477_phy_errata_setup()
1139 * (1000BASE-T, 100BASE-TX, 10BASE-Te) in ksz9477_phy_errata_setup()
1141 ksz9477_port_mmd_write(dev, port, 0x1c, 0x04, 0x00d0); in ksz9477_phy_errata_setup()
1146 if (dev->features & GBIT_SUPPORT) in ksz9477_phy_errata_setup()
1147 ksz9477_port_mmd_write(dev, port, 0x07, 0x3c, 0x0000); in ksz9477_phy_errata_setup()
1152 ksz9477_port_mmd_write(dev, port, 0x1c, 0x13, 0x6eff); in ksz9477_phy_errata_setup()
1153 ksz9477_port_mmd_write(dev, port, 0x1c, 0x14, 0xe6ff); in ksz9477_phy_errata_setup()
1154 ksz9477_port_mmd_write(dev, port, 0x1c, 0x15, 0x6eff); in ksz9477_phy_errata_setup()
1155 ksz9477_port_mmd_write(dev, port, 0x1c, 0x16, 0xe6ff); in ksz9477_phy_errata_setup()
1156 ksz9477_port_mmd_write(dev, port, 0x1c, 0x17, 0x00ff); in ksz9477_phy_errata_setup()
1157 ksz9477_port_mmd_write(dev, port, 0x1c, 0x18, 0x43ff); in ksz9477_phy_errata_setup()
1158 ksz9477_port_mmd_write(dev, port, 0x1c, 0x19, 0xc3ff); in ksz9477_phy_errata_setup()
1159 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1a, 0x6fff); in ksz9477_phy_errata_setup()
1160 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1b, 0x07ff); in ksz9477_phy_errata_setup()
1161 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1c, 0x0fff); in ksz9477_phy_errata_setup()
1162 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1d, 0xe7ff); in ksz9477_phy_errata_setup()
1163 ksz9477_port_mmd_write(dev, port, 0x1c, 0x1e, 0xefff); in ksz9477_phy_errata_setup()
1164 ksz9477_port_mmd_write(dev, port, 0x1c, 0x20, 0xeeee); in ksz9477_phy_errata_setup()
1167 static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) in ksz9477_port_setup() argument
1172 struct ksz_port *p = &dev->ports[port]; in ksz9477_port_setup()
1174 /* enable tag tail for host port */ in ksz9477_port_setup()
1176 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, PORT_TAIL_TAG_ENABLE, in ksz9477_port_setup()
1179 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, PORT_MAC_LOOPBACK, false); in ksz9477_port_setup()
1182 ksz_port_cfg(dev, port, REG_PORT_MAC_CTRL_1, PORT_BACK_PRESSURE, true); in ksz9477_port_setup()
1185 ksz_port_cfg(dev, port, P_BCAST_STORM_CTRL, PORT_BROADCAST_STORM, true); in ksz9477_port_setup()
1188 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_DIFFSERV_PRIO_ENABLE, false); in ksz9477_port_setup()
1191 ksz_port_cfg(dev, port, REG_PORT_MRI_MAC_CTRL, PORT_USER_PRIO_CEILING, in ksz9477_port_setup()
1193 ksz9477_port_cfg32(dev, port, REG_PORT_MTI_QUEUE_CTRL_0__4, in ksz9477_port_setup()
1197 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_PRIO_ENABLE, true); in ksz9477_port_setup()
1199 if (port < dev->phy_port_cnt) { in ksz9477_port_setup()
1201 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, in ksz9477_port_setup()
1205 if (dev->phy_errata_9477) in ksz9477_port_setup()
1206 ksz9477_phy_errata_setup(dev, port); in ksz9477_port_setup()
1209 ksz_port_cfg(dev, port, REG_PORT_CTRL_0, in ksz9477_port_setup()
1214 ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); in ksz9477_port_setup()
1215 switch (p->interface) { in ksz9477_port_setup()
1219 p->phydev.speed = SPEED_100; in ksz9477_port_setup()
1224 p->phydev.speed = SPEED_100; in ksz9477_port_setup()
1227 ksz9477_set_xmii(dev, 2, &data8); in ksz9477_port_setup()
1229 p->phydev.speed = SPEED_1000; in ksz9477_port_setup()
1236 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || in ksz9477_port_setup()
1237 p->interface == PHY_INTERFACE_MODE_RGMII_RXID) in ksz9477_port_setup()
1239 if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || in ksz9477_port_setup()
1240 p->interface == PHY_INTERFACE_MODE_RGMII_TXID) in ksz9477_port_setup()
1242 /* On KSZ9893, disable RGMII in-band status support */ in ksz9477_port_setup()
1243 if (dev->features & IS_9893) in ksz9477_port_setup()
1245 p->phydev.speed = SPEED_1000; in ksz9477_port_setup()
1248 ksz_pwrite8(dev, port, REG_PORT_XMII_CTRL_1, data8); in ksz9477_port_setup()
1249 p->phydev.duplex = 1; in ksz9477_port_setup()
1251 mutex_lock(&dev->dev_mutex); in ksz9477_port_setup()
1253 member = dev->port_mask; in ksz9477_port_setup()
1255 member = dev->host_mask | p->vid_member; in ksz9477_port_setup()
1256 mutex_unlock(&dev->dev_mutex); in ksz9477_port_setup()
1257 ksz9477_cfg_port_member(dev, port, member); in ksz9477_port_setup()
1260 if (port < dev->phy_port_cnt) in ksz9477_port_setup()
1261 ksz_pread16(dev, port, REG_PORT_PHY_INT_ENABLE, &data16); in ksz9477_port_setup()
1266 struct ksz_device *dev = ds->priv; in ksz9477_config_cpu_port()
1270 ds->num_ports = dev->port_cnt; in ksz9477_config_cpu_port()
1272 for (i = 0; i < dev->port_cnt; i++) { in ksz9477_config_cpu_port()
1273 if (dsa_is_cpu_port(ds, i) && (dev->cpu_ports & (1 << i))) { in ksz9477_config_cpu_port()
1278 dev->cpu_port = i; in ksz9477_config_cpu_port()
1279 dev->host_mask = (1 << dev->cpu_port); in ksz9477_config_cpu_port()
1280 dev->port_mask |= dev->host_mask; in ksz9477_config_cpu_port()
1281 p = &dev->ports[i]; in ksz9477_config_cpu_port()
1283 /* Read from XMII register to determine host port in ksz9477_config_cpu_port()
1288 if (!p->interface) { in ksz9477_config_cpu_port()
1289 if (dev->compat_interface) { in ksz9477_config_cpu_port()
1290 dev_warn(dev->dev, in ksz9477_config_cpu_port()
1291 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. " in ksz9477_config_cpu_port()
1294 p->interface = dev->compat_interface; in ksz9477_config_cpu_port()
1296 p->interface = interface; in ksz9477_config_cpu_port()
1299 if (interface && interface != p->interface) { in ksz9477_config_cpu_port()
1306 dev_info(dev->dev, in ksz9477_config_cpu_port()
1307 "Port%d: using phy mode %s%s%s\n", in ksz9477_config_cpu_port()
1309 phy_modes(p->interface), in ksz9477_config_cpu_port()
1313 /* enable cpu port */ in ksz9477_config_cpu_port()
1315 p->vid_member = dev->port_mask; in ksz9477_config_cpu_port()
1316 p->on = 1; in ksz9477_config_cpu_port()
1320 dev->member = dev->host_mask; in ksz9477_config_cpu_port()
1322 for (i = 0; i < dev->mib_port_cnt; i++) { in ksz9477_config_cpu_port()
1323 if (i == dev->cpu_port) in ksz9477_config_cpu_port()
1325 p = &dev->ports[i]; in ksz9477_config_cpu_port()
1327 /* Initialize to non-zero so that ksz_cfg_port_member() will in ksz9477_config_cpu_port()
1330 p->vid_member = (1 << i); in ksz9477_config_cpu_port()
1331 p->member = dev->port_mask; in ksz9477_config_cpu_port()
1333 p->on = 1; in ksz9477_config_cpu_port()
1334 if (i < dev->phy_port_cnt) in ksz9477_config_cpu_port()
1335 p->phy = 1; in ksz9477_config_cpu_port()
1336 if (dev->chip_id == 0x00947700 && i == 6) { in ksz9477_config_cpu_port()
1337 p->sgmii = 1; in ksz9477_config_cpu_port()
1340 p->phy = 0; in ksz9477_config_cpu_port()
1347 struct ksz_device *dev = ds->priv; in ksz9477_setup()
1350 dev->vlan_cache = devm_kcalloc(dev->dev, sizeof(struct vlan_table), in ksz9477_setup()
1351 dev->num_vlans, GFP_KERNEL); in ksz9477_setup()
1352 if (!dev->vlan_cache) in ksz9477_setup()
1353 return -ENOMEM; in ksz9477_setup()
1357 dev_err(ds->dev, "failed to reset switch\n"); in ksz9477_setup()
1361 /* Required for port partitioning. */ in ksz9477_setup()
1417 static u32 ksz9477_get_port_addr(int port, int offset) in ksz9477_get_port_addr() argument
1419 return PORT_CTRL_ADDR(port, offset); in ksz9477_get_port_addr()
1449 dev->mib_port_cnt = TOTAL_PORT_NUM; in ksz9477_switch_detect()
1450 dev->phy_port_cnt = 5; in ksz9477_switch_detect()
1453 dev->features = GBIT_SUPPORT; in ksz9477_switch_detect()
1455 dev_dbg(dev->dev, "Switch detect: ID=%08x%02x\n", id32, data8); in ksz9477_switch_detect()
1460 dev_info(dev->dev, "Found KSZ9893\n"); in ksz9477_switch_detect()
1461 dev->features |= IS_9893; in ksz9477_switch_detect()
1465 dev->features &= ~GBIT_SUPPORT; in ksz9477_switch_detect()
1466 dev->mib_port_cnt = 3; in ksz9477_switch_detect()
1467 dev->phy_port_cnt = 2; in ksz9477_switch_detect()
1469 dev_info(dev->dev, "Found KSZ9477 or compatible\n"); in ksz9477_switch_detect()
1471 dev->features |= NEW_XMII; in ksz9477_switch_detect()
1475 dev->features &= ~GBIT_SUPPORT; in ksz9477_switch_detect()
1481 dev->chip_id = id32; in ksz9477_switch_detect()
1504 .cpu_ports = 0x7F, /* can be configured as cpu port */
1505 .port_cnt = 7, /* total physical port count */
1514 .cpu_ports = 0x7F, /* can be configured as cpu port */
1515 .port_cnt = 7, /* total physical port count */
1524 .cpu_ports = 0x07, /* can be configured as cpu port */
1525 .port_cnt = 3, /* total port count */
1533 .cpu_ports = 0x7F, /* can be configured as cpu port */
1534 .port_cnt = 7, /* total physical port count */
1543 dev->ds->ops = &ksz9477_switch_ops; in ksz9477_switch_init()
1548 if (dev->chip_id == chip->chip_id) { in ksz9477_switch_init()
1549 dev->name = chip->dev_name; in ksz9477_switch_init()
1550 dev->num_vlans = chip->num_vlans; in ksz9477_switch_init()
1551 dev->num_alus = chip->num_alus; in ksz9477_switch_init()
1552 dev->num_statics = chip->num_statics; in ksz9477_switch_init()
1553 dev->port_cnt = chip->port_cnt; in ksz9477_switch_init()
1554 dev->cpu_ports = chip->cpu_ports; in ksz9477_switch_init()
1555 dev->phy_errata_9477 = chip->phy_errata_9477; in ksz9477_switch_init()
1562 if (!dev->port_cnt) in ksz9477_switch_init()
1563 return -ENODEV; in ksz9477_switch_init()
1565 dev->port_mask = (1 << dev->port_cnt) - 1; in ksz9477_switch_init()
1567 dev->reg_mib_cnt = SWITCH_COUNTER_NUM; in ksz9477_switch_init()
1568 dev->mib_cnt = TOTAL_SWITCH_COUNTER_NUM; in ksz9477_switch_init()
1570 i = dev->mib_port_cnt; in ksz9477_switch_init()
1571 dev->ports = devm_kzalloc(dev->dev, sizeof(struct ksz_port) * i, in ksz9477_switch_init()
1573 if (!dev->ports) in ksz9477_switch_init()
1574 return -ENOMEM; in ksz9477_switch_init()
1575 for (i = 0; i < dev->mib_port_cnt; i++) { in ksz9477_switch_init()
1576 mutex_init(&dev->ports[i].mib.cnt_mutex); in ksz9477_switch_init()
1577 dev->ports[i].mib.counters = in ksz9477_switch_init()
1578 devm_kzalloc(dev->dev, in ksz9477_switch_init()
1582 if (!dev->ports[i].mib.counters) in ksz9477_switch_init()
1583 return -ENOMEM; in ksz9477_switch_init()
1587 dev->ds->num_ports = dev->port_cnt; in ksz9477_switch_init()
1621 for (i = 0; i < dev->phy_port_cnt; ++i) { in ksz9477_switch_register()
1622 if (!dsa_is_user_port(dev->ds, i)) in ksz9477_switch_register()
1625 phydev = dsa_to_port(dev->ds, i)->slave->phydev; in ksz9477_switch_register()
1627 /* The MAC actually cannot run in 1000 half-duplex mode. */ in ksz9477_switch_register()
1632 if (!(dev->features & GBIT_SUPPORT)) in ksz9477_switch_register()