public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget
@ 2016-05-10 11:44 Mugunthan V N
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model Mugunthan V N
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

This patch series adopts driver model for usb ether gadget
driver. This series is tested with MUSB driver model conversion
on AM335x GP evm and AM335x BBB (logs [1]).

Also pushed a branch for testing [2]

Changes from initial version:
* Separated out the usb gadget driver patches from earlier musb
  series [3] for testing and submitting of dwc3 dm musb patches.

[1] - http://pastebin.ubuntu.com/16345030/
[2] - git://git.ti.com/~mugunthanvnm/ti-u-boot/mugunth-ti-u-boot.git dm-musb-v2
[3] - http://lists.denx.de/pipermail/u-boot/2016-February/246827.html


Note:
~~~~~
The following checkpatch warning can be ignored as this has to be
fixed all over the file which should be a separate patch.
CHECK: Avoid CamelCase: <configNr>
#281: FILE: drivers/usb/gadget/rndis.c:1159:
+int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,

total: 0 errors, 0 warnings, 1 checks, 303 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

patches/usb_gadget/v2.00/0006-drivers-usb-gadget-ether-rndis-convert-driver-to-ado.patch has style problems, please review.


Mugunthan V N (6):
  drivers: usb: gadget: ether: adopt to usb driver model
  drivers: usb: gadget: ether: access network_started using local
    variable
  drivers: usb: gadget: ether: consolidate global devices to single
    struct
  drivers: usb: gadget: ether: use net device priv to pass usb ether
    priv
  drivers: usb: gadget: ether: prepare driver for driver model migration
  drivers: usb: gadget: ether/rndis: convert driver to adopt device
    driver model

 drivers/usb/gadget/ether.c | 314 ++++++++++++++++++++++++++++++++++++---------
 drivers/usb/gadget/rndis.c |  13 +-
 drivers/usb/gadget/rndis.h |  19 ++-
 include/net.h              |   7 +
 4 files changed, 288 insertions(+), 65 deletions(-)

-- 
2.8.2.372.g63a3502

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-19  3:59   ` Simon Glass
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable Mugunthan V N
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

Convert usb ether gadget to adopt usb driver model

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 9b06f02..ae5ffcd 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -24,6 +24,10 @@
 #include "gadget_chips.h"
 #include "rndis.h"
 
+#include <dm.h>
+#include <dm/uclass-internal.h>
+#include <dm/device-internal.h>
+
 #define USB_NET_NAME "usb_ether"
 
 #define atomic_read
@@ -101,6 +105,9 @@ 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;
@@ -2303,6 +2310,24 @@ fail:
 
 /*-------------------------------------------------------------------------*/
 
+#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 int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 {
 	struct eth_dev *dev = &l_ethdev;
@@ -2315,7 +2340,14 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 		goto fail;
 	}
 
+#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
 
 	/* Configure default mac-addresses for the USB ethernet device */
 #ifdef CONFIG_USBNET_DEV_ADDR
@@ -2497,7 +2529,11 @@ void usb_eth_halt(struct eth_device *netdev)
 	}
 
 	usb_gadget_unregister_driver(&eth_driver);
+#ifdef CONFIG_DM_USB
+	device_remove(dev->usb_udev);
+#else
 	board_usb_cleanup(0, USB_INIT_DEVICE);
+#endif
 }
 
 static struct usb_gadget_driver eth_driver = {
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-19  3:59   ` Simon Glass
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct Mugunthan V N
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

network_started of struct eth_dev can be accessed using local
variable dev and no reason to access it with the global struct.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index ae5ffcd..89e5ab8 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -1142,7 +1142,7 @@ static void eth_status_complete(struct usb_ep *ep, struct usb_request *req)
 			event->bNotificationType, value);
 		if (event->bNotificationType ==
 				USB_CDC_NOTIFY_SPEED_CHANGE) {
-			l_ethdev.network_started = 1;
+			dev->network_started = 1;
 			printf("USB network up!\n");
 		}
 	}
@@ -1330,7 +1330,7 @@ eth_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
 			 * that network is working. So we signalize it
 			 * here.
 			 */
-			l_ethdev.network_started = 1;
+			dev->network_started = 1;
 			debug("USB network up!\n");
 			goto done_set_intf;
 		}
@@ -1830,10 +1830,10 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
 		debug("rndis control ack complete --> %d, %d/%d\n",
 			req->status, req->actual, req->length);
 
