From 988ee3e3f024f4565f98584b9026df73c459c268 Mon Sep 17 00:00:00 2001 From: Lei Wen Date: Wed, 1 Dec 2010 23:43:43 +0800 Subject: [PATCH 1/3] usb_ether: register usb ethernet gadget at each eth init Since the ether may not be the only one usb gadget would be used in the uboot, it is neccessary to do the register each time the eth begin to work to make usb gadget driver less confussed when we want to use two different usb gadget at the same time. Usb gadget driver could simple ignore the register operation, if it find the driver has been registered already. Signed-off-by: Lei Wen --- drivers/usb/gadget/ether.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 5a18e035b..261cf7ef2 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -1456,6 +1456,7 @@ static void eth_unbind(struct usb_gadget *gadget) /* unregister_netdev (dev->net);*/ /* free_netdev(dev->net);*/ + dev->gadget = NULL; set_gadget_data(gadget, NULL); } @@ -1788,6 +1789,8 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd) error("received NULL ptr"); goto fail; } + if (usb_gadget_register_driver(ð_driver) < 0) + goto fail; dev->network_started = 0; @@ -1895,7 +1898,12 @@ void usb_eth_halt(struct eth_device *netdev) return; } + /* If the gadget not registered, simple return */ + if (!dev->gadget) + return; + usb_gadget_disconnect(dev->gadget); + usb_gadget_unregister_driver(ð_driver); } static struct usb_gadget_driver eth_driver = { @@ -1957,10 +1965,6 @@ int usb_eth_initialize(bd_t *bi) if (status) goto fail; - status = usb_gadget_register_driver(ð_driver); - if (status < 0) - goto fail; - eth_register(netdev); return 0; From 8f7aa831c36feb08c5af790d88083afa6f945de2 Mon Sep 17 00:00:00 2001 From: Vitaly Kuzmichev Date: Tue, 28 Dec 2010 16:59:31 +0300 Subject: [PATCH 2/3] USB-CDC: Do not rename netdev after its registration Calling eth_bind at usb_eth_init time causes renaming of the network device from 'usb_ether' to 'usb0'. Fixing this to keep the first name. Signed-off-by: Vitaly Kuzmichev --- drivers/usb/gadget/ether.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 261cf7ef2..765fbd856 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -30,7 +30,7 @@ #include "gadget_chips.h" -#define USB_NET_NAME "usb0" +#define USB_NET_NAME "usb_ether" #define atomic_read extern struct platform_data brd; @@ -1687,7 +1687,6 @@ autoconf_fail: } dev->net = &l_netdev; - strcpy(dev->net->name, USB_NET_NAME); dev->cdc = cdc; dev->zlp = zlp; @@ -1924,7 +1923,7 @@ int usb_eth_initialize(bd_t *bi) int status = 0; struct eth_device *netdev = &l_netdev; - sprintf(netdev->name, "usb_ether"); + strlcpy(netdev->name, USB_NET_NAME, sizeof(netdev->name)); netdev->init = usb_eth_init; netdev->send = usb_eth_send; From 58939fcc5cbda504cee943bca50c3993597710e9 Mon Sep 17 00:00:00 2001 From: Vitaly Kuzmichev Date: Tue, 28 Dec 2010 16:59:32 +0300 Subject: [PATCH 3/3] USB-CDC: Move MAC addresses setting into usb_eth_init This allows to change device and host MAC addresses without performing reset. Signed-off-by: Vitaly Kuzmichev --- drivers/usb/gadget/ether.c | 62 ++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 765fbd856..638486998 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -1788,6 +1788,32 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd) error("received NULL ptr"); goto fail; } + + /* Configure default mac-addresses for the USB ethernet device */ +#ifdef CONFIG_USBNET_DEV_ADDR + strlcpy(dev_addr, CONFIG_USBNET_DEV_ADDR, sizeof(dev_addr)); +#endif +#ifdef CONFIG_USBNET_HOST_ADDR + 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"), + sizeof(dev_addr)); + + if (getenv("usbnet_hostaddr")) + strlcpy(host_addr, getenv("usbnet_hostaddr"), + sizeof(host_addr)); + + if (!is_eth_addr_valid(dev_addr)) { + error("Need valid 'usbnet_devaddr' to be set"); + goto fail; + } + if (!is_eth_addr_valid(host_addr)) { + error("Need valid 'usbnet_hostaddr' to be set"); + goto fail; + } + if (usb_gadget_register_driver(ð_driver) < 0) goto fail; @@ -1920,7 +1946,6 @@ static struct usb_gadget_driver eth_driver = { int usb_eth_initialize(bd_t *bi) { - int status = 0; struct eth_device *netdev = &l_netdev; strlcpy(netdev->name, USB_NET_NAME, sizeof(netdev->name)); @@ -1933,41 +1958,6 @@ int usb_eth_initialize(bd_t *bi) #ifdef CONFIG_MCAST_TFTP #error not supported #endif - /* Configure default mac-addresses for the USB ethernet device */ -#ifdef CONFIG_USBNET_DEV_ADDR - strncpy(dev_addr, CONFIG_USBNET_DEV_ADDR, sizeof(dev_addr)); -#endif -#ifdef CONFIG_USBNET_HOST_ADDR - strncpy(host_addr, CONFIG_USBNET_HOST_ADDR, sizeof(host_addr)); -#endif - /* Check if the user overruled the MAC addresses */ - if (getenv("usbnet_devaddr")) - strncpy(dev_addr, getenv("usbnet_devaddr"), - sizeof(dev_addr)); - - if (getenv("usbnet_hostaddr")) - strncpy(host_addr, getenv("usbnet_hostaddr"), - sizeof(host_addr)); - - /* Make sure both strings are terminated */ - dev_addr[sizeof(dev_addr)-1] = '\0'; - host_addr[sizeof(host_addr)-1] = '\0'; - - if (!is_eth_addr_valid(dev_addr)) { - error("Need valid 'usbnet_devaddr' to be set"); - status = -1; - } - if (!is_eth_addr_valid(host_addr)) { - error("Need valid 'usbnet_hostaddr' to be set"); - status = -1; - } - if (status) - goto fail; - eth_register(netdev); return 0; - -fail: - error("%s failed. error = %d", __func__, status); - return status; }