linux/drivers/net/usb/cdc_ncm.c
<<
>>
Prefs
   1/*
   2 * cdc_ncm.c
   3 *
   4 * Copyright (C) ST-Ericsson 2010-2012
   5 * Contact: Alexey Orishko <alexey.orishko@stericsson.com>
   6 * Original author: Hans Petter Selasky <hans.petter.selasky@stericsson.com>
   7 *
   8 * USB Host Driver for Network Control Model (NCM)
   9 * http://www.usb.org/developers/devclass_docs/NCM10.zip
  10 *
  11 * The NCM encoding, decoding and initialization logic
  12 * derives from FreeBSD 8.x. if_cdce.c and if_cdcereg.h
  13 *
  14 * This software is available to you under a choice of one of two
  15 * licenses. You may choose this file to be licensed under the terms
  16 * of the GNU General Public License (GPL) Version 2 or the 2-clause
  17 * BSD license listed below:
  18 *
  19 * Redistribution and use in source and binary forms, with or without
  20 * modification, are permitted provided that the following conditions
  21 * are met:
  22 * 1. Redistributions of source code must retain the above copyright
  23 *    notice, this list of conditions and the following disclaimer.
  24 * 2. Redistributions in binary form must reproduce the above copyright
  25 *    notice, this list of conditions and the following disclaimer in the
  26 *    documentation and/or other materials provided with the distribution.
  27 *
  28 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  31 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  38 * SUCH DAMAGE.
  39 */
  40
  41#include <linux/module.h>
  42#include <linux/netdevice.h>
  43#include <linux/ctype.h>
  44#include <linux/ethtool.h>
  45#include <linux/workqueue.h>
  46#include <linux/mii.h>
  47#include <linux/crc32.h>
  48#include <linux/usb.h>
  49#include <linux/hrtimer.h>
  50#include <linux/atomic.h>
  51#include <linux/usb/usbnet.h>
  52#include <linux/usb/cdc.h>
  53#include <linux/usb/cdc_ncm.h>
  54
  55#if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
  56static bool prefer_mbim = true;
  57#else
  58static bool prefer_mbim;
  59#endif
  60module_param(prefer_mbim, bool, S_IRUGO | S_IWUSR);
  61MODULE_PARM_DESC(prefer_mbim, "Prefer MBIM setting on dual NCM/MBIM functions");
  62
  63static void cdc_ncm_txpath_bh(unsigned long param);
  64static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx);
  65static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *hr_timer);
  66static struct usb_driver cdc_ncm_driver;
  67
  68struct cdc_ncm_stats {
  69        char stat_string[ETH_GSTRING_LEN];
  70        int sizeof_stat;
  71        int stat_offset;
  72};
  73
  74#define CDC_NCM_STAT(str, m) { \
  75                .stat_string = str, \
  76                .sizeof_stat = sizeof(((struct cdc_ncm_ctx *)0)->m), \
  77                .stat_offset = offsetof(struct cdc_ncm_ctx, m) }
  78#define CDC_NCM_SIMPLE_STAT(m)  CDC_NCM_STAT(__stringify(m), m)
  79
  80static const struct cdc_ncm_stats cdc_ncm_gstrings_stats[] = {
  81        CDC_NCM_SIMPLE_STAT(tx_reason_ntb_full),
  82        CDC_NCM_SIMPLE_STAT(tx_reason_ndp_full),
  83        CDC_NCM_SIMPLE_STAT(tx_reason_timeout),
  84        CDC_NCM_SIMPLE_STAT(tx_reason_max_datagram),
  85        CDC_NCM_SIMPLE_STAT(tx_overhead),
  86        CDC_NCM_SIMPLE_STAT(tx_ntbs),
  87        CDC_NCM_SIMPLE_STAT(rx_overhead),
  88        CDC_NCM_SIMPLE_STAT(rx_ntbs),
  89};
  90
  91static int cdc_ncm_get_sset_count(struct net_device __always_unused *netdev, int sset)
  92{
  93        switch (sset) {
  94        case ETH_SS_STATS:
  95                return ARRAY_SIZE(cdc_ncm_gstrings_stats);
  96        default:
  97                return -EOPNOTSUPP;
  98        }
  99}
 100
 101static void cdc_ncm_get_ethtool_stats(struct net_device *netdev,
 102                                    struct ethtool_stats __always_unused *stats,
 103                                    u64 *data)
 104{
 105        struct usbnet *dev = netdev_priv(netdev);
 106        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 107        int i;
 108        char *p = NULL;
 109
 110        for (i = 0; i < ARRAY_SIZE(cdc_ncm_gstrings_stats); i++) {
 111                p = (char *)ctx + cdc_ncm_gstrings_stats[i].stat_offset;
 112                data[i] = (cdc_ncm_gstrings_stats[i].sizeof_stat == sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
 113        }
 114}
 115
 116static void cdc_ncm_get_strings(struct net_device __always_unused *netdev, u32 stringset, u8 *data)
 117{
 118        u8 *p = data;
 119        int i;
 120
 121        switch (stringset) {
 122        case ETH_SS_STATS:
 123                for (i = 0; i < ARRAY_SIZE(cdc_ncm_gstrings_stats); i++) {
 124                        memcpy(p, cdc_ncm_gstrings_stats[i].stat_string, ETH_GSTRING_LEN);
 125                        p += ETH_GSTRING_LEN;
 126                }
 127        }
 128}
 129
 130static void cdc_ncm_update_rxtx_max(struct usbnet *dev, u32 new_rx, u32 new_tx);
 131
 132static const struct ethtool_ops cdc_ncm_ethtool_ops = {
 133        .get_settings      = usbnet_get_settings,
 134        .set_settings      = usbnet_set_settings,
 135        .get_link          = usbnet_get_link,
 136        .nway_reset        = usbnet_nway_reset,
 137        .get_drvinfo       = usbnet_get_drvinfo,
 138        .get_msglevel      = usbnet_get_msglevel,
 139        .set_msglevel      = usbnet_set_msglevel,
 140        .get_ts_info       = ethtool_op_get_ts_info,
 141        .get_sset_count    = cdc_ncm_get_sset_count,
 142        .get_strings       = cdc_ncm_get_strings,
 143        .get_ethtool_stats = cdc_ncm_get_ethtool_stats,
 144};
 145
 146static u32 cdc_ncm_check_rx_max(struct usbnet *dev, u32 new_rx)
 147{
 148        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 149        u32 val, max, min;
 150
 151        /* clamp new_rx to sane values */
 152        min = USB_CDC_NCM_NTB_MIN_IN_SIZE;
 153        max = min_t(u32, CDC_NCM_NTB_MAX_SIZE_RX, le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize));
 154
 155        /* dwNtbInMaxSize spec violation? Use MIN size for both limits */
 156        if (max < min) {
 157                dev_warn(&dev->intf->dev, "dwNtbInMaxSize=%u is too small. Using %u\n",
 158                         le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize), min);
 159                max = min;
 160        }
 161
 162        val = clamp_t(u32, new_rx, min, max);
 163        if (val != new_rx)
 164                dev_dbg(&dev->intf->dev, "rx_max must be in the [%u, %u] range\n", min, max);
 165
 166        return val;
 167}
 168
 169static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx)
 170{
 171        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 172        u32 val, max, min;
 173
 174        /* clamp new_tx to sane values */
 175        min = ctx->max_datagram_size + ctx->max_ndp_size + sizeof(struct usb_cdc_ncm_nth16);
 176        max = min_t(u32, CDC_NCM_NTB_MAX_SIZE_TX, le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize));
 177
 178        /* some devices set dwNtbOutMaxSize too low for the above default */
 179        min = min(min, max);
 180
 181        val = clamp_t(u32, new_tx, min, max);
 182        if (val != new_tx)
 183                dev_dbg(&dev->intf->dev, "tx_max must be in the [%u, %u] range\n", min, max);
 184
 185        return val;
 186}
 187
 188static ssize_t cdc_ncm_show_min_tx_pkt(struct device *d, struct device_attribute *attr, char *buf)
 189{
 190        struct usbnet *dev = netdev_priv(to_net_dev(d));
 191        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 192
 193        return sprintf(buf, "%u\n", ctx->min_tx_pkt);
 194}
 195
 196static ssize_t cdc_ncm_show_rx_max(struct device *d, struct device_attribute *attr, char *buf)
 197{
 198        struct usbnet *dev = netdev_priv(to_net_dev(d));
 199        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 200
 201        return sprintf(buf, "%u\n", ctx->rx_max);
 202}
 203
 204static ssize_t cdc_ncm_show_tx_max(struct device *d, struct device_attribute *attr, char *buf)
 205{
 206        struct usbnet *dev = netdev_priv(to_net_dev(d));
 207        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 208
 209        return sprintf(buf, "%u\n", ctx->tx_max);
 210}
 211
 212static ssize_t cdc_ncm_show_tx_timer_usecs(struct device *d, struct device_attribute *attr, char *buf)
 213{
 214        struct usbnet *dev = netdev_priv(to_net_dev(d));
 215        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 216
 217        return sprintf(buf, "%u\n", ctx->timer_interval / (u32)NSEC_PER_USEC);
 218}
 219
 220static ssize_t cdc_ncm_store_min_tx_pkt(struct device *d,  struct device_attribute *attr, const char *buf, size_t len)
 221{
 222        struct usbnet *dev = netdev_priv(to_net_dev(d));
 223        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 224        unsigned long val;
 225
 226        /* no need to restrict values - anything from 0 to infinity is OK */
 227        if (kstrtoul(buf, 0, &val))
 228                return -EINVAL;
 229
 230        ctx->min_tx_pkt = val;
 231        return len;
 232}
 233
 234static ssize_t cdc_ncm_store_rx_max(struct device *d,  struct device_attribute *attr, const char *buf, size_t len)
 235{
 236        struct usbnet *dev = netdev_priv(to_net_dev(d));
 237        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 238        unsigned long val;
 239
 240        if (kstrtoul(buf, 0, &val) || cdc_ncm_check_rx_max(dev, val) != val)
 241                return -EINVAL;
 242
 243        cdc_ncm_update_rxtx_max(dev, val, ctx->tx_max);
 244        return len;
 245}
 246
 247static ssize_t cdc_ncm_store_tx_max(struct device *d,  struct device_attribute *attr, const char *buf, size_t len)
 248{
 249        struct usbnet *dev = netdev_priv(to_net_dev(d));
 250        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 251        unsigned long val;
 252
 253        if (kstrtoul(buf, 0, &val) || cdc_ncm_check_tx_max(dev, val) != val)
 254                return -EINVAL;
 255
 256        cdc_ncm_update_rxtx_max(dev, ctx->rx_max, val);
 257        return len;
 258}
 259
 260static ssize_t cdc_ncm_store_tx_timer_usecs(struct device *d,  struct device_attribute *attr, const char *buf, size_t len)
 261{
 262        struct usbnet *dev = netdev_priv(to_net_dev(d));
 263        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 264        ssize_t ret;
 265        unsigned long val;
 266
 267        ret = kstrtoul(buf, 0, &val);
 268        if (ret)
 269                return ret;
 270        if (val && (val < CDC_NCM_TIMER_INTERVAL_MIN || val > CDC_NCM_TIMER_INTERVAL_MAX))
 271                return -EINVAL;
 272
 273        spin_lock_bh(&ctx->mtx);
 274        ctx->timer_interval = val * NSEC_PER_USEC;
 275        if (!ctx->timer_interval)
 276                ctx->tx_timer_pending = 0;
 277        spin_unlock_bh(&ctx->mtx);
 278        return len;
 279}
 280
 281static DEVICE_ATTR(min_tx_pkt, S_IRUGO | S_IWUSR, cdc_ncm_show_min_tx_pkt, cdc_ncm_store_min_tx_pkt);
 282static DEVICE_ATTR(rx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_rx_max, cdc_ncm_store_rx_max);
 283static DEVICE_ATTR(tx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_max, cdc_ncm_store_tx_max);
 284static DEVICE_ATTR(tx_timer_usecs, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_timer_usecs, cdc_ncm_store_tx_timer_usecs);
 285
 286#define NCM_PARM_ATTR(name, format, tocpu)                              \
 287static ssize_t cdc_ncm_show_##name(struct device *d, struct device_attribute *attr, char *buf) \
 288{ \
 289        struct usbnet *dev = netdev_priv(to_net_dev(d)); \
 290        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; \
 291        return sprintf(buf, format "\n", tocpu(ctx->ncm_parm.name));    \
 292} \
 293static DEVICE_ATTR(name, S_IRUGO, cdc_ncm_show_##name, NULL)
 294
 295NCM_PARM_ATTR(bmNtbFormatsSupported, "0x%04x", le16_to_cpu);
 296NCM_PARM_ATTR(dwNtbInMaxSize, "%u", le32_to_cpu);
 297NCM_PARM_ATTR(wNdpInDivisor, "%u", le16_to_cpu);
 298NCM_PARM_ATTR(wNdpInPayloadRemainder, "%u", le16_to_cpu);
 299NCM_PARM_ATTR(wNdpInAlignment, "%u", le16_to_cpu);
 300NCM_PARM_ATTR(dwNtbOutMaxSize, "%u", le32_to_cpu);
 301NCM_PARM_ATTR(wNdpOutDivisor, "%u", le16_to_cpu);
 302NCM_PARM_ATTR(wNdpOutPayloadRemainder, "%u", le16_to_cpu);
 303NCM_PARM_ATTR(wNdpOutAlignment, "%u", le16_to_cpu);
 304NCM_PARM_ATTR(wNtbOutMaxDatagrams, "%u", le16_to_cpu);
 305
 306static struct attribute *cdc_ncm_sysfs_attrs[] = {
 307        &dev_attr_min_tx_pkt.attr,
 308        &dev_attr_rx_max.attr,
 309        &dev_attr_tx_max.attr,
 310        &dev_attr_tx_timer_usecs.attr,
 311        &dev_attr_bmNtbFormatsSupported.attr,
 312        &dev_attr_dwNtbInMaxSize.attr,
 313        &dev_attr_wNdpInDivisor.attr,
 314        &dev_attr_wNdpInPayloadRemainder.attr,
 315        &dev_attr_wNdpInAlignment.attr,
 316        &dev_attr_dwNtbOutMaxSize.attr,
 317        &dev_attr_wNdpOutDivisor.attr,
 318        &dev_attr_wNdpOutPayloadRemainder.attr,
 319        &dev_attr_wNdpOutAlignment.attr,
 320        &dev_attr_wNtbOutMaxDatagrams.attr,
 321        NULL,
 322};
 323
 324static struct attribute_group cdc_ncm_sysfs_attr_group = {
 325        .name = "cdc_ncm",
 326        .attrs = cdc_ncm_sysfs_attrs,
 327};
 328
 329/* handle rx_max and tx_max changes */
 330static void cdc_ncm_update_rxtx_max(struct usbnet *dev, u32 new_rx, u32 new_tx)
 331{
 332        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 333        u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
 334        u32 val;
 335
 336        val = cdc_ncm_check_rx_max(dev, new_rx);
 337
 338        /* inform device about NTB input size changes */
 339        if (val != ctx->rx_max) {
 340                __le32 dwNtbInMaxSize = cpu_to_le32(val);
 341
 342                dev_info(&dev->intf->dev, "setting rx_max = %u\n", val);
 343
 344                /* tell device to use new size */
 345                if (usbnet_write_cmd(dev, USB_CDC_SET_NTB_INPUT_SIZE,
 346                                     USB_TYPE_CLASS | USB_DIR_OUT
 347                                     | USB_RECIP_INTERFACE,
 348                                     0, iface_no, &dwNtbInMaxSize, 4) < 0)
 349                        dev_dbg(&dev->intf->dev, "Setting NTB Input Size failed\n");
 350                else
 351                        ctx->rx_max = val;
 352        }
 353
 354        /* usbnet use these values for sizing rx queues */
 355        if (dev->rx_urb_size != ctx->rx_max) {
 356                dev->rx_urb_size = ctx->rx_max;
 357                if (netif_running(dev->net))
 358                        usbnet_unlink_rx_urbs(dev);
 359        }
 360
 361        val = cdc_ncm_check_tx_max(dev, new_tx);
 362        if (val != ctx->tx_max)
 363                dev_info(&dev->intf->dev, "setting tx_max = %u\n", val);
 364
 365        /* Adding a pad byte here if necessary simplifies the handling
 366         * in cdc_ncm_fill_tx_frame, making tx_max always represent
 367         * the real skb max size.
 368         *
 369         * We cannot use dev->maxpacket here because this is called from
 370         * .bind which is called before usbnet sets up dev->maxpacket
 371         */
 372        if (val != le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize) &&
 373            val % usb_maxpacket(dev->udev, dev->out, 1) == 0)
 374                val++;
 375
 376        /* we might need to flush any pending tx buffers if running */
 377        if (netif_running(dev->net) && val > ctx->tx_max) {
 378                netif_tx_lock_bh(dev->net);
 379                usbnet_start_xmit(NULL, dev->net);
 380                /* make sure tx_curr_skb is reallocated if it was empty */
 381                if (ctx->tx_curr_skb) {
 382                        dev_kfree_skb_any(ctx->tx_curr_skb);
 383                        ctx->tx_curr_skb = NULL;
 384                }
 385                ctx->tx_max = val;
 386                netif_tx_unlock_bh(dev->net);
 387        } else {
 388                ctx->tx_max = val;
 389        }
 390
 391        dev->hard_mtu = ctx->tx_max;
 392
 393        /* max qlen depend on hard_mtu and rx_urb_size */
 394        usbnet_update_max_qlen(dev);
 395
 396        /* never pad more than 3 full USB packets per transfer */
 397        ctx->min_tx_pkt = clamp_t(u16, ctx->tx_max - 3 * usb_maxpacket(dev->udev, dev->out, 1),
 398                                  CDC_NCM_MIN_TX_PKT, ctx->tx_max);
 399}
 400
 401/* helpers for NCM and MBIM differences */
 402static u8 cdc_ncm_flags(struct usbnet *dev)
 403{
 404        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 405
 406        if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting) && ctx->mbim_desc)
 407                return ctx->mbim_desc->bmNetworkCapabilities;
 408        if (ctx->func_desc)
 409                return ctx->func_desc->bmNetworkCapabilities;
 410        return 0;
 411}
 412
 413static int cdc_ncm_eth_hlen(struct usbnet *dev)
 414{
 415        if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting))
 416                return 0;
 417        return ETH_HLEN;
 418}
 419
 420static u32 cdc_ncm_min_dgram_size(struct usbnet *dev)
 421{
 422        if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting))
 423                return CDC_MBIM_MIN_DATAGRAM_SIZE;
 424        return CDC_NCM_MIN_DATAGRAM_SIZE;
 425}
 426
 427static u32 cdc_ncm_max_dgram_size(struct usbnet *dev)
 428{
 429        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 430
 431        if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting) && ctx->mbim_desc)
 432                return le16_to_cpu(ctx->mbim_desc->wMaxSegmentSize);
 433        if (ctx->ether_desc)
 434                return le16_to_cpu(ctx->ether_desc->wMaxSegmentSize);
 435        return CDC_NCM_MAX_DATAGRAM_SIZE;
 436}
 437
 438/* initial one-time device setup.  MUST be called with the data interface
 439 * in altsetting 0
 440 */
 441static int cdc_ncm_init(struct usbnet *dev)
 442{
 443        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 444        u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
 445        int err;
 446
 447        err = usbnet_read_cmd(dev, USB_CDC_GET_NTB_PARAMETERS,
 448                              USB_TYPE_CLASS | USB_DIR_IN
 449                              |USB_RECIP_INTERFACE,
 450                              0, iface_no, &ctx->ncm_parm,
 451                              sizeof(ctx->ncm_parm));
 452        if (err < 0) {
 453                dev_err(&dev->intf->dev, "failed GET_NTB_PARAMETERS\n");
 454                return err; /* GET_NTB_PARAMETERS is required */
 455        }
 456
 457        /* set CRC Mode */
 458        if (cdc_ncm_flags(dev) & USB_CDC_NCM_NCAP_CRC_MODE) {
 459                dev_dbg(&dev->intf->dev, "Setting CRC mode off\n");
 460                err = usbnet_write_cmd(dev, USB_CDC_SET_CRC_MODE,
 461                                       USB_TYPE_CLASS | USB_DIR_OUT
 462                                       | USB_RECIP_INTERFACE,
 463                                       USB_CDC_NCM_CRC_NOT_APPENDED,
 464                                       iface_no, NULL, 0);
 465                if (err < 0)
 466                        dev_err(&dev->intf->dev, "SET_CRC_MODE failed\n");
 467        }
 468
 469        /* set NTB format, if both formats are supported.
 470         *
 471         * "The host shall only send this command while the NCM Data
 472         *  Interface is in alternate setting 0."
 473         */
 474        if (le16_to_cpu(ctx->ncm_parm.bmNtbFormatsSupported) &
 475                                                USB_CDC_NCM_NTB32_SUPPORTED) {
 476                dev_dbg(&dev->intf->dev, "Setting NTB format to 16-bit\n");
 477                err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_FORMAT,
 478                                       USB_TYPE_CLASS | USB_DIR_OUT
 479                                       | USB_RECIP_INTERFACE,
 480                                       USB_CDC_NCM_NTB16_FORMAT,
 481                                       iface_no, NULL, 0);
 482                if (err < 0)
 483                        dev_err(&dev->intf->dev, "SET_NTB_FORMAT failed\n");
 484        }
 485
 486        /* set initial device values */
 487        ctx->rx_max = le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize);
 488        ctx->tx_max = le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize);
 489        ctx->tx_remainder = le16_to_cpu(ctx->ncm_parm.wNdpOutPayloadRemainder);
 490        ctx->tx_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutDivisor);
 491        ctx->tx_ndp_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutAlignment);
 492        /* devices prior to NCM Errata shall set this field to zero */
 493        ctx->tx_max_datagrams = le16_to_cpu(ctx->ncm_parm.wNtbOutMaxDatagrams);
 494
 495        dev_dbg(&dev->intf->dev,
 496                "dwNtbInMaxSize=%u dwNtbOutMaxSize=%u wNdpOutPayloadRemainder=%u wNdpOutDivisor=%u wNdpOutAlignment=%u wNtbOutMaxDatagrams=%u flags=0x%x\n",
 497                ctx->rx_max, ctx->tx_max, ctx->tx_remainder, ctx->tx_modulus,
 498                ctx->tx_ndp_modulus, ctx->tx_max_datagrams, cdc_ncm_flags(dev));
 499
 500        /* max count of tx datagrams */
 501        if ((ctx->tx_max_datagrams == 0) ||
 502                        (ctx->tx_max_datagrams > CDC_NCM_DPT_DATAGRAMS_MAX))
 503                ctx->tx_max_datagrams = CDC_NCM_DPT_DATAGRAMS_MAX;
 504
 505        /* set up maximum NDP size */
 506        ctx->max_ndp_size = sizeof(struct usb_cdc_ncm_ndp16) + (ctx->tx_max_datagrams + 1) * sizeof(struct usb_cdc_ncm_dpe16);
 507
 508        /* initial coalescing timer interval */
 509        ctx->timer_interval = CDC_NCM_TIMER_INTERVAL_USEC * NSEC_PER_USEC;
 510
 511        return 0;
 512}
 513
 514/* set a new max datagram size */
 515static void cdc_ncm_set_dgram_size(struct usbnet *dev, int new_size)
 516{
 517        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 518        u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
 519        __le16 max_datagram_size;
 520        u16 mbim_mtu;
 521        int err;
 522
 523        /* set default based on descriptors */
 524        ctx->max_datagram_size = clamp_t(u32, new_size,
 525                                         cdc_ncm_min_dgram_size(dev),
 526                                         CDC_NCM_MAX_DATAGRAM_SIZE);
 527
 528        /* inform the device about the selected Max Datagram Size? */
 529        if (!(cdc_ncm_flags(dev) & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE))
 530                goto out;
 531
 532        /* read current mtu value from device */
 533        err = usbnet_read_cmd(dev, USB_CDC_GET_MAX_DATAGRAM_SIZE,
 534                              USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE,
 535                              0, iface_no, &max_datagram_size, 2);
 536        if (err < 0) {
 537                dev_dbg(&dev->intf->dev, "GET_MAX_DATAGRAM_SIZE failed\n");
 538                goto out;
 539        }
 540
 541        if (le16_to_cpu(max_datagram_size) == ctx->max_datagram_size)
 542                goto out;
 543
 544        max_datagram_size = cpu_to_le16(ctx->max_datagram_size);
 545        err = usbnet_write_cmd(dev, USB_CDC_SET_MAX_DATAGRAM_SIZE,
 546                               USB_TYPE_CLASS | USB_DIR_OUT | USB_RECIP_INTERFACE,
 547                               0, iface_no, &max_datagram_size, 2);
 548        if (err < 0)
 549                dev_dbg(&dev->intf->dev, "SET_MAX_DATAGRAM_SIZE failed\n");
 550
 551out:
 552        /* set MTU to max supported by the device if necessary */
 553        dev->net->mtu = min_t(int, dev->net->mtu, ctx->max_datagram_size - cdc_ncm_eth_hlen(dev));
 554
 555        /* do not exceed operater preferred MTU */
 556        if (ctx->mbim_extended_desc) {
 557                mbim_mtu = le16_to_cpu(ctx->mbim_extended_desc->wMTU);
 558                if (mbim_mtu != 0 && mbim_mtu < dev->net->mtu)
 559                        dev->net->mtu = mbim_mtu;
 560        }
 561}
 562
 563static void cdc_ncm_fix_modulus(struct usbnet *dev)
 564{
 565        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 566        u32 val;
 567
 568        /*
 569         * verify that the structure alignment is:
 570         * - power of two
 571         * - not greater than the maximum transmit length
 572         * - not less than four bytes
 573         */
 574        val = ctx->tx_ndp_modulus;
 575
 576        if ((val < USB_CDC_NCM_NDP_ALIGN_MIN_SIZE) ||
 577            (val != ((-val) & val)) || (val >= ctx->tx_max)) {
 578                dev_dbg(&dev->intf->dev, "Using default alignment: 4 bytes\n");
 579                ctx->tx_ndp_modulus = USB_CDC_NCM_NDP_ALIGN_MIN_SIZE;
 580        }
 581
 582        /*
 583         * verify that the payload alignment is:
 584         * - power of two
 585         * - not greater than the maximum transmit length
 586         * - not less than four bytes
 587         */
 588        val = ctx->tx_modulus;
 589
 590        if ((val < USB_CDC_NCM_NDP_ALIGN_MIN_SIZE) ||
 591            (val != ((-val) & val)) || (val >= ctx->tx_max)) {
 592                dev_dbg(&dev->intf->dev, "Using default transmit modulus: 4 bytes\n");
 593                ctx->tx_modulus = USB_CDC_NCM_NDP_ALIGN_MIN_SIZE;
 594        }
 595
 596        /* verify the payload remainder */
 597        if (ctx->tx_remainder >= ctx->tx_modulus) {
 598                dev_dbg(&dev->intf->dev, "Using default transmit remainder: 0 bytes\n");
 599                ctx->tx_remainder = 0;
 600        }
 601
 602        /* adjust TX-remainder according to NCM specification. */
 603        ctx->tx_remainder = ((ctx->tx_remainder - cdc_ncm_eth_hlen(dev)) &
 604                             (ctx->tx_modulus - 1));
 605}
 606
 607static int cdc_ncm_setup(struct usbnet *dev)
 608{
 609        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 610        u32 def_rx, def_tx;
 611
 612        /* be conservative when selecting intial buffer size to
 613         * increase the number of hosts this will work for
 614         */
 615        def_rx = min_t(u32, CDC_NCM_NTB_DEF_SIZE_RX,
 616                       le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize));
 617        def_tx = min_t(u32, CDC_NCM_NTB_DEF_SIZE_TX,
 618                       le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize));
 619
 620        /* clamp rx_max and tx_max and inform device */
 621        cdc_ncm_update_rxtx_max(dev, def_rx, def_tx);
 622
 623        /* sanitize the modulus and remainder values */
 624        cdc_ncm_fix_modulus(dev);
 625
 626        /* set max datagram size */
 627        cdc_ncm_set_dgram_size(dev, cdc_ncm_max_dgram_size(dev));
 628        return 0;
 629}
 630
 631static void
 632cdc_ncm_find_endpoints(struct usbnet *dev, struct usb_interface *intf)
 633{
 634        struct usb_host_endpoint *e, *in = NULL, *out = NULL;
 635        u8 ep;
 636
 637        for (ep = 0; ep < intf->cur_altsetting->desc.bNumEndpoints; ep++) {
 638
 639                e = intf->cur_altsetting->endpoint + ep;
 640                switch (e->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
 641                case USB_ENDPOINT_XFER_INT:
 642                        if (usb_endpoint_dir_in(&e->desc)) {
 643                                if (!dev->status)
 644                                        dev->status = e;
 645                        }
 646                        break;
 647
 648                case USB_ENDPOINT_XFER_BULK:
 649                        if (usb_endpoint_dir_in(&e->desc)) {
 650                                if (!in)
 651                                        in = e;
 652                        } else {
 653                                if (!out)
 654                                        out = e;
 655                        }
 656                        break;
 657
 658                default:
 659                        break;
 660                }
 661        }
 662        if (in && !dev->in)
 663                dev->in = usb_rcvbulkpipe(dev->udev,
 664                                          in->desc.bEndpointAddress &
 665                                          USB_ENDPOINT_NUMBER_MASK);
 666        if (out && !dev->out)
 667                dev->out = usb_sndbulkpipe(dev->udev,
 668                                           out->desc.bEndpointAddress &
 669                                           USB_ENDPOINT_NUMBER_MASK);
 670}
 671
 672static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)
 673{
 674        if (ctx == NULL)
 675                return;
 676
 677        if (ctx->tx_rem_skb != NULL) {
 678                dev_kfree_skb_any(ctx->tx_rem_skb);
 679                ctx->tx_rem_skb = NULL;
 680        }
 681
 682        if (ctx->tx_curr_skb != NULL) {
 683                dev_kfree_skb_any(ctx->tx_curr_skb);
 684                ctx->tx_curr_skb = NULL;
 685        }
 686
 687        kfree(ctx);
 688}
 689
 690int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting)
 691{
 692        const struct usb_cdc_union_desc *union_desc = NULL;
 693        struct cdc_ncm_ctx *ctx;
 694        struct usb_driver *driver;
 695        u8 *buf;
 696        int len;
 697        int temp;
 698        u8 iface_no;
 699
 700        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
 701        if (!ctx)
 702                return -ENOMEM;
 703
 704        hrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 705        ctx->tx_timer.function = &cdc_ncm_tx_timer_cb;
 706        ctx->bh.data = (unsigned long)dev;
 707        ctx->bh.func = cdc_ncm_txpath_bh;
 708        atomic_set(&ctx->stop, 0);
 709        spin_lock_init(&ctx->mtx);
 710
 711        /* store ctx pointer in device data field */
 712        dev->data[0] = (unsigned long)ctx;
 713
 714        /* only the control interface can be successfully probed */
 715        ctx->control = intf;
 716
 717        /* get some pointers */
 718        driver = driver_of(intf);
 719        buf = intf->cur_altsetting->extra;
 720        len = intf->cur_altsetting->extralen;
 721
 722        /* parse through descriptors associated with control interface */
 723        while ((len > 0) && (buf[0] > 2) && (buf[0] <= len)) {
 724
 725                if (buf[1] != USB_DT_CS_INTERFACE)
 726                        goto advance;
 727
 728                switch (buf[2]) {
 729                case USB_CDC_UNION_TYPE:
 730                        if (buf[0] < sizeof(*union_desc))
 731                                break;
 732
 733                        union_desc = (const struct usb_cdc_union_desc *)buf;
 734                        /* the master must be the interface we are probing */
 735                        if (intf->cur_altsetting->desc.bInterfaceNumber !=
 736                            union_desc->bMasterInterface0) {
 737                                dev_dbg(&intf->dev, "bogus CDC Union\n");
 738                                goto error;
 739                        }
 740                        ctx->data = usb_ifnum_to_if(dev->udev,
 741                                                    union_desc->bSlaveInterface0);
 742                        break;
 743
 744                case USB_CDC_ETHERNET_TYPE:
 745                        if (buf[0] < sizeof(*(ctx->ether_desc)))
 746                                break;
 747
 748                        ctx->ether_desc =
 749                                        (const struct usb_cdc_ether_desc *)buf;
 750                        break;
 751
 752                case USB_CDC_NCM_TYPE:
 753                        if (buf[0] < sizeof(*(ctx->func_desc)))
 754                                break;
 755
 756                        ctx->func_desc = (const struct usb_cdc_ncm_desc *)buf;
 757                        break;
 758
 759                case USB_CDC_MBIM_TYPE:
 760                        if (buf[0] < sizeof(*(ctx->mbim_desc)))
 761                                break;
 762
 763                        ctx->mbim_desc = (const struct usb_cdc_mbim_desc *)buf;
 764                        break;
 765
 766                case USB_CDC_MBIM_EXTENDED_TYPE:
 767                        if (buf[0] < sizeof(*(ctx->mbim_extended_desc)))
 768                                break;
 769
 770                        ctx->mbim_extended_desc =
 771                                (const struct usb_cdc_mbim_extended_desc *)buf;
 772                        break;
 773
 774                default:
 775                        break;
 776                }
 777advance:
 778                /* advance to next descriptor */
 779                temp = buf[0];
 780                buf += temp;
 781                len -= temp;
 782        }
 783
 784        /* some buggy devices have an IAD but no CDC Union */
 785        if (!union_desc && intf->intf_assoc && intf->intf_assoc->bInterfaceCount == 2) {
 786                ctx->data = usb_ifnum_to_if(dev->udev, intf->cur_altsetting->desc.bInterfaceNumber + 1);
 787                dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n");
 788        }
 789
 790        /* check if we got everything */
 791        if (!ctx->data) {
 792                dev_dbg(&intf->dev, "CDC Union missing and no IAD found\n");
 793                goto error;
 794        }
 795        if (cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) {
 796                if (!ctx->mbim_desc) {
 797                        dev_dbg(&intf->dev, "MBIM functional descriptor missing\n");
 798                        goto error;
 799                }
 800        } else {
 801                if (!ctx->ether_desc || !ctx->func_desc) {
 802                        dev_dbg(&intf->dev, "NCM or ECM functional descriptors missing\n");
 803                        goto error;
 804                }
 805        }
 806
 807        /* claim data interface, if different from control */
 808        if (ctx->data != ctx->control) {
 809                temp = usb_driver_claim_interface(driver, ctx->data, dev);
 810                if (temp) {
 811                        dev_dbg(&intf->dev, "failed to claim data intf\n");
 812                        goto error;
 813                }
 814        }
 815
 816        iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;
 817
 818        /* reset data interface */
 819        temp = usb_set_interface(dev->udev, iface_no, 0);
 820        if (temp) {
 821                dev_dbg(&intf->dev, "set interface failed\n");
 822                goto error2;
 823        }
 824
 825        /* initialize basic device settings */
 826        if (cdc_ncm_init(dev))
 827                goto error2;
 828
 829        /* configure data interface */
 830        temp = usb_set_interface(dev->udev, iface_no, data_altsetting);
 831        if (temp) {
 832                dev_dbg(&intf->dev, "set interface failed\n");
 833                goto error2;
 834        }
 835
 836        cdc_ncm_find_endpoints(dev, ctx->data);
 837        cdc_ncm_find_endpoints(dev, ctx->control);
 838        if (!dev->in || !dev->out || !dev->status) {
 839                dev_dbg(&intf->dev, "failed to collect endpoints\n");
 840                goto error2;
 841        }
 842
 843        usb_set_intfdata(ctx->data, dev);
 844        usb_set_intfdata(ctx->control, dev);
 845
 846        if (ctx->ether_desc) {
 847                temp = usbnet_get_ethernet_addr(dev, ctx->ether_desc->iMACAddress);
 848                if (temp) {
 849                        dev_dbg(&intf->dev, "failed to get mac address\n");
 850                        goto error2;
 851                }
 852                dev_info(&intf->dev, "MAC-Address: %pM\n", dev->net->dev_addr);
 853        }
 854
 855        /* finish setting up the device specific data */
 856        cdc_ncm_setup(dev);
 857
 858        /* override ethtool_ops */
 859        dev->net->ethtool_ops = &cdc_ncm_ethtool_ops;
 860
 861        /* add our sysfs attrs */
 862        dev->net->sysfs_groups[0] = &cdc_ncm_sysfs_attr_group;
 863
 864        return 0;
 865
 866error2:
 867        usb_set_intfdata(ctx->control, NULL);
 868        usb_set_intfdata(ctx->data, NULL);
 869        if (ctx->data != ctx->control)
 870                usb_driver_release_interface(driver, ctx->data);
 871error:
 872        cdc_ncm_free((struct cdc_ncm_ctx *)dev->data[0]);
 873        dev->data[0] = 0;
 874        dev_info(&intf->dev, "bind() failure\n");
 875        return -ENODEV;
 876}
 877EXPORT_SYMBOL_GPL(cdc_ncm_bind_common);
 878
 879void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)
 880{
 881        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
 882        struct usb_driver *driver = driver_of(intf);
 883
 884        if (ctx == NULL)
 885                return;         /* no setup */
 886
 887        atomic_set(&ctx->stop, 1);
 888
 889        if (hrtimer_active(&ctx->tx_timer))
 890                hrtimer_cancel(&ctx->tx_timer);
 891
 892        tasklet_kill(&ctx->bh);
 893
 894        /* handle devices with combined control and data interface */
 895        if (ctx->control == ctx->data)
 896                ctx->data = NULL;
 897
 898        /* disconnect master --> disconnect slave */
 899        if (intf == ctx->control && ctx->data) {
 900                usb_set_intfdata(ctx->data, NULL);
 901                usb_driver_release_interface(driver, ctx->data);
 902                ctx->data = NULL;
 903
 904        } else if (intf == ctx->data && ctx->control) {
 905                usb_set_intfdata(ctx->control, NULL);
 906                usb_driver_release_interface(driver, ctx->control);
 907                ctx->control = NULL;
 908        }
 909
 910        usb_set_intfdata(intf, NULL);
 911        cdc_ncm_free(ctx);
 912}
 913EXPORT_SYMBOL_GPL(cdc_ncm_unbind);
 914
 915/* Return the number of the MBIM control interface altsetting iff it
 916 * is preferred and available,
 917 */
 918u8 cdc_ncm_select_altsetting(struct usb_interface *intf)
 919{
 920        struct usb_host_interface *alt;
 921
 922        /* The MBIM spec defines a NCM compatible default altsetting,
 923         * which we may have matched:
 924         *
 925         *  "Functions that implement both NCM 1.0 and MBIM (an
 926         *   “NCM/MBIM function”) according to this recommendation
 927         *   shall provide two alternate settings for the
 928         *   Communication Interface.  Alternate setting 0, and the
 929         *   associated class and endpoint descriptors, shall be
 930         *   constructed according to the rules given for the
 931         *   Communication Interface in section 5 of [USBNCM10].
 932         *   Alternate setting 1, and the associated class and
 933         *   endpoint descriptors, shall be constructed according to
 934         *   the rules given in section 6 (USB Device Model) of this
 935         *   specification."
 936         */
 937        if (intf->num_altsetting < 2)
 938                return intf->cur_altsetting->desc.bAlternateSetting;
 939
 940        if (prefer_mbim) {
 941                alt = usb_altnum_to_altsetting(intf, CDC_NCM_COMM_ALTSETTING_MBIM);
 942                if (alt && cdc_ncm_comm_intf_is_mbim(alt))
 943                        return CDC_NCM_COMM_ALTSETTING_MBIM;
 944        }
 945        return CDC_NCM_COMM_ALTSETTING_NCM;
 946}
 947EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting);
 948
 949static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
 950{
 951        int ret;
 952
 953        /* MBIM backwards compatible function? */
 954        if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM)
 955                return -ENODEV;
 956
 957        /* The NCM data altsetting is fixed */
 958        ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM);
 959
 960        /*
 961         * We should get an event when network connection is "connected" or
 962         * "disconnected". Set network connection in "disconnected" state
 963         * (carrier is OFF) during attach, so the IP network stack does not
 964         * start IPv6 negotiation and more.
 965         */
 966        usbnet_link_change(dev, 0, 0);
 967        return ret;
 968}
 969
 970static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max)
 971{
 972        size_t align = ALIGN(skb->len, modulus) - skb->len + remainder;
 973
 974        if (skb->len + align > max)
 975                align = max - skb->len;
 976        if (align && skb_tailroom(skb) >= align)
 977                memset(skb_put(skb, align), 0, align);
 978}
 979
 980/* return a pointer to a valid struct usb_cdc_ncm_ndp16 of type sign, possibly
 981 * allocating a new one within skb
 982 */
 983static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign, size_t reserve)
 984{
 985        struct usb_cdc_ncm_ndp16 *ndp16 = NULL;
 986        struct usb_cdc_ncm_nth16 *nth16 = (void *)skb->data;
 987        size_t ndpoffset = le16_to_cpu(nth16->wNdpIndex);
 988
 989        /* follow the chain of NDPs, looking for a match */
 990        while (ndpoffset) {
 991                ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset);
 992                if  (ndp16->dwSignature == sign)
 993                        return ndp16;
 994                ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);
 995        }
 996
 997        /* align new NDP */
 998        cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_max);
 999