-	if (!l_ethdev.network_started) {
+	if (!dev->network_started) {
 		if (rndis_get_state(dev->rndis_config)
 				== RNDIS_DATA_INITIALIZED) {
-			l_ethdev.network_started = 1;
+			dev->network_started = 1;
 			printf("USB RNDIS network up!\n");
 		}
 	}
@@ -2389,7 +2389,7 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 		timeout = simple_strtoul(getenv("cdc_connect_timeout"),
 						NULL, 10) * CONFIG_SYS_HZ;
 	ts = get_timer(0);
-	while (!l_ethdev.network_started) {
+	while (!dev->network_started) {
 		/* Handle control-c and timeouts */
 		if (ctrlc() || (get_timer(ts) > timeout)) {
 			error("The remote end did not respond in time.");
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model Mugunthan V N
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-19  4:00   ` Simon Glass
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv Mugunthan V N
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

Consolidate the net device, usb eth device and gadget device
struct to single struct and a single global variable so that the
same can be passed as priv of ethernet driver.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 53 +++++++++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 27 deletions(-)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 89e5ab8..b40d99a 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -141,9 +141,14 @@ struct eth_dev {
  */
 
 /*-------------------------------------------------------------------------*/
-static struct eth_dev l_ethdev;
-static struct eth_device l_netdev;
-static struct usb_gadget_driver eth_driver;
+struct ether_priv {
+	struct eth_dev ethdev;
+	struct eth_device netdev;
+	struct usb_gadget_driver eth_driver;
+};
+
+struct ether_priv eth_priv;
+struct ether_priv *l_priv = &eth_priv;
 
 /*-------------------------------------------------------------------------*/
 
@@ -1848,7 +1853,7 @@ static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
 
 static int rndis_control_ack(struct eth_device *net)
 {
-	struct eth_dev		*dev = &l_ethdev;
+	struct eth_dev		*dev = &l_priv->ethdev;
 	int                     length;
 	struct usb_request      *resp = dev->stat_req;
 
@@ -1989,7 +1994,7 @@ static int get_ether_addr(const char *str, u8 *dev_addr)
 
 static int eth_bind(struct usb_gadget *gadget)
 {
-	struct eth_dev		*dev = &l_ethdev;
+	struct eth_dev		*dev = &l_priv->ethdev;
 	u8			cdc = 1, zlp = 1, rndis = 1;
 	struct usb_ep		*in_ep, *out_ep, *status_ep = NULL;
 	int			status = -ENOMEM;
@@ -2182,7 +2187,7 @@ autoconf_fail:
 
 
 	/* network device setup */
-	dev->net = &l_netdev;
+	dev->net = &l_priv->netdev;
 
 	dev->cdc = cdc;
 	dev->zlp = zlp;
@@ -2330,7 +2335,7 @@ int dm_usb_init(struct eth_dev *e_dev)
 
 static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 {
-	struct eth_dev *dev = &l_ethdev;
+	struct eth_dev *dev = &l_priv->ethdev;
 	struct usb_gadget *gadget;
 	unsigned long ts;
 	unsigned long timeout = USB_CONNECT_TIMEOUT;
@@ -2374,7 +2379,15 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 		goto fail;
 	}
 
-	if (usb_gadget_register_driver(&eth_driver) < 0)
+	l_priv->eth_driver.speed	= DEVSPEED;
+	l_priv->eth_driver.bind		= eth_bind;
+	l_priv->eth_driver.unbind	= eth_unbind;
+	l_priv->eth_driver.setup	= eth_setup;
+	l_priv->eth_driver.reset	= eth_disconnect;
+	l_priv->eth_driver.disconnect	= eth_disconnect;
+	l_priv->eth_driver.suspend	= eth_suspend;
+	l_priv->eth_driver.resume	= eth_resume;
+	if (usb_gadget_register_driver(&l_priv->eth_driver) < 0)
 		goto fail;
 
 	dev->network_started = 0;
@@ -2409,7 +2422,7 @@ static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
 {
 	int			retval;
 	void			*rndis_pkt = NULL;
-	struct eth_dev		*dev = &l_ethdev;
+	struct eth_dev		*dev = &l_priv->ethdev;
 	struct usb_request	*req = dev->tx_req;
 	unsigned long ts;
 	unsigned long timeout = USB_CONNECT_TIMEOUT;
@@ -2476,7 +2489,7 @@ drop:
 
 static int usb_eth_recv(struct eth_device *netdev)
 {
-	struct eth_dev *dev = &l_ethdev;
+	struct eth_dev *dev = &l_priv->ethdev;
 
 	usb_gadget_handle_interrupts(0);
 
@@ -2496,7 +2509,7 @@ static int usb_eth_recv(struct eth_device *netdev)
 
 void usb_eth_halt(struct eth_device *netdev)
 {
-	struct eth_dev *dev = &l_ethdev;
+	struct eth_dev *dev = &l_priv->ethdev;
 
 	if (!netdev) {
 		error("received NULL ptr");
@@ -2528,7 +2541,7 @@ void usb_eth_halt(struct eth_device *netdev)
 		dev->network_started = 0;
 	}
 
-	usb_gadget_unregister_driver(&eth_driver);
+	usb_gadget_unregister_driver(&l_priv->eth_driver);
 #ifdef CONFIG_DM_USB
 	device_remove(dev->usb_udev);
 #else
@@ -2536,23 +2549,9 @@ void usb_eth_halt(struct eth_device *netdev)
 #endif
 }
 
-static struct usb_gadget_driver eth_driver = {
-	.speed		= DEVSPEED,
-
-	.bind		= eth_bind,
-	.unbind		= eth_unbind,
-
-	.setup		= eth_setup,
-	.reset		= eth_disconnect,
-	.disconnect	= eth_disconnect,
-
-	.suspend	= eth_suspend,
-	.resume		= eth_resume,
-};
-
 int usb_eth_initialize(bd_t *bi)
 {
-	struct eth_device *netdev = &l_netdev;
+	struct eth_device *netdev = &l_priv->netdev;
 
 	strlcpy(netdev->name, USB_NET_NAME, sizeof(netdev->name));
 
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
                   ` (2 preceding siblings ...)
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-19  4:00   ` Simon Glass
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration Mugunthan V N
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model Mugunthan V N
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

Use net device priv to pass usb ether priv and use it in
net device ops callback.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 46 +++++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 25 deletions(-)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index b40d99a..47071c3 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -1853,7 +1853,8 @@ static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
 
 static int rndis_control_ack(struct eth_device *net)
 {
-	struct eth_dev		*dev = &l_priv->ethdev;
+	struct ether_priv	*priv = (struct ether_priv *)net->priv;
+	struct eth_dev		*dev = &priv->ethdev;
 	int                     length;
 	struct usb_request      *resp = dev->stat_req;
 
@@ -2335,16 +2336,12 @@ int dm_usb_init(struct eth_dev *e_dev)
 
 static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 {
-	struct eth_dev *dev = &l_priv->ethdev;
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+	struct eth_dev *dev = &priv->ethdev;
 	struct usb_gadget *gadget;
 	unsigned long ts;
 	unsigned long timeout = USB_CONNECT_TIMEOUT;
 
-	if (!netdev) {
-		error("received NULL ptr");
-		goto fail;
-	}
-
 #ifdef CONFIG_DM_USB
 	if (dm_usb_init(dev)) {
 		error("USB ether not found\n");
@@ -2379,15 +2376,15 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 		goto fail;
 	}
 
-	l_priv->eth_driver.speed	= DEVSPEED;
-	l_priv->eth_driver.bind		= eth_bind;
-	l_priv->eth_driver.unbind	= eth_unbind;
-	l_priv->eth_driver.setup	= eth_setup;
-	l_priv->eth_driver.reset	= eth_disconnect;
-	l_priv->eth_driver.disconnect	= eth_disconnect;
-	l_priv->eth_driver.suspend	= eth_suspend;
-	l_priv->eth_driver.resume	= eth_resume;
-	if (usb_gadget_register_driver(&l_priv->eth_driver) < 0)
+	priv->eth_driver.speed		= DEVSPEED;
+	priv->eth_driver.bind		= eth_bind;
+	priv->eth_driver.unbind		= eth_unbind;
+	priv->eth_driver.setup		= eth_setup;
+	priv->eth_driver.reset		= eth_disconnect;
+	priv->eth_driver.disconnect	= eth_disconnect;
+	priv->eth_driver.suspend	= eth_suspend;
+	priv->eth_driver.resume		= eth_resume;
+	if (usb_gadget_register_driver(&priv->eth_driver) < 0)
 		goto fail;
 
 	dev->network_started = 0;
@@ -2422,7 +2419,8 @@ static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
 {
 	int			retval;
 	void			*rndis_pkt = NULL;
-	struct eth_dev		*dev = &l_priv->ethdev;
+	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
+	struct eth_dev		*dev = &priv->ethdev;
 	struct usb_request	*req = dev->tx_req;
 	unsigned long ts;
 	unsigned long timeout = USB_CONNECT_TIMEOUT;
@@ -2489,7 +2487,8 @@ drop:
 
 static int usb_eth_recv(struct eth_device *netdev)
 {
-	struct eth_dev *dev = &l_priv->ethdev;
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+	struct eth_dev *dev = &priv->ethdev;
 
 	usb_gadget_handle_interrupts(0);
 
@@ -2509,12 +2508,8 @@ static int usb_eth_recv(struct eth_device *netdev)
 
 void usb_eth_halt(struct eth_device *netdev)
 {
-	struct eth_dev *dev = &l_priv->ethdev;
-
-	if (!netdev) {
-		error("received NULL ptr");
-		return;
-	}
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+	struct eth_dev *dev = &priv->ethdev;
 
 	/* If the gadget not registered, simple return */
 	if (!dev->gadget)
@@ -2541,7 +2536,7 @@ void usb_eth_halt(struct eth_device *netdev)
 		dev->network_started = 0;
 	}
 
-	usb_gadget_unregister_driver(&l_priv->eth_driver);
+	usb_gadget_unregister_driver(&priv->eth_driver);
 #ifdef CONFIG_DM_USB
 	device_remove(dev->usb_udev);
 #else
@@ -2559,6 +2554,7 @@ int usb_eth_initialize(bd_t *bi)
 	netdev->send = usb_eth_send;
 	netdev->recv = usb_eth_recv;
 	netdev->halt = usb_eth_halt;
+	netdev->priv = l_priv;
 
 #ifdef CONFIG_MCAST_TFTP
   #error not supported
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
                   ` (3 preceding siblings ...)
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-10 12:24   ` Marek Vasut
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model Mugunthan V N
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

prepare driver for driver model migration

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 72 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 51 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 47071c3..2f70ebf 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -2334,9 +2334,8 @@ int dm_usb_init(struct eth_dev *e_dev)
 }
 #endif
 
-static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
+static int _usb_eth_init(struct ether_priv *priv)
 {
-	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
 	struct eth_dev *dev = &priv->ethdev;
 	struct usb_gadget *gadget;
 	unsigned long ts;
@@ -2415,11 +2414,10 @@ fail:
 	return -1;
 }
 
-static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
+static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
 {
 	int			retval;
 	void			*rndis_pkt = NULL;
-	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
 	struct eth_dev		*dev = &priv->ethdev;
 	struct usb_request	*req = dev->tx_req;
 	unsigned long ts;
@@ -2485,30 +2483,15 @@ drop:
 	return -ENOMEM;
 }
 
-static int usb_eth_recv(struct eth_device *netdev)
+static int _usb_eth_recv(struct ether_priv *priv)
 {
-	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
-	struct eth_dev *dev = &priv->ethdev;
-
 	usb_gadget_handle_interrupts(0);
 
-	if (packet_received) {
-		debug("%s: packet received\n", __func__);
-		if (dev->rx_req) {
-			net_process_received_packet(net_rx_packets[0],
-						    dev->rx_req->length);
-			packet_received = 0;
-
-			rx_submit(dev, dev->rx_req, 0);
-		} else
-			error("dev->rx_req invalid");
-	}
 	return 0;
 }
 
-void usb_eth_halt(struct eth_device *netdev)
+void _usb_eth_halt(struct ether_priv *priv)
 {
-	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
 	struct eth_dev *dev = &priv->ethdev;
 
 	/* If the gadget not registered, simple return */
@@ -2544,6 +2527,53 @@ void usb_eth_halt(struct eth_device *netdev)
 #endif
 }
 
+static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
+{
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+
+	return _usb_eth_init(priv);
+}
+
+static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
+{
+	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
+
+	return _usb_eth_send(priv, packet, length);
+}
+
+static int usb_eth_recv(struct eth_device *netdev)
+{
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+	struct eth_dev *dev = &priv->ethdev;
+	int ret;
+
+	ret = _usb_eth_recv(priv);
+	if (ret) {
+		error("error packet receive\n");
+		return ret;
+	}
+
+	if (packet_received) {
+		if (dev->rx_req) {
+			net_process_received_packet(net_rx_packets[0],
+						    dev->rx_req->length);
+		} else {
+			error("dev->rx_req invalid");
+		}
+		packet_received = 0;
+		rx_submit(dev, dev->rx_req, 0);
+	}
+
+	return 0;
+}
+
+void usb_eth_halt(struct eth_device *netdev)
+{
+	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+
+	_usb_eth_halt(priv);
+}
+
 int usb_eth_initialize(bd_t *bi)
 {
 	struct eth_device *netdev = &l_priv->netdev;
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model
  2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
                   ` (4 preceding siblings ...)
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration Mugunthan V N
@ 2016-05-10 11:44 ` Mugunthan V N
  2016-05-10 12:27   ` Marek Vasut
  5 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-10 11:44 UTC (permalink / raw)
  To: u-boot

Adopt usb ether gadget and rndis driver to adopt driver model

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/usb/gadget/ether.c | 153 ++++++++++++++++++++++++++++++++++++++++++---
 drivers/usb/gadget/rndis.c |  13 +++-
 drivers/usb/gadget/rndis.h |  19 ++++--
 include/net.h              |   7 +++
 4 files changed, 177 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 2f70ebf..c436f75 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -25,6 +25,7 @@
 #include "rndis.h"
 
 #include <dm.h>
+#include <dm/lists.h>
 #include <dm/uclass-internal.h>
 #include <dm/device-internal.h>
 
@@ -116,7 +117,11 @@ struct eth_dev {
 
 	struct usb_request	*tx_req, *rx_req;
 
+#ifndef CONFIG_DM_ETH
 	struct eth_device	*net;
+#else
+	struct udevice		*net;
+#endif
 	struct net_device_stats	stats;
 	unsigned int		tx_qlen;
 
@@ -143,7 +148,11 @@ struct eth_dev {
 /*-------------------------------------------------------------------------*/
 struct ether_priv {
 	struct eth_dev ethdev;
+#ifndef CONFIG_DM_ETH
 	struct eth_device netdev;
+#else
+	struct udevice *netdev;
+#endif
 	struct usb_gadget_driver eth_driver;
 };
 
@@ -1851,7 +1860,11 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
 
 static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
 
+#ifndef CONFIG_DM_ETH
 static int rndis_control_ack(struct eth_device *net)
+#else
+static int rndis_control_ack(struct udevice *net)
+#endif
 {
 	struct ether_priv	*priv = (struct ether_priv *)net->priv;
 	struct eth_dev		*dev = &priv->ethdev;
@@ -2001,6 +2014,9 @@ static int eth_bind(struct usb_gadget *gadget)
 	int			status = -ENOMEM;
 	int			gcnum;
 	u8			tmp[7];
+#ifdef CONFIG_DM_ETH
+	struct eth_pdata	*pdata = dev_get_platdata(l_priv->netdev);
+#endif
 
 	/* these flags are only ever cleared; compiler take note */
 #ifndef	CONFIG_USB_ETH_CDC
@@ -2188,7 +2204,11 @@ autoconf_fail:
 
 
 	/* network device setup */
+#ifndef CONFIG_DM_ETH
 	dev->net = &l_priv->netdev;
+#else
+	dev->net = l_priv->netdev;
+#endif
 
 	dev->cdc = cdc;
 	dev->zlp = zlp;
@@ -2197,6 +2217,7 @@ autoconf_fail:
 	dev->out_ep = out_ep;
 	dev->status_ep = status_ep;
 
+	memset(tmp, 0, sizeof(tmp));
 	/*
 	 * Module params for these addresses should come from ID proms.
 	 * The host side address is used with CDC and RNDIS, and commonly
@@ -2204,10 +2225,13 @@ autoconf_fail:
 	 * host side code for the SAFE thing cares -- its original BLAN
 	 * thing didn't, Sharp never assigned those addresses on Zaurii.
 	 */
+#ifndef CONFIG_DM_ETH
 	get_ether_addr(dev_addr, dev->net->enetaddr);
-
-	memset(tmp, 0, sizeof(tmp));
 	memcpy(tmp, dev->net->enetaddr, sizeof(dev->net->enetaddr));
+#else
+	get_ether_addr(dev_addr, pdata->enetaddr);
+	memcpy(tmp, pdata->enetaddr, sizeof(pdata->enetaddr));
+#endif
 
 	get_ether_addr(host_addr, dev->host_mac);
 
@@ -2268,10 +2292,11 @@ autoconf_fail:
 		status_ep ? " STATUS " : "",
 		status_ep ? status_ep->name : ""
 		);
-	printf("MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-		dev->net->enetaddr[0], dev->net->enetaddr[1],
-		dev->net->enetaddr[2], dev->net->enetaddr[3],
-		dev->net->enetaddr[4], dev->net->enetaddr[5]);
+#ifndef CONFIG_DM_ETH
+	printf("MAC %pM\n", dev->net->enetaddr);
+#else
+	printf("MAC %pM\n", pdata->enetaddr);
+#endif
 
 	if (cdc || rndis)
 		printf("HOST MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
@@ -2520,13 +2545,12 @@ void _usb_eth_halt(struct ether_priv *priv)
 	}
 
 	usb_gadget_unregister_driver(&priv->eth_driver);
-#ifdef CONFIG_DM_USB
-	device_remove(dev->usb_udev);
-#else
+#ifndef CONFIG_DM_USB
 	board_usb_cleanup(0, USB_INIT_DEVICE);
 #endif
 }
 
+#ifndef CONFIG_DM_ETH
 static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
 {
 	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
@@ -2592,3 +2616,114 @@ int usb_eth_initialize(bd_t *bi)
 	eth_register(netdev);
 	return 0;
 }
+#else
+static int usb_eth_start(struct udevice *dev)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+
+	return _usb_eth_init(priv);
+}
+
+static int usb_eth_send(struct udevice *dev, void *packet, int length)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+
+	return _usb_eth_send(priv, packet, length);
+}
+
+static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+	struct eth_dev *ethdev = &priv->ethdev;
+	int ret;
+
+	ret = _usb_eth_recv(priv);
+	if (ret) {
+		error("error packet receive\n");
+		return ret;
+	}
+
+	if (packet_received) {
+		if (ethdev->rx_req) {
+			*packetp = (uchar *)net_rx_packets[0];
+			return ethdev->rx_req->length;
+		} else {
+			error("dev->rx_req invalid");
+			return -EFAULT;
+		}
+	}
+
+	return -EAGAIN;
+}
+
+static int usb_eth_free_pkt(struct udevice *dev, uchar *packet,
+				   int length)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+	struct eth_dev *ethdev = &priv->ethdev;
+
+	packet_received = 0;
+
+	return rx_submit(ethdev, ethdev->rx_req, 0);
+}
+
+static void usb_eth_stop(struct udevice *dev)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+
+	_usb_eth_halt(priv);
+}
+
+static int usb_eth_probe(struct udevice *dev)
+{
+	struct ether_priv *priv = dev_get_priv(dev);
+	struct eth_pdata *pdata = dev_get_platdata(dev);
+
+	priv->netdev = dev;
+	l_priv = priv;
+
+	get_ether_addr("de:ad:be:ef:00:01", pdata->enetaddr);
+	eth_setenv_enetaddr("usbnet_devaddr", pdata->enetaddr);
+
+	return 0;
+}
+
+static const struct eth_ops usb_eth_ops = {
+	.start		= usb_eth_start,
+	.send		= usb_eth_send,
+	.recv		= usb_eth_recv,
+	.free_pkt	= usb_eth_free_pkt,
+	.stop		= usb_eth_stop,
+};
+
+int usb_ether_init(void)
+{
+	struct udevice *dev;
+	struct udevice *usb_dev;
+	int ret;
+
+	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
+	if (!usb_dev || ret) {
+		error("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");
+		return ret;
+	}
+
+	return 0;
+}
+
+U_BOOT_DRIVER(eth_usb) = {
+	.name	= "usb_ether",
+	.id	= UCLASS_ETH,
+	.probe	= usb_eth_probe,
+	.ops	= &usb_eth_ops,
+	.priv_auto_alloc_size = sizeof(struct ether_priv),
+	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
+	.flags = DM_FLAG_ALLOC_PRIV_DMA,
+};
+#endif /* CONFIG_DM_ETH */
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
index 48463db..e6029ec 100644
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -1123,7 +1123,11 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
 	return -ENOTSUPP;
 }
 
