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