Patchwork [U-Boot,v3,1/2] net: introduce transparent driver private in ueth_data

login
register
mail settings
Submitter Lucas Stach
Date Aug. 21, 2012, 1:23 p.m.
Message ID <1345555393-11060-1-git-send-email-dev@lynxeye.de>
Download mbox | patch
Permalink /patch/179060/
State Superseded
Delegated to: Joe Hershberger
Headers show

Comments

Lucas Stach - Aug. 21, 2012, 1:23 p.m.
Avoid clutter in ueth_data. Individual drivers should not mess
with structures belonging to the core like this.

Signed-off-by: Lucas Stach <dev@lynxeye.de>
---
 drivers/usb/eth/smsc95xx.c | 48 ++++++++++++++++++++++++++++++++--------------
 include/usb_ether.h        |  8 ++------
 2 Dateien geändert, 36 Zeilen hinzugefügt(+), 20 Zeilen entfernt(-)
Mike Frysinger - Aug. 21, 2012, 6:16 p.m.
On Tuesday 21 August 2012 09:23:12 Lucas Stach wrote:
> Avoid clutter in ueth_data. Individual drivers should not mess
> with structures belonging to the core like this.

nice work
-mike
Marek Vasut - Aug. 21, 2012, 8:52 p.m.
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@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(&eth->enetaddr[0]);
>  	u32 addr_hi = __get_unaligned_le16(&eth->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;
>  };
> 
>  /*

Patch

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(&eth->enetaddr[0]);
 	u32 addr_hi = __get_unaligned_le16(&eth->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;
 };
 
 /*