Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-dsa-microchip-make-ksz8795-driver-more-versatile'

Michael Grzeschik says:

====================
net: dsa: microchip: make ksz8795 driver more versatile

This series changes the ksz8795 driver to use more dynamic variables
instead of static defines. The purpose is to prepare the driver to
be used with other microchip switches with a similar layout.
====================

Link: https://lore.kernel.org/r/20201201204506.13473-1-m.grzeschik@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+40 -61
+33 -38
drivers/net/dsa/microchip/ksz8795.c
··· 23 23 24 24 static const struct { 25 25 char string[ETH_GSTRING_LEN]; 26 - } mib_names[TOTAL_SWITCH_COUNTER_NUM] = { 26 + } mib_names[] = { 27 27 { "rx_hi" }, 28 28 { "rx_undersize" }, 29 29 { "rx_fragments" }, ··· 125 125 u8 check; 126 126 int loop; 127 127 128 - ctrl_addr = addr + SWITCH_COUNTER_NUM * port; 128 + ctrl_addr = addr + dev->reg_mib_cnt * port; 129 129 ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ); 130 130 131 131 mutex_lock(&dev->alu_mutex); ··· 156 156 u8 check; 157 157 int loop; 158 158 159 - addr -= SWITCH_COUNTER_NUM; 159 + addr -= dev->reg_mib_cnt; 160 160 ctrl_addr = (KS_MIB_TOTAL_RX_1 - KS_MIB_TOTAL_RX_0) * port; 161 161 ctrl_addr += addr + KS_MIB_TOTAL_RX_0; 162 162 ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ); ··· 418 418 int i; 419 419 420 420 ksz8795_r_table(dev, TABLE_VLAN, addr, &data); 421 - addr *= 4; 422 - for (i = 0; i < 4; i++) { 421 + addr *= dev->phy_port_cnt; 422 + for (i = 0; i < dev->phy_port_cnt; i++) { 423 423 dev->vlan_cache[addr + i].table[0] = (u16)data; 424 424 data >>= VLAN_TABLE_S; 425 425 } ··· 433 433 u64 buf; 434 434 435 435 data = (u16 *)&buf; 436 - addr = vid / 4; 436 + addr = vid / dev->phy_port_cnt; 437 437 index = vid & 3; 438 438 ksz8795_r_table(dev, TABLE_VLAN, addr, &buf); 439 439 *vlan = data[index]; ··· 447 447 u64 buf; 448 448 449 449 data = (u16 *)&buf; 450 - addr = vid / 4; 450 + addr = vid / dev->phy_port_cnt; 451 451 index = vid & 3; 452 452 ksz8795_r_table(dev, TABLE_VLAN, addr, &buf); 453 453 data[index] = vlan; ··· 654 654 static void ksz8795_get_strings(struct dsa_switch *ds, int port, 655 655 u32 stringset, uint8_t *buf) 656 656 { 657 + struct ksz_device *dev = ds->priv; 657 658 int i; 658 659 659 - for (i = 0; i < TOTAL_SWITCH_COUNTER_NUM; i++) { 660 + for (i = 0; i < dev->mib_cnt; i++) { 660 661 memcpy(buf + i * ETH_GSTRING_LEN, mib_names[i].string, 661 662 ETH_GSTRING_LEN); 662 663 } ··· 692 691 switch (state) { 693 692 case BR_STATE_DISABLED: 694 693 data |= PORT_LEARN_DISABLE; 695 - if (port < SWITCH_PORT_NUM) 694 + if (port < dev->phy_port_cnt) 696 695 member = 0; 697 696 break; 698 697 case BR_STATE_LISTENING: 699 698 data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE); 700 - if (port < SWITCH_PORT_NUM && 699 + if (port < dev->phy_port_cnt && 701 700 p->stp_state == BR_STATE_DISABLED) 702 701 member = dev->host_mask | p->vid_member; 703 702 break; ··· 721 720 break; 722 721 case BR_STATE_BLOCKING: 723 722 data |= PORT_LEARN_DISABLE; 724 - if (port < SWITCH_PORT_NUM && 723 + if (port < dev->phy_port_cnt && 725 724 p->stp_state == BR_STATE_DISABLED) 726 725 member = dev->host_mask | p->vid_member; 727 726 break; ··· 751 750 752 751 static void ksz8795_flush_dyn_mac_table(struct ksz_device *dev, int port) 753 752 { 754 - u8 learn[TOTAL_PORT_NUM]; 753 + u8 learn[DSA_MAX_PORTS]; 755 754 int first, index, cnt; 756 755 struct ksz_port *p; 757 756 758 - if ((uint)port < TOTAL_PORT_NUM) { 757 + if ((uint)port < dev->port_cnt) { 759 758 first = port; 760 759 cnt = port + 1; 761 760 } else { 762 761 /* Flush all ports. */ 763 762 first = 0; 764 - cnt = dev->mib_port_cnt; 763 + cnt = dev->port_cnt; 765 764 } 766 765 for (index = first; index < cnt; index++) { 767 766 p = &dev->ports[index]; ··· 993 992 u8 remote; 994 993 int i; 995 994 996 - ds->num_ports = dev->port_cnt + 1; 997 - 998 995 /* Switch marks the maximum frame with extra byte as oversize. */ 999 996 ksz_cfg(dev, REG_SW_CTRL_2, SW_LEGAL_PACKET_DISABLE, true); 1000 997 ksz_cfg(dev, S_TAIL_TAG_CTRL, SW_TAIL_TAG_ENABLE, true); ··· 1004 1005 ksz8795_port_setup(dev, dev->cpu_port, true); 1005 1006 dev->member = dev->host_mask; 1006 1007 1007 - for (i = 0; i < SWITCH_PORT_NUM; i++) { 1008 + for (i = 0; i < dev->phy_port_cnt; i++) { 1008 1009 p = &dev->ports[i]; 1009 1010 1010 1011 /* Initialize to non-zero so that ksz_cfg_port_member() will ··· 1015 1016 ksz8795_port_stp_state_set(ds, i, BR_STATE_DISABLED); 1016 1017 1017 1018 /* Last port may be disabled. */ 1018 - if (i == dev->port_cnt) 1019 + if (i == dev->phy_port_cnt) 1019 1020 break; 1020 1021 p->on = 1; 1021 1022 p->phy = 1; ··· 1084 1085 (BROADCAST_STORM_VALUE * 1085 1086 BROADCAST_STORM_PROT_RATE) / 100); 1086 1087 1087 - for (i = 0; i < VLAN_TABLE_ENTRIES; i++) 1088 + for (i = 0; i < (dev->num_vlans / 4); i++) 1088 1089 ksz8795_r_vlan_entries(dev, i); 1089 1090 1090 1091 /* Setup STP address for STP operation. */ ··· 1149 1150 (id2 != CHIP_ID_94 && id2 != CHIP_ID_95)) 1150 1151 return -ENODEV; 1151 1152 1152 - dev->mib_port_cnt = TOTAL_PORT_NUM; 1153 - dev->phy_port_cnt = SWITCH_PORT_NUM; 1154 - dev->port_cnt = SWITCH_PORT_NUM; 1155 - 1156 1153 if (id2 == CHIP_ID_95) { 1157 1154 u8 val; 1158 1155 ··· 1157 1162 if (val & PORT_FIBER_MODE) 1158 1163 id2 = 0x65; 1159 1164 } else if (id2 == CHIP_ID_94) { 1160 - dev->port_cnt--; 1161 - dev->last_port = dev->port_cnt; 1162 1165 id2 = 0x94; 1163 1166 } 1164 1167 id16 &= ~0xff; 1165 1168 id16 |= id2; 1166 1169 dev->chip_id = id16; 1167 - 1168 - dev->cpu_port = dev->mib_port_cnt - 1; 1169 - dev->host_mask = BIT(dev->cpu_port); 1170 1170 1171 1171 return 0; 1172 1172 } ··· 1184 1194 .num_alus = 0, 1185 1195 .num_statics = 8, 1186 1196 .cpu_ports = 0x10, /* can be configured as cpu port */ 1187 - .port_cnt = 4, /* total physical port count */ 1197 + .port_cnt = 5, /* total cpu and user ports */ 1188 1198 }, 1189 1199 { 1190 1200 .chip_id = 0x8794, ··· 1193 1203 .num_alus = 0, 1194 1204 .num_statics = 8, 1195 1205 .cpu_ports = 0x10, /* can be configured as cpu port */ 1196 - .port_cnt = 3, /* total physical port count */ 1206 + .port_cnt = 4, /* total cpu and user ports */ 1197 1207 }, 1198 1208 { 1199 1209 .chip_id = 0x8765, ··· 1202 1212 .num_alus = 0, 1203 1213 .num_statics = 8, 1204 1214 .cpu_ports = 0x10, /* can be configured as cpu port */ 1205 - .port_cnt = 4, /* total physical port count */ 1215 + .port_cnt = 5, /* total cpu and user ports */ 1206 1216 }, 1207 1217 }; 1208 1218 ··· 1234 1244 dev->port_mask = BIT(dev->port_cnt) - 1; 1235 1245 dev->port_mask |= dev->host_mask; 1236 1246 1237 - dev->reg_mib_cnt = SWITCH_COUNTER_NUM; 1238 - dev->mib_cnt = TOTAL_SWITCH_COUNTER_NUM; 1247 + dev->reg_mib_cnt = KSZ8795_COUNTER_NUM; 1248 + dev->mib_cnt = ARRAY_SIZE(mib_names); 1239 1249 1240 - i = dev->mib_port_cnt; 1241 - dev->ports = devm_kzalloc(dev->dev, sizeof(struct ksz_port) * i, 1250 + dev->phy_port_cnt = dev->port_cnt - 1; 1251 + 1252 + dev->cpu_port = dev->port_cnt - 1; 1253 + dev->host_mask = BIT(dev->cpu_port); 1254 + 1255 + dev->ports = devm_kzalloc(dev->dev, 1256 + dev->port_cnt * sizeof(struct ksz_port), 1242 1257 GFP_KERNEL); 1243 1258 if (!dev->ports) 1244 1259 return -ENOMEM; 1245 - for (i = 0; i < dev->mib_port_cnt; i++) { 1260 + for (i = 0; i < dev->port_cnt; i++) { 1246 1261 mutex_init(&dev->ports[i].mib.cnt_mutex); 1247 1262 dev->ports[i].mib.counters = 1248 1263 devm_kzalloc(dev->dev, 1249 1264 sizeof(u64) * 1250 - (TOTAL_SWITCH_COUNTER_NUM + 1), 1265 + (dev->mib_cnt + 1), 1251 1266 GFP_KERNEL); 1252 1267 if (!dev->ports[i].mib.counters) 1253 1268 return -ENOMEM; 1254 1269 } 1255 1270 1256 1271 /* set the real number of ports */ 1257 - dev->ds->num_ports = dev->port_cnt + 1; 1272 + dev->ds->num_ports = dev->port_cnt; 1258 1273 1259 1274 return 0; 1260 1275 }
-10
drivers/net/dsa/microchip/ksz8795_reg.h
··· 846 846 847 847 #define KS_PRIO_IN_REG 4 848 848 849 - #define TOTAL_PORT_NUM 5 850 - 851 - /* Host port can only be last of them. */ 852 - #define SWITCH_PORT_NUM (TOTAL_PORT_NUM - 1) 853 - 854 849 #define KSZ8795_COUNTER_NUM 0x20 855 - #define TOTAL_KSZ8795_COUNTER_NUM (KSZ8795_COUNTER_NUM + 4) 856 - 857 - #define SWITCH_COUNTER_NUM KSZ8795_COUNTER_NUM 858 - #define TOTAL_SWITCH_COUNTER_NUM TOTAL_KSZ8795_COUNTER_NUM 859 850 860 851 /* Common names used by other drivers */ 861 852 ··· 989 998 #define TAIL_TAG_OVERRIDE BIT(6) 990 999 #define TAIL_TAG_LOOKUP BIT(7) 991 1000 992 - #define VLAN_TABLE_ENTRIES (4096 / 4) 993 1001 #define FID_ENTRIES 128 994 1002 995 1003 #endif
+5 -9
drivers/net/dsa/microchip/ksz9477.c
··· 478 478 SW_FLUSH_OPTION_M << SW_FLUSH_OPTION_S, 479 479 SW_FLUSH_OPTION_DYN_MAC << SW_FLUSH_OPTION_S); 480 480 481 - if (port < dev->mib_port_cnt) { 481 + if (port < dev->port_cnt) { 482 482 /* flush individual port */ 483 483 ksz_pread8(dev, port, P_STP_CTRL, &data); 484 484 if (!(data & PORT_LEARN_DISABLE)) ··· 1267 1267 struct ksz_port *p; 1268 1268 int i; 1269 1269 1270 - ds->num_ports = dev->port_cnt; 1271 - 1272 1270 for (i = 0; i < dev->port_cnt; i++) { 1273 1271 if (dsa_is_cpu_port(ds, i) && (dev->cpu_ports & (1 << i))) { 1274 1272 phy_interface_t interface; ··· 1317 1319 1318 1320 dev->member = dev->host_mask; 1319 1321 1320 - for (i = 0; i < dev->mib_port_cnt; i++) { 1322 + for (i = 0; i < dev->port_cnt; i++) { 1321 1323 if (i == dev->cpu_port) 1322 1324 continue; 1323 1325 p = &dev->ports[i]; ··· 1444 1446 return ret; 1445 1447 1446 1448 /* Number of ports can be reduced depending on chip. */ 1447 - dev->mib_port_cnt = TOTAL_PORT_NUM; 1448 1449 dev->phy_port_cnt = 5; 1449 1450 1450 1451 /* Default capability is gigabit capable. */ ··· 1460 1463 /* Chip does not support gigabit. */ 1461 1464 if (data8 & SW_QW_ABLE) 1462 1465 dev->features &= ~GBIT_SUPPORT; 1463 - dev->mib_port_cnt = 3; 1464 1466 dev->phy_port_cnt = 2; 1465 1467 } else { 1466 1468 dev_info(dev->dev, "Found KSZ9477 or compatible\n"); ··· 1562 1566 dev->reg_mib_cnt = SWITCH_COUNTER_NUM; 1563 1567 dev->mib_cnt = TOTAL_SWITCH_COUNTER_NUM; 1564 1568 1565 - i = dev->mib_port_cnt; 1566 - dev->ports = devm_kzalloc(dev->dev, sizeof(struct ksz_port) * i, 1569 + dev->ports = devm_kzalloc(dev->dev, 1570 + dev->port_cnt * sizeof(struct ksz_port), 1567 1571 GFP_KERNEL); 1568 1572 if (!dev->ports) 1569 1573 return -ENOMEM; 1570 - for (i = 0; i < dev->mib_port_cnt; i++) { 1574 + for (i = 0; i < dev->port_cnt; i++) { 1571 1575 mutex_init(&dev->ports[i].mib.cnt_mutex); 1572 1576 dev->ports[i].mib.counters = 1573 1577 devm_kzalloc(dev->dev,
+2 -2
drivers/net/dsa/microchip/ksz_common.c
··· 72 72 struct ksz_port *p; 73 73 int i; 74 74 75 - for (i = 0; i < dev->mib_port_cnt; i++) { 75 + for (i = 0; i < dev->port_cnt; i++) { 76 76 if (dsa_is_unused_port(dev->ds, i)) 77 77 continue; 78 78 ··· 103 103 104 104 INIT_DELAYED_WORK(&dev->mib_read, ksz_mib_read_work); 105 105 106 - for (i = 0; i < dev->mib_port_cnt; i++) 106 + for (i = 0; i < dev->port_cnt; i++) 107 107 dev->dev_ops->port_init_cnt(dev, i); 108 108 } 109 109 EXPORT_SYMBOL_GPL(ksz_init_mib_timer);
-2
drivers/net/dsa/microchip/ksz_common.h
··· 71 71 int port_cnt; 72 72 int reg_mib_cnt; 73 73 int mib_cnt; 74 - int mib_port_cnt; 75 - int last_port; /* ports after that not used */ 76 74 phy_interface_t compat_interface; 77 75 u32 regs_size; 78 76 bool phy_errata_9477;