1 1.16 skrll /* $NetBSD: dwc2_hcdqueue.c,v 1.16 2021/12/21 09:51:22 skrll Exp $ */ 2 1.4 skrll 3 1.1 skrll /* 4 1.1 skrll * hcd_queue.c - DesignWare HS OTG Controller host queuing routines 5 1.1 skrll * 6 1.1 skrll * Copyright (C) 2004-2013 Synopsys, Inc. 7 1.1 skrll * 8 1.1 skrll * Redistribution and use in source and binary forms, with or without 9 1.1 skrll * modification, are permitted provided that the following conditions 10 1.1 skrll * are met: 11 1.1 skrll * 1. Redistributions of source code must retain the above copyright 12 1.1 skrll * notice, this list of conditions, and the following disclaimer, 13 1.1 skrll * without modification. 14 1.1 skrll * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 skrll * notice, this list of conditions and the following disclaimer in the 16 1.1 skrll * documentation and/or other materials provided with the distribution. 17 1.1 skrll * 3. The names of the above-listed copyright holders may not be used 18 1.1 skrll * to endorse or promote products derived from this software without 19 1.1 skrll * specific prior written permission. 20 1.1 skrll * 21 1.1 skrll * ALTERNATIVELY, this software may be distributed under the terms of the 22 1.1 skrll * GNU General Public License ("GPL") as published by the Free Software 23 1.1 skrll * Foundation; either version 2 of the License, or (at your option) any 24 1.1 skrll * later version. 25 1.1 skrll * 26 1.1 skrll * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 27 1.1 skrll * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 28 1.1 skrll * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 1.1 skrll * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 30 1.1 skrll * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 31 1.1 skrll * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 32 1.1 skrll * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 33 1.1 skrll * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 34 1.1 skrll * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 35 1.1 skrll * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 36 1.1 skrll * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 1.1 skrll */ 38 1.1 skrll 39 1.1 skrll /* 40 1.1 skrll * This file contains the functions to manage Queue Heads and Queue 41 1.1 skrll * Transfer Descriptors for Host mode 42 1.1 skrll */ 43 1.2 skrll 44 1.2 skrll #include <sys/cdefs.h> 45 1.16 skrll __KERNEL_RCSID(0, "$NetBSD: dwc2_hcdqueue.c,v 1.16 2021/12/21 09:51:22 skrll Exp $"); 46 1.2 skrll 47 1.2 skrll #include <sys/types.h> 48 1.2 skrll #include <sys/kmem.h> 49 1.2 skrll #include <sys/pool.h> 50 1.2 skrll 51 1.2 skrll #include <dev/usb/usb.h> 52 1.2 skrll #include <dev/usb/usbdi.h> 53 1.2 skrll #include <dev/usb/usbdivar.h> 54 1.2 skrll #include <dev/usb/usb_mem.h> 55 1.2 skrll 56 1.2 skrll #include <machine/param.h> 57 1.2 skrll 58 1.1 skrll #include <linux/kernel.h> 59 1.1 skrll 60 1.2 skrll #include <dwc2/dwc2.h> 61 1.2 skrll #include <dwc2/dwc2var.h> 62 1.2 skrll 63 1.2 skrll #include "dwc2_core.h" 64 1.2 skrll #include "dwc2_hcd.h" 65 1.1 skrll 66 1.2 skrll static u32 dwc2_calc_bus_time(struct dwc2_hsotg *, int, int, int, int); 67 1.15 simonb static void dwc2_wait_timer_fn(void *); 68 1.15 simonb 69 1.15 simonb /* If we get a NAK, wait this long before retrying */ 70 1.15 simonb #define DWC2_RETRY_WAIT_DELAY 1 /* msec */ 71 1.1 skrll 72 1.1 skrll /** 73 1.1 skrll * dwc2_qh_init() - Initializes a QH structure 74 1.1 skrll * 75 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 76 1.1 skrll * @qh: The QH to init 77 1.1 skrll * @urb: Holds the information about the device/endpoint needed to initialize 78 1.1 skrll * the QH 79 1.1 skrll */ 80 1.1 skrll #define SCHEDULE_SLOP 10 81 1.1 skrll static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, 82 1.1 skrll struct dwc2_hcd_urb *urb) 83 1.1 skrll { 84 1.1 skrll int dev_speed, hub_addr, hub_port; 85 1.1 skrll 86 1.1 skrll dev_vdbg(hsotg->dev, "%s()\n", __func__); 87 1.1 skrll 88 1.1 skrll /* Initialize QH */ 89 1.15 simonb qh->hsotg = hsotg; 90 1.15 simonb /* XXX timer_setup(&qh->wait_timer, dwc2_wait_timer_fn, 0); */ 91 1.15 simonb callout_init(&qh->wait_timer, 0); 92 1.15 simonb callout_setfunc(&qh->wait_timer, dwc2_wait_timer_fn, qh); 93 1.1 skrll qh->ep_type = dwc2_hcd_get_pipe_type(&urb->pipe_info); 94 1.1 skrll qh->ep_is_in = dwc2_hcd_is_pipe_in(&urb->pipe_info) ? 1 : 0; 95 1.1 skrll 96 1.1 skrll qh->data_toggle = DWC2_HC_PID_DATA0; 97 1.1 skrll qh->maxp = dwc2_hcd_get_mps(&urb->pipe_info); 98 1.1 skrll INIT_LIST_HEAD(&qh->qtd_list); 99 1.1 skrll INIT_LIST_HEAD(&qh->qh_list_entry); 100 1.1 skrll 101 1.1 skrll /* FS/LS Endpoint on HS Hub, NOT virtual root hub */ 102 1.1 skrll dev_speed = dwc2_host_get_speed(hsotg, urb->priv); 103 1.1 skrll 104 1.1 skrll dwc2_host_hub_info(hsotg, urb->priv, &hub_addr, &hub_port); 105 1.11 skrll qh->nak_frame = 0xffff; 106 1.1 skrll 107 1.1 skrll if ((dev_speed == USB_SPEED_LOW || dev_speed == USB_SPEED_FULL) && 108 1.1 skrll hub_addr != 0 && hub_addr != 1) { 109 1.1 skrll dev_vdbg(hsotg->dev, 110 1.1 skrll "QH init: EP %d: TT found at hub addr %d, for port %d\n", 111 1.1 skrll dwc2_hcd_get_ep_num(&urb->pipe_info), hub_addr, 112 1.1 skrll hub_port); 113 1.1 skrll qh->do_split = 1; 114 1.1 skrll } 115 1.1 skrll 116 1.1 skrll if (qh->ep_type == USB_ENDPOINT_XFER_INT || 117 1.1 skrll qh->ep_type == USB_ENDPOINT_XFER_ISOC) { 118 1.1 skrll /* Compute scheduling parameters once and save them */ 119 1.1 skrll u32 hprt, prtspd; 120 1.1 skrll 121 1.1 skrll /* Todo: Account for split transfers in the bus time */ 122 1.1 skrll int bytecount = 123 1.1 skrll dwc2_hb_mult(qh->maxp) * dwc2_max_packet(qh->maxp); 124 1.1 skrll 125 1.2 skrll qh->usecs = dwc2_calc_bus_time(hsotg, qh->do_split ? 126 1.1 skrll USB_SPEED_HIGH : dev_speed, qh->ep_is_in, 127 1.1 skrll qh->ep_type == USB_ENDPOINT_XFER_ISOC, 128 1.2 skrll bytecount); 129 1.14 skrll 130 1.14 skrll /* Ensure frame_number corresponds to the reality */ 131 1.14 skrll hsotg->frame_number = dwc2_hcd_get_frame_number(hsotg); 132 1.1 skrll /* Start in a slightly future (micro)frame */ 133 1.1 skrll qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, 134 1.1 skrll SCHEDULE_SLOP); 135 1.1 skrll qh->interval = urb->interval; 136 1.1 skrll #if 0 137 1.1 skrll /* Increase interrupt polling rate for debugging */ 138 1.1 skrll if (qh->ep_type == USB_ENDPOINT_XFER_INT) 139 1.1 skrll qh->interval = 8; 140 1.1 skrll #endif 141 1.2 skrll hprt = DWC2_READ_4(hsotg, HPRT0); 142 1.3 skrll prtspd = (hprt & HPRT0_SPD_MASK) >> HPRT0_SPD_SHIFT; 143 1.1 skrll if (prtspd == HPRT0_SPD_HIGH_SPEED && 144 1.1 skrll (dev_speed == USB_SPEED_LOW || 145 1.1 skrll dev_speed == USB_SPEED_FULL)) { 146 1.1 skrll qh->interval *= 8; 147 1.1 skrll qh->sched_frame |= 0x7; 148 1.1 skrll qh->start_split_frame = qh->sched_frame; 149 1.1 skrll } 150 1.1 skrll dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); 151 1.1 skrll } 152 1.1 skrll 153 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH Initialized\n"); 154 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - qh = %p\n", qh); 155 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Device Address = %d\n", 156 1.1 skrll dwc2_hcd_get_dev_addr(&urb->pipe_info)); 157 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Endpoint %d, %s\n", 158 1.1 skrll dwc2_hcd_get_ep_num(&urb->pipe_info), 159 1.1 skrll dwc2_hcd_is_pipe_in(&urb->pipe_info) ? "IN" : "OUT"); 160 1.1 skrll 161 1.1 skrll qh->dev_speed = dev_speed; 162 1.1 skrll 163 1.8 skrll #ifdef DWC2_DEBUG 164 1.8 skrll const char *speed, *type; 165 1.1 skrll switch (dev_speed) { 166 1.1 skrll case USB_SPEED_LOW: 167 1.1 skrll speed = "low"; 168 1.1 skrll break; 169 1.1 skrll case USB_SPEED_FULL: 170 1.1 skrll speed = "full"; 171 1.1 skrll break; 172 1.1 skrll case USB_SPEED_HIGH: 173 1.1 skrll speed = "high"; 174 1.1 skrll break; 175 1.1 skrll default: 176 1.1 skrll speed = "?"; 177 1.1 skrll break; 178 1.1 skrll } 179 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Speed = %s\n", speed); 180 1.1 skrll 181 1.1 skrll switch (qh->ep_type) { 182 1.1 skrll case USB_ENDPOINT_XFER_ISOC: 183 1.1 skrll type = "isochronous"; 184 1.1 skrll break; 185 1.1 skrll case USB_ENDPOINT_XFER_INT: 186 1.1 skrll type = "interrupt"; 187 1.1 skrll break; 188 1.1 skrll case USB_ENDPOINT_XFER_CONTROL: 189 1.1 skrll type = "control"; 190 1.1 skrll break; 191 1.1 skrll case USB_ENDPOINT_XFER_BULK: 192 1.1 skrll type = "bulk"; 193 1.1 skrll break; 194 1.1 skrll default: 195 1.1 skrll type = "?"; 196 1.1 skrll break; 197 1.1 skrll } 198 1.1 skrll 199 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Type = %s\n", type); 200 1.8 skrll #endif 201 1.1 skrll 202 1.1 skrll if (qh->ep_type == USB_ENDPOINT_XFER_INT) { 203 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - usecs = %d\n", 204 1.1 skrll qh->usecs); 205 1.1 skrll dev_vdbg(hsotg->dev, "DWC OTG HCD QH - interval = %d\n", 206 1.1 skrll qh->interval); 207 1.1 skrll } 208 1.1 skrll } 209 1.1 skrll 210 1.1 skrll /** 211 1.1 skrll * dwc2_hcd_qh_create() - Allocates and initializes a QH 212 1.1 skrll * 213 1.3 skrll * @hsotg: The HCD state structure for the DWC OTG controller 214 1.3 skrll * @urb: Holds the information about the device/endpoint needed 215 1.3 skrll * to initialize the QH 216 1.3 skrll * @mem_flags: Flag to do atomic allocation if needed 217 1.1 skrll * 218 1.1 skrll * Return: Pointer to the newly allocated QH, or NULL on error 219 1.1 skrll */ 220 1.12 skrll struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, 221 1.1 skrll struct dwc2_hcd_urb *urb, 222 1.1 skrll gfp_t mem_flags) 223 1.1 skrll { 224 1.2 skrll struct dwc2_softc *sc = hsotg->hsotg_sc; 225 1.1 skrll struct dwc2_qh *qh; 226 1.1 skrll 227 1.1 skrll if (!urb->priv) 228 1.1 skrll return NULL; 229 1.1 skrll 230 1.1 skrll /* Allocate memory */ 231 1.2 skrll qh = pool_cache_get(sc->sc_qhpool, PR_NOWAIT); 232 1.1 skrll if (!qh) 233 1.1 skrll return NULL; 234 1.1 skrll 235 1.2 skrll memset(qh, 0, sizeof(*qh)); 236 1.1 skrll dwc2_qh_init(hsotg, qh, urb); 237 1.1 skrll 238 1.1 skrll if (hsotg->core_params->dma_desc_enable > 0 && 239 1.1 skrll dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { 240 1.1 skrll dwc2_hcd_qh_free(hsotg, qh); 241 1.1 skrll return NULL; 242 1.1 skrll } 243 1.1 skrll 244 1.1 skrll return qh; 245 1.1 skrll } 246 1.1 skrll 247 1.1 skrll /** 248 1.1 skrll * dwc2_hcd_qh_free() - Frees the QH 249 1.1 skrll * 250 1.1 skrll * @hsotg: HCD instance 251 1.1 skrll * @qh: The QH to free 252 1.1 skrll * 253 1.1 skrll * QH should already be removed from the list. QTD list should already be empty 254 1.1 skrll * if called from URB Dequeue. 255 1.1 skrll * 256 1.1 skrll * Must NOT be called with interrupt disabled or spinlock held 257 1.1 skrll */ 258 1.1 skrll void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 259 1.1 skrll { 260 1.2 skrll struct dwc2_softc *sc = hsotg->hsotg_sc; 261 1.15 simonb 262 1.15 simonb /* 263 1.15 simonb * We don't have the lock so we can safely wait until the wait timer 264 1.15 simonb * finishes. Of course, at this point in time we'd better have set 265 1.15 simonb * wait_timer_active to false so if this timer was still pending it 266 1.15 simonb * won't do anything anyway, but we want it to finish before we free 267 1.15 simonb * memory. 268 1.15 simonb */ 269 1.15 simonb /* XXX del_timer_sync(&qh->wait_timer); */ 270 1.15 simonb callout_destroy(&qh->wait_timer); /* XXX need to callout_halt() first? */ 271 1.15 simonb 272 1.14 skrll if (qh->desc_list) { 273 1.1 skrll dwc2_hcd_qh_free_ddma(hsotg, qh); 274 1.1 skrll } else if (qh->dw_align_buf) { 275 1.16 skrll usb_freemem(&qh->dw_align_buf_usbdma); 276 1.12 skrll qh->dw_align_buf_dma = (dma_addr_t)0; 277 1.1 skrll } 278 1.1 skrll 279 1.2 skrll pool_cache_put(sc->sc_qhpool, qh); 280 1.1 skrll } 281 1.1 skrll 282 1.1 skrll /** 283 1.1 skrll * dwc2_periodic_channel_available() - Checks that a channel is available for a 284 1.1 skrll * periodic transfer 285 1.1 skrll * 286 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 287 1.1 skrll * 288 1.3 skrll * Return: 0 if successful, negative error code otherwise 289 1.1 skrll */ 290 1.1 skrll static int dwc2_periodic_channel_available(struct dwc2_hsotg *hsotg) 291 1.1 skrll { 292 1.1 skrll /* 293 1.3 skrll * Currently assuming that there is a dedicated host channel for 294 1.1 skrll * each periodic transaction plus at least one host channel for 295 1.1 skrll * non-periodic transactions 296 1.1 skrll */ 297 1.1 skrll int status; 298 1.1 skrll int num_channels; 299 1.1 skrll 300 1.1 skrll num_channels = hsotg->core_params->host_channels; 301 1.1 skrll if (hsotg->periodic_channels + hsotg->non_periodic_channels < 302 1.1 skrll num_channels 303 1.1 skrll && hsotg->periodic_channels < num_channels - 1) { 304 1.1 skrll status = 0; 305 1.1 skrll } else { 306 1.1 skrll dev_dbg(hsotg->dev, 307 1.1 skrll "%s: Total channels: %d, Periodic: %d, " 308 1.1 skrll "Non-periodic: %d\n", __func__, num_channels, 309 1.1 skrll hsotg->periodic_channels, hsotg->non_periodic_channels); 310 1.1 skrll status = -ENOSPC; 311 1.1 skrll } 312 1.1 skrll 313 1.1 skrll return status; 314 1.1 skrll } 315 1.1 skrll 316 1.1 skrll /** 317 1.1 skrll * dwc2_check_periodic_bandwidth() - Checks that there is sufficient bandwidth 318 1.1 skrll * for the specified QH in the periodic schedule 319 1.1 skrll * 320 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 321 1.1 skrll * @qh: QH containing periodic bandwidth required 322 1.1 skrll * 323 1.1 skrll * Return: 0 if successful, negative error code otherwise 324 1.1 skrll * 325 1.1 skrll * For simplicity, this calculation assumes that all the transfers in the 326 1.1 skrll * periodic schedule may occur in the same (micro)frame 327 1.1 skrll */ 328 1.1 skrll static int dwc2_check_periodic_bandwidth(struct dwc2_hsotg *hsotg, 329 1.1 skrll struct dwc2_qh *qh) 330 1.1 skrll { 331 1.1 skrll int status; 332 1.1 skrll s16 max_claimed_usecs; 333 1.1 skrll 334 1.1 skrll status = 0; 335 1.1 skrll 336 1.1 skrll if (qh->dev_speed == USB_SPEED_HIGH || qh->do_split) { 337 1.1 skrll /* 338 1.1 skrll * High speed mode 339 1.1 skrll * Max periodic usecs is 80% x 125 usec = 100 usec 340 1.1 skrll */ 341 1.1 skrll max_claimed_usecs = 100 - qh->usecs; 342 1.1 skrll } else { 343 1.1 skrll /* 344 1.1 skrll * Full speed mode 345 1.1 skrll * Max periodic usecs is 90% x 1000 usec = 900 usec 346 1.1 skrll */ 347 1.1 skrll max_claimed_usecs = 900 - qh->usecs; 348 1.1 skrll } 349 1.1 skrll 350 1.1 skrll if (hsotg->periodic_usecs > max_claimed_usecs) { 351 1.1 skrll dev_err(hsotg->dev, 352 1.1 skrll "%s: already claimed usecs %d, required usecs %d\n", 353 1.1 skrll __func__, hsotg->periodic_usecs, qh->usecs); 354 1.1 skrll status = -ENOSPC; 355 1.1 skrll } 356 1.1 skrll 357 1.1 skrll return status; 358 1.1 skrll } 359 1.1 skrll 360 1.1 skrll /** 361 1.1 skrll * Microframe scheduler 362 1.1 skrll * track the total use in hsotg->frame_usecs 363 1.1 skrll * keep each qh use in qh->frame_usecs 364 1.1 skrll * when surrendering the qh then donate the time back 365 1.1 skrll */ 366 1.1 skrll static const unsigned short max_uframe_usecs[] = { 367 1.1 skrll 100, 100, 100, 100, 100, 100, 30, 0 368 1.1 skrll }; 369 1.1 skrll 370 1.1 skrll void dwc2_hcd_init_usecs(struct dwc2_hsotg *hsotg) 371 1.1 skrll { 372 1.1 skrll int i; 373 1.1 skrll 374 1.1 skrll for (i = 0; i < 8; i++) 375 1.1 skrll hsotg->frame_usecs[i] = max_uframe_usecs[i]; 376 1.1 skrll } 377 1.1 skrll 378 1.1 skrll static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 379 1.1 skrll { 380 1.1 skrll unsigned short utime = qh->usecs; 381 1.6 skrll int i; 382 1.1 skrll 383 1.6 skrll for (i = 0; i < 8; i++) { 384 1.1 skrll /* At the start hsotg->frame_usecs[i] = max_uframe_usecs[i] */ 385 1.1 skrll if (utime <= hsotg->frame_usecs[i]) { 386 1.1 skrll hsotg->frame_usecs[i] -= utime; 387 1.1 skrll qh->frame_usecs[i] += utime; 388 1.6 skrll return i; 389 1.1 skrll } 390 1.1 skrll } 391 1.9 skrll return -ENOSPC; 392 1.1 skrll } 393 1.1 skrll 394 1.1 skrll /* 395 1.1 skrll * use this for FS apps that can span multiple uframes 396 1.1 skrll */ 397 1.1 skrll static int dwc2_find_multi_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 398 1.1 skrll { 399 1.1 skrll unsigned short utime = qh->usecs; 400 1.1 skrll unsigned short xtime; 401 1.6 skrll int t_left; 402 1.6 skrll int i; 403 1.1 skrll int j; 404 1.6 skrll int k; 405 1.1 skrll 406 1.6 skrll for (i = 0; i < 8; i++) { 407 1.6 skrll if (hsotg->frame_usecs[i] <= 0) 408 1.1 skrll continue; 409 1.1 skrll 410 1.1 skrll /* 411 1.1 skrll * we need n consecutive slots so use j as a start slot 412 1.1 skrll * j plus j+1 must be enough time (for now) 413 1.1 skrll */ 414 1.1 skrll xtime = hsotg->frame_usecs[i]; 415 1.1 skrll for (j = i + 1; j < 8; j++) { 416 1.1 skrll /* 417 1.1 skrll * if we add this frame remaining time to xtime we may 418 1.1 skrll * be OK, if not we need to test j for a complete frame 419 1.1 skrll */ 420 1.1 skrll if (xtime + hsotg->frame_usecs[j] < utime) { 421 1.1 skrll if (hsotg->frame_usecs[j] < 422 1.6 skrll max_uframe_usecs[j]) 423 1.6 skrll continue; 424 1.1 skrll } 425 1.1 skrll if (xtime >= utime) { 426 1.6 skrll t_left = utime; 427 1.6 skrll for (k = i; k < 8; k++) { 428 1.6 skrll t_left -= hsotg->frame_usecs[k]; 429 1.6 skrll if (t_left <= 0) { 430 1.6 skrll qh->frame_usecs[k] += 431 1.6 skrll hsotg->frame_usecs[k] 432 1.6 skrll + t_left; 433 1.6 skrll hsotg->frame_usecs[k] = -t_left; 434 1.6 skrll return i; 435 1.6 skrll } else { 436 1.6 skrll qh->frame_usecs[k] += 437 1.6 skrll hsotg->frame_usecs[k]; 438 1.6 skrll hsotg->frame_usecs[k] = 0; 439 1.6 skrll } 440 1.6 skrll } 441 1.1 skrll } 442 1.1 skrll /* add the frame time to x time */ 443 1.1 skrll xtime += hsotg->frame_usecs[j]; 444 1.1 skrll /* we must have a fully available next frame or break */ 445 1.1 skrll if (xtime < utime && 446 1.6 skrll hsotg->frame_usecs[j] == max_uframe_usecs[j]) 447 1.6 skrll continue; 448 1.1 skrll } 449 1.1 skrll } 450 1.9 skrll return -ENOSPC; 451 1.1 skrll } 452 1.1 skrll 453 1.1 skrll static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 454 1.1 skrll { 455 1.1 skrll int ret; 456 1.1 skrll 457 1.1 skrll if (qh->dev_speed == USB_SPEED_HIGH) { 458 1.1 skrll /* if this is a hs transaction we need a full frame */ 459 1.1 skrll ret = dwc2_find_single_uframe(hsotg, qh); 460 1.1 skrll } else { 461 1.1 skrll /* 462 1.1 skrll * if this is a fs transaction we may need a sequence 463 1.1 skrll * of frames 464 1.1 skrll */ 465 1.1 skrll ret = dwc2_find_multi_uframe(hsotg, qh); 466 1.1 skrll } 467 1.1 skrll return ret; 468 1.1 skrll } 469 1.1 skrll 470 1.1 skrll /** 471 1.1 skrll * dwc2_check_max_xfer_size() - Checks that the max transfer size allowed in a 472 1.1 skrll * host channel is large enough to handle the maximum data transfer in a single 473 1.1 skrll * (micro)frame for a periodic transfer 474 1.1 skrll * 475 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 476 1.1 skrll * @qh: QH for a periodic endpoint 477 1.1 skrll * 478 1.1 skrll * Return: 0 if successful, negative error code otherwise 479 1.1 skrll */ 480 1.1 skrll static int dwc2_check_max_xfer_size(struct dwc2_hsotg *hsotg, 481 1.1 skrll struct dwc2_qh *qh) 482 1.1 skrll { 483 1.1 skrll u32 max_xfer_size; 484 1.1 skrll u32 max_channel_xfer_size; 485 1.1 skrll int status = 0; 486 1.1 skrll 487 1.1 skrll max_xfer_size = dwc2_max_packet(qh->maxp) * dwc2_hb_mult(qh->maxp); 488 1.1 skrll max_channel_xfer_size = hsotg->core_params->max_transfer_size; 489 1.1 skrll 490 1.1 skrll if (max_xfer_size > max_channel_xfer_size) { 491 1.1 skrll dev_err(hsotg->dev, 492 1.1 skrll "%s: Periodic xfer length %d > max xfer length for channel %d\n", 493 1.1 skrll __func__, max_xfer_size, max_channel_xfer_size); 494 1.1 skrll status = -ENOSPC; 495 1.1 skrll } 496 1.1 skrll 497 1.1 skrll return status; 498 1.1 skrll } 499 1.1 skrll 500 1.1 skrll /** 501 1.1 skrll * dwc2_schedule_periodic() - Schedules an interrupt or isochronous transfer in 502 1.1 skrll * the periodic schedule 503 1.1 skrll * 504 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 505 1.1 skrll * @qh: QH for the periodic transfer. The QH should already contain the 506 1.1 skrll * scheduling information. 507 1.1 skrll * 508 1.1 skrll * Return: 0 if successful, negative error code otherwise 509 1.1 skrll */ 510 1.1 skrll static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 511 1.1 skrll { 512 1.1 skrll int status; 513 1.1 skrll 514 1.1 skrll if (hsotg->core_params->uframe_sched > 0) { 515 1.1 skrll int frame = -1; 516 1.1 skrll 517 1.1 skrll status = dwc2_find_uframe(hsotg, qh); 518 1.1 skrll if (status == 0) 519 1.1 skrll frame = 7; 520 1.1 skrll else if (status > 0) 521 1.1 skrll frame = status - 1; 522 1.1 skrll 523 1.1 skrll /* Set the new frame up */ 524 1.9 skrll if (frame >= 0) { 525 1.1 skrll qh->sched_frame &= ~0x7; 526 1.1 skrll qh->sched_frame |= (frame & 7); 527 1.1 skrll } 528 1.1 skrll 529 1.9 skrll if (status > 0) 530 1.1 skrll status = 0; 531 1.1 skrll } else { 532 1.1 skrll status = dwc2_periodic_channel_available(hsotg); 533 1.1 skrll if (status) { 534 1.1 skrll dev_info(hsotg->dev, 535 1.1 skrll "%s: No host channel available for periodic transfer\n", 536 1.1 skrll __func__); 537 1.1 skrll return status; 538 1.1 skrll } 539 1.1 skrll 540 1.1 skrll status = dwc2_check_periodic_bandwidth(hsotg, qh); 541 1.1 skrll } 542 1.1 skrll 543 1.1 skrll if (status) { 544 1.1 skrll dev_dbg(hsotg->dev, 545 1.1 skrll "%s: Insufficient periodic bandwidth for periodic transfer\n", 546 1.1 skrll __func__); 547 1.1 skrll return status; 548 1.1 skrll } 549 1.1 skrll 550 1.1 skrll status = dwc2_check_max_xfer_size(hsotg, qh); 551 1.1 skrll if (status) { 552 1.1 skrll dev_dbg(hsotg->dev, 553 1.1 skrll "%s: Channel max transfer size too small for periodic transfer\n", 554 1.1 skrll __func__); 555 1.1 skrll return status; 556 1.1 skrll } 557 1.1 skrll 558 1.3 skrll if (hsotg->core_params->dma_desc_enable > 0) 559 1.1 skrll /* Don't rely on SOF and start in ready schedule */ 560 1.1 skrll list_add_tail(&qh->qh_list_entry, &hsotg->periodic_sched_ready); 561 1.3 skrll else 562 1.1 skrll /* Always start in inactive schedule */ 563 1.1 skrll list_add_tail(&qh->qh_list_entry, 564 1.1 skrll &hsotg->periodic_sched_inactive); 565 1.1 skrll 566 1.1 skrll if (hsotg->core_params->uframe_sched <= 0) 567 1.1 skrll /* Reserve periodic channel */ 568 1.1 skrll hsotg->periodic_channels++; 569 1.1 skrll 570 1.1 skrll /* Update claimed usecs per (micro)frame */ 571 1.1 skrll hsotg->periodic_usecs += qh->usecs; 572 1.1 skrll 573 1.1 skrll return status; 574 1.1 skrll } 575 1.1 skrll 576 1.1 skrll /** 577 1.1 skrll * dwc2_deschedule_periodic() - Removes an interrupt or isochronous transfer 578 1.1 skrll * from the periodic schedule 579 1.1 skrll * 580 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 581 1.1 skrll * @qh: QH for the periodic transfer 582 1.1 skrll */ 583 1.1 skrll static void dwc2_deschedule_periodic(struct dwc2_hsotg *hsotg, 584 1.1 skrll struct dwc2_qh *qh) 585 1.1 skrll { 586 1.1 skrll int i; 587 1.1 skrll 588 1.1 skrll list_del_init(&qh->qh_list_entry); 589 1.1 skrll 590 1.1 skrll /* Update claimed usecs per (micro)frame */ 591 1.1 skrll hsotg->periodic_usecs -= qh->usecs; 592 1.1 skrll 593 1.1 skrll if (hsotg->core_params->uframe_sched > 0) { 594 1.1 skrll for (i = 0; i < 8; i++) { 595 1.1 skrll hsotg->frame_usecs[i] += qh->frame_usecs[i]; 596 1.1 skrll qh->frame_usecs[i] = 0; 597 1.1 skrll } 598 1.1 skrll } else { 599 1.1 skrll /* Release periodic channel reservation */ 600 1.1 skrll hsotg->periodic_channels--; 601 1.1 skrll } 602 1.1 skrll } 603 1.1 skrll 604 1.1 skrll /** 605 1.15 simonb * dwc2_wait_timer_fn() - Timer function to re-queue after waiting 606 1.15 simonb * 607 1.15 simonb * As per the spec, a NAK indicates that "a function is temporarily unable to 608 1.15 simonb * transmit or receive data, but will eventually be able to do so without need 609 1.15 simonb * of host intervention". 610 1.15 simonb * 611 1.15 simonb * That means that when we encounter a NAK we're supposed to retry. 612 1.15 simonb * 613 1.15 simonb * ...but if we retry right away (from the interrupt handler that saw the NAK) 614 1.15 simonb * then we can end up with an interrupt storm (if the other side keeps NAKing 615 1.15 simonb * us) because on slow enough CPUs it could take us longer to get out of the 616 1.15 simonb * interrupt routine than it takes for the device to send another NAK. That 617 1.15 simonb * leads to a constant stream of NAK interrupts and the CPU locks. 618 1.15 simonb * 619 1.15 simonb * ...so instead of retrying right away in the case of a NAK we'll set a timer 620 1.15 simonb * to retry some time later. This function handles that timer and moves the 621 1.15 simonb * qh back to the "inactive" list, then queues transactions. 622 1.15 simonb * 623 1.15 simonb * @t: Pointer to wait_timer in a qh. 624 1.15 simonb */ 625 1.15 simonb static void dwc2_wait_timer_fn(void *arg) 626 1.15 simonb { 627 1.15 simonb struct dwc2_qh *qh = arg; 628 1.15 simonb struct dwc2_hsotg *hsotg = qh->hsotg; 629 1.15 simonb unsigned long flags; 630 1.15 simonb 631 1.15 simonb spin_lock_irqsave(&hsotg->lock, flags); 632 1.15 simonb 633 1.15 simonb /* 634 1.15 simonb * We'll set wait_timer_cancel to true if we want to cancel this 635 1.15 simonb * operation in dwc2_hcd_qh_unlink(). 636 1.15 simonb */ 637 1.15 simonb if (!qh->wait_timer_cancel) { 638 1.15 simonb enum dwc2_transaction_type tr_type; 639 1.15 simonb 640 1.15 simonb qh->want_wait = false; 641 1.15 simonb 642 1.15 simonb list_move(&qh->qh_list_entry, 643 1.15 simonb &hsotg->non_periodic_sched_inactive); 644 1.15 simonb 645 1.15 simonb tr_type = dwc2_hcd_select_transactions(hsotg); 646 1.15 simonb if (tr_type != DWC2_TRANSACTION_NONE) 647 1.15 simonb dwc2_hcd_queue_transactions(hsotg, tr_type); 648 1.15 simonb } 649 1.15 simonb 650 1.15 simonb spin_unlock_irqrestore(&hsotg->lock, flags); 651 1.15 simonb } 652 1.15 simonb 653 1.15 simonb /** 654 1.1 skrll * dwc2_hcd_qh_add() - Adds a QH to either the non periodic or periodic 655 1.1 skrll * schedule if it is not already in the schedule. If the QH is already in 656 1.1 skrll * the schedule, no action is taken. 657 1.1 skrll * 658 1.1 skrll * @hsotg: The HCD state structure for the DWC OTG controller 659 1.1 skrll * @qh: The QH to add 660 1.1 skrll * 661 1.1 skrll * Return: 0 if successful, negative error code otherwise 662 1.1 skrll */ 663 1.1 skrll int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 664 1.1 skrll { 665 1.9 skrll int status; 666 1.1 skrll u32 intr_mask; 667 1.1 skrll 668 1.1 skrll if (dbg_qh(qh)) 669 1.1 skrll dev_vdbg(hsotg->dev, "%s()\n", __func__); 670 1.1 skrll 671 1.1 skrll if (!list_empty(&qh->qh_list_entry)) 672 1.1 skrll /* QH already in a schedule */ 673 1.9 skrll return 0; 674 1.1 skrll 675 1.14 skrll if (!dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number) && 676 1.14 skrll !hsotg->frame_number) { 677 1.14 skrll dev_dbg(hsotg->dev, 678 1.14 skrll "reset frame number counter\n"); 679 1.14 skrll qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, 680 1.14 skrll SCHEDULE_SLOP); 681 1.14 skrll } 682 1.14 skrll 683 1.1 skrll /* Add the new QH to the appropriate schedule */ 684 1.1 skrll if (dwc2_qh_is_non_per(qh)) { 685 1.15 simonb if (qh->want_wait) { 686 1.15 simonb list_add_tail(&qh->qh_list_entry, 687 1.15 simonb &hsotg->non_periodic_sched_waiting); 688 1.15 simonb qh->wait_timer_cancel = false; 689 1.15 simonb /* XXX mod_timer(&qh->wait_timer, 690 1.15 simonb jiffies + DWC2_RETRY_WAIT_DELAY + 1); */ 691 1.15 simonb callout_schedule(&qh->wait_timer, 692 1.15 simonb mstohz(DWC2_RETRY_WAIT_DELAY)); 693 1.15 simonb } else { 694 1.15 simonb list_add_tail(&qh->qh_list_entry, 695 1.15 simonb &hsotg->non_periodic_sched_inactive); 696 1.15 simonb } 697 1.9 skrll return 0; 698 1.9 skrll } 699 1.12 skrll 700 1.9 skrll status = dwc2_schedule_periodic(hsotg, qh); 701 1.9 skrll if (status) 702 1.9 skrll return status; 703 1.9 skrll if (!hsotg->periodic_qh_count) { 704 1.9 skrll intr_mask = DWC2_READ_4(hsotg, GINTMSK); 705 1.9 skrll intr_mask |= GINTSTS_SOF; 706 1.9 skrll DWC2_WRITE_4(hsotg, GINTMSK, intr_mask); 707 1.1 skrll } 708 1.9 skrll hsotg->periodic_qh_count++; 709 1.1 skrll 710 1.9 skrll return 0; 711 1.1 skrll } 712 1.1 skrll 713 1.1 skrll /** 714 1.1 skrll * dwc2_hcd_qh_unlink() - Removes a QH from either the non-periodic or periodic 715 1.1 skrll * schedule. Memory is not freed. 716 1.1 skrll * 717 1.1 skrll * @hsotg: The HCD state structure 718 1.1 skrll * @qh: QH to remove from schedule 719 1.1 skrll */ 720 1.1 skrll void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 721 1.1 skrll { 722 1.1 skrll u32 intr_mask; 723 1.1 skrll 724 1.1 skrll dev_vdbg(hsotg->dev, "%s()\n", __func__); 725 1.1 skrll 726 1.15 simonb /* If the wait_timer is pending, this will stop it from acting */ 727 1.15 simonb qh->wait_timer_cancel = true; 728 1.15 simonb 729 1.1 skrll if (list_empty(&qh->qh_list_entry)) 730 1.1 skrll /* QH is not in a schedule */ 731 1.1 skrll return; 732 1.1 skrll 733 1.1 skrll if (dwc2_qh_is_non_per(qh)) { 734 1.1 skrll if (hsotg->non_periodic_qh_ptr == &qh->qh_list_entry) 735 1.1 skrll hsotg->non_periodic_qh_ptr = 736 1.1 skrll hsotg->non_periodic_qh_ptr->next; 737 1.1 skrll list_del_init(&qh->qh_list_entry); 738 1.9 skrll return; 739 1.9 skrll } 740 1.12 skrll 741 1.9 skrll dwc2_deschedule_periodic(hsotg, qh); 742 1.9 skrll hsotg->periodic_qh_count--; 743 1.9 skrll if (!hsotg->periodic_qh_count) { 744 1.9 skrll intr_mask = DWC2_READ_4(hsotg, GINTMSK); 745 1.9 skrll intr_mask &= ~GINTSTS_SOF; 746 1.9 skrll DWC2_WRITE_4(hsotg, GINTMSK, intr_mask); 747 1.1 skrll } 748 1.1 skrll } 749 1.1 skrll 750 1.1 skrll /* 751 1.1 skrll * Schedule the next continuing periodic split transfer 752 1.1 skrll */ 753 1.1 skrll static void dwc2_sched_periodic_split(struct dwc2_hsotg *hsotg, 754 1.1 skrll struct dwc2_qh *qh, u16 frame_number, 755 1.1 skrll int sched_next_periodic_split) 756 1.1 skrll { 757 1.1 skrll u16 incr; 758 1.1 skrll 759 1.1 skrll if (sched_next_periodic_split) { 760 1.1 skrll qh->sched_frame = frame_number; 761 1.1 skrll incr = dwc2_frame_num_inc(qh->start_split_frame, 1); 762 1.1 skrll if (dwc2_frame_num_le(frame_number, incr)) { 763 1.1 skrll /* 764 1.1 skrll * Allow one frame to elapse after start split 765 1.1 skrll * microframe before scheduling complete split, but 766 1.1 skrll * DON'T if we are doing the next start split in the 767 1.1 skrll * same frame for an ISOC out 768 1.1 skrll */ 769 1.1 skrll if (qh->ep_type != USB_ENDPOINT_XFER_ISOC || 770 1.1 skrll qh->ep_is_in != 0) { 771 1.1 skrll qh->sched_frame = 772 1.1 skrll dwc2_frame_num_inc(qh->sched_frame, 1); 773 1.1 skrll } 774 1.1 skrll } 775 1.1 skrll } else { 776 1.1 skrll qh->sched_frame = dwc2_frame_num_inc(qh->start_split_frame, 777 1.1 skrll qh->interval); 778 1.1 skrll if (dwc2_frame_num_le(qh->sched_frame, frame_number)) 779 1.1 skrll qh->sched_frame = frame_number; 780 1.1 skrll qh->sched_frame |= 0x7; 781 1.1 skrll qh->start_split_frame = qh->sched_frame; 782 1.1 skrll } 783 1.1 skrll } 784 1.1 skrll 785 1.1 skrll /* 786 1.1 skrll * Deactivates a QH. For non-periodic QHs, removes the QH from the active 787 1.1 skrll * non-periodic schedule. The QH is added to the inactive non-periodic 788 1.1 skrll * schedule if any QTDs are still attached to the QH. 789 1.1 skrll * 790 1.1 skrll * For periodic QHs, the QH is removed from the periodic queued schedule. If 791 1.1 skrll * there are any QTDs still attached to the QH, the QH is added to either the 792 1.1 skrll * periodic inactive schedule or the periodic ready schedule and its next 793 1.1 skrll * scheduled frame is calculated. The QH is placed in the ready schedule if 794 1.1 skrll * the scheduled frame has been reached already. Otherwise it's placed in the 795 1.1 skrll * inactive schedule. If there are no QTDs attached to the QH, the QH is 796 1.1 skrll * completely removed from the periodic schedule. 797 1.1 skrll */ 798 1.1 skrll void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, 799 1.1 skrll int sched_next_periodic_split) 800 1.1 skrll { 801 1.9 skrll u16 frame_number; 802 1.9 skrll 803 1.1 skrll if (dbg_qh(qh)) 804 1.1 skrll dev_vdbg(hsotg->dev, "%s()\n", __func__); 805 1.1 skrll 806 1.1 skrll if (dwc2_qh_is_non_per(qh)) { 807 1.1 skrll dwc2_hcd_qh_unlink(hsotg, qh); 808 1.1 skrll if (!list_empty(&qh->qtd_list)) 809 1.15 simonb /* Add back to inactive/waiting non-periodic schedule */ 810 1.1 skrll dwc2_hcd_qh_add(hsotg, qh); 811 1.9 skrll return; 812 1.9 skrll } 813 1.9 skrll 814 1.9 skrll frame_number = dwc2_hcd_get_frame_number(hsotg); 815 1.9 skrll 816 1.9 skrll if (qh->do_split) { 817 1.9 skrll dwc2_sched_periodic_split(hsotg, qh, frame_number, 818 1.9 skrll sched_next_periodic_split); 819 1.1 skrll } else { 820 1.9 skrll qh->sched_frame = dwc2_frame_num_inc(qh->sched_frame, 821 1.9 skrll qh->interval); 822 1.9 skrll if (dwc2_frame_num_le(qh->sched_frame, frame_number)) 823 1.9 skrll qh->sched_frame = frame_number; 824 1.9 skrll } 825 1.1 skrll 826 1.9 skrll if (list_empty(&qh->qtd_list)) { 827 1.9 skrll dwc2_hcd_qh_unlink(hsotg, qh); 828 1.9 skrll return; 829 1.1 skrll } 830 1.9 skrll /* 831 1.9 skrll * Remove from periodic_sched_queued and move to 832 1.9 skrll * appropriate queue 833 1.9 skrll */ 834 1.9 skrll if ((hsotg->core_params->uframe_sched > 0 && 835 1.9 skrll dwc2_frame_num_le(qh->sched_frame, frame_number)) || 836 1.9 skrll (hsotg->core_params->uframe_sched <= 0 && 837 1.9 skrll qh->sched_frame == frame_number)) 838 1.9 skrll list_move(&qh->qh_list_entry, &hsotg->periodic_sched_ready); 839 1.9 skrll else 840 1.9 skrll list_move(&qh->qh_list_entry, &hsotg->periodic_sched_inactive); 841 1.1 skrll } 842 1.1 skrll 843 1.1 skrll /** 844 1.1 skrll * dwc2_hcd_qtd_init() - Initializes a QTD structure 845 1.1 skrll * 846 1.1 skrll * @qtd: The QTD to initialize 847 1.1 skrll * @urb: The associated URB 848 1.1 skrll */ 849 1.1 skrll void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb) 850 1.1 skrll { 851 1.1 skrll qtd->urb = urb; 852 1.1 skrll if (dwc2_hcd_get_pipe_type(&urb->pipe_info) == 853 1.1 skrll USB_ENDPOINT_XFER_CONTROL) { 854 1.1 skrll /* 855 1.1 skrll * The only time the QTD data toggle is used is on the data 856 1.1 skrll * phase of control transfers. This phase always starts with 857 1.1 skrll * DATA1. 858 1.1 skrll */ 859 1.1 skrll qtd->data_toggle = DWC2_HC_PID_DATA1; 860 1.1 skrll qtd->control_phase = DWC2_CONTROL_SETUP; 861 1.1 skrll } 862 1.1 skrll 863 1.1 skrll /* Start split */ 864 1.1 skrll qtd->complete_split = 0; 865 1.1 skrll qtd->isoc_split_pos = DWC2_HCSPLT_XACTPOS_ALL; 866 1.1 skrll qtd->isoc_split_offset = 0; 867 1.1 skrll qtd->in_process = 0; 868 1.1 skrll 869 1.1 skrll /* Store the qtd ptr in the urb to reference the QTD */ 870 1.1 skrll urb->qtd = qtd; 871 1.1 skrll } 872 1.1 skrll 873 1.1 skrll /** 874 1.1 skrll * dwc2_hcd_qtd_add() - Adds a QTD to the QTD-list of a QH 875 1.12 skrll * Caller must hold driver lock. 876 1.1 skrll * 877 1.12 skrll * @hsotg: The DWC HCD structure 878 1.12 skrll * @qtd: The QTD to add 879 1.12 skrll * @qh: Queue head to add qtd to 880 1.1 skrll * 881 1.1 skrll * Return: 0 if successful, negative error code otherwise 882 1.1 skrll * 883 1.12 skrll * If the QH to which the QTD is added is not currently scheduled, it is placed 884 1.12 skrll * into the proper schedule based on its EP type. 885 1.1 skrll */ 886 1.1 skrll int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, 887 1.12 skrll struct dwc2_qh *qh) 888 1.1 skrll { 889 1.12 skrll 890 1.13 uebayasi KASSERT(mutex_owned(&hsotg->lock)); 891 1.1 skrll int retval; 892 1.1 skrll 893 1.12 skrll if (unlikely(!qh)) { 894 1.12 skrll dev_err(hsotg->dev, "%s: Invalid QH\n", __func__); 895 1.12 skrll retval = -EINVAL; 896 1.12 skrll goto fail; 897 1.1 skrll } 898 1.1 skrll 899 1.12 skrll retval = dwc2_hcd_qh_add(hsotg, qh); 900 1.1 skrll if (retval) 901 1.1 skrll goto fail; 902 1.1 skrll 903 1.12 skrll qtd->qh = qh; 904 1.12 skrll list_add_tail(&qtd->qtd_list_entry, &qh->qtd_list); 905 1.1 skrll 906 1.1 skrll return 0; 907 1.1 skrll fail: 908 1.1 skrll return retval; 909 1.1 skrll } 910 1.2 skrll 911 1.2 skrll void dwc2_hcd_qtd_unlink_and_free(struct dwc2_hsotg *hsotg, 912 1.2 skrll struct dwc2_qtd *qtd, 913 1.2 skrll struct dwc2_qh *qh) 914 1.2 skrll { 915 1.2 skrll struct dwc2_softc *sc = hsotg->hsotg_sc; 916 1.10 skrll 917 1.2 skrll list_del_init(&qtd->qtd_list_entry); 918 1.2 skrll pool_cache_put(sc->sc_qtdpool, qtd); 919 1.2 skrll } 920 1.2 skrll 921 1.2 skrll #define BITSTUFFTIME(bytecount) ((8 * 7 * (bytecount)) / 6) 922 1.2 skrll #define HS_HOST_DELAY 5 /* nanoseconds */ 923 1.2 skrll #define FS_LS_HOST_DELAY 1000 /* nanoseconds */ 924 1.2 skrll #define HUB_LS_SETUP 333 /* nanoseconds */ 925 1.2 skrll 926 1.2 skrll static u32 dwc2_calc_bus_time(struct dwc2_hsotg *hsotg, int speed, int is_in, 927 1.2 skrll int is_isoc, int bytecount) 928 1.2 skrll { 929 1.2 skrll unsigned long retval; 930 1.2 skrll 931 1.2 skrll switch (speed) { 932 1.2 skrll case USB_SPEED_HIGH: 933 1.2 skrll if (is_isoc) 934 1.2 skrll retval = 935 1.2 skrll ((38 * 8 * 2083) + 936 1.2 skrll (2083 * (3 + BITSTUFFTIME(bytecount)))) / 1000 + 937 1.2 skrll HS_HOST_DELAY; 938 1.2 skrll else 939 1.2 skrll retval = 940 1.2 skrll ((55 * 8 * 2083) + 941 1.2 skrll (2083 * (3 + BITSTUFFTIME(bytecount)))) / 1000 + 942 1.2 skrll HS_HOST_DELAY; 943 1.2 skrll break; 944 1.2 skrll case USB_SPEED_FULL: 945 1.2 skrll if (is_isoc) { 946 1.2 skrll retval = 947 1.2 skrll (8354 * (31 + 10 * BITSTUFFTIME(bytecount))) / 1000; 948 1.2 skrll if (is_in) 949 1.2 skrll retval = 7268 + FS_LS_HOST_DELAY + retval; 950 1.2 skrll else 951 1.2 skrll retval = 6265 + FS_LS_HOST_DELAY + retval; 952 1.2 skrll } else { 953 1.2 skrll retval = 954 1.2 skrll (8354 * (31 + 10 * BITSTUFFTIME(bytecount))) / 1000; 955 1.2 skrll retval = 9107 + FS_LS_HOST_DELAY + retval; 956 1.2 skrll } 957 1.2 skrll break; 958 1.2 skrll case USB_SPEED_LOW: 959 1.2 skrll if (is_in) { 960 1.2 skrll retval = 961 1.2 skrll (67667 * (31 + 10 * BITSTUFFTIME(bytecount))) / 962 1.2 skrll 1000; 963 1.2 skrll retval = 964 1.2 skrll 64060 + (2 * HUB_LS_SETUP) + FS_LS_HOST_DELAY + 965 1.2 skrll retval; 966 1.2 skrll } else { 967 1.2 skrll retval = 968 1.2 skrll (66700 * (31 + 10 * BITSTUFFTIME(bytecount))) / 969 1.2 skrll 1000; 970 1.2 skrll retval = 971 1.2 skrll 64107 + (2 * HUB_LS_SETUP) + FS_LS_HOST_DELAY + 972 1.2 skrll retval; 973 1.2 skrll } 974 1.2 skrll break; 975 1.2 skrll default: 976 1.2 skrll dev_warn(hsotg->dev, "Unknown device speed\n"); 977 1.2 skrll retval = -1; 978 1.2 skrll } 979 1.2 skrll 980 1.2 skrll return NS_TO_US(retval); 981 1.2 skrll } 982