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, 0644);
  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, 0644, cdc_ncm_show_min_tx_pkt, cdc_ncm_store_min_tx_pkt);
 285static DEVICE_ATTR(rx_max, 0644, cdc_ncm_show_rx_max, cdc_ncm_store_rx_max);
 286static DEVICE_ATTR(tx_max, 0644, cdc_ncm_show_tx_max, cdc_ncm_store_tx_max);
 287static DEVICE_ATTR(tx_timer_usecs, 0644, 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, 0444, 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 const 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        __le16 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 == cpu_to_le16(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        hrtimer_cancel(&ctx->tx_timer);
 971
 972        tasklet_kill(&ctx->bh);
 973
 974        /* handle devices with combined control and data interface */
 975        if (ctx->control == ctx->data)
 976                ctx->data = NULL;
 977
 978        /* disconnect master --> disconnect slave */
 979        if (intf == ctx->control && ctx->data) {
 980                usb_set_intfdata(ctx->data, NULL);
 981                usb_driver_release_interface(driver, ctx->data);
 982                ctx->data = NULL;
 983
 984        } else if (intf == ctx->data && ctx->control) {
 985                usb_set_intfdata(ctx->control, NULL);
 986                usb_driver_release_interface(driver, ctx->control);
 987                ctx->control = NULL;
 988        }
 989
 990        usb_set_intfdata(intf, NULL);
 991        cdc_ncm_free(ctx);
 992}
 993EXPORT_SYMBOL_GPL(cdc_ncm_unbind);
 994
 995/* Return the number of the MBIM control interface altsetting iff it
 996 * is preferred and available,
 997 */
 998u8 cdc_ncm_select_altsetting(struct usb_interface *intf)
 999{
1000        struct usb_host_interface *alt;
1001
1002        /* The MBIM spec defines a NCM compatible default altsetting,
1003         * which we may have matched:
1004         *
1005         *  "Functions that implement both NCM 1.0 and MBIM (an
1006         *   “NCM/MBIM function”) according to this recommendation
1007         *   shall provide two alternate settings for the
1008         *   Communication Interface.  Alternate setting 0, and the
1009         *   associated class and endpoint descriptors, shall be
1010         *   constructed according to the rules given for the
1011         *   Communication Interface in section 5 of [USBNCM10].
1012         *   Alternate setting 1, and the associated class and
1013         *   endpoint descriptors, shall be constructed according to
1014         *   the rules given in section 6 (USB Device Model) of this
1015         *   specification."
1016         */
1017        if (intf->num_altsetting < 2)
1018                return intf->cur_altsetting->desc.bAlternateSetting;
1019
1020        if (prefer_mbim) {
1021                alt = usb_altnum_to_altsetting(intf, CDC_NCM_COMM_ALTSETTING_MBIM);
1022                if (alt && cdc_ncm_comm_intf_is_mbim(alt))
1023                        return CDC_NCM_COMM_ALTSETTING_MBIM;
1024        }
1025        return CDC_NCM_COMM_ALTSETTING_NCM;
1026}
1027EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting);
1028
1029static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
1030{
1031        /* MBIM backwards compatible function? */
1032        if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM)
1033                return -ENODEV;
1034
1035        /* The NCM data altsetting is fixed, so we hard-coded it.
1036         * Additionally, generic NCM devices are assumed to accept arbitrarily
1037         * placed NDP.
1038         */
1039        return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM, 0);
1040}
1041
1042static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max)
1043{
1044        size_t align = ALIGN(skb->len, modulus) - skb->len + remainder;
1045
1046        if (skb->len + align > max)
1047                align = max - skb->len;
1048        if (align && skb_tailroom(skb) >= align)
1049                skb_put_zero(skb, align);
1050}
1051
1052/* return a pointer to a valid struct usb_cdc_ncm_ndp16 of type sign, possibly
1053 * allocating a new one within skb
1054 */
1055static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign, size_t reserve)
1056{
1057        struct usb_cdc_ncm_ndp16 *ndp16 = NULL;
1058        struct usb_cdc_ncm_nth16 *nth16 = (void *)skb->data;
1059        size_t ndpoffset = le16_to_cpu(nth16->wNdpIndex);
1060
1061        /* If NDP should be moved to the end of the NCM package, we can't follow the
1062        * NTH16 header as we would normally do. NDP isn't written to the SKB yet, and
1063        * the wNdpIndex field in the header is actually not consistent with reality. It will be later.
1064        */
1065        if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
1066                if (ctx->delayed_ndp16->dwSignature == sign)
1067                        return ctx->delayed_ndp16;
1068
1069                /* We can only push a single NDP to the end. Return
1070                 * NULL to send what we've already got and queue this
1071                 * skb for later.
1072                 */
1073                else if (ctx->delayed_ndp16->dwSignature)
1074                        return NULL;
1075        }
1076
1077        /* follow the chain of NDPs, looking for a match */
1078        while (ndpoffset) {
1079                ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset);
1080                if  (ndp16->dwSignature == sign)
1081                        return ndp16;
1082                ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);
1083        }
1084
1085        /* align new NDP */
1086        if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1087                cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size);
1088
1089        /* verify that there is room for the NDP and the datagram (reserve) */
1090        if ((ctx->tx_curr_size - skb->len - reserve) < ctx->max_ndp_size)
1091                return NULL;
1092
1093        /* link to it */
1094        if (ndp16)
1095                ndp16->wNextNdpIndex = cpu_to_le16(skb->len);
1096        else
1097                nth16->wNdpIndex = cpu_to_le16(skb->len);
1098
1099        /* push a new empty NDP */
1100        if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1101                ndp16 = skb_put_zero(skb, ctx->max_ndp_size);
1102        else
1103                ndp16 = ctx->delayed_ndp16;
1104
1105        ndp16->dwSignature = sign;
1106        ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16));
1107        return ndp16;
1108}
1109
1110struct sk_buff *
1111cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
1112{
1113        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1114        struct usb_cdc_ncm_nth16 *nth16;
1115        struct usb_cdc_ncm_ndp16 *ndp16;
1116        struct sk_buff *skb_out;
1117        u16 n = 0, index, ndplen;
1118        u8 ready2send = 0;
1119        u32 delayed_ndp_size;
1120        size_t padding_count;
1121
1122        /* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated
1123         * accordingly. Otherwise, we should check here.
1124         */
1125        if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END)
1126                delayed_ndp_size = ALIGN(ctx->max_ndp_size, ctx->tx_ndp_modulus);
1127        else
1128                delayed_ndp_size = 0;
1129
1130        /* if there is a remaining skb, it gets priority */
1131        if (skb != NULL) {
1132                swap(skb, ctx->tx_rem_skb);
1133                swap(sign, ctx->tx_rem_sign);
1134        } else {
1135                ready2send = 1;
1136        }
1137
1138        /* check if we are resuming an OUT skb */
1139        skb_out = ctx->tx_curr_skb;
1140
1141        /* allocate a new OUT skb */
1142        if (!skb_out) {
1143                if (ctx->tx_low_mem_val == 0) {
1144                        ctx->tx_curr_size = ctx->tx_max;
1145                        skb_out = alloc_skb(ctx->tx_curr_size, GFP_ATOMIC);
1146                        /* If the memory allocation fails we will wait longer
1147                         * each time before attempting another full size
1148                         * allocation again to not overload the system
1149                         * further.
1150                         */
1151                        if (skb_out == NULL) {
1152                                ctx->tx_low_mem_max_cnt = min(ctx->tx_low_mem_max_cnt + 1,
1153                                                              (unsigned)CDC_NCM_LOW_MEM_MAX_CNT);
1154                                ctx->tx_low_mem_val = ctx->tx_low_mem_max_cnt;
1155                        }
1156                }
1157                if (skb_out == NULL) {
1158                        /* See if a very small allocation is possible.
1159                         * We will send this packet immediately and hope
1160                         * that there is more memory available later.
1161                         */
1162                        if (skb)
1163                                ctx->tx_curr_size = max(skb->len,
1164                                        (u32)USB_CDC_NCM_NTB_MIN_OUT_SIZE);
1165                        else
1166                                ctx->tx_curr_size = USB_CDC_NCM_NTB_MIN_OUT_SIZE;
1167                        skb_out = alloc_skb(ctx->tx_curr_size, GFP_ATOMIC);
1168
1169                        /* No allocation possible so we will abort */
1170                        if (skb_out == NULL) {
1171                                if (skb != NULL) {
1172                                        dev_kfree_skb_any(skb);
1173                                        dev->net->stats.tx_dropped++;
1174                                }
1175                                goto exit_no_skb;
1176                        }
1177                        ctx->tx_low_mem_val--;
1178                }
1179                /* fill out the initial 16-bit NTB header */
1180                nth16 = skb_put_zero(skb_out, sizeof(struct usb_cdc_ncm_nth16));
1181                nth16->dwSignature = cpu_to_le32(USB_CDC_NCM_NTH16_SIGN);
1182                nth16->wHeaderLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16));
1183                nth16->wSequence = cpu_to_le16(ctx->tx_seq++);
1184
1185                /* count total number of frames in this NTB */
1186                ctx->tx_curr_frame_num = 0;
1187
1188                /* recent payload counter for this skb_out */
1189                ctx->tx_curr_frame_payload = 0;
1190        }
1191
1192        for (n = ctx->tx_curr_frame_num; n < ctx->tx_max_datagrams; n++) {
1193                /* send any remaining skb first */
1194                if (skb == NULL) {
1195                        skb = ctx->tx_rem_skb;
1196                        sign = ctx->tx_rem_sign;
1197                        ctx->tx_rem_skb = NULL;
1198
1199                        /* check for end of skb */
1200                        if (skb == NULL)
1201                                break;
1202                }
1203
1204                /* get the appropriate NDP for this skb */
1205                ndp16 = cdc_ncm_ndp(ctx, skb_out, sign, skb->len + ctx->tx_modulus + ctx->tx_remainder);
1206
1207                /* align beginning of next frame */
1208                cdc_ncm_align_tail(skb_out,  ctx->tx_modulus, ctx->tx_remainder, ctx->tx_curr_size);
1209
1210                /* check if we had enough room left for both NDP and frame */
1211                if (!ndp16 || skb_out->len + skb->len + delayed_ndp_size > ctx->tx_curr_size) {
1212                        if (n == 0) {
1213                                /* won't fit, MTU problem? */
1214                                dev_kfree_skb_any(skb);
1215                                skb = NULL;
1216                                dev->net->stats.tx_dropped++;
1217                        } else {
1218                                /* no room for skb - store for later */
1219                                if (ctx->tx_rem_skb != NULL) {
1220                                        dev_kfree_skb_any(ctx->tx_rem_skb);
1221                                        dev->net->stats.tx_dropped++;
1222                                }
1223                                ctx->tx_rem_skb = skb;
1224                                ctx->tx_rem_sign = sign;
1225                                skb = NULL;
1226                                ready2send = 1;
1227                                ctx->tx_reason_ntb_full++;      /* count reason for transmitting */
1228                        }
1229                        break;
1230                }
1231
1232                /* calculate frame number withing this NDP */
1233                ndplen = le16_to_cpu(ndp16->wLength);
1234                index = (ndplen - sizeof(struct usb_cdc_ncm_ndp16)) / sizeof(struct usb_cdc_ncm_dpe16) - 1;
1235
1236                /* OK, add this skb */
1237                ndp16->dpe16[index].wDatagramLength = cpu_to_le16(skb->len);
1238                ndp16->dpe16[index].wDatagramIndex = cpu_to_le16(skb_out->len);
1239                ndp16->wLength = cpu_to_le16(ndplen + sizeof(struct usb_cdc_ncm_dpe16));
1240                skb_put_data(skb_out, skb->data, skb->len);
1241                ctx->tx_curr_frame_payload += skb->len; /* count real tx payload data */
1242                dev_kfree_skb_any(skb);
1243                skb = NULL;
1244
1245                /* send now if this NDP is full */
1246                if (index >= CDC_NCM_DPT_DATAGRAMS_MAX) {
1247                        ready2send = 1;
1248                        ctx->tx_reason_ndp_full++;      /* count reason for transmitting */
1249                        break;
1250                }
1251        }
1252
1253        /* free up any dangling skb */
1254        if (skb != NULL) {
1255                dev_kfree_skb_any(skb);
1256                skb = NULL;
1257                dev->net->stats.tx_dropped++;
1258        }
1259
1260        ctx->tx_curr_frame_num = n;
1261
1262        if (n == 0) {
1263                /* wait for more frames */
1264                /* push variables */
1265                ctx->tx_curr_skb = skb_out;
1266                goto exit_no_skb;
1267
1268        } else if ((n < ctx->tx_max_datagrams) && (ready2send == 0) && (ctx->timer_interval > 0)) {
1269                /* wait for more frames */
1270                /* push variables */
1271                ctx->tx_curr_skb = skb_out;
1272                /* set the pending count */
1273                if (n < CDC_NCM_RESTART_TIMER_DATAGRAM_CNT)
1274                        ctx->tx_timer_pending = CDC_NCM_TIMER_PENDING_CNT;
1275                goto exit_no_skb;
1276
1277        } else {
1278                if (n == ctx->tx_max_datagrams)
1279                        ctx->tx_reason_max_datagram++;  /* count reason for transmitting */
1280                /* frame goes out */
1281                /* variables will be reset at next call */
1282        }
1283
1284        /* If requested, put NDP at end of frame. */
1285        if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
1286                nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
1287                cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size - ctx->max_ndp_size);
1288                nth16->wNdpIndex = cpu_to_le16(skb_out->len);
1289                skb_put_data(skb_out, ctx->delayed_ndp16, ctx->max_ndp_size);
1290
1291                /* Zero out delayed NDP - signature checking will naturally fail. */
1292                ndp16 = memset(ctx->delayed_ndp16, 0, ctx->max_ndp_size);
1293        }
1294
1295        /* If collected data size is less or equal ctx->min_tx_pkt
1296         * bytes, we send buffers as it is. If we get more data, it
1297         * would be more efficient for USB HS mobile device with DMA
1298         * engine to receive a full size NTB, than canceling DMA
1299         * transfer and receiving a short packet.
1300         *
1301         * This optimization support is pointless if we end up sending
1302         * a ZLP after full sized NTBs.
1303         */
1304        if (!(dev->driver_info->flags & FLAG_SEND_ZLP) &&
1305            skb_out->len > ctx->min_tx_pkt) {
1306                padding_count = ctx->tx_curr_size - skb_out->len;
1307                skb_put_zero(skb_out, padding_count);
1308        } else if (skb_out->len < ctx->tx_curr_size &&
1309                   (skb_out->len % dev->maxpacket) == 0) {
1310                skb_put_u8(skb_out, 0); /* force short packet */
1311        }
1312
1313        /* set final frame length */
1314        nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
1315        nth16->wBlockLength = cpu_to_le16(skb_out->len);
1316
1317        /* return skb */
1318        ctx->tx_curr_skb = NULL;
1319
1320        /* keep private stats: framing overhead and number of NTBs */
1321        ctx->tx_overhead += skb_out->len - ctx->tx_curr_frame_payload;
1322        ctx->tx_ntbs++;
1323
1324        /* usbnet will count all the framing overhead by default.
1325         * Adjust the stats so that the tx_bytes counter show real
1326         * payload data instead.
1327         */
1328        usbnet_set_skb_tx_stats(skb_out, n,
1329                                (long)ctx->tx_curr_frame_payload - skb_out->len);
1330
1331        return skb_out;
1332
1333exit_no_skb:
1334        /* Start timer, if there is a remaining non-empty skb */
1335        if (ctx->tx_curr_skb != NULL && n > 0)
1336                cdc_ncm_tx_timeout_start(ctx);
1337        return NULL;
1338}
1339EXPORT_SYMBOL_GPL(cdc_ncm_fill_tx_frame);
1340
1341static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx)
1342{
1343        /* start timer, if not already started */
1344        if (!(hrtimer_active(&ctx->tx_timer) || atomic_read(&ctx->stop)))
1345                hrtimer_start(&ctx->tx_timer,
1346                                ctx->timer_interval,
1347                                HRTIMER_MODE_REL);
1348}
1349
1350static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer)
1351{
1352        struct cdc_ncm_ctx *ctx =
1353                        container_of(timer, struct cdc_ncm_ctx, tx_timer);
1354
1355        if (!atomic_read(&ctx->stop))
1356                tasklet_schedule(&ctx->bh);
1357        return HRTIMER_NORESTART;
1358}
1359
1360static void cdc_ncm_txpath_bh(unsigned long param)
1361{
1362        struct usbnet *dev = (struct usbnet *)param;
1363        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1364
1365        spin_lock_bh(&ctx->mtx);
1366        if (ctx->tx_timer_pending != 0) {
1367                ctx->tx_timer_pending--;
1368                cdc_ncm_tx_timeout_start(ctx);
1369                spin_unlock_bh(&ctx->mtx);
1370        } else if (dev->net != NULL) {
1371                ctx->tx_reason_timeout++;       /* count reason for transmitting */
1372                spin_unlock_bh(&ctx->mtx);
1373                netif_tx_lock_bh(dev->net);
1374                usbnet_start_xmit(NULL, dev->net);
1375                netif_tx_unlock_bh(dev->net);
1376        } else {
1377                spin_unlock_bh(&ctx->mtx);
1378        }
1379}
1380
1381struct sk_buff *
1382cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
1383{
1384        struct sk_buff *skb_out;
1385        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1386
1387        /*
1388         * The Ethernet API we are using does not support transmitting
1389         * multiple Ethernet frames in a single call. This driver will
1390         * accumulate multiple Ethernet frames and send out a larger
1391         * USB frame when the USB buffer is full or when a single jiffies
1392         * timeout happens.
1393         */
1394        if (ctx == NULL)
1395                goto error;
1396
1397        spin_lock_bh(&ctx->mtx);
1398        skb_out = cdc_ncm_fill_tx_frame(dev, skb, cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN));
1399        spin_unlock_bh(&ctx->mtx);
1400        return skb_out;
1401
1402error:
1403        if (skb != NULL)
1404                dev_kfree_skb_any(skb);
1405
1406        return NULL;
1407}
1408EXPORT_SYMBOL_GPL(cdc_ncm_tx_fixup);
1409
1410/* verify NTB header and return offset of first NDP, or negative error */
1411int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in)
1412{
1413        struct usbnet *dev = netdev_priv(skb_in->dev);
1414        struct usb_cdc_ncm_nth16 *nth16;
1415        int len;
1416        int ret = -EINVAL;
1417
1418        if (ctx == NULL)
1419                goto error;
1420
1421        if (skb_in->len < (sizeof(struct usb_cdc_ncm_nth16) +
1422                                        sizeof(struct usb_cdc_ncm_ndp16))) {
1423                netif_dbg(dev, rx_err, dev->net, "frame too short\n");
1424                goto error;
1425        }
1426
1427        nth16 = (struct usb_cdc_ncm_nth16 *)skb_in->data;
1428
1429        if (nth16->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH16_SIGN)) {
1430                netif_dbg(dev, rx_err, dev->net,
1431                          "invalid NTH16 signature <%#010x>\n",
1432                          le32_to_cpu(nth16->dwSignature));
1433                goto error;
1434        }
1435
1436        len = le16_to_cpu(nth16->wBlockLength);
1437        if (len > ctx->rx_max) {
1438                netif_dbg(dev, rx_err, dev->net,
1439                          "unsupported NTB block length %u/%u\n", len,
1440                          ctx->rx_max);
1441                goto error;
1442        }
1443
1444        if ((ctx->rx_seq + 1) != le16_to_cpu(nth16->wSequence) &&
1445            (ctx->rx_seq || le16_to_cpu(nth16->wSequence)) &&
1446            !((ctx->rx_seq == 0xffff) && !le16_to_cpu(nth16->wSequence))) {
1447                netif_dbg(dev, rx_err, dev->net,
1448                          "sequence number glitch prev=%d curr=%d\n",
1449                          ctx->rx_seq, le16_to_cpu(nth16->wSequence));
1450        }
1451        ctx->rx_seq = le16_to_cpu(nth16->wSequence);
1452
1453        ret = le16_to_cpu(nth16->wNdpIndex);
1454error:
1455        return ret;
1456}
1457EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_nth16);
1458
1459/* verify NDP header and return number of datagrams, or negative error */
1460int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset)
1461{
1462        struct usbnet *dev = netdev_priv(skb_in->dev);
1463        struct usb_cdc_ncm_ndp16 *ndp16;
1464        int ret = -EINVAL;
1465
1466        if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len) {
1467                netif_dbg(dev, rx_err, dev->net, "invalid NDP offset  <%u>\n",
1468                          ndpoffset);
1469                goto error;
1470        }
1471        ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1472
1473        if (le16_to_cpu(ndp16->wLength) < USB_CDC_NCM_NDP16_LENGTH_MIN) {
1474                netif_dbg(dev, rx_err, dev->net, "invalid DPT16 length <%u>\n",
1475                          le16_to_cpu(ndp16->wLength));
1476                goto error;
1477        }
1478
1479        ret = ((le16_to_cpu(ndp16->wLength) -
1480                                        sizeof(struct usb_cdc_ncm_ndp16)) /
1481                                        sizeof(struct usb_cdc_ncm_dpe16));
1482        ret--; /* we process NDP entries except for the last one */
1483
1484        if ((sizeof(struct usb_cdc_ncm_ndp16) +
1485             ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len) {
1486                netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
1487                ret = -EINVAL;
1488        }
1489
1490error:
1491        return ret;
1492}
1493EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_ndp16);
1494
1495int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)
1496{
1497        struct sk_buff *skb;
1498        struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1499        int len;
1500        int nframes;
1501        int x;
1502        int offset;
1503        struct usb_cdc_ncm_ndp16 *ndp16;
1504        struct usb_cdc_ncm_dpe16 *dpe16;
1505        int ndpoffset;
1506        int loopcount = 50; /* arbitrary max preventing infinite loop */
1507        u32 payload = 0;
1508
1509        ndpoffset = cdc_ncm_rx_verify_nth16(ctx, skb_in);
1510        if (ndpoffset < 0)
1511                goto error;
1512
1513next_ndp:
1514        nframes = cdc_ncm_rx_verify_ndp16(skb_in, ndpoffset);
1515        if (nframes < 0)
1516                goto error;
1517
1518        ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1519
1520        if (ndp16->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN)) {
1521                netif_dbg(dev, rx_err, dev->net,
1522                          "invalid DPT16 signature <%#010x>\n",
1523                          le32_to_cpu(ndp16->dwSignature));
1524                goto err_ndp;
1525        }
1526        dpe16 = ndp16->dpe16;
1527
1528        for (x = 0; x < nframes; x++, dpe16++) {
1529                offset = le16_to_cpu(dpe16->wDatagramIndex);
1530                len = le16_to_cpu(dpe16->wDatagramLength);
1531
1532                /*
1533                 * CDC NCM ch. 3.7
1534                 * All entries after first NULL entry are to be ignored
1535                 */
1536                if ((offset == 0) || (len == 0)) {
1537                        if (!x)
1538                                goto err_ndp; /* empty NTB */
1539                        break;
1540                }
1541
1542                /* sanity checking */
1543                if (((offset + len) > skb_in->len) ||
1544                                (len > ctx->rx_max) || (len < ETH_HLEN)) {
1545                        netif_dbg(dev, rx_err, dev->net,
1546                                  "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n",
1547                                  x, offset, len, skb_in);
1548                        if (!x)
1549                                goto err_ndp;
1550                        break;
1551
1552                } else {
1553                        /* create a fresh copy to reduce truesize */
1554                        skb = netdev_alloc_skb_ip_align(dev->net,  len);
1555                        if (!skb)
1556                                goto error;
1557                        skb_put_data(skb, skb_in->data + offset, len);
1558                        usbnet_skb_return(dev, skb);
1559                        payload += len; /* count payload bytes in this NTB */
1560                }
1561        }
1562err_ndp:
1563        /* are there more NDPs to process? */
1564        ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);
1565        if (ndpoffset && loopcount--)
1566                goto next_ndp;
1567
1568        /* update stats */
1569        ctx->rx_overhead += skb_in->len - payload;
1570        ctx->rx_ntbs++;
1571
1572        return 1;
1573error:
1574        return 0;
1575}
1576EXPORT_SYMBOL_GPL(cdc_ncm_rx_fixup);
1577
1578static void
1579cdc_ncm_speed_change(struct usbnet *dev,
1580                     struct usb_cdc_speed_change *data)
1581{
1582        uint32_t rx_speed = le32_to_cpu(data->DLBitRRate);
1583        uint32_t tx_speed = le32_to_cpu(data->ULBitRate);
1584
1585        /*
1586         * Currently the USB-NET API does not support reporting the actual
1587         * device speed. Do print it instead.
1588         */
1589        if ((tx_speed > 1000000) && (rx_speed > 1000000)) {
1590                netif_info(dev, link, dev->net,
1591                           "%u mbit/s downlink %u mbit/s uplink\n",
1592                           (unsigned int)(rx_speed / 1000000U),
1593                           (unsigned int)(tx_speed / 1000000U));
1594        } else {
1595                netif_info(dev, link, dev->net,
1596                           "%u kbit/s downlink %u kbit/s uplink\n",
1597                           (unsigned int)(rx_speed / 1000U),
1598                           (unsigned int)(tx_speed / 1000U));
1599        }
1600}
1601
1602static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
1603{
1604        struct cdc_ncm_ctx *ctx;
1605        struct usb_cdc_notification *event;
1606
1607        ctx = (struct cdc_ncm_ctx *)dev->data[0];
1608
1609        if (urb->actual_length < sizeof(*event))
1610                return;
1611
1612        /* test for split data in 8-byte chunks */
1613        if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
1614                cdc_ncm_speed_change(dev,
1615                      (struct usb_cdc_speed_change *)urb->transfer_buffer);
1616                return;
1617        }
1618
1619        event = urb->transfer_buffer;
1620
1621        switch (event->bNotificationType) {
1622        case USB_CDC_NOTIFY_NETWORK_CONNECTION:
1623                /*
1624                 * According to the CDC NCM specification ch.7.1
1625                 * USB_CDC_NOTIFY_NETWORK_CONNECTION notification shall be
1626                 * sent by device after USB_CDC_NOTIFY_SPEED_CHANGE.
1627                 */
1628                netif_info(dev, link, dev->net,
1629                           "network connection: %sconnected\n",
1630                           !!event->wValue ? "" : "dis");
1631                usbnet_link_change(dev, !!event->wValue, 0);
1632                break;
1633
1634        case USB_CDC_NOTIFY_SPEED_CHANGE:
1635                if (urb->actual_length < (sizeof(*event) +
1636                                        sizeof(struct usb_cdc_speed_change)))
1637                        set_bit(EVENT_STS_SPLIT, &dev->flags);
1638                else
1639                        cdc_ncm_speed_change(dev,
1640                                             (struct usb_cdc_speed_change *)&event[1]);
1641                break;
1642
1643        default:
1644                dev_dbg(&dev->udev->dev,
1645                        "NCM: unexpected notification 0x%02x!\n",
1646                        event->bNotificationType);
1647                break;
1648        }
1649}
1650
1651static const struct driver_info cdc_ncm_info = {
1652        .description = "CDC NCM",
1653        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1654                        | FLAG_LINK_INTR,
1655        .bind = cdc_ncm_bind,
1656        .unbind = cdc_ncm_unbind,
1657        .manage_power = usbnet_manage_power,
1658        .status = cdc_ncm_status,
1659        .rx_fixup = cdc_ncm_rx_fixup,
1660        .tx_fixup = cdc_ncm_tx_fixup,
1661};
1662
1663/* Same as cdc_ncm_info, but with FLAG_WWAN */
1664static const struct driver_info wwan_info = {
1665        .description = "Mobile Broadband Network Device",
1666        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1667                        | FLAG_LINK_INTR | FLAG_WWAN,
1668        .bind = cdc_ncm_bind,
1669        .unbind = cdc_ncm_unbind,
1670        .manage_power = usbnet_manage_power,
1671        .status = cdc_ncm_status,
1672        .rx_fixup = cdc_ncm_rx_fixup,
1673        .tx_fixup = cdc_ncm_tx_fixup,
1674};
1675
1676/* Same as wwan_info, but with FLAG_NOARP  */
1677static const struct driver_info wwan_noarp_info = {
1678        .description = "Mobile Broadband Network Device (NO ARP)",
1679        .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1680                        | FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP,
1681        .bind = cdc_ncm_bind,
1682        .unbind = cdc_ncm_unbind,
1683        .manage_power = usbnet_manage_power,
1684        .status = cdc_ncm_status,
1685        .rx_fixup = cdc_ncm_rx_fixup,
1686        .tx_fixup = cdc_ncm_tx_fixup,
1687};
1688
1689static const struct usb_device_id cdc_devs[] = {
1690        /* Ericsson MBM devices like F5521gw */
1691        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1692                | USB_DEVICE_ID_MATCH_VENDOR,
1693          .idVendor = 0x0bdb,
1694          .bInterfaceClass = USB_CLASS_COMM,
1695          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1696          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1697          .driver_info = (unsigned long) &wwan_info,
1698        },
1699
1700        /* Telit LE910 V2 */
1701        { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x0036,
1702                USB_CLASS_COMM,
1703                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1704          .driver_info = (unsigned long)&wwan_noarp_info,
1705        },
1706
1707        /* DW5812 LTE Verizon Mobile Broadband Card
1708         * Unlike DW5550 this device requires FLAG_NOARP
1709         */
1710        { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bb,
1711                USB_CLASS_COMM,
1712                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1713          .driver_info = (unsigned long)&wwan_noarp_info,
1714        },
1715
1716        /* DW5813 LTE AT&T Mobile Broadband Card
1717         * Unlike DW5550 this device requires FLAG_NOARP
1718         */
1719        { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bc,
1720                USB_CLASS_COMM,
1721                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1722          .driver_info = (unsigned long)&wwan_noarp_info,
1723        },
1724
1725        /* Dell branded MBM devices like DW5550 */
1726        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1727                | USB_DEVICE_ID_MATCH_VENDOR,
1728          .idVendor = 0x413c,
1729          .bInterfaceClass = USB_CLASS_COMM,
1730          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1731          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1732          .driver_info = (unsigned long) &wwan_info,
1733        },
1734
1735        /* Toshiba branded MBM devices */
1736        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1737                | USB_DEVICE_ID_MATCH_VENDOR,
1738          .idVendor = 0x0930,
1739          .bInterfaceClass = USB_CLASS_COMM,
1740          .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1741          .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1742          .driver_info = (unsigned long) &wwan_info,
1743        },
1744
1745        /* tag Huawei devices as wwan */
1746        { USB_VENDOR_AND_INTERFACE_INFO(0x12d1,
1747                                        USB_CLASS_COMM,
1748                                        USB_CDC_SUBCLASS_NCM,
1749                                        USB_CDC_PROTO_NONE),
1750          .driver_info = (unsigned long)&wwan_info,
1751        },
1752
1753        /* Infineon(now Intel) HSPA Modem platform */
1754        { USB_DEVICE_AND_INTERFACE_INFO(0x1519, 0x0443,
1755                USB_CLASS_COMM,
1756                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1757          .driver_info = (unsigned long)&wwan_noarp_info,
1758        },
1759
1760        /* u-blox TOBY-L4 */
1761        { USB_DEVICE_AND_INTERFACE_INFO(0x1546, 0x1010,
1762                USB_CLASS_COMM,
1763                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1764          .driver_info = (unsigned long)&wwan_info,
1765        },
1766
1767        /* Generic CDC-NCM devices */
1768        { USB_INTERFACE_INFO(USB_CLASS_COMM,
1769                USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1770                .driver_info = (unsigned long)&cdc_ncm_info,
1771        },
1772        {
1773        },
1774};
1775MODULE_DEVICE_TABLE(usb, cdc_devs);
1776
1777static struct usb_driver cdc_ncm_driver = {
1778        .name = "cdc_ncm",
1779        .id_table = cdc_devs,
1780        .probe = usbnet_probe,
1781        .disconnect = usbnet_disconnect,
1782        .suspend = usbnet_suspend,
1783        .resume = usbnet_resume,
1784        .reset_resume = usbnet_resume,
1785        .supports_autosuspend = 1,
1786        .disable_hub_initiated_lpm = 1,
1787};
1788
1789module_usb_driver(cdc_ncm_driver);
1790
1791MODULE_AUTHOR("Hans Petter Selasky");
1792MODULE_DESCRIPTION("USB CDC NCM host driver");
1793MODULE_LICENSE("Dual BSD/GPL");
1794