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>
This commit is contained in:
parent
ce932c7066
commit
d4f847ecd7
@ -11,6 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -83,6 +84,10 @@ struct mcs7830_regs {
|
|||||||
* @mchash: shadow for the network adapter's multicast hash registers
|
* @mchash: shadow for the network adapter's multicast hash registers
|
||||||
*/
|
*/
|
||||||
struct mcs7830_private {
|
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 config;
|
||||||
uint8_t mchash[8];
|
uint8_t mchash[8];
|
||||||
};
|
};
|
||||||
@ -568,6 +573,7 @@ static int mcs7830_recv_common(struct ueth_data *ueth, uint8_t *buf)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_DM_ETH
|
||||||
/*
|
/*
|
||||||
* mcs7830_init() - network interface's init callback
|
* mcs7830_init() - network interface's init callback
|
||||||
* @udev: network device to initialize
|
* @udev: network device to initialize
|
||||||
@ -834,3 +840,102 @@ int mcs7830_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
|
|||||||
|
|
||||||
return 1;
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user