+#ifndef CONFIG_DM_ETH
 int rndis_register(int (*rndis_control_ack)(struct eth_device *))
+#else
+int rndis_register(int (*rndis_control_ack)(struct udevice *))
+#endif
 {
 	u8 i;
 
@@ -1151,8 +1155,13 @@ void rndis_deregister(int configNr)
 	return;
 }
 
-int rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
-			struct net_device_stats *stats,	u16 *cdc_filter)
+#ifndef CONFIG_DM_ETH
+int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
+			 struct net_device_stats *stats, u16 *cdc_filter)
+#else
+int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
+			 struct net_device_stats *stats, u16 *cdc_filter)
+#endif
 {
 	debug("%s: configNr = %d\n", __func__, configNr);
 	if (!dev || !stats)
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h
index 7a389a5..084af85 100644
--- a/drivers/usb/gadget/rndis.h
+++ b/drivers/usb/gadget/rndis.h
@@ -222,23 +222,34 @@ typedef struct rndis_params {
 
 	const u8		*host_mac;
 	u16			*filter;
-	struct eth_device	*dev;
 	struct net_device_stats *stats;
 	int			mtu;
 
 	u32			vendorID;
 	const char		*vendorDescr;
-	int			(*ack)(struct eth_device *);
+#ifndef CONFIG_DM_ETH
+	struct eth_device	*dev;
+	int (*ack)(struct eth_device *);
+#else
+	struct udevice		*dev;
+	int (*ack)(struct udevice *);
+#endif
 	struct list_head	resp_queue;
 } rndis_params;
 
 /* RNDIS Message parser and other useless functions */
 int  rndis_msg_parser(u8 configNr, u8 *buf);
 enum rndis_state rndis_get_state(int configNr);
-int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
 void rndis_deregister(int configNr);
+#ifndef CONFIG_DM_ETH
+int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
 int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
-			struct net_device_stats *stats, u16 *cdc_filter);
+			 struct net_device_stats *stats, u16 *cdc_filter);
+#else
+int  rndis_register(int (*rndis_control_ack)(struct udevice *));
+int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
+			 struct net_device_stats *stats, u16 *cdc_filter);
+#endif
 int  rndis_set_param_vendor(u8 configNr, u32 vendorID,
 			    const char *vendorDescr);
 int  rndis_set_param_medium(u8 configNr, u32 medium, u32 speed);
