Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-22 Thread Simon Horman
On Wed, Aug 21, 2013 at 06:02:45PM +0800, liujunliang_ljl wrote:
> Dear Ben :
> 
>   1,  please give me email address of David Miller, and Thanks a 
> lot.

You can find him in the MAINTAINERS file.
He should also show up if you use scripts/get_maintainer.pl
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread Francois Romieu
liujunliang_ljl  :
[...]
> diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
> new file mode 100644
> index 000..9c8f167
> --- /dev/null
> +++ b/drivers/net/usb/sr9700.c
[...]
> +static int sr_read(struct usbnet *dev, u8 reg, u16 length, void *data)
> +{
> + int err;
> +
> + err = usbnet_read_cmd(dev, SR_RD_REGS, SR_REQ_RD_REG,
> + 0, reg, data, length);

err = usbnet_read_cmd(dev, SR_RD_REGS, SR_REQ_RD_REG, 0, reg, data,
  length);

(I already outlined it in my first review)

> + if ((err != length) && (err >= 0))
> + err = -EINVAL;
> + return err;
> +}
> +
> +static int sr_write(struct usbnet *dev, u8 reg, u16 length, void *data)
> +{
> + int err;
> +
> + err = usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
> + 0, reg, data, length);

See my first review as well.

> + if ((err >= 0) && (err < length))
> + err = -EINVAL;
> + return err;
> +}
> +
> +static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *value)
> +{
> + return sr_read(dev, reg, 1, value);
> +}
> +
> +static int sr_write_reg(struct usbnet *dev, u8 reg, u8 value)
> +{
> + return usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
> + value, reg, NULL, 0);

See my first review as well.

> +}
> +
> +static void sr_write_async(struct usbnet *dev, u8 reg, u16 length, void 
> *data)
> +{
> + usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
> + 0, reg, data, length);

See my first review as well.

> +}
> +
> +static void sr_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
> +{
> + usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
> + value, reg, NULL, 0);

See my first review as well.

> +}
> +
> +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 
> *value)
> +{
> + int ret, i;
> +
> + mutex_lock(&dev->phy_mutex);
> +
> + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
> + sr_write_reg(dev, EPCR, phy ? 0xc : 0x4);
> +
> + for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
> + u8 tmp = 0;
> +
> + udelay(1);
> + ret = sr_read_reg(dev, EPCR, &tmp);
> + if (ret < 0)
> + goto out_unlock;
> +
> + /* ready */
> + if ((tmp & EPCR_ERRE) == 0)
> + break;
> + }
> +
> + if (i >= SR_SHARE_TIMEOUT) {
> + netdev_err(dev->net, "%s read timed out!\n", phy ? "phy" : 
> "eeprom");
> + ret = -EIO;
> + goto out_unlock;
> + }
> +
> + sr_write_reg(dev, EPCR, 0x0);
> + ret = sr_read(dev, EPDR, 2, value);
> +
> + netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
> +phy, reg, *value, ret);
> +
> + out_unlock:
   ^ please remove space.

(you renamed it but the "no space before label" part has been ignored)

> + mutex_unlock(&dev->phy_mutex);
> + return ret;
> +}
> +
> +static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 
> value)
> +{
> + int ret, i;
> +
> + mutex_lock(&dev->phy_mutex);
> +
> + ret = sr_write(dev, EPDR, 2, &value);
> + if (ret < 0)
> + goto out_unlock;
> +
> + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
> + sr_write_reg(dev, EPCR, phy ? 0x1a : 0x12);
> +
> + for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
> + u8 tmp = 0;
> +
> + udelay(1);
> + ret = sr_read_reg(dev, EPCR, &tmp);
> + if (ret < 0)
> + goto out_unlock;
> +
> + /* ready */
> + if ((tmp & EPCR_ERRE) == 0)
> + break;
> + }

I made a remark about the 11 lines above in my first review. May I politely
ask you to read it again ?

