Lines Matching refs:dev

29 static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)  in ksz_cfg()  argument
31 regmap_update_bits(ksz_regmap_8(dev), addr, bits, set ? bits : 0); in ksz_cfg()
34 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits, in ksz_port_cfg() argument
37 regmap_update_bits(ksz_regmap_8(dev), PORT_CTRL_ADDR(port, offset), in ksz_port_cfg()
41 static int ksz8_ind_write8(struct ksz_device *dev, u8 table, u16 addr, u8 data) in ksz8_ind_write8() argument
47 regs = dev->info->regs; in ksz8_ind_write8()
49 mutex_lock(&dev->alu_mutex); in ksz8_ind_write8()
52 ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8_ind_write8()
54 ret = ksz_write8(dev, regs[REG_IND_BYTE], data); in ksz8_ind_write8()
56 mutex_unlock(&dev->alu_mutex); in ksz8_ind_write8()
61 int ksz8_reset_switch(struct ksz_device *dev) in ksz8_reset_switch() argument
63 if (ksz_is_ksz88x3(dev)) { in ksz8_reset_switch()
65 ksz_cfg(dev, KSZ8863_REG_SW_RESET, in ksz8_reset_switch()
67 ksz_cfg(dev, KSZ8863_REG_SW_RESET, in ksz8_reset_switch()
71 ksz_write8(dev, REG_POWER_MANAGEMENT_1, in ksz8_reset_switch()
73 ksz_write8(dev, REG_POWER_MANAGEMENT_1, 0); in ksz8_reset_switch()
79 static int ksz8863_change_mtu(struct ksz_device *dev, int frame_size) in ksz8863_change_mtu() argument
88 return ksz_rmw8(dev, REG_SW_CTRL_2, KSZ8863_LEGAL_PACKET_ENABLE | in ksz8863_change_mtu()
92 static int ksz8795_change_mtu(struct ksz_device *dev, int frame_size) in ksz8795_change_mtu() argument
102 ret = ksz_rmw8(dev, REG_SW_CTRL_1, SW_HUGE_PACKET, ctrl1); in ksz8795_change_mtu()
106 return ksz_rmw8(dev, REG_SW_CTRL_2, SW_LEGAL_PACKET_DISABLE, ctrl2); in ksz8795_change_mtu()
109 int ksz8_change_mtu(struct ksz_device *dev, int port, int mtu) in ksz8_change_mtu() argument
113 if (!dsa_is_cpu_port(dev->ds, port)) in ksz8_change_mtu()
118 switch (dev->chip_id) { in ksz8_change_mtu()
122 return ksz8795_change_mtu(dev, frame_size); in ksz8_change_mtu()
124 return ksz8863_change_mtu(dev, frame_size); in ksz8_change_mtu()
130 static void ksz8795_set_prio_queue(struct ksz_device *dev, int port, int queue) in ksz8795_set_prio_queue() argument
146 ksz_pread8(dev, port, REG_PORT_CTRL_0, &lo); in ksz8795_set_prio_queue()
147 ksz_pread8(dev, port, P_DROP_TAG_CTRL, &hi); in ksz8795_set_prio_queue()
154 ksz_pwrite8(dev, port, REG_PORT_CTRL_0, lo); in ksz8795_set_prio_queue()
155 ksz_pwrite8(dev, port, P_DROP_TAG_CTRL, hi); in ksz8795_set_prio_queue()
159 ksz_cfg(dev, REG_SW_CTRL_19, SW_OUT_RATE_LIMIT_QUEUE_BASED, in ksz8795_set_prio_queue()
163 void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt) in ksz8_r_mib_cnt() argument
172 masks = dev->info->masks; in ksz8_r_mib_cnt()
173 regs = dev->info->regs; in ksz8_r_mib_cnt()
175 ctrl_addr = addr + dev->info->reg_mib_cnt * port; in ksz8_r_mib_cnt()
178 mutex_lock(&dev->alu_mutex); in ksz8_r_mib_cnt()
179 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8_r_mib_cnt()
185 ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check); in ksz8_r_mib_cnt()
188 ksz_read32(dev, regs[REG_IND_DATA_LO], &data); in ksz8_r_mib_cnt()
195 mutex_unlock(&dev->alu_mutex); in ksz8_r_mib_cnt()
198 static void ksz8795_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, in ksz8795_r_mib_pkt() argument
208 masks = dev->info->masks; in ksz8795_r_mib_pkt()
209 regs = dev->info->regs; in ksz8795_r_mib_pkt()
211 addr -= dev->info->reg_mib_cnt; in ksz8795_r_mib_pkt()
216 mutex_lock(&dev->alu_mutex); in ksz8795_r_mib_pkt()
217 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8795_r_mib_pkt()
223 ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check); in ksz8795_r_mib_pkt()
226 ksz_read32(dev, regs[REG_IND_DATA_LO], &data); in ksz8795_r_mib_pkt()
247 mutex_unlock(&dev->alu_mutex); in ksz8795_r_mib_pkt()
250 static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, in ksz8863_r_mib_pkt() argument
259 regs = dev->info->regs; in ksz8863_r_mib_pkt()
261 addr -= dev->info->reg_mib_cnt; in ksz8863_r_mib_pkt()
267 mutex_lock(&dev->alu_mutex); in ksz8863_r_mib_pkt()
268 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8863_r_mib_pkt()
269 ksz_read32(dev, regs[REG_IND_DATA_LO], &data); in ksz8863_r_mib_pkt()
270 mutex_unlock(&dev->alu_mutex); in ksz8863_r_mib_pkt()
283 void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, in ksz8_r_mib_pkt() argument
286 if (ksz_is_ksz88x3(dev)) in ksz8_r_mib_pkt()
287 ksz8863_r_mib_pkt(dev, port, addr, dropped, cnt); in ksz8_r_mib_pkt()
289 ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt); in ksz8_r_mib_pkt()
292 void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze) in ksz8_freeze_mib() argument
294 if (ksz_is_ksz88x3(dev)) in ksz8_freeze_mib()
299 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true); in ksz8_freeze_mib()
300 ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FREEZE, freeze); in ksz8_freeze_mib()
304 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false); in ksz8_freeze_mib()
307 void ksz8_port_init_cnt(struct ksz_device *dev, int port) in ksz8_port_init_cnt() argument
309 struct ksz_port_mib *mib = &dev->ports[port].mib; in ksz8_port_init_cnt()
312 if (!ksz_is_ksz88x3(dev)) { in ksz8_port_init_cnt()
314 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true); in ksz8_port_init_cnt()
315 ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FLUSH, true); in ksz8_port_init_cnt()
316 ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false); in ksz8_port_init_cnt()
322 while (mib->cnt_ptr < dev->info->reg_mib_cnt) { in ksz8_port_init_cnt()
323 dev->dev_ops->r_mib_cnt(dev, port, mib->cnt_ptr, in ksz8_port_init_cnt()
329 dropped = &mib->counters[dev->info->mib_cnt]; in ksz8_port_init_cnt()
332 while (mib->cnt_ptr < dev->info->mib_cnt) { in ksz8_port_init_cnt()
333 dev->dev_ops->r_mib_pkt(dev, port, mib->cnt_ptr, in ksz8_port_init_cnt()
339 static int ksz8_r_table(struct ksz_device *dev, int table, u16 addr, u64 *data) in ksz8_r_table() argument
345 regs = dev->info->regs; in ksz8_r_table()
349 mutex_lock(&dev->alu_mutex); in ksz8_r_table()
350 ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8_r_table()
354 ret = ksz_read64(dev, regs[REG_IND_DATA_HI], data); in ksz8_r_table()
356 mutex_unlock(&dev->alu_mutex); in ksz8_r_table()
361 static int ksz8_w_table(struct ksz_device *dev, int table, u16 addr, u64 data) in ksz8_w_table() argument
367 regs = dev->info->regs; in ksz8_w_table()
371 mutex_lock(&dev->alu_mutex); in ksz8_w_table()
372 ret = ksz_write64(dev, regs[REG_IND_DATA_HI], data); in ksz8_w_table()
376 ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8_w_table()
378 mutex_unlock(&dev->alu_mutex); in ksz8_w_table()
383 static int ksz8_valid_dyn_entry(struct ksz_device *dev, u8 *data) in ksz8_valid_dyn_entry() argument
389 masks = dev->info->masks; in ksz8_valid_dyn_entry()
390 regs = dev->info->regs; in ksz8_valid_dyn_entry()
393 ksz_read8(dev, regs[REG_IND_DATA_CHECK], data); in ksz8_valid_dyn_entry()
402 ksz_read8(dev, regs[REG_IND_DATA_8], data); in ksz8_valid_dyn_entry()
411 int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr, in ksz8_r_dyn_mac_table() argument
422 shifts = dev->info->shifts; in ksz8_r_dyn_mac_table()
423 masks = dev->info->masks; in ksz8_r_dyn_mac_table()
424 regs = dev->info->regs; in ksz8_r_dyn_mac_table()
428 mutex_lock(&dev->alu_mutex); in ksz8_r_dyn_mac_table()
429 ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr); in ksz8_r_dyn_mac_table()
431 rc = ksz8_valid_dyn_entry(dev, &data); in ksz8_r_dyn_mac_table()
442 ksz_read64(dev, regs[REG_IND_DATA_HI], &buf); in ksz8_r_dyn_mac_table()
469 mutex_unlock(&dev->alu_mutex); in ksz8_r_dyn_mac_table()
474 static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr, in ksz8_r_sta_mac_table() argument
483 shifts = dev->info->shifts; in ksz8_r_sta_mac_table()
484 masks = dev->info->masks; in ksz8_r_sta_mac_table()
486 ret = ksz8_r_table(dev, TABLE_STATIC_MAC, addr, &data); in ksz8_r_sta_mac_table()
514 if (ksz_is_ksz87xx(dev)) in ksz8_r_sta_mac_table()
526 static int ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr, in ksz8_w_sta_mac_table() argument
534 shifts = dev->info->shifts; in ksz8_w_sta_mac_table()
535 masks = dev->info->masks; in ksz8_w_sta_mac_table()
556 return ksz8_w_table(dev, TABLE_STATIC_MAC, addr, data); in ksz8_w_sta_mac_table()
559 static void ksz8_from_vlan(struct ksz_device *dev, u32 vlan, u8 *fid, in ksz8_from_vlan() argument
565 shifts = dev->info->shifts; in ksz8_from_vlan()
566 masks = dev->info->masks; in ksz8_from_vlan()
574 static void ksz8_to_vlan(struct ksz_device *dev, u8 fid, u8 member, u8 valid, in ksz8_to_vlan() argument
580 shifts = dev->info->shifts; in ksz8_to_vlan()
581 masks = dev->info->masks; in ksz8_to_vlan()
589 static void ksz8_r_vlan_entries(struct ksz_device *dev, u16 addr) in ksz8_r_vlan_entries() argument
595 shifts = dev->info->shifts; in ksz8_r_vlan_entries()
597 ksz8_r_table(dev, TABLE_VLAN, addr, &data); in ksz8_r_vlan_entries()
600 dev->vlan_cache[addr + i].table[0] = (u16)data; in ksz8_r_vlan_entries()
605 static void ksz8_r_vlan_table(struct ksz_device *dev, u16 vid, u16 *vlan) in ksz8_r_vlan_table() argument
615 ksz8_r_table(dev, TABLE_VLAN, addr, &buf); in ksz8_r_vlan_table()
619 static void ksz8_w_vlan_table(struct ksz_device *dev, u16 vid, u16 vlan) in ksz8_w_vlan_table() argument
629 ksz8_r_table(dev, TABLE_VLAN, addr, &buf); in ksz8_w_vlan_table()
631 dev->vlan_cache[vid].table[0] = vlan; in ksz8_w_vlan_table()
632 ksz8_w_table(dev, TABLE_VLAN, addr, buf); in ksz8_w_vlan_table()
635 int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val) in ksz8_r_phy() argument
645 regs = dev->info->regs; in ksz8_r_phy()
649 ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart); in ksz8_r_phy()
653 ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed); in ksz8_r_phy()
657 ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl); in ksz8_r_phy()
665 if (ksz_is_ksz88x3(dev)) { in ksz8_r_phy()
690 ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link); in ksz8_r_phy()
708 if (ksz_is_ksz88x3(dev)) in ksz8_r_phy()
714 ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl); in ksz8_r_phy()
731 ret = ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link); in ksz8_r_phy()
750 ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1); in ksz8_r_phy()
754 ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2); in ksz8_r_phy()
772 ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link); in ksz8_r_phy()
789 int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) in ksz8_w_phy() argument
796 regs = dev->info->regs; in ksz8_w_phy()
804 ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed); in ksz8_w_phy()
815 ret = ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data); in ksz8_w_phy()
820 ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl); in ksz8_w_phy()
825 if (ksz_is_ksz88x3(dev)) { in ksz8_w_phy()
837 if (dev->ports[p].fiber) in ksz8_w_phy()
851 ret = ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data); in ksz8_w_phy()
856 ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart); in ksz8_w_phy()
891 ret = ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL], in ksz8_w_phy()
898 ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl); in ksz8_w_phy()
920 ret = ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data); in ksz8_w_phy()
927 ksz_port_cfg(dev, p, REG_PORT_LINK_MD_CTRL, PORT_START_CABLE_DIAG, true); in ksz8_w_phy()
936 void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member) in ksz8_cfg_port_member() argument
940 ksz_pread8(dev, port, P_MIRROR_CTRL, &data); in ksz8_cfg_port_member()
942 data |= (member & dev->port_mask); in ksz8_cfg_port_member()
943 ksz_pwrite8(dev, port, P_MIRROR_CTRL, data); in ksz8_cfg_port_member()
946 void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port) in ksz8_flush_dyn_mac_table() argument
952 regs = dev->info->regs; in ksz8_flush_dyn_mac_table()
954 if ((uint)port < dev->info->port_cnt) { in ksz8_flush_dyn_mac_table()
960 cnt = dev->info->port_cnt; in ksz8_flush_dyn_mac_table()
963 ksz_pread8(dev, index, regs[P_STP_CTRL], &learn[index]); in ksz8_flush_dyn_mac_table()
965 ksz_pwrite8(dev, index, regs[P_STP_CTRL], in ksz8_flush_dyn_mac_table()
968 ksz_cfg(dev, S_FLUSH_TABLE_CTRL, SW_FLUSH_DYN_MAC_TABLE, true); in ksz8_flush_dyn_mac_table()
971 ksz_pwrite8(dev, index, regs[P_STP_CTRL], learn[index]); in ksz8_flush_dyn_mac_table()
975 int ksz8_fdb_dump(struct ksz_device *dev, int port, in ksz8_fdb_dump() argument
987 ret = ksz8_r_dyn_mac_table(dev, i, mac, &fid, &src_port, in ksz8_fdb_dump()
1002 static int ksz8_add_sta_mac(struct ksz_device *dev, int port, in ksz8_add_sta_mac() argument
1010 for (index = 0; index < dev->info->num_statics; index++) { in ksz8_add_sta_mac()
1013 ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid); in ksz8_add_sta_mac()
1028 if (index == dev->info->num_statics && !empty) in ksz8_add_sta_mac()
1032 if (index == dev->info->num_statics) { in ksz8_add_sta_mac()
1046 return ksz8_w_sta_mac_table(dev, index, &alu); in ksz8_add_sta_mac()
1049 static int ksz8_del_sta_mac(struct ksz_device *dev, int port, in ksz8_del_sta_mac() argument
1055 for (index = 0; index < dev->info->num_statics; index++) { in ksz8_del_sta_mac()
1058 ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid); in ksz8_del_sta_mac()
1069 if (index == dev->info->num_statics) in ksz8_del_sta_mac()
1077 return ksz8_w_sta_mac_table(dev, index, &alu); in ksz8_del_sta_mac()
1080 int ksz8_mdb_add(struct ksz_device *dev, int port, in ksz8_mdb_add() argument
1083 return ksz8_add_sta_mac(dev, port, mdb->addr, mdb->vid); in ksz8_mdb_add()
1086 int ksz8_mdb_del(struct ksz_device *dev, int port, in ksz8_mdb_del() argument
1089 return ksz8_del_sta_mac(dev, port, mdb->addr, mdb->vid); in ksz8_mdb_del()
1092 int ksz8_fdb_add(struct ksz_device *dev, int port, const unsigned char *addr, in ksz8_fdb_add() argument
1095 return ksz8_add_sta_mac(dev, port, addr, vid); in ksz8_fdb_add()
1098 int ksz8_fdb_del(struct ksz_device *dev, int port, const unsigned char *addr, in ksz8_fdb_del() argument
1101 return ksz8_del_sta_mac(dev, port, addr, vid); in ksz8_fdb_del()
1104 int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag, in ksz8_port_vlan_filtering() argument
1107 if (ksz_is_ksz88x3(dev)) in ksz8_port_vlan_filtering()
1111 ksz_cfg(dev, S_MIRROR_CTRL, SW_VLAN_ENABLE, flag); in ksz8_port_vlan_filtering()
1114 for (port = 0; port < dev->phy_port_cnt; ++port) in ksz8_port_vlan_filtering()
1115 ksz_port_cfg(dev, port, REG_PORT_CTRL_2, PORT_INGRESS_FILTER, in ksz8_port_vlan_filtering()
1121 static void ksz8_port_enable_pvid(struct ksz_device *dev, int port, bool state) in ksz8_port_enable_pvid() argument
1123 if (ksz_is_ksz88x3(dev)) { in ksz8_port_enable_pvid()
1124 ksz_cfg(dev, REG_SW_INSERT_SRC_PVID, in ksz8_port_enable_pvid()
1127 ksz_pwrite8(dev, port, REG_PORT_CTRL_12, state ? 0x0f : 0x00); in ksz8_port_enable_pvid()
1131 int ksz8_port_vlan_add(struct ksz_device *dev, int port, in ksz8_port_vlan_add() argument
1136 struct ksz_port *p = &dev->ports[port]; in ksz8_port_vlan_add()
1140 if (ksz_is_ksz88x3(dev)) in ksz8_port_vlan_add()
1149 port != dev->cpu_port) { in ksz8_port_vlan_add()
1156 for (vid = 1; vid < dev->info->num_vlans; ++vid) { in ksz8_port_vlan_add()
1161 ksz8_from_vlan(dev, dev->vlan_cache[vid].table[0], in ksz8_port_vlan_add()
1167 ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged); in ksz8_port_vlan_add()
1171 ksz8_r_vlan_table(dev, vlan->vid, &data); in ksz8_port_vlan_add()
1172 ksz8_from_vlan(dev, data, &fid, &member, &valid); in ksz8_port_vlan_add()
1182 ksz8_to_vlan(dev, fid, member, valid, &data); in ksz8_port_vlan_add()
1183 ksz8_w_vlan_table(dev, vlan->vid, data); in ksz8_port_vlan_add()
1192 ksz_pread16(dev, port, REG_PORT_CTRL_VID, &vid); in ksz8_port_vlan_add()
1195 ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, vid); in ksz8_port_vlan_add()
1197 ksz8_port_enable_pvid(dev, port, true); in ksz8_port_vlan_add()
1203 int ksz8_port_vlan_del(struct ksz_device *dev, int port, in ksz8_port_vlan_del() argument
1209 if (ksz_is_ksz88x3(dev)) in ksz8_port_vlan_del()
1212 ksz_pread16(dev, port, REG_PORT_CTRL_VID, &pvid); in ksz8_port_vlan_del()
1215 ksz8_r_vlan_table(dev, vlan->vid, &data); in ksz8_port_vlan_del()
1216 ksz8_from_vlan(dev, data, &fid, &member, &valid); in ksz8_port_vlan_del()
1226 ksz8_to_vlan(dev, fid, member, valid, &data); in ksz8_port_vlan_del()
1227 ksz8_w_vlan_table(dev, vlan->vid, data); in ksz8_port_vlan_del()
1230 ksz8_port_enable_pvid(dev, port, false); in ksz8_port_vlan_del()
1235 int ksz8_port_mirror_add(struct ksz_device *dev, int port, in ksz8_port_mirror_add() argument
1240 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true); in ksz8_port_mirror_add()
1241 dev->mirror_rx |= BIT(port); in ksz8_port_mirror_add()
1243 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true); in ksz8_port_mirror_add()
1244 dev->mirror_tx |= BIT(port); in ksz8_port_mirror_add()
1247 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false); in ksz8_port_mirror_add()
1250 if (dev->mirror_rx || dev->mirror_tx) in ksz8_port_mirror_add()
1251 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz8_port_mirror_add()
1257 void ksz8_port_mirror_del(struct ksz_device *dev, int port, in ksz8_port_mirror_del() argument
1263 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false); in ksz8_port_mirror_del()
1264 dev->mirror_rx &= ~BIT(port); in ksz8_port_mirror_del()
1266 ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false); in ksz8_port_mirror_del()
1267 dev->mirror_tx &= ~BIT(port); in ksz8_port_mirror_del()
1270 ksz_pread8(dev, port, P_MIRROR_CTRL, &data); in ksz8_port_mirror_del()
1272 if (!dev->mirror_rx && !dev->mirror_tx) in ksz8_port_mirror_del()
1273 ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, in ksz8_port_mirror_del()
1277 static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port) in ksz8795_cpu_interface_select() argument
1279 struct ksz_port *p = &dev->ports[port]; in ksz8795_cpu_interface_select()
1281 if (!p->interface && dev->compat_interface) { in ksz8795_cpu_interface_select()
1282 dev_warn(dev->dev, in ksz8795_cpu_interface_select()
1286 p->interface = dev->compat_interface; in ksz8795_cpu_interface_select()
1290 void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port) in ksz8_port_setup() argument
1292 struct dsa_switch *ds = dev->ds; in ksz8_port_setup()
1296 masks = dev->info->masks; in ksz8_port_setup()
1299 ksz_port_cfg(dev, port, P_BCAST_STORM_CTRL, PORT_BROADCAST_STORM, true); in ksz8_port_setup()
1301 if (!ksz_is_ksz88x3(dev)) in ksz8_port_setup()
1302 ksz8795_set_prio_queue(dev, port, 4); in ksz8_port_setup()
1305 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_DIFFSERV_ENABLE, false); in ksz8_port_setup()
1308 ksz_port_cfg(dev, port, P_802_1P_CTRL, in ksz8_port_setup()
1312 ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true); in ksz8_port_setup()
1315 if (!ksz_is_ksz88x3(dev)) in ksz8_port_setup()
1316 ksz8795_cpu_interface_select(dev, port); in ksz8_port_setup()
1323 ksz8_cfg_port_member(dev, port, member); in ksz8_port_setup()
1328 struct ksz_device *dev = ds->priv; in ksz8_config_cpu_port() local
1335 masks = dev->info->masks; in ksz8_config_cpu_port()
1336 regs = dev->info->regs; in ksz8_config_cpu_port()
1338 ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true); in ksz8_config_cpu_port()
1340 ksz8_port_setup(dev, dev->cpu_port, true); in ksz8_config_cpu_port()
1342 for (i = 0; i < dev->phy_port_cnt; i++) { in ksz8_config_cpu_port()
1345 for (i = 0; i < dev->phy_port_cnt; i++) { in ksz8_config_cpu_port()
1346 p = &dev->ports[i]; in ksz8_config_cpu_port()
1348 if (!ksz_is_ksz88x3(dev)) { in ksz8_config_cpu_port()
1349 ksz_pread8(dev, i, regs[P_REMOTE_STATUS], &remote); in ksz8_config_cpu_port()
1354 ksz_port_cfg(dev, i, regs[P_STP_CTRL], in ksz8_config_cpu_port()
1357 ksz_port_cfg(dev, i, regs[P_STP_CTRL], in ksz8_config_cpu_port()
1364 struct ksz_device *dev = ds->priv; in ksz8_handle_global_errata() local
1373 if (dev->info->ksz87xx_eee_link_erratum) in ksz8_handle_global_errata()
1374 ret = ksz8_ind_write8(dev, TABLE_EEE, REG_IND_EEE_GLOB2_HI, 0); in ksz8_handle_global_errata()
1379 int ksz8_enable_stp_addr(struct ksz_device *dev) in ksz8_enable_stp_addr() argument
1388 alu.port_forward = dev->info->cpu_ports; in ksz8_enable_stp_addr()
1390 return ksz8_w_sta_mac_table(dev, 0, &alu); in ksz8_enable_stp_addr()
1395 struct ksz_device *dev = ds->priv; in ksz8_setup() local
1410 ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_FLOW_CTRL, true); in ksz8_setup()
1413 ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true); in ksz8_setup()
1416 regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_1, in ksz8_setup()
1423 regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_2, in ksz8_setup()
1427 ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false); in ksz8_setup()
1429 ksz_cfg(dev, S_MIRROR_CTRL, SW_MIRROR_RX_TX, false); in ksz8_setup()
1431 if (!ksz_is_ksz88x3(dev)) in ksz8_setup()
1432 ksz_cfg(dev, REG_SW_CTRL_19, SW_INS_TAG_ENABLE, true); in ksz8_setup()
1434 for (i = 0; i < (dev->info->num_vlans / 4); i++) in ksz8_setup()
1435 ksz8_r_vlan_entries(dev, i); in ksz8_setup()
1440 void ksz8_get_caps(struct ksz_device *dev, int port, in ksz8_get_caps() argument
1450 if (!ksz_is_ksz88x3(dev) || port) in ksz8_get_caps()
1454 if (!ksz_is_ksz88x3(dev)) in ksz8_get_caps()
1463 int ksz8_switch_init(struct ksz_device *dev) in ksz8_switch_init() argument
1465 dev->cpu_port = fls(dev->info->cpu_ports) - 1; in ksz8_switch_init()
1466 dev->phy_port_cnt = dev->info->port_cnt - 1; in ksz8_switch_init()
1467 dev->port_mask = (BIT(dev->phy_port_cnt) - 1) | dev->info->cpu_ports; in ksz8_switch_init()
1472 void ksz8_switch_exit(struct ksz_device *dev) in ksz8_switch_exit() argument
1474 ksz8_reset_switch(dev); in ksz8_switch_exit()