--- zzzz-none-000/linux-4.4.60/drivers/net/usb/usbnet.c 2017-04-08 07:53:53.000000000 +0000 +++ dragonfly-4020-701/linux-4.4.60/drivers/net/usb/usbnet.c 2018-11-08 13:36:17.000000000 +0000 @@ -47,6 +47,10 @@ #include #include +#ifdef CONFIG_AVM_PA +#include +#endif + #define DRIVER_VERSION "22-Aug-2005" @@ -335,6 +339,12 @@ if (skb_defer_rx_timestamp(skb)) return; +#if defined(CONFIG_AVM_PA) + if (avm_pa_dev_receive(AVM_PA_DEVINFO(dev->net), skb) == AVM_PA_RX_ACCELERATED) { + return; + } +#endif //defined(CONFIG_AVM_PA) + status = netif_rx (skb); if (status != NET_RX_SUCCESS) netif_dbg(dev, rx_err, dev->net, @@ -1591,6 +1601,60 @@ .name = "wwan", }; +#ifdef CONFIG_AVM_PA +static void pa_dev_transmit(void *arg, struct sk_buff *skb) +{ + int rc; + skb->dev = arg; + rc = dev_queue_xmit(skb); + if((rc & NETDEV_TX_MASK) != NETDEV_TX_OK) { + pr_warn("[%s] pa_dev_transmit(%s) %d", + __func__, + ((struct net_device *)arg)->name, + rc); + } +} +static int setup_avm_pa_eth_dev( struct net_device *dev ) { + /* register avm_pa pid and set hw info */ + struct usbnet *usbdev; + struct avm_pa_pid_cfg *cfg; + struct avm_pa_vpid_cfg *vcfg; + struct avm_pa_pid_hwinfo hwinfo; + int err; + + usbdev = netdev_priv(dev); + pr_err("[%s] dev %s\n", __func__, dev->name); + + cfg = &usbdev->pid_cfg; + memset(cfg, 0, sizeof(*cfg)); + vcfg = &usbdev->vpid_cfg; + memset(vcfg, 0, sizeof(*vcfg)); + + strncpy(cfg->name, dev->name, sizeof(cfg->name)); + cfg->tx_func = &pa_dev_transmit; + cfg->tx_arg = dev; + cfg->default_mtu = 1500; + cfg->framing = avm_pa_framing_dev; + err = avm_pa_dev_pid_register(&dev->avm_pa.devinfo, cfg); + if(err < 0) return err; + + strncpy(vcfg->name, dev->name, sizeof(vcfg->name)); + vcfg->v4_mtu = 1500; + vcfg->v6_mtu = 1500; + err = avm_pa_dev_vpid_register(&dev->avm_pa.devinfo, vcfg); + if (err < 0) goto undo; + + memset(&hwinfo, 0, sizeof(hwinfo)); + err = avm_pa_pid_set_hwinfo( + dev->avm_pa.devinfo.pid_handle, &hwinfo); + +undo: + if (err < 0) + avm_pa_dev_unregister(&dev->avm_pa.devinfo); + return err; +} +#endif + int usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) { @@ -1674,6 +1738,13 @@ if (status < 0) goto out1; +/*--- 20180222 AVM/WKR - we need lte0 for LTE product ---*/ +#if defined (CONFIG_ATH79_MACH_AVM_HW214) + strcpy(net->name, "lte%d"); +#endif + +/*--- 20160222 AVM/VGJ - CHANGESET: AVM-TWEAK: we always want usb0, not eth4 ---*/ +#if 0 // heuristic: "usb%d" for links we know are two-host, // else "eth%d" when there's reasonable doubt. userspace // can rename the link if it knows better. @@ -1681,12 +1752,18 @@ ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 || (net->dev_addr [0] & 0x02) == 0)) strcpy (net->name, "eth%d"); +#endif + /* WLAN devices should always be named "wlan%d" */ if ((dev->driver_info->flags & FLAG_WLAN) != 0) strcpy(net->name, "wlan%d"); + +/*--- 20160926 AVM/WKR - CHANGESET: AVM-TWEAK: use usb0 for cdc_ncm ---*/ +#if 0 /* WWAN devices should always be named "wwan%d" */ if ((dev->driver_info->flags & FLAG_WWAN) != 0) strcpy(net->name, "wwan%d"); +#endif /* devices that cannot do ARP */ if ((dev->driver_info->flags & FLAG_NOARP) != 0) @@ -1756,6 +1833,10 @@ if (dev->driver_info->flags & FLAG_LINK_INTR) usbnet_link_change(dev, 0, 0); +#ifdef CONFIG_AVM_PA + setup_avm_pa_eth_dev(dev->net); +#endif + return 0; out5: @@ -1990,6 +2071,10 @@ elength = 1; goto next_desc; } + if ((buflen < elength) || (elength < 3)) { + dev_err(&intf->dev, "invalid descriptor buffer length\n"); + break; + } if (buffer[1] != USB_DT_CS_INTERFACE) { dev_err(&intf->dev, "skipping garbage\n"); goto next_desc;