[U-Boot] [Patch v3 1/2] net: introduce transparent driver private in ueth_data
Marek Vasut
marek.vasut at gmail.com
Tue Aug 21 22:52:41 CEST 2012
Dear Lucas Stach,
> Avoid clutter in ueth_data. Individual drivers should not mess
> with structures belonging to the core like this.
>
> Signed-off-by: Lucas Stach <dev at lynxeye.de>
> ---
> drivers/usb/eth/smsc95xx.c | 48
> ++++++++++++++++++++++++++++++++-------------- include/usb_ether.h
> | 8 ++------
> 2 Dateien geändert, 36 Zeilen hinzugefügt(+), 20 Zeilen entfernt(-)
You might want to configure your locale ... otherwise, awesome :)
> diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
> index c62a8c1..4bf2a16 100644
> --- a/drivers/usb/eth/smsc95xx.c
> +++ b/drivers/usb/eth/smsc95xx.c
> @@ -25,6 +25,7 @@
> #include <usb.h>
> #include <linux/mii.h>
> #include "usb_ether.h"
> +#include "malloc.h"
>
> /* SMSC LAN95xx based USB 2.0 Ethernet Devices */
>
> @@ -146,6 +147,12 @@
> /* local vars */
> static int curr_eth_dev; /* index for name of next device detected */
>
> +/* driver private */
> +struct smsc95xx_private {
> + size_t rx_urb_size; /* maximum USB URB size */
> + u32 mac_cr; /* MAC control register value */
> + int have_hwaddr; /* 1 if we have a hardware MAC address */
> +};
>
> /*
> * Smsc95xx infrastructure commands
> @@ -377,6 +384,7 @@ static int smsc95xx_init_mac_address(struct eth_device
> *eth, static int smsc95xx_write_hwaddr(struct eth_device *eth)
> {
> struct ueth_data *dev = (struct ueth_data *)eth->priv;
> + struct smsc95xx_private *priv = dev->dev_priv;
> u32 addr_lo = __get_unaligned_le32(ð->enetaddr[0]);
> u32 addr_hi = __get_unaligned_le16(ð->enetaddr[4]);
> int ret;
> @@ -392,7 +400,7 @@ static int smsc95xx_write_hwaddr(struct eth_device
> *eth) return ret;
>
> debug("MAC %pM\n", eth->enetaddr);
> - dev->have_hwaddr = 1;
> + priv->have_hwaddr = 1;
> return 0;
> }
>
> @@ -425,19 +433,22 @@ static int smsc95xx_set_csums(struct ueth_data *dev,
>
> static void smsc95xx_set_multicast(struct ueth_data *dev)
> {
> + struct smsc95xx_private *priv = dev->dev_priv;
> +
> /* No multicast in u-boot */
> - dev->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_);
> + priv->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_);
> }
>
> /* starts the TX path */
> static void smsc95xx_start_tx_path(struct ueth_data *dev)
> {
> + struct smsc95xx_private *priv = dev->dev_priv;
> u32 reg_val;
>
> /* Enable Tx at MAC */
> - dev->mac_cr |= MAC_CR_TXEN_;
> + priv->mac_cr |= MAC_CR_TXEN_;
>
> - smsc95xx_write_reg(dev, MAC_CR, dev->mac_cr);
> + smsc95xx_write_reg(dev, MAC_CR, priv->mac_cr);
>
> /* Enable Tx at SCSRs */
> reg_val = TX_CFG_ON_;
> @@ -447,8 +458,10 @@ static void smsc95xx_start_tx_path(struct ueth_data
> *dev) /* Starts the Receive path */
> static void smsc95xx_start_rx_path(struct ueth_data *dev)
> {
> - dev->mac_cr |= MAC_CR_RXEN_;
> - smsc95xx_write_reg(dev, MAC_CR, dev->mac_cr);
> + struct smsc95xx_private *priv = dev->dev_priv;
> +
> + priv->mac_cr |= MAC_CR_RXEN_;
> + smsc95xx_write_reg(dev, MAC_CR, priv->mac_cr);
> }
>
> /*
> @@ -462,6 +475,7 @@ static int smsc95xx_init(struct eth_device *eth, bd_t
> *bd) u32 burst_cap;
> int timeout;
> struct ueth_data *dev = (struct ueth_data *)eth->priv;
> + struct smsc95xx_private *priv = (struct smsc95xx_private *)dev-
>dev_priv;
> #define TIMEOUT_RESOLUTION 50 /* ms */
> int link_detected;
>
> @@ -504,9 +518,9 @@ static int smsc95xx_init(struct eth_device *eth, bd_t
> *bd) debug("timeout waiting for PHY Reset\n");
> return -1;
> }
> - if (!dev->have_hwaddr && smsc95xx_init_mac_address(eth, dev) == 0)
> - dev->have_hwaddr = 1;
> - if (!dev->have_hwaddr) {
> + if (!priv->have_hwaddr && smsc95xx_init_mac_address(eth, dev) == 0)
> + priv->have_hwaddr = 1;
> + if (!priv->have_hwaddr) {
> puts("Error: SMSC95xx: No MAC address set - set usbethaddr\n");
> return -1;
> }
> @@ -532,16 +546,16 @@ static int smsc95xx_init(struct eth_device *eth, bd_t
> *bd) #ifdef TURBO_MODE
> if (dev->pusb_dev->speed == USB_SPEED_HIGH) {
> burst_cap = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE;
> - dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
> + priv->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
> } else {
> burst_cap = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE;
> - dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
> + priv->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
> }
> #else
> burst_cap = 0;
> - dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
> + priv->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
> #endif
> - debug("rx_urb_size=%ld\n", (ulong)dev->rx_urb_size);
> + debug("rx_urb_size=%ld\n", (ulong)priv->rx_urb_size);
>
> ret = smsc95xx_write_reg(dev, BURST_CAP, burst_cap);
> if (ret < 0)
> @@ -606,7 +620,7 @@ static int smsc95xx_init(struct eth_device *eth, bd_t
> *bd) if (ret < 0)
> return ret;
>
> - ret = smsc95xx_read_reg(dev, MAC_CR, &dev->mac_cr);
> + ret = smsc95xx_read_reg(dev, MAC_CR, &priv->mac_cr);
> if (ret < 0)
> return ret;
>
> @@ -857,6 +871,12 @@ int smsc95xx_eth_probe(struct usb_device *dev,
> unsigned int ifnum, return 0;
> }
> dev->privptr = (void *)ss;
> +
> + /* alloc driver private */
> + ss->dev_priv = calloc(1, sizeof(struct smsc95xx_private));
> + if (!ss->dev_priv)
> + return 0;
> +
> return 1;
> }
>
> diff --git a/include/usb_ether.h b/include/usb_ether.h
> index a7fb26b..7c7aecb 100644
> --- a/include/usb_ether.h
> +++ b/include/usb_ether.h
> @@ -50,12 +50,8 @@ struct ueth_data {
> unsigned char protocol; /* .............. */
> unsigned char irqinterval; /* Intervall for IRQ Pipe */
>
> - /* private fields for each driver can go here if needed */
> -#ifdef CONFIG_USB_ETHER_SMSC95XX
> - size_t rx_urb_size; /* maximum USB URB size */
> - u32 mac_cr; /* MAC control register value */
> - int have_hwaddr; /* 1 if we have a hardware MAC address */
> -#endif
> + /* driver private */
> + void *dev_priv;
> };
>
> /*
More information about the U-Boot
mailing list