Message ID | 1460057210-55786-6-git-send-email-blogic@openwrt.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi John, [auto build test ERROR on net-next/master] [also build test ERROR on v4.6-rc2 next-20160407] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/John-Crispin/net-mediatek-make-the-driver-pass-stress-tests/20160408-033430 config: arm-allyesconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm Note: the linux-review/John-Crispin/net-mediatek-make-the-driver-pass-stress-tests/20160408-033430 HEAD e648090f60723da77108430208b4b957c481048b builds fine. It only hurts bisectibility. All error/warnings (new ones prefixed by >>): In file included from include/linux/list.h:8:0, from include/linux/kobject.h:20, from include/linux/device.h:17, from include/linux/node.h:17, from include/linux/cpu.h:16, from include/linux/of_device.h:4, from drivers/net/ethernet/mediatek/mtk_eth_soc.c:15: drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_pending_work': >> include/linux/kernel.h:824:27: error: 'struct mtk_eth' has no member named 'pending_work' const typeof( ((type *)0)->member ) *__mptr = (ptr); \ ^ >> drivers/net/ethernet/mediatek/mtk_eth_soc.c:1433:24: note: in expansion of macro 'container_of' struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); ^ include/linux/kernel.h:824:48: warning: initialization from incompatible pointer type const typeof( ((type *)0)->member ) *__mptr = (ptr); \ ^ >> drivers/net/ethernet/mediatek/mtk_eth_soc.c:1433:24: note: in expansion of macro 'container_of' struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); ^ include/linux/kernel.h:824:48: warning: (near initialization for 'eth') const typeof( ((type *)0)->member ) *__mptr = (ptr); \ ^ >> drivers/net/ethernet/mediatek/mtk_eth_soc.c:1433:24: note: in expansion of macro 'container_of' struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); ^ In file included from include/linux/compiler.h:60:0, from include/linux/ioport.h:12, from include/linux/device.h:16, from include/linux/node.h:17, from include/linux/cpu.h:16, from include/linux/of_device.h:4, from drivers/net/ethernet/mediatek/mtk_eth_soc.c:15: >> include/linux/compiler-gcc.h:158:2: error: 'struct mtk_eth' has no member named 'pending_work' __builtin_offsetof(a, b) ^ include/linux/stddef.h:16:32: note: in expansion of macro '__compiler_offsetof' #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) ^ include/linux/kernel.h:825:29: note: in expansion of macro 'offsetof' (type *)( (char *)__mptr - offsetof(type,member) );}) ^ >> drivers/net/ethernet/mediatek/mtk_eth_soc.c:1433:24: note: in expansion of macro 'container_of' struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); ^ vim +824 include/linux/kernel.h ^1da177e Linus Torvalds 2005-04-16 818 * @ptr: the pointer to the member. ^1da177e Linus Torvalds 2005-04-16 819 * @type: the type of the container struct this is embedded in. ^1da177e Linus Torvalds 2005-04-16 820 * @member: the name of the member within the struct. ^1da177e Linus Torvalds 2005-04-16 821 * ^1da177e Linus Torvalds 2005-04-16 822 */ ^1da177e Linus Torvalds 2005-04-16 823 #define container_of(ptr, type, member) ({ \ ^1da177e Linus Torvalds 2005-04-16 @824 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ ^1da177e Linus Torvalds 2005-04-16 825 (type *)( (char *)__mptr - offsetof(type,member) );}) ^1da177e Linus Torvalds 2005-04-16 826 b9d4f426 Arnaud Lacombe 2011-07-25 827 /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ :::::: The code at line 824 was first introduced by commit :::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2 :::::: TO: Linus Torvalds <torvalds@ppc970.osdl.org> :::::: CC: Linus Torvalds <torvalds@ppc970.osdl.org> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 4ebc42e..60b66ab 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -1430,19 +1430,30 @@ static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static void mtk_pending_work(struct work_struct *work) { - struct mtk_mac *mac = container_of(work, struct mtk_mac, pending_work); - struct mtk_eth *eth = mac->hw; - struct net_device *dev = eth->netdev[mac->id]; - int err; + struct mtk_eth *eth = container_of(work, struct mtk_eth, pending_work); + int err, i; + unsigned long restart = 0; rtnl_lock(); - mtk_stop(dev); - err = mtk_open(dev); - if (err) { - netif_alert(eth, ifup, dev, - "Driver up/down cycle failed, closing device.\n"); - dev_close(dev); + /* stop all devices to make sure that dma is properly shut down */ + for (i = 0; i < MTK_MAC_COUNT; i++) { + if (!netif_oper_up(eth->netdev[i])) + continue; + mtk_stop(eth->netdev[i]); + __set_bit(i, &restart); + } + + /* restart DMA and enable IRQs */ + for (i = 0; i < MTK_MAC_COUNT; i++) { + if (!test_bit(i, &restart)) + continue; + err = mtk_open(eth->netdev[i]); + if (err) { + netif_alert(eth, ifup, eth->netdev[i], + "Driver up/down cycle failed, closing device.\n"); + dev_close(eth->netdev[i]); + } } rtnl_unlock(); }
The driver supports 2 MACs. Both run on the same DMA ring. If we hit a TX timeout we need to stop both netdevs before restarting them again. If we don't do this, mtk_stop() wont shutdown DMA and the consecutive call to mtk_open() wont restart DMA and enable IRQs. Signed-off-by: John Crispin <blogic@openwrt.org> --- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 31 ++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-)