diff options
| author | David S. Miller <davem@davemloft.net> | 2013-01-29 15:32:13 -0500 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-01-29 15:32:13 -0500 | 
| commit | f1e7b73acc26e8908af783bcd3a9900fd80688f5 (patch) | |
| tree | 9a9382fb7f12f1889020efb4bffa3f4a88589fc5 /drivers/net/usb/dm9601.c | |
| parent | 218774dc341f219bfcf940304a081b121a0e8099 (diff) | |
| parent | fc16e884a2320198b8cb7bc2fdcf6b4485e79709 (diff) | |
| download | olio-linux-3.10-f1e7b73acc26e8908af783bcd3a9900fd80688f5.tar.xz olio-linux-3.10-f1e7b73acc26e8908af783bcd3a9900fd80688f5.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Bring in the 'net' tree so that we can get some ipv4/ipv6 bug
fixes that some net-next work will build upon.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/dm9601.c')
| -rw-r--r-- | drivers/net/usb/dm9601.c | 52 | 
1 files changed, 35 insertions, 17 deletions
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 0794004fd9d..174e5ecea4c 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c @@ -45,6 +45,12 @@  #define DM_MCAST_ADDR	0x16	/* 8 bytes */  #define DM_GPR_CTRL	0x1e  #define DM_GPR_DATA	0x1f +#define DM_CHIP_ID	0x2c +#define DM_MODE_CTRL	0x91	/* only on dm9620 */ + +/* chip id values */ +#define ID_DM9601	0 +#define ID_DM9620	1  #define DM_MAX_MCAST	64  #define DM_MCAST_SIZE	8 @@ -53,7 +59,6 @@  #define DM_RX_OVERHEAD	7	/* 3 byte header + 4 byte crc tail */  #define DM_TIMEOUT	1000 -  static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data)  {  	int err; @@ -84,32 +89,23 @@ static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data)  static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value)  { -	return usbnet_write_cmd(dev, DM_WRITE_REGS, +	return usbnet_write_cmd(dev, DM_WRITE_REG,  				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,  				value, reg, NULL, 0);  } -static void dm_write_async_helper(struct usbnet *dev, u8 reg, u8 value, -				  u16 length, void *data) +static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)  {  	usbnet_write_cmd_async(dev, DM_WRITE_REGS,  			       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, -			       value, reg, data, length); -} - -static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) -{ -	netdev_dbg(dev->net, "dm_write_async() reg=0x%02x length=%d\n", reg, length); - -	dm_write_async_helper(dev, reg, 0, length, data); +			       0, reg, data, length);  }  static void dm_write_reg_async(struct usbnet *dev, u8 reg, u8 value)  { -	netdev_dbg(dev->net, "dm_write_reg_async() reg=0x%02x value=0x%02x\n", -		   reg, value); - -	dm_write_async_helper(dev, reg, value, 0, NULL); +	usbnet_write_cmd_async(dev, DM_WRITE_REG, +			       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, +			       value, reg, NULL, 0);  }  static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) @@ -358,7 +354,7 @@ static const struct net_device_ops dm9601_netdev_ops = {  static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)  {  	int ret; -	u8 mac[ETH_ALEN]; +	u8 mac[ETH_ALEN], id;  	ret = usbnet_get_endpoints(dev, intf);  	if (ret) @@ -399,6 +395,24 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)  		__dm9601_set_mac_address(dev);  	} +	if (dm_read_reg(dev, DM_CHIP_ID, &id) < 0) { +		netdev_err(dev->net, "Error reading chip ID\n"); +		ret = -ENODEV; +		goto out; +	} + +	/* put dm9620 devices in dm9601 mode */ +	if (id == ID_DM9620) { +		u8 mode; + +		if (dm_read_reg(dev, DM_MODE_CTRL, &mode) < 0) { +			netdev_err(dev->net, "Error reading MODE_CTRL\n"); +			ret = -ENODEV; +			goto out; +		} +		dm_write_reg(dev, DM_MODE_CTRL, mode & 0x7f); +	} +  	/* power up phy */  	dm_write_reg(dev, DM_GPR_CTRL, 1);  	dm_write_reg(dev, DM_GPR_DATA, 0); @@ -581,6 +595,10 @@ static const struct usb_device_id products[] = {  	 USB_DEVICE(0x0a46, 0x9000),	/* DM9000E */  	 .driver_info = (unsigned long)&dm9601_info,  	 }, +	{ +	 USB_DEVICE(0x0a46, 0x9620),	/* DM9620 USB to Fast Ethernet Adapter */ +	 .driver_info = (unsigned long)&dm9601_info, +	 },  	{},			// END  };  |