diff --git a/include/net.h b/include/net.h
index 05800c4..7dcc6c8 100644
--- a/include/net.h
+++ b/include/net.h
@@ -254,6 +254,13 @@ int eth_setenv_enetaddr_by_index(const char *base_name, int index,
 				 uchar *enetaddr);
 
 
+/*
+ * Initialize USB ethernet device with CONFIG_DM_ETH
+ * Returns:
+ *	0 is success, non-zero is error status.
+ */
+int usb_ether_init(void);
+
 /*
  * Get the hardware address for an ethernet interface .
  * Args:
-- 
2.8.2.372.g63a3502

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration Mugunthan V N
@ 2016-05-10 12:24   ` Marek Vasut
  2016-05-12  5:32     ` Mugunthan V N
  0 siblings, 1 reply; 16+ messages in thread
From: Marek Vasut @ 2016-05-10 12:24 UTC (permalink / raw)
  To: u-boot

On 05/10/2016 01:44 PM, Mugunthan V N wrote:
> prepare driver for driver model migration
> 
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 72 ++++++++++++++++++++++++++++++++--------------
>  1 file changed, 51 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
> index 47071c3..2f70ebf 100644
> --- a/drivers/usb/gadget/ether.c
> +++ b/drivers/usb/gadget/ether.c
> @@ -2334,9 +2334,8 @@ int dm_usb_init(struct eth_dev *e_dev)
>  }
>  #endif
>  
> -static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
> +static int _usb_eth_init(struct ether_priv *priv)
>  {
> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>  	struct eth_dev *dev = &priv->ethdev;
>  	struct usb_gadget *gadget;
>  	unsigned long ts;
> @@ -2415,11 +2414,10 @@ fail:
>  	return -1;
>  }
>  
> -static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
> +static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
>  {
>  	int			retval;
>  	void			*rndis_pkt = NULL;
> -	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
>  	struct eth_dev		*dev = &priv->ethdev;
>  	struct usb_request	*req = dev->tx_req;
>  	unsigned long ts;
> @@ -2485,30 +2483,15 @@ drop:
>  	return -ENOMEM;
>  }
>  
> -static int usb_eth_recv(struct eth_device *netdev)
> +static int _usb_eth_recv(struct ether_priv *priv)
>  {
> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
> -	struct eth_dev *dev = &priv->ethdev;
> -
>  	usb_gadget_handle_interrupts(0);
>  
> -	if (packet_received) {
> -		debug("%s: packet received\n", __func__);
> -		if (dev->rx_req) {
> -			net_process_received_packet(net_rx_packets[0],
> -						    dev->rx_req->length);
> -			packet_received = 0;
> -
> -			rx_submit(dev, dev->rx_req, 0);
> -		} else
> -			error("dev->rx_req invalid");
> -	}
>  	return 0;
>  }
>  
> -void usb_eth_halt(struct eth_device *netdev)
> +void _usb_eth_halt(struct ether_priv *priv)
>  {
> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>  	struct eth_dev *dev = &priv->ethdev;
>  
>  	/* If the gadget not registered, simple return */
> @@ -2544,6 +2527,53 @@ void usb_eth_halt(struct eth_device *netdev)
>  #endif
>  }
>  
> +static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
> +{
> +	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
> +
> +	return _usb_eth_init(priv);
> +}
> +
> +static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
> +{
> +	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
> +
> +	return _usb_eth_send(priv, packet, length);
> +}
> +
> +static int usb_eth_recv(struct eth_device *netdev)
> +{
> +	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
> +	struct eth_dev *dev = &priv->ethdev;
> +	int ret;
> +
> +	ret = _usb_eth_recv(priv);
> +	if (ret) {
> +		error("error packet receive\n");
> +		return ret;
> +	}
> +
> +	if (packet_received) {

if (!packet_received)
 return 0;
... the rest ...

> +		if (dev->rx_req) {
> +			net_process_received_packet(net_rx_packets[0],
> +						    dev->rx_req->length);
> +		} else {
> +			error("dev->rx_req invalid");
> +		}
> +		packet_received = 0;
> +		rx_submit(dev, dev->rx_req, 0);
> +	}
> +
> +	return 0;
> +}
> +
> +void usb_eth_halt(struct eth_device *netdev)
> +{
> +	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
> +
> +	_usb_eth_halt(priv);
> +}
> +
>  int usb_eth_initialize(bd_t *bi)
>  {
>  	struct eth_device *netdev = &l_priv->netdev;
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model Mugunthan V N
@ 2016-05-10 12:27   ` Marek Vasut
  2016-05-12  5:43     ` Mugunthan V N
  0 siblings, 1 reply; 16+ messages in thread
From: Marek Vasut @ 2016-05-10 12:27 UTC (permalink / raw)
  To: u-boot

On 05/10/2016 01:44 PM, Mugunthan V N wrote:
> Adopt usb ether gadget and rndis driver to adopt driver model
> 
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 153 ++++++++++++++++++++++++++++++++++++++++++---
>  drivers/usb/gadget/rndis.c |  13 +++-
>  drivers/usb/gadget/rndis.h |  19 ++++--
>  include/net.h              |   7 +++
>  4 files changed, 177 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
> index 2f70ebf..c436f75 100644
> --- a/drivers/usb/gadget/ether.c
> +++ b/drivers/usb/gadget/ether.c
> @@ -25,6 +25,7 @@
>  #include "rndis.h"
>  
>  #include <dm.h>
> +#include <dm/lists.h>
>  #include <dm/uclass-internal.h>
>  #include <dm/device-internal.h>
>  
> @@ -116,7 +117,11 @@ struct eth_dev {
>  
>  	struct usb_request	*tx_req, *rx_req;
>  
> +#ifndef CONFIG_DM_ETH
>  	struct eth_device	*net;
> +#else
> +	struct udevice		*net;
> +#endif
>  	struct net_device_stats	stats;
>  	unsigned int		tx_qlen;
>  
> @@ -143,7 +148,11 @@ struct eth_dev {
>  /*-------------------------------------------------------------------------*/
>  struct ether_priv {
>  	struct eth_dev ethdev;
> +#ifndef CONFIG_DM_ETH
>  	struct eth_device netdev;
> +#else
> +	struct udevice *netdev;
> +#endif
>  	struct usb_gadget_driver eth_driver;
>  };
>  
> @@ -1851,7 +1860,11 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
>  
>  static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
>  
> +#ifndef CONFIG_DM_ETH
>  static int rndis_control_ack(struct eth_device *net)
> +#else
> +static int rndis_control_ack(struct udevice *net)
> +#endif
>  {
>  	struct ether_priv	*priv = (struct ether_priv *)net->priv;
>  	struct eth_dev		*dev = &priv->ethdev;
> @@ -2001,6 +2014,9 @@ static int eth_bind(struct usb_gadget *gadget)
>  	int			status = -ENOMEM;
>  	int			gcnum;
>  	u8			tmp[7];
> +#ifdef CONFIG_DM_ETH
> +	struct eth_pdata	*pdata = dev_get_platdata(l_priv->netdev);
> +#endif
>  
>  	/* these flags are only ever cleared; compiler take note */
>  #ifndef	CONFIG_USB_ETH_CDC
> @@ -2188,7 +2204,11 @@ autoconf_fail:
>  
>  
>  	/* network device setup */
> +#ifndef CONFIG_DM_ETH
>  	dev->net = &l_priv->netdev;
> +#else
> +	dev->net = l_priv->netdev;
> +#endif
>  
>  	dev->cdc = cdc;
>  	dev->zlp = zlp;
> @@ -2197,6 +2217,7 @@ autoconf_fail:
>  	dev->out_ep = out_ep;
>  	dev->status_ep = status_ep;
>  
> +	memset(tmp, 0, sizeof(tmp));
>  	/*
>  	 * Module params for these addresses should come from ID proms.
>  	 * The host side address is used with CDC and RNDIS, and commonly
> @@ -2204,10 +2225,13 @@ autoconf_fail:
>  	 * host side code for the SAFE thing cares -- its original BLAN
>  	 * thing didn't, Sharp never assigned those addresses on Zaurii.
>  	 */
> +#ifndef CONFIG_DM_ETH
>  	get_ether_addr(dev_addr, dev->net->enetaddr);
> -
> -	memset(tmp, 0, sizeof(tmp));
>  	memcpy(tmp, dev->net->enetaddr, sizeof(dev->net->enetaddr));
> +#else
> +	get_ether_addr(dev_addr, pdata->enetaddr);
> +	memcpy(tmp, pdata->enetaddr, sizeof(pdata->enetaddr));
> +#endif
>  
>  	get_ether_addr(host_addr, dev->host_mac);
>  
> @@ -2268,10 +2292,11 @@ autoconf_fail:
>  		status_ep ? " STATUS " : "",
>  		status_ep ? status_ep->name : ""
>  		);
> -	printf("MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
> -		dev->net->enetaddr[0], dev->net->enetaddr[1],
> -		dev->net->enetaddr[2], dev->net->enetaddr[3],
> -		dev->net->enetaddr[4], dev->net->enetaddr[5]);
> +#ifndef CONFIG_DM_ETH
> +	printf("MAC %pM\n", dev->net->enetaddr);
> +#else
> +	printf("MAC %pM\n", pdata->enetaddr);
> +#endif
>  
>  	if (cdc || rndis)
>  		printf("HOST MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
> @@ -2520,13 +2545,12 @@ void _usb_eth_halt(struct ether_priv *priv)
>  	}
>  
>  	usb_gadget_unregister_driver(&priv->eth_driver);
> -#ifdef CONFIG_DM_USB
> -	device_remove(dev->usb_udev);
> -#else
> +#ifndef CONFIG_DM_USB
>  	board_usb_cleanup(0, USB_INIT_DEVICE);
>  #endif
>  }
>  
> +#ifndef CONFIG_DM_ETH
>  static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
>  {
>  	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
> @@ -2592,3 +2616,114 @@ int usb_eth_initialize(bd_t *bi)
>  	eth_register(netdev);
>  	return 0;
>  }
> +#else
> +static int usb_eth_start(struct udevice *dev)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +
> +	return _usb_eth_init(priv);
> +}
> +
> +static int usb_eth_send(struct udevice *dev, void *packet, int length)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +
> +	return _usb_eth_send(priv, packet, length);
> +}
> +
> +static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +	struct eth_dev *ethdev = &priv->ethdev;
> +	int ret;
> +
> +	ret = _usb_eth_recv(priv);
> +	if (ret) {
> +		error("error packet receive\n");
> +		return ret;
> +	}
> +
> +	if (packet_received) {
> +		if (ethdev->rx_req) {
> +			*packetp = (uchar *)net_rx_packets[0];
> +			return ethdev->rx_req->length;
> +		} else {
> +			error("dev->rx_req invalid");

Is this useful information ?

> +			return -EFAULT;
> +		}
> +	}
> +
> +	return -EAGAIN;
> +}
> +
> +static int usb_eth_free_pkt(struct udevice *dev, uchar *packet,
> +				   int length)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +	struct eth_dev *ethdev = &priv->ethdev;
> +
> +	packet_received = 0;
> +
> +	return rx_submit(ethdev, ethdev->rx_req, 0);
> +}
> +
> +static void usb_eth_stop(struct udevice *dev)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +
> +	_usb_eth_halt(priv);
> +}
> +
> +static int usb_eth_probe(struct udevice *dev)
> +{
> +	struct ether_priv *priv = dev_get_priv(dev);
> +	struct eth_pdata *pdata = dev_get_platdata(dev);
> +
> +	priv->netdev = dev;
> +	l_priv = priv;
> +
> +	get_ether_addr("de:ad:be:ef:00:01", pdata->enetaddr);

Can we avoid hard-coding this default MAC ?

> +	eth_setenv_enetaddr("usbnet_devaddr", pdata->enetaddr);
> +
> +	return 0;
> +}
> +
> +static const struct eth_ops usb_eth_ops = {
> +	.start		= usb_eth_start,
> +	.send		= usb_eth_send,
> +	.recv		= usb_eth_recv,
> +	.free_pkt	= usb_eth_free_pkt,
> +	.stop		= usb_eth_stop,
> +};
> +
> +int usb_ether_init(void)
> +{
> +	struct udevice *dev;
> +	struct udevice *usb_dev;
> +	int ret;
> +
> +	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
> +	if (!usb_dev || ret) {
> +		error("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");

Can you keep the messages consistent in some way ? Some start with
capital letter, some don't . I would much rather see something like
"%s: unable to bind usb_ether device\n", __func__

> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +U_BOOT_DRIVER(eth_usb) = {
> +	.name	= "usb_ether",
> +	.id	= UCLASS_ETH,
> +	.probe	= usb_eth_probe,
> +	.ops	= &usb_eth_ops,
> +	.priv_auto_alloc_size = sizeof(struct ether_priv),
> +	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
> +	.flags = DM_FLAG_ALLOC_PRIV_DMA,
> +};
> +#endif /* CONFIG_DM_ETH */
> diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
> index 48463db..e6029ec 100644
> --- a/drivers/usb/gadget/rndis.c
> +++ b/drivers/usb/gadget/rndis.c
> @@ -1123,7 +1123,11 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
>  	return -ENOTSUPP;
>  }
>  
> +#ifndef CONFIG_DM_ETH
>  int rndis_register(int (*rndis_control_ack)(struct eth_device *))
> +#else
> +int rndis_register(int (*rndis_control_ack)(struct udevice *))
> +#endif
>  {
>  	u8 i;
>  
> @@ -1151,8 +1155,13 @@ void rndis_deregister(int configNr)
>  	return;
>  }
>  
> -int rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
> -			struct net_device_stats *stats,	u16 *cdc_filter)
> +#ifndef CONFIG_DM_ETH
> +int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
> +			 struct net_device_stats *stats, u16 *cdc_filter)
> +#else
> +int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
> +			 struct net_device_stats *stats, u16 *cdc_filter)
> +#endif
>  {
>  	debug("%s: configNr = %d\n", __func__, configNr);
>  	if (!dev || !stats)
> diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h
> index 7a389a5..084af85 100644
> --- a/drivers/usb/gadget/rndis.h
> +++ b/drivers/usb/gadget/rndis.h
> @@ -222,23 +222,34 @@ typedef struct rndis_params {
>  
>  	const u8		*host_mac;
>  	u16			*filter;
> -	struct eth_device	*dev;
>  	struct net_device_stats *stats;
>  	int			mtu;
>  
>  	u32			vendorID;
>  	const char		*vendorDescr;
> -	int			(*ack)(struct eth_device *);
> +#ifndef CONFIG_DM_ETH
> +	struct eth_device	*dev;
> +	int (*ack)(struct eth_device *);
> +#else
> +	struct udevice		*dev;
> +	int (*ack)(struct udevice *);
> +#endif
>  	struct list_head	resp_queue;
>  } rndis_params;
>  
>  /* RNDIS Message parser and other useless functions */
>  int  rndis_msg_parser(u8 configNr, u8 *buf);
>  enum rndis_state rndis_get_state(int configNr);
> -int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
>  void rndis_deregister(int configNr);
> +#ifndef CONFIG_DM_ETH
> +int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
>  int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
> -			struct net_device_stats *stats, u16 *cdc_filter);
> +			 struct net_device_stats *stats, u16 *cdc_filter);
> +#else
> +int  rndis_register(int (*rndis_control_ack)(struct udevice *));
> +int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
> +			 struct net_device_stats *stats, u16 *cdc_filter);
> +#endif
>  int  rndis_set_param_vendor(u8 configNr, u32 vendorID,
>  			    const char *vendorDescr);
>  int  rndis_set_param_medium(u8 configNr, u32 medium, u32 speed);
> diff --git a/include/net.h b/include/net.h
> index 05800c4..7dcc6c8 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -254,6 +254,13 @@ int eth_setenv_enetaddr_by_index(const char *base_name, int index,
>  				 uchar *enetaddr);
>  
>  
> +/*
> + * Initialize USB ethernet device with CONFIG_DM_ETH
> + * Returns:
> + *	0 is success, non-zero is error status.
> + */
> +int usb_ether_init(void);
> +
>  /*
>   * Get the hardware address for an ethernet interface .
>   * Args:
> 


-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration
  2016-05-10 12:24   ` Marek Vasut
@ 2016-05-12  5:32     ` Mugunthan V N
  0 siblings, 0 replies; 16+ messages in thread
From: Mugunthan V N @ 2016-05-12  5:32 UTC (permalink / raw)
  To: u-boot

On Tuesday 10 May 2016 05:54 PM, Marek Vasut wrote:
> On 05/10/2016 01:44 PM, Mugunthan V N wrote:
>> prepare driver for driver model migration
>>
>> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
>> ---
>>  drivers/usb/gadget/ether.c | 72 ++++++++++++++++++++++++++++++++--------------
>>  1 file changed, 51 insertions(+), 21 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
>> index 47071c3..2f70ebf 100644
>> --- a/drivers/usb/gadget/ether.c
>> +++ b/drivers/usb/gadget/ether.c
>> @@ -2334,9 +2334,8 @@ int dm_usb_init(struct eth_dev *e_dev)
>>  }
>>  #endif
>>  
>> -static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
>> +static int _usb_eth_init(struct ether_priv *priv)
>>  {
>> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>>  	struct eth_dev *dev = &priv->ethdev;
>>  	struct usb_gadget *gadget;
>>  	unsigned long ts;
>> @@ -2415,11 +2414,10 @@ fail:
>>  	return -1;
>>  }
>>  
>> -static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
>> +static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
>>  {
>>  	int			retval;
>>  	void			*rndis_pkt = NULL;
>> -	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
>>  	struct eth_dev		*dev = &priv->ethdev;
>>  	struct usb_request	*req = dev->tx_req;
>>  	unsigned long ts;
>> @@ -2485,30 +2483,15 @@ drop:
>>  	return -ENOMEM;
>>  }
>>  
>> -static int usb_eth_recv(struct eth_device *netdev)
>> +static int _usb_eth_recv(struct ether_priv *priv)
>>  {
>> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>> -	struct eth_dev *dev = &priv->ethdev;
>> -
>>  	usb_gadget_handle_interrupts(0);
>>  
>> -	if (packet_received) {
>> -		debug("%s: packet received\n", __func__);
>> -		if (dev->rx_req) {
>> -			net_process_received_packet(net_rx_packets[0],
>> -						    dev->rx_req->length);
>> -			packet_received = 0;
>> -
>> -			rx_submit(dev, dev->rx_req, 0);
>> -		} else
>> -			error("dev->rx_req invalid");
>> -	}
>>  	return 0;
>>  }
>>  
>> -void usb_eth_halt(struct eth_device *netdev)
>> +void _usb_eth_halt(struct ether_priv *priv)
>>  {
>> -	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>>  	struct eth_dev *dev = &priv->ethdev;
>>  
>>  	/* If the gadget not registered, simple return */
>> @@ -2544,6 +2527,53 @@ void usb_eth_halt(struct eth_device *netdev)
>>  #endif
>>  }
>>  
>> +static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
>> +{
>> +	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>> +
>> +	return _usb_eth_init(priv);
>> +}
>> +
>> +static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
>> +{
>> +	struct ether_priv	*priv = (struct ether_priv *)netdev->priv;
>> +
>> +	return _usb_eth_send(priv, packet, length);
>> +}
>> +
>> +static int usb_eth_recv(struct eth_device *netdev)
>> +{
>> +	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>> +	struct eth_dev *dev = &priv->ethdev;
>> +	int ret;
>> +
>> +	ret = _usb_eth_recv(priv);
>> +	if (ret) {
>> +		error("error packet receive\n");
>> +		return ret;
>> +	}
>> +
>> +	if (packet_received) {
> 
> if (!packet_received)
>  return 0;
> ... the rest ...

Will fix in next version.

Regards
Mugunthan V N

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model
  2016-05-10 12:27   ` Marek Vasut
@ 2016-05-12  5:43     ` Mugunthan V N
  2016-05-12 11:34       ` Marek Vasut
  0 siblings, 1 reply; 16+ messages in thread
From: Mugunthan V N @ 2016-05-12  5:43 UTC (permalink / raw)
  To: u-boot

On Tuesday 10 May 2016 05:57 PM, Marek Vasut wrote:
> On 05/10/2016 01:44 PM, Mugunthan V N wrote:
>> Adopt usb ether gadget and rndis driver to adopt driver model
>>
>> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
>> ---
>>  drivers/usb/gadget/ether.c | 153 ++++++++++++++++++++++++++++++++++++++++++---
>>  drivers/usb/gadget/rndis.c |  13 +++-
>>  drivers/usb/gadget/rndis.h |  19 ++++--
>>  include/net.h              |   7 +++
>>  4 files changed, 177 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
>> index 2f70ebf..c436f75 100644
>> --- a/drivers/usb/gadget/ether.c
>> +++ b/drivers/usb/gadget/ether.c
>> @@ -25,6 +25,7 @@
>>  #include "rndis.h"
>>  
>>  #include <dm.h>
>> +#include <dm/lists.h>
>>  #include <dm/uclass-internal.h>
>>  #include <dm/device-internal.h>
>>  
>> @@ -116,7 +117,11 @@ struct eth_dev {
>>  
>>  	struct usb_request	*tx_req, *rx_req;
>>  
>> +#ifndef CONFIG_DM_ETH
>>  	struct eth_device	*net;
>> +#else
>> +	struct udevice		*net;
>> +#endif
>>  	struct net_device_stats	stats;
>>  	unsigned int		tx_qlen;
>>  
>> @@ -143,7 +148,11 @@ struct eth_dev {
>>  /*-------------------------------------------------------------------------*/
>>  struct ether_priv {
>>  	struct eth_dev ethdev;
>> +#ifndef CONFIG_DM_ETH
>>  	struct eth_device netdev;
>> +#else
>> +	struct udevice *netdev;
>> +#endif
>>  	struct usb_gadget_driver eth_driver;
>>  };
>>  
>> @@ -1851,7 +1860,11 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
>>  
>>  static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
>>  
>> +#ifndef CONFIG_DM_ETH
>>  static int rndis_control_ack(struct eth_device *net)
>> +#else
>> +static int rndis_control_ack(struct udevice *net)
>> +#endif
>>  {
>>  	struct ether_priv	*priv = (struct ether_priv *)net->priv;
>>  	struct eth_dev		*dev = &priv->ethdev;
>> @@ -2001,6 +2014,9 @@ static int eth_bind(struct usb_gadget *gadget)
>>  	int			status = -ENOMEM;
>>  	int			gcnum;
>>  	u8			tmp[7];
>> +#ifdef CONFIG_DM_ETH
>> +	struct eth_pdata	*pdata = dev_get_platdata(l_priv->netdev);
>> +#endif
>>  
>>  	/* these flags are only ever cleared; compiler take note */
>>  #ifndef	CONFIG_USB_ETH_CDC
>> @@ -2188,7 +2204,11 @@ autoconf_fail:
>>  
>>  
>>  	/* network device setup */
>> +#ifndef CONFIG_DM_ETH
>>  	dev->net = &l_priv->netdev;
>> +#else
>> +	dev->net = l_priv->netdev;
>> +#endif
>>  
>>  	dev->cdc = cdc;
>>  	dev->zlp = zlp;
>> @@ -2197,6 +2217,7 @@ autoconf_fail:
>>  	dev->out_ep = out_ep;
>>  	dev->status_ep = status_ep;
>>  
>> +	memset(tmp, 0, sizeof(tmp));
>>  	/*
>>  	 * Module params for these addresses should come from ID proms.
>>  	 * The host side address is used with CDC and RNDIS, and commonly
>> @@ -2204,10 +2225,13 @@ autoconf_fail:
>>  	 * host side code for the SAFE thing cares -- its original BLAN
>>  	 * thing didn't, Sharp never assigned those addresses on Zaurii.
>>  	 */
>> +#ifndef CONFIG_DM_ETH
>>  	get_ether_addr(dev_addr, dev->net->enetaddr);
>> -
>> -	memset(tmp, 0, sizeof(tmp));
>>  	memcpy(tmp, dev->net->enetaddr, sizeof(dev->net->enetaddr));
>> +#else
>> +	get_ether_addr(dev_addr, pdata->enetaddr);
>> +	memcpy(tmp, pdata->enetaddr, sizeof(pdata->enetaddr));
>> +#endif
>>  
>>  	get_ether_addr(host_addr, dev->host_mac);
>>  
>> @@ -2268,10 +2292,11 @@ autoconf_fail:
>>  		status_ep ? " STATUS " : "",
>>  		status_ep ? status_ep->name : ""
>>  		);
>> -	printf("MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
>> -		dev->net->enetaddr[0], dev->net->enetaddr[1],
>> -		dev->net->enetaddr[2], dev->net->enetaddr[3],
>> -		dev->net->enetaddr[4], dev->net->enetaddr[5]);
>> +#ifndef CONFIG_DM_ETH
>> +	printf("MAC %pM\n", dev->net->enetaddr);
>> +#else
>> +	printf("MAC %pM\n", pdata->enetaddr);
>> +#endif
>>  
>>  	if (cdc || rndis)
>>  		printf("HOST MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
>> @@ -2520,13 +2545,12 @@ void _usb_eth_halt(struct ether_priv *priv)
>>  	}
>>  
>>  	usb_gadget_unregister_driver(&priv->eth_driver);
>> -#ifdef CONFIG_DM_USB
>> -	device_remove(dev->usb_udev);
>> -#else
>> +#ifndef CONFIG_DM_USB
>>  	board_usb_cleanup(0, USB_INIT_DEVICE);
>>  #endif
>>  }
>>  
>> +#ifndef CONFIG_DM_ETH
>>  static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
>>  {
>>  	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>> @@ -2592,3 +2616,114 @@ int usb_eth_initialize(bd_t *bi)
>>  	eth_register(netdev);
>>  	return 0;
>>  }
>> +#else
>> +static int usb_eth_start(struct udevice *dev)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +
>> +	return _usb_eth_init(priv);
>> +}
>> +
>> +static int usb_eth_send(struct udevice *dev, void *packet, int length)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +
>> +	return _usb_eth_send(priv, packet, length);
>> +}
>> +
>> +static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +	struct eth_dev *ethdev = &priv->ethdev;
>> +	int ret;
>> +
>> +	ret = _usb_eth_recv(priv);
>> +	if (ret) {
>> +		error("error packet receive\n");
>> +		return ret;
>> +	}
>> +
>> +	if (packet_received) {
>> +		if (ethdev->rx_req) {
>> +			*packetp = (uchar *)net_rx_packets[0];
>> +			return ethdev->rx_req->length;
>> +		} else {
>> +			error("dev->rx_req invalid");
> 
> Is this useful information ?

It is just a carry forward from non DM code.
I do feel that without a req, packet_receviced will never be true. If
you are okay, i will remove this in error log in next version.

> 
>> +			return -EFAULT;
>> +		}
>> +	}
>> +
>> +	return -EAGAIN;
>> +}
>> +
>> +static int usb_eth_free_pkt(struct udevice *dev, uchar *packet,
>> +				   int length)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +	struct eth_dev *ethdev = &priv->ethdev;
>> +
>> +	packet_received = 0;
>> +
>> +	return rx_submit(ethdev, ethdev->rx_req, 0);
>> +}
>> +
>> +static void usb_eth_stop(struct udevice *dev)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +
>> +	_usb_eth_halt(priv);
>> +}
>> +
>> +static int usb_eth_probe(struct udevice *dev)
>> +{
>> +	struct ether_priv *priv = dev_get_priv(dev);
>> +	struct eth_pdata *pdata = dev_get_platdata(dev);
>> +
>> +	priv->netdev = dev;
>> +	l_priv = priv;
>> +
>> +	get_ether_addr("de:ad:be:ef:00:01", pdata->enetaddr);
> 
> Can we avoid hard-coding this default MAC ?

Yeah, will fix in next version.

> 
>> +	eth_setenv_enetaddr("usbnet_devaddr", pdata->enetaddr);
>> +
>> +	return 0;
>> +}
>> +
>> +static const struct eth_ops usb_eth_ops = {
>> +	.start		= usb_eth_start,
>> +	.send		= usb_eth_send,
>> +	.recv		= usb_eth_recv,
>> +	.free_pkt	= usb_eth_free_pkt,
>> +	.stop		= usb_eth_stop,
>> +};
>> +
>> +int usb_ether_init(void)
>> +{
>> +	struct udevice *dev;
>> +	struct udevice *usb_dev;
>> +	int ret;
>> +
>> +	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
>> +	if (!usb_dev || ret) {
>> +		error("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");
> 
> Can you keep the messages consistent in some way ? Some start with
> capital letter, some don't . I would much rather see something like
> "%s: unable to bind usb_ether device\n", __func__

Yeah, will fix in next version.

Regards
Mugunthan V N

> 
>> +		return ret;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +U_BOOT_DRIVER(eth_usb) = {
>> +	.name	= "usb_ether",
>> +	.id	= UCLASS_ETH,
>> +	.probe	= usb_eth_probe,
>> +	.ops	= &usb_eth_ops,
>> +	.priv_auto_alloc_size = sizeof(struct ether_priv),
>> +	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
>> +	.flags = DM_FLAG_ALLOC_PRIV_DMA,
>> +};
>> +#endif /* CONFIG_DM_ETH */
>> diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
>> index 48463db..e6029ec 100644
>> --- a/drivers/usb/gadget/rndis.c
>> +++ b/drivers/usb/gadget/rndis.c
>> @@ -1123,7 +1123,11 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
>>  	return -ENOTSUPP;
>>  }
>>  
>> +#ifndef CONFIG_DM_ETH
>>  int rndis_register(int (*rndis_control_ack)(struct eth_device *))
>> +#else
>> +int rndis_register(int (*rndis_control_ack)(struct udevice *))
>> +#endif
>>  {
>>  	u8 i;
>>  
>> @@ -1151,8 +1155,13 @@ void rndis_deregister(int configNr)
>>  	return;
>>  }
>>  
>> -int rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
>> -			struct net_device_stats *stats,	u16 *cdc_filter)
>> +#ifndef CONFIG_DM_ETH
>> +int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
>> +			 struct net_device_stats *stats, u16 *cdc_filter)
>> +#else
>> +int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
>> +			 struct net_device_stats *stats, u16 *cdc_filter)
>> +#endif
>>  {
>>  	debug("%s: configNr = %d\n", __func__, configNr);
>>  	if (!dev || !stats)
>> diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h
>> index 7a389a5..084af85 100644
>> --- a/drivers/usb/gadget/rndis.h
>> +++ b/drivers/usb/gadget/rndis.h
>> @@ -222,23 +222,34 @@ typedef struct rndis_params {
>>  
>>  	const u8		*host_mac;
>>  	u16			*filter;
>> -	struct eth_device	*dev;
>>  	struct net_device_stats *stats;
>>  	int			mtu;
>>  
>>  	u32			vendorID;
>>  	const char		*vendorDescr;
>> -	int			(*ack)(struct eth_device *);
>> +#ifndef CONFIG_DM_ETH
>> +	struct eth_device	*dev;
>> +	int (*ack)(struct eth_device *);
>> +#else
>> +	struct udevice		*dev;
>> +	int (*ack)(struct udevice *);
>> +#endif
>>  	struct list_head	resp_queue;
>>  } rndis_params;
>>  
>>  /* RNDIS Message parser and other useless functions */
>>  int  rndis_msg_parser(u8 configNr, u8 *buf);
>>  enum rndis_state rndis_get_state(int configNr);
>> -int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
>>  void rndis_deregister(int configNr);
>> +#ifndef CONFIG_DM_ETH
>> +int  rndis_register(int (*rndis_control_ack)(struct eth_device *));
>>  int  rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu,
>> -			struct net_device_stats *stats, u16 *cdc_filter);
>> +			 struct net_device_stats *stats, u16 *cdc_filter);
>> +#else
>> +int  rndis_register(int (*rndis_control_ack)(struct udevice *));
>> +int  rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu,
>> +			 struct net_device_stats *stats, u16 *cdc_filter);
>> +#endif
>>  int  rndis_set_param_vendor(u8 configNr, u32 vendorID,
>>  			    const char *vendorDescr);
>>  int  rndis_set_param_medium(u8 configNr, u32 medium, u32 speed);
>> diff --git a/include/net.h b/include/net.h
>> index 05800c4..7dcc6c8 100644
>> --- a/include/net.h
>> +++ b/include/net.h
>> @@ -254,6 +254,13 @@ int eth_setenv_enetaddr_by_index(const char *base_name, int index,
>>  				 uchar *enetaddr);
>>  
>>  
>> +/*
>> + * Initialize USB ethernet device with CONFIG_DM_ETH
>> + * Returns:
>> + *	0 is success, non-zero is error status.
>> + */
>> +int usb_ether_init(void);
>> +
>>  /*
>>   * Get the hardware address for an ethernet interface .
>>   * Args:
>>
> 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model
  2016-05-12  5:43     ` Mugunthan V N
@ 2016-05-12 11:34       ` Marek Vasut
  0 siblings, 0 replies; 16+ messages in thread
From: Marek Vasut @ 2016-05-12 11:34 UTC (permalink / raw)
  To: u-boot

On 05/12/2016 07:43 AM, Mugunthan V N wrote:
> On Tuesday 10 May 2016 05:57 PM, Marek Vasut wrote:
>> On 05/10/2016 01:44 PM, Mugunthan V N wrote:
>>> Adopt usb ether gadget and rndis driver to adopt driver model
>>>
>>> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
>>> ---
>>>  drivers/usb/gadget/ether.c | 153 ++++++++++++++++++++++++++++++++++++++++++---
>>>  drivers/usb/gadget/rndis.c |  13 +++-
>>>  drivers/usb/gadget/rndis.h |  19 ++++--
>>>  include/net.h              |   7 +++
>>>  4 files changed, 177 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
>>> index 2f70ebf..c436f75 100644
>>> --- a/drivers/usb/gadget/ether.c
>>> +++ b/drivers/usb/gadget/ether.c
>>> @@ -25,6 +25,7 @@
>>>  #include "rndis.h"
>>>  
>>>  #include <dm.h>
>>> +#include <dm/lists.h>
>>>  #include <dm/uclass-internal.h>
>>>  #include <dm/device-internal.h>
>>>  
>>> @@ -116,7 +117,11 @@ struct eth_dev {
>>>  
>>>  	struct usb_request	*tx_req, *rx_req;
>>>  
>>> +#ifndef CONFIG_DM_ETH
>>>  	struct eth_device	*net;
>>> +#else
>>> +	struct udevice		*net;
>>> +#endif
>>>  	struct net_device_stats	stats;
>>>  	unsigned int		tx_qlen;
>>>  
>>> @@ -143,7 +148,11 @@ struct eth_dev {
>>>  /*-------------------------------------------------------------------------*/
>>>  struct ether_priv {
>>>  	struct eth_dev ethdev;
>>> +#ifndef CONFIG_DM_ETH
>>>  	struct eth_device netdev;
>>> +#else
>>> +	struct udevice *netdev;
>>> +#endif
>>>  	struct usb_gadget_driver eth_driver;
>>>  };
>>>  
>>> @@ -1851,7 +1860,11 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
>>>  
>>>  static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
>>>  
>>> +#ifndef CONFIG_DM_ETH
>>>  static int rndis_control_ack(struct eth_device *net)
>>> +#else
>>> +static int rndis_control_ack(struct udevice *net)
>>> +#endif
>>>  {
>>>  	struct ether_priv	*priv = (struct ether_priv *)net->priv;
>>>  	struct eth_dev		*dev = &priv->ethdev;
>>> @@ -2001,6 +2014,9 @@ static int eth_bind(struct usb_gadget *gadget)
>>>  	int			status = -ENOMEM;
>>>  	int			gcnum;
>>>  	u8			tmp[7];
>>> +#ifdef CONFIG_DM_ETH
>>> +	struct eth_pdata	*pdata = dev_get_platdata(l_priv->netdev);
>>> +#endif
>>>  
>>>  	/* these flags are only ever cleared; compiler take note */
>>>  #ifndef	CONFIG_USB_ETH_CDC
>>> @@ -2188,7 +2204,11 @@ autoconf_fail:
>>>  
>>>  
>>>  	/* network device setup */
>>> +#ifndef CONFIG_DM_ETH
>>>  	dev->net = &l_priv->netdev;
>>> +#else
>>> +	dev->net = l_priv->netdev;
>>> +#endif
>>>  
>>>  	dev->cdc = cdc;
>>>  	dev->zlp = zlp;
>>> @@ -2197,6 +2217,7 @@ autoconf_fail:
>>>  	dev->out_ep = out_ep;
>>>  	dev->status_ep = status_ep;
>>>  
>>> +	memset(tmp, 0, sizeof(tmp));
>>>  	/*
>>>  	 * Module params for these addresses should come from ID proms.
>>>  	 * The host side address is used with CDC and RNDIS, and commonly
>>> @@ -2204,10 +2225,13 @@ autoconf_fail:
>>>  	 * host side code for the SAFE thing cares -- its original BLAN
>>>  	 * thing didn't, Sharp never assigned those addresses on Zaurii.
>>>  	 */
>>> +#ifndef CONFIG_DM_ETH
>>>  	get_ether_addr(dev_addr, dev->net->enetaddr);
>>> -
>>> -	memset(tmp, 0, sizeof(tmp));
>>>  	memcpy(tmp, dev->net->enetaddr, sizeof(dev->net->enetaddr));
>>> +#else
>>> +	get_ether_addr(dev_addr, pdata->enetaddr);
>>> +	memcpy(tmp, pdata->enetaddr, sizeof(pdata->enetaddr));
>>> +#endif
>>>  
>>>  	get_ether_addr(host_addr, dev->host_mac);
>>>  
>>> @@ -2268,10 +2292,11 @@ autoconf_fail:
>>>  		status_ep ? " STATUS " : "",
>>>  		status_ep ? status_ep->name : ""
>>>  		);
>>> -	printf("MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
>>> -		dev->net->enetaddr[0], dev->net->enetaddr[1],
>>> -		dev->net->enetaddr[2], dev->net->enetaddr[3],
>>> -		dev->net->enetaddr[4], dev->net->enetaddr[5]);
>>> +#ifndef CONFIG_DM_ETH
>>> +	printf("MAC %pM\n", dev->net->enetaddr);
>>> +#else
>>> +	printf("MAC %pM\n", pdata->enetaddr);
>>> +#endif
>>>  
>>>  	if (cdc || rndis)
>>>  		printf("HOST MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
>>> @@ -2520,13 +2545,12 @@ void _usb_eth_halt(struct ether_priv *priv)
>>>  	}
>>>  
>>>  	usb_gadget_unregister_driver(&priv->eth_driver);
>>> -#ifdef CONFIG_DM_USB
>>> -	device_remove(dev->usb_udev);
>>> -#else
>>> +#ifndef CONFIG_DM_USB
>>>  	board_usb_cleanup(0, USB_INIT_DEVICE);
>>>  #endif
>>>  }
>>>  
>>> +#ifndef CONFIG_DM_ETH
>>>  static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
>>>  {
>>>  	struct ether_priv *priv = (struct ether_priv *)netdev->priv;
>>> @@ -2592,3 +2616,114 @@ int usb_eth_initialize(bd_t *bi)
>>>  	eth_register(netdev);
>>>  	return 0;
>>>  }
>>> +#else
>>> +static int usb_eth_start(struct udevice *dev)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +
>>> +	return _usb_eth_init(priv);
>>> +}
>>> +
>>> +static int usb_eth_send(struct udevice *dev, void *packet, int length)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +
>>> +	return _usb_eth_send(priv, packet, length);
>>> +}
>>> +
>>> +static int usb_eth_recv(struct udevice *dev, int flags, uchar **packetp)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +	struct eth_dev *ethdev = &priv->ethdev;
>>> +	int ret;
>>> +
>>> +	ret = _usb_eth_recv(priv);
>>> +	if (ret) {
>>> +		error("error packet receive\n");
>>> +		return ret;
>>> +	}
>>> +
>>> +	if (packet_received) {
>>> +		if (ethdev->rx_req) {
>>> +			*packetp = (uchar *)net_rx_packets[0];
>>> +			return ethdev->rx_req->length;
>>> +		} else {
>>> +			error("dev->rx_req invalid");
>>
>> Is this useful information ?
> 
> It is just a carry forward from non DM code.
> I do feel that without a req, packet_receviced will never be true. If
> you are okay, i will remove this in error log in next version.

If this is just carry forward, then subsequent patch is fine too.

>>
>>> +			return -EFAULT;
>>> +		}
>>> +	}
>>> +
>>> +	return -EAGAIN;
>>> +}
>>> +
>>> +static int usb_eth_free_pkt(struct udevice *dev, uchar *packet,
>>> +				   int length)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +	struct eth_dev *ethdev = &priv->ethdev;
>>> +
>>> +	packet_received = 0;
>>> +
>>> +	return rx_submit(ethdev, ethdev->rx_req, 0);
>>> +}
>>> +
>>> +static void usb_eth_stop(struct udevice *dev)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +
>>> +	_usb_eth_halt(priv);
>>> +}
>>> +
>>> +static int usb_eth_probe(struct udevice *dev)
>>> +{
>>> +	struct ether_priv *priv = dev_get_priv(dev);
>>> +	struct eth_pdata *pdata = dev_get_platdata(dev);
>>> +
>>> +	priv->netdev = dev;
>>> +	l_priv = priv;
>>> +
>>> +	get_ether_addr("de:ad:be:ef:00:01", pdata->enetaddr);
>>
>> Can we avoid hard-coding this default MAC ?
> 
> Yeah, will fix in next version.
> 
>>
>>> +	eth_setenv_enetaddr("usbnet_devaddr", pdata->enetaddr);
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +static const struct eth_ops usb_eth_ops = {
>>> +	.start		= usb_eth_start,
>>> +	.send		= usb_eth_send,
>>> +	.recv		= usb_eth_recv,
>>> +	.free_pkt	= usb_eth_free_pkt,
>>> +	.stop		= usb_eth_stop,
>>> +};
>>> +
>>> +int usb_ether_init(void)
>>> +{
>>> +	struct udevice *dev;
>>> +	struct udevice *usb_dev;
>>> +	int ret;
>>> +
>>> +	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
>>> +	if (!usb_dev || ret) {
>>> +		error("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");
>>
>> Can you keep the messages consistent in some way ? Some start with
>> capital letter, some don't . I would much rather see something like
>> "%s: unable to bind usb_ether device\n", __func__
> 
> Yeah, will fix in next version.

Thanks

[...]
-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model Mugunthan V N
@ 2016-05-19  3:59   ` Simon Glass
  0 siblings, 0 replies; 16+ messages in thread
From: Simon Glass @ 2016-05-19  3:59 UTC (permalink / raw)
  To: u-boot

Hi,

On 10 May 2016 at 05:44, Mugunthan V N <mugunthanvnm@ti.com> wrote:
> Convert usb ether gadget to adopt usb driver model
>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 36 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 36 insertions(+)

This seems a little messy but I understand the need to fit within the
existing framework.

Reviewed-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable Mugunthan V N
@ 2016-05-19  3:59   ` Simon Glass
  0 siblings, 0 replies; 16+ messages in thread
From: Simon Glass @ 2016-05-19  3:59 UTC (permalink / raw)
  To: u-boot

On 10 May 2016 at 05:44, Mugunthan V N <mugunthanvnm@ti.com> wrote:
> network_started of struct eth_dev can be accessed using local
> variable dev and no reason to access it with the global struct.
>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct Mugunthan V N
@ 2016-05-19  4:00   ` Simon Glass
  0 siblings, 0 replies; 16+ messages in thread
From: Simon Glass @ 2016-05-19  4:00 UTC (permalink / raw)
  To: u-boot

On 10 May 2016 at 05:44, Mugunthan V N <mugunthanvnm@ti.com> wrote:
> Consolidate the net device, usb eth device and gadget device
> struct to single struct and a single global variable so that the
> same can be passed as priv of ethernet driver.
>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 53 +++++++++++++++++++++++-----------------------
>  1 file changed, 26 insertions(+), 27 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv
  2016-05-10 11:44 ` [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv Mugunthan V N
@ 2016-05-19  4:00   ` Simon Glass
  0 siblings, 0 replies; 16+ messages in thread
From: Simon Glass @ 2016-05-19  4:00 UTC (permalink / raw)
  To: u-boot

On 10 May 2016 at 05:44, Mugunthan V N <mugunthanvnm@ti.com> wrote:
> Use net device priv to pass usb ether priv and use it in
> net device ops callback.
>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> ---
>  drivers/usb/gadget/ether.c | 46 +++++++++++++++++++++-------------------------
>  1 file changed, 21 insertions(+), 25 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2016-05-19  4:00 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-10 11:44 [U-Boot] [PATCH v2 0/6] DM conversion of usb ether gadget Mugunthan V N
2016-05-10 11:44 ` [U-Boot] [PATCH v2 1/6] drivers: usb: gadget: ether: adopt to usb driver model Mugunthan V N
2016-05-19  3:59   ` Simon Glass
2016-05-10 11:44 ` [U-Boot] [PATCH v2 2/6] drivers: usb: gadget: ether: access network_started using local variable Mugunthan V N
2016-05-19  3:59   ` Simon Glass
2016-05-10 11:44 ` [U-Boot] [PATCH v2 3/6] drivers: usb: gadget: ether: consolidate global devices to single struct Mugunthan V N
2016-05-19  4:00   ` Simon Glass
2016-05-10 11:44 ` [U-Boot] [PATCH v2 4/6] drivers: usb: gadget: ether: use net device priv to pass usb ether priv Mugunthan V N
2016-05-19  4:00   ` Simon Glass
2016-05-10 11:44 ` [U-Boot] [PATCH v2 5/6] drivers: usb: gadget: ether: prepare driver for driver model migration Mugunthan V N
2016-05-10 12:24   ` Marek Vasut
2016-05-12  5:32     ` Mugunthan V N
2016-05-10 11:44 ` [U-Boot] [PATCH v2 6/6] drivers: usb: gadget: ether/rndis: convert driver to adopt device driver model Mugunthan V N
2016-05-10 12:27   ` Marek Vasut
2016-05-12  5:43     ` Mugunthan V N
2016-05-12 11:34       ` Marek Vasut

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox