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 <mugunthan...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot