linux/drivers/usb/usbip/vudc_transfer.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
   4 * Copyright (C) 2015-2016 Samsung Electronics
   5 *               Igor Kotrasinski <i.kotrasinsk@samsung.com>
   6 *
   7 * Based on dummy_hcd.c, which is:
   8 * Copyright (C) 2003 David Brownell
   9 * Copyright (C) 2003-2005 Alan Stern
  10 */
  11
  12#include <linux/usb.h>
  13#include <linux/timer.h>
  14#include <linux/usb/ch9.h>
  15
  16#include "vudc.h"
  17
  18#define DEV_REQUEST     (USB_TYPE_STANDARD | USB_RECIP_DEVICE)
  19#define DEV_INREQUEST   (DEV_REQUEST | USB_DIR_IN)
  20#define INTF_REQUEST    (USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
  21#define INTF_INREQUEST  (INTF_REQUEST | USB_DIR_IN)
  22#define EP_REQUEST      (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
  23#define EP_INREQUEST    (EP_REQUEST | USB_DIR_IN)
  24
  25static int get_frame_limit(enum usb_device_speed speed)
  26{
  27        switch (speed) {
  28        case USB_SPEED_LOW:
  29                return 8 /*bytes*/ * 12 /*packets*/;
  30        case USB_SPEED_FULL:
  31                return 64 /*bytes*/ * 19 /*packets*/;
  32        case USB_SPEED_HIGH:
  33                return 512 /*bytes*/ * 13 /*packets*/ * 8 /*uframes*/;
  34        case USB_SPEED_SUPER:
  35                /* Bus speed is 500000 bytes/ms, so use a little less */
  36                return 490000;
  37        default:
  38                /* error */
  39                return -1;
  40        }
  41
  42}
  43
  44/*
  45 * handle_control_request() - handles all control transfers
  46 * @udc: pointer to vudc
  47 * @urb: the urb request to handle
  48 * @setup: pointer to the setup data for a USB device control
  49 *       request
  50 * @status: pointer to request handling status
  51 *
  52 * Return 0 - if the request was handled
  53 *        1 - if the request wasn't handles
  54 *        error code on error
  55 *
  56 * Adapted from drivers/usb/gadget/udc/dummy_hcd.c
  57 */
  58static int handle_control_request(struct vudc *udc, struct urb *urb,
  59                                  struct usb_ctrlrequest *setup,
  60                                  int *status)
  61{
  62        struct vep      *ep2;
  63        int             ret_val = 1;
  64        unsigned int    w_index;
  65        unsigned int    w_value;
  66
  67        w_index = le16_to_cpu(setup->wIndex);
  68        w_value = le16_to_cpu(setup->wValue);
  69        switch (setup->bRequest) {
  70        case USB_REQ_SET_ADDRESS:
  71                if (setup->bRequestType != DEV_REQUEST)
  72                        break;
  73                udc->address = w_value;
  74                ret_val = 0;
  75                *status = 0;
  76                break;
  77        case USB_REQ_SET_FEATURE:
  78                if (setup->bRequestType == DEV_REQUEST) {
  79                        ret_val = 0;
  80                        switch (w_value) {
  81                        case USB_DEVICE_REMOTE_WAKEUP:
  82                                break;
  83                        case USB_DEVICE_B_HNP_ENABLE:
  84                                udc->gadget.b_hnp_enable = 1;
  85                                break;
  86                        case USB_DEVICE_A_HNP_SUPPORT:
  87                                udc->gadget.a_hnp_support = 1;
  88                                break;
  89                        case USB_DEVICE_A_ALT_HNP_SUPPORT:
  90                                udc->gadget.a_alt_hnp_support = 1;
  91                                break;
  92                        default:
  93                                ret_val = -EOPNOTSUPP;
  94                        }
  95                        if (ret_val == 0) {
  96                                udc->devstatus |= (1 << w_value);
  97                                *status = 0;
  98                        }
  99                } else if (setup->bRequestType == EP_REQUEST) {
 100                        /* endpoint halt */
 101                        ep2 = vudc_find_endpoint(udc, w_index);
 102                        if (!ep2 || ep2->ep.name == udc->ep[0].ep.name) {
 103                                ret_val = -EOPNOTSUPP;
 104                                break;
 105                        }
 106                        ep2->halted = 1;
 107                        ret_val = 0;
 108                        *status = 0;
 109                }
 110                break;
 111        case USB_REQ_CLEAR_FEATURE:
 112                if (setup->bRequestType == DEV_REQUEST) {
 113                        ret_val = 0;
 114                        switch (w_value) {
 115                        case USB_DEVICE_REMOTE_WAKEUP:
 116                                w_value = USB_DEVICE_REMOTE_WAKEUP;
 117                                break;
 118
 119                        case USB_DEVICE_U1_ENABLE:
 120                        case USB_DEVICE_U2_ENABLE:
 121                        case USB_DEVICE_LTM_ENABLE:
 122                                ret_val = -EOPNOTSUPP;
 123                                break;
 124                        default:
 125                                ret_val = -EOPNOTSUPP;
 126                                break;
 127                        }
 128                        if (ret_val == 0) {
 129                                udc->devstatus &= ~(1 << w_value);
 130                                *status = 0;
 131                        }
 132                } else if (setup->bRequestType == EP_REQUEST) {
 133                        /* endpoint halt */
 134                        ep2 = vudc_find_endpoint(udc, w_index);
 135                        if (!ep2) {
 136                                ret_val = -EOPNOTSUPP;
 137                                break;
 138                        }
 139                        if (!ep2->wedged)
 140                                ep2->halted = 0;
 141                        ret_val = 0;
 142                        *status = 0;
 143                }
 144                break;
 145        case USB_REQ_GET_STATUS:
 146                if (setup->bRequestType == DEV_INREQUEST
 147                                || setup->bRequestType == INTF_INREQUEST
 148                                || setup->bRequestType == EP_INREQUEST) {
 149                        char *buf;
 150                        /*
 151                         * device: remote wakeup, selfpowered
 152                         * interface: nothing
 153                         * endpoint: halt
 154                         */
 155                        buf = (char *)urb->transfer_buffer;
 156                        if (urb->transfer_buffer_length > 0) {
 157                                if (setup->bRequestType == EP_INREQUEST) {
 158                                        ep2 = vudc_find_endpoint(udc, w_index);
 159                                        if (!ep2) {
 160                                                ret_val = -EOPNOTSUPP;
 161                                                break;
 162                                        }
 163                                        buf[0] = ep2->halted;
 164                                } else if (setup->bRequestType ==
 165                                           DEV_INREQUEST) {
 166                                        buf[0] = (u8)udc->devstatus;
 167                                } else
 168                                        buf[0] = 0;
 169                        }
 170                        if (urb->transfer_buffer_length > 1)
 171                                buf[1] = 0;
 172                        urb->actual_length = min_t(u32, 2,
 173                                urb->transfer_buffer_length);
 174                        ret_val = 0;
 175                        *status = 0;
 176                }
 177                break;
 178        }
 179        return ret_val;
 180}
 181
 182/* Adapted from dummy_hcd.c ; caller must hold lock */
 183static int transfer(struct vudc *udc,
 184                struct urb *urb, struct vep *ep, int limit)
 185{
 186        struct vrequest *req;
 187        int sent = 0;
 188top:
 189        /* if there's no request queued, the device is NAKing; return */
 190        list_for_each_entry(req, &ep->req_queue, req_entry) {
 191                unsigned int    host_len, dev_len, len;
 192                void            *ubuf_pos, *rbuf_pos;
 193                int             is_short, to_host;
 194                int             rescan = 0;
 195
 196                /*
 197                 * 1..N packets of ep->ep.maxpacket each ... the last one
 198                 * may be short (including zero length).
 199                 *
 200                 * writer can send a zlp explicitly (length 0) or implicitly
 201                 * (length mod maxpacket zero, and 'zero' flag); they always
 202                 * terminate reads.
 203                 */
 204                host_len = urb->transfer_buffer_length - urb->actual_length;
 205                dev_len = req->req.length - req->req.actual;
 206                len = min(host_len, dev_len);
 207
 208                to_host = usb_pipein(urb->pipe);
 209                if (unlikely(len == 0))
 210                        is_short = 1;
 211                else {
 212                        /* send multiple of maxpacket first, then remainder */
 213                        if (len >= ep->ep.maxpacket) {
 214                                is_short = 0;
 215                                if (len % ep->ep.maxpacket > 0)
 216                                        rescan = 1;
 217                                len -= len % ep->ep.maxpacket;
 218                        } else {
 219                                is_short = 1;
 220                        }
 221
 222                        ubuf_pos = urb->transfer_buffer + urb->actual_length;
 223                        rbuf_pos = req->req.buf + req->req.actual;
 224
 225                        if (urb->pipe & USB_DIR_IN)
 226                                memcpy(ubuf_pos, rbuf_pos, len);
 227                        else
 228                                memcpy(rbuf_pos, ubuf_pos, len);
 229
 230                        urb->actual_length += len;
 231                        req->req.actual += len;
 232                        sent += len;
 233                }
 234
 235                /*
 236                 * short packets terminate, maybe with overflow/underflow.
 237                 * it's only really an error to write too much.
 238                 *
 239                 * partially filling a buffer optionally blocks queue advances
 240                 * (so completion handlers can clean up the queue) but we don't
 241                 * need to emulate such data-in-flight.
 242                 */
 243                if (is_short) {
 244                        if (host_len == dev_len) {
 245                                req->req.status = 0;
 246                                urb->status = 0;
 247                        } else if (to_host) {
 248                                req->req.status = 0;
 249                                if (dev_len > host_len)
 250                                        urb->status = -EOVERFLOW;
 251                                else
 252                                        urb->status = 0;
 253                        } else {
 254                                urb->status = 0;
 255                                if (host_len > dev_len)
 256                                        req->req.status = -EOVERFLOW;
 257                                else
 258                                        req->req.status = 0;
 259                        }
 260
 261                /* many requests terminate without a short packet */
 262                /* also check if we need to send zlp */
 263                } else {
 264                        if (req->req.length == req->req.actual) {
 265                                if (req->req.zero && to_host)
 266                                        rescan = 1;
 267                                else
 268                                        req->req.status = 0;
 269                        }
 270                        if (urb->transfer_buffer_length == urb->actual_length) {
 271                                if (urb->transfer_flags & URB_ZERO_PACKET &&
 272                                    !to_host)
 273                                        rescan = 1;
 274                                else
 275                                        urb->status = 0;
 276                        }
 277                }
 278
 279                /* device side completion --> continuable */
 280                if (req->req.status != -EINPROGRESS) {
 281
 282                        list_del_init(&req->req_entry);
 283                        spin_unlock(&udc->lock);
 284                        usb_gadget_giveback_request(&ep->ep, &req->req);
 285                        spin_lock(&udc->lock);
 286
 287                        /* requests might have been unlinked... */
 288                        rescan = 1;
 289                }
 290
 291                /* host side completion --> terminate */
 292                if (urb->status != -EINPROGRESS)
 293                        break;
 294
 295                /* rescan to continue with any other queued i/o */
 296                if (rescan)
 297                        goto top;
 298        }
 299        return sent;
 300}
 301
 302static void v_timer(struct timer_list *t)
 303{
 304        struct vudc *udc = from_timer(udc, t, tr_timer.timer);
 305        struct transfer_timer *timer = &udc->tr_timer;
 306        struct urbp *urb_p, *tmp;
 307        unsigned long flags;
 308        struct usb_ep *_ep;
 309        struct vep *ep;
 310        int ret = 0;
 311        int total, limit;
 312
 313        spin_lock_irqsave(&udc->lock, flags);
 314
 315        total = get_frame_limit(udc->gadget.speed);
 316        if (total < 0) {        /* unknown speed, or not set yet */
 317                timer->state = VUDC_TR_IDLE;
 318                spin_unlock_irqrestore(&udc->lock, flags);
 319                return;
 320        }
 321        /* is it next frame now? */
 322        if (time_after(jiffies, timer->frame_start + msecs_to_jiffies(1))) {
 323                timer->frame_limit = total;
 324                /* FIXME: how to make it accurate? */
 325                timer->frame_start = jiffies;
 326        } else {
 327                total = timer->frame_limit;
 328        }
 329
 330        /* We have to clear ep0 flags separately as it's not on the list */
 331        udc->ep[0].already_seen = 0;
 332        list_for_each_entry(_ep, &udc->gadget.ep_list, ep_list) {
 333                ep = to_vep(_ep);
 334                ep->already_seen = 0;
 335        }
 336
 337restart:
 338        list_for_each_entry_safe(urb_p, tmp, &udc->urb_queue, urb_entry) {
 339                struct urb *urb = urb_p->urb;
 340
 341                ep = urb_p->ep;
 342                if (urb->unlinked)
 343                        goto return_urb;
 344                if (timer->state != VUDC_TR_RUNNING)
 345                        continue;
 346
 347                if (!ep) {
 348                        urb->status = -EPROTO;
 349                        goto return_urb;
 350                }
 351
 352                /* Used up bandwidth? */
 353                if (total <= 0 && ep->type == USB_ENDPOINT_XFER_BULK)
 354                        continue;
 355
 356                if (ep->already_seen)
 357                        continue;
 358                ep->already_seen = 1;
 359                if (ep == &udc->ep[0] && urb_p->new) {
 360                        ep->setup_stage = 1;
 361                        urb_p->new = 0;
 362                }
 363                if (ep->halted && !ep->setup_stage) {
 364                        urb->status = -EPIPE;
 365                        goto return_urb;
 366                }
 367
 368                if (ep == &udc->ep[0] && ep->setup_stage) {
 369                        /* TODO - flush any stale requests */
 370                        ep->setup_stage = 0;
 371                        ep->halted = 0;
 372
 373                        ret = handle_control_request(udc, urb,
 374                                (struct usb_ctrlrequest *) urb->setup_packet,
 375                                (&urb->status));
 376                        if (ret > 0) {
 377                                spin_unlock(&udc->lock);
 378                                ret = udc->driver->setup(&udc->gadget,
 379                                        (struct usb_ctrlrequest *)
 380                                        urb->setup_packet);
 381                                spin_lock(&udc->lock);
 382                        }
 383                        if (ret >= 0) {
 384                                /* no delays (max 64kb data stage) */
 385                                limit = 64 * 1024;
 386                                goto treat_control_like_bulk;
 387                        } else {
 388                                urb->status = -EPIPE;
 389                                urb->actual_length = 0;
 390                                goto return_urb;
 391                        }
 392                }
 393
 394                limit = total;
 395                switch (ep->type) {
 396                case USB_ENDPOINT_XFER_ISOC:
 397                        /* TODO: support */
 398                        urb->status = -EXDEV;
 399                        break;
 400
 401                case USB_ENDPOINT_XFER_INT:
 402                        /*
 403                         * TODO: figure out bandwidth guarantees
 404                         * for now, give unlimited bandwidth
 405                         */
 406                        limit += urb->transfer_buffer_length;
 407                        /* fallthrough */
 408                default:
 409treat_control_like_bulk:
 410                        total -= transfer(udc, urb, ep, limit);
 411                }
 412                if (urb->status == -EINPROGRESS)
 413                        continue;
 414
 415return_urb:
 416                if (ep)
 417                        ep->already_seen = ep->setup_stage = 0;
 418
 419                spin_lock(&udc->lock_tx);
 420                list_del(&urb_p->urb_entry);
 421                if (!urb->unlinked) {
 422                        v_enqueue_ret_submit(udc, urb_p);
 423                } else {
 424                        v_enqueue_ret_unlink(udc, urb_p->seqnum,
 425                                             urb->unlinked);
 426                        free_urbp_and_urb(urb_p);
 427                }
 428                wake_up(&udc->tx_waitq);
 429                spin_unlock(&udc->lock_tx);
 430
 431                goto restart;
 432        }
 433
 434        /* TODO - also wait on empty usb_request queues? */
 435        if (list_empty(&udc->urb_queue))
 436                timer->state = VUDC_TR_IDLE;
 437        else
 438                mod_timer(&timer->timer,
 439                          timer->frame_start + msecs_to_jiffies(1));
 440
 441        spin_unlock_irqrestore(&udc->lock, flags);
 442}
 443
 444/* All timer functions are run with udc->lock held */
 445
 446void v_init_timer(struct vudc *udc)
 447{
 448        struct transfer_timer *t = &udc->tr_timer;
 449
 450        timer_setup(&t->timer, v_timer, 0);
 451        t->state = VUDC_TR_STOPPED;
 452}
 453
 454void v_start_timer(struct vudc *udc)
 455{
 456        struct transfer_timer *t = &udc->tr_timer;
 457
 458        dev_dbg(&udc->pdev->dev, "timer start");
 459        switch (t->state) {
 460        case VUDC_TR_RUNNING:
 461                return;
 462        case VUDC_TR_IDLE:
 463                return v_kick_timer(udc, jiffies);
 464        case VUDC_TR_STOPPED:
 465                t->state = VUDC_TR_IDLE;
 466                t->frame_start = jiffies;
 467                t->frame_limit = get_frame_limit(udc->gadget.speed);
 468                return v_kick_timer(udc, jiffies);
 469        }
 470}
 471
 472void v_kick_timer(struct vudc *udc, unsigned long time)
 473{
 474        struct transfer_timer *t = &udc->tr_timer;
 475
 476        dev_dbg(&udc->pdev->dev, "timer kick");
 477        switch (t->state) {
 478        case VUDC_TR_RUNNING:
 479                return;
 480        case VUDC_TR_IDLE:
 481                t->state = VUDC_TR_RUNNING;
 482                /* fallthrough */
 483        case VUDC_TR_STOPPED:
 484                /* we may want to kick timer to unqueue urbs */
 485                mod_timer(&t->timer, time);
 486        }
 487}
 488
 489void v_stop_timer(struct vudc *udc)
 490{
 491        struct transfer_timer *t = &udc->tr_timer;
 492
 493        /* timer itself will take care of stopping */
 494        dev_dbg(&udc->pdev->dev, "timer stop");
 495        t->state = VUDC_TR_STOPPED;
 496}
 497