Merge tag 'u-boot-rockchip-20200501' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / drivers / usb / gadget / ether.c
index f1b0709..8533abf 100644 (file)
@@ -1,15 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * ether.c -- Ethernet gadget driver, with CDC and non-CDC options
  *
  * Copyright (C) 2003-2005,2008 David Brownell
  * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
  * Copyright (C) 2008 Nokia Corporation
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <console.h>
+#include <env.h>
 #include <linux/errno.h>
 #include <linux/netdevice.h>
 #include <linux/usb/ch9.h>
@@ -71,11 +71,6 @@ unsigned packet_received, packet_sent;
  * RNDIS specs are ambiguous and appear to be incomplete, and are also
  * needlessly complex.  They borrow more from CDC ACM than CDC ECM.
  */
-#define ETH_ALEN       6               /* Octets in one ethernet addr   */
-#define ETH_HLEN       14              /* Total octets in header.       */
-#define ETH_ZLEN       60              /* Min. octets in frame sans FCS */
-#define ETH_DATA_LEN   1500            /* Max. octets in payload        */
-#define ETH_FRAME_LEN  PKTSIZE_ALIGN   /* Max. octets in frame sans FCS */
 
 #define DRIVER_DESC            "Ethernet Gadget"
 /* Based on linux 2.6.27 version */
@@ -105,9 +100,6 @@ struct eth_dev {
        struct usb_gadget       *gadget;
        struct usb_request      *req;           /* for control responses */
        struct usb_request      *stat_req;      /* for cdc & rndis status */
-#ifdef CONFIG_DM_USB
-       struct udevice          *usb_udev;
-#endif
 
        u8                      config;
        struct usb_ep           *in_ep, *out_ep, *status_ep;
@@ -273,8 +265,8 @@ static inline int BITRATE(struct usb_gadget *g)
  * static ushort idProduct;
  */
 
-#if defined(CONFIG_USBNET_MANUFACTURER)
-static char *iManufacturer = CONFIG_USBNET_MANUFACTURER;
+#if defined(CONFIG_USB_GADGET_MANUFACTURER)
+static char *iManufacturer = CONFIG_USB_GADGET_MANUFACTURER;
 #else
 static char *iManufacturer = "U-Boot";
 #endif
@@ -507,6 +499,7 @@ static const struct usb_cdc_mdlm_desc mdlm_desc = {
  * can't really use its struct.  All we do here is say that we're using
  * the submode of "SAFE" which directly matches the CDC Subset.
  */
+#ifdef CONFIG_USB_ETH_SUBSET
 static const u8 mdlm_detail_desc[] = {
        6,
        USB_DT_CS_INTERFACE,
@@ -516,6 +509,7 @@ static const u8 mdlm_detail_desc[] = {
        0,      /* network control capabilities (none) */
        0,      /* network data capabilities ("raw" encapsulation) */
 };
+#endif
 
 #endif
 
@@ -527,7 +521,7 @@ static const struct usb_cdc_ether_desc ether_desc = {
        /* this descriptor actually adds value, surprise! */
        .iMACAddress =          STRING_ETHADDR,
        .bmEthernetStatistics = __constant_cpu_to_le32(0), /* no statistics */
-       .wMaxSegmentSize =      __constant_cpu_to_le16(ETH_FRAME_LEN),
+       .wMaxSegmentSize =      __constant_cpu_to_le16(PKTSIZE_ALIGN),
        .wNumberMCFilters =     __constant_cpu_to_le16(0),
        .bNumberPowerFilters =  0,
 };
@@ -1057,7 +1051,7 @@ static int eth_set_config(struct eth_dev *dev, unsigned number,
                        && dev->config
                        && dev->tx_qlen != 0) {
                /* tx fifo is full, but we can't clear it...*/
-               error("can't change configurations");
+               pr_err("can't change configurations");
                return -ESPIPE;
        }
        eth_reset_config(dev);
@@ -1231,7 +1225,7 @@ static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
        /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
        status = rndis_msg_parser(dev->rndis_config, (u8 *) req->buf);
        if (status < 0)
-               error("%s: rndis parse error %d", __func__, status);
+               pr_err("%s: rndis parse error %d", __func__, status);
 }
 
 #endif /* RNDIS */
@@ -1552,7 +1546,7 @@ static int rx_submit(struct eth_dev *dev, struct usb_request *req,
        retval = usb_ep_queue(dev->out_ep, req, gfp_flags);
 
        if (retval)
-               error("rx submit --> %d", retval);
+               pr_err("rx submit --> %d", retval);
 
        return retval;
 }
@@ -1573,7 +1567,7 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)
                        req->length -= length;
                        req->actual -= length;
                }
