0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #include <linux/module.h>
0042 #include <linux/netdevice.h>
0043 #include <linux/ctype.h>
0044 #include <linux/etherdevice.h>
0045 #include <linux/ethtool.h>
0046 #include <linux/workqueue.h>
0047 #include <linux/mii.h>
0048 #include <linux/crc32.h>
0049 #include <linux/usb.h>
0050 #include <linux/hrtimer.h>
0051 #include <linux/atomic.h>
0052 #include <linux/usb/usbnet.h>
0053 #include <linux/usb/cdc.h>
0054 #include <linux/usb/cdc_ncm.h>
0055
0056 #if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
0057 static bool prefer_mbim = true;
0058 #else
0059 static bool prefer_mbim;
0060 #endif
0061 module_param(prefer_mbim, bool, 0644);
0062 MODULE_PARM_DESC(prefer_mbim, "Prefer MBIM setting on dual NCM/MBIM functions");
0063
0064 static void cdc_ncm_txpath_bh(struct tasklet_struct *t);
0065 static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx);
0066 static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *hr_timer);
0067 static struct usb_driver cdc_ncm_driver;
0068
0069 struct cdc_ncm_stats {
0070 char stat_string[ETH_GSTRING_LEN];
0071 int sizeof_stat;
0072 int stat_offset;
0073 };
0074
0075 #define CDC_NCM_STAT(str, m) { \
0076 .stat_string = str, \
0077 .sizeof_stat = sizeof(((struct cdc_ncm_ctx *)0)->m), \
0078 .stat_offset = offsetof(struct cdc_ncm_ctx, m) }
0079 #define CDC_NCM_SIMPLE_STAT(m) CDC_NCM_STAT(__stringify(m), m)
0080
0081 static const struct cdc_ncm_stats cdc_ncm_gstrings_stats[] = {
0082 CDC_NCM_SIMPLE_STAT(tx_reason_ntb_full),
0083 CDC_NCM_SIMPLE_STAT(tx_reason_ndp_full),
0084 CDC_NCM_SIMPLE_STAT(tx_reason_timeout),
0085 CDC_NCM_SIMPLE_STAT(tx_reason_max_datagram),
0086 CDC_NCM_SIMPLE_STAT(tx_overhead),
0087 CDC_NCM_SIMPLE_STAT(tx_ntbs),
0088 CDC_NCM_SIMPLE_STAT(rx_overhead),
0089 CDC_NCM_SIMPLE_STAT(rx_ntbs),
0090 };
0091
0092 #define CDC_NCM_LOW_MEM_MAX_CNT 10
0093
0094 static int cdc_ncm_get_sset_count(struct net_device __always_unused *netdev, int sset)
0095 {
0096 switch (sset) {
0097 case ETH_SS_STATS:
0098 return ARRAY_SIZE(cdc_ncm_gstrings_stats);
0099 default:
0100 return -EOPNOTSUPP;
0101 }
0102 }
0103
0104 static void cdc_ncm_get_ethtool_stats(struct net_device *netdev,
0105 struct ethtool_stats __always_unused *stats,
0106 u64 *data)
0107 {
0108 struct usbnet *dev = netdev_priv(netdev);
0109 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0110 int i;
0111 char *p = NULL;
0112
0113 for (i = 0; i < ARRAY_SIZE(cdc_ncm_gstrings_stats); i++) {
0114 p = (char *)ctx + cdc_ncm_gstrings_stats[i].stat_offset;
0115 data[i] = (cdc_ncm_gstrings_stats[i].sizeof_stat == sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
0116 }
0117 }
0118
0119 static void cdc_ncm_get_strings(struct net_device __always_unused *netdev, u32 stringset, u8 *data)
0120 {
0121 u8 *p = data;
0122 int i;
0123
0124 switch (stringset) {
0125 case ETH_SS_STATS:
0126 for (i = 0; i < ARRAY_SIZE(cdc_ncm_gstrings_stats); i++) {
0127 memcpy(p, cdc_ncm_gstrings_stats[i].stat_string, ETH_GSTRING_LEN);
0128 p += ETH_GSTRING_LEN;
0129 }
0130 }
0131 }
0132
0133 static void cdc_ncm_update_rxtx_max(struct usbnet *dev, u32 new_rx, u32 new_tx);
0134
0135 static const struct ethtool_ops cdc_ncm_ethtool_ops = {
0136 .get_link = usbnet_get_link,
0137 .nway_reset = usbnet_nway_reset,
0138 .get_drvinfo = usbnet_get_drvinfo,
0139 .get_msglevel = usbnet_get_msglevel,
0140 .set_msglevel = usbnet_set_msglevel,
0141 .get_ts_info = ethtool_op_get_ts_info,
0142 .get_sset_count = cdc_ncm_get_sset_count,
0143 .get_strings = cdc_ncm_get_strings,
0144 .get_ethtool_stats = cdc_ncm_get_ethtool_stats,
0145 .get_link_ksettings = usbnet_get_link_ksettings_internal,
0146 .set_link_ksettings = NULL,
0147 };
0148
0149 static u32 cdc_ncm_check_rx_max(struct usbnet *dev, u32 new_rx)
0150 {
0151 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0152 u32 val, max, min;
0153
0154
0155 min = USB_CDC_NCM_NTB_MIN_IN_SIZE;
0156 max = min_t(u32, CDC_NCM_NTB_MAX_SIZE_RX, le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize));
0157
0158
0159 if (max < min) {
0160 dev_warn(&dev->intf->dev, "dwNtbInMaxSize=%u is too small. Using %u\n",
0161 le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize), min);
0162 max = min;
0163 }
0164
0165 val = clamp_t(u32, new_rx, min, max);
0166 if (val != new_rx)
0167 dev_dbg(&dev->intf->dev, "rx_max must be in the [%u, %u] range\n", min, max);
0168
0169 return val;
0170 }
0171
0172 static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx)
0173 {
0174 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0175 u32 val, max, min;
0176
0177
0178 if (ctx->is_ndp16)
0179 min = ctx->max_datagram_size + ctx->max_ndp_size + sizeof(struct usb_cdc_ncm_nth16);
0180 else
0181 min = ctx->max_datagram_size + ctx->max_ndp_size + sizeof(struct usb_cdc_ncm_nth32);
0182
0183 max = min_t(u32, CDC_NCM_NTB_MAX_SIZE_TX, le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize));
0184 if (max == 0)
0185 max = CDC_NCM_NTB_MAX_SIZE_TX;
0186
0187
0188 min = min(min, max);
0189
0190 val = clamp_t(u32, new_tx, min, max);
0191 if (val != new_tx)
0192 dev_dbg(&dev->intf->dev, "tx_max must be in the [%u, %u] range\n", min, max);
0193
0194 return val;
0195 }
0196
0197 static ssize_t min_tx_pkt_show(struct device *d,
0198 struct device_attribute *attr, char *buf)
0199 {
0200 struct usbnet *dev = netdev_priv(to_net_dev(d));
0201 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0202
0203 return sprintf(buf, "%u\n", ctx->min_tx_pkt);
0204 }
0205
0206 static ssize_t rx_max_show(struct device *d,
0207 struct device_attribute *attr, char *buf)
0208 {
0209 struct usbnet *dev = netdev_priv(to_net_dev(d));
0210 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0211
0212 return sprintf(buf, "%u\n", ctx->rx_max);
0213 }
0214
0215 static ssize_t tx_max_show(struct device *d,
0216 struct device_attribute *attr, char *buf)
0217 {
0218 struct usbnet *dev = netdev_priv(to_net_dev(d));
0219 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0220
0221 return sprintf(buf, "%u\n", ctx->tx_max);
0222 }
0223
0224 static ssize_t tx_timer_usecs_show(struct device *d,
0225 struct device_attribute *attr, char *buf)
0226 {
0227 struct usbnet *dev = netdev_priv(to_net_dev(d));
0228 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0229
0230 return sprintf(buf, "%u\n", ctx->timer_interval / (u32)NSEC_PER_USEC);
0231 }
0232
0233 static ssize_t min_tx_pkt_store(struct device *d,
0234 struct device_attribute *attr,
0235 const char *buf, size_t len)
0236 {
0237 struct usbnet *dev = netdev_priv(to_net_dev(d));
0238 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0239 unsigned long val;
0240
0241
0242 if (kstrtoul(buf, 0, &val))
0243 return -EINVAL;
0244
0245 ctx->min_tx_pkt = val;
0246 return len;
0247 }
0248
0249 static ssize_t rx_max_store(struct device *d,
0250 struct device_attribute *attr,
0251 const char *buf, size_t len)
0252 {
0253 struct usbnet *dev = netdev_priv(to_net_dev(d));
0254 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0255 unsigned long val;
0256
0257 if (kstrtoul(buf, 0, &val) || cdc_ncm_check_rx_max(dev, val) != val)
0258 return -EINVAL;
0259
0260 cdc_ncm_update_rxtx_max(dev, val, ctx->tx_max);
0261 return len;
0262 }
0263
0264 static ssize_t tx_max_store(struct device *d,
0265 struct device_attribute *attr,
0266 const char *buf, size_t len)
0267 {
0268 struct usbnet *dev = netdev_priv(to_net_dev(d));
0269 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0270 unsigned long val;
0271
0272 if (kstrtoul(buf, 0, &val) || cdc_ncm_check_tx_max(dev, val) != val)
0273 return -EINVAL;
0274
0275 cdc_ncm_update_rxtx_max(dev, ctx->rx_max, val);
0276 return len;
0277 }
0278
0279 static ssize_t tx_timer_usecs_store(struct device *d,
0280 struct device_attribute *attr,
0281 const char *buf, size_t len)
0282 {
0283 struct usbnet *dev = netdev_priv(to_net_dev(d));
0284 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0285 ssize_t ret;
0286 unsigned long val;
0287
0288 ret = kstrtoul(buf, 0, &val);
0289 if (ret)
0290 return ret;
0291 if (val && (val < CDC_NCM_TIMER_INTERVAL_MIN || val > CDC_NCM_TIMER_INTERVAL_MAX))
0292 return -EINVAL;
0293
0294 spin_lock_bh(&ctx->mtx);
0295 ctx->timer_interval = val * NSEC_PER_USEC;
0296 if (!ctx->timer_interval)
0297 ctx->tx_timer_pending = 0;
0298 spin_unlock_bh(&ctx->mtx);
0299 return len;
0300 }
0301
0302 static DEVICE_ATTR_RW(min_tx_pkt);
0303 static DEVICE_ATTR_RW(rx_max);
0304 static DEVICE_ATTR_RW(tx_max);
0305 static DEVICE_ATTR_RW(tx_timer_usecs);
0306
0307 static ssize_t ndp_to_end_show(struct device *d, struct device_attribute *attr, char *buf)
0308 {
0309 struct usbnet *dev = netdev_priv(to_net_dev(d));
0310 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0311
0312 return sprintf(buf, "%c\n", ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END ? 'Y' : 'N');
0313 }
0314
0315 static ssize_t ndp_to_end_store(struct device *d, struct device_attribute *attr, const char *buf, size_t len)
0316 {
0317 struct usbnet *dev = netdev_priv(to_net_dev(d));
0318 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0319 bool enable;
0320
0321 if (strtobool(buf, &enable))
0322 return -EINVAL;
0323
0324
0325 if (enable == (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
0326 return len;
0327
0328 if (enable) {
0329 if (ctx->is_ndp16 && !ctx->delayed_ndp16) {
0330 ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
0331 if (!ctx->delayed_ndp16)
0332 return -ENOMEM;
0333 }
0334 if (!ctx->is_ndp16 && !ctx->delayed_ndp32) {
0335 ctx->delayed_ndp32 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
0336 if (!ctx->delayed_ndp32)
0337 return -ENOMEM;
0338 }
0339 }
0340
0341
0342 netif_tx_lock_bh(dev->net);
0343 usbnet_start_xmit(NULL, dev->net);
0344 spin_lock_bh(&ctx->mtx);
0345 if (enable)
0346 ctx->drvflags |= CDC_NCM_FLAG_NDP_TO_END;
0347 else
0348 ctx->drvflags &= ~CDC_NCM_FLAG_NDP_TO_END;
0349 spin_unlock_bh(&ctx->mtx);
0350 netif_tx_unlock_bh(dev->net);
0351
0352 return len;
0353 }
0354 static DEVICE_ATTR_RW(ndp_to_end);
0355
0356 #define NCM_PARM_ATTR(name, format, tocpu) \
0357 static ssize_t cdc_ncm_show_##name(struct device *d, struct device_attribute *attr, char *buf) \
0358 { \
0359 struct usbnet *dev = netdev_priv(to_net_dev(d)); \
0360 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; \
0361 return sprintf(buf, format "\n", tocpu(ctx->ncm_parm.name)); \
0362 } \
0363 static DEVICE_ATTR(name, 0444, cdc_ncm_show_##name, NULL)
0364
0365 NCM_PARM_ATTR(bmNtbFormatsSupported, "0x%04x", le16_to_cpu);
0366 NCM_PARM_ATTR(dwNtbInMaxSize, "%u", le32_to_cpu);
0367 NCM_PARM_ATTR(wNdpInDivisor, "%u", le16_to_cpu);
0368 NCM_PARM_ATTR(wNdpInPayloadRemainder, "%u", le16_to_cpu);
0369 NCM_PARM_ATTR(wNdpInAlignment, "%u", le16_to_cpu);
0370 NCM_PARM_ATTR(dwNtbOutMaxSize, "%u", le32_to_cpu);
0371 NCM_PARM_ATTR(wNdpOutDivisor, "%u", le16_to_cpu);
0372 NCM_PARM_ATTR(wNdpOutPayloadRemainder, "%u", le16_to_cpu);
0373 NCM_PARM_ATTR(wNdpOutAlignment, "%u", le16_to_cpu);
0374 NCM_PARM_ATTR(wNtbOutMaxDatagrams, "%u", le16_to_cpu);
0375
0376 static struct attribute *cdc_ncm_sysfs_attrs[] = {
0377 &dev_attr_min_tx_pkt.attr,
0378 &dev_attr_ndp_to_end.attr,
0379 &dev_attr_rx_max.attr,
0380 &dev_attr_tx_max.attr,
0381 &dev_attr_tx_timer_usecs.attr,
0382 &dev_attr_bmNtbFormatsSupported.attr,
0383 &dev_attr_dwNtbInMaxSize.attr,
0384 &dev_attr_wNdpInDivisor.attr,
0385 &dev_attr_wNdpInPayloadRemainder.attr,
0386 &dev_attr_wNdpInAlignment.attr,
0387 &dev_attr_dwNtbOutMaxSize.attr,
0388 &dev_attr_wNdpOutDivisor.attr,
0389 &dev_attr_wNdpOutPayloadRemainder.attr,
0390 &dev_attr_wNdpOutAlignment.attr,
0391 &dev_attr_wNtbOutMaxDatagrams.attr,
0392 NULL,
0393 };
0394
0395 static const struct attribute_group cdc_ncm_sysfs_attr_group = {
0396 .name = "cdc_ncm",
0397 .attrs = cdc_ncm_sysfs_attrs,
0398 };
0399
0400
0401 static void cdc_ncm_update_rxtx_max(struct usbnet *dev, u32 new_rx, u32 new_tx)
0402 {
0403 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0404 u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
0405 u32 val;
0406
0407 val = cdc_ncm_check_rx_max(dev, new_rx);
0408
0409
0410 if (val != ctx->rx_max) {
0411 __le32 dwNtbInMaxSize = cpu_to_le32(val);
0412
0413 dev_info(&dev->intf->dev, "setting rx_max = %u\n", val);
0414
0415
0416 if (usbnet_write_cmd(dev, USB_CDC_SET_NTB_INPUT_SIZE,
0417 USB_TYPE_CLASS | USB_DIR_OUT
0418 | USB_RECIP_INTERFACE,
0419 0, iface_no, &dwNtbInMaxSize, 4) < 0)
0420 dev_dbg(&dev->intf->dev, "Setting NTB Input Size failed\n");
0421 else
0422 ctx->rx_max = val;
0423 }
0424
0425
0426 if (dev->rx_urb_size != ctx->rx_max) {
0427 dev->rx_urb_size = ctx->rx_max;
0428 if (netif_running(dev->net))
0429 usbnet_unlink_rx_urbs(dev);
0430 }
0431
0432 val = cdc_ncm_check_tx_max(dev, new_tx);
0433 if (val != ctx->tx_max)
0434 dev_info(&dev->intf->dev, "setting tx_max = %u\n", val);
0435
0436
0437
0438
0439
0440
0441
0442
0443 if (val != le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize) &&
0444 val % usb_maxpacket(dev->udev, dev->out) == 0)
0445 val++;
0446
0447
0448 if (netif_running(dev->net) && val > ctx->tx_max) {
0449 netif_tx_lock_bh(dev->net);
0450 usbnet_start_xmit(NULL, dev->net);
0451
0452 if (ctx->tx_curr_skb) {
0453 dev_kfree_skb_any(ctx->tx_curr_skb);
0454 ctx->tx_curr_skb = NULL;
0455 }
0456 ctx->tx_max = val;
0457 netif_tx_unlock_bh(dev->net);
0458 } else {
0459 ctx->tx_max = val;
0460 }
0461
0462 dev->hard_mtu = ctx->tx_max;
0463
0464
0465 usbnet_update_max_qlen(dev);
0466
0467
0468 ctx->min_tx_pkt = clamp_t(u16, ctx->tx_max - 3 * usb_maxpacket(dev->udev, dev->out),
0469 CDC_NCM_MIN_TX_PKT, ctx->tx_max);
0470 }
0471
0472
0473 static u8 cdc_ncm_flags(struct usbnet *dev)
0474 {
0475 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0476
0477 if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting) && ctx->mbim_desc)
0478 return ctx->mbim_desc->bmNetworkCapabilities;
0479 if (ctx->func_desc)
0480 return ctx->func_desc->bmNetworkCapabilities;
0481 return 0;
0482 }
0483
0484 static int cdc_ncm_eth_hlen(struct usbnet *dev)
0485 {
0486 if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting))
0487 return 0;
0488 return ETH_HLEN;
0489 }
0490
0491 static u32 cdc_ncm_min_dgram_size(struct usbnet *dev)
0492 {
0493 if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting))
0494 return CDC_MBIM_MIN_DATAGRAM_SIZE;
0495 return CDC_NCM_MIN_DATAGRAM_SIZE;
0496 }
0497
0498 static u32 cdc_ncm_max_dgram_size(struct usbnet *dev)
0499 {
0500 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0501
0502 if (cdc_ncm_comm_intf_is_mbim(dev->intf->cur_altsetting) && ctx->mbim_desc)
0503 return le16_to_cpu(ctx->mbim_desc->wMaxSegmentSize);
0504 if (ctx->ether_desc)
0505 return le16_to_cpu(ctx->ether_desc->wMaxSegmentSize);
0506 return CDC_NCM_MAX_DATAGRAM_SIZE;
0507 }
0508
0509
0510
0511
0512 static int cdc_ncm_init(struct usbnet *dev)
0513 {
0514 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0515 u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
0516 int err;
0517
0518 err = usbnet_read_cmd(dev, USB_CDC_GET_NTB_PARAMETERS,
0519 USB_TYPE_CLASS | USB_DIR_IN
0520 |USB_RECIP_INTERFACE,
0521 0, iface_no, &ctx->ncm_parm,
0522 sizeof(ctx->ncm_parm));
0523 if (err < 0) {
0524 dev_err(&dev->intf->dev, "failed GET_NTB_PARAMETERS\n");
0525 return err;
0526 }
0527
0528
0529 if (cdc_ncm_flags(dev) & USB_CDC_NCM_NCAP_CRC_MODE) {
0530 dev_dbg(&dev->intf->dev, "Setting CRC mode off\n");
0531 err = usbnet_write_cmd(dev, USB_CDC_SET_CRC_MODE,
0532 USB_TYPE_CLASS | USB_DIR_OUT
0533 | USB_RECIP_INTERFACE,
0534 USB_CDC_NCM_CRC_NOT_APPENDED,
0535 iface_no, NULL, 0);
0536 if (err < 0)
0537 dev_err(&dev->intf->dev, "SET_CRC_MODE failed\n");
0538 }
0539
0540
0541 ctx->is_ndp16 = 1;
0542
0543
0544
0545
0546
0547
0548 if (le16_to_cpu(ctx->ncm_parm.bmNtbFormatsSupported) &
0549 USB_CDC_NCM_NTB32_SUPPORTED) {
0550 if (ctx->drvflags & CDC_NCM_FLAG_PREFER_NTB32) {
0551 ctx->is_ndp16 = 0;
0552 dev_dbg(&dev->intf->dev, "Setting NTB format to 32-bit\n");
0553 err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_FORMAT,
0554 USB_TYPE_CLASS | USB_DIR_OUT
0555 | USB_RECIP_INTERFACE,
0556 USB_CDC_NCM_NTB32_FORMAT,
0557 iface_no, NULL, 0);
0558 } else {
0559 ctx->is_ndp16 = 1;
0560 dev_dbg(&dev->intf->dev, "Setting NTB format to 16-bit\n");
0561 err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_FORMAT,
0562 USB_TYPE_CLASS | USB_DIR_OUT
0563 | USB_RECIP_INTERFACE,
0564 USB_CDC_NCM_NTB16_FORMAT,
0565 iface_no, NULL, 0);
0566 }
0567 if (err < 0) {
0568 ctx->is_ndp16 = 1;
0569 dev_err(&dev->intf->dev, "SET_NTB_FORMAT failed\n");
0570 }
0571 }
0572
0573
0574 ctx->rx_max = le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize);
0575 ctx->tx_max = le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize);
0576 ctx->tx_remainder = le16_to_cpu(ctx->ncm_parm.wNdpOutPayloadRemainder);
0577 ctx->tx_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutDivisor);
0578 ctx->tx_ndp_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutAlignment);
0579
0580 ctx->tx_max_datagrams = le16_to_cpu(ctx->ncm_parm.wNtbOutMaxDatagrams);
0581
0582 dev_dbg(&dev->intf->dev,
0583 "dwNtbInMaxSize=%u dwNtbOutMaxSize=%u wNdpOutPayloadRemainder=%u wNdpOutDivisor=%u wNdpOutAlignment=%u wNtbOutMaxDatagrams=%u flags=0x%x\n",
0584 ctx->rx_max, ctx->tx_max, ctx->tx_remainder, ctx->tx_modulus,
0585 ctx->tx_ndp_modulus, ctx->tx_max_datagrams, cdc_ncm_flags(dev));
0586
0587
0588 if ((ctx->tx_max_datagrams == 0) ||
0589 (ctx->tx_max_datagrams > CDC_NCM_DPT_DATAGRAMS_MAX))
0590 ctx->tx_max_datagrams = CDC_NCM_DPT_DATAGRAMS_MAX;
0591
0592
0593 if (ctx->is_ndp16)
0594 ctx->max_ndp_size = sizeof(struct usb_cdc_ncm_ndp16) + (ctx->tx_max_datagrams + 1) * sizeof(struct usb_cdc_ncm_dpe16);
0595 else
0596 ctx->max_ndp_size = sizeof(struct usb_cdc_ncm_ndp32) + (ctx->tx_max_datagrams + 1) * sizeof(struct usb_cdc_ncm_dpe32);
0597
0598
0599 ctx->timer_interval = CDC_NCM_TIMER_INTERVAL_USEC * NSEC_PER_USEC;
0600
0601 return 0;
0602 }
0603
0604
0605 static void cdc_ncm_set_dgram_size(struct usbnet *dev, int new_size)
0606 {
0607 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0608 u8 iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
0609 __le16 max_datagram_size;
0610 u16 mbim_mtu;
0611 int err;
0612
0613
0614 ctx->max_datagram_size = clamp_t(u32, new_size,
0615 cdc_ncm_min_dgram_size(dev),
0616 CDC_NCM_MAX_DATAGRAM_SIZE);
0617
0618
0619 if (!(cdc_ncm_flags(dev) & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE))
0620 goto out;
0621
0622
0623 err = usbnet_read_cmd(dev, USB_CDC_GET_MAX_DATAGRAM_SIZE,
0624 USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE,
0625 0, iface_no, &max_datagram_size, sizeof(max_datagram_size));
0626 if (err != sizeof(max_datagram_size)) {
0627 dev_dbg(&dev->intf->dev, "GET_MAX_DATAGRAM_SIZE failed\n");
0628 goto out;
0629 }
0630
0631 if (le16_to_cpu(max_datagram_size) == ctx->max_datagram_size)
0632 goto out;
0633
0634 max_datagram_size = cpu_to_le16(ctx->max_datagram_size);
0635 err = usbnet_write_cmd(dev, USB_CDC_SET_MAX_DATAGRAM_SIZE,
0636 USB_TYPE_CLASS | USB_DIR_OUT | USB_RECIP_INTERFACE,
0637 0, iface_no, &max_datagram_size, sizeof(max_datagram_size));
0638 if (err < 0)
0639 dev_dbg(&dev->intf->dev, "SET_MAX_DATAGRAM_SIZE failed\n");
0640
0641 out:
0642
0643 dev->net->mtu = min_t(int, dev->net->mtu, ctx->max_datagram_size - cdc_ncm_eth_hlen(dev));
0644
0645
0646 if (ctx->mbim_extended_desc) {
0647 mbim_mtu = le16_to_cpu(ctx->mbim_extended_desc->wMTU);
0648 if (mbim_mtu != 0 && mbim_mtu < dev->net->mtu)
0649 dev->net->mtu = mbim_mtu;
0650 }
0651 }
0652
0653 static void cdc_ncm_fix_modulus(struct usbnet *dev)
0654 {
0655 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0656 u32 val;
0657
0658
0659
0660
0661
0662
0663
0664 val = ctx->tx_ndp_modulus;
0665
0666 if ((val < USB_CDC_NCM_NDP_ALIGN_MIN_SIZE) ||
0667 (val != ((-val) & val)) || (val >= ctx->tx_max)) {
0668 dev_dbg(&dev->intf->dev, "Using default alignment: 4 bytes\n");
0669 ctx->tx_ndp_modulus = USB_CDC_NCM_NDP_ALIGN_MIN_SIZE;
0670 }
0671
0672
0673
0674
0675
0676
0677
0678 val = ctx->tx_modulus;
0679
0680 if ((val < USB_CDC_NCM_NDP_ALIGN_MIN_SIZE) ||
0681 (val != ((-val) & val)) || (val >= ctx->tx_max)) {
0682 dev_dbg(&dev->intf->dev, "Using default transmit modulus: 4 bytes\n");
0683 ctx->tx_modulus = USB_CDC_NCM_NDP_ALIGN_MIN_SIZE;
0684 }
0685
0686
0687 if (ctx->tx_remainder >= ctx->tx_modulus) {
0688 dev_dbg(&dev->intf->dev, "Using default transmit remainder: 0 bytes\n");
0689 ctx->tx_remainder = 0;
0690 }
0691
0692
0693 ctx->tx_remainder = ((ctx->tx_remainder - cdc_ncm_eth_hlen(dev)) &
0694 (ctx->tx_modulus - 1));
0695 }
0696
0697 static int cdc_ncm_setup(struct usbnet *dev)
0698 {
0699 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0700 u32 def_rx, def_tx;
0701
0702
0703
0704
0705 def_rx = min_t(u32, CDC_NCM_NTB_DEF_SIZE_RX,
0706 le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize));
0707 def_tx = min_t(u32, CDC_NCM_NTB_DEF_SIZE_TX,
0708 le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize));
0709
0710
0711 cdc_ncm_update_rxtx_max(dev, def_rx, def_tx);
0712
0713
0714 cdc_ncm_fix_modulus(dev);
0715
0716
0717 cdc_ncm_set_dgram_size(dev, cdc_ncm_max_dgram_size(dev));
0718 return 0;
0719 }
0720
0721 static void
0722 cdc_ncm_find_endpoints(struct usbnet *dev, struct usb_interface *intf)
0723 {
0724 struct usb_host_endpoint *e, *in = NULL, *out = NULL;
0725 u8 ep;
0726
0727 for (ep = 0; ep < intf->cur_altsetting->desc.bNumEndpoints; ep++) {
0728 e = intf->cur_altsetting->endpoint + ep;
0729
0730
0731 if (!usb_endpoint_maxp(&e->desc))
0732 continue;
0733
0734 switch (e->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
0735 case USB_ENDPOINT_XFER_INT:
0736 if (usb_endpoint_dir_in(&e->desc)) {
0737 if (!dev->status)
0738 dev->status = e;
0739 }
0740 break;
0741
0742 case USB_ENDPOINT_XFER_BULK:
0743 if (usb_endpoint_dir_in(&e->desc)) {
0744 if (!in)
0745 in = e;
0746 } else {
0747 if (!out)
0748 out = e;
0749 }
0750 break;
0751
0752 default:
0753 break;
0754 }
0755 }
0756 if (in && !dev->in)
0757 dev->in = usb_rcvbulkpipe(dev->udev,
0758 in->desc.bEndpointAddress &
0759 USB_ENDPOINT_NUMBER_MASK);
0760 if (out && !dev->out)
0761 dev->out = usb_sndbulkpipe(dev->udev,
0762 out->desc.bEndpointAddress &
0763 USB_ENDPOINT_NUMBER_MASK);
0764 }
0765
0766 static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)
0767 {
0768 if (ctx == NULL)
0769 return;
0770
0771 if (ctx->tx_rem_skb != NULL) {
0772 dev_kfree_skb_any(ctx->tx_rem_skb);
0773 ctx->tx_rem_skb = NULL;
0774 }
0775
0776 if (ctx->tx_curr_skb != NULL) {
0777 dev_kfree_skb_any(ctx->tx_curr_skb);
0778 ctx->tx_curr_skb = NULL;
0779 }
0780
0781 if (ctx->is_ndp16)
0782 kfree(ctx->delayed_ndp16);
0783 else
0784 kfree(ctx->delayed_ndp32);
0785
0786 kfree(ctx);
0787 }
0788
0789
0790
0791
0792
0793 int cdc_ncm_change_mtu(struct net_device *net, int new_mtu)
0794 {
0795 struct usbnet *dev = netdev_priv(net);
0796
0797 net->mtu = new_mtu;
0798 cdc_ncm_set_dgram_size(dev, new_mtu + cdc_ncm_eth_hlen(dev));
0799
0800 return 0;
0801 }
0802 EXPORT_SYMBOL_GPL(cdc_ncm_change_mtu);
0803
0804 static const struct net_device_ops cdc_ncm_netdev_ops = {
0805 .ndo_open = usbnet_open,
0806 .ndo_stop = usbnet_stop,
0807 .ndo_start_xmit = usbnet_start_xmit,
0808 .ndo_tx_timeout = usbnet_tx_timeout,
0809 .ndo_set_rx_mode = usbnet_set_rx_mode,
0810 .ndo_get_stats64 = dev_get_tstats64,
0811 .ndo_change_mtu = cdc_ncm_change_mtu,
0812 .ndo_set_mac_address = eth_mac_addr,
0813 .ndo_validate_addr = eth_validate_addr,
0814 };
0815
0816 int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags)
0817 {
0818 struct cdc_ncm_ctx *ctx;
0819 struct usb_driver *driver;
0820 u8 *buf;
0821 int len;
0822 int temp;
0823 u8 iface_no;
0824 struct usb_cdc_parsed_header hdr;
0825
0826 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
0827 if (!ctx)
0828 return -ENOMEM;
0829
0830 ctx->dev = dev;
0831
0832 hrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
0833 ctx->tx_timer.function = &cdc_ncm_tx_timer_cb;
0834 tasklet_setup(&ctx->bh, cdc_ncm_txpath_bh);
0835 atomic_set(&ctx->stop, 0);
0836 spin_lock_init(&ctx->mtx);
0837
0838
0839 dev->data[0] = (unsigned long)ctx;
0840
0841
0842 ctx->control = intf;
0843
0844
0845 driver = driver_of(intf);
0846 buf = intf->cur_altsetting->extra;
0847 len = intf->cur_altsetting->extralen;
0848
0849
0850 cdc_parse_cdc_header(&hdr, intf, buf, len);
0851
0852 if (hdr.usb_cdc_union_desc)
0853 ctx->data = usb_ifnum_to_if(dev->udev,
0854 hdr.usb_cdc_union_desc->bSlaveInterface0);
0855 ctx->ether_desc = hdr.usb_cdc_ether_desc;
0856 ctx->func_desc = hdr.usb_cdc_ncm_desc;
0857 ctx->mbim_desc = hdr.usb_cdc_mbim_desc;
0858 ctx->mbim_extended_desc = hdr.usb_cdc_mbim_extended_desc;
0859
0860
0861 if (!hdr.usb_cdc_union_desc && intf->intf_assoc && intf->intf_assoc->bInterfaceCount == 2) {
0862 ctx->data = usb_ifnum_to_if(dev->udev, intf->cur_altsetting->desc.bInterfaceNumber + 1);
0863 dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n");
0864 }
0865
0866
0867 if (!ctx->data) {
0868 dev_err(&intf->dev, "CDC Union missing and no IAD found\n");
0869 goto error;
0870 }
0871 if (cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) {
0872 if (!ctx->mbim_desc) {
0873 dev_err(&intf->dev, "MBIM functional descriptor missing\n");
0874 goto error;
0875 }
0876 } else {
0877 if (!ctx->ether_desc || !ctx->func_desc) {
0878 dev_err(&intf->dev, "NCM or ECM functional descriptors missing\n");
0879 goto error;
0880 }
0881 }
0882
0883
0884 if (ctx->data != ctx->control) {
0885 temp = usb_driver_claim_interface(driver, ctx->data, dev);
0886 if (temp) {
0887 dev_err(&intf->dev, "failed to claim data intf\n");
0888 goto error;
0889 }
0890 }
0891
0892 iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;
0893
0894
0895 ctx->drvflags = drvflags;
0896
0897
0898
0899
0900
0901
0902
0903 if (!(ctx->drvflags & CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE))
0904 usb_set_interface(dev->udev, iface_no, data_altsetting);
0905
0906 temp = usb_set_interface(dev->udev, iface_no, 0);
0907 if (temp) {
0908 dev_dbg(&intf->dev, "set interface failed\n");
0909 goto error2;
0910 }
0911
0912
0913 if (cdc_ncm_init(dev))
0914 goto error2;
0915
0916
0917
0918
0919
0920
0921 usleep_range(10000, 20000);
0922
0923
0924 temp = usb_set_interface(dev->udev, iface_no, data_altsetting);
0925 if (temp) {
0926 dev_dbg(&intf->dev, "set interface failed\n");
0927 goto error2;
0928 }
0929
0930 cdc_ncm_find_endpoints(dev, ctx->data);
0931 cdc_ncm_find_endpoints(dev, ctx->control);
0932 if (!dev->in || !dev->out || !dev->status) {
0933 dev_dbg(&intf->dev, "failed to collect endpoints\n");
0934 goto error2;
0935 }
0936
0937 usb_set_intfdata(ctx->control, dev);
0938
0939 if (ctx->ether_desc) {
0940 temp = usbnet_get_ethernet_addr(dev, ctx->ether_desc->iMACAddress);
0941 if (temp) {
0942 dev_err(&intf->dev, "failed to get mac address\n");
0943 goto error2;
0944 }
0945 dev_info(&intf->dev, "MAC-Address: %pM\n", dev->net->dev_addr);
0946 }
0947
0948
0949 cdc_ncm_setup(dev);
0950
0951
0952 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
0953 if (ctx->is_ndp16) {
0954 ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
0955 if (!ctx->delayed_ndp16)
0956 goto error2;
0957 } else {
0958 ctx->delayed_ndp32 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
0959 if (!ctx->delayed_ndp32)
0960 goto error2;
0961 }
0962 dev_info(&intf->dev, "NDP will be placed at end of frame for this device.");
0963 }
0964
0965
0966 dev->net->ethtool_ops = &cdc_ncm_ethtool_ops;
0967
0968
0969 dev->net->sysfs_groups[0] = &cdc_ncm_sysfs_attr_group;
0970
0971
0972 dev->net->netdev_ops = &cdc_ncm_netdev_ops;
0973 dev->net->max_mtu = cdc_ncm_max_dgram_size(dev) - cdc_ncm_eth_hlen(dev);
0974
0975 return 0;
0976
0977 error2:
0978 usb_set_intfdata(ctx->control, NULL);
0979 usb_set_intfdata(ctx->data, NULL);
0980 if (ctx->data != ctx->control)
0981 usb_driver_release_interface(driver, ctx->data);
0982 error:
0983 cdc_ncm_free((struct cdc_ncm_ctx *)dev->data[0]);
0984 dev->data[0] = 0;
0985 dev_info(&intf->dev, "bind() failure\n");
0986 return -ENODEV;
0987 }
0988 EXPORT_SYMBOL_GPL(cdc_ncm_bind_common);
0989
0990 void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)
0991 {
0992 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
0993 struct usb_driver *driver = driver_of(intf);
0994
0995 if (ctx == NULL)
0996 return;
0997
0998 atomic_set(&ctx->stop, 1);
0999
1000 hrtimer_cancel(&ctx->tx_timer);
1001
1002 tasklet_kill(&ctx->bh);
1003
1004
1005 if (ctx->control == ctx->data)
1006 ctx->data = NULL;
1007
1008
1009 if (intf == ctx->control && ctx->data) {
1010 usb_set_intfdata(ctx->data, NULL);
1011 usb_driver_release_interface(driver, ctx->data);
1012 ctx->data = NULL;
1013
1014 } else if (intf == ctx->data && ctx->control) {
1015 usb_set_intfdata(ctx->control, NULL);
1016 usb_driver_release_interface(driver, ctx->control);
1017 ctx->control = NULL;
1018 }
1019
1020 usb_set_intfdata(intf, NULL);
1021 cdc_ncm_free(ctx);
1022 }
1023 EXPORT_SYMBOL_GPL(cdc_ncm_unbind);
1024
1025
1026
1027
1028 u8 cdc_ncm_select_altsetting(struct usb_interface *intf)
1029 {
1030 struct usb_host_interface *alt;
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047 if (intf->num_altsetting < 2)
1048 return intf->cur_altsetting->desc.bAlternateSetting;
1049
1050 if (prefer_mbim) {
1051 alt = usb_altnum_to_altsetting(intf, CDC_NCM_COMM_ALTSETTING_MBIM);
1052 if (alt && cdc_ncm_comm_intf_is_mbim(alt))
1053 return CDC_NCM_COMM_ALTSETTING_MBIM;
1054 }
1055 return CDC_NCM_COMM_ALTSETTING_NCM;
1056 }
1057 EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting);
1058
1059 static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
1060 {
1061
1062 if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM)
1063 return -ENODEV;
1064
1065
1066
1067
1068
1069 return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM, 0);
1070 }
1071
1072 static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max)
1073 {
1074 size_t align = ALIGN(skb->len, modulus) - skb->len + remainder;
1075
1076 if (skb->len + align > max)
1077 align = max - skb->len;
1078 if (align && skb_tailroom(skb) >= align)
1079 skb_put_zero(skb, align);
1080 }
1081
1082
1083
1084
1085 static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign, size_t reserve)
1086 {
1087 struct usb_cdc_ncm_ndp16 *ndp16 = NULL;
1088 struct usb_cdc_ncm_nth16 *nth16 = (void *)skb->data;
1089 size_t ndpoffset = le16_to_cpu(nth16->wNdpIndex);
1090
1091
1092
1093
1094
1095 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
1096 if (ctx->delayed_ndp16->dwSignature == sign)
1097 return ctx->delayed_ndp16;
1098
1099
1100
1101
1102
1103 else if (ctx->delayed_ndp16->dwSignature)
1104 return NULL;
1105 }
1106
1107
1108 while (ndpoffset) {
1109 ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset);
1110 if (ndp16->dwSignature == sign)
1111 return ndp16;
1112 ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);
1113 }
1114
1115
1116 if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1117 cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size);
1118
1119
1120 if ((ctx->tx_curr_size - skb->len - reserve) < ctx->max_ndp_size)
1121 return NULL;
1122
1123
1124 if (ndp16)
1125 ndp16->wNextNdpIndex = cpu_to_le16(skb->len);
1126 else
1127 nth16->wNdpIndex = cpu_to_le16(skb->len);
1128
1129
1130 if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1131 ndp16 = skb_put_zero(skb, ctx->max_ndp_size);
1132 else
1133 ndp16 = ctx->delayed_ndp16;
1134
1135 ndp16->dwSignature = sign;
1136 ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16));
1137 return ndp16;
1138 }
1139
1140 static struct usb_cdc_ncm_ndp32 *cdc_ncm_ndp32(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign, size_t reserve)
1141 {
1142 struct usb_cdc_ncm_ndp32 *ndp32 = NULL;
1143 struct usb_cdc_ncm_nth32 *nth32 = (void *)skb->data;
1144 size_t ndpoffset = le32_to_cpu(nth32->dwNdpIndex);
1145
1146
1147
1148
1149
1150 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
1151 if (ctx->delayed_ndp32->dwSignature == sign)
1152 return ctx->delayed_ndp32;
1153
1154
1155
1156
1157
1158 else if (ctx->delayed_ndp32->dwSignature)
1159 return NULL;
1160 }
1161
1162
1163 while (ndpoffset) {
1164 ndp32 = (struct usb_cdc_ncm_ndp32 *)(skb->data + ndpoffset);
1165 if (ndp32->dwSignature == sign)
1166 return ndp32;
1167 ndpoffset = le32_to_cpu(ndp32->dwNextNdpIndex);
1168 }
1169
1170
1171 if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1172 cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size);
1173
1174
1175 if ((ctx->tx_curr_size - skb->len - reserve) < ctx->max_ndp_size)
1176 return NULL;
1177
1178
1179 if (ndp32)
1180 ndp32->dwNextNdpIndex = cpu_to_le32(skb->len);
1181 else
1182 nth32->dwNdpIndex = cpu_to_le32(skb->len);
1183
1184
1185 if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END))
1186 ndp32 = skb_put_zero(skb, ctx->max_ndp_size);
1187 else
1188 ndp32 = ctx->delayed_ndp32;
1189
1190 ndp32->dwSignature = sign;
1191 ndp32->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp32) + sizeof(struct usb_cdc_ncm_dpe32));
1192 return ndp32;
1193 }
1194
1195 struct sk_buff *
1196 cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
1197 {
1198 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1199 union {
1200 struct usb_cdc_ncm_nth16 *nth16;
1201 struct usb_cdc_ncm_nth32 *nth32;
1202 } nth;
1203 union {
1204 struct usb_cdc_ncm_ndp16 *ndp16;
1205 struct usb_cdc_ncm_ndp32 *ndp32;
1206 } ndp;
1207 struct sk_buff *skb_out;
1208 u16 n = 0, index, ndplen;
1209 u8 ready2send = 0;
1210 u32 delayed_ndp_size;
1211 size_t padding_count;
1212
1213
1214
1215
1216 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END)
1217 delayed_ndp_size = ctx->max_ndp_size +
1218 max_t(u32,
1219 ctx->tx_ndp_modulus,
1220 ctx->tx_modulus + ctx->tx_remainder) - 1;
1221 else
1222 delayed_ndp_size = 0;
1223
1224
1225 if (skb != NULL) {
1226 swap(skb, ctx->tx_rem_skb);
1227 swap(sign, ctx->tx_rem_sign);
1228 } else {
1229 ready2send = 1;
1230 }
1231
1232
1233 skb_out = ctx->tx_curr_skb;
1234
1235
1236 if (!skb_out) {
1237 if (ctx->tx_low_mem_val == 0) {
1238 ctx->tx_curr_size = ctx->tx_max;
1239 skb_out = alloc_skb(ctx->tx_curr_size, GFP_ATOMIC);
1240
1241
1242
1243
1244
1245 if (skb_out == NULL) {
1246 ctx->tx_low_mem_max_cnt = min(ctx->tx_low_mem_max_cnt + 1,
1247 (unsigned)CDC_NCM_LOW_MEM_MAX_CNT);
1248 ctx->tx_low_mem_val = ctx->tx_low_mem_max_cnt;
1249 }
1250 }
1251 if (skb_out == NULL) {
1252
1253
1254
1255
1256 if (skb)
1257 ctx->tx_curr_size = max(skb->len,
1258 (u32)USB_CDC_NCM_NTB_MIN_OUT_SIZE);
1259 else
1260 ctx->tx_curr_size = USB_CDC_NCM_NTB_MIN_OUT_SIZE;
1261 skb_out = alloc_skb(ctx->tx_curr_size, GFP_ATOMIC);
1262
1263
1264 if (skb_out == NULL) {
1265 if (skb != NULL) {
1266 dev_kfree_skb_any(skb);
1267 dev->net->stats.tx_dropped++;
1268 }
1269 goto exit_no_skb;
1270 }
1271 ctx->tx_low_mem_val--;
1272 }
1273 if (ctx->is_ndp16) {
1274
1275 nth.nth16 = skb_put_zero(skb_out, sizeof(struct usb_cdc_ncm_nth16));
1276 nth.nth16->dwSignature = cpu_to_le32(USB_CDC_NCM_NTH16_SIGN);
1277 nth.nth16->wHeaderLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16));
1278 nth.nth16->wSequence = cpu_to_le16(ctx->tx_seq++);
1279 } else {
1280
1281 nth.nth32 = skb_put_zero(skb_out, sizeof(struct usb_cdc_ncm_nth32));
1282 nth.nth32->dwSignature = cpu_to_le32(USB_CDC_NCM_NTH32_SIGN);
1283 nth.nth32->wHeaderLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth32));
1284 nth.nth32->wSequence = cpu_to_le16(ctx->tx_seq++);
1285 }
1286
1287
1288 ctx->tx_curr_frame_num = 0;
1289
1290
1291 ctx->tx_curr_frame_payload = 0;
1292 }
1293
1294 for (n = ctx->tx_curr_frame_num; n < ctx->tx_max_datagrams; n++) {
1295
1296 if (skb == NULL) {
1297 skb = ctx->tx_rem_skb;
1298 sign = ctx->tx_rem_sign;
1299 ctx->tx_rem_skb = NULL;
1300
1301
1302 if (skb == NULL)
1303 break;
1304 }
1305
1306
1307 if (ctx->is_ndp16)
1308 ndp.ndp16 = cdc_ncm_ndp16(ctx, skb_out, sign, skb->len + ctx->tx_modulus + ctx->tx_remainder);
1309 else
1310 ndp.ndp32 = cdc_ncm_ndp32(ctx, skb_out, sign, skb->len + ctx->tx_modulus + ctx->tx_remainder);
1311
1312
1313 cdc_ncm_align_tail(skb_out, ctx->tx_modulus, ctx->tx_remainder, ctx->tx_curr_size);
1314
1315
1316 if ((ctx->is_ndp16 && !ndp.ndp16) || (!ctx->is_ndp16 && !ndp.ndp32) ||
1317 skb_out->len + skb->len + delayed_ndp_size > ctx->tx_curr_size) {
1318 if (n == 0) {
1319
1320 dev_kfree_skb_any(skb);
1321 skb = NULL;
1322 dev->net->stats.tx_dropped++;
1323 } else {
1324
1325 if (ctx->tx_rem_skb != NULL) {
1326 dev_kfree_skb_any(ctx->tx_rem_skb);
1327 dev->net->stats.tx_dropped++;
1328 }
1329 ctx->tx_rem_skb = skb;
1330 ctx->tx_rem_sign = sign;
1331 skb = NULL;
1332 ready2send = 1;
1333 ctx->tx_reason_ntb_full++;
1334 }
1335 break;
1336 }
1337
1338
1339 if (ctx->is_ndp16) {
1340 ndplen = le16_to_cpu(ndp.ndp16->wLength);
1341 index = (ndplen - sizeof(struct usb_cdc_ncm_ndp16)) / sizeof(struct usb_cdc_ncm_dpe16) - 1;
1342
1343
1344 ndp.ndp16->dpe16[index].wDatagramLength = cpu_to_le16(skb->len);
1345 ndp.ndp16->dpe16[index].wDatagramIndex = cpu_to_le16(skb_out->len);
1346 ndp.ndp16->wLength = cpu_to_le16(ndplen + sizeof(struct usb_cdc_ncm_dpe16));
1347 } else {
1348 ndplen = le16_to_cpu(ndp.ndp32->wLength);
1349 index = (ndplen - sizeof(struct usb_cdc_ncm_ndp32)) / sizeof(struct usb_cdc_ncm_dpe32) - 1;
1350
1351 ndp.ndp32->dpe32[index].dwDatagramLength = cpu_to_le32(skb->len);
1352 ndp.ndp32->dpe32[index].dwDatagramIndex = cpu_to_le32(skb_out->len);
1353 ndp.ndp32->wLength = cpu_to_le16(ndplen + sizeof(struct usb_cdc_ncm_dpe32));
1354 }
1355 skb_put_data(skb_out, skb->data, skb->len);
1356 ctx->tx_curr_frame_payload += skb->len;
1357 dev_kfree_skb_any(skb);
1358 skb = NULL;
1359
1360
1361 if (index >= CDC_NCM_DPT_DATAGRAMS_MAX) {
1362 ready2send = 1;
1363 ctx->tx_reason_ndp_full++;
1364 break;
1365 }
1366 }
1367
1368
1369 if (skb != NULL) {
1370 dev_kfree_skb_any(skb);
1371 skb = NULL;
1372 dev->net->stats.tx_dropped++;
1373 }
1374
1375 ctx->tx_curr_frame_num = n;
1376
1377 if (n == 0) {
1378
1379
1380 ctx->tx_curr_skb = skb_out;
1381 goto exit_no_skb;
1382
1383 } else if ((n < ctx->tx_max_datagrams) && (ready2send == 0) && (ctx->timer_interval > 0)) {
1384
1385
1386 ctx->tx_curr_skb = skb_out;
1387
1388 if (n < CDC_NCM_RESTART_TIMER_DATAGRAM_CNT)
1389 ctx->tx_timer_pending = CDC_NCM_TIMER_PENDING_CNT;
1390 goto exit_no_skb;
1391
1392 } else {
1393 if (n == ctx->tx_max_datagrams)
1394 ctx->tx_reason_max_datagram++;
1395
1396
1397 }
1398
1399
1400 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
1401 if (ctx->is_ndp16) {
1402 nth.nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
1403 cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size - ctx->max_ndp_size);
1404 nth.nth16->wNdpIndex = cpu_to_le16(skb_out->len);
1405 skb_put_data(skb_out, ctx->delayed_ndp16, ctx->max_ndp_size);
1406
1407
1408 ndp.ndp16 = memset(ctx->delayed_ndp16, 0, ctx->max_ndp_size);
1409 } else {
1410 nth.nth32 = (struct usb_cdc_ncm_nth32 *)skb_out->data;
1411 cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size - ctx->max_ndp_size);
1412 nth.nth32->dwNdpIndex = cpu_to_le32(skb_out->len);
1413 skb_put_data(skb_out, ctx->delayed_ndp32, ctx->max_ndp_size);
1414
1415 ndp.ndp32 = memset(ctx->delayed_ndp32, 0, ctx->max_ndp_size);
1416 }
1417 }
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428 if (!(dev->driver_info->flags & FLAG_SEND_ZLP) &&
1429 skb_out->len > ctx->min_tx_pkt) {
1430 padding_count = ctx->tx_curr_size - skb_out->len;
1431 if (!WARN_ON(padding_count > ctx->tx_curr_size))
1432 skb_put_zero(skb_out, padding_count);
1433 } else if (skb_out->len < ctx->tx_curr_size &&
1434 (skb_out->len % dev->maxpacket) == 0) {
1435 skb_put_u8(skb_out, 0);
1436 }
1437
1438
1439 if (ctx->is_ndp16) {
1440 nth.nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
1441 nth.nth16->wBlockLength = cpu_to_le16(skb_out->len);
1442 } else {
1443 nth.nth32 = (struct usb_cdc_ncm_nth32 *)skb_out->data;
1444 nth.nth32->dwBlockLength = cpu_to_le32(skb_out->len);
1445 }
1446
1447
1448 ctx->tx_curr_skb = NULL;
1449
1450
1451 ctx->tx_overhead += skb_out->len - ctx->tx_curr_frame_payload;
1452 ctx->tx_ntbs++;
1453
1454
1455
1456
1457
1458 usbnet_set_skb_tx_stats(skb_out, n,
1459 (long)ctx->tx_curr_frame_payload - skb_out->len);
1460
1461 return skb_out;
1462
1463 exit_no_skb:
1464
1465 if (ctx->tx_curr_skb != NULL && n > 0)
1466 cdc_ncm_tx_timeout_start(ctx);
1467 return NULL;
1468 }
1469 EXPORT_SYMBOL_GPL(cdc_ncm_fill_tx_frame);
1470
1471 static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx)
1472 {
1473
1474 if (!(hrtimer_active(&ctx->tx_timer) || atomic_read(&ctx->stop)))
1475 hrtimer_start(&ctx->tx_timer,
1476 ctx->timer_interval,
1477 HRTIMER_MODE_REL);
1478 }
1479
1480 static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer)
1481 {
1482 struct cdc_ncm_ctx *ctx =
1483 container_of(timer, struct cdc_ncm_ctx, tx_timer);
1484
1485 if (!atomic_read(&ctx->stop))
1486 tasklet_schedule(&ctx->bh);
1487 return HRTIMER_NORESTART;
1488 }
1489
1490 static void cdc_ncm_txpath_bh(struct tasklet_struct *t)
1491 {
1492 struct cdc_ncm_ctx *ctx = from_tasklet(ctx, t, bh);
1493 struct usbnet *dev = ctx->dev;
1494
1495 spin_lock(&ctx->mtx);
1496 if (ctx->tx_timer_pending != 0) {
1497 ctx->tx_timer_pending--;
1498 cdc_ncm_tx_timeout_start(ctx);
1499 spin_unlock(&ctx->mtx);
1500 } else if (dev->net != NULL) {
1501 ctx->tx_reason_timeout++;
1502 spin_unlock(&ctx->mtx);
1503 netif_tx_lock_bh(dev->net);
1504 usbnet_start_xmit(NULL, dev->net);
1505 netif_tx_unlock_bh(dev->net);
1506 } else {
1507 spin_unlock(&ctx->mtx);
1508 }
1509 }
1510
1511 struct sk_buff *
1512 cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
1513 {
1514 struct sk_buff *skb_out;
1515 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1516
1517
1518
1519
1520
1521
1522
1523
1524 if (ctx == NULL)
1525 goto error;
1526
1527 spin_lock_bh(&ctx->mtx);
1528
1529 if (ctx->is_ndp16)
1530 skb_out = cdc_ncm_fill_tx_frame(dev, skb, cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN));
1531 else
1532 skb_out = cdc_ncm_fill_tx_frame(dev, skb, cpu_to_le32(USB_CDC_NCM_NDP32_NOCRC_SIGN));
1533
1534 spin_unlock_bh(&ctx->mtx);
1535 return skb_out;
1536
1537 error:
1538 if (skb != NULL)
1539 dev_kfree_skb_any(skb);
1540
1541 return NULL;
1542 }
1543 EXPORT_SYMBOL_GPL(cdc_ncm_tx_fixup);
1544
1545
1546 int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in)
1547 {
1548 struct usbnet *dev = netdev_priv(skb_in->dev);
1549 struct usb_cdc_ncm_nth16 *nth16;
1550 int len;
1551 int ret = -EINVAL;
1552
1553 if (ctx == NULL)
1554 goto error;
1555
1556 if (skb_in->len < (sizeof(struct usb_cdc_ncm_nth16) +
1557 sizeof(struct usb_cdc_ncm_ndp16))) {
1558 netif_dbg(dev, rx_err, dev->net, "frame too short\n");
1559 goto error;
1560 }
1561
1562 nth16 = (struct usb_cdc_ncm_nth16 *)skb_in->data;
1563
1564 if (nth16->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH16_SIGN)) {
1565 netif_dbg(dev, rx_err, dev->net,
1566 "invalid NTH16 signature <%#010x>\n",
1567 le32_to_cpu(nth16->dwSignature));
1568 goto error;
1569 }
1570
1571 len = le16_to_cpu(nth16->wBlockLength);
1572 if (len > ctx->rx_max) {
1573 netif_dbg(dev, rx_err, dev->net,
1574 "unsupported NTB block length %u/%u\n", len,
1575 ctx->rx_max);
1576 goto error;
1577 }
1578
1579 if ((ctx->rx_seq + 1) != le16_to_cpu(nth16->wSequence) &&
1580 (ctx->rx_seq || le16_to_cpu(nth16->wSequence)) &&
1581 !((ctx->rx_seq == 0xffff) && !le16_to_cpu(nth16->wSequence))) {
1582 netif_dbg(dev, rx_err, dev->net,
1583 "sequence number glitch prev=%d curr=%d\n",
1584 ctx->rx_seq, le16_to_cpu(nth16->wSequence));
1585 }
1586 ctx->rx_seq = le16_to_cpu(nth16->wSequence);
1587
1588 ret = le16_to_cpu(nth16->wNdpIndex);
1589 error:
1590 return ret;
1591 }
1592 EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_nth16);
1593
1594 int cdc_ncm_rx_verify_nth32(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in)
1595 {
1596 struct usbnet *dev = netdev_priv(skb_in->dev);
1597 struct usb_cdc_ncm_nth32 *nth32;
1598 int len;
1599 int ret = -EINVAL;
1600
1601 if (ctx == NULL)
1602 goto error;
1603
1604 if (skb_in->len < (sizeof(struct usb_cdc_ncm_nth32) +
1605 sizeof(struct usb_cdc_ncm_ndp32))) {
1606 netif_dbg(dev, rx_err, dev->net, "frame too short\n");
1607 goto error;
1608 }
1609
1610 nth32 = (struct usb_cdc_ncm_nth32 *)skb_in->data;
1611
1612 if (nth32->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH32_SIGN)) {
1613 netif_dbg(dev, rx_err, dev->net,
1614 "invalid NTH32 signature <%#010x>\n",
1615 le32_to_cpu(nth32->dwSignature));
1616 goto error;
1617 }
1618
1619 len = le32_to_cpu(nth32->dwBlockLength);
1620 if (len > ctx->rx_max) {
1621 netif_dbg(dev, rx_err, dev->net,
1622 "unsupported NTB block length %u/%u\n", len,
1623 ctx->rx_max);
1624 goto error;
1625 }
1626
1627 if ((ctx->rx_seq + 1) != le16_to_cpu(nth32->wSequence) &&
1628 (ctx->rx_seq || le16_to_cpu(nth32->wSequence)) &&
1629 !((ctx->rx_seq == 0xffff) && !le16_to_cpu(nth32->wSequence))) {
1630 netif_dbg(dev, rx_err, dev->net,
1631 "sequence number glitch prev=%d curr=%d\n",
1632 ctx->rx_seq, le16_to_cpu(nth32->wSequence));
1633 }
1634 ctx->rx_seq = le16_to_cpu(nth32->wSequence);
1635
1636 ret = le32_to_cpu(nth32->dwNdpIndex);
1637 error:
1638 return ret;
1639 }
1640 EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_nth32);
1641
1642
1643 int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset)
1644 {
1645 struct usbnet *dev = netdev_priv(skb_in->dev);
1646 struct usb_cdc_ncm_ndp16 *ndp16;
1647 int ret = -EINVAL;
1648
1649 if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len) {
1650 netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
1651 ndpoffset);
1652 goto error;
1653 }
1654 ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1655
1656 if (le16_to_cpu(ndp16->wLength) < USB_CDC_NCM_NDP16_LENGTH_MIN) {
1657 netif_dbg(dev, rx_err, dev->net, "invalid DPT16 length <%u>\n",
1658 le16_to_cpu(ndp16->wLength));
1659 goto error;
1660 }
1661
1662 ret = ((le16_to_cpu(ndp16->wLength) -
1663 sizeof(struct usb_cdc_ncm_ndp16)) /
1664 sizeof(struct usb_cdc_ncm_dpe16));
1665 ret--;
1666
1667 if ((sizeof(struct usb_cdc_ncm_ndp16) +
1668 ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len) {
1669 netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
1670 ret = -EINVAL;
1671 }
1672
1673 error:
1674 return ret;
1675 }
1676 EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_ndp16);
1677
1678
1679 int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset)
1680 {
1681 struct usbnet *dev = netdev_priv(skb_in->dev);
1682 struct usb_cdc_ncm_ndp32 *ndp32;
1683 int ret = -EINVAL;
1684
1685 if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp32)) > skb_in->len) {
1686 netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
1687 ndpoffset);
1688 goto error;
1689 }
1690 ndp32 = (struct usb_cdc_ncm_ndp32 *)(skb_in->data + ndpoffset);
1691
1692 if (le16_to_cpu(ndp32->wLength) < USB_CDC_NCM_NDP32_LENGTH_MIN) {
1693 netif_dbg(dev, rx_err, dev->net, "invalid DPT32 length <%u>\n",
1694 le16_to_cpu(ndp32->wLength));
1695 goto error;
1696 }
1697
1698 ret = ((le16_to_cpu(ndp32->wLength) -
1699 sizeof(struct usb_cdc_ncm_ndp32)) /
1700 sizeof(struct usb_cdc_ncm_dpe32));
1701 ret--;
1702
1703 if ((sizeof(struct usb_cdc_ncm_ndp32) +
1704 ret * (sizeof(struct usb_cdc_ncm_dpe32))) > skb_in->len) {
1705 netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
1706 ret = -EINVAL;
1707 }
1708
1709 error:
1710 return ret;
1711 }
1712 EXPORT_SYMBOL_GPL(cdc_ncm_rx_verify_ndp32);
1713
1714 int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)
1715 {
1716 struct sk_buff *skb;
1717 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
1718 unsigned int len;
1719 int nframes;
1720 int x;
1721 unsigned int offset;
1722 union {
1723 struct usb_cdc_ncm_ndp16 *ndp16;
1724 struct usb_cdc_ncm_ndp32 *ndp32;
1725 } ndp;
1726 union {
1727 struct usb_cdc_ncm_dpe16 *dpe16;
1728 struct usb_cdc_ncm_dpe32 *dpe32;
1729 } dpe;
1730
1731 int ndpoffset;
1732 int loopcount = 50;
1733 u32 payload = 0;
1734
1735 if (ctx->is_ndp16)
1736 ndpoffset = cdc_ncm_rx_verify_nth16(ctx, skb_in);
1737 else
1738 ndpoffset = cdc_ncm_rx_verify_nth32(ctx, skb_in);
1739
1740 if (ndpoffset < 0)
1741 goto error;
1742
1743 next_ndp:
1744 if (ctx->is_ndp16) {
1745 nframes = cdc_ncm_rx_verify_ndp16(skb_in, ndpoffset);
1746 if (nframes < 0)
1747 goto error;
1748
1749 ndp.ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);
1750
1751 if (ndp.ndp16->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN)) {
1752 netif_dbg(dev, rx_err, dev->net,
1753 "invalid DPT16 signature <%#010x>\n",
1754 le32_to_cpu(ndp.ndp16->dwSignature));
1755 goto err_ndp;
1756 }
1757 dpe.dpe16 = ndp.ndp16->dpe16;
1758 } else {
1759 nframes = cdc_ncm_rx_verify_ndp32(skb_in, ndpoffset);
1760 if (nframes < 0)
1761 goto error;
1762
1763 ndp.ndp32 = (struct usb_cdc_ncm_ndp32 *)(skb_in->data + ndpoffset);
1764
1765 if (ndp.ndp32->dwSignature != cpu_to_le32(USB_CDC_NCM_NDP32_NOCRC_SIGN)) {
1766 netif_dbg(dev, rx_err, dev->net,
1767 "invalid DPT32 signature <%#010x>\n",
1768 le32_to_cpu(ndp.ndp32->dwSignature));
1769 goto err_ndp;
1770 }
1771 dpe.dpe32 = ndp.ndp32->dpe32;
1772 }
1773
1774 for (x = 0; x < nframes; x++) {
1775 if (ctx->is_ndp16) {
1776 offset = le16_to_cpu(dpe.dpe16->wDatagramIndex);
1777 len = le16_to_cpu(dpe.dpe16->wDatagramLength);
1778 } else {
1779 offset = le32_to_cpu(dpe.dpe32->dwDatagramIndex);
1780 len = le32_to_cpu(dpe.dpe32->dwDatagramLength);
1781 }
1782
1783
1784
1785
1786
1787 if ((offset == 0) || (len == 0)) {
1788 if (!x)
1789 goto err_ndp;
1790 break;
1791 }
1792
1793
1794 if ((offset > skb_in->len) || (len > skb_in->len - offset) ||
1795 (len > ctx->rx_max) || (len < ETH_HLEN)) {
1796 netif_dbg(dev, rx_err, dev->net,
1797 "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n",
1798 x, offset, len, skb_in);
1799 if (!x)
1800 goto err_ndp;
1801 break;
1802
1803 } else {
1804
1805 skb = netdev_alloc_skb_ip_align(dev->net, len);
1806 if (!skb)
1807 goto error;
1808 skb_put_data(skb, skb_in->data + offset, len);
1809 usbnet_skb_return(dev, skb);
1810 payload += len;
1811 }
1812
1813 if (ctx->is_ndp16)
1814 dpe.dpe16++;
1815 else
1816 dpe.dpe32++;
1817 }
1818 err_ndp:
1819
1820 if (ctx->is_ndp16)
1821 ndpoffset = le16_to_cpu(ndp.ndp16->wNextNdpIndex);
1822 else
1823 ndpoffset = le32_to_cpu(ndp.ndp32->dwNextNdpIndex);
1824
1825 if (ndpoffset && loopcount--)
1826 goto next_ndp;
1827
1828
1829 ctx->rx_overhead += skb_in->len - payload;
1830 ctx->rx_ntbs++;
1831
1832 return 1;
1833 error:
1834 return 0;
1835 }
1836 EXPORT_SYMBOL_GPL(cdc_ncm_rx_fixup);
1837
1838 static void
1839 cdc_ncm_speed_change(struct usbnet *dev,
1840 struct usb_cdc_speed_change *data)
1841 {
1842
1843 dev->rx_speed = le32_to_cpu(data->DLBitRRate);
1844 dev->tx_speed = le32_to_cpu(data->ULBitRate);
1845 }
1846
1847 static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
1848 {
1849 struct usb_cdc_notification *event;
1850
1851 if (urb->actual_length < sizeof(*event))
1852 return;
1853
1854
1855 if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
1856 cdc_ncm_speed_change(dev,
1857 (struct usb_cdc_speed_change *)urb->transfer_buffer);
1858 return;
1859 }
1860
1861 event = urb->transfer_buffer;
1862
1863 switch (event->bNotificationType) {
1864 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
1865
1866
1867
1868
1869
1870
1871
1872
1873 if (netif_carrier_ok(dev->net) != !!event->wValue)
1874 usbnet_link_change(dev, !!event->wValue, 0);
1875 break;
1876
1877 case USB_CDC_NOTIFY_SPEED_CHANGE:
1878 if (urb->actual_length < (sizeof(*event) +
1879 sizeof(struct usb_cdc_speed_change)))
1880 set_bit(EVENT_STS_SPLIT, &dev->flags);
1881 else
1882 cdc_ncm_speed_change(dev,
1883 (struct usb_cdc_speed_change *)&event[1]);
1884 break;
1885
1886 default:
1887 dev_dbg(&dev->udev->dev,
1888 "NCM: unexpected notification 0x%02x!\n",
1889 event->bNotificationType);
1890 break;
1891 }
1892 }
1893
1894 static const struct driver_info cdc_ncm_info = {
1895 .description = "CDC NCM (NO ZLP)",
1896 .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1897 | FLAG_LINK_INTR | FLAG_ETHER,
1898 .bind = cdc_ncm_bind,
1899 .unbind = cdc_ncm_unbind,
1900 .manage_power = usbnet_manage_power,
1901 .status = cdc_ncm_status,
1902 .rx_fixup = cdc_ncm_rx_fixup,
1903 .tx_fixup = cdc_ncm_tx_fixup,
1904 .set_rx_mode = usbnet_cdc_update_filter,
1905 };
1906
1907
1908 static const struct driver_info cdc_ncm_zlp_info = {
1909 .description = "CDC NCM (SEND ZLP)",
1910 .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1911 | FLAG_LINK_INTR | FLAG_ETHER | FLAG_SEND_ZLP,
1912 .bind = cdc_ncm_bind,
1913 .unbind = cdc_ncm_unbind,
1914 .manage_power = usbnet_manage_power,
1915 .status = cdc_ncm_status,
1916 .rx_fixup = cdc_ncm_rx_fixup,
1917 .tx_fixup = cdc_ncm_tx_fixup,
1918 };
1919
1920
1921 static const struct driver_info wwan_info = {
1922 .description = "Mobile Broadband Network Device",
1923 .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1924 | FLAG_LINK_INTR | FLAG_WWAN,
1925 .bind = cdc_ncm_bind,
1926 .unbind = cdc_ncm_unbind,
1927 .manage_power = usbnet_manage_power,
1928 .status = cdc_ncm_status,
1929 .rx_fixup = cdc_ncm_rx_fixup,
1930 .tx_fixup = cdc_ncm_tx_fixup,
1931 .set_rx_mode = usbnet_cdc_update_filter,
1932 };
1933
1934
1935 static const struct driver_info wwan_noarp_info = {
1936 .description = "Mobile Broadband Network Device (NO ARP)",
1937 .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
1938 | FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP,
1939 .bind = cdc_ncm_bind,
1940 .unbind = cdc_ncm_unbind,
1941 .manage_power = usbnet_manage_power,
1942 .status = cdc_ncm_status,
1943 .rx_fixup = cdc_ncm_rx_fixup,
1944 .tx_fixup = cdc_ncm_tx_fixup,
1945 .set_rx_mode = usbnet_cdc_update_filter,
1946 };
1947
1948 static const struct usb_device_id cdc_devs[] = {
1949
1950 { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1951 | USB_DEVICE_ID_MATCH_VENDOR,
1952 .idVendor = 0x0bdb,
1953 .bInterfaceClass = USB_CLASS_COMM,
1954 .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1955 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1956 .driver_info = (unsigned long) &wwan_info,
1957 },
1958
1959
1960 { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x0036,
1961 USB_CLASS_COMM,
1962 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1963 .driver_info = (unsigned long)&wwan_noarp_info,
1964 },
1965
1966
1967
1968
1969 { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bb,
1970 USB_CLASS_COMM,
1971 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1972 .driver_info = (unsigned long)&wwan_noarp_info,
1973 },
1974
1975
1976
1977
1978 { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bc,
1979 USB_CLASS_COMM,
1980 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
1981 .driver_info = (unsigned long)&wwan_noarp_info,
1982 },
1983
1984
1985 { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1986 | USB_DEVICE_ID_MATCH_VENDOR,
1987 .idVendor = 0x413c,
1988 .bInterfaceClass = USB_CLASS_COMM,
1989 .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
1990 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
1991 .driver_info = (unsigned long) &wwan_info,
1992 },
1993
1994
1995 { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
1996 | USB_DEVICE_ID_MATCH_VENDOR,
1997 .idVendor = 0x0930,
1998 .bInterfaceClass = USB_CLASS_COMM,
1999 .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
2000 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
2001 .driver_info = (unsigned long) &wwan_info,
2002 },
2003
2004
2005 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1,
2006 USB_CLASS_COMM,
2007 USB_CDC_SUBCLASS_NCM,
2008 USB_CDC_PROTO_NONE),
2009 .driver_info = (unsigned long)&wwan_info,
2010 },
2011
2012
2013 { USB_DEVICE_AND_INTERFACE_INFO(0x1519, 0x0443,
2014 USB_CLASS_COMM,
2015 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
2016 .driver_info = (unsigned long)&wwan_noarp_info,
2017 },
2018
2019
2020 { USB_DEVICE_AND_INTERFACE_INFO(0x1546, 0x1010,
2021 USB_CLASS_COMM,
2022 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
2023 .driver_info = (unsigned long)&wwan_info,
2024 },
2025
2026
2027 { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
2028 | USB_DEVICE_ID_MATCH_VENDOR,
2029 .idVendor = 0x17e9,
2030 .bInterfaceClass = USB_CLASS_COMM,
2031 .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
2032 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
2033 .driver_info = (unsigned long)&cdc_ncm_zlp_info,
2034 },
2035
2036
2037 { USB_INTERFACE_INFO(USB_CLASS_COMM,
2038 USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
2039 .driver_info = (unsigned long)&cdc_ncm_info,
2040 },
2041 {
2042 },
2043 };
2044 MODULE_DEVICE_TABLE(usb, cdc_devs);
2045
2046 static struct usb_driver cdc_ncm_driver = {
2047 .name = "cdc_ncm",
2048 .id_table = cdc_devs,
2049 .probe = usbnet_probe,
2050 .disconnect = usbnet_disconnect,
2051 .suspend = usbnet_suspend,
2052 .resume = usbnet_resume,
2053 .reset_resume = usbnet_resume,
2054 .supports_autosuspend = 1,
2055 .disable_hub_initiated_lpm = 1,
2056 };
2057
2058 module_usb_driver(cdc_ncm_driver);
2059
2060 MODULE_AUTHOR("Hans Petter Selasky");
2061 MODULE_DESCRIPTION("USB CDC NCM host driver");
2062 MODULE_LICENSE("Dual BSD/GPL");