CC: [email protected] BCC: [email protected] CC: [email protected] TO: Horatiu Vultur <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 3d7cb6b04c3f3115719235cc6866b10326de34cd commit: 7aacb894b1adf8b0f46e6370417350a6bac20c55 net: lan966x: Extend switchdev with mdb support date: 7 months ago :::::: branch date: 13 hours ago :::::: commit date: 7 months ago config: arc-randconfig-m041-20220731 (https://download.01.org/0day-ci/archive/20220801/[email protected]/config) compiler: arceb-elf-gcc (GCC) 12.1.0 If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: drivers/net/ethernet/microchip/lan966x/lan966x_mdb.c:119 lan966x_mdb_ip_add() warn: passing a valid pointer to 'PTR_ERR' drivers/net/ethernet/microchip/lan966x/lan966x_mdb.c:262 lan966x_mdb_l2_add() warn: passing a valid pointer to 'PTR_ERR' vim +/PTR_ERR +119 drivers/net/ethernet/microchip/lan966x/lan966x_mdb.c 7aacb894b1adf8 Horatiu Vultur 2022-01-04 104 7aacb894b1adf8 Horatiu Vultur 2022-01-04 105 static int lan966x_mdb_ip_add(struct lan966x_port *port, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 106 const struct switchdev_obj_port_mdb *mdb, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 107 enum macaccess_entry_type type) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 108 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 109 bool cpu_port = netif_is_bridge_master(mdb->obj.orig_dev); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 110 struct lan966x *lan966x = port->lan966x; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 111 struct lan966x_mdb_entry *mdb_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 112 unsigned char mac[ETH_ALEN]; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 113 bool cpu_copy = false; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 114 7aacb894b1adf8 Horatiu Vultur 2022-01-04 115 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 116 if (!mdb_entry) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 117 mdb_entry = lan966x_mdb_entry_add(lan966x, mdb); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 118 if (IS_ERR(mdb_entry)) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 @119 return PTR_ERR(mdb_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 120 } else { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 121 lan966x_mdb_encode_mac(mac, mdb_entry, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 122 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 123 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 124 7aacb894b1adf8 Horatiu Vultur 2022-01-04 125 if (cpu_port) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 126 mdb_entry->cpu_copy++; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 127 else 7aacb894b1adf8 Horatiu Vultur 2022-01-04 128 mdb_entry->ports |= BIT(port->chip_port); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 129 7aacb894b1adf8 Horatiu Vultur 2022-01-04 130 /* Copy the frame to CPU only if the CPU is in the VLAN */ 7aacb894b1adf8 Horatiu Vultur 2022-01-04 131 if (lan966x_vlan_cpu_member_cpu_vlan_mask(lan966x, mdb_entry->vid) && 7aacb894b1adf8 Horatiu Vultur 2022-01-04 132 mdb_entry->cpu_copy) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 133 cpu_copy = true; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 134 7aacb894b1adf8 Horatiu Vultur 2022-01-04 135 lan966x_mdb_encode_mac(mac, mdb_entry, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 136 return lan966x_mac_ip_learn(lan966x, cpu_copy, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 137 mac, mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 138 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 139 7aacb894b1adf8 Horatiu Vultur 2022-01-04 140 static int lan966x_mdb_ip_del(struct lan966x_port *port, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 141 const struct switchdev_obj_port_mdb *mdb, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 142 enum macaccess_entry_type type) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 143 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 144 bool cpu_port = netif_is_bridge_master(mdb->obj.orig_dev); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 145 struct lan966x *lan966x = port->lan966x; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 146 struct lan966x_mdb_entry *mdb_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 147 unsigned char mac[ETH_ALEN]; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 148 u16 ports; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 149 7aacb894b1adf8 Horatiu Vultur 2022-01-04 150 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 151 if (!mdb_entry) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 152 return -ENOENT; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 153 7aacb894b1adf8 Horatiu Vultur 2022-01-04 154 ports = mdb_entry->ports; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 155 if (cpu_port) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 156 /* If there are still other references to the CPU port then 7aacb894b1adf8 Horatiu Vultur 2022-01-04 157 * there is no point to delete and add again the same entry 7aacb894b1adf8 Horatiu Vultur 2022-01-04 158 */ 7aacb894b1adf8 Horatiu Vultur 2022-01-04 159 mdb_entry->cpu_copy--; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 160 if (mdb_entry->cpu_copy) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 161 return 0; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 162 } else { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 163 ports &= ~BIT(port->chip_port); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 164 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 165 7aacb894b1adf8 Horatiu Vultur 2022-01-04 166 lan966x_mdb_encode_mac(mac, mdb_entry, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 167 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 168 7aacb894b1adf8 Horatiu Vultur 2022-01-04 169 mdb_entry->ports = ports; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 170 7aacb894b1adf8 Horatiu Vultur 2022-01-04 171 if (!mdb_entry->ports && !mdb_entry->cpu_copy) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 172 list_del(&mdb_entry->list); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 173 kfree(mdb_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 174 return 0; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 175 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 176 7aacb894b1adf8 Horatiu Vultur 2022-01-04 177 lan966x_mdb_encode_mac(mac, mdb_entry, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 178 return lan966x_mac_ip_learn(lan966x, mdb_entry->cpu_copy, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 179 mac, mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 180 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 181 7aacb894b1adf8 Horatiu Vultur 2022-01-04 182 static struct lan966x_pgid_entry * 7aacb894b1adf8 Horatiu Vultur 2022-01-04 183 lan966x_pgid_entry_add(struct lan966x *lan966x, int index, u16 ports) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 184 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 185 struct lan966x_pgid_entry *pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 186 7aacb894b1adf8 Horatiu Vultur 2022-01-04 187 pgid_entry = kzalloc(sizeof(*pgid_entry), GFP_KERNEL); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 188 if (!pgid_entry) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 189 return ERR_PTR(-ENOMEM); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 190 7aacb894b1adf8 Horatiu Vultur 2022-01-04 191 pgid_entry->ports = ports; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 192 pgid_entry->index = index; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 193 refcount_set(&pgid_entry->refcount, 1); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 194 7aacb894b1adf8 Horatiu Vultur 2022-01-04 195 list_add_tail(&pgid_entry->list, &lan966x->pgid_entries); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 196 7aacb894b1adf8 Horatiu Vultur 2022-01-04 197 return pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 198 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 199 7aacb894b1adf8 Horatiu Vultur 2022-01-04 200 static struct lan966x_pgid_entry * 7aacb894b1adf8 Horatiu Vultur 2022-01-04 201 lan966x_pgid_entry_get(struct lan966x *lan966x, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 202 struct lan966x_mdb_entry *mdb_entry) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 203 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 204 struct lan966x_pgid_entry *pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 205 int index; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 206 7aacb894b1adf8 Horatiu Vultur 2022-01-04 207 /* Try to find an existing pgid that uses the same ports as the 7aacb894b1adf8 Horatiu Vultur 2022-01-04 208 * mdb_entry 7aacb894b1adf8 Horatiu Vultur 2022-01-04 209 */ 7aacb894b1adf8 Horatiu Vultur 2022-01-04 210 list_for_each_entry(pgid_entry, &lan966x->pgid_entries, list) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 211 if (pgid_entry->ports == mdb_entry->ports) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 212 refcount_inc(&pgid_entry->refcount); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 213 return pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 214 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 215 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 216 7aacb894b1adf8 Horatiu Vultur 2022-01-04 217 /* Try to find an empty pgid entry and allocate one in case it finds it, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 218 * otherwise it means that there are no more resources 7aacb894b1adf8 Horatiu Vultur 2022-01-04 219 */ 7aacb894b1adf8 Horatiu Vultur 2022-01-04 220 for (index = PGID_GP_START; index < PGID_GP_END; index++) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 221 bool used = false; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 222 7aacb894b1adf8 Horatiu Vultur 2022-01-04 223 list_for_each_entry(pgid_entry, &lan966x->pgid_entries, list) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 224 if (pgid_entry->index == index) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 225 used = true; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 226 break; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 227 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 228 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 229 7aacb894b1adf8 Horatiu Vultur 2022-01-04 230 if (!used) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 231 return lan966x_pgid_entry_add(lan966x, index, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 232 mdb_entry->ports); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 233 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 234 7aacb894b1adf8 Horatiu Vultur 2022-01-04 235 return ERR_PTR(-ENOSPC); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 236 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 237 7aacb894b1adf8 Horatiu Vultur 2022-01-04 238 static void lan966x_pgid_entry_del(struct lan966x *lan966x, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 239 struct lan966x_pgid_entry *pgid_entry) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 240 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 241 if (!refcount_dec_and_test(&pgid_entry->refcount)) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 242 return; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 243 7aacb894b1adf8 Horatiu Vultur 2022-01-04 244 list_del(&pgid_entry->list); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 245 kfree(pgid_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 246 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 247 7aacb894b1adf8 Horatiu Vultur 2022-01-04 248 static int lan966x_mdb_l2_add(struct lan966x_port *port, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 249 const struct switchdev_obj_port_mdb *mdb, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 250 enum macaccess_entry_type type) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 251 { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 252 bool cpu_port = netif_is_bridge_master(mdb->obj.orig_dev); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 253 struct lan966x *lan966x = port->lan966x; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 254 struct lan966x_pgid_entry *pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 255 struct lan966x_mdb_entry *mdb_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 256 unsigned char mac[ETH_ALEN]; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 257 7aacb894b1adf8 Horatiu Vultur 2022-01-04 258 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 259 if (!mdb_entry) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 260 mdb_entry = lan966x_mdb_entry_add(lan966x, mdb); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 261 if (IS_ERR(mdb_entry)) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 @262 return PTR_ERR(mdb_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 263 } else { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 264 lan966x_pgid_entry_del(lan966x, mdb_entry->pgid); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 265 lan966x_mdb_encode_mac(mac, mdb_entry, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 266 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 267 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 268 7aacb894b1adf8 Horatiu Vultur 2022-01-04 269 if (cpu_port) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 270 mdb_entry->ports |= BIT(CPU_PORT); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 271 mdb_entry->cpu_copy++; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 272 } else { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 273 mdb_entry->ports |= BIT(port->chip_port); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 274 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 275 7aacb894b1adf8 Horatiu Vultur 2022-01-04 276 pgid_entry = lan966x_pgid_entry_get(lan966x, mdb_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 277 if (IS_ERR(pgid_entry)) { 7aacb894b1adf8 Horatiu Vultur 2022-01-04 278 list_del(&mdb_entry->list); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 279 kfree(mdb_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 280 return PTR_ERR(pgid_entry); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 281 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 282 mdb_entry->pgid = pgid_entry; 7aacb894b1adf8 Horatiu Vultur 2022-01-04 283 7aacb894b1adf8 Horatiu Vultur 2022-01-04 284 /* Copy the frame to CPU only if the CPU is in the VLAN */ 7aacb894b1adf8 Horatiu Vultur 2022-01-04 285 if (!lan966x_vlan_cpu_member_cpu_vlan_mask(lan966x, mdb_entry->vid) && 7aacb894b1adf8 Horatiu Vultur 2022-01-04 286 mdb_entry->cpu_copy) 7aacb894b1adf8 Horatiu Vultur 2022-01-04 287 mdb_entry->ports &= BIT(CPU_PORT); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 288 7aacb894b1adf8 Horatiu Vultur 2022-01-04 289 lan_rmw(ANA_PGID_PGID_SET(mdb_entry->ports), 7aacb894b1adf8 Horatiu Vultur 2022-01-04 290 ANA_PGID_PGID, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 291 lan966x, ANA_PGID(pgid_entry->index)); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 292 7aacb894b1adf8 Horatiu Vultur 2022-01-04 293 return lan966x_mac_learn(lan966x, pgid_entry->index, mdb_entry->mac, 7aacb894b1adf8 Horatiu Vultur 2022-01-04 294 mdb_entry->vid, type); 7aacb894b1adf8 Horatiu Vultur 2022-01-04 295 } 7aacb894b1adf8 Horatiu Vultur 2022-01-04 296 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
