From patchwork Sun Jan 27 22:34:22 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Peter Korsgaard X-Patchwork-Id: 216074 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id D87EC2C0092 for ; Mon, 28 Jan 2013 09:34:33 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756792Ab3A0Wea (ORCPT ); Sun, 27 Jan 2013 17:34:30 -0500 Received: from mail-ee0-f47.google.com ([74.125.83.47]:47891 "EHLO mail-ee0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755199Ab3A0We3 (ORCPT ); Sun, 27 Jan 2013 17:34:29 -0500 Received: by mail-ee0-f47.google.com with SMTP id e52so1014829eek.20 for ; Sun, 27 Jan 2013 14:34:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :mime-version:content-type:content-transfer-encoding; bh=oLNCbJfkHYrhGF2maCfPmai+7uynipD3XKR2vRpC2HI=; b=0DPtYEeQIkdk1GnCN6mcBnR4DqYv3y3DKTbrgkYgtM41g+MS274Z7WMuB3k+d0WM/o 6xgRkz09gUMiK5BmDqhE90XD/Ksq9vx/zB1AGznMlqAeIf5J+HdyL2ocIiZyNggQoeVc c8XqDLpRSSbP5uAc1qeChko5FZ3YzyquFC0E+50We0ECTUQ8qOrSwXI3jMuLZH9LO/On SOWXnBwO5/IWkgGiV0eXXOwbJfAI5zr6H8K3yIHxNlFqcPOIdCnxL7oVH2TnRIlFo1vB HjSobB6jvYrtvm8tAFNYYhqIoPj2QkpheolSE0Wv1/MZRuNYFaXVV7Yl3mqBZLyK0Aj7 oFtQ== X-Received: by 10.14.175.70 with SMTP id y46mr44668792eel.6.1359326067611; Sun, 27 Jan 2013 14:34:27 -0800 (PST) Received: from dell.be.48ers.dk ([2001:6f8:1434:0:6267:20ff:fe4e:21b6]) by mx.google.com with ESMTPS id 3sm13345562eej.6.2013.01.27.14.34.25 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 27 Jan 2013 14:34:26 -0800 (PST) Received: from peko by dell.be.48ers.dk with local (Exim 4.80) (envelope-from ) id 1Tzanw-0001KD-3G; Sun, 27 Jan 2013 23:34:24 +0100 From: Peter Korsgaard To: netdev@vger.kernel.org, davem@davemloft.net, slawek@wernikowski.net Cc: Peter Korsgaard Subject: [PATCH] dm9601: support dm9620 variant Date: Sun, 27 Jan 2013 23:34:22 +0100 Message-Id: <1359326062-5042-1-git-send-email-jacmet@sunsite.dk> X-Mailer: git-send-email 1.7.10.4 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 for providing me with a dm9620 based device to test. Signed-off-by: Peter Korsgaard --- drivers/net/usb/dm9601.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 8670a53..174e5ec 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 @@ -348,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) @@ -389,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); @@ -571,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 };