tree:
https://github.com/intel/linux-intel-lts.git 4.19/android_r
head: 24f0fbfa4ad1b601f92d91cfcb7f01ad4d0f6acc
commit: b88d999a5b9ae9022e12e1a5810b12b21cb77996 [18600/21549] usb: xhci: dbc: make DbC
modular, introducing dbc_function structure
config: microblaze-randconfig-r011-20210113 (attached as .config)
compiler: microblaze-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
#
https://github.com/intel/linux-intel-lts/commit/b88d999a5b9ae9022e12e1a58...
git remote add intel-linux-intel-lts
https://github.com/intel/linux-intel-lts.git
git fetch --no-tags intel-linux-intel-lts 4.19/android_r
git checkout b88d999a5b9ae9022e12e1a5810b12b21cb77996
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=microblaze
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
drivers/usb/host/xhci-dbgcap.c: In function 'xhci_dbc_populate_strings':
drivers/usb/host/xhci-dbgcap.c:50:36: warning: taking address of packed member of
'struct usb_string_descriptor' may result in an unaligned pointer value
[-Waddress-of-packed-member]
50 | UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
| ^~~~~~
drivers/usb/host/xhci-dbgcap.c:61:36: warning: taking address of packed member of
'struct usb_string_descriptor' may result in an unaligned pointer value
[-Waddress-of-packed-member]
61 | UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
| ^~~~~~
drivers/usb/host/xhci-dbgcap.c:73:36: warning: taking address of packed member of
'struct usb_string_descriptor' may result in an unaligned pointer value
[-Waddress-of-packed-member]
73 | UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
| ^~~~~~
drivers/usb/host/xhci-dbgcap.c: At top level:
> drivers/usb/host/xhci-dbgcap.c:191:6: warning: no previous
prototype for 'xhci_dbc_flush_requests' [-Wmissing-prototypes]
191 |
void xhci_dbc_flush_requests(struct xhci_dbc *dbc)
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/usb/host/xhci-dbgcap.c: In function 'xhci_dbc_handle_events':
> drivers/usb/host/xhci-dbgcap.c:794:8: warning: variable
'ret' set but not used [-Wunused-but-set-variable]
794 | int ret;
| ^~~
drivers/usb/host/xhci-dbgcap.c:18: warning: cannot understand function prototype:
'struct dbc_function *dbc_registered_func; '
vim +/xhci_dbc_flush_requests +191 drivers/usb/host/xhci-dbgcap.c
40
41 static u32 xhci_dbc_populate_strings(struct dbc_str_descs *strings,
42 struct dbc_function *func)
43 {
44 struct usb_string_descriptor *s_desc;
45 u32 string_length;
46
47 /* Serial string: */
48 s_desc = (struct usb_string_descriptor *)strings->serial;
49 utf8s_to_utf16s(func->string.serial, strlen(func->string.serial),
50 UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
51 DBC_MAX_STRING_LENGTH);
52
53 s_desc->bLength = (strlen(func->string.serial) + 1) * 2;
54 s_desc->bDescriptorType = USB_DT_STRING;
55 string_length = s_desc->bLength;
56 string_length <<= 8;
57
58 /* Product string: */
59 s_desc = (struct usb_string_descriptor *)strings->product;
60 utf8s_to_utf16s(func->string.product, strlen(func->string.product),
61 UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
62 DBC_MAX_STRING_LENGTH);
63
64 s_desc->bLength = (strlen(func->string.product) + 1) * 2;
65 s_desc->bDescriptorType = USB_DT_STRING;
66 string_length += s_desc->bLength;
67 string_length <<= 8;
68
69 /* Manufacture string: */
70 s_desc = (struct usb_string_descriptor *)strings->manufacturer;
71 utf8s_to_utf16s(func->string.manufacturer,
72 strlen(func->string.manufacturer),
73 UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
74 DBC_MAX_STRING_LENGTH);
75
76 s_desc->bLength = (strlen(func->string.manufacturer) + 1) * 2;
77 s_desc->bDescriptorType = USB_DT_STRING;
78 string_length += s_desc->bLength;
79 string_length <<= 8;
80
81 /* String0: */
82 strings->string0[0] = 4;
83 strings->string0[1] = USB_DT_STRING;
84 strings->string0[2] = 0x09;
85 strings->string0[3] = 0x04;
86 string_length += 4;
87
88 return string_length;
89 }
90
91 static void xhci_dbc_init_contexts(struct xhci_hcd *xhci,
92 struct dbc_function *func,
93 u32 string_length)
94 {
95 struct xhci_dbc *dbc;
96 struct dbc_info_context *info;
97 struct xhci_ep_ctx *ep_ctx;
98 u32 dev_info;
99 dma_addr_t deq, dma;
100 unsigned int max_burst;
101
102 dbc = xhci->dbc;
103 if (!dbc)
104 return;
105
106 /* Populate info Context: */
107 info = (struct dbc_info_context *)dbc->ctx->bytes;
108 dma = dbc->string_dma;
109 info->string0 = cpu_to_le64(dma);
110 info->manufacturer = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH);
111 info->product = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH * 2);
112 info->serial = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH * 3);
113 info->length = cpu_to_le32(string_length);
114
115 /* Populate bulk out endpoint context: */
116 ep_ctx = dbc_bulkout_ctx(dbc);
117 max_burst = DBC_CTRL_MAXBURST(readl(&dbc->regs->control));
118 deq = dbc_bulkout_enq(dbc);
119 ep_ctx->ep_info = 0;
120 ep_ctx->ep_info2 = dbc_epctx_info2(BULK_OUT_EP, 1024, max_burst);
121 ep_ctx->deq = cpu_to_le64(deq | dbc->ring_out->cycle_state);
122
123 /* Populate bulk in endpoint context: */
124 ep_ctx = dbc_bulkin_ctx(dbc);
125 deq = dbc_bulkin_enq(dbc);
126 ep_ctx->ep_info = 0;
127 ep_ctx->ep_info2 = dbc_epctx_info2(BULK_IN_EP, 1024, max_burst);
128 ep_ctx->deq = cpu_to_le64(deq | dbc->ring_in->cycle_state);
129
130 /* Set DbC context and info registers: */
131 xhci_write_64(xhci, dbc->ctx->dma, &dbc->regs->dccp);
132
133 dev_info = cpu_to_le32((func->vid << 16) | func->protocol);
134 writel(dev_info, &dbc->regs->devinfo1);
135
136 dev_info = cpu_to_le32((func->device_rev << 16) | func->pid);
137 writel(dev_info, &dbc->regs->devinfo2);
138 }
139
140 static void xhci_dbc_giveback(struct dbc_request *req, int status)
141 __releases(&dbc->lock)
142 __acquires(&dbc->lock)
143 {
144 struct dbc_ep *dep = req->dep;
145 struct xhci_dbc *dbc = dep->dbc;
146 struct xhci_hcd *xhci = dbc->xhci;
147 struct device *dev = xhci_to_hcd(dbc->xhci)->self.sysdev;
148
149 list_del_init(&req->list_pending);
150 req->trb_dma = 0;
151 req->trb = NULL;
152
153 if (req->status == -EINPROGRESS)
154 req->status = status;
155
156 trace_xhci_dbc_giveback_request(req);
157
158 dma_unmap_single(dev,
159 req->dma,
160 req->length,
161 dbc_ep_dma_direction(dep));
162
163 /* Give back the transfer request: */
164 spin_unlock(&dbc->lock);
165 req->complete(xhci, req);
166 spin_lock(&dbc->lock);
167 }
168
169 static void xhci_dbc_flush_single_request(struct dbc_request *req)
170 {
171 union xhci_trb *trb = req->trb;
172
173 trb->generic.field[0] = 0;
174 trb->generic.field[1] = 0;
175 trb->generic.field[2] = 0;
176 trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE);
177 trb->generic.field[3] |= cpu_to_le32(TRB_TYPE(TRB_TR_NOOP));
178
179 xhci_dbc_giveback(req, -ESHUTDOWN);
180 }
181
182 static void xhci_dbc_flush_endpoint_requests(struct dbc_ep *dep)
183 {
184 struct dbc_request *req, *tmp;
185
186 list_for_each_entry_safe(req, tmp, &dep->list_pending, list_pending)
187 xhci_dbc_flush_single_request(req);
188 }
189
190
191 void xhci_dbc_flush_requests(struct xhci_dbc *dbc)
192 {
193 xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_OUT]);
194 xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_IN]);
195 }
196 EXPORT_SYMBOL_GPL(xhci_dbc_flush_requests);
197
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org