Lines Matching +full:micro +full:- +full:frames

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012 Smith Micro Software, Inc.
7 * Copyright (C) ST-Ericsson 2010-2012
19 #include <linux/usb/cdc-wdm.h>
29 /* driver specific data - must match cdc_ncm usage */
46 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_manage_power()
49 dev_dbg(&dev->intf->dev, "%s() pmcount=%d, on=%d\n", __func__, atomic_read(&info->pmcount), on); in cdc_mbim_manage_power()
51 …if ((on && atomic_add_return(1, &info->pmcount) == 1) || (!on && atomic_dec_and_test(&info->pmcoun… in cdc_mbim_manage_power()
53 rv = usb_autopm_get_interface(dev->intf); in cdc_mbim_manage_power()
54 dev->intf->needs_remote_wakeup = on; in cdc_mbim_manage_power()
56 usb_autopm_put_interface(dev->intf); in cdc_mbim_manage_power()
75 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_rx_add_vid()
79 info->flags |= FLAG_IPS0_VLAN; in cdc_mbim_rx_add_vid()
82 return -EINVAL; in cdc_mbim_rx_add_vid()
89 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_rx_kill_vid()
93 info->flags &= ~FLAG_IPS0_VLAN; in cdc_mbim_rx_kill_vid()
116 struct usb_driver *driver = to_usb_driver(intf->dev.driver); in cdc_mbim_set_ctrlalt()
121 ret = usb_set_interface(dev->udev, in cdc_mbim_set_ctrlalt()
122 intf->cur_altsetting->desc.bInterfaceNumber, in cdc_mbim_set_ctrlalt()
127 id = usb_match_id(intf, driver->id_table); in cdc_mbim_set_ctrlalt()
129 return -ENODEV; in cdc_mbim_set_ctrlalt()
131 info = (struct driver_info *)id->driver_info; in cdc_mbim_set_ctrlalt()
132 if (info != dev->driver_info) { in cdc_mbim_set_ctrlalt()
133 dev_dbg(&intf->dev, "driver_info updated to '%s'\n", in cdc_mbim_set_ctrlalt()
134 info->description); in cdc_mbim_set_ctrlalt()
135 dev->driver_info = info; in cdc_mbim_set_ctrlalt()
143 struct usb_driver *subdriver = ERR_PTR(-ENODEV); in cdc_mbim_bind()
144 int ret = -ENODEV; in cdc_mbim_bind()
146 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_bind()
154 ret = -ENODEV; in cdc_mbim_bind()
158 if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) in cdc_mbim_bind()
161 ret = cdc_ncm_bind_common(dev, intf, data_altsetting, dev->driver_info->data); in cdc_mbim_bind()
165 ctx = info->ctx; in cdc_mbim_bind()
168 if (ctx->mbim_desc && dev->status) in cdc_mbim_bind()
169 subdriver = usb_cdc_wdm_register(ctx->control, in cdc_mbim_bind()
170 &dev->status->desc, in cdc_mbim_bind()
171 le16_to_cpu(ctx->mbim_desc->wMaxControlMessage), in cdc_mbim_bind()
181 dev->status = NULL; in cdc_mbim_bind()
182 info->subdriver = subdriver; in cdc_mbim_bind()
185 dev->net->flags |= IFF_NOARP; in cdc_mbim_bind()
188 dev->net->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_FILTER; in cdc_mbim_bind()
191 dev->net->netdev_ops = &cdc_mbim_netdev_ops; in cdc_mbim_bind()
198 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_unbind()
199 struct cdc_ncm_ctx *ctx = info->ctx; in cdc_mbim_unbind()
202 if (info->subdriver && info->subdriver->disconnect) in cdc_mbim_unbind()
203 info->subdriver->disconnect(ctx->control); in cdc_mbim_unbind()
204 info->subdriver = NULL; in cdc_mbim_unbind()
224 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_tx_fixup()
225 struct cdc_ncm_ctx *ctx = info->ctx; in cdc_mbim_tx_fixup()
235 if (skb->len <= ETH_HLEN) in cdc_mbim_tx_fixup()
240 * ethernet frames directly. We primarily look for in cdc_mbim_tx_fixup()
241 * the accelerated out-of-band tag, but fall back if in cdc_mbim_tx_fixup()
245 if (vlan_get_tag(skb, &tci) < 0 && skb->len > VLAN_ETH_HLEN && in cdc_mbim_tx_fixup()
247 is_ip = is_ip_proto(vlan_eth_hdr(skb)->h_vlan_encapsulated_proto); in cdc_mbim_tx_fixup()
250 is_ip = is_ip_proto(eth_hdr(skb)->h_proto); in cdc_mbim_tx_fixup()
255 if (info->flags & FLAG_IPS0_VLAN) { in cdc_mbim_tx_fixup()
266 * 1 - 255 => IPS session <vlanid> in cdc_mbim_tx_fixup()
267 * 256 - 511 => DSS session <vlanid - 256> in cdc_mbim_tx_fixup()
268 * 512 - 4093 => unsupported, drop in cdc_mbim_tx_fixup()
273 case 0x0000: /* VLAN ID 0 - 255 */ in cdc_mbim_tx_fixup()
279 case 0x0100: /* VLAN ID 256 - 511 */ in cdc_mbim_tx_fixup()
287 netif_err(dev, tx_err, dev->net, in cdc_mbim_tx_fixup()
293 spin_lock_bh(&ctx->mtx); in cdc_mbim_tx_fixup()
295 spin_unlock_bh(&ctx->mtx); in cdc_mbim_tx_fixup()
320 if (!ipv6_addr_is_solict_mult(&iph->daddr) || in do_neigh_solicit()
321 !(ipv6_addr_type(&iph->saddr) & IPV6_ADDR_UNICAST)) in do_neigh_solicit()
327 netdev = __vlan_find_dev_deep_rcu(dev->net, htons(ETH_P_8021Q), in do_neigh_solicit()
334 netdev = dev->net; in do_neigh_solicit()
342 is_router = !!READ_ONCE(in6_dev->cnf.forwarding); in do_neigh_solicit()
346 ipv6_stub->ndisc_send_na(netdev, &iph->saddr, &msg->target, in do_neigh_solicit()
361 iph->nexthdr == IPPROTO_ICMPV6 && in is_neigh_solicit()
362 msg->icmph.icmp6_code == 0 && in is_neigh_solicit()
363 msg->icmph.icmp6_type == NDISC_NEIGHBOUR_SOLICITATION); in is_neigh_solicit()
390 skb = netdev_alloc_skb_ip_align(dev->net, len + ETH_HLEN); in cdc_mbim_process_dgram()
397 eth_hdr(skb)->h_proto = proto; in cdc_mbim_process_dgram()
398 eth_zero_addr(eth_hdr(skb)->h_source); in cdc_mbim_process_dgram()
399 memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN); in cdc_mbim_process_dgram()
414 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_rx_fixup()
415 struct cdc_ncm_ctx *ctx = info->ctx; in cdc_mbim_rx_fixup()
437 ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset); in cdc_mbim_rx_fixup()
439 switch (ndp16->dwSignature & cpu_to_le32(0x00ffffff)) { in cdc_mbim_rx_fixup()
441 c = (u8 *)&ndp16->dwSignature; in cdc_mbim_rx_fixup()
444 if (!tci && info->flags & FLAG_IPS0_VLAN) in cdc_mbim_rx_fixup()
448 c = (u8 *)&ndp16->dwSignature; in cdc_mbim_rx_fixup()
452 netif_dbg(dev, rx_err, dev->net, in cdc_mbim_rx_fixup()
454 le32_to_cpu(ndp16->dwSignature)); in cdc_mbim_rx_fixup()
459 dpe16 = ndp16->dpe16; in cdc_mbim_rx_fixup()
461 offset = le16_to_cpu(dpe16->wDatagramIndex); in cdc_mbim_rx_fixup()
462 len = le16_to_cpu(dpe16->wDatagramLength); in cdc_mbim_rx_fixup()
475 if (((offset + len) > skb_in->len) || (len > ctx->rx_max)) { in cdc_mbim_rx_fixup()
476 netif_dbg(dev, rx_err, dev->net, in cdc_mbim_rx_fixup()
483 skb = cdc_mbim_process_dgram(dev, skb_in->data + offset, len, tci); in cdc_mbim_rx_fixup()
492 ndpoffset = le16_to_cpu(ndp16->wNextNdpIndex); in cdc_mbim_rx_fixup()
493 if (ndpoffset && loopcount--) in cdc_mbim_rx_fixup()
497 ctx->rx_overhead += skb_in->len - payload; in cdc_mbim_rx_fixup()
498 ctx->rx_ntbs++; in cdc_mbim_rx_fixup()
507 int ret = -ENODEV; in cdc_mbim_suspend()
509 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_suspend()
510 struct cdc_ncm_ctx *ctx = info->ctx; in cdc_mbim_suspend()
516 * Both usbnet_suspend() and subdriver->suspend() MUST return 0 in cdc_mbim_suspend()
524 if (intf == ctx->control && info->subdriver && info->subdriver->suspend) in cdc_mbim_suspend()
525 ret = info->subdriver->suspend(intf, message); in cdc_mbim_suspend()
537 struct cdc_mbim_state *info = (void *)&dev->data; in cdc_mbim_resume()
538 struct cdc_ncm_ctx *ctx = info->ctx; in cdc_mbim_resume()
539 bool callsub = (intf == ctx->control && info->subdriver && info->subdriver->resume); in cdc_mbim_resume()
542 ret = info->subdriver->resume(intf); in cdc_mbim_resume()
547 info->subdriver->suspend(intf, PMSG_SUSPEND); in cdc_mbim_resume()
637 /* Some Huawei devices, ME906s-158 (12d1:15c1) and E3372
646 /* The HP lt4132 (03f0:a31d) is a rebranded Huawei ME906s-158,