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