root/drivers/usb/gadget/function/f_ncm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. func_to_ncm
  2. ncm_bitrate
  3. put_ncm
  4. get_ncm
  5. ncm_reset_values
  6. ncm_do_notify
  7. ncm_notify
  8. ncm_notify_complete
  9. ncm_ep0out_complete
  10. ncm_setup
  11. ncm_set_alt
  12. ncm_get_alt
  13. package_for_tx
  14. ncm_wrap_ntb
  15. ncm_tx_timeout
  16. ncm_unwrap_ntb
  17. ncm_disable
  18. ncm_open
  19. ncm_close
  20. ncm_bind
  21. to_f_ncm_opts
  22. ncm_free_inst
  23. ncm_alloc_inst
  24. ncm_free
  25. ncm_unbind
  26. ncm_alloc

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * f_ncm.c -- USB CDC Network (NCM) link function driver
   4  *
   5  * Copyright (C) 2010 Nokia Corporation
   6  * Contact: Yauheni Kaliuta <yauheni.kaliuta@nokia.com>
   7  *
   8  * The driver borrows from f_ecm.c which is:
   9  *
  10  * Copyright (C) 2003-2005,2008 David Brownell
  11  * Copyright (C) 2008 Nokia Corporation
  12  */
  13 
  14 #include <linux/kernel.h>
  15 #include <linux/interrupt.h>
  16 #include <linux/module.h>
  17 #include <linux/device.h>
  18 #include <linux/etherdevice.h>
  19 #include <linux/crc32.h>
  20 
  21 #include <linux/usb/cdc.h>
  22 
  23 #include "u_ether.h"
  24 #include "u_ether_configfs.h"
  25 #include "u_ncm.h"
  26 #include "configfs.h"
  27 
  28 /*
  29  * This function is a "CDC Network Control Model" (CDC NCM) Ethernet link.
  30  * NCM is intended to be used with high-speed network attachments.
  31  *
  32  * Note that NCM requires the use of "alternate settings" for its data
  33  * interface.  This means that the set_alt() method has real work to do,
  34  * and also means that a get_alt() method is required.
  35  */
  36 
  37 /* to trigger crc/non-crc ndp signature */
  38 
  39 #define NCM_NDP_HDR_CRC         0x01000000
  40 
  41 enum ncm_notify_state {
  42         NCM_NOTIFY_NONE,                /* don't notify */
  43         NCM_NOTIFY_CONNECT,             /* issue CONNECT next */
  44         NCM_NOTIFY_SPEED,               /* issue SPEED_CHANGE next */
  45 };
  46 
  47 struct f_ncm {
  48         struct gether                   port;
  49         u8                              ctrl_id, data_id;
  50 
  51         char                            ethaddr[14];
  52 
  53         struct usb_ep                   *notify;
  54         struct usb_request              *notify_req;
  55         u8                              notify_state;
  56         atomic_t                        notify_count;
  57         bool                            is_open;
  58 
  59         const struct ndp_parser_opts    *parser_opts;
  60         bool                            is_crc;
  61         u32                             ndp_sign;
  62 
  63         /*
  64          * for notification, it is accessed from both
  65          * callback and ethernet open/close
  66          */
  67         spinlock_t                      lock;
  68 
  69         struct net_device               *netdev;
  70 
  71         /* For multi-frame NDP TX */
  72         struct sk_buff                  *skb_tx_data;
  73         struct sk_buff                  *skb_tx_ndp;
  74         u16                             ndp_dgram_count;
  75         bool                            timer_force_tx;
  76         struct hrtimer                  task_timer;
  77         bool                            timer_stopping;
  78 };
  79 
  80 static inline struct f_ncm *func_to_ncm(struct usb_function *f)
  81 {
  82         return container_of(f, struct f_ncm, port.func);
  83 }
  84 
  85 /* peak (theoretical) bulk transfer rate in bits-per-second */
  86 static inline unsigned ncm_bitrate(struct usb_gadget *g)
  87 {
  88         if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER)
  89                 return 13 * 1024 * 8 * 1000 * 8;
  90         else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
  91                 return 13 * 512 * 8 * 1000 * 8;
  92         else
  93                 return 19 *  64 * 1 * 1000 * 8;
  94 }
  95 
  96 /*-------------------------------------------------------------------------*/
  97 
  98 /*
  99  * We cannot group frames so use just the minimal size which ok to put
 100  * one max-size ethernet frame.
 101  * If the host can group frames, allow it to do that, 16K is selected,
 102  * because it's used by default by the current linux host driver
 103  */
 104 #define NTB_DEFAULT_IN_SIZE     16384
 105 #define NTB_OUT_SIZE            16384
 106 
 107 /* Allocation for storing the NDP, 32 should suffice for a
 108  * 16k packet. This allows a maximum of 32 * 507 Byte packets to
 109  * be transmitted in a single 16kB skb, though when sending full size
 110  * packets this limit will be plenty.
 111  * Smaller packets are not likely to be trying to maximize the
 112  * throughput and will be mstly sending smaller infrequent frames.
 113  */
 114 #define TX_MAX_NUM_DPE          32
 115 
 116 /* Delay for the transmit to wait before sending an unfilled NTB frame. */
 117 #define TX_TIMEOUT_NSECS        300000
 118 
 119 #define FORMATS_SUPPORTED       (USB_CDC_NCM_NTB16_SUPPORTED |  \
 120                                  USB_CDC_NCM_NTB32_SUPPORTED)
 121 
 122 static struct usb_cdc_ncm_ntb_parameters ntb_parameters = {
 123         .wLength = cpu_to_le16(sizeof(ntb_parameters)),
 124         .bmNtbFormatsSupported = cpu_to_le16(FORMATS_SUPPORTED),
 125         .dwNtbInMaxSize = cpu_to_le32(NTB_DEFAULT_IN_SIZE),
 126         .wNdpInDivisor = cpu_to_le16(4),
 127         .wNdpInPayloadRemainder = cpu_to_le16(0),
 128         .wNdpInAlignment = cpu_to_le16(4),
 129 
 130         .dwNtbOutMaxSize = cpu_to_le32(NTB_OUT_SIZE),
 131         .wNdpOutDivisor = cpu_to_le16(4),
 132         .wNdpOutPayloadRemainder = cpu_to_le16(0),
 133         .wNdpOutAlignment = cpu_to_le16(4),
 134 };
 135 
 136 /*
 137  * Use wMaxPacketSize big enough to fit CDC_NOTIFY_SPEED_CHANGE in one
 138  * packet, to simplify cancellation; and a big transfer interval, to
 139  * waste less bandwidth.
 140  */
 141 
 142 #define NCM_STATUS_INTERVAL_MS          32
 143 #define NCM_STATUS_BYTECOUNT            16      /* 8 byte header + data */
 144 
 145 static struct usb_interface_assoc_descriptor ncm_iad_desc = {
 146         .bLength =              sizeof ncm_iad_desc,
 147         .bDescriptorType =      USB_DT_INTERFACE_ASSOCIATION,
 148 
 149         /* .bFirstInterface =   DYNAMIC, */
 150         .bInterfaceCount =      2,      /* control + data */
 151         .bFunctionClass =       USB_CLASS_COMM,
 152         .bFunctionSubClass =    USB_CDC_SUBCLASS_NCM,
 153         .bFunctionProtocol =    USB_CDC_PROTO_NONE,
 154         /* .iFunction =         DYNAMIC */
 155 };
 156 
 157 /* interface descriptor: */
 158 
 159 static struct usb_interface_descriptor ncm_control_intf = {
 160         .bLength =              sizeof ncm_control_intf,
 161         .bDescriptorType =      USB_DT_INTERFACE,
 162 
 163         /* .bInterfaceNumber = DYNAMIC */
 164         .bNumEndpoints =        1,
 165         .bInterfaceClass =      USB_CLASS_COMM,
 166         .bInterfaceSubClass =   USB_CDC_SUBCLASS_NCM,
 167         .bInterfaceProtocol =   USB_CDC_PROTO_NONE,
 168         /* .iInterface = DYNAMIC */
 169 };
 170 
 171 static struct usb_cdc_header_desc ncm_header_desc = {
 172         .bLength =              sizeof ncm_header_desc,
 173         .bDescriptorType =      USB_DT_CS_INTERFACE,
 174         .bDescriptorSubType =   USB_CDC_HEADER_TYPE,
 175 
 176         .bcdCDC =               cpu_to_le16(0x0110),
 177 };
 178 
 179 static struct usb_cdc_union_desc ncm_union_desc = {
 180         .bLength =              sizeof(ncm_union_desc),
 181         .bDescriptorType =      USB_DT_CS_INTERFACE,
 182         .bDescriptorSubType =   USB_CDC_UNION_TYPE,
 183         /* .bMasterInterface0 = DYNAMIC */
 184         /* .bSlaveInterface0 =  DYNAMIC */
 185 };
 186 
 187 static struct usb_cdc_ether_desc ecm_desc = {
 188         .bLength =              sizeof ecm_desc,
 189         .bDescriptorType =      USB_DT_CS_INTERFACE,
 190         .bDescriptorSubType =   USB_CDC_ETHERNET_TYPE,
 191 
 192         /* this descriptor actually adds value, surprise! */
 193         /* .iMACAddress = DYNAMIC */
 194         .bmEthernetStatistics = cpu_to_le32(0), /* no statistics */
 195         .wMaxSegmentSize =      cpu_to_le16(ETH_FRAME_LEN),
 196         .wNumberMCFilters =     cpu_to_le16(0),
 197         .bNumberPowerFilters =  0,
 198 };
 199 
 200 #define NCAPS   (USB_CDC_NCM_NCAP_ETH_FILTER | USB_CDC_NCM_NCAP_CRC_MODE)
 201 
 202 static struct usb_cdc_ncm_desc ncm_desc = {
 203         .bLength =              sizeof ncm_desc,
 204         .bDescriptorType =      USB_DT_CS_INTERFACE,
 205         .bDescriptorSubType =   USB_CDC_NCM_TYPE,
 206 
 207         .bcdNcmVersion =        cpu_to_le16(0x0100),
 208         /* can process SetEthernetPacketFilter */
 209         .bmNetworkCapabilities = NCAPS,
 210 };
 211 
 212 /* the default data interface has no endpoints ... */
 213 
 214 static struct usb_interface_descriptor ncm_data_nop_intf = {
 215         .bLength =              sizeof ncm_data_nop_intf,
 216         .bDescriptorType =      USB_DT_INTERFACE,
 217 
 218         .bInterfaceNumber =     1,
 219         .bAlternateSetting =    0,
 220         .bNumEndpoints =        0,
 221         .bInterfaceClass =      USB_CLASS_CDC_DATA,
 222         .bInterfaceSubClass =   0,
 223         .bInterfaceProtocol =   USB_CDC_NCM_PROTO_NTB,
 224         /* .iInterface = DYNAMIC */
 225 };
 226 
 227 /* ... but the "real" data interface has two bulk endpoints */
 228 
 229 static struct usb_interface_descriptor ncm_data_intf = {
 230         .bLength =              sizeof ncm_data_intf,
 231         .bDescriptorType =      USB_DT_INTERFACE,
 232 
 233         .bInterfaceNumber =     1,
 234         .bAlternateSetting =    1,
 235         .bNumEndpoints =        2,
 236         .bInterfaceClass =      USB_CLASS_CDC_DATA,
 237         .bInterfaceSubClass =   0,
 238         .bInterfaceProtocol =   USB_CDC_NCM_PROTO_NTB,
 239         /* .iInterface = DYNAMIC */
 240 };
 241 
 242 /* full speed support: */
 243 
 244 static struct usb_endpoint_descriptor fs_ncm_notify_desc = {
 245         .bLength =              USB_DT_ENDPOINT_SIZE,
 246         .bDescriptorType =      USB_DT_ENDPOINT,
 247 
 248         .bEndpointAddress =     USB_DIR_IN,
 249         .bmAttributes =         USB_ENDPOINT_XFER_INT,
 250         .wMaxPacketSize =       cpu_to_le16(NCM_STATUS_BYTECOUNT),
 251         .bInterval =            NCM_STATUS_INTERVAL_MS,
 252 };
 253 
 254 static struct usb_endpoint_descriptor fs_ncm_in_desc = {
 255         .bLength =              USB_DT_ENDPOINT_SIZE,
 256         .bDescriptorType =      USB_DT_ENDPOINT,
 257 
 258         .bEndpointAddress =     USB_DIR_IN,
 259         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 260 };
 261 
 262 static struct usb_endpoint_descriptor fs_ncm_out_desc = {
 263         .bLength =              USB_DT_ENDPOINT_SIZE,
 264         .bDescriptorType =      USB_DT_ENDPOINT,
 265 
 266         .bEndpointAddress =     USB_DIR_OUT,
 267         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 268 };
 269 
 270 static struct usb_descriptor_header *ncm_fs_function[] = {
 271         (struct usb_descriptor_header *) &ncm_iad_desc,
 272         /* CDC NCM control descriptors */
 273         (struct usb_descriptor_header *) &ncm_control_intf,
 274         (struct usb_descriptor_header *) &ncm_header_desc,
 275         (struct usb_descriptor_header *) &ncm_union_desc,
 276         (struct usb_descriptor_header *) &ecm_desc,
 277         (struct usb_descriptor_header *) &ncm_desc,
 278         (struct usb_descriptor_header *) &fs_ncm_notify_desc,
 279         /* data interface, altsettings 0 and 1 */
 280         (struct usb_descriptor_header *) &ncm_data_nop_intf,
 281         (struct usb_descriptor_header *) &ncm_data_intf,
 282         (struct usb_descriptor_header *) &fs_ncm_in_desc,
 283         (struct usb_descriptor_header *) &fs_ncm_out_desc,
 284         NULL,
 285 };
 286 
 287 /* high speed support: */
 288 
 289 static struct usb_endpoint_descriptor hs_ncm_notify_desc = {
 290         .bLength =              USB_DT_ENDPOINT_SIZE,
 291         .bDescriptorType =      USB_DT_ENDPOINT,
 292 
 293         .bEndpointAddress =     USB_DIR_IN,
 294         .bmAttributes =         USB_ENDPOINT_XFER_INT,
 295         .wMaxPacketSize =       cpu_to_le16(NCM_STATUS_BYTECOUNT),
 296         .bInterval =            USB_MS_TO_HS_INTERVAL(NCM_STATUS_INTERVAL_MS),
 297 };
 298 static struct usb_endpoint_descriptor hs_ncm_in_desc = {
 299         .bLength =              USB_DT_ENDPOINT_SIZE,
 300         .bDescriptorType =      USB_DT_ENDPOINT,
 301 
 302         .bEndpointAddress =     USB_DIR_IN,
 303         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 304         .wMaxPacketSize =       cpu_to_le16(512),
 305 };
 306 
 307 static struct usb_endpoint_descriptor hs_ncm_out_desc = {
 308         .bLength =              USB_DT_ENDPOINT_SIZE,
 309         .bDescriptorType =      USB_DT_ENDPOINT,
 310 
 311         .bEndpointAddress =     USB_DIR_OUT,
 312         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 313         .wMaxPacketSize =       cpu_to_le16(512),
 314 };
 315 
 316 static struct usb_descriptor_header *ncm_hs_function[] = {
 317         (struct usb_descriptor_header *) &ncm_iad_desc,
 318         /* CDC NCM control descriptors */
 319         (struct usb_descriptor_header *) &ncm_control_intf,
 320         (struct usb_descriptor_header *) &ncm_header_desc,
 321         (struct usb_descriptor_header *) &ncm_union_desc,
 322         (struct usb_descriptor_header *) &ecm_desc,
 323         (struct usb_descriptor_header *) &ncm_desc,
 324         (struct usb_descriptor_header *) &hs_ncm_notify_desc,
 325         /* data interface, altsettings 0 and 1 */
 326         (struct usb_descriptor_header *) &ncm_data_nop_intf,
 327         (struct usb_descriptor_header *) &ncm_data_intf,
 328         (struct usb_descriptor_header *) &hs_ncm_in_desc,
 329         (struct usb_descriptor_header *) &hs_ncm_out_desc,
 330         NULL,
 331 };
 332 
 333 
 334 /* super speed support: */
 335 
 336 static struct usb_endpoint_descriptor ss_ncm_notify_desc = {
 337         .bLength =              USB_DT_ENDPOINT_SIZE,
 338         .bDescriptorType =      USB_DT_ENDPOINT,
 339 
 340         .bEndpointAddress =     USB_DIR_IN,
 341         .bmAttributes =         USB_ENDPOINT_XFER_INT,
 342         .wMaxPacketSize =       cpu_to_le16(NCM_STATUS_BYTECOUNT),
 343         .bInterval =            USB_MS_TO_HS_INTERVAL(NCM_STATUS_INTERVAL_MS)
 344 };
 345 
 346 static struct usb_ss_ep_comp_descriptor ss_ncm_notify_comp_desc = {
 347         .bLength =              sizeof(ss_ncm_notify_comp_desc),
 348         .bDescriptorType =      USB_DT_SS_ENDPOINT_COMP,
 349 
 350         /* the following 3 values can be tweaked if necessary */
 351         /* .bMaxBurst =         0, */
 352         /* .bmAttributes =      0, */
 353         .wBytesPerInterval =    cpu_to_le16(NCM_STATUS_BYTECOUNT),
 354 };
 355 
 356 static struct usb_endpoint_descriptor ss_ncm_in_desc = {
 357         .bLength =              USB_DT_ENDPOINT_SIZE,
 358         .bDescriptorType =      USB_DT_ENDPOINT,
 359 
 360         .bEndpointAddress =     USB_DIR_IN,
 361         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 362         .wMaxPacketSize =       cpu_to_le16(1024),
 363 };
 364 
 365 static struct usb_endpoint_descriptor ss_ncm_out_desc = {
 366         .bLength =              USB_DT_ENDPOINT_SIZE,
 367         .bDescriptorType =      USB_DT_ENDPOINT,
 368 
 369         .bEndpointAddress =     USB_DIR_OUT,
 370         .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 371         .wMaxPacketSize =       cpu_to_le16(1024),
 372 };
 373 
 374 static struct usb_ss_ep_comp_descriptor ss_ncm_bulk_comp_desc = {
 375         .bLength =              sizeof(ss_ncm_bulk_comp_desc),
 376         .bDescriptorType =      USB_DT_SS_ENDPOINT_COMP,
 377 
 378         /* the following 2 values can be tweaked if necessary */
 379         /* .bMaxBurst =         0, */
 380         /* .bmAttributes =      0, */
 381 };
 382 
 383 static struct usb_descriptor_header *ncm_ss_function[] = {
 384         (struct usb_descriptor_header *) &ncm_iad_desc,
 385         /* CDC NCM control descriptors */
 386         (struct usb_descriptor_header *) &ncm_control_intf,
 387         (struct usb_descriptor_header *) &ncm_header_desc,
 388         (struct usb_descriptor_header *) &ncm_union_desc,
 389         (struct usb_descriptor_header *) &ecm_desc,
 390         (struct usb_descriptor_header *) &ncm_desc,
 391         (struct usb_descriptor_header *) &ss_ncm_notify_desc,
 392         (struct usb_descriptor_header *) &ss_ncm_notify_comp_desc,
 393         /* data interface, altsettings 0 and 1 */
 394         (struct usb_descriptor_header *) &ncm_data_nop_intf,
 395         (struct usb_descriptor_header *) &ncm_data_intf,
 396         (struct usb_descriptor_header *) &ss_ncm_in_desc,
 397         (struct usb_descriptor_header *) &ss_ncm_bulk_comp_desc,
 398         (struct usb_descriptor_header *) &ss_ncm_out_desc,
 399         (struct usb_descriptor_header *) &ss_ncm_bulk_comp_desc,
 400         NULL,
 401 };
 402 
 403 /* string descriptors: */
 404 
 405 #define STRING_CTRL_IDX 0
 406 #define STRING_MAC_IDX  1
 407 #define STRING_DATA_IDX 2
 408 #define STRING_IAD_IDX  3
 409 
 410 static struct usb_string ncm_string_defs[] = {
 411         [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)",
 412         [STRING_MAC_IDX].s = "",
 413         [STRING_DATA_IDX].s = "CDC Network Data",
 414         [STRING_IAD_IDX].s = "CDC NCM",
 415         {  } /* end of list */
 416 };
 417 
 418 static struct usb_gadget_strings ncm_string_table = {
 419         .language =             0x0409, /* en-us */
 420         .strings =              ncm_string_defs,
 421 };
 422 
 423 static struct usb_gadget_strings *ncm_strings[] = {
 424         &ncm_string_table,
 425         NULL,
 426 };
 427 
 428 /*
 429  * Here are options for NCM Datagram Pointer table (NDP) parser.
 430  * There are 2 different formats: NDP16 and NDP32 in the spec (ch. 3),
 431  * in NDP16 offsets and sizes fields are 1 16bit word wide,
 432  * in NDP32 -- 2 16bit words wide. Also signatures are different.
 433  * To make the parser code the same, put the differences in the structure,
 434  * and switch pointers to the structures when the format is changed.
 435  */
 436 
 437 struct ndp_parser_opts {
 438         u32             nth_sign;
 439         u32             ndp_sign;
 440         unsigned        nth_size;
 441         unsigned        ndp_size;
 442         unsigned        dpe_size;
 443         unsigned        ndplen_align;
 444         /* sizes in u16 units */
 445         unsigned        dgram_item_len; /* index or length */
 446         unsigned        block_length;
 447         unsigned        ndp_index;
 448         unsigned        reserved1;
 449         unsigned        reserved2;
 450         unsigned        next_ndp_index;
 451 };
 452 
 453 #define INIT_NDP16_OPTS {                                       \
 454                 .nth_sign = USB_CDC_NCM_NTH16_SIGN,             \
 455                 .ndp_sign = USB_CDC_NCM_NDP16_NOCRC_SIGN,       \
 456                 .nth_size = sizeof(struct usb_cdc_ncm_nth16),   \
 457                 .ndp_size = sizeof(struct usb_cdc_ncm_ndp16),   \
 458                 .dpe_size = sizeof(struct usb_cdc_ncm_dpe16),   \
 459                 .ndplen_align = 4,                              \
 460                 .dgram_item_len = 1,                            \
 461                 .block_length = 1,                              \
 462                 .ndp_index = 1,                                 \
 463                 .reserved1 = 0,                                 \
 464                 .reserved2 = 0,                                 \
 465                 .next_ndp_index = 1,                            \
 466         }
 467 
 468 
 469 #define INIT_NDP32_OPTS {                                       \
 470                 .nth_sign = USB_CDC_NCM_NTH32_SIGN,             \
 471                 .ndp_sign = USB_CDC_NCM_NDP32_NOCRC_SIGN,       \
 472                 .nth_size = sizeof(struct usb_cdc_ncm_nth32),   \
 473                 .ndp_size = sizeof(struct usb_cdc_ncm_ndp32),   \
 474                 .dpe_size = sizeof(struct usb_cdc_ncm_dpe32),   \
 475                 .ndplen_align = 8,                              \
 476                 .dgram_item_len = 2,                            \
 477                 .block_length = 2,                              \
 478                 .ndp_index = 2,                                 \
 479                 .reserved1 = 1,                                 \
 480                 .reserved2 = 2,                                 \
 481                 .next_ndp_index = 2,                            \
 482         }
 483 
 484 static const struct ndp_parser_opts ndp16_opts = INIT_NDP16_OPTS;
 485 static const struct ndp_parser_opts ndp32_opts = INIT_NDP32_OPTS;
 486 
 487 static inline void put_ncm(__le16 **p, unsigned size, unsigned val)
 488 {
 489         switch (size) {
 490         case 1:
 491                 put_unaligned_le16((u16)val, *p);
 492                 break;
 493         case 2:
 494                 put_unaligned_le32((u32)val, *p);
 495 
 496                 break;
 497         default:
 498                 BUG();
 499         }
 500 
 501         *p += size;
 502 }
 503 
 504 static inline unsigned get_ncm(__le16 **p, unsigned size)
 505 {
 506         unsigned tmp;
 507 
 508         switch (size) {
 509         case 1:
 510                 tmp = get_unaligned_le16(*p);
 511                 break;
 512         case 2:
 513                 tmp = get_unaligned_le32(*p);
 514                 break;
 515         default:
 516                 BUG();
 517         }
 518 
 519         *p += size;
 520         return tmp;
 521 }
 522 
 523 /*-------------------------------------------------------------------------*/
 524 
 525 static inline void ncm_reset_values(struct f_ncm *ncm)
 526 {
 527         ncm->parser_opts = &ndp16_opts;
 528         ncm->is_crc = false;
 529         ncm->ndp_sign = ncm->parser_opts->ndp_sign;
 530         ncm->port.cdc_filter = DEFAULT_FILTER;
 531 
 532         /* doesn't make sense for ncm, fixed size used */
 533         ncm->port.header_len = 0;
 534 
 535         ncm->port.fixed_out_len = le32_to_cpu(ntb_parameters.dwNtbOutMaxSize);
 536         ncm->port.fixed_in_len = NTB_DEFAULT_IN_SIZE;
 537 }
 538 
 539 /*
 540  * Context: ncm->lock held
 541  */
 542 static void ncm_do_notify(struct f_ncm *ncm)
 543 {
 544         struct usb_request              *req = ncm->notify_req;
 545         struct usb_cdc_notification     *event;
 546         struct usb_composite_dev        *cdev = ncm->port.func.config->cdev;
 547         __le32                          *data;
 548         int                             status;
 549 
 550         /* notification already in flight? */
 551         if (atomic_read(&ncm->notify_count))
 552                 return;
 553 
 554         event = req->buf;
 555         switch (ncm->notify_state) {
 556         case NCM_NOTIFY_NONE:
 557                 return;
 558 
 559         case NCM_NOTIFY_CONNECT:
 560                 event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
 561                 if (ncm->is_open)
 562                         event->wValue = cpu_to_le16(1);
 563                 else
 564                         event->wValue = cpu_to_le16(0);
 565                 event->wLength = 0;
 566                 req->length = sizeof *event;
 567 
 568                 DBG(cdev, "notify connect %s\n",
 569                                 ncm->is_open ? "true" : "false");
 570                 ncm->notify_state = NCM_NOTIFY_NONE;
 571                 break;
 572 
 573         case NCM_NOTIFY_SPEED:
 574                 event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE;
 575                 event->wValue = cpu_to_le16(0);
 576                 event->wLength = cpu_to_le16(8);
 577                 req->length = NCM_STATUS_BYTECOUNT;
 578 
 579                 /* SPEED_CHANGE data is up/down speeds in bits/sec */
 580                 data = req->buf + sizeof *event;
 581                 data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));
 582                 data[1] = data[0];
 583 
 584                 DBG(cdev, "notify speed %d\n", ncm_bitrate(cdev->gadget));
 585                 ncm->notify_state = NCM_NOTIFY_CONNECT;
 586                 break;
 587         }
 588         event->bmRequestType = 0xA1;
 589         event->wIndex = cpu_to_le16(ncm->ctrl_id);
 590 
 591         atomic_inc(&ncm->notify_count);
 592 
 593         /*
 594          * In double buffering if there is a space in FIFO,
 595          * completion callback can be called right after the call,
 596          * so unlocking
 597          */
 598         spin_unlock(&ncm->lock);
 599         status = usb_ep_queue(ncm->notify, req, GFP_ATOMIC);
 600         spin_lock(&ncm->lock);
 601         if (status < 0) {
 602                 atomic_dec(&ncm->notify_count);
 603                 DBG(cdev, "notify --> %d\n", status);
 604         }
 605 }
 606 
 607 /*
 608  * Context: ncm->lock held
 609  */
 610 static void ncm_notify(struct f_ncm *ncm)
 611 {
 612         /*
 613          * NOTE on most versions of Linux, host side cdc-ethernet
 614          * won't listen for notifications until its netdevice opens.
 615          * The first notification then sits in the FIFO for a long
 616          * time, and the second one is queued.
 617          *
 618          * If ncm_notify() is called before the second (CONNECT)
 619          * notification is sent, then it will reset to send the SPEED
 620          * notificaion again (and again, and again), but it's not a problem
 621          */
 622         ncm->notify_state = NCM_NOTIFY_SPEED;
 623         ncm_do_notify(ncm);
 624 }
 625 
 626 static void ncm_notify_complete(struct usb_ep *ep, struct usb_request *req)
 627 {
 628         struct f_ncm                    *ncm = req->context;
 629         struct usb_composite_dev        *cdev = ncm->port.func.config->cdev;
 630         struct usb_cdc_notification     *event = req->buf;
 631 
 632         spin_lock(&ncm->lock);
 633         switch (req->status) {
 634         case 0:
 635                 VDBG(cdev, "Notification %02x sent\n",
 636                      event->bNotificationType);
 637                 atomic_dec(&ncm->notify_count);
 638                 break;
 639         case -ECONNRESET:
 640         case -ESHUTDOWN:
 641                 atomic_set(&ncm->notify_count, 0);
 642                 ncm->notify_state = NCM_NOTIFY_NONE;
 643                 break;
 644         default:
 645                 DBG(cdev, "event %02x --> %d\n",
 646                         event->bNotificationType, req->status);
 647                 atomic_dec(&ncm->notify_count);
 648                 break;
 649         }
 650         ncm_do_notify(ncm);
 651         spin_unlock(&ncm->lock);
 652 }
 653 
 654 static void ncm_ep0out_complete(struct usb_ep *ep, struct usb_request *req)
 655 {
 656         /* now for SET_NTB_INPUT_SIZE only */
 657         unsigned                in_size;
 658         struct usb_function     *f = req->context;
 659         struct f_ncm            *ncm = func_to_ncm(f);
 660         struct usb_composite_dev *cdev = f->config->cdev;
 661 
 662         req->context = NULL;
 663         if (req->status || req->actual != req->length) {
 664                 DBG(cdev, "Bad control-OUT transfer\n");
 665                 goto invalid;
 666         }
 667 
 668         in_size = get_unaligned_le32(req->buf);
 669         if (in_size < USB_CDC_NCM_NTB_MIN_IN_SIZE ||
 670             in_size > le32_to_cpu(ntb_parameters.dwNtbInMaxSize)) {
 671                 DBG(cdev, "Got wrong INPUT SIZE (%d) from host\n", in_size);
 672                 goto invalid;
 673         }
 674 
 675         ncm->port.fixed_in_len = in_size;
 676         VDBG(cdev, "Set NTB INPUT SIZE %d\n", in_size);
 677         return;
 678 
 679 invalid:
 680         usb_ep_set_halt(ep);
 681         return;
 682 }
 683 
 684 static int ncm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
 685 {
 686         struct f_ncm            *ncm = func_to_ncm(f);
 687         struct usb_composite_dev *cdev = f->config->cdev;
 688         struct usb_request      *req = cdev->req;
 689         int                     value = -EOPNOTSUPP;
 690         u16                     w_index = le16_to_cpu(ctrl->wIndex);
 691         u16                     w_value = le16_to_cpu(ctrl->wValue);
 692         u16                     w_length = le16_to_cpu(ctrl->wLength);
 693 
 694         /*
 695          * composite driver infrastructure handles everything except
 696          * CDC class messages; interface activation uses set_alt().
 697          */
 698         switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
 699         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 700                         | USB_CDC_SET_ETHERNET_PACKET_FILTER:
 701                 /*
 702                  * see 6.2.30: no data, wIndex = interface,
 703                  * wValue = packet filter bitmap
 704                  */
 705                 if (w_length != 0 || w_index != ncm->ctrl_id)
 706                         goto invalid;
 707                 DBG(cdev, "packet filter %02x\n", w_value);
 708                 /*
 709                  * REVISIT locking of cdc_filter.  This assumes the UDC
 710                  * driver won't have a concurrent packet TX irq running on
 711                  * another CPU; or that if it does, this write is atomic...
 712                  */
 713                 ncm->port.cdc_filter = w_value;
 714                 value = 0;
 715                 break;
 716         /*
 717          * and optionally:
 718          * case USB_CDC_SEND_ENCAPSULATED_COMMAND:
 719          * case USB_CDC_GET_ENCAPSULATED_RESPONSE:
 720          * case USB_CDC_SET_ETHERNET_MULTICAST_FILTERS:
 721          * case USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER:
 722          * case USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER:
 723          * case USB_CDC_GET_ETHERNET_STATISTIC:
 724          */
 725 
 726         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 727                 | USB_CDC_GET_NTB_PARAMETERS:
 728 
 729                 if (w_length == 0 || w_value != 0 || w_index != ncm->ctrl_id)
 730                         goto invalid;
 731                 value = w_length > sizeof ntb_parameters ?
 732                         sizeof ntb_parameters : w_length;
 733                 memcpy(req->buf, &ntb_parameters, value);
 734                 VDBG(cdev, "Host asked NTB parameters\n");
 735                 break;
 736 
 737         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 738                 | USB_CDC_GET_NTB_INPUT_SIZE:
 739 
 740                 if (w_length < 4 || w_value != 0 || w_index != ncm->ctrl_id)
 741                         goto invalid;
 742                 put_unaligned_le32(ncm->port.fixed_in_len, req->buf);
 743                 value = 4;
 744                 VDBG(cdev, "Host asked INPUT SIZE, sending %d\n",
 745                      ncm->port.fixed_in_len);
 746                 break;
 747 
 748         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 749                 | USB_CDC_SET_NTB_INPUT_SIZE:
 750         {
 751                 if (w_length != 4 || w_value != 0 || w_index != ncm->ctrl_id)
 752                         goto invalid;
 753                 req->complete = ncm_ep0out_complete;
 754                 req->length = w_length;
 755                 req->context = f;
 756 
 757                 value = req->length;
 758                 break;
 759         }
 760 
 761         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 762                 | USB_CDC_GET_NTB_FORMAT:
 763         {
 764                 uint16_t format;
 765 
 766                 if (w_length < 2 || w_value != 0 || w_index != ncm->ctrl_id)
 767                         goto invalid;
 768                 format = (ncm->parser_opts == &ndp16_opts) ? 0x0000 : 0x0001;
 769                 put_unaligned_le16(format, req->buf);
 770                 value = 2;
 771                 VDBG(cdev, "Host asked NTB FORMAT, sending %d\n", format);
 772                 break;
 773         }
 774 
 775         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 776                 | USB_CDC_SET_NTB_FORMAT:
 777         {
 778                 if (w_length != 0 || w_index != ncm->ctrl_id)
 779                         goto invalid;
 780                 switch (w_value) {
 781                 case 0x0000:
 782                         ncm->parser_opts = &ndp16_opts;
 783                         DBG(cdev, "NCM16 selected\n");
 784                         break;
 785                 case 0x0001:
 786                         ncm->parser_opts = &ndp32_opts;
 787                         DBG(cdev, "NCM32 selected\n");
 788                         break;
 789                 default:
 790                         goto invalid;
 791                 }
 792                 value = 0;
 793                 break;
 794         }
 795         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 796                 | USB_CDC_GET_CRC_MODE:
 797         {
 798                 uint16_t is_crc;
 799 
 800                 if (w_length < 2 || w_value != 0 || w_index != ncm->ctrl_id)
 801                         goto invalid;
 802                 is_crc = ncm->is_crc ? 0x0001 : 0x0000;
 803                 put_unaligned_le16(is_crc, req->buf);
 804                 value = 2;
 805                 VDBG(cdev, "Host asked CRC MODE, sending %d\n", is_crc);
 806                 break;
 807         }
 808 
 809         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
 810                 | USB_CDC_SET_CRC_MODE:
 811         {
 812                 if (w_length != 0 || w_index != ncm->ctrl_id)
 813                         goto invalid;
 814                 switch (w_value) {
 815                 case 0x0000:
 816                         ncm->is_crc = false;
 817                         DBG(cdev, "non-CRC mode selected\n");
 818                         break;
 819                 case 0x0001:
 820                         ncm->is_crc = true;
 821                         DBG(cdev, "CRC mode selected\n");
 822                         break;
 823                 default:
 824                         goto invalid;
 825                 }
 826                 value = 0;
 827                 break;
 828         }
 829 
 830         /* and disabled in ncm descriptor: */
 831         /* case USB_CDC_GET_NET_ADDRESS: */
 832         /* case USB_CDC_SET_NET_ADDRESS: */
 833         /* case USB_CDC_GET_MAX_DATAGRAM_SIZE: */
 834         /* case USB_CDC_SET_MAX_DATAGRAM_SIZE: */
 835 
 836         default:
 837 invalid:
 838                 DBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
 839                         ctrl->bRequestType, ctrl->bRequest,
 840                         w_value, w_index, w_length);
 841         }
 842         ncm->ndp_sign = ncm->parser_opts->ndp_sign |
 843                 (ncm->is_crc ? NCM_NDP_HDR_CRC : 0);
 844 
 845         /* respond with data transfer or status phase? */
 846         if (value >= 0) {
 847                 DBG(cdev, "ncm req%02x.%02x v%04x i%04x l%d\n",
 848                         ctrl->bRequestType, ctrl->bRequest,
 849                         w_value, w_index, w_length);
 850                 req->zero = 0;
 851                 req->length = value;
 852                 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
 853                 if (value < 0)
 854                         ERROR(cdev, "ncm req %02x.%02x response err %d\n",
 855                                         ctrl->bRequestType, ctrl->bRequest,
 856                                         value);
 857         }
 858 
 859         /* device either stalls (value < 0) or reports success */
 860         return value;
 861 }
 862 
 863 
 864 static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
 865 {
 866         struct f_ncm            *ncm = func_to_ncm(f);
 867         struct usb_composite_dev *cdev = f->config->cdev;
 868 
 869         /* Control interface has only altsetting 0 */
 870         if (intf == ncm->ctrl_id) {
 871                 if (alt != 0)
 872                         goto fail;
 873 
 874                 DBG(cdev, "reset ncm control %d\n", intf);
 875                 usb_ep_disable(ncm->notify);
 876 
 877                 if (!(ncm->notify->desc)) {
 878                         DBG(cdev, "init ncm ctrl %d\n", intf);
 879                         if (config_ep_by_speed(cdev->gadget, f, ncm->notify))
 880                                 goto fail;
 881                 }
 882                 usb_ep_enable(ncm->notify);
 883 
 884         /* Data interface has two altsettings, 0 and 1 */
 885         } else if (intf == ncm->data_id) {
 886                 if (alt > 1)
 887                         goto fail;
 888 
 889                 if (ncm->port.in_ep->enabled) {
 890                         DBG(cdev, "reset ncm\n");
 891                         ncm->timer_stopping = true;
 892                         ncm->netdev = NULL;
 893                         gether_disconnect(&ncm->port);
 894                         ncm_reset_values(ncm);
 895                 }
 896 
 897                 /*
 898                  * CDC Network only sends data in non-default altsettings.
 899                  * Changing altsettings resets filters, statistics, etc.
 900                  */
 901                 if (alt == 1) {
 902                         struct net_device       *net;
 903 
 904                         if (!ncm->port.in_ep->desc ||
 905                             !ncm->port.out_ep->desc) {
 906                                 DBG(cdev, "init ncm\n");
 907                                 if (config_ep_by_speed(cdev->gadget, f,
 908                                                        ncm->port.in_ep) ||
 909                                     config_ep_by_speed(cdev->gadget, f,
 910                                                        ncm->port.out_ep)) {
 911                                         ncm->port.in_ep->desc = NULL;
 912                                         ncm->port.out_ep->desc = NULL;
 913                                         goto fail;
 914                                 }
 915                         }
 916 
 917                         /* TODO */
 918                         /* Enable zlps by default for NCM conformance;
 919                          * override for musb_hdrc (avoids txdma ovhead)
 920                          */
 921                         ncm->port.is_zlp_ok =
 922                                 gadget_is_zlp_supported(cdev->gadget);
 923                         ncm->port.cdc_filter = DEFAULT_FILTER;
 924                         DBG(cdev, "activate ncm\n");
 925                         net = gether_connect(&ncm->port);
 926                         if (IS_ERR(net))
 927                                 return PTR_ERR(net);
 928                         ncm->netdev = net;
 929                         ncm->timer_stopping = false;
 930                 }
 931 
 932                 spin_lock(&ncm->lock);
 933                 ncm_notify(ncm);
 934                 spin_unlock(&ncm->lock);
 935         } else
 936                 goto fail;
 937 
 938         return 0;
 939 fail:
 940         return -EINVAL;
 941 }
 942 
 943 /*
 944  * Because the data interface supports multiple altsettings,
 945  * this NCM function *MUST* implement a get_alt() method.
 946  */
 947 static int ncm_get_alt(struct usb_function *f, unsigned intf)
 948 {
 949         struct f_ncm            *ncm = func_to_ncm(f);
 950 
 951         if (intf == ncm->ctrl_id)
 952                 return 0;
 953         return ncm->port.in_ep->enabled ? 1 : 0;
 954 }
 955 
 956 static struct sk_buff *package_for_tx(struct f_ncm *ncm)
 957 {
 958         __le16          *ntb_iter;
 959         struct sk_buff  *skb2 = NULL;
 960         unsigned        ndp_pad;
 961         unsigned        ndp_index;
 962         unsigned        new_len;
 963 
 964         const struct ndp_parser_opts *opts = ncm->parser_opts;
 965         const int ndp_align = le16_to_cpu(ntb_parameters.wNdpInAlignment);
 966         const int dgram_idx_len = 2 * 2 * opts->dgram_item_len;
 967 
 968         /* Stop the timer */
 969         hrtimer_try_to_cancel(&ncm->task_timer);
 970 
 971         ndp_pad = ALIGN(ncm->skb_tx_data->len, ndp_align) -
 972                         ncm->skb_tx_data->len;
 973         ndp_index = ncm->skb_tx_data->len + ndp_pad;
 974         new_len = ndp_index + dgram_idx_len + ncm->skb_tx_ndp->len;
 975 
 976         /* Set the final BlockLength and wNdpIndex */
 977         ntb_iter = (void *) ncm->skb_tx_data->data;
 978         /* Increment pointer to BlockLength */
 979         ntb_iter += 2 + 1 + 1;
 980         put_ncm(&ntb_iter, opts->block_length, new_len);
 981         put_ncm(&ntb_iter, opts->ndp_index, ndp_index);
 982 
 983         /* Set the final NDP wLength */
 984         new_len = opts->ndp_size +
 985                         (ncm->ndp_dgram_count * dgram_idx_len);
 986         ncm->ndp_dgram_count = 0;
 987         /* Increment from start to wLength */
 988         ntb_iter = (void *) ncm->skb_tx_ndp->data;
 989         ntb_iter += 2;
 990         put_unaligned_le16(new_len, ntb_iter);
 991 
 992         /* Merge the skbs */
 993         swap(skb2, ncm->skb_tx_data);
 994         if (ncm->skb_tx_data) {
 995                 dev_consume_skb_any(ncm->skb_tx_data);
 996                 ncm->skb_tx_data = NULL;
 997         }
 998 
 999         /* Insert NDP alignment. */
1000         skb_put_zero(skb2, ndp_pad);
1001 
1002         /* Copy NTB across. */
1003         skb_put_data(skb2, ncm->skb_tx_ndp->data, ncm->skb_tx_ndp->len);
1004         dev_consume_skb_any(ncm->skb_tx_ndp);
1005         ncm->skb_tx_ndp = NULL;
1006 
1007         /* Insert zero'd datagram. */
1008         skb_put_zero(skb2, dgram_idx_len);
1009 
1010         return skb2;
1011 }
1012 
1013 static struct sk_buff *ncm_wrap_ntb(struct gether *port,
1014                                     struct sk_buff *skb)
1015 {
1016         struct f_ncm    *ncm = func_to_ncm(&port->func);
1017         struct sk_buff  *skb2 = NULL;
1018         int             ncb_len = 0;
1019         __le16          *ntb_data;
1020         __le16          *ntb_ndp;
1021         int             dgram_pad;
1022 
1023         unsigned        max_size = ncm->port.fixed_in_len;
1024         const struct ndp_parser_opts *opts = ncm->parser_opts;
1025         const int ndp_align = le16_to_cpu(ntb_parameters.wNdpInAlignment);
1026         const int div = le16_to_cpu(ntb_parameters.wNdpInDivisor);
1027         const int rem = le16_to_cpu(ntb_parameters.wNdpInPayloadRemainder);
1028         const int dgram_idx_len = 2 * 2 * opts->dgram_item_len;
1029 
1030         if (!skb && !ncm->skb_tx_data)
1031                 return NULL;
1032 
1033         if (skb) {
1034                 /* Add the CRC if required up front */
1035                 if (ncm->is_crc) {
1036                         uint32_t        crc;
1037                         __le16          *crc_pos;
1038 
1039                         crc = ~crc32_le(~0,
1040                                         skb->data,
1041                                         skb->len);
1042                         crc_pos = skb_put(skb, sizeof(uint32_t));
1043                         put_unaligned_le32(crc, crc_pos);
1044                 }
1045 
1046                 /* If the new skb is too big for the current NCM NTB then
1047                  * set the current stored skb to be sent now and clear it
1048                  * ready for new data.
1049                  * NOTE: Assume maximum align for speed of calculation.
1050                  */
1051                 if (ncm->skb_tx_data
1052                     && (ncm->ndp_dgram_count >= TX_MAX_NUM_DPE
1053                     || (ncm->skb_tx_data->len +
1054                     div + rem + skb->len +
1055                     ncm->skb_tx_ndp->len + ndp_align + (2 * dgram_idx_len))
1056                     > max_size)) {
1057                         skb2 = package_for_tx(ncm);
1058                         if (!skb2)
1059                                 goto err;
1060                 }
1061 
1062                 if (!ncm->skb_tx_data) {
1063                         ncb_len = opts->nth_size;
1064                         dgram_pad = ALIGN(ncb_len, div) + rem - ncb_len;
1065                         ncb_len += dgram_pad;
1066 
1067                         /* Create a new skb for the NTH and datagrams. */
1068                         ncm->skb_tx_data = alloc_skb(max_size, GFP_ATOMIC);
1069                         if (!ncm->skb_tx_data)
1070                                 goto err;
1071 
1072                         ncm->skb_tx_data->dev = ncm->netdev;
1073                         ntb_data = skb_put_zero(ncm->skb_tx_data, ncb_len);
1074                         /* dwSignature */
1075                         put_unaligned_le32(opts->nth_sign, ntb_data);
1076                         ntb_data += 2;
1077                         /* wHeaderLength */
1078                         put_unaligned_le16(opts->nth_size, ntb_data++);
1079 
1080                         /* Allocate an skb for storing the NDP,
1081                          * TX_MAX_NUM_DPE should easily suffice for a
1082                          * 16k packet.
1083                          */
1084                         ncm->skb_tx_ndp = alloc_skb((int)(opts->ndp_size
1085                                                     + opts->dpe_size
1086                                                     * TX_MAX_NUM_DPE),
1087                                                     GFP_ATOMIC);
1088                         if (!ncm->skb_tx_ndp)
1089                                 goto err;
1090 
1091                         ncm->skb_tx_ndp->dev = ncm->netdev;
1092                         ntb_ndp = skb_put(ncm->skb_tx_ndp, opts->ndp_size);
1093                         memset(ntb_ndp, 0, ncb_len);
1094                         /* dwSignature */
1095                         put_unaligned_le32(ncm->ndp_sign, ntb_ndp);
1096                         ntb_ndp += 2;
1097 
1098                         /* There is always a zeroed entry */
1099                         ncm->ndp_dgram_count = 1;
1100 
1101                         /* Note: we skip opts->next_ndp_index */
1102                 }
1103 
1104                 /* Delay the timer. */
1105                 hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
1106                               HRTIMER_MODE_REL_SOFT);
1107 
1108                 /* Add the datagram position entries */
1109                 ntb_ndp = skb_put_zero(ncm->skb_tx_ndp, dgram_idx_len);
1110 
1111                 ncb_len = ncm->skb_tx_data->len;
1112                 dgram_pad = ALIGN(ncb_len, div) + rem - ncb_len;
1113                 ncb_len += dgram_pad;
1114 
1115                 /* (d)wDatagramIndex */
1116                 put_ncm(&ntb_ndp, opts->dgram_item_len, ncb_len);
1117                 /* (d)wDatagramLength */
1118                 put_ncm(&ntb_ndp, opts->dgram_item_len, skb->len);
1119                 ncm->ndp_dgram_count++;
1120 
1121                 /* Add the new data to the skb */
1122                 skb_put_zero(ncm->skb_tx_data, dgram_pad);
1123                 skb_put_data(ncm->skb_tx_data, skb->data, skb->len);
1124                 dev_consume_skb_any(skb);
1125                 skb = NULL;
1126 
1127         } else if (ncm->skb_tx_data && ncm->timer_force_tx) {
1128                 /* If the tx was requested because of a timeout then send */
1129                 skb2 = package_for_tx(ncm);
1130                 if (!skb2)
1131                         goto err;
1132         }
1133 
1134         return skb2;
1135 
1136 err:
1137         ncm->netdev->stats.tx_dropped++;
1138 
1139         if (skb)
1140                 dev_kfree_skb_any(skb);
1141         if (ncm->skb_tx_data)
1142                 dev_kfree_skb_any(ncm->skb_tx_data);
1143         if (ncm->skb_tx_ndp)
1144                 dev_kfree_skb_any(ncm->skb_tx_ndp);
1145 
1146         return NULL;
1147 }
1148 
1149 /*
1150  * The transmit should only be run if no skb data has been sent
1151  * for a certain duration.
1152  */
1153 static enum hrtimer_restart ncm_tx_timeout(struct hrtimer *data)
1154 {
1155         struct f_ncm *ncm = container_of(data, struct f_ncm, task_timer);
1156 
1157         /* Only send if data is available. */
1158         if (!ncm->timer_stopping && ncm->skb_tx_data) {
1159                 ncm->timer_force_tx = true;
1160 
1161                 /* XXX This allowance of a NULL skb argument to ndo_start_xmit
1162                  * XXX is not sane.  The gadget layer should be redesigned so
1163                  * XXX that the dev->wrap() invocations to build SKBs is transparent
1164                  * XXX and performed in some way outside of the ndo_start_xmit
1165                  * XXX interface.
1166                  */
1167                 ncm->netdev->netdev_ops->ndo_start_xmit(NULL, ncm->netdev);
1168 
1169                 ncm->timer_force_tx = false;
1170         }
1171         return HRTIMER_NORESTART;
1172 }
1173 
1174 static int ncm_unwrap_ntb(struct gether *port,
1175                           struct sk_buff *skb,
1176                           struct sk_buff_head *list)
1177 {
1178         struct f_ncm    *ncm = func_to_ncm(&port->func);
1179         __le16          *tmp = (void *) skb->data;
1180         unsigned        index, index2;
1181         int             ndp_index;
1182         unsigned        dg_len, dg_len2;
1183         unsigned        ndp_len;
1184         struct sk_buff  *skb2;
1185         int             ret = -EINVAL;
1186         unsigned        max_size = le32_to_cpu(ntb_parameters.dwNtbOutMaxSize);
1187         const struct ndp_parser_opts *opts = ncm->parser_opts;
1188         unsigned        crc_len = ncm->is_crc ? sizeof(uint32_t) : 0;
1189         int             dgram_counter;
1190 
1191         /* dwSignature */
1192         if (get_unaligned_le32(tmp) != opts->nth_sign) {
1193                 INFO(port->func.config->cdev, "Wrong NTH SIGN, skblen %d\n",
1194                         skb->len);
1195                 print_hex_dump(KERN_INFO, "HEAD:", DUMP_PREFIX_ADDRESS, 32, 1,
1196                                skb->data, 32, false);
1197 
1198                 goto err;
1199         }
1200         tmp += 2;
1201         /* wHeaderLength */
1202         if (get_unaligned_le16(tmp++) != opts->nth_size) {
1203                 INFO(port->func.config->cdev, "Wrong NTB headersize\n");
1204                 goto err;
1205         }
1206         tmp++; /* skip wSequence */
1207 
1208         /* (d)wBlockLength */
1209         if (get_ncm(&tmp, opts->block_length) > max_size) {
1210                 INFO(port->func.config->cdev, "OUT size exceeded\n");
1211                 goto err;
1212         }
1213 
1214         ndp_index = get_ncm(&tmp, opts->ndp_index);
1215 
1216         /* Run through all the NDP's in the NTB */
1217         do {
1218                 /* NCM 3.2 */
1219                 if (((ndp_index % 4) != 0) &&
1220                                 (ndp_index < opts->nth_size)) {
1221                         INFO(port->func.config->cdev, "Bad index: %#X\n",
1222                              ndp_index);
1223                         goto err;
1224                 }
1225 
1226                 /* walk through NDP */
1227                 tmp = (void *)(skb->data + ndp_index);
1228                 if (get_unaligned_le32(tmp) != ncm->ndp_sign) {
1229                         INFO(port->func.config->cdev, "Wrong NDP SIGN\n");
1230                         goto err;
1231                 }
1232                 tmp += 2;
1233 
1234                 ndp_len = get_unaligned_le16(tmp++);
1235                 /*
1236                  * NCM 3.3.1
1237                  * entry is 2 items
1238                  * item size is 16/32 bits, opts->dgram_item_len * 2 bytes
1239                  * minimal: struct usb_cdc_ncm_ndpX + normal entry + zero entry
1240                  * Each entry is a dgram index and a dgram length.
1241                  */
1242                 if ((ndp_len < opts->ndp_size
1243                                 + 2 * 2 * (opts->dgram_item_len * 2))
1244                                 || (ndp_len % opts->ndplen_align != 0)) {
1245                         INFO(port->func.config->cdev, "Bad NDP length: %#X\n",
1246                              ndp_len);
1247                         goto err;
1248                 }
1249                 tmp += opts->reserved1;
1250                 /* Check for another NDP (d)wNextNdpIndex */
1251                 ndp_index = get_ncm(&tmp, opts->next_ndp_index);
1252                 tmp += opts->reserved2;
1253 
1254                 ndp_len -= opts->ndp_size;
1255                 index2 = get_ncm(&tmp, opts->dgram_item_len);
1256                 dg_len2 = get_ncm(&tmp, opts->dgram_item_len);
1257                 dgram_counter = 0;
1258 
1259                 do {
1260                         index = index2;
1261                         dg_len = dg_len2;
1262                         if (dg_len < 14 + crc_len) { /* ethernet hdr + crc */
1263                                 INFO(port->func.config->cdev,
1264                                      "Bad dgram length: %#X\n", dg_len);
1265                                 goto err;
1266                         }
1267                         if (ncm->is_crc) {
1268                                 uint32_t crc, crc2;
1269 
1270                                 crc = get_unaligned_le32(skb->data +
1271                                                          index + dg_len -
1272                                                          crc_len);
1273                                 crc2 = ~crc32_le(~0,
1274                                                  skb->data + index,
1275                                                  dg_len - crc_len);
1276                                 if (crc != crc2) {
1277                                         INFO(port->func.config->cdev,
1278                                              "Bad CRC\n");
1279                                         goto err;
1280                                 }
1281                         }
1282 
1283                         index2 = get_ncm(&tmp, opts->dgram_item_len);
1284                         dg_len2 = get_ncm(&tmp, opts->dgram_item_len);
1285 
1286                         /*
1287                          * Copy the data into a new skb.
1288                          * This ensures the truesize is correct
1289                          */
1290                         skb2 = netdev_alloc_skb_ip_align(ncm->netdev,
1291                                                          dg_len - crc_len);
1292                         if (skb2 == NULL)
1293                                 goto err;
1294                         skb_put_data(skb2, skb->data + index,
1295                                      dg_len - crc_len);
1296 
1297                         skb_queue_tail(list, skb2);
1298 
1299                         ndp_len -= 2 * (opts->dgram_item_len * 2);
1300 
1301                         dgram_counter++;
1302 
1303                         if (index2 == 0 || dg_len2 == 0)
1304                                 break;
1305                 } while (ndp_len > 2 * (opts->dgram_item_len * 2));
1306         } while (ndp_index);
1307 
1308         dev_consume_skb_any(skb);
1309 
1310         VDBG(port->func.config->cdev,
1311              "Parsed NTB with %d frames\n", dgram_counter);
1312         return 0;
1313 err:
1314         skb_queue_purge(list);
1315         dev_kfree_skb_any(skb);
1316         return ret;
1317 }
1318 
1319 static void ncm_disable(struct usb_function *f)
1320 {
1321         struct f_ncm            *ncm = func_to_ncm(f);
1322         struct usb_composite_dev *cdev = f->config->cdev;
1323 
1324         DBG(cdev, "ncm deactivated\n");
1325 
1326         if (ncm->port.in_ep->enabled) {
1327                 ncm->timer_stopping = true;
1328                 ncm->netdev = NULL;
1329                 gether_disconnect(&ncm->port);
1330         }
1331 
1332         if (ncm->notify->enabled) {
1333                 usb_ep_disable(ncm->notify);
1334                 ncm->notify->desc = NULL;
1335         }
1336 }
1337 
1338 /*-------------------------------------------------------------------------*/
1339 
1340 /*
1341  * Callbacks let us notify the host about connect/disconnect when the
1342  * net device is opened or closed.
1343  *
1344  * For testing, note that link states on this side include both opened
1345  * and closed variants of:
1346  *
1347  *   - disconnected/unconfigured
1348  *   - configured but inactive (data alt 0)
1349  *   - configured and active (data alt 1)
1350  *
1351  * Each needs to be tested with unplug, rmmod, SET_CONFIGURATION, and
1352  * SET_INTERFACE (altsetting).  Remember also that "configured" doesn't
1353  * imply the host is actually polling the notification endpoint, and
1354  * likewise that "active" doesn't imply it's actually using the data
1355  * endpoints for traffic.
1356  */
1357 
1358 static void ncm_open(struct gether *geth)
1359 {
1360         struct f_ncm            *ncm = func_to_ncm(&geth->func);
1361 
1362         DBG(ncm->port.func.config->cdev, "%s\n", __func__);
1363 
1364         spin_lock(&ncm->lock);
1365         ncm->is_open = true;
1366         ncm_notify(ncm);
1367         spin_unlock(&ncm->lock);
1368 }
1369 
1370 static void ncm_close(struct gether *geth)
1371 {
1372         struct f_ncm            *ncm = func_to_ncm(&geth->func);
1373 
1374         DBG(ncm->port.func.config->cdev, "%s\n", __func__);
1375 
1376         spin_lock(&ncm->lock);
1377         ncm->is_open = false;
1378         ncm_notify(ncm);
1379         spin_unlock(&ncm->lock);
1380 }
1381 
1382 /*-------------------------------------------------------------------------*/
1383 
1384 /* ethernet function driver setup/binding */
1385 
1386 static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
1387 {
1388         struct usb_composite_dev *cdev = c->cdev;
1389         struct f_ncm            *ncm = func_to_ncm(f);
1390         struct usb_string       *us;
1391         int                     status;
1392         struct usb_ep           *ep;
1393         struct f_ncm_opts       *ncm_opts;
1394 
1395         if (!can_support_ecm(cdev->gadget))
1396                 return -EINVAL;
1397 
1398         ncm_opts = container_of(f->fi, struct f_ncm_opts, func_inst);
1399 
1400         if (cdev->use_os_string) {
1401                 f->os_desc_table = kzalloc(sizeof(*f->os_desc_table),
1402                                            GFP_KERNEL);
1403                 if (!f->os_desc_table)
1404                         return -ENOMEM;
1405                 f->os_desc_n = 1;
1406                 f->os_desc_table[0].os_desc = &ncm_opts->ncm_os_desc;
1407         }
1408 
1409         /*
1410          * in drivers/usb/gadget/configfs.c:configfs_composite_bind()
1411          * configurations are bound in sequence with list_for_each_entry,
1412          * in each configuration its functions are bound in sequence
1413          * with list_for_each_entry, so we assume no race condition
1414          * with regard to ncm_opts->bound access
1415          */
1416         if (!ncm_opts->bound) {
1417                 mutex_lock(&ncm_opts->lock);
1418                 gether_set_gadget(ncm_opts->net, cdev->gadget);
1419                 status = gether_register_netdev(ncm_opts->net);
1420                 mutex_unlock(&ncm_opts->lock);
1421                 if (status)
1422                         goto fail;
1423                 ncm_opts->bound = true;
1424         }
1425         us = usb_gstrings_attach(cdev, ncm_strings,
1426                                  ARRAY_SIZE(ncm_string_defs));
1427         if (IS_ERR(us)) {
1428                 status = PTR_ERR(us);
1429                 goto fail;
1430         }
1431         ncm_control_intf.iInterface = us[STRING_CTRL_IDX].id;
1432         ncm_data_nop_intf.iInterface = us[STRING_DATA_IDX].id;
1433         ncm_data_intf.iInterface = us[STRING_DATA_IDX].id;
1434         ecm_desc.iMACAddress = us[STRING_MAC_IDX].id;
1435         ncm_iad_desc.iFunction = us[STRING_IAD_IDX].id;
1436 
1437         /* allocate instance-specific interface IDs */
1438         status = usb_interface_id(c, f);
1439         if (status < 0)
1440                 goto fail;
1441         ncm->ctrl_id = status;
1442         ncm_iad_desc.bFirstInterface = status;
1443 
1444         ncm_control_intf.bInterfaceNumber = status;
1445         ncm_union_desc.bMasterInterface0 = status;
1446 
1447         if (cdev->use_os_string)
1448                 f->os_desc_table[0].if_id =
1449                         ncm_iad_desc.bFirstInterface;
1450 
1451         status = usb_interface_id(c, f);
1452         if (status < 0)
1453                 goto fail;
1454         ncm->data_id = status;
1455 
1456         ncm_data_nop_intf.bInterfaceNumber = status;
1457         ncm_data_intf.bInterfaceNumber = status;
1458         ncm_union_desc.bSlaveInterface0 = status;
1459 
1460         status = -ENODEV;
1461 
1462         /* allocate instance-specific endpoints */
1463         ep = usb_ep_autoconfig(cdev->gadget, &fs_ncm_in_desc);
1464         if (!ep)
1465                 goto fail;
1466         ncm->port.in_ep = ep;
1467 
1468         ep = usb_ep_autoconfig(cdev->gadget, &fs_ncm_out_desc);
1469         if (!ep)
1470                 goto fail;
1471         ncm->port.out_ep = ep;
1472 
1473         ep = usb_ep_autoconfig(cdev->gadget, &fs_ncm_notify_desc);
1474         if (!ep)
1475                 goto fail;
1476         ncm->notify = ep;
1477 
1478         status = -ENOMEM;
1479 
1480         /* allocate notification request and buffer */
1481         ncm->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
1482         if (!ncm->notify_req)
1483                 goto fail;
1484         ncm->notify_req->buf = kmalloc(NCM_STATUS_BYTECOUNT, GFP_KERNEL);
1485         if (!ncm->notify_req->buf)
1486                 goto fail;
1487         ncm->notify_req->context = ncm;
1488         ncm->notify_req->complete = ncm_notify_complete;
1489 
1490         /*
1491          * support all relevant hardware speeds... we expect that when
1492          * hardware is dual speed, all bulk-capable endpoints work at
1493          * both speeds
1494          */
1495         hs_ncm_in_desc.bEndpointAddress = fs_ncm_in_desc.bEndpointAddress;
1496         hs_ncm_out_desc.bEndpointAddress = fs_ncm_out_desc.bEndpointAddress;
1497         hs_ncm_notify_desc.bEndpointAddress =
1498                 fs_ncm_notify_desc.bEndpointAddress;
1499 
1500         ss_ncm_in_desc.bEndpointAddress = fs_ncm_in_desc.bEndpointAddress;
1501         ss_ncm_out_desc.bEndpointAddress = fs_ncm_out_desc.bEndpointAddress;
1502         ss_ncm_notify_desc.bEndpointAddress =
1503                 fs_ncm_notify_desc.bEndpointAddress;
1504 
1505         status = usb_assign_descriptors(f, ncm_fs_function, ncm_hs_function,
1506                         ncm_ss_function, NULL);
1507         if (status)
1508                 goto fail;
1509 
1510         /*
1511          * NOTE:  all that is done without knowing or caring about
1512          * the network link ... which is unavailable to this code
1513          * until we're activated via set_alt().
1514          */
1515 
1516         ncm->port.open = ncm_open;
1517         ncm->port.close = ncm_close;
1518 
1519         hrtimer_init(&ncm->task_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
1520         ncm->task_timer.function = ncm_tx_timeout;
1521 
1522         DBG(cdev, "CDC Network: %s speed IN/%s OUT/%s NOTIFY/%s\n",
1523                         gadget_is_superspeed(c->cdev->gadget) ? "super" :
1524                         gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
1525                         ncm->port.in_ep->name, ncm->port.out_ep->name,
1526                         ncm->notify->name);
1527         return 0;
1528 
1529 fail:
1530         kfree(f->os_desc_table);
1531         f->os_desc_n = 0;
1532 
1533         if (ncm->notify_req) {
1534                 kfree(ncm->notify_req->buf);
1535                 usb_ep_free_request(ncm->notify, ncm->notify_req);
1536         }
1537 
1538         ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
1539 
1540         return status;
1541 }
1542 
1543 static inline struct f_ncm_opts *to_f_ncm_opts(struct config_item *item)
1544 {
1545         return container_of(to_config_group(item), struct f_ncm_opts,
1546                             func_inst.group);
1547 }
1548 
1549 /* f_ncm_item_ops */
1550 USB_ETHERNET_CONFIGFS_ITEM(ncm);
1551 
1552 /* f_ncm_opts_dev_addr */
1553 USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(ncm);
1554 
1555 /* f_ncm_opts_host_addr */
1556 USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(ncm);
1557 
1558 /* f_ncm_opts_qmult */
1559 USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ncm);
1560 
1561 /* f_ncm_opts_ifname */
1562 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ncm);
1563 
1564 static struct configfs_attribute *ncm_attrs[] = {
1565         &ncm_opts_attr_dev_addr,
1566         &ncm_opts_attr_host_addr,
1567         &ncm_opts_attr_qmult,
1568         &ncm_opts_attr_ifname,
1569         NULL,
1570 };
1571 
1572 static const struct config_item_type ncm_func_type = {
1573         .ct_item_ops    = &ncm_item_ops,
1574         .ct_attrs       = ncm_attrs,
1575         .ct_owner       = THIS_MODULE,
1576 };
1577 
1578 static void ncm_free_inst(struct usb_function_instance *f)
1579 {
1580         struct f_ncm_opts *opts;
1581 
1582         opts = container_of(f, struct f_ncm_opts, func_inst);
1583         if (opts->bound)
1584                 gether_cleanup(netdev_priv(opts->net));
1585         else
1586                 free_netdev(opts->net);
1587         kfree(opts->ncm_interf_group);
1588         kfree(opts);
1589 }
1590 
1591 static struct usb_function_instance *ncm_alloc_inst(void)
1592 {
1593         struct f_ncm_opts *opts;
1594         struct usb_os_desc *descs[1];
1595         char *names[1];
1596         struct config_group *ncm_interf_group;
1597 
1598         opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1599         if (!opts)
1600                 return ERR_PTR(-ENOMEM);
1601         opts->ncm_os_desc.ext_compat_id = opts->ncm_ext_compat_id;
1602 
1603         mutex_init(&opts->lock);
1604         opts->func_inst.free_func_inst = ncm_free_inst;
1605         opts->net = gether_setup_default();
1606         if (IS_ERR(opts->net)) {
1607                 struct net_device *net = opts->net;
1608                 kfree(opts);
1609                 return ERR_CAST(net);
1610         }
1611         INIT_LIST_HEAD(&opts->ncm_os_desc.ext_prop);
1612 
1613         descs[0] = &opts->ncm_os_desc;
1614         names[0] = "ncm";
1615 
1616         config_group_init_type_name(&opts->func_inst.group, "", &ncm_func_type);
1617         ncm_interf_group =
1618                 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
1619                                                names, THIS_MODULE);
1620         if (IS_ERR(ncm_interf_group)) {
1621                 ncm_free_inst(&opts->func_inst);
1622                 return ERR_CAST(ncm_interf_group);
1623         }
1624         opts->ncm_interf_group = ncm_interf_group;
1625 
1626         return &opts->func_inst;
1627 }
1628 
1629 static void ncm_free(struct usb_function *f)
1630 {
1631         struct f_ncm *ncm;
1632         struct f_ncm_opts *opts;
1633 
1634         ncm = func_to_ncm(f);
1635         opts = container_of(f->fi, struct f_ncm_opts, func_inst);
1636         kfree(ncm);
1637         mutex_lock(&opts->lock);
1638         opts->refcnt--;
1639         mutex_unlock(&opts->lock);
1640 }
1641 
1642 static void ncm_unbind(struct usb_configuration *c, struct usb_function *f)
1643 {
1644         struct f_ncm *ncm = func_to_ncm(f);
1645 
1646         DBG(c->cdev, "ncm unbind\n");
1647 
1648         hrtimer_cancel(&ncm->task_timer);
1649 
1650         kfree(f->os_desc_table);
1651         f->os_desc_n = 0;
1652 
1653         ncm_string_defs[0].id = 0;
1654         usb_free_all_descriptors(f);
1655 
1656         if (atomic_read(&ncm->notify_count)) {
1657                 usb_ep_dequeue(ncm->notify, ncm->notify_req);
1658                 atomic_set(&ncm->notify_count, 0);
1659         }
1660 
1661         kfree(ncm->notify_req->buf);
1662         usb_ep_free_request(ncm->notify, ncm->notify_req);
1663 }
1664 
1665 static struct usb_function *ncm_alloc(struct usb_function_instance *fi)
1666 {
1667         struct f_ncm            *ncm;
1668         struct f_ncm_opts       *opts;
1669         int status;
1670 
1671         /* allocate and initialize one new instance */
1672         ncm = kzalloc(sizeof(*ncm), GFP_KERNEL);
1673         if (!ncm)
1674                 return ERR_PTR(-ENOMEM);
1675 
1676         opts = container_of(fi, struct f_ncm_opts, func_inst);
1677         mutex_lock(&opts->lock);
1678         opts->refcnt++;
1679 
1680         /* export host's Ethernet address in CDC format */
1681         status = gether_get_host_addr_cdc(opts->net, ncm->ethaddr,
1682                                       sizeof(ncm->ethaddr));
1683         if (status < 12) { /* strlen("01234567890a") */
1684                 kfree(ncm);
1685                 mutex_unlock(&opts->lock);
1686                 return ERR_PTR(-EINVAL);
1687         }
1688         ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;
1689 
1690         spin_lock_init(&ncm->lock);
1691         ncm_reset_values(ncm);
1692         ncm->port.ioport = netdev_priv(opts->net);
1693         mutex_unlock(&opts->lock);
1694         ncm->port.is_fixed = true;
1695         ncm->port.supports_multi_frame = true;
1696 
1697         ncm->port.func.name = "cdc_network";
1698         /* descriptors are per-instance copies */
1699         ncm->port.func.bind = ncm_bind;
1700         ncm->port.func.unbind = ncm_unbind;
1701         ncm->port.func.set_alt = ncm_set_alt;
1702         ncm->port.func.get_alt = ncm_get_alt;
1703         ncm->port.func.setup = ncm_setup;
1704         ncm->port.func.disable = ncm_disable;
1705         ncm->port.func.free_func = ncm_free;
1706 
1707         ncm->port.wrap = ncm_wrap_ntb;
1708         ncm->port.unwrap = ncm_unwrap_ntb;
1709 
1710         return &ncm->port.func;
1711 }
1712 
1713 DECLARE_USB_FUNCTION_INIT(ncm, ncm_alloc_inst, ncm_alloc);
1714 MODULE_LICENSE("GPL");
1715 MODULE_AUTHOR("Yauheni Kaliuta");

/* [<][>][^][v][top][bottom][index][help] */