]> git.sur5r.net Git - u-boot/commitdiff
dm: net: usb: Convert mcs7830 driver to support driver model
authorSimon Glass <sjg@chromium.org>
Sun, 29 Nov 2015 20:18:11 +0000 (13:18 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 12 Jan 2016 17:19:09 +0000 (10:19 -0700)
Adjust this driver to support driver model for Ethernet.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/usb/eth/mcs7830.c

index de40bd6e4cccde06544e3a31f7dd5a31ba4496e1..9d6cf8ce7bda82c94bf84358811a6550d36d14eb 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <linux/mii.h>
 #include <malloc.h>
@@ -83,6 +84,10 @@ struct mcs7830_regs {
  * @mchash:    shadow for the network adapter's multicast hash registers
  */
 struct mcs7830_private {
+#ifdef CONFIG_DM_ETH
+       uint8_t rx_buf[MCS7830_RX_URB_SIZE];
+       struct ueth_data ueth;
+#endif
        uint8_t config;
        uint8_t mchash[8];
 };
@@ -568,6 +573,7 @@ static int mcs7830_recv_common(struct ueth_data *ueth, uint8_t *buf)
        return -EIO;
 }
 
+#ifndef CONFIG_DM_ETH
 /*
  * mcs7830_init() - network interface's init callback
  * @udev:      network device to initialize
@@ -834,3 +840,102 @@ int mcs7830_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
 
        return 1;
 }
+#endif
+
+
+#ifdef CONFIG_DM_ETH
+static int mcs7830_eth_start(struct udevice *dev)
+{
+       struct usb_device *udev = dev_get_parent_priv(dev);
+
+       return mcs7830_init_common(udev);
+}
+
+void mcs7830_eth_stop(struct udevice *dev)
+{
+       debug("** %s()\n", __func__);
+}
+
+int mcs7830_eth_send(struct udevice *dev, void *packet, int length)
+{
+       struct mcs7830_private *priv = dev_get_priv(dev);
+       struct ueth_data *ueth = &priv->ueth;
+
+       return mcs7830_send_common(ueth, packet, length);
+}
+
+int mcs7830_eth_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+       struct mcs7830_private *priv = dev_get_priv(dev);
+       struct ueth_data *ueth = &priv->ueth;
+       int len;
+
+       len = mcs7830_recv_common(ueth, priv->rx_buf);
+       *packetp = priv->rx_buf;
+
+       return len;
+}
+
+static int mcs7830_free_pkt(struct udevice *dev, uchar *packet, int packet_len)
+{
+       struct mcs7830_private *priv = dev_get_priv(dev);
+
+       packet_len = ALIGN(packet_len, 4);
+       usb_ether_advance_rxbuf(&priv->ueth, sizeof(u32) + packet_len);
+
+       return 0;
+}
+
+int mcs7830_write_hwaddr(struct udevice *dev)
+{
+       struct usb_device *udev = dev_get_parent_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+
+       return mcs7830_write_mac_common(udev, pdata->enetaddr);
+}
+
+static int mcs7830_eth_probe(struct udevice *dev)
+{
+       struct usb_device *udev = dev_get_parent_priv(dev);
+       struct mcs7830_private *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct ueth_data *ueth = &priv->ueth;
+
+       if (mcs7830_basic_reset(udev, priv))
+               return 0;
+
+       if (mcs7830_read_mac(udev, pdata->enetaddr))
+               return 0;
+
+       return usb_ether_register(dev, ueth, MCS7830_RX_URB_SIZE);
+}
+
+static const struct eth_ops mcs7830_eth_ops = {
+       .start  = mcs7830_eth_start,
+       .send   = mcs7830_eth_send,
+       .recv   = mcs7830_eth_recv,
+       .free_pkt = mcs7830_free_pkt,
+       .stop   = mcs7830_eth_stop,
+       .write_hwaddr = mcs7830_write_hwaddr,
+};
+
+U_BOOT_DRIVER(mcs7830_eth) = {
+       .name   = "mcs7830_eth",
+       .id     = UCLASS_ETH,
+       .probe = mcs7830_eth_probe,
+       .ops    = &mcs7830_eth_ops,
+       .priv_auto_alloc_size = sizeof(struct mcs7830_private),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+       .flags  = DM_FLAG_ALLOC_PRIV_DMA,
+};
+
+static const struct usb_device_id mcs7830_eth_id_table[] = {
+       { USB_DEVICE(0x9710, 0x7832) },         /* Moschip 7832 */
+       { USB_DEVICE(0x9710, 0x7830), },        /* Moschip 7830 */
+       { USB_DEVICE(0x9710, 0x7730), },        /* Moschip 7730 */
+       { USB_DEVICE(0x0df6, 0x0021), },        /* Sitecom LN 30 */
+       { }             /* Terminating entry */
+};
+
+U_BOOT_USB_DEVICE(mcs7830_eth, mcs7830_eth_id_table);
+#endif