mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 07:38:10 +00:00
dm9601: support dm9620 variant
dm9620 is a newer variant of dm9601 with more features (usb 2.0, checksum offload, ..), but it can also be put in a dm9601 compatible mode, allowing us to reuse the existing driver. This does mean that the extended features like checksum offload cannot be used, but that's hardly critical on a 100mbps interface. Thanks to Sławek Wernikowski <slawek@wernikowski.net> for providing me with a dm9620 based device to test. Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5f19d1219a
commit
6642f91c92
1 changed files with 29 additions and 1 deletions
|
@ -45,6 +45,12 @@
|
||||||
#define DM_MCAST_ADDR 0x16 /* 8 bytes */
|
#define DM_MCAST_ADDR 0x16 /* 8 bytes */
|
||||||
#define DM_GPR_CTRL 0x1e
|
#define DM_GPR_CTRL 0x1e
|
||||||
#define DM_GPR_DATA 0x1f
|
#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_MAX_MCAST 64
|
||||||
#define DM_MCAST_SIZE 8
|
#define DM_MCAST_SIZE 8
|
||||||
|
@ -348,7 +354,7 @@ static const struct net_device_ops dm9601_netdev_ops = {
|
||||||
static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
u8 mac[ETH_ALEN];
|
u8 mac[ETH_ALEN], id;
|
||||||
|
|
||||||
ret = usbnet_get_endpoints(dev, intf);
|
ret = usbnet_get_endpoints(dev, intf);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -389,6 +395,24 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
__dm9601_set_mac_address(dev);
|
__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 */
|
/* power up phy */
|
||||||
dm_write_reg(dev, DM_GPR_CTRL, 1);
|
dm_write_reg(dev, DM_GPR_CTRL, 1);
|
||||||
dm_write_reg(dev, DM_GPR_DATA, 0);
|
dm_write_reg(dev, DM_GPR_DATA, 0);
|
||||||
|
@ -571,6 +595,10 @@ static const struct usb_device_id products[] = {
|
||||||
USB_DEVICE(0x0a46, 0x9000), /* DM9000E */
|
USB_DEVICE(0x0a46, 0x9000), /* DM9000E */
|
||||||
.driver_info = (unsigned long)&dm9601_info,
|
.driver_info = (unsigned long)&dm9601_info,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
USB_DEVICE(0x0a46, 0x9620), /* DM9620 USB to Fast Ethernet Adapter */
|
||||||
|
.driver_info = (unsigned long)&dm9601_info,
|
||||||
|
},
|
||||||
{}, // END
|
{}, // END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue