Hi Benjamin, I love your patch! Perhaps something to improve: [auto build test WARNING on balbi-usb/next] [also build test WARNING on v4.15-rc9 next-20180119] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Benjamin-Herrenschmidt/usb-gadget-Add-an-EP-dispose-callback-for-EP-lifetime-tracking/20180124-065635 base: https://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git next config: m32r-allyesconfig (attached as .config) compiler: m32r-linux-gcc (GCC) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All warnings (new ones prefixed by >>): In file included from arch/m32r/include/uapi/asm/byteorder.h:8:0, from arch/m32r/include/asm/bitops.h:22, from include/linux/bitops.h:38, from include/linux/kernel.h:11, from drivers/usb/gadget/udc/aspeed-vhub/core.c:14: include/linux/byteorder/big_endian.h:8:2: warning: #warning inconsistent configuration, needs CONFIG_CPU_BIG_ENDIAN [-Wcpp] #warning inconsistent configuration, needs CONFIG_CPU_BIG_ENDIAN ^~~~~~~ In file included from include/linux/printk.h:329:0, from include/linux/kernel.h:14, from drivers/usb/gadget/udc/aspeed-vhub/core.c:14: drivers/usb/gadget/udc/aspeed-vhub/core.c: In function 'ast_vhub_irq': >> drivers/usb/gadget/udc/aspeed-vhub/core.c:127:16: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'long unsigned int' [-Wformat=] UDCVDBG(vhub, "irq status=%08x, ep_acks=%08x ep_nacks=%08x\n", ^ include/linux/dynamic_debug.h:135:39: note: in definition of macro 'dynamic_dev_dbg' __dynamic_dev_dbg(&descriptor, dev, fmt, \ ^~~ drivers/usb/gadget/udc/aspeed-vhub/vhub.h:405:28: note: in expansion of macro 'dev_dbg' #define UDCVDBG(u, fmt...) dev_dbg(&(u)->pdev->dev, fmt) ^~~~~~~ drivers/usb/gadget/udc/aspeed-vhub/core.c:127:2: note: in expansion of macro 'UDCVDBG' UDCVDBG(vhub, "irq status=%08x, ep_acks=%08x ep_nacks=%08x\n", ^~~~~~~ drivers/usb/gadget/udc/aspeed-vhub/core.c:127:16: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'long unsigned int' [-Wformat=] UDCVDBG(vhub, "irq status=%08x, ep_acks=%08x ep_nacks=%08x\n", ^ include/linux/dynamic_debug.h:135:39: note: in definition of macro 'dynamic_dev_dbg' __dynamic_dev_dbg(&descriptor, dev, fmt, \ ^~~ drivers/usb/gadget/udc/aspeed-vhub/vhub.h:405:28: note: in expansion of macro 'dev_dbg' #define UDCVDBG(u, fmt...) dev_dbg(&(u)->pdev->dev, fmt) ^~~~~~~ drivers/usb/gadget/udc/aspeed-vhub/core.c:127:2: note: in expansion of macro 'UDCVDBG' UDCVDBG(vhub, "irq status=%08x, ep_acks=%08x ep_nacks=%08x\n", ^~~~~~~ -- In file included from arch/m32r/include/uapi/asm/byteorder.h:8:0, from arch/m32r/include/asm/bitops.h:22, from include/linux/bitops.h:38, from include/linux/kernel.h:11, from drivers/usb/gadget/udc/aspeed-vhub/epn.c:14: include/linux/byteorder/big_endian.h:8:2: warning: #warning inconsistent configuration, needs CONFIG_CPU_BIG_ENDIAN [-Wcpp] #warning inconsistent configuration, needs CONFIG_CPU_BIG_ENDIAN ^~~~~~~ In file included from include/linux/printk.h:329:0, from include/linux/kernel.h:14, from drivers/usb/gadget/udc/aspeed-vhub/epn.c:14: drivers/usb/gadget/udc/aspeed-vhub/epn.c: In function 'ast_vhub_epn_kick_desc': >> drivers/usb/gadget/udc/aspeed-vhub/vhub.h:409:3: warning: format '%x' expects argument of type 'unsigned int', but argument 7 has type 'long unsigned int' [-Wformat=] "%s:EP%d " fmt, \ ^ include/linux/dynamic_debug.h:135:39: note: in definition of macro 'dynamic_dev_dbg' __dynamic_dev_dbg(&descriptor, dev, fmt, \ ^~~ drivers/usb/gadget/udc/aspeed-vhub/vhub.h:408:2: note: in expansion of macro 'dev_dbg' dev_dbg(&(ep)->vhub->pdev->dev, \ ^~~~~~~ drivers/usb/gadget/udc/aspeed-vhub/epn.c:233:2: note: in expansion of macro 'EPVDBG' EPVDBG(ep, "HW kicked, d_next=%d dstat=%08x\n", ^~~~~~ drivers/usb/gadget/udc/aspeed-vhub/epn.c:233:44: note: format string is defined here EPVDBG(ep, "HW kicked, d_next=%d dstat=%08x\n", ~~~^ %08lx vim +127 drivers/usb/gadget/udc/aspeed-vhub/core.c > 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 #include <linux/platform_device.h> 17 #include <linux/delay.h> 18 #include <linux/ioport.h> 19 #include <linux/slab.h> 20 #include <linux/errno.h> 21 #include <linux/list.h> 22 #include <linux/interrupt.h> 23 #include <linux/proc_fs.h> 24 #include <linux/prefetch.h> 25 #include <linux/clk.h> 26 #include <linux/usb/gadget.h> 27 #include <linux/of.h> 28 #include <linux/of_gpio.h> 29 #include <linux/regmap.h> 30 #include <linux/dma-mapping.h> 31 32 #include "vhub.h" 33 34 static bool force_usb1 = false; 35 static bool no_dma_desc = false; 36 37 module_param_named(force_usb1, force_usb1, bool, 0644); 38 MODULE_PARM_DESC(force_usb1, "Set to true to force to USB1 speed"); 39 module_param_named(no_dma_desc, no_dma_desc, bool, 0644); 40 MODULE_PARM_DESC(no_dma_desc, "Set to true to disable use of DMA descriptors"); 41 42 void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req, 43 int status) 44 { 45 bool internal = req->internal; 46 47 EPVDBG(ep, "completing request @%p, status %d\n", req, status); 48 49 list_del_init(&req->queue); 50 51 if (req->req.status == -EINPROGRESS) 52 req->req.status = status; 53 54 if (req->req.dma) { 55 if (!WARN_ON(!ep->dev)) 56 usb_gadget_unmap_request(&ep->dev->gadget, 57 &req->req, ep->epn.is_in); 58 req->req.dma = 0; 59 } 60 61 /* 62 * If this isn't an internal EP0 request, call the core 63 * to call the gadget completion. 64 */ 65 if (!internal) { 66 spin_unlock(&ep->vhub->lock); 67 usb_gadget_giveback_request(&ep->ep, &req->req); 68 spin_lock(&ep->vhub->lock); 69 } 70 } 71 72 void ast_vhub_nuke(struct ast_vhub_ep *ep, int status) 73 { 74 struct ast_vhub_req *req; 75 76 EPDBG(ep, "Nuking\n"); 77 78 /* terminate any request in the queue */ 79 if (list_empty(&ep->queue)) 80 return; 81 82 /* Beware, lock will be dropped & req-acquired by done() */ 83 while (!list_empty(&ep->queue)) { 84 req = list_first_entry(&ep->queue, struct ast_vhub_req, queue); 85 ast_vhub_done(ep, req, status); 86 } 87 } 88 89 struct usb_request *ast_vhub_alloc_request(struct usb_ep *u_ep, 90 gfp_t gfp_flags) 91 { 92 struct ast_vhub_req *req; 93 94 req = kzalloc(sizeof(*req), gfp_flags); 95 if (!req) 96 return NULL; 97 INIT_LIST_HEAD(&req->queue); 98 return &req->req; 99 } 100 101 void ast_vhub_free_request(struct usb_ep *u_ep, struct usb_request *u_req) 102 { 103 struct ast_vhub_req *req = to_ast_req(u_req); 104 105 kfree(req); 106 } 107 108 static irqreturn_t ast_vhub_irq (int irq, void *data) 109 { 110 struct ast_vhub *vhub = data; 111 irqreturn_t iret = IRQ_NONE; 112 u32 istat; 113 114 /* Stale interrupt while tearing down */ 115 if (!vhub->ep0_bufs) 116 return IRQ_NONE; 117 118 spin_lock(&vhub->lock); 119 120 /* Read and ACK interrupts */ 121 istat = readl(vhub->regs + AST_VHUB_ISR); 122 if (!istat) 123 goto bail; 124 writel(istat, vhub->regs + AST_VHUB_ISR); 125 iret = IRQ_HANDLED; 126 > 127 UDCVDBG(vhub, "irq status=%08x, ep_acks=%08x ep_nacks=%08x\n", 128 istat, 129 readl(vhub->regs + AST_VHUB_EP_ACK_ISR), 130 readl(vhub->regs + AST_VHUB_EP_NACK_ISR)); 131 132 /* Handle generic EPs first */ 133 if (istat & VHUB_IRQ_EP_POOL_ACK_STALL) { 134 u32 i, ep_acks = readl(vhub->regs + AST_VHUB_EP_ACK_ISR); 135 writel(ep_acks, vhub->regs + AST_VHUB_EP_ACK_ISR); 136 137 /* Check if we have a useful ffs on arm ... */ 138 for (i = 0; ep_acks && i < AST_VHUB_NUM_GEN_EPs; i++) { 139 u32 mask = 1 << i; 140 if (ep_acks & mask) { 141 ast_vhub_epn_ack_irq(&vhub->epns[i]); 142 ep_acks &= ~mask; 143 } 144 } 145 } 146 147 /* Handle device interrupts */ 148 if (istat & (VHUB_IRQ_DEVICE1 | 149 VHUB_IRQ_DEVICE2 | 150 VHUB_IRQ_DEVICE3 | 151 VHUB_IRQ_DEVICE4 | 152 VHUB_IRQ_DEVICE5)) { 153 if (istat & VHUB_IRQ_DEVICE1) 154 ast_vhub_dev_irq(&vhub->ports[0].dev); 155 if (istat & VHUB_IRQ_DEVICE2) 156 ast_vhub_dev_irq(&vhub->ports[1].dev); 157 if (istat & VHUB_IRQ_DEVICE3) 158 ast_vhub_dev_irq(&vhub->ports[2].dev); 159 if (istat & VHUB_IRQ_DEVICE4) 160 ast_vhub_dev_irq(&vhub->ports[3].dev); 161 if (istat & VHUB_IRQ_DEVICE5) 162 ast_vhub_dev_irq(&vhub->ports[4].dev); 163 } 164 165 /* Handle top-level vHub EP0 interrupts */ 166 if (istat & (VHUB_IRQ_HUB_EP0_OUT_ACK_STALL | 167 VHUB_IRQ_HUB_EP0_IN_ACK_STALL | 168 VHUB_IRQ_HUB_EP0_SETUP)) { 169 if (istat & VHUB_IRQ_HUB_EP0_IN_ACK_STALL) 170 ast_vhub_ep0_handle_ack(&vhub->ep0, true); 171 if (istat & VHUB_IRQ_HUB_EP0_OUT_ACK_STALL) 172 ast_vhub_ep0_handle_ack(&vhub->ep0, false); 173 if (istat & VHUB_IRQ_HUB_EP0_SETUP) 174 ast_vhub_ep0_handle_setup(&vhub->ep0); 175 } 176 177 /* Various top level bus events */ 178 if (istat & (VHUB_IRQ_BUS_RESUME | 179 VHUB_IRQ_BUS_SUSPEND | 180 VHUB_IRQ_BUS_RESET)) { 181 if (istat & VHUB_IRQ_BUS_RESUME) 182 ast_vhub_hub_resume(vhub); 183 if (istat & VHUB_IRQ_BUS_SUSPEND) 184 ast_vhub_hub_suspend(vhub); 185 if (istat & VHUB_IRQ_BUS_RESET) 186 ast_vhub_hub_reset(vhub); 187 } 188 189 bail: 190 spin_unlock(&vhub->lock); 191 return iret; 192 } 193 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip