diff options
| -rw-r--r-- | drivers/usb/eth/smsc95xx.c | 49 | ||||
| -rw-r--r-- | include/usb_ether.h | 8 | 
2 files changed, 37 insertions, 20 deletions
| diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c index c62a8c112..dc5ca6546 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,8 @@ 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 +519,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 +547,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 +621,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 +872,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 a7fb26bf7..7c7aecb30 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;  };  /* |