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