-               if (req->actual < ETH_HLEN || ETH_FRAME_LEN < req->actual) {
+               if (req->actual < ETH_HLEN || PKTSIZE_ALIGN < req->actual) {
 length_err:
                        dev->stats.rx_errors++;
                        dev->stats.rx_length_errors++;
@@ -1622,7 +1616,7 @@ static int alloc_requests(struct eth_dev *dev, unsigned n, gfp_t gfp_flags)
 fail2:
        usb_ep_free_request(dev->in_ep, dev->tx_req);
 fail1:
-       error("can't alloc requests");
+       pr_err("can't alloc requests");
        return -1;
 }
 
@@ -2058,7 +2052,7 @@ static int eth_bind(struct usb_gadget *gadget)
                 * anything less functional on CDC-capable hardware,
                 * so we fail in this case.
                 */
-               error("controller '%s' not recognized",
+               pr_err("controller '%s' not recognized",
                        gadget->name);
                return -ENODEV;
        }
@@ -2071,11 +2065,11 @@ static int eth_bind(struct usb_gadget *gadget)
         * to choose the right configuration otherwise.
         */
        if (rndis) {
-#if defined(CONFIG_USB_RNDIS_VENDOR_ID) && defined(CONFIG_USB_RNDIS_PRODUCT_ID)
+#if defined(CONFIG_USB_GADGET_VENDOR_NUM) && defined(CONFIG_USB_GADGET_PRODUCT_NUM)
                device_desc.idVendor =
-                       __constant_cpu_to_le16(CONFIG_USB_RNDIS_VENDOR_ID);
+                       __constant_cpu_to_le16(CONFIG_USB_GADGET_VENDOR_NUM);
                device_desc.idProduct =
-                       __constant_cpu_to_le16(CONFIG_USB_RNDIS_PRODUCT_ID);
+                       __constant_cpu_to_le16(CONFIG_USB_GADGET_PRODUCT_NUM);
 #else
                device_desc.idVendor =
                        __constant_cpu_to_le16(RNDIS_VENDOR_NUM);
@@ -2090,9 +2084,9 @@ static int eth_bind(struct usb_gadget *gadget)
         * supporting one submode of the "SAFE" variant of MDLM.)
         */
        } else {
-#if defined(CONFIG_USB_CDC_VENDOR_ID) && defined(CONFIG_USB_CDC_PRODUCT_ID)
-               device_desc.idVendor = cpu_to_le16(CONFIG_USB_CDC_VENDOR_ID);
-               device_desc.idProduct = cpu_to_le16(CONFIG_USB_CDC_PRODUCT_ID);
+#if defined(CONFIG_USB_GADGET_VENDOR_NUM) && defined(CONFIG_USB_GADGET_PRODUCT_NUM)
+               device_desc.idVendor = cpu_to_le16(CONFIG_USB_GADGET_VENDOR_NUM);
+               device_desc.idProduct = cpu_to_le16(CONFIG_USB_GADGET_PRODUCT_NUM);
 #else
                if (!cdc) {
                        device_desc.idVendor =
@@ -2119,7 +2113,7 @@ static int eth_bind(struct usb_gadget *gadget)
        in_ep = usb_ep_autoconfig(gadget, &fs_source_desc);
        if (!in_ep) {
 autoconf_fail:
-               error("can't autoconfigure on %s\n",
+               pr_err("can't autoconfigure on %s\n",
                        gadget->name);
                return -ENODEV;
        }
@@ -2140,7 +2134,7 @@ autoconf_fail:
                if (status_ep) {
                        status_ep->driver_data = status_ep;     /* claim */
                } else if (rndis) {
-                       error("can't run RNDIS on %s", gadget->name);
+                       pr_err("can't run RNDIS on %s", gadget->name);
                        return -ENODEV;
 #ifdef CONFIG_USB_ETH_CDC
                } else if (cdc) {
@@ -2242,7 +2236,7 @@ autoconf_fail:
        if (rndis) {
                status = rndis_init();
                if (status < 0) {
-                       error("can't init RNDIS, %d", status);
+                       pr_err("can't init RNDIS, %d", status);
                        goto fail;
                }
        }
@@ -2333,46 +2327,25 @@ fail0:
        return 0;
 
 fail:
-       error("%s failed, status = %d", __func__, status);
+       pr_err("%s failed, status = %d", __func__, status);
        eth_unbind(gadget);
        return status;
 }
 
 /*-------------------------------------------------------------------------*/
-
-#ifdef CONFIG_DM_USB
-int dm_usb_init(struct eth_dev *e_dev)
-{
-       struct udevice *dev = NULL;
-       int ret;
-
-       ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
-       if (!dev || ret) {
-               error("No USB device found\n");
-               return -ENODEV;
-       }
-
-       e_dev->usb_udev = dev;
-
-       return ret;
-}
-#endif
+static void _usb_eth_halt(struct ether_priv *priv);
 
 static int _usb_eth_init(struct ether_priv *priv)
 {
        struct eth_dev *dev = &priv->ethdev;
        struct usb_gadget *gadget;
        unsigned long ts;
+       int ret;
        unsigned long timeout = USB_CONNECT_TIMEOUT;
 
-#ifdef CONFIG_DM_USB
-       if (dm_usb_init(dev)) {
-               error("USB ether not found\n");
-               return -ENODEV;
-       }
-#else
-       board_usb_init(0, USB_INIT_DEVICE);
-#endif
+       ret = usb_gadget_initialize(0);
+       if (ret)
+               return ret;
 
        /* Configure default mac-addresses for the USB ethernet device */
 #ifdef CONFIG_USBNET_DEV_ADDR
@@ -2382,20 +2355,20 @@ static int _usb_eth_init(struct ether_priv *priv)
        strlcpy(host_addr, CONFIG_USBNET_HOST_ADDR, sizeof(host_addr));
 #endif
        /* Check if the user overruled the MAC addresses */
-       if (getenv("usbnet_devaddr"))
-               strlcpy(dev_addr, getenv("usbnet_devaddr"),
+       if (env_get("usbnet_devaddr"))
+               strlcpy(dev_addr, env_get("usbnet_devaddr"),
                        sizeof(dev_addr));
 
-       if (getenv("usbnet_hostaddr"))
-               strlcpy(host_addr, getenv("usbnet_hostaddr"),
+       if (env_get("usbnet_hostaddr"))
+               strlcpy(host_addr, env_get("usbnet_hostaddr"),
                        sizeof(host_addr));
 
        if (!is_eth_addr_valid(dev_addr)) {
-               error("Need valid 'usbnet_devaddr' to be set");
+               pr_err("Need valid 'usbnet_devaddr' to be set");
                goto fail;
        }
        if (!is_eth_addr_valid(host_addr)) {
-               error("Need valid 'usbnet_hostaddr' to be set");
+               pr_err("Need valid 'usbnet_hostaddr' to be set");
                goto fail;
        }
 
@@ -2418,14 +2391,14 @@ static int _usb_eth_init(struct ether_priv *priv)
        gadget = dev->gadget;
        usb_gadget_connect(gadget);
 
-       if (getenv("cdc_connect_timeout"))
-               timeout = simple_strtoul(getenv("cdc_connect_timeout"),
+       if (env_get("cdc_connect_timeout"))
+               timeout = simple_strtoul(env_get("cdc_connect_timeout"),
                                                NULL, 10) * CONFIG_SYS_HZ;
        ts = get_timer(0);
        while (!dev->network_started) {
                /* Handle control-c and timeouts */
                if (ctrlc() || (get_timer(ts) > timeout)) {
-                       error("The remote end did not respond in time.");
+                       pr_err("The remote end did not respond in time.");
                        goto fail;
                }
                usb_gadget_handle_interrupts(0);
@@ -2435,6 +2408,7 @@ static int _usb_eth_init(struct ether_priv *priv)
        rx_submit(dev, dev->rx_req, 0);
        return 0;
 fail:
+       _usb_eth_halt(priv);
        return -1;
 }
 
@@ -2454,7 +2428,7 @@ static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
                rndis_pkt = malloc(length +
                                        sizeof(struct rndis_packet_msg_type));
                if (!rndis_pkt) {
-                       error("No memory to alloc RNDIS packet");
+                       pr_err("No memory to alloc RNDIS packet");
                        goto drop;
                }
                rndis_add_hdr(rndis_pkt, length);
@@ -2498,8 +2472,7 @@ static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
                }
                usb_gadget_handle_interrupts(0);
        }
-       if (rndis_pkt)
-               free(rndis_pkt);
+       free(rndis_pkt);
 
        return 0;
 drop:
@@ -2514,7 +2487,7 @@ static int _usb_eth_recv(struct ether_priv *priv)
        return 0;
 }
 
-void _usb_eth_halt(struct ether_priv *priv)
+static void _usb_eth_halt(struct ether_priv *priv)
 {
        struct eth_dev *dev = &priv->ethdev;
 
@@ -2544,9 +2517,7 @@ void _usb_eth_halt(struct ether_priv *priv)
        }
 
        usb_gadget_unregister_driver(&priv->eth_driver);
-#ifndef CONFIG_DM_USB
-       board_usb_cleanup(0, USB_INIT_DEVICE);
-#endif
+       usb_gadget_release(0);
 }
 
 #ifndef CONFIG_DM_ETH
@@ -2572,7 +2543,7 @@ static int usb_eth_recv(struct eth_device *netdev)
 
        ret = _usb_eth_recv(priv);
        if (ret) {
-               error("error packet receive\n");
+               pr_err("error packet receive\n");
                return ret;
        }
 
@@ -2583,7 +2554,7 @@ static int usb_eth_recv(struct eth_device *netdev)
                net_process_received_packet(net_rx_packets[0],
                                            dev->rx_req->length);
        } else {
-               error("dev->rx_req invalid");
+               pr_err("dev->rx_req invalid");
        }
        packet_received = 0;
        rx_submit(dev, dev->rx_req, 0);
@@ -2610,9 +2581,6 @@ int usb_eth_initialize(bd_t *bi)
        netdev->halt = usb_eth_halt;
        netdev->priv = l_priv;
 
-#ifdef CONFIG_MCAST_TFTP
-  #error not supported
-#endif
        eth_register(netdev);
        return 0;
 }
@@ -2639,7 +2607,7 @@ static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
 
        ret = _usb_eth_recv(priv);
        if (ret) {
-               error("error packet receive\n");
+               pr_err("error packet receive\n");
                return ret;
        }
 
@@ -2648,7 +2616,7 @@ static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
                        *packetp = (uchar *)net_rx_packets[0];
                        return ethdev->rx_req->length;
                } else {
-                       error("dev->rx_req invalid");
+                       pr_err("dev->rx_req invalid");
                        return -EFAULT;
                }
        }
@@ -2683,7 +2651,7 @@ static int usb_eth_probe(struct udevice *dev)
        l_priv = priv;
 
        get_ether_addr(CONFIG_USBNET_DEVADDR, pdata->enetaddr);
-       eth_setenv_enetaddr("usbnet_devaddr", pdata->enetaddr);
+       eth_env_set_enetaddr("usbnet_devaddr", pdata->enetaddr);
 
        return 0;
 }
@@ -2702,15 +2670,15 @@ int usb_ether_init(void)
        struct udevice *usb_dev;
        int ret;
 
-       ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
+       ret = uclass_first_device(UCLASS_USB_GADGET_GENERIC, &usb_dev);
        if (!usb_dev || ret) {
-               error("No USB device found\n");
+               pr_err("No USB device found\n");
                return ret;
        }
 
        ret = device_bind_driver(usb_dev, "usb_ether", "usb_ether", &dev);
        if (!dev || ret) {
-               error("usb - not able to bind usb_ether device\n");
+               pr_err("usb - not able to bind usb_ether device\n");
                return ret;
        }