Hi Jakub, It's probably a bug fix that unveils the link errors. tree: https://github.com/alaahl/linux.git netdev-next head: 5f04ed74a8a3bcb2122738b7eda857187e85aa34 commit: ab44081fef9b5d31ea5641494c9a379b0ebe1839 [16/21] sfc: fix build without CONFIG_RFS_ACCEL config: powerpc-randconfig-a001-20191214 (attached as .config) compiler: powerpc-linux-gcc (GCC) 7.5.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout ab44081fef9b5d31ea5641494c9a379b0ebe1839 # save the attached .config to linux build tree GCC_VERSION=7.5.0 make.cross ARCH=powerpc If you fix the issue, kindly add following tag Reported-by: kbuild test robot All errors (new ones prefixed by >>): drivers/net/dsa/ocelot/felix.o: In function `felix_txtstamp': >> drivers/net/dsa/ocelot/felix.c:357: undefined reference to `ocelot_port_add_txtstamp_skb' drivers/net/dsa/ocelot/felix.o: In function `felix_vlan_add': drivers/net/dsa/ocelot/felix.c:112: undefined reference to `ocelot_vlan_add' drivers/net/dsa/ocelot/felix.o: In function `felix_hwtstamp_set': >> drivers/net/dsa/ocelot/felix.c:320: undefined reference to `ocelot_hwstamp_set' drivers/net/dsa/ocelot/felix.o: In function `felix_teardown': drivers/net/dsa/ocelot/felix.c:304: undefined reference to `ocelot_deinit' drivers/net/dsa/ocelot/felix.o: In function `felix_port_enable': drivers/net/dsa/ocelot/felix.c:146: undefined reference to `ocelot_port_enable' drivers/net/dsa/ocelot/felix.o: In function `felix_port_disable': drivers/net/dsa/ocelot/felix.c:155: undefined reference to `ocelot_port_disable' drivers/net/dsa/ocelot/felix.o: In function `felix_get_strings': drivers/net/dsa/ocelot/felix.c:163: undefined reference to `ocelot_get_strings' drivers/net/dsa/ocelot/felix.o: In function `felix_init_structs': drivers/net/dsa/ocelot/felix.c:220: undefined reference to `ocelot_regmap_init' drivers/net/dsa/ocelot/felix.c:230: undefined reference to `ocelot_regfields_init' drivers/net/dsa/ocelot/felix.o: In function `felix_setup': drivers/net/dsa/ocelot/felix.c:285: undefined reference to `ocelot_init' drivers/net/dsa/ocelot/felix.c:288: undefined reference to `ocelot_init_port' drivers/net/dsa/ocelot/felix.c:291: undefined reference to `ocelot_set_cpu_port' drivers/net/dsa/ocelot/felix.o: In function `felix_vlan_filtering': drivers/net/dsa/ocelot/felix.c:99: undefined reference to `ocelot_port_vlan_filtering' drivers/net/dsa/ocelot/felix.o: In function `felix_fdb_dump': drivers/net/dsa/ocelot/felix.c:42: undefined reference to `ocelot_fdb_dump' drivers/net/dsa/ocelot/felix.o: In function `felix_hwtstamp_get': >> drivers/net/dsa/ocelot/felix.c:312: undefined reference to `ocelot_hwstamp_get' drivers/net/dsa/ocelot/felix.o: In function `felix_vlan_del': drivers/net/dsa/ocelot/felix.c:131: undefined reference to `ocelot_vlan_del' drivers/net/dsa/ocelot/felix.o: In function `felix_get_ethtool_stats': drivers/net/dsa/ocelot/felix.c:170: undefined reference to `ocelot_get_ethtool_stats' drivers/net/dsa/ocelot/felix.o: In function `felix_get_ts_info': drivers/net/dsa/ocelot/felix.c:185: undefined reference to `ocelot_get_ts_info' drivers/net/dsa/ocelot/felix.o: In function `felix_set_ageing_time': drivers/net/dsa/ocelot/felix.c:24: undefined reference to `ocelot_set_ageing_time' drivers/net/dsa/ocelot/felix.o: In function `felix_get_sset_count': drivers/net/dsa/ocelot/felix.c:177: undefined reference to `ocelot_get_sset_count' drivers/net/dsa/ocelot/felix.o: In function `felix_fdb_del': drivers/net/dsa/ocelot/felix.c:61: undefined reference to `ocelot_fdb_del' drivers/net/dsa/ocelot/felix.o: In function `felix_bridge_leave': drivers/net/dsa/ocelot/felix.c:85: undefined reference to `ocelot_port_bridge_leave' drivers/net/dsa/ocelot/felix.o: In function `felix_adjust_link': drivers/net/dsa/ocelot/felix.c:34: undefined reference to `ocelot_adjust_link' drivers/net/dsa/ocelot/felix.o: In function `felix_fdb_add': drivers/net/dsa/ocelot/felix.c:53: undefined reference to `ocelot_fdb_add' drivers/net/dsa/ocelot/felix.c:53: undefined reference to `ocelot_fdb_add' drivers/net/dsa/ocelot/felix.o: In function `felix_rxtstamp': >> drivers/net/dsa/ocelot/felix.c:333: undefined reference to `ocelot_ptp_gettime64' drivers/net/dsa/ocelot/felix.o: In function `felix_bridge_stp_state_set': drivers/net/dsa/ocelot/felix.c:69: undefined reference to `ocelot_bridge_stp_state_set' drivers/net/dsa/ocelot/felix.o: In function `felix_bridge_join': drivers/net/dsa/ocelot/felix.c:77: undefined reference to `ocelot_port_bridge_join' drivers/net/dsa/ocelot/felix.o: In function `felix_irq_handler': >> drivers/net/dsa/ocelot/felix.c:407: undefined reference to `ocelot_get_txtstamp' drivers/net/dsa/ocelot/felix_vsc9959.o: In function `vsc9959_reset': drivers/net/dsa/ocelot/felix_vsc9959.c:553: undefined reference to `__ocelot_write_ix' drivers/net/dsa/ocelot/felix_vsc9959.o: In function `vsc9959_sys_ram_init_status': drivers/net/dsa/ocelot/felix_vsc9959.c:535: undefined reference to `__ocelot_read_ix' drivers/net/dsa/ocelot/felix_vsc9959.c:535: undefined reference to `__ocelot_read_ix' drivers/net/dsa/ocelot/felix_vsc9959.c:535: undefined reference to `__ocelot_read_ix' vim +357 drivers/net/dsa/ocelot/felix.c 56051948773eeb Vladimir Oltean 2019-11-14 269 56051948773eeb Vladimir Oltean 2019-11-14 270 /* Hardware initialization done here so that we can allocate structures with 56051948773eeb Vladimir Oltean 2019-11-14 271 * devm without fear of dsa_register_switch returning -EPROBE_DEFER and causing 56051948773eeb Vladimir Oltean 2019-11-14 272 * us to allocate structures twice (leak memory) and map PCI memory twice 56051948773eeb Vladimir Oltean 2019-11-14 273 * (which will not work). 56051948773eeb Vladimir Oltean 2019-11-14 274 */ 56051948773eeb Vladimir Oltean 2019-11-14 275 static int felix_setup(struct dsa_switch *ds) 56051948773eeb Vladimir Oltean 2019-11-14 276 { 56051948773eeb Vladimir Oltean 2019-11-14 277 struct ocelot *ocelot = ds->priv; 56051948773eeb Vladimir Oltean 2019-11-14 278 struct felix *felix = ocelot_to_felix(ocelot); 56051948773eeb Vladimir Oltean 2019-11-14 279 int port, err; 56051948773eeb Vladimir Oltean 2019-11-14 280 56051948773eeb Vladimir Oltean 2019-11-14 281 err = felix_init_structs(felix, ds->num_ports); 56051948773eeb Vladimir Oltean 2019-11-14 282 if (err) 56051948773eeb Vladimir Oltean 2019-11-14 283 return err; 56051948773eeb Vladimir Oltean 2019-11-14 284 56051948773eeb Vladimir Oltean 2019-11-14 @285 ocelot_init(ocelot); 56051948773eeb Vladimir Oltean 2019-11-14 286 56051948773eeb Vladimir Oltean 2019-11-14 287 for (port = 0; port < ds->num_ports; port++) { 56051948773eeb Vladimir Oltean 2019-11-14 288 ocelot_init_port(ocelot, port); 56051948773eeb Vladimir Oltean 2019-11-14 289 b8fc7177d8aef1 Vladimir Oltean 2019-11-18 290 if (dsa_is_cpu_port(ds, port)) 56051948773eeb Vladimir Oltean 2019-11-14 291 ocelot_set_cpu_port(ocelot, port, 56051948773eeb Vladimir Oltean 2019-11-14 292 OCELOT_TAG_PREFIX_NONE, 56051948773eeb Vladimir Oltean 2019-11-14 293 OCELOT_TAG_PREFIX_LONG); 56051948773eeb Vladimir Oltean 2019-11-14 294 } 56051948773eeb Vladimir Oltean 2019-11-14 295 56051948773eeb Vladimir Oltean 2019-11-14 296 return 0; 56051948773eeb Vladimir Oltean 2019-11-14 297 } 56051948773eeb Vladimir Oltean 2019-11-14 298 56051948773eeb Vladimir Oltean 2019-11-14 299 static void felix_teardown(struct dsa_switch *ds) 56051948773eeb Vladimir Oltean 2019-11-14 300 { 56051948773eeb Vladimir Oltean 2019-11-14 301 struct ocelot *ocelot = ds->priv; 56051948773eeb Vladimir Oltean 2019-11-14 302 56051948773eeb Vladimir Oltean 2019-11-14 303 /* stop workqueue thread */ 56051948773eeb Vladimir Oltean 2019-11-14 304 ocelot_deinit(ocelot); 56051948773eeb Vladimir Oltean 2019-11-14 305 } 56051948773eeb Vladimir Oltean 2019-11-14 306 c0bcf537667cf8 Yangbo Lu 2019-11-20 307 static int felix_hwtstamp_get(struct dsa_switch *ds, int port, c0bcf537667cf8 Yangbo Lu 2019-11-20 308 struct ifreq *ifr) c0bcf537667cf8 Yangbo Lu 2019-11-20 309 { c0bcf537667cf8 Yangbo Lu 2019-11-20 310 struct ocelot *ocelot = ds->priv; c0bcf537667cf8 Yangbo Lu 2019-11-20 311 c0bcf537667cf8 Yangbo Lu 2019-11-20 @312 return ocelot_hwstamp_get(ocelot, port, ifr); c0bcf537667cf8 Yangbo Lu 2019-11-20 313 } c0bcf537667cf8 Yangbo Lu 2019-11-20 314 c0bcf537667cf8 Yangbo Lu 2019-11-20 315 static int felix_hwtstamp_set(struct dsa_switch *ds, int port, c0bcf537667cf8 Yangbo Lu 2019-11-20 316 struct ifreq *ifr) c0bcf537667cf8 Yangbo Lu 2019-11-20 317 { c0bcf537667cf8 Yangbo Lu 2019-11-20 318 struct ocelot *ocelot = ds->priv; c0bcf537667cf8 Yangbo Lu 2019-11-20 319 c0bcf537667cf8 Yangbo Lu 2019-11-20 @320 return ocelot_hwstamp_set(ocelot, port, ifr); c0bcf537667cf8 Yangbo Lu 2019-11-20 321 } c0bcf537667cf8 Yangbo Lu 2019-11-20 322 c0bcf537667cf8 Yangbo Lu 2019-11-20 323 static bool felix_rxtstamp(struct dsa_switch *ds, int port, c0bcf537667cf8 Yangbo Lu 2019-11-20 324 struct sk_buff *skb, unsigned int type) c0bcf537667cf8 Yangbo Lu 2019-11-20 325 { c0bcf537667cf8 Yangbo Lu 2019-11-20 326 struct skb_shared_hwtstamps *shhwtstamps; c0bcf537667cf8 Yangbo Lu 2019-11-20 327 struct ocelot *ocelot = ds->priv; c0bcf537667cf8 Yangbo Lu 2019-11-20 328 u8 *extraction = skb->data - ETH_HLEN - OCELOT_TAG_LEN; c0bcf537667cf8 Yangbo Lu 2019-11-20 329 u32 tstamp_lo, tstamp_hi; c0bcf537667cf8 Yangbo Lu 2019-11-20 330 struct timespec64 ts; c0bcf537667cf8 Yangbo Lu 2019-11-20 331 u64 tstamp, val; c0bcf537667cf8 Yangbo Lu 2019-11-20 332 c0bcf537667cf8 Yangbo Lu 2019-11-20 @333 ocelot_ptp_gettime64(&ocelot->ptp_info, &ts); c0bcf537667cf8 Yangbo Lu 2019-11-20 334 tstamp = ktime_set(ts.tv_sec, ts.tv_nsec); c0bcf537667cf8 Yangbo Lu 2019-11-20 335 c0bcf537667cf8 Yangbo Lu 2019-11-20 336 packing(extraction, &val, 116, 85, OCELOT_TAG_LEN, UNPACK, 0); c0bcf537667cf8 Yangbo Lu 2019-11-20 337 tstamp_lo = (u32)val; c0bcf537667cf8 Yangbo Lu 2019-11-20 338 c0bcf537667cf8 Yangbo Lu 2019-11-20 339 tstamp_hi = tstamp >> 32; c0bcf537667cf8 Yangbo Lu 2019-11-20 340 if ((tstamp & 0xffffffff) < tstamp_lo) c0bcf537667cf8 Yangbo Lu 2019-11-20 341 tstamp_hi--; c0bcf537667cf8 Yangbo Lu 2019-11-20 342 c0bcf537667cf8 Yangbo Lu 2019-11-20 343 tstamp = ((u64)tstamp_hi << 32) | tstamp_lo; c0bcf537667cf8 Yangbo Lu 2019-11-20 344 c0bcf537667cf8 Yangbo Lu 2019-11-20 345 shhwtstamps = skb_hwtstamps(skb); c0bcf537667cf8 Yangbo Lu 2019-11-20 346 memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps)); c0bcf537667cf8 Yangbo Lu 2019-11-20 347 shhwtstamps->hwtstamp = tstamp; c0bcf537667cf8 Yangbo Lu 2019-11-20 348 return false; c0bcf537667cf8 Yangbo Lu 2019-11-20 349 } c0bcf537667cf8 Yangbo Lu 2019-11-20 350 3243e04ab1c06e Chen Wandun 2019-11-22 351 static bool felix_txtstamp(struct dsa_switch *ds, int port, c0bcf537667cf8 Yangbo Lu 2019-11-20 352 struct sk_buff *clone, unsigned int type) c0bcf537667cf8 Yangbo Lu 2019-11-20 353 { c0bcf537667cf8 Yangbo Lu 2019-11-20 354 struct ocelot *ocelot = ds->priv; c0bcf537667cf8 Yangbo Lu 2019-11-20 355 struct ocelot_port *ocelot_port = ocelot->ports[port]; c0bcf537667cf8 Yangbo Lu 2019-11-20 356 c0bcf537667cf8 Yangbo Lu 2019-11-20 @357 if (!ocelot_port_add_txtstamp_skb(ocelot_port, clone)) c0bcf537667cf8 Yangbo Lu 2019-11-20 358 return true; c0bcf537667cf8 Yangbo Lu 2019-11-20 359 c0bcf537667cf8 Yangbo Lu 2019-11-20 360 return false; c0bcf537667cf8 Yangbo Lu 2019-11-20 361 } c0bcf537667cf8 Yangbo Lu 2019-11-20 362 56051948773eeb Vladimir Oltean 2019-11-14 363 static const struct dsa_switch_ops felix_switch_ops = { 56051948773eeb Vladimir Oltean 2019-11-14 364 .get_tag_protocol = felix_get_tag_protocol, 56051948773eeb Vladimir Oltean 2019-11-14 365 .setup = felix_setup, 56051948773eeb Vladimir Oltean 2019-11-14 366 .teardown = felix_teardown, 56051948773eeb Vladimir Oltean 2019-11-14 367 .set_ageing_time = felix_set_ageing_time, 56051948773eeb Vladimir Oltean 2019-11-14 368 .get_strings = felix_get_strings, 56051948773eeb Vladimir Oltean 2019-11-14 369 .get_ethtool_stats = felix_get_ethtool_stats, 56051948773eeb Vladimir Oltean 2019-11-14 370 .get_sset_count = felix_get_sset_count, 56051948773eeb Vladimir Oltean 2019-11-14 371 .get_ts_info = felix_get_ts_info, 56051948773eeb Vladimir Oltean 2019-11-14 372 .adjust_link = felix_adjust_link, 56051948773eeb Vladimir Oltean 2019-11-14 373 .port_enable = felix_port_enable, 56051948773eeb Vladimir Oltean 2019-11-14 374 .port_disable = felix_port_disable, 56051948773eeb Vladimir Oltean 2019-11-14 375 .port_fdb_dump = felix_fdb_dump, 56051948773eeb Vladimir Oltean 2019-11-14 376 .port_fdb_add = felix_fdb_add, 56051948773eeb Vladimir Oltean 2019-11-14 377 .port_fdb_del = felix_fdb_del, 56051948773eeb Vladimir Oltean 2019-11-14 378 .port_bridge_join = felix_bridge_join, 56051948773eeb Vladimir Oltean 2019-11-14 379 .port_bridge_leave = felix_bridge_leave, 56051948773eeb Vladimir Oltean 2019-11-14 380 .port_stp_state_set = felix_bridge_stp_state_set, 56051948773eeb Vladimir Oltean 2019-11-14 381 .port_vlan_prepare = felix_vlan_prepare, 56051948773eeb Vladimir Oltean 2019-11-14 382 .port_vlan_filtering = felix_vlan_filtering, 56051948773eeb Vladimir Oltean 2019-11-14 383 .port_vlan_add = felix_vlan_add, 56051948773eeb Vladimir Oltean 2019-11-14 384 .port_vlan_del = felix_vlan_del, c0bcf537667cf8 Yangbo Lu 2019-11-20 385 .port_hwtstamp_get = felix_hwtstamp_get, c0bcf537667cf8 Yangbo Lu 2019-11-20 386 .port_hwtstamp_set = felix_hwtstamp_set, c0bcf537667cf8 Yangbo Lu 2019-11-20 387 .port_rxtstamp = felix_rxtstamp, c0bcf537667cf8 Yangbo Lu 2019-11-20 388 .port_txtstamp = felix_txtstamp, 56051948773eeb Vladimir Oltean 2019-11-14 389 }; 56051948773eeb Vladimir Oltean 2019-11-14 390 56051948773eeb Vladimir Oltean 2019-11-14 391 static struct felix_info *felix_instance_tbl[] = { 56051948773eeb Vladimir Oltean 2019-11-14 392 [FELIX_INSTANCE_VSC9959] = &felix_info_vsc9959, 56051948773eeb Vladimir Oltean 2019-11-14 393 }; 56051948773eeb Vladimir Oltean 2019-11-14 394 c0bcf537667cf8 Yangbo Lu 2019-11-20 395 static irqreturn_t felix_irq_handler(int irq, void *data) c0bcf537667cf8 Yangbo Lu 2019-11-20 396 { c0bcf537667cf8 Yangbo Lu 2019-11-20 397 struct ocelot *ocelot = (struct ocelot *)data; c0bcf537667cf8 Yangbo Lu 2019-11-20 398 c0bcf537667cf8 Yangbo Lu 2019-11-20 399 /* The INTB interrupt is used for both PTP TX timestamp interrupt c0bcf537667cf8 Yangbo Lu 2019-11-20 400 * and preemption status change interrupt on each port. c0bcf537667cf8 Yangbo Lu 2019-11-20 401 * c0bcf537667cf8 Yangbo Lu 2019-11-20 402 * - Get txtstamp if have c0bcf537667cf8 Yangbo Lu 2019-11-20 403 * - TODO: handle preemption. Without handling it, driver may get c0bcf537667cf8 Yangbo Lu 2019-11-20 404 * interrupt storm. c0bcf537667cf8 Yangbo Lu 2019-11-20 405 */ c0bcf537667cf8 Yangbo Lu 2019-11-20 406 c0bcf537667cf8 Yangbo Lu 2019-11-20 @407 ocelot_get_txtstamp(ocelot); c0bcf537667cf8 Yangbo Lu 2019-11-20 408 c0bcf537667cf8 Yangbo Lu 2019-11-20 409 return IRQ_HANDLED; c0bcf537667cf8 Yangbo Lu 2019-11-20 410 } c0bcf537667cf8 Yangbo Lu 2019-11-20 411 :::::: The code at line 357 was first introduced by commit :::::: c0bcf537667cf88bbcbb377d01d2b79c45265741 net: dsa: ocelot: add hardware timestamping support for Felix :::::: TO: Yangbo Lu :::::: CC: David S. Miller --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org Intel Corporation