1
0
Fork 0

dm: net: usb: Convert mcs7830 driver to support driver model

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>
utp
Simon Glass 2015-11-29 13:18:11 -07:00
parent ce932c7066
commit d4f847ecd7
1 changed files with 105 additions and 0 deletions

View 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