linux/drivers/usb/gadget/function/f_acm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * f_acm.c -- USB CDC serial (ACM) function driver
   4 *
   5 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
   6 * Copyright (C) 2008 by David Brownell
   7 * Copyright (C) 2008 by Nokia Corporation
   8 * Copyright (C) 2009 by Samsung Electronics
   9 * Author: Michal Nazarewicz (mina86@mina86.com)
  10 */
  11
  12/* #define VERBOSE_DEBUG */
  13
  14#include <linux/slab.h>
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/device.h>
  18#include <linux/err.h>
  19
  20#include "u_serial.h"
  21
  22
  23/*
  24 * This CDC ACM function support just wraps control functions and
  25 * notifications around the generic serial-over-usb code.
  26 *
  27 * Because CDC ACM is standardized by the USB-IF, many host operating
  28 * systems have drivers for it.  Accordingly, ACM is the preferred
  29 * interop solution for serial-port type connections.  The control
  30 * models are often not necessary, and in any case don't do much in
  31 * this bare-bones implementation.
  32 *
  33 * Note that even MS-Windows has some support for ACM.  However, that
  34 * support is somewhat broken because when you use ACM in a composite
  35 * device, having multiple interfaces confuses the poor OS.  It doesn't
  36 * seem to understand CDC Union descriptors.  The new "association"
  37 * descriptors (roughly equivalent to CDC Unions) may sometimes help.
  38 */
  39
  40struct f_acm {
  41        struct gserial                  port;
  42        u8                              ctrl_id, data_id;
  43        u8                              port_num;
  44
  45        u8                              pending;
  46
  47        /* lock is mostly for pending and notify_req ... they get accessed
  48         * by callbacks both from tty (open/close/break) under its spinlock,
  49         * and notify_req.complete() which can't use that lock.
  50         */
  51        spinlock_t                      lock;
  52
  53        struct usb_ep                   *notify;
  54        struct usb_request              *notify_req;
  55
  56        struct usb_cdc_line_coding      port_line_coding;       /* 8-N-1 etc */
  57
  58        /* SetControlLineState request -- CDC 1.1 section 6.2.14 (INPUT) */
  59        u16                             port_handshake_bits;
  60#define ACM_CTRL_RTS    (1 << 1)        /* unused with full duplex */
  61#define ACM_CTRL_DTR    (1 << 0)        /* host is ready for data r/w */
  62
  63        /* SerialState notification -- CDC 1.1 section 6.3.5 (OUTPUT) */
  64        u16                             serial_state;
  65#define ACM_CTRL_OVERRUN        (1 << 6)
  66#define ACM_CTRL_PARITY         (1 << 5)
  67#define ACM_CTRL_FRAMING        (1 << 4)
  68#define ACM_CTRL_RI             (1 << 3)
  69#define ACM_CTRL_BRK            (1 << 2)
  70#define ACM_CTRL_DSR            (1 << 1)
  71#define ACM_CTRL_DCD            (1 << 0)
  72};
  73
  74static inline struct f_acm *func_to_acm(struct usb_function *f)
  75{
  76        return container_of(f, struct f_acm, port.func);
  77}
  78
  79static inline struct f_acm *port_to_acm(struct gserial *p)
  80{
  81        return container_of(p, struct f_acm, port);
  82}
  83
  84/*-------------------------------------------------------------------------*/
  85
  86/* notification endpoint uses smallish and infrequent fixed-size messages */
  87
  88#define GS_NOTIFY_INTERVAL_MS           32
  89#define GS_NOTIFY_MAXPACKET             10      /* notification + 2 bytes */
  90
  91/* interface and class descriptors: */
  92
  93static struct usb_interface_assoc_descriptor
  94acm_iad_descriptor = {
  95        .bLength =              sizeof acm_iad_descriptor,
  96        .bDescriptorType =      USB_DT_INTERFACE_ASSOCIATION,
  97
  98        /* .bFirstInterface =   DYNAMIC, */
  99        .bInterfaceCount =      2,      // control + data
 100        .bFunctionClass =       USB_CLASS_COMM,
 101        .bFunctionSubClass =    USB_CDC_SUBCLASS_ACM,
 102        .bFunctionProtocol =    USB_CDC_ACM_PROTO_AT_V25TER,
 103        /* .iFunction =         DYNAMIC */
 104};
 105
 106
 107static struct usb_interface_descriptor acm_control_interface_desc = {
 108        .bLength =              USB_DT_INTERFACE_SIZE,
 109        .bDescriptorType =      USB_DT_INTERFACE,
 110        /* .bInterfaceNumber = DYNAMIC */
 111        .bNumEndpoints =        1,
 112        .bInterfaceClass =      USB_CLASS_COMM,
 113        .bInterfaceSubClass =   USB_CDC_SUBCLASS_ACM,
 114        .bInterfaceProtocol =   USB_CDC_ACM_PROTO_AT_V25TER,
 115        /* .iInterface = DYNAMIC */
 116};
 117
 118static struct usb_interface_descriptor acm_data_interface_desc = {
 119        .bLength =              USB_DT_INTERFACE_SIZE,
 120        .bDescriptorType =      USB_DT_INTERFACE,
 121        /* .bInterfaceNumber = DYNAMIC */
 122        .bNumEndpoints =        2,
 123        .bInterfaceClass =      USB_CLASS_CDC_DATA,
 124        .bInterfaceSubClass =   0,
 125        .bInterfaceProtocol =   0,
 126        /* .iInterface = DYNAMIC */
 127};
 128
 129static struct usb_cdc_header_desc acm_header_desc = {
 130        .bLength =              sizeof(acm_header_desc),
 131        .bDescriptorType =      USB_DT_CS_INTERFACE,
 132        .bDescriptorSubType =   USB_CDC_HEADER_TYPE,
 133        .bcdCDC =               cpu_to_le16(0x0110),
 134};
 135
 136static struct usb_cdc_call_mgmt_descriptor
 137acm_call_mgmt_descriptor = {
 138        .bLength =              sizeof(acm_call_mgmt_descriptor),
 139        .bDescriptorType =      USB_DT_CS_INTERFACE,
 140        .bDescriptorSubType =   USB_CDC_CALL_MANAGEMENT_TYPE,
 141        .bmCapabilities =       0,
 142        /* .bDataInterface = DYNAMIC */
 143};
 144
 145static struct usb_cdc_acm_descriptor acm_descriptor = {
 146        .bLength =              sizeof(acm_descriptor),
 147        .bDescriptorType =      USB_DT_CS_INTERFACE,
 148        .bDescriptorSubType =   USB_CDC_ACM_TYPE,
 149        .bmCapabilities =       USB_CDC_CAP_LINE,
 150};
 151
 152static struct usb_cdc_union_desc acm_union_desc = {
 153        .bLength =              sizeof(acm_union_desc),
 154        .bDescriptorType =      USB_DT_CS_INTERFACE,
 155        .bDescriptorSubType =   USB_CDC_UNION_TYPE,
 156        /* .bMasterInterface0 = DYNAMIC */
 157        /* .bSlaveInterface0 =  DYNAMIC */
 158};
 159
 160/* full speed support: */
 161
 162static struct usb_endpoint_descriptor acm_fs_notify_desc = {
 163        .bLength =              USB_DT_ENDPOINT_SIZE,
 164        .bDescriptorType =      USB_DT_ENDPOINT,
 165        .bEndpointAddress =     USB_DIR_IN,
 166        .bmAttributes =         USB_ENDPOINT_XFER_INT,
 167        .wMaxPacketSize =       cpu_to_le16(GS_NOTIFY_MAXPACKET),
 168        .bInterval =            GS_NOTIFY_INTERVAL_MS,
 169};
 170
 171static struct usb_endpoint_descriptor acm_fs_in_desc = {
 172        .bLength =              USB_DT_ENDPOINT_SIZE,
 173        .bDescriptorType =      USB_DT_ENDPOINT,
 174        .bEndpointAddress =     USB_DIR_IN,
 175        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 176};
 177
 178static struct usb_endpoint_descriptor acm_fs_out_desc = {
 179        .bLength =              USB_DT_ENDPOINT_SIZE,
 180        .bDescriptorType =      USB_DT_ENDPOINT,
 181        .bEndpointAddress =     USB_DIR_OUT,
 182        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 183};
 184
 185static struct usb_descriptor_header *acm_fs_function[] = {
 186        (struct usb_descriptor_header *) &acm_iad_descriptor,
 187        (struct usb_descriptor_header *) &acm_control_interface_desc,
 188        (struct usb_descriptor_header *) &acm_header_desc,
 189        (struct usb_descriptor_header *) &acm_call_mgmt_descriptor,
 190        (struct usb_descriptor_header *) &acm_descriptor,
 191        (struct usb_descriptor_header *) &acm_union_desc,
 192        (struct usb_descriptor_header *) &acm_fs_notify_desc,
 193        (struct usb_descriptor_header *) &acm_data_interface_desc,
 194        (struct usb_descriptor_header *) &acm_fs_in_desc,
 195        (struct usb_descriptor_header *) &acm_fs_out_desc,
 196        NULL,
 197};
 198
 199/* high speed support: */
 200static struct usb_endpoint_descriptor acm_hs_notify_desc = {
 201        .bLength =              USB_DT_ENDPOINT_SIZE,
 202        .bDescriptorType =      USB_DT_ENDPOINT,
 203        .bEndpointAddress =     USB_DIR_IN,
 204        .bmAttributes =         USB_ENDPOINT_XFER_INT,
 205        .wMaxPacketSize =       cpu_to_le16(GS_NOTIFY_MAXPACKET),
 206        .bInterval =            USB_MS_TO_HS_INTERVAL(GS_NOTIFY_INTERVAL_MS),
 207};
 208
 209static struct usb_endpoint_descriptor acm_hs_in_desc = {
 210        .bLength =              USB_DT_ENDPOINT_SIZE,
 211        .bDescriptorType =      USB_DT_ENDPOINT,
 212        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 213        .wMaxPacketSize =       cpu_to_le16(512),
 214};
 215
 216static struct usb_endpoint_descriptor acm_hs_out_desc = {
 217        .bLength =              USB_DT_ENDPOINT_SIZE,
 218        .bDescriptorType =      USB_DT_ENDPOINT,
 219        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 220        .wMaxPacketSize =       cpu_to_le16(512),
 221};
 222
 223static struct usb_descriptor_header *acm_hs_function[] = {
 224        (struct usb_descriptor_header *) &acm_iad_descriptor,
 225        (struct usb_descriptor_header *) &acm_control_interface_desc,
 226        (struct usb_descriptor_header *) &acm_header_desc,
 227        (struct usb_descriptor_header *) &acm_call_mgmt_descriptor,
 228        (struct usb_descriptor_header *) &acm_descriptor,
 229        (struct usb_descriptor_header *) &acm_union_desc,
 230        (struct usb_descriptor_header *) &acm_hs_notify_desc,
 231        (struct usb_descriptor_header *) &acm_data_interface_desc,
 232        (struct usb_descriptor_header *) &acm_hs_in_desc,
 233        (struct usb_descriptor_header *) &acm_hs_out_desc,
 234        NULL,
 235};
 236
 237static struct usb_endpoint_descriptor acm_ss_in_desc = {
 238        .bLength =              USB_DT_ENDPOINT_SIZE,
 239        .bDescriptorType =      USB_DT_ENDPOINT,
 240        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 241        .wMaxPacketSize =       cpu_to_le16(1024),
 242};
 243
 244static struct usb_endpoint_descriptor acm_ss_out_desc = {
 245        .bLength =              USB_DT_ENDPOINT_SIZE,
 246        .bDescriptorType =      USB_DT_ENDPOINT,
 247        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 248        .wMaxPacketSize =       cpu_to_le16(1024),
 249};
 250
 251static struct usb_ss_ep_comp_descriptor acm_ss_bulk_comp_desc = {
 252        .bLength =              sizeof acm_ss_bulk_comp_desc,
 253        .bDescriptorType =      USB_DT_SS_ENDPOINT_COMP,
 254};
 255
 256static struct usb_descriptor_header *acm_ss_function[] = {
 257        (struct usb_descriptor_header *) &acm_iad_descriptor,
 258        (struct usb_descriptor_header *) &acm_control_interface_desc,
 259        (struct usb_descriptor_header *) &acm_header_desc,
 260        (struct usb_descriptor_header *) &acm_call_mgmt_descriptor,
 261        (struct usb_descriptor_header *) &acm_descriptor,
 262        (struct usb_descriptor_header *) &acm_union_desc,
 263        (struct usb_descriptor_header *) &acm_hs_notify_desc,
 264        (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc,
 265        (struct usb_descriptor_header *) &acm_data_interface_desc,
 266        (struct usb_descriptor_header *) &acm_ss_in_desc,
 267        (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc,
 268        (struct usb_descriptor_header *) &acm_ss_out_desc,
 269        (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc,
 270        NULL,
 271};
 272
 273/* string descriptors: */
 274
 275#define ACM_CTRL_IDX    0
 276#define ACM_DATA_IDX    1
 277#define ACM_IAD_IDX     2
 278
 279/* static strings, in UTF-8 */
 280static struct usb_string acm_string_defs[] = {
 281        [ACM_CTRL_IDX].s = "CDC Abstract Control Model (ACM)",
 282        [ACM_DATA_IDX].s = "CDC ACM Data",
 283        [ACM_IAD_IDX ].s = "CDC Serial",
 284        {  } /* end of list */
 285};
 286
 287static struct usb_gadget_strings acm_string_table = {
 288        .language =             0x0409, /* en-us */
 289        .strings =              acm_string_defs,
 290};
 291
 292static struct usb_gadget_strings *acm_strings[] = {
 293        &acm_string_table,
 294        NULL,
 295};
 296
 297/*-------------------------------------------------------------------------*/
 298
 299/* ACM control ... data handling is delegated to tty library code.
 300 * The main task of this function is to activate and deactivate
 301 * that code based on device state; track parameters like line
 302 * speed, handshake state, and so on; and issue notifications.
 303 */
 304
 305static void acm_complete_set_line_coding(struct usb_ep *ep,
 306                struct usb_request *req)
 307{
 308        struct f_acm    *acm = ep->driver_data;
 309        struct usb_composite_dev *cdev = acm->port.func.config->cdev;
 310
 311        if (req->status != 0) {
 312                dev_dbg(&cdev->gadget->dev, "acm ttyGS%d completion, err %d\n",
 313                        acm->port_num, req->status);
 314                return;
 315        }
 316
 317        /* normal completion */
 318        if (req->actual != sizeof(acm->port_line_coding)) {
 319                dev_dbg(&cdev->gadget->dev, "acm ttyGS%d short resp, len %d\n",
 320                        acm->port_num, req->actual);
 321                usb_ep_set_halt(ep);
 322        } else {
 323                struct usb_cdc_line_coding      *value = req->buf;
 324
 325                /* REVISIT:  we currently just remember this data.
 326                 * If we change that, (a) validate it first, then
 327                 * (b) update whatever hardware needs updating,
 328                 * (c) worry about locking.  This is information on
 329                 * the order of 9600-8-N-1 ... most of which means
 330                 * nothing unless we control a real RS232 line.
 331                 */
 332                acm->port_line_coding = *value;
 333        }
 334}
 335
 336static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
 337{
 338        struct f_acm            *acm = func_to_acm(f);
 339        struct usb_composite_dev *cdev = f->config->cdev;
 340        struct usb_request      *req = cdev->req;
 341        int                     value = -EOPNOTSUPP;
 342        u16                     w_index = le16_to_cpu(ctrl->wIndex);
 343        u16                     w_value = le16_to_cpu(ctrl->wValue);
 344        u16                     w_length = le16_to_cpu(ctrl->wLength);
 345
 346        /* composite driver infrastructure handles everything except
 347         * CDC class messages; interface activation uses set_alt().
 348         *
 349         * Note CDC spec table 4 lists the ACM request profile.  It requires
 350         * encapsulated command support ... we don't handle any, and respond
 351         * to them by stalling.  Options include get/set/clear comm features
 352         * (not that useful) and SEND_BREAK.
 353         */
 354        switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
 355
 356        /* SET_LINE_CODING ... just read and save what the host sends */
 357        case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 358                        | USB_CDC_REQ_SET_LINE_CODING:
 359                if (w_length != sizeof(struct usb_cdc_line_coding)
 360                                || w_index != acm->ctrl_id)
 361                        goto invalid;
 362
 363                value = w_length;
 364                cdev->gadget->ep0->driver_data = acm;
 365                req->complete = acm_complete_set_line_coding;
 366                break;
 367
 368        /* GET_LINE_CODING ... return what host sent, or initial value */
 369        case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 370                        | USB_CDC_REQ_GET_LINE_CODING:
 371                if (w_index != acm->ctrl_id)
 372                        goto invalid;
 373
 374                value = min_t(unsigned, w_length,
 375                                sizeof(struct usb_cdc_line_coding));
 376                memcpy(req->buf, &acm->port_line_coding, value);
 377                break;
 378
 379        /* SET_CONTROL_LINE_STATE ... save what the host sent */
 380        case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 381                        | USB_CDC_REQ_SET_CONTROL_LINE_STATE:
 382                if (w_index != acm->ctrl_id)
 383                        goto invalid;
 384
 385                value = 0;
 386
 387                /* FIXME we should not allow data to flow until the
 388                 * host sets the ACM_CTRL_DTR bit; and when it clears
 389                 * that bit, we should return to that no-flow state.
 390                 */
 391                acm->port_handshake_bits = w_value;
 392                break;
 393
 394        default:
 395invalid:
 396                dev_vdbg(&cdev->gadget->dev,
 397                         "invalid control req%02x.%02x v%04x i%04x l%d\n",
 398                         ctrl->bRequestType, ctrl->bRequest,
 399                         w_value, w_index, w_length);
 400        }
 401
 402        /* respond with data transfer or status phase? */
 403        if (value >= 0) {
 404                dev_dbg(&cdev->gadget->dev,
 405                        "acm ttyGS%d req%02x.%02x v%04x i%04x l%d\n",
 406                        acm->port_num, ctrl->bRequestType, ctrl->bRequest,
 407                        w_value, w_index, w_length);
 408                req->zero = 0;
 409                req->length = value;
 410                value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
 411                if (value < 0)
 412                        ERROR(cdev, "acm response on ttyGS%d, err %d\n",
 413                                        acm->port_num, value);
 414        }
 415
 416        /* device either stalls (value < 0) or reports success */
 417        return value;
 418}
 419
 420static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
 421{
 422        struct f_acm            *acm = func_to_acm(f);
 423        struct usb_composite_dev *cdev = f->config->cdev;
 424
 425        /* we know alt == 0, so this is an activation or a reset */
 426
 427        if (intf == acm->ctrl_id) {
 428                dev_vdbg(&cdev->gadget->dev,
 429                                "reset acm control interface %d\n", intf);
 430                usb_ep_disable(acm->notify);
 431
 432                if (!acm->notify->desc)
 433                        if (config_ep_by_speed(cdev->gadget, f, acm->notify))
 434                                return -EINVAL;
 435
 436                usb_ep_enable(acm->notify);
 437
 438        } else if (intf == acm->data_id) {
 439                if (acm->notify->enabled) {
 440                        dev_dbg(&cdev->gadget->dev,
 441                                "reset acm ttyGS%d\n", acm->port_num);
 442                        gserial_disconnect(&acm->port);
 443                }
 444                if (!acm->port.in->desc || !acm->port.out->desc) {
 445                        dev_dbg(&cdev->gadget->dev,
 446                                "activate acm ttyGS%d\n", acm->port_num);
 447                        if (config_ep_by_speed(cdev->gadget, f,
 448                                               acm->port.in) ||
 449                            config_ep_by_speed(cdev->gadget, f,
 450                                               acm->port.out)) {
 451                                acm->port.in->desc = NULL;
 452                                acm->port.out->desc = NULL;
 453                                return -EINVAL;
 454                        }
 455                }
 456                gserial_connect(&acm->port, acm->port_num);
 457
 458        } else
 459                return -EINVAL;
 460
 461        return 0;
 462}
 463
 464static void acm_disable(struct usb_function *f)
 465{
 466        struct f_acm    *acm = func_to_acm(f);
 467        struct usb_composite_dev *cdev = f->config->cdev;
 468
 469        dev_dbg(&cdev->gadget->dev, "acm ttyGS%d deactivated\n", acm->port_num);
 470        gserial_disconnect(&acm->port);
 471        usb_ep_disable(acm->notify);
 472}
 473
 474/*-------------------------------------------------------------------------*/
 475
 476/**
 477 * acm_cdc_notify - issue CDC notification to host
 478 * @acm: wraps host to be notified
 479 * @type: notification type
 480 * @value: Refer to cdc specs, wValue field.
 481 * @data: data to be sent
 482 * @length: size of data
 483 * Context: irqs blocked, acm->lock held, acm_notify_req non-null
 484 *
 485 * Returns zero on success or a negative errno.
 486 *
 487 * See section 6.3.5 of the CDC 1.1 specification for information
 488 * about the only notification we issue:  SerialState change.
 489 */
 490static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value,
 491                void *data, unsigned length)
 492{
 493        struct usb_ep                   *ep = acm->notify;
 494        struct usb_request              *req;
 495        struct usb_cdc_notification     *notify;
 496        const unsigned                  len = sizeof(*notify) + length;
 497        void                            *buf;
 498        int                             status;
 499
 500        req = acm->notify_req;
 501        acm->notify_req = NULL;
 502        acm->pending = false;
 503
 504        req->length = len;
 505        notify = req->buf;
 506        buf = notify + 1;
 507
 508        notify->bmRequestType = USB_DIR_IN | USB_TYPE_CLASS
 509                        | USB_RECIP_INTERFACE;
 510        notify->bNotificationType = type;
 511        notify->wValue = cpu_to_le16(value);
 512        notify->wIndex = cpu_to_le16(acm->ctrl_id);
 513        notify->wLength = cpu_to_le16(length);
 514        memcpy(buf, data, length);
 515
 516        /* ep_queue() can complete immediately if it fills the fifo... */
 517        spin_unlock(&acm->lock);
 518        status = usb_ep_queue(ep, req, GFP_ATOMIC);
 519        spin_lock(&acm->lock);
 520
 521        if (status < 0) {
 522                ERROR(acm->port.func.config->cdev,
 523                                "acm ttyGS%d can't notify serial state, %d\n",
 524                                acm->port_num, status);
 525                acm->notify_req = req;
 526        }
 527
 528        return status;
 529}
 530
 531static int acm_notify_serial_state(struct f_acm *acm)
 532{
 533        struct usb_composite_dev *cdev = acm->port.func.config->cdev;
 534        int                     status;
 535        __le16                  serial_state;
 536
 537        spin_lock(&acm->lock);
 538        if (acm->notify_req) {
 539                dev_dbg(&cdev->gadget->dev, "acm ttyGS%d serial state %04x\n",
 540                        acm->port_num, acm->serial_state);
 541                serial_state = cpu_to_le16(acm->serial_state);
 542                status = acm_cdc_notify(acm, USB_CDC_NOTIFY_SERIAL_STATE,
 543                                0, &serial_state, sizeof(acm->serial_state));
 544        } else {
 545                acm->pending = true;
 546                status = 0;
 547        }
 548        spin_unlock(&acm->lock);
 549        return status;
 550}
 551
 552static void acm_cdc_notify_complete(struct usb_ep *ep, struct usb_request *req)
 553{
 554        struct f_acm            *acm = req->context;
 555        u8                      doit = false;
 556
 557        /* on this call path we do NOT hold the port spinlock,
 558         * which is why ACM needs its own spinlock
 559         */
 560        spin_lock(&acm->lock);
 561        if (req->status != -ESHUTDOWN)
 562                doit = acm->pending;
 563        acm->notify_req = req;
 564        spin_unlock(&acm->lock);
 565
 566        if (doit)
 567                acm_notify_serial_state(acm);
 568}
 569
 570/* connect == the TTY link is open */
 571
 572static void acm_connect(struct gserial *port)
 573{
 574        struct f_acm            *acm = port_to_acm(port);
 575
 576        acm->serial_state |= ACM_CTRL_DSR | ACM_CTRL_DCD;
 577        acm_notify_serial_state(acm);
 578}
 579
 580static void acm_disconnect(struct gserial *port)
 581{
 582        struct f_acm            *acm = port_to_acm(port);
 583
 584        acm->serial_state &= ~(ACM_CTRL_DSR | ACM_CTRL_DCD);
 585        acm_notify_serial_state(acm);
 586}
 587
 588static int acm_send_break(struct gserial *port, int duration)
 589{
 590        struct f_acm            *acm = port_to_acm(port);
 591        u16                     state;
 592
 593        state = acm->serial_state;
 594        state &= ~ACM_CTRL_BRK;
 595        if (duration)
 596                state |= ACM_CTRL_BRK;
 597
 598        acm->serial_state = state;
 599        return acm_notify_serial_state(acm);
 600}
 601
 602/*-------------------------------------------------------------------------*/
 603
 604/* ACM function driver setup/binding */
 605static int
 606acm_bind(struct usb_configuration *c, struct usb_function *f)
 607{
 608        struct usb_composite_dev *cdev = c->cdev;
 609        struct f_acm            *acm = func_to_acm(f);
 610        struct usb_string       *us;
 611        int                     status;
 612        struct usb_ep           *ep;
 613
 614        /* REVISIT might want instance-specific strings to help
 615         * distinguish instances ...
 616         */
 617
 618        /* maybe allocate device-global string IDs, and patch descriptors */
 619        us = usb_gstrings_attach(cdev, acm_strings,
 620                        ARRAY_SIZE(acm_string_defs));
 621        if (IS_ERR(us))
 622                return PTR_ERR(us);
 623        acm_control_interface_desc.iInterface = us[ACM_CTRL_IDX].id;
 624        acm_data_interface_desc.iInterface = us[ACM_DATA_IDX].id;
 625        acm_iad_descriptor.iFunction = us[ACM_IAD_IDX].id;
 626
 627        /* allocate instance-specific interface IDs, and patch descriptors */
 628        status = usb_interface_id(c, f);
 629        if (status < 0)
 630                goto fail;
 631        acm->ctrl_id = status;
 632        acm_iad_descriptor.bFirstInterface = status;
 633
 634        acm_control_interface_desc.bInterfaceNumber = status;
 635        acm_union_desc .bMasterInterface0 = status;
 636
 637        status = usb_interface_id(c, f);
 638        if (status < 0)
 639                goto fail;
 640        acm->data_id = status;
 641
 642        acm_data_interface_desc.bInterfaceNumber = status;
 643        acm_union_desc.bSlaveInterface0 = status;
 644        acm_call_mgmt_descriptor.bDataInterface = status;
 645
 646        status = -ENODEV;
 647
 648        /* allocate instance-specific endpoints */
 649        ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_in_desc);
 650        if (!ep)
 651                goto fail;
 652        acm->port.in = ep;
 653
 654        ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_out_desc);
 655        if (!ep)
 656                goto fail;
 657        acm->port.out = ep;
 658
 659        ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_notify_desc);
 660        if (!ep)
 661                goto fail;
 662        acm->notify = ep;
 663
 664        /* allocate notification */
 665        acm->notify_req = gs_alloc_req(ep,
 666                        sizeof(struct usb_cdc_notification) + 2,
 667                        GFP_KERNEL);
 668        if (!acm->notify_req)
 669                goto fail;
 670
 671        acm->notify_req->complete = acm_cdc_notify_complete;
 672        acm->notify_req->context = acm;
 673
 674        /* support all relevant hardware speeds... we expect that when
 675         * hardware is dual speed, all bulk-capable endpoints work at
 676         * both speeds
 677         */
 678        acm_hs_in_desc.bEndpointAddress = acm_fs_in_desc.bEndpointAddress;
 679        acm_hs_out_desc.bEndpointAddress = acm_fs_out_desc.bEndpointAddress;
 680        acm_hs_notify_desc.bEndpointAddress =
 681                acm_fs_notify_desc.bEndpointAddress;
 682
 683        acm_ss_in_desc.bEndpointAddress = acm_fs_in_desc.bEndpointAddress;
 684        acm_ss_out_desc.bEndpointAddress = acm_fs_out_desc.bEndpointAddress;
 685
 686        status = usb_assign_descriptors(f, acm_fs_function, acm_hs_function,
 687                        acm_ss_function, NULL);
 688        if (status)
 689                goto fail;
 690
 691        dev_dbg(&cdev->gadget->dev,
 692                "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n",
 693                acm->port_num,
 694                gadget_is_superspeed(c->cdev->gadget) ? "super" :
 695                gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
 696                acm->port.in->name, acm->port.out->name,
 697                acm->notify->name);
 698        return 0;
 699
 700fail:
 701        if (acm->notify_req)
 702                gs_free_req(acm->notify, acm->notify_req);
 703
 704        ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status);
 705
 706        return status;
 707}
 708
 709static void acm_unbind(struct usb_configuration *c, struct usb_function *f)
 710{
 711        struct f_acm            *acm = func_to_acm(f);
 712
 713        acm_string_defs[0].id = 0;
 714        usb_free_all_descriptors(f);
 715        if (acm->notify_req)
 716                gs_free_req(acm->notify, acm->notify_req);
 717}
 718
 719static void acm_free_func(struct usb_function *f)
 720{
 721        struct f_acm            *acm = func_to_acm(f);
 722
 723        kfree(acm);
 724}
 725
 726static struct usb_function *acm_alloc_func(struct usb_function_instance *fi)
 727{
 728        struct f_serial_opts *opts;
 729        struct f_acm *acm;
 730
 731        acm = kzalloc(sizeof(*acm), GFP_KERNEL);
 732        if (!acm)
 733                return ERR_PTR(-ENOMEM);
 734
 735        spin_lock_init(&acm->lock);
 736
 737        acm->port.connect = acm_connect;
 738        acm->port.disconnect = acm_disconnect;
 739        acm->port.send_break = acm_send_break;
 740
 741        acm->port.func.name = "acm";
 742        acm->port.func.strings = acm_strings;
 743        /* descriptors are per-instance copies */
 744        acm->port.func.bind = acm_bind;
 745        acm->port.func.set_alt = acm_set_alt;
 746        acm->port.func.setup = acm_setup;
 747        acm->port.func.disable = acm_disable;
 748
 749        opts = container_of(fi, struct f_serial_opts, func_inst);
 750        acm->port_num = opts->port_num;
 751        acm->port.func.unbind = acm_unbind;
 752        acm->port.func.free_func = acm_free_func;
 753
 754        return &acm->port.func;
 755}
 756
 757static inline struct f_serial_opts *to_f_serial_opts(struct config_item *item)
 758{
 759        return container_of(to_config_group(item), struct f_serial_opts,
 760                        func_inst.group);
 761}
 762
 763static void acm_attr_release(struct config_item *item)
 764{
 765        struct f_serial_opts *opts = to_f_serial_opts(item);
 766
 767        usb_put_function_instance(&opts->func_inst);
 768}
 769
 770static struct configfs_item_operations acm_item_ops = {
 771        .release                = acm_attr_release,
 772};
 773
 774static ssize_t f_acm_port_num_show(struct config_item *item, char *page)
 775{
 776        return sprintf(page, "%u\n", to_f_serial_opts(item)->port_num);
 777}
 778
 779CONFIGFS_ATTR_RO(f_acm_, port_num);
 780
 781static struct configfs_attribute *acm_attrs[] = {
 782        &f_acm_attr_port_num,
 783        NULL,
 784};
 785
 786static const struct config_item_type acm_func_type = {
 787        .ct_item_ops    = &acm_item_ops,
 788        .ct_attrs       = acm_attrs,
 789        .ct_owner       = THIS_MODULE,
 790};
 791
 792static void acm_free_instance(struct usb_function_instance *fi)
 793{
 794        struct f_serial_opts *opts;
 795
 796        opts = container_of(fi, struct f_serial_opts, func_inst);
 797        gserial_free_line(opts->port_num);
 798        kfree(opts);
 799}
 800
 801static struct usb_function_instance *acm_alloc_instance(void)
 802{
 803        struct f_serial_opts *opts;
 804        int ret;
 805
 806        opts = kzalloc(sizeof(*opts), GFP_KERNEL);
 807        if (!opts)
 808                return ERR_PTR(-ENOMEM);
 809        opts->func_inst.free_func_inst = acm_free_instance;
 810        ret = gserial_alloc_line(&opts->port_num);
 811        if (ret) {
 812                kfree(opts);
 813                return ERR_PTR(ret);
 814        }
 815        config_group_init_type_name(&opts->func_inst.group, "",
 816                        &acm_func_type);
 817        return &opts->func_inst;
 818}
 819DECLARE_USB_FUNCTION_INIT(acm, acm_alloc_instance, acm_alloc_func);
 820MODULE_LICENSE("GPL");
 821