[...]
> +static const struct ethtool_ops sr9700_ethtool_ops = {
> + .get_drvinfo= usbnet_get_drvinfo,
> + .get_link   = sr9700_get_link,
> + .get_msglevel   = usbnet_get_msglevel,
> + .set_msglevel   = usbnet_set_msglevel,
> + .get_eeprom_len = sr9700_get_eeprom_len,
> + .get_eeprom = sr9700_get_eeprom,
> + .get_settings   = usbnet_get_settings,
> + .set_settings   = usbnet_set_settings,
> + .nway_reset = usbnet_nway_reset,

The fields above line up nicely with a 4 spaces tabulation but the
standard kernel one is 8 spaces wide.

[...]
> +static const struct net_device_ops sr9700_netdev_ops = {
> + .ndo_open   = usbnet_open,
> + .ndo_stop   = usbnet_stop,
> + .ndo_start_xmit = usbnet_start_xmit,
> + .ndo_tx_timeout = usbnet_tx_timeout,
> + .ndo_change_mtu = usbnet_change_mtu,
> + .ndo_validate_addr  = eth_validate_addr,
> + .ndo_do_ioctl   = sr9700_ioctl,
> + .nd

Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread Greg KH
On Wed, Aug 21, 2013 at 06:06:02PM +0800, liujunliang_ljl wrote:
> Dear Francois Romieu :
> 
>   1, all the format problems have been fixed
>   
>   2, sr9700.h registers definition is re-written
> 
>   3, Thanks for your detail checking and I have beed 
> scripts/checkpatch.pl the patch and please check it.
> 
> [PATCH] :

You still aren't sending the patch in a format in which we can apply it
in.  Please read the file, Documentation/SubmittingPatches, specifically
the part about the "Signed-off-by:" line, and provding a proper body of
the patch for the changelog.

thanks,

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread Joe Perches
On Wed, 2013-08-21 at 18:07 +0800, liujunliang_ljl wrote:
>   Thanks a lot and I have been fixed all the problems mentioned 
> above. please check the following patch and thanks again. 

Just trivial comments below:

> diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
[]
> +static void sr_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
> +{
> + usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
> + value, reg, NULL, 0);
> +}
> +
> +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 
> *value)
> +{
[]
> + netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
> +phy, reg, *value, ret);

You have a lot of code that uses inconsistent
indentation.  Code in drivers/net and drivers/usb/net
generally prefers to use alignment to parenthesis for
multi-line statements

The first could use

usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
   value, reg, NULL, 0);

and the second

netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
   phy, reg, *value, ret);

Maximal use of 8 space indentation tabs followed by
minimal spaces.

There are many of these above.

> +static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom 
> *eeprom, u8 *data)
[]
> + for (i = 0; i < eeprom->len / 2; i++)
> + ret = sr_read_eeprom_word(dev, eeprom->offset / 2 + i, 
> &ebuf[i]);

One too many tabs for the second line, a few of these...

[]

> +static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc)
[]
> + if (rc == 1)
> + return le16_to_cpu(res) | BMSR_LSTATUS;
> + else
> + return le16_to_cpu(res) & ~BMSR_LSTATUS;

The code below the returns here is unreachable.

> +
> + netdev_dbg(dev->net,
> +"sr_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",
> +phy_id, loc, le16_to_cpu(res));
> +
> + return le16_to_cpu(res);
> +}

You might try to use scripts/checkpatch.pl --strict if you
care about these.  It should flag most of these coding
style inconsistencies.

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread liujunliang_ljl
Dear Joe :

Thanks a lot and I have been fixed all the problems mentioned 
above. please check the following patch and thanks again. 

[PATCH] :
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 287cc62..a94b196 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -272,6 +272,14 @@ config USB_NET_DM9601
  This option adds support for Davicom DM9601 based USB 1.1
  10/100 Ethernet adapters.
 
+config USB_NET_SR9700
+   tristate "CoreChip-sz SR9700 based USB 1.1 10/100 ethernet devices"
+   depends on USB_USBNET
+   select CRC32
+   help
+ This option adds support for CoreChip-sz SR9700 based USB 1.1
+ 10/100 Ethernet adapters.
+
 config USB_NET_SMSC75XX
tristate "SMSC LAN75XX based USB 2.0 gigabit ethernet devices"
depends on USB_USBNET
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 9ab5c9d..bba87a2 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_USB_NET_AX88179_178A)  += ax88179_178a.o
 obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
 obj-$(CONFIG_USB_NET_CDC_EEM)  += cdc_eem.o
 obj-$(CONFIG_USB_NET_DM9601)   += dm9601.o