1000        /* verify that there is room for the NDP and the datagram (reserve) */
1001        if ((ctx->tx_max - skb->len - reserve) < ctx->max_ndp_size)
1002                return NULL;
1003
1004        /* link to it */
1005        if (ndp16)
1006                ndp16->wNextNdpIndex = cpu_to_le16(skb->len);
1007        else
1008                nth16->wNdpIndex = cpu_to_le16(skb->len);
1009
1010        /* push a new empty NDP */
1011        ndp16 = (struct usb_cdc_ncm_ndp16 *)memset(skb_put(skb, ctx->max_ndp_size), 0, ctx->max_ndp_size);
1012        ndp16->dwSignature = sign;
1013        ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16));
1014        return ndp16;
1015}
1016
1017struct sk_buff *
1018cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
1019{
1020        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1021        struct usb_cdc_ncm_nth16 *nth16;
1022        struct usb_cdc_ncm_ndp16 *ndp16;
1023        struct sk_buff *skb_out;
1024        u16 n = 0, index, ndplen;
1025        u8 ready2send = 0;
1026
1027        /* if there is a remaining skb, it gets priority */
1028        if (skb != NULL) {
1029                swap(skb, ctx->tx_rem_skb);
1030                swap(sign, ctx->tx_rem_sign);
1031        } else {
1032                ready2send = 1;
1033        }
1034
1035        /* check if we are resuming an OUT skb */
1036        skb_out = ctx->tx_curr_skb;
1037
1038        /* allocate a new OUT skb */
1039        if (!skb_out) {
1040                skb_out = alloc_skb(ctx->tx_max, GFP_ATOMIC);
1041                if (skb_out == NULL) {
1042                        if (skb != NULL) {
1043                                dev_kfree_skb_any(skb);
1044                                dev->net->stats.tx_dropped++;
1045                        }
1046                        goto exit_no_skb;
1047                }
1048                /* fill out the initial 16-bit NTB header */
1049                nth16 = (struct usb_cdc_ncm_nth16 *)memset(skb_put(skb_out, sizeof(struct usb_cdc_ncm_nth16)), 0, sizeof(struct usb_cdc_ncm_nth16));
1050                nth16->dwSignature = cpu_to_le32(USB_CDC_NCM_NTH16_SIGN);
1051                nth16->wHeaderLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16));
1052                nth16->wSequence = cpu_to_le16(ctx->tx_seq++);
1053
1054                /* count total number of frames in this NTB */
1055                ctx->tx_curr_frame_num = 0;
1056
1057                /* recent payload counter for this skb_out */
1058                ctx->tx_curr_frame_payload = 0;
1059        }
1060
1061        for (n = ctx->tx_curr_frame_num; n < ctx->tx_max_datagrams; n++) {
1062                /* send any remaining skb first */
1063                if (skb == NULL) {
1064                        skb = ctx->tx_rem_skb;
1065                        sign = ctx->tx_rem_sign;
1066                        ctx->tx_rem_skb = NULL;
1067
1068                        /* check for end of skb */
1069                        if (skb == NULL)
1070                                break;
1071                }
1072
1073                /* get the appropriate NDP for this skb */
1074                ndp16 = cdc_ncm_ndp(ctx, skb_out, sign, skb->len + ctx->tx_modulus + ctx->tx_remainder);
1075
1076                /* align beginning of next frame */
1077                cdc_ncm_align_tail(skb_out,  ctx->tx_modulus, ctx->tx_remainder, ctx->tx_max);
1078
1079                /* check if we had enough room left for both NDP and frame */
1080                if (!ndp16 || skb_out->len + skb->len > ctx->tx_max) {
1081                        if (n == 0) {
1082                                /* won't fit, MTU problem? */
1083                                dev_kfree_skb_any(skb);
1084                                skb = NULL;
1085                                dev->net->stats.tx_dropped++;
1086                        } else {
1087                                /* no room for skb - store for later */
1088                                if (ctx->tx_rem_skb != NULL) {
1089                                        dev_kfree_skb_any(ctx->tx_rem_skb);
1090                                        dev->net->stats.tx_dropped++;
1091                                }
1092                                ctx->tx_rem_skb = skb;
1093                                ctx->tx_rem_sign = sign;
1094                                skb = NULL;
1095                                ready2send = 1;
1096                                ctx->tx_reason_ntb_full++;      /* count reason for transmitting */
1097                        }
1098                        break;
1099                }
1100
1101                /* calculate frame number withing this NDP */
1102                ndplen = le16_to_cpu(ndp16->wLength);
1103                index = (ndplen - sizeof(struct usb_cdc_ncm_ndp16)) / sizeof(struct usb_cdc_ncm_dpe16) - 1;
1104
1105                /* OK, add this skb */
1106                ndp16->dpe16[index].wDatagramLength = cpu_to_le16(skb->len);
1107                ndp16->dpe16[index].wDatagramIndex = cpu_to_le16(skb_out->len);
1108                ndp16->wLength = cpu_to_le16(ndplen + sizeof(struct usb_cdc_ncm_dpe16));
1109                memcpy(skb_put(skb_out, skb->len), skb->data, skb->len);
1110                ctx->tx_curr_frame_payload += skb->len; /* count real tx payload data */
1111                dev_kfree_skb_any(skb);
1112                skb = NULL;
1113
1114                /* send now if this NDP is full */
1115                if (index >= CDC_NCM_DPT_DATAGRAMS_MAX) {
1116                        ready2send = 1;
1117                        ctx->tx_reason_ndp_full++;      /* count reason for transmitting */
1118                        break;
1119                }
1120        }
1121
1122        /* free up any dangling skb */
1123        if (skb != NULL) {
1124                dev_kfree_skb_any(skb);
1125                skb = NULL;
1126                dev->net->stats.tx_dropped++;
1127        }
1128
1129        ctx->tx_curr_frame_num = n;
1130
1131        if (n == 0) {
1132                /* wait for more frames */
1133                /* push variables */
1134                ctx->tx_curr_skb = skb_out;
1135                goto exit_no_skb;
1136
1137        } else if ((n < ctx->tx_max_datagrams) && (ready2send == 0) && (ctx->timer_interval > 0)) {
1138                /* wait for more frames */
1139                /* push variables */
1140                ctx->tx_curr_skb = skb_out;
1141                /* set the pending count */
1142                if (n < CDC_NCM_RESTART_TIMER_DATAGRAM_CNT)
1143                        ctx->tx_timer_pending = CDC_NCM_TIMER_PENDING_CNT;
1144                goto exit_no_skb;
1145
1146        } else {
1147                if (n == ctx->tx_max_datagrams)
1148                        ctx->tx_reason_max_datagram++;  /* count reason for transmitting */
1149                /* frame goes out */
1150                /* variables will be reset at next call */
1151        }
1152
1153        /* If collected data size is less or equal ctx->min_tx_pkt
1154         * bytes, we send buffers as it is. If we get more data, it
1155         * would be more efficient for USB HS mobile device with DMA
1156         * engine to receive a full size NTB, than canceling DMA
1157         * transfer and receiving a short packet.
1158         *
1159         * This optimization support is pointless if we end up sending
1160         * a ZLP after full sized NTBs.
1161         */
1162        if (!(dev->driver_info->flags & FLAG_SEND_ZLP) &&
1163            skb_out->len > ctx->min_tx_pkt)
1164                memset(skb_put(skb_out, ctx->tx_max - skb_out->len), 0,
1165                       ctx->tx_max - skb_out->len);
1166        else if (skb_out->len < ctx->tx_max && (skb_out->len % dev->maxpacket) == 0)
1167                *skb_put(skb_out, 1) = 0;       /* force short packet */
1168
1169        /* set final frame length */
1170        nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
1171        nth16->wBlockLength = cpu_to_le16(skb_out->len);
1172
1173        /* return skb */
1174        ctx->tx_curr_skb = NULL;
1175        dev->net->stats.tx_packets += ctx->tx_curr_frame_num;
1176
1177        /* keep private stats: framing overhead and number of NTBs */
1178        ctx->tx_overhead += skb_out->len - ctx->tx_curr_frame_payload;
1179        ctx->tx_ntbs++;
1180
1181        /* usbnet has already counted all the framing overhead.
1182         * Adjust the stats so that the tx_bytes counter show real
1183         * payload data instead.
1184         */
1185        dev->net->stats.tx_bytes -= skb_out->len - ctx->tx_curr_frame_payload;
1186
1187        return skb_out;
1188
1189exit_no_skb:
1190        /* Start timer, if there is a remaining non-empty skb */
1191        if (ctx->tx_curr_skb != NULL && n > 0)
1192                cdc_ncm_tx_timeout_start(ctx);
1193        return NULL;
1194}
1195EXPORT_SYMBOL_GPL(cdc_ncm_fill_tx_frame);
1196
1197static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx)
1198{
1199        /* start timer, if not already started */
1200        if (!(hrtimer_active(&ctx->tx_timer) || atomic_read(&ctx->stop)))
1201                hrtimer_start(&ctx->tx_timer,
1202                                ktime_set(0, ctx->timer_interval),
1203                                HRTIMER_MODE_REL);
1204}
1205
1206static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer)
1207{
1208        struct cdc_ncm_ctx *ctx =
1209                        container_of(timer, struct cdc_ncm_ctx, tx_timer);
1210
1211        if (!atomic_read(&ctx->stop))
1212                tasklet_schedule(&ctx->bh);
1213        return HRTIMER_NORESTART;
1214}
1215
1216static void cdc_ncm_txpath_bh(unsigned long param)
1217{
1218        struct usbnet *dev = (struct usbnet *)param;
1219        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1220
1221        spin_lock_bh(&ctx->mtx);
1222        if (ctx->tx_timer_pending != 0) {
1223                ctx->tx_timer_pending--;
1224                cdc_ncm_tx_timeout_start(ctx);
1225                spin_unlock_bh(&ctx->mtx);
1226        } else if (dev->net != NULL) {
1227                ctx->tx_reason_timeout++;       /* count reason for transmitting */
1228                spin_unlock_bh(&ctx->mtx);
1229                netif_tx_lock_bh(dev->net);
1230                usbnet_start_xmit(NULL, dev->net);
1231                netif_tx_unlock_bh(dev->net);
1232        } else {
1233                spin_unlock_bh(&ctx->mtx);
1234        }
1235}
1236
1237struct sk_buff *
1238cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
1239{
1240        struct sk_buff *skb_out;
1241        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1242
1243        /*
1244         * The Ethernet API we are using does not support transmitting
1245         * multiple Ethernet frames in a single call. This driver will
1246         * accumulate multiple Ethernet frames and send out a larger
1247         * USB frame when the USB buffer is full or when a single jiffies
1248         * timeout happens.
1249         */
1250        if (ctx == NULL)
1251                goto error;
1252
1253        spin_lock_bh(&ctx->mtx);
1254        skb_out = cdc_ncm_fill_tx_frame(dev, skb, cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN));
1255        spin_unlock_bh(&ctx->mtx);
1256        return skb_out;
1257
1258error:
1259        if (skb != NULL)
1260                dev_kfree_skb_any(skb);
1261
1262        return NULL;
1263}
1264EXPORT_SYMBOL_GPL(cdc_ncm_tx_fixup);
1265
1266/* verify NTB header and return offset of first NDP, or negative error */
1267int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in)
1268{
1269        struct usbnet *dev = netdev_priv(skb_in->dev);
1270        struct usb_cdc_ncm_nth16 *nth16;
1271        int len;
1272        int ret = -EINVAL;
1273
1274        if (ctx == NULL)
1275                goto error;
1276
1277        if (skb_in->len < (sizeof(struct usb_cdc_ncm_nth16) +
1278                                        sizeof(struct usb_cdc_ncm_ndp16))) {
1279                netif_dbg(dev, rx_err, dev->net, "frame too short\n");
1280                goto error;
1281        }
1282
1283        nth16 = (struct usb_cdc_ncm_nth16 *)skb_in->data;
1284
1285        if (nth16->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH16_SIGN)) {
1286                netif_dbg(dev, rx_err, dev->net,
1287                          "invalid NTH16 signature <%#010x>\n",
1288                          le32_to_cpu(nth16->dwSignature));
1289                goto error;
1290        }
1291
1292        len = le16_to_cpu(nth16->wBlockLength);
1293        if (len > ctx->rx_max) {
1294                netif_dbg(dev, rx_err, dev->net,
1295                          "unsupported NTB block length %u/%u\n", len,
1296                          ctx->rx_max);
1297                goto error;
1298        }
1299
1300        if ((ctx->rx_seq + 1) != le16_to_cpu(nth16->wSequence) &&
1301            (ctx->rx_seq || le16_to_cpu(nth16->wSequence)) &&
1302            !((ctx->rx_seq == 0xffff) && !le16_to_cpu(nth16->wSequence))) {
1303                netif_dbg(dev, rx_err, dev->net,
1304                          "sequence number glitch prev=%d curr=%d\n",
1305                          ctx->rx_seq, le16_to_cpu(nth16->wSequence));
1306        }
1307        ctx->rx_seq = le16_to_cpu(nth16->wSequence);
1308
1309        ret = le16_to_cpu(nth16->wNdpIndex);
1310error:
1311        return ret;
1312}
1313EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_nth16);
1314
1315/* verify NDP header and return number of datagrams, or negative error */
1316int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset)
1317{
1318        struct usbnet *dev = netdev_priv(skb_in->dev);
1319        struct usb_cdc_ncm_ndp16 *ndp16;
1320        int ret = -EINVAL;
1321
1322        if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len) {
1323                netif_dbg(dev, rx_err, dev->net, "invalid NDP offset  <%u>\n",
1324                          ndpoffset);
1325                goto error;
1326        }
1327        ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1328
1329        if (le16_to_cpu(ndp16->wLength) < USB_CDC_NCM_NDP16_LENGTH_MIN) {
1330                netif_dbg(dev, rx_err, dev->net, "invalid DPT16 length <%u>\n",
1331                          le16_to_cpu(ndp16->wLength));
1332                goto error;
1333        }
1334
1335        ret = ((le16_to_cpu(ndp16->wLength) -
1336                                        sizeof(struct usb_cdc_ncm_ndp16)) /
1337                                        sizeof(struct usb_cdc_ncm_dpe16));
1338        ret--; /* we process NDP entries except for the last one */
1339
1340        if ((sizeof(struct usb_cdc_ncm_ndp16) +
1341             ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len) {
1342                netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
1343                ret = -EINVAL;
1344        }
1345
1346error:
1347        return ret;
1348}
1349EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_ndp16);
1350
1351int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)
1352{
1353        struct sk_buff *skb;
1354        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1355        int len;
1356        int nframes;
1357        int x;
1358        int offset;
1359        struct usb_cdc_ncm_ndp16 *ndp16;
1360        struct usb_cdc_ncm_dpe16 *dpe16;
1361        int ndpoffset;
1362        int loopcount = 50; /* arbitrary max preventing infinite loop */
1363        u32 payload = 0;
1364
1365        ndpoffset = cdc_ncm_rx_verify_nth16(ctx, skb_in);
1366        if (ndpoffset < 0)
1367                goto error;
1368
1369next_ndp:
1370        nframes = cdc_ncm_rx_verify_ndp16(skb_in, ndpoffset);
1371        if (nframes < 0)
1372                goto error;
1373
1374        ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1375
1376        if (ndp16->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN)) {
1377                netif_dbg(dev, rx_err, dev->net,
1378                          "invalid DPT16 signature <%#010x>\n",
1379                          le32_to_cpu(ndp16->dwSignature));
1380                goto err_ndp;
1381        }
1382        dpe16 = ndp16->dpe16;
1383
1384        for (x = 0; x < nframes; x++, dpe16++) {
1385                offset = le16_to_cpu(dpe16->wDatagramIndex);
1386                len = le16_to_cpu(dpe16->wDatagramLength);
1387
1388                /*
1389                 * CDC NCM ch. 3.7
1390                 * All entries after first NULL entry are to be ignored
1391                 */
1392                if ((offset == 0) || (len == 0)) {
1393                        if (!x)
1394                                goto err_ndp; /* empty NTB */
1395                        break;
1396                }
1397
1398                /* sanity checking */
1399                if (((offset + len) > skb_in->len) ||
1400                                (len > ctx->rx_max) || (len < ETH_HLEN)) {
1401                        netif_dbg(dev, rx_err, dev->net,
1402                                  "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n",
1403                                  x, offset, len, skb_in);
1404                        if (!x)
1405                                goto err_ndp;
1406                        break;
1407
1408                } else {
1409                        /* create a fresh copy to reduce truesize */
1410                        skb = netdev_alloc_skb_ip_align(dev->net,  len);
1411                        if (!skb)
1412                                goto error;
1413                        memcpy(skb_put(skb, len), skb_in->data + offset, len);
1414                        usbnet_skb_return(dev, skb);
1415                        payload += len; /* count payload bytes in this NTB */
1416                }
1417        }
1418err_ndp:
1419        /* are there more NDPs to process? */
1420        ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);
1421        if (ndpoffset && loopcount--)
1422                goto next_ndp;
1423
1424        /* update stats */
1425        ctx->rx_overhead += skb_in->len - payload;
1426        ctx->rx_ntbs++;
1427
1428        return 1;
1429error:
1430        return 0;
1431}
1432EXPORT_SYMBOL_GPL(cdc_ncm_rx_fixup);
1433
1434static void
1435cdc_ncm_speed_change(struct usbnet *dev,
1436                     struct usb_cdc_speed_change *data)
1437{
1438        uint32_t rx_speed = le32_to_cpu(data->DLBitRRate);
1439        uint32_t tx_speed = le32_to_cpu(data->ULBitRate);
1440
1441        /*
1442         * Currently the USB-NET API does not support reporting the actual
1443         * device speed. Do print it instead.
1444         */
1445        if ((tx_speed > 1000000) && (rx_speed > 1000000)) {
1446                netif_info(dev, link, dev->net,
1447                           "%u mbit/s downlink %u mbit/s uplink\n",
1448                           (unsigned int)(rx_speed / 1000000U),
1449                           (unsigned int)(tx_speed / 1000000U));
1450        } else {
1451                netif_info(dev, link, dev->net,
1452                           "%u kbit/s downlink %u kbit/s uplink\n",
1453                           (unsigned int)(rx_speed / 1000U),
1454                           (unsigned int)(tx_speed / 1000U));
1455        }
1456}
1457
1458static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
1459{
1460        struct cdc_ncm_ctx *ctx;
1461        struct usb_cdc_notification *event;
1462
1463        ctx = (struct cdc_ncm_ctx *)dev->data[0];
1464
1465        if (urb->actual_length < sizeof(*event))
1466                return;
1467
1468        /* test for split data in 8-byte chunks */
1469        if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
1470                cdc_ncm_speed_change(dev,
1471                      (struct usb_cdc_speed_change *)urb->transfer_buffer);
1472                return;
1473        }
1474
1475        event = urb->transfer_buffer;
1476
1477        switch (event->bNotificationType) {
1478        case USB_CDC_NOTIFY_NETWORK_CONNECTION:
1479                /*
1480                 * According to the CDC NCM specification ch.7.1
1481                 * USB_CDC_NOTIFY_NETWORK_CONNECTION notification shall be
1482                 * sent by device after USB_CDC_NOTIFY_SPEED_CHANGE.
1483                 */
1484                netif_info(dev, link, dev->net,
1485                           "network connection: %sconnected\n",
1486                           !!event->wValue ? "" : "dis");
1487                usbnet_link_change(dev, !!event->wValue, 0);
1488                break;
1489
1490        case USB_CDC_NOTIFY_SPEED_CHANGE:
1491                if (urb->actual_length < (sizeof(*event) +
1492                                        sizeof(struct usb_cdc_speed_change)))
1493                        set_bit(EVENT_STS_SPLIT, &dev->flags);
1494                else
1495                        cdc_ncm_speed_change(dev,
1496                                             (struct usb_cdc_speed_change *)&event[1]);
1497                break;
1498
1499        default:
1500                dev_dbg(&dev->udev->dev,
1501                        "NCM: unexpected notification 0x%02x!\n",
1502                        event->bNotificationType);
1503                break;
1504        }
1505}
1506
1507static const struct driver_info cdc_ncm_info = {
1508        .description = "CDC NCM",
1509        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET,
1510        .bind = cdc_ncm_bind,
1511        .unbind = cdc_ncm_unbind,
1512        .manage_power = usbnet_manage_power,
1513        .status = cdc_ncm_status,
1514        .rx_fixup = cdc_ncm_rx_fixup,
1515        .tx_fixup = cdc_ncm_tx_fixup,
1516};
1517
1518/* Same as cdc_ncm_info, but with FLAG_WWAN */
1519static const struct driver_info wwan_info = {
1520        .description = "Mobile Broadband Network Device",
1521        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1522                        | FLAG_WWAN,
1523        .bind = cdc_ncm_bind,
1524        .unbind = cdc_ncm_unbind,
1525        .manage_power = usbnet_manage_power,
1526        .status = cdc_ncm_status,
1527        .rx_fixup = cdc_ncm_rx_fixup,
1528        .tx_fixup = cdc_ncm_tx_fixup,
1529};
1530
1531/* Same as wwan_info, but with FLAG_NOARP  */
1532static const struct driver_info wwan_noarp_info = {
1533        .description = "Mobile Broadband Network Device (NO ARP)",
1534        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1535                        | FLAG_WWAN | FLAG_NOARP,
1536        .bind = cdc_ncm_bind,
1537        .unbind = cdc_ncm_unbind,
1538        .manage_power = usbnet_manage_power,
1539        .status = cdc_ncm_status,
1540        .rx_fixup = cdc_ncm_rx_fixup,
1541        .tx_fixup = cdc_ncm_tx_fixup,
1542};
1543
1544static const struct usb_device_id cdc_devs[] = {
1545        /* Ericsson MBM devices like F5521gw */
1546        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1547                | USB_DEVICE_ID_MATCH_VENDOR,
1548          .idVendor = 0x0bdb,
1549          .bInterfaceClass = USB_CLASS_COMM,
1550          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1551          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1552          .driver_info = (unsigned long) &wwan_info,
1553        },
1554
1555        /* Dell branded MBM devices like DW5550 */
1556        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1557                | USB_DEVICE_ID_MATCH_VENDOR,
1558          .idVendor = 0x413c,
1559          .bInterfaceClass = USB_CLASS_COMM,
1560          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1561          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1562          .driver_info = (unsigned long) &wwan_info,
1563        },
1564
1565        /* Toshiba branded MBM devices */
1566        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1567                | USB_DEVICE_ID_MATCH_VENDOR,
1568          .idVendor = 0x0930,
1569          .bInterfaceClass = USB_CLASS_COMM,
1570          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1571          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1572          .driver_info = (unsigned long) &wwan_info,
1573        },
1574
1575        /* tag Huawei devices as wwan */
1576        { USB_VENDOR_AND_INTERFACE_INFO(0x12d1,
1577                                        USB_CLASS_COMM,
1578                                        USB_CDC_SUBCLASS_NCM,
1579                                        USB_CDC_PROTO_NONE),
1580          .driver_info = (unsigned long)&wwan_info,
1581        },
1582
1583        /* Infineon(now Intel) HSPA Modem platform */
1584        { USB_DEVICE_AND_INTERFACE_INFO(0x1519, 0x0443,
1585                USB_CLASS_COMM,
1586                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1587          .driver_info = (unsigned long)&wwan_noarp_info,
1588        },
1589
1590        /* Generic CDC-NCM devices */
1591        { USB_INTERFACE_INFO(USB_CLASS_COMM,
1592                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1593                .driver_info = (unsigned long)&cdc_ncm_info,
1594        },
1595        {
1596        },
1597};
1598MODULE_DEVICE_TABLE(usb, cdc_devs);
1599
1600static struct usb_driver cdc_ncm_driver = {
1601        .name = "cdc_ncm",
1602        .id_table = cdc_devs,
1603        .probe = usbnet_probe,
1604        .disconnect = usbnet_disconnect,
1605        .suspend = usbnet_suspend,
1606        .resume = usbnet_resume,
1607        .reset_resume = usbnet_resume,
1608        .supports_autosuspend = 1,
1609        .disable_hub_initiated_lpm = 1,
1610};
1611
1612module_usb_driver(cdc_ncm_driver);
1613
1614MODULE_AUTHOR("Hans Petter Selasky");
1615MODULE_DESCRIPTION("USB CDC NCM host driver");
1616MODULE_LICENSE("Dual BSD/GPL");
1617