+obj-$(CONFIG_USB_NET_SR9700)   += sr9700.o
 obj-$(CONFIG_USB_NET_SMSC75XX) += smsc75xx.o
 obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o
 obj-$(CONFIG_USB_NET_GL620A)   += gl620a.o
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
new file mode 100644
index 000..9c8f167
--- /dev/null
+++ b/drivers/net/usb/sr9700.c
@@ -0,0 +1,536 @@
+/*
+ * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices
+ *
+ * Author : liujl 
+ *
+ * Based on dm9601.c
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "sr9700.h"
+
+static int sr_read(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_read_cmd(dev, SR_RD_REGS, SR_REQ_RD_REG,
+   0, reg, data, length);
+   if ((err != length) && (err >= 0))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_write(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+   if ((err >= 0) && (err < length))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *value)
+{
+   return sr_read(dev, reg, 1, value);
+}
+
+static int sr_write_reg(struct usbnet *dev, u8 reg, u8 value)
+{
+   return usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static void sr_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+}
+
+static void sr_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 
*value)
+{
+   int ret, i;
+
+   mutex_lock(&dev->phy_mutex);
+
+   sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
+   sr_write_reg(dev, EPCR, phy ? 0xc : 0x4);
+
+   for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
+   u8 tmp = 0;
+
+   udelay(1);
+   ret = sr_read_reg(dev, EPCR, &tmp);
+   if (ret < 0)
+   goto out_unlock;
+
+   /* ready */
+   if ((tmp & EPCR_ERRE) == 0)
+   break;
+   }
+
+   if (i >= SR_SHARE_TIMEOUT) {
+   netdev_err(dev->net, "%s read timed out!\n", phy ? "phy" : 
"eeprom");
+   ret = -EIO;
+   goto out_unlock;
+   }
+
+   sr_write_reg(dev, EPCR, 0x0);
+   ret = sr_read(dev, EPDR, 2, value);
+
+   netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
+  phy, reg, *value, ret);
+
+ out_unlock:
+   mutex_unlock(&dev->phy_mutex);
+   return ret;
+}
+
+static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 
value)
+{
+   int ret, i;
+
+   mutex_lock(&dev->phy_mutex);
+
+   ret = sr_write(dev, EPDR, 2, &value);
+   if (ret < 0)
+   goto out_unlock;
+
+   sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
+   sr_write_reg(dev, EPCR, phy ? 0x1a : 0x12);
+
+   for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
+   u8 tmp = 0;
+
+   udelay(1);
+   ret = sr_read_reg(dev, EPC

Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread liujunliang_ljl
Dear Francois Romieu :

1, all the format problems have been fixed

2, sr9700.h registers definition is re-written

3, Thanks for your detail checking and I have beed 
scripts/checkpatch.pl the patch and please check it.

[PATCH] :
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 287cc62..a94b196 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -272,6 +272,14 @@ config USB_NET_DM9601
  This option adds support for Davicom DM9601 based USB 1.1
  10/100 Ethernet adapters.
 
+config USB_NET_SR9700
+   tristate "CoreChip-sz SR9700 based USB 1.1 10/100 ethernet devices"
+   depends on USB_USBNET
+   select CRC32
+   help
+ This option adds support for CoreChip-sz SR9700 based USB 1.1
+ 10/100 Ethernet adapters.
+
 config USB_NET_SMSC75XX
tristate "SMSC LAN75XX based USB 2.0 gigabit ethernet devices"
depends on USB_USBNET
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 9ab5c9d..bba87a2 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_USB_NET_AX88179_178A)  += ax88179_178a.o
 obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
 obj-$(CONFIG_USB_NET_CDC_EEM)  += cdc_eem.o
 obj-$(CONFIG_USB_NET_DM9601)   += dm9601.o
+obj-$(CONFIG_USB_NET_SR9700)   += sr9700.o
 obj-$(CONFIG_USB_NET_SMSC75XX) += smsc75xx.o
 obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o
 obj-$(CONFIG_USB_NET_GL620A)   += gl620a.o
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
new file mode 100644
index 000..9c8f167
--- /dev/null
+++ b/drivers/net/usb/sr9700.c
@@ -0,0 +1,536 @@
+/*
+ * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices
+ *
+ * Author : liujl 
+ *
+ * Based on dm9601.c
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "sr9700.h"
+
+static int sr_read(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_read_cmd(dev, SR_RD_REGS, SR_REQ_RD_REG,
+   0, reg, data, length);
+   if ((err != length) && (err >= 0))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_write(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+   if ((err >= 0) && (err < length))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *value)
+{
+   return sr_read(dev, reg, 1, value);
+}
+
+static int sr_write_reg(struct usbnet *dev, u8 reg, u8 value)
+{
+   return usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static void sr_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+}
+
+static void sr_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 
*value)
+{
+   int ret, i;
+
+   mutex_lock(&dev->phy_mutex);
+
+   sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
+   sr_write_reg(dev, EPCR, phy ? 0xc : 0x4);
+
+   for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
+   u8 tmp = 0;
+
+   udelay(1);
+   ret = sr_read_reg(dev, EPCR, &tmp);
+   if (ret < 0)
+   goto out_unlock;
+
+   /* ready */
+   if ((tmp & EPCR_ERRE) == 0)
+   break;
+   }
+
+   if (i >= SR_SHARE_TIMEOUT) {
+   netdev_err(dev->net, "%s read timed out!\n", phy ? "phy" : 
"eeprom");
+   ret = -EIO;
+   goto out_unlock;
+   }
+
+   sr_write_reg(dev, EPCR, 0x0);
+   ret = sr_read(dev, EPDR, 2, value);
+
+   netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
+  phy, reg, *value, ret);
+
+ out_unlock:
+   mutex_unlock(&dev->phy_mutex);
+   return ret;
+}
+
+static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 
value)
+{
+   int ret, i;
+
+   mutex_lock(&dev->phy_mutex);
+
+   ret = sr_write(dev, EPDR, 2, &value);
+   if (ret < 0)
+   goto out_unlock;
+
+   sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
+   sr_write_reg(dev, EPCR, phy ? 0x1a : 0x12);
+
+   for (i = 0; i < SR_SHARE_TIMEOUT; i++

Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel

2013-08-21 Thread liujunliang_ljl
Dear Ben :

1,  please give me email address of David Miller, and Thanks a 
lot.

2,  please check the new sr9700 device driver which is checked 
by the script tools

scripts/checkpatch.pl 
and the attachment file is the result of 
scripts/checkpatch.pl patch-commit-20130821

I'm sorry that I'm still finding the way to signed-off

3, Thanks again for your correct suggestion and Please check 
the new device driver patch.

[PATCH] :  
  
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 287cc62..a94b196 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -272,6 +272,14 @@ config USB_NET_DM9601
  This option adds support for Davicom DM9601 based USB 1.1
  10/100 Ethernet adapters.
 
+config USB_NET_SR9700
+   tristate "CoreChip-sz SR9700 based USB 1.1 10/100 ethernet devices"
+   depends on USB_USBNET
+   select CRC32
+   help
+ This option adds support for CoreChip-sz SR9700 based USB 1.1
+ 10/100 Ethernet adapters.
+
 config USB_NET_SMSC75XX
tristate "SMSC LAN75XX based USB 2.0 gigabit ethernet devices"
depends on USB_USBNET
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 9ab5c9d..bba87a2 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_USB_NET_AX88179_178A)  += ax88179_178a.o
 obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
 obj-$(CONFIG_USB_NET_CDC_EEM)  += cdc_eem.o
 obj-$(CONFIG_USB_NET_DM9601)   += dm9601.o
+obj-$(CONFIG_USB_NET_SR9700)   += sr9700.o
 obj-$(CONFIG_USB_NET_SMSC75XX) += smsc75xx.o
 obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o
 obj-$(CONFIG_USB_NET_GL620A)   += gl620a.o
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
new file mode 100644
index 000..9c8f167
--- /dev/null
+++ b/drivers/net/usb/sr9700.c
@@ -0,0 +1,536 @@
+/*
+ * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices
+ *
+ * Author : liujl 
+ *
+ * Based on dm9601.c
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "sr9700.h"
+
+static int sr_read(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_read_cmd(dev, SR_RD_REGS, SR_REQ_RD_REG,
+   0, reg, data, length);
+   if ((err != length) && (err >= 0))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_write(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   int err;
+
+   err = usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+   if ((err >= 0) && (err < length))
+   err = -EINVAL;
+   return err;
+}
+
+static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *value)
+{
+   return sr_read(dev, reg, 1, value);
+}
+
+static int sr_write_reg(struct usbnet *dev, u8 reg, u8 value)
+{
+   return usbnet_write_cmd(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static void sr_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   0, reg, data, length);
+}
+
+static void sr_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
+{
+   usbnet_write_cmd_async(dev, SR_WR_REGS, SR_REQ_WR_REG,
+   value, reg, NULL, 0);
+}
+
+static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 
*value)
+{
+   int ret, i;
+
+   mutex_lock(&dev->phy_mutex);
+
+   sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg);
+   sr_write_reg(dev, EPCR, phy ? 0xc : 0x4);
+
+   for (i = 0; i < SR_SHARE_TIMEOUT; i++) {
+   u8 tmp = 0;
+
+   udelay(1);
+   ret = sr_read_reg(dev, EPCR, &tmp);
+   if (ret < 0)
+   goto out_unlock;
+
+   /* ready */
+   if ((tmp & EPCR_ERRE) == 0)
+   break;
+   }
+
+   if (i >= SR_SHARE_TIMEOUT) {
+   netdev_err(dev->net, "%s read timed out!\n", phy ? "phy" : 
"eeprom");
+   ret = -EIO;
+   goto out_unlock;
+   }
+
+   sr_write_reg(dev, EPCR, 0x0);
+   ret = sr_read(dev, EPDR, 2, value);
+
+   netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n",
+  phy, reg, *value, ret);
+
+ out_unlock:
+   mutex_unlock(&dev->phy_mutex);
+   return ret;
+}
+
+static int sr_share_write_word(struct usbnet *dev, int phy, u8