Re: Re: [PATCH] Fix Default to 'y' for SR9800 Device Driver, settingto 'n'
Dear David : Thanks all the same. 2014-02-14 liujunliang_ljl 发件人: David Miller 发送时间: 2014-02-14 07:42:24 收件人: sergei.shtylyov 抄送: liujunliang_ljl; thierry.reding; horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] Fix Default to 'y' for SR9800 Device Driver, settingto 'n' From: Sergei Shtylyov Date: Fri, 14 Feb 2014 03:38:17 +0300 > Hello. > > On 02/14/2014 02:32 AM, David Miller wrote: > >>> From: Liu Junliang > >>> Signed-off-by: Liu Junliang > >> I think it's more canonical to specify no default at all. > >That's what he did, no? Indeed, my bad, patch applied, thanks! .
Re: Re: [PATCH] Fix Default to 'y' for SR9800 Device Driver, settingto 'n'
Dear David : Thanks all the same. 2014-02-14 liujunliang_ljl 发件人: David Miller 发送时间: 2014-02-14 07:42:24 收件人: sergei.shtylyov 抄送: liujunliang_ljl; thierry.reding; horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] Fix Default to 'y' for SR9800 Device Driver, settingto 'n' From: Sergei Shtylyov sergei.shtyl...@cogentembedded.com Date: Fri, 14 Feb 2014 03:38:17 +0300 Hello. On 02/14/2014 02:32 AM, David Miller wrote: From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com I think it's more canonical to specify no default at all. That's what he did, no? Indeed, my bad, patch applied, thanks! .
[PATCH] Fix Default to 'y' for SR9800 Device Driver, setting to 'n'
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig |1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 2551bf6..82df7c3 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -295,7 +295,6 @@ config USB_NET_SR9800 tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" depends on USB_USBNET select CRC32 - default y ---help--- Say Y if you want to use one of the following 100Mbps USB Ethernet device based on the CoreChip-sz SR9800 chip. -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 DeviceDriver Support
Dear Thierry : For this driver, we can set it as 'n', and There is no rule of thumb as to which should default to y. Thanks for your advice. Thanks again. 2014-02-13 liujunliang_ljl 发件人: Thierry Reding 发送时间: 2014-02-12 18:12:52 收件人: liujunliang_ljl 抄送: davem; horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 DeviceDriver Support On Mon, Feb 10, 2014 at 01:33:39PM +0800, liujunliang_...@163.com wrote: > From: Liu Junliang > > > Signed-off-by: Liu Junliang > --- > drivers/net/usb/Kconfig | 16 + > drivers/net/usb/Makefile |1 + > drivers/net/usb/sr9800.c | 873 > ++ > drivers/net/usb/sr9800.h | 202 +++ > 4 files changed, 1092 insertions(+), 0 deletions(-) > create mode 100644 drivers/net/usb/sr9800.c > create mode 100644 drivers/net/usb/sr9800.h > > diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig > index 47b0f73..2551bf6 100644 > --- a/drivers/net/usb/Kconfig > +++ b/drivers/net/usb/Kconfig > @@ -291,6 +291,22 @@ config USB_NET_SR9700 > This option adds support for CoreChip-sz SR9700 based USB 1.1 > 10/100 Ethernet adapters. > > +config USB_NET_SR9800 > + tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" > + depends on USB_USBNET > + select CRC32 > + default y Why is this selected by default? I can see that some of the other USB network drivers are also selected by default, but not all of them. Is there some rule of thumb as to which should default to y and which shouldn't? Thierry -BEGIN PGP SIGNATURE- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAEBAgAGBQJS+0kdAAoJEN0jrNd/PrOhXvwQAJIW4vgv0NkyQVo5jSvzeLY4 9PFCrtd6N1n+O7P99x38JCCD9lWtfdin1EZfj+UicCanup2WzpyBWHeBhdSN4oZA /+C+TgEIuX0+Be11IXeUOGMP9a3k/12HY3oHuz7BA2JjcK6PnfMxaEC7iGGJSjgz q4Goa5kSqjvNgbP8h5bQPTNtMnRdsSytI7PMJbl4t1ho0V7H3pSo9zD7rxaPhmtE v/18VQawGcY83Hr0B0Q18XAnNXaQMLZTvdhVfDUxB5VKT4Xhcri0m4adbAzMI9kR K9CEChkDn68y13drJVILKqUjW+4LMQHAsQV07yl98Sqk7LYOedL9mQOnIL0crjWa OAmLHwLv0ED25W1Hv3UdeSpBdIkO9cD0PCa7vHQnv7lpTlkaDyYelKLQ2D+GXrCw 1L/341ak9QEGiCU1TiOHDblnsN+OtCt0Pt+hijLHFl4TQKw3QIUoZLa4bQuDPM8M juTSV63HRjiDlNGvtjBezlR9GFu5w3SJuNSNsFkZ7ADJwjz9On9JaDwH/Ad7AqmZ ylE+zzbIpOWjyNToMH2dattpeVZkIfGkS02y6PcIx51EGMw5B8l6qKLB9YpkJpwR 7rhMYjpLKIn/6rRGlwmZKYnWYl7p/FdI0yOnVbtMYx406ivUNc+kgvmx5l1mXhT7 b8gKKYYA0pMEMXjgnkK1 =3y7X -END PGP SIGNATURE-
[PATCH] Fix Default to 'y' for SR9800 Device Driver, setting to 'n'
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig |1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 2551bf6..82df7c3 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -295,7 +295,6 @@ config USB_NET_SR9800 tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices depends on USB_USBNET select CRC32 - default y ---help--- Say Y if you want to use one of the following 100Mbps USB Ethernet device based on the CoreChip-sz SR9800 chip. -- 1.7.9.5 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 DeviceDriver Support
Dear Thierry : For this driver, we can set it as 'n', and There is no rule of thumb as to which should default to y. Thanks for your advice. Thanks again. 2014-02-13 liujunliang_ljl 发件人: Thierry Reding 发送时间: 2014-02-12 18:12:52 收件人: liujunliang_ljl 抄送: davem; horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 DeviceDriver Support On Mon, Feb 10, 2014 at 01:33:39PM +0800, liujunliang_...@163.com wrote: From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 873 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1092 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices + depends on USB_USBNET + select CRC32 + default y Why is this selected by default? I can see that some of the other USB network drivers are also selected by default, but not all of them. Is there some rule of thumb as to which should default to y and which shouldn't? Thierry -BEGIN PGP SIGNATURE- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAEBAgAGBQJS+0kdAAoJEN0jrNd/PrOhXvwQAJIW4vgv0NkyQVo5jSvzeLY4 9PFCrtd6N1n+O7P99x38JCCD9lWtfdin1EZfj+UicCanup2WzpyBWHeBhdSN4oZA /+C+TgEIuX0+Be11IXeUOGMP9a3k/12HY3oHuz7BA2JjcK6PnfMxaEC7iGGJSjgz q4Goa5kSqjvNgbP8h5bQPTNtMnRdsSytI7PMJbl4t1ho0V7H3pSo9zD7rxaPhmtE v/18VQawGcY83Hr0B0Q18XAnNXaQMLZTvdhVfDUxB5VKT4Xhcri0m4adbAzMI9kR K9CEChkDn68y13drJVILKqUjW+4LMQHAsQV07yl98Sqk7LYOedL9mQOnIL0crjWa OAmLHwLv0ED25W1Hv3UdeSpBdIkO9cD0PCa7vHQnv7lpTlkaDyYelKLQ2D+GXrCw 1L/341ak9QEGiCU1TiOHDblnsN+OtCt0Pt+hijLHFl4TQKw3QIUoZLa4bQuDPM8M juTSV63HRjiDlNGvtjBezlR9GFu5w3SJuNSNsFkZ7ADJwjz9On9JaDwH/Ad7AqmZ ylE+zzbIpOWjyNToMH2dattpeVZkIfGkS02y6PcIx51EGMw5B8l6qKLB9YpkJpwR 7rhMYjpLKIn/6rRGlwmZKYnWYl7p/FdI0yOnVbtMYx406ivUNc+kgvmx5l1mXhT7 b8gKKYYA0pMEMXjgnkK1 =3y7X -END PGP SIGNATURE-
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Miller : Thanks a lot. 2014-02-11 liujunliang_ljl 发件人: David Miller 发送时间: 2014-02-11 08:54:00 收件人: liujunliang_ljl 抄送: joe; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support From: liujunliang_...@163.com Date: Mon, 10 Feb 2014 14:31:42 +0800 > From: Liu Junliang > > > Signed-off-by: Liu Junliang Applied, thanks. N�Р骒r��yb�X�肚�v�^�)藓{.n�+�伐�{��赙zXФ�≤�}��财�z�:+v�����赙zZ+��+zf"�h���~i���z��wア�?�ㄨ��&�)撷f��^j谦y�m��@A�a囤� 0鹅h���i
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Miller : Thanks a lot. 2014-02-11 liujunliang_ljl 发件人: David Miller 发送时间: 2014-02-11 08:54:00 收件人: liujunliang_ljl 抄送: joe; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support From: liujunliang_...@163.com Date: Mon, 10 Feb 2014 14:31:42 +0800 From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com Applied, thanks. N�Р骒r��yb�X�肚�v�^�)藓{.n�+�伐�{��赙zXФ�≤�}��财�z�j:+v�����赙zZ+��+zf"�h���~i���z��wア�?�ㄨ���)撷f��^j谦y�m��@A�a囤� 0鹅h���i
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 870 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1089 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..4175eb9 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,870 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang + * + * Based on asix_common.c, asix_devices.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 +#include + +#include "sr9800.h" + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) < skb->len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb->data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header & 0x7ff); + if (size != ((~header >> 16) & 0x07ff)) { + netdev_err(dev->net, "%s : Bad Header Length\n", + __func__); + return 0; + } + + if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset > skb->len)) { + netdev_err(dev->net, "%s : Bad RX Length %d\n", + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev->net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); + memcpy(sr_skb->data, skb->data + offset, size); + usbnet_skb_return(dev, sr_skb); + + offset += (size + 1) & 0xfffe; + } + + if (skb->len != offset) { +
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Joe : Thanks a lot for your detail checking. 2014-02-10 liujunliang_ljl 发件人: Joe Perches 发送时间: 2014-02-10 13:47:08 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support On Mon, 2014-02-10 at 13:33 +0800, liujunliang_...@163.com wrote: > diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c [] > + netdev_dbg(dev->net, "mac addr : 0x%x:0x%x:0x%x:0x%x:0x%x:0x%x\n", > +dev->net->dev_addr[0], dev->net->dev_addr[1], > +dev->net->dev_addr[2], dev->net->dev_addr[3], > +dev->net->dev_addr[4], dev->net->dev_addr[5]); mac addresses are assumed to be hex and don't need 0x prefixes. Also, there's a kernel vsprintf extension "%pM" for mac addresses. netdev_dbg(dev->net, "mac addr: %pM\n", dev->net->dev_addr); .
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 873 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1092 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..51da04f --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,873 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang + * + * Based on asix_common.c, asix_devices.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 +#include + +#include "sr9800.h" + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) < skb->len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb->data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header & 0x7ff); + if (size != ((~header >> 16) & 0x07ff)) { + netdev_err(dev->net, "%s : Bad Header Length\n", + __func__); + return 0; + } + + if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset > skb->len)) { + netdev_err(dev->net, "%s : Bad RX Length %d\n", + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev->net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); + memcpy(sr_skb->data, skb->data + offset, size); + usbnet_skb_return(dev, sr_skb); + + offset += (size + 1) & 0xfffe; + } + + if (skb->len != offset) { +
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 873 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1092 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..51da04f --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,873 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * Based on asix_common.c, asix_devices.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 linux/module.h +#include linux/kmod.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/workqueue.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h +#include linux/slab.h +#include linux/if_vlan.h + +#include sr9800.h + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) skb-len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb-data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header 0x7ff); + if (size != ((~header 16) 0x07ff)) { + netdev_err(dev-net, %s : Bad Header Length\n, + __func__); + return 0; + } + + if ((size dev-net-mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset skb-len)) { + netdev_err(dev-net, %s : Bad RX Length %d\n, + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev-net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb,
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Joe : Thanks a lot for your detail checking. 2014-02-10 liujunliang_ljl 发件人: Joe Perches 发送时间: 2014-02-10 13:47:08 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support On Mon, 2014-02-10 at 13:33 +0800, liujunliang_...@163.com wrote: diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c [] + netdev_dbg(dev-net, mac addr : 0x%x:0x%x:0x%x:0x%x:0x%x:0x%x\n, +dev-net-dev_addr[0], dev-net-dev_addr[1], +dev-net-dev_addr[2], dev-net-dev_addr[3], +dev-net-dev_addr[4], dev-net-dev_addr[5]); mac addresses are assumed to be hex and don't need 0x prefixes. Also, there's a kernel vsprintf extension %pM for mac addresses. netdev_dbg(dev-net, mac addr: %pM\n, dev-net-dev_addr); .
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 870 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1089 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..4175eb9 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,870 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * Based on asix_common.c, asix_devices.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 linux/module.h +#include linux/kmod.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/workqueue.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h +#include linux/slab.h +#include linux/if_vlan.h + +#include sr9800.h + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) skb-len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb-data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header 0x7ff); + if (size != ((~header 16) 0x07ff)) { + netdev_err(dev-net, %s : Bad Header Length\n, + __func__); + return 0; + } + + if ((size dev-net-mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset skb-len)) { + netdev_err(dev-net, %s : Bad RX Length %d\n, + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev-net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb,
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 874 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1093 insertions(+) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..c333f32 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,874 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang + * + * Based on asix_common.c, asix_devices.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 +#include + +#include "sr9800.h" + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) < skb->len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb->data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header & 0x7ff); + if (size != ((~header >> 16) & 0x07ff)) { + netdev_err(dev->net, "%s : Bad Header Length\n", + __func__); + return 0; + } + + if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset > skb->len)) { + netdev_err(dev->net, "%s : Bad RX Length %d\n", + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev->net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); + memcpy(sr_skb->data, skb->data + offset, size); + usbnet_skb_return(dev, sr_skb); + + offset += (size + 1) & 0xfffe; + } + + if (skb->len != offset) { +
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Joe : I'm sorry that I reply so late, because I have just spent new chinese year. I will resubmit SR9800 Driver today. Thanks a lot. 2014-02-07 liujunliang_ljl 发件人: Joe Perches 发送时间: 2014-01-28 16:59:38 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support On Tue, 2014-01-28 at 16:36 +0800, liujunliang_...@163.com wrote: > From: Liu Junliang trivial comments... > diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c [] > +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) > +{ [] > + if (size != ((~header >> 16) & 0x07ff)) { > + netdev_err(dev->net, > +"sr_rx_fixup() Bad Header Length\n"); printks with embedded functions names are generally better using "%s: ", __func__ netdev_err(dev->net, "%s: Bad header length\n", __func__); [] > + netdev_err(dev->net, > +"sr_rx_fixup() Bad RX Length %d\n", size); etc. > + if (skb->len != offset) { > + netdev_err(dev->net, "sr_rx_fixup() Bad SKB Length %d\n", > +skb->len); etc. [] > +static inline int sr9800_set_default_mode(struct usbnet *dev) > +{ rather a big function to inline [] > + if (ret < 0) { > + netdev_dbg(dev->net, "Write IPG,IPG1,IPG2 failed: %d", ret); missing newline terminations > + netdev_dbg(dev->net, "RX_CTL is 0x%04x after all initializations", > +rx_ctl); etc... N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�:+v���zZ+��+zf���h���~i���z��w���?�&�)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support
Dear Joe : I'm sorry that I reply so late, because I have just spent new chinese year. I will resubmit SR9800 Driver today. Thanks a lot. 2014-02-07 liujunliang_ljl 发件人: Joe Perches 发送时间: 2014-01-28 16:59:38 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800Device Driver Support On Tue, 2014-01-28 at 16:36 +0800, liujunliang_...@163.com wrote: From: Liu Junliang liujunliang_...@163.com trivial comments... diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c [] +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ [] + if (size != ((~header 16) 0x07ff)) { + netdev_err(dev-net, +sr_rx_fixup() Bad Header Length\n); printks with embedded functions names are generally better using %s: , __func__ netdev_err(dev-net, %s: Bad header length\n, __func__); [] + netdev_err(dev-net, +sr_rx_fixup() Bad RX Length %d\n, size); etc. + if (skb-len != offset) { + netdev_err(dev-net, sr_rx_fixup() Bad SKB Length %d\n, +skb-len); etc. [] +static inline int sr9800_set_default_mode(struct usbnet *dev) +{ rather a big function to inline [] + if (ret 0) { + netdev_dbg(dev-net, Write IPG,IPG1,IPG2 failed: %d, ret); missing newline terminations + netdev_dbg(dev-net, RX_CTL is 0x%04x after all initializations, +rx_ctl); etc... N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�j:+v���zZ+��+zf���h���~i���z��w���?��)ߢf��^jǫy�m��@A�a��� 0��h���i
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 874 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1093 insertions(+) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..c333f32 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,874 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * Based on asix_common.c, asix_devices.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 linux/module.h +#include linux/kmod.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/workqueue.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h +#include linux/slab.h +#include linux/if_vlan.h + +#include sr9800.h + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) skb-len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb-data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header 0x7ff); + if (size != ((~header 16) 0x07ff)) { + netdev_err(dev-net, %s : Bad Header Length\n, + __func__); + return 0; + } + + if ((size dev-net-mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset skb-len)) { + netdev_err(dev-net, %s : Bad RX Length %d\n, + __func__, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev-net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); +
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 874 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1093 insertions(+) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate "CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices" + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..ab15973 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,874 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang + * + * Based on asix_common.c, asix_devices.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 +#include + +#include "sr9800.h" + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) && (err >= 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) < skb->len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb->data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header & 0x7ff); + if (size != ((~header >> 16) & 0x07ff)) { + netdev_err(dev->net, + "sr_rx_fixup() Bad Header Length\n"); + return 0; + } + + if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset > skb->len)) { + netdev_err(dev->net, + "sr_rx_fixup() Bad RX Length %d\n", size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev->net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); + memcpy(sr_skb->data, skb->data + offset, size); + usbnet_skb_return(dev, sr_skb); + + offset += (size + 1) & 0xfffe; + } + + if (skb->len != offset) { +
[PATCH] USB2NET : SR9800 : One chip USB2.0 USB2NET SR9800 Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig | 16 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9800.c | 874 ++ drivers/net/usb/sr9800.h | 202 +++ 4 files changed, 1093 insertions(+) create mode 100644 drivers/net/usb/sr9800.c create mode 100644 drivers/net/usb/sr9800.h diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 47b0f73..2551bf6 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -291,6 +291,22 @@ config USB_NET_SR9700 This option adds support for CoreChip-sz SR9700 based USB 1.1 10/100 Ethernet adapters. +config USB_NET_SR9800 + tristate CoreChip-sz SR9800 based USB 2.0 10/100 ethernet devices + depends on USB_USBNET + select CRC32 + default y + ---help--- + Say Y if you want to use one of the following 100Mbps USB Ethernet + device based on the CoreChip-sz SR9800 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on eth0, if it is the only ethernet device, or perhaps on + eth1, if you have a PCI or ISA ethernet card installed. + + To compile this driver as a module, choose M here: the + module will be called sr9800. + 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 b17b5e8..433f0a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_USB_NET_CDCETHER)+= cdc_ether.o r815x.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_SR9800) += sr9800.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/sr9800.c b/drivers/net/usb/sr9800.c new file mode 100644 index 000..ab15973 --- /dev/null +++ b/drivers/net/usb/sr9800.c @@ -0,0 +1,874 @@ +/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * Based on asix_common.c, asix_devices.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 linux/module.h +#include linux/kmod.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/workqueue.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h +#include linux/slab.h +#include linux/if_vlan.h + +#include sr9800.h + +static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + int err; + + err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, +u16 size, void *data) +{ + int err; + + err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index, + data, size); + if ((err != size) (err = 0)) + err = -EINVAL; + + return err; +} + +static void +sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data, + size); +} + +static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + int offset = 0; + + while (offset + sizeof(u32) skb-len) { + struct sk_buff *sr_skb; + u16 size; + u32 header = get_unaligned_le32(skb-data + offset); + + offset += sizeof(u32); + /* get the packet length */ + size = (u16) (header 0x7ff); + if (size != ((~header 16) 0x07ff)) { + netdev_err(dev-net, + sr_rx_fixup() Bad Header Length\n); + return 0; + } + + if ((size dev-net-mtu + ETH_HLEN + VLAN_HLEN) || + (size + offset skb-len)) { + netdev_err(dev-net, + sr_rx_fixup() Bad RX Length %d\n, size); + return 0; + } + sr_skb = netdev_alloc_skb_ip_align(dev-net, size); + if (!sr_skb) + return 0; + + skb_put(sr_skb, size); +
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear Miller : I'm sorry to trouble you that How about the process for SR9700 Device Driver release? Thanks a lot. 2013-09-22 liujunliang_ljl 发件人: David Miller 发送时间: 2013-09-04 10:27:14 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support From: liujunliang_...@163.com Date: Sun, 1 Sep 2013 19:38:08 +0800 > From: Liu Junliang > > Signed-off-by: Liu Junliang Applied, thanks.
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear Miller : I'm sorry to trouble you that How about the process for SR9700 Device Driver release? Thanks a lot. 2013-09-22 liujunliang_ljl 发件人: David Miller 发送时间: 2013-09-04 10:27:14 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support From: liujunliang_...@163.com Date: Sun, 1 Sep 2013 19:38:08 +0800 From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com Applied, thanks.
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear David Miller : Thanks a lot. I'm sorry that I just wonder to know which kernel version will release this driver, thanks again. 2013-09-04 liujunliang_ljl 发件人: David Miller 发送时间: 2013-09-04 10:27:14 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support From: liujunliang_...@163.com Date: Sun, 1 Sep 2013 19:38:08 +0800 > From: Liu Junliang > > Signed-off-by: Liu Junliang Applied, thanks. N�Р骒r��yb�X�肚�v�^�)藓{.n�+�伐�{��赙zXФ�≤�}��财�z�:+v�����赙zZ+��+zf"�h���~i���z��wア�?�ㄨ��&�)撷f��^j谦y�m��@A�a囤� 0鹅h���i
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear David Miller : Thanks a lot. I'm sorry that I just wonder to know which kernel version will release this driver, thanks again. 2013-09-04 liujunliang_ljl 发件人: David Miller 发送时间: 2013-09-04 10:27:14 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support From: liujunliang_...@163.com Date: Sun, 1 Sep 2013 19:38:08 +0800 From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com Applied, thanks. N�Р骒r��yb�X�肚�v�^�)藓{.n�+�伐�{��赙zXФ�≤�}��财�z�j:+v�����赙zZ+��+zf"�h���~i���z��wア�?�ㄨ���)撷f��^j谦y�m��@A�a囤� 0鹅h���i
[PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 560 ++ drivers/net/usb/sr9700.h | 173 ++ 4 files changed, 742 insertions(+) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..7ec3e0e --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,560 @@ +/* + * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices + * + * Author : Liu Junliang + * + * 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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i; + + for (i = 0; i < SR_SHARE_TIMEOUT; i++) { + u8 tmp = 0; + int ret; + + udelay(1); + ret = sr_read_reg(dev, EPCR, ); + if (ret < 0) + return ret; + + /* ready */ + if (!(tmp & EPCR_ERRE)) + return 0; + } + + netdev_err(dev->net, "%s write timed out!\n", phy ? "phy" : "eeprom"); + + return -EIO; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) +{ + int ret; + + mutex_lock(>phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); + sr_write_reg(dev, EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret < 0) + 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(>phy_mutex); + return ret; +} + +static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, + __le16 value) +{ + int ret; + +
[PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 560 ++ drivers/net/usb/sr9700.h | 173 ++ 4 files changed, 742 insertions(+) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..7ec3e0e --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,560 @@ +/* + * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * 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 linux/module.h +#include linux/sched.h +#include linux/stddef.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h + +#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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i; + + for (i = 0; i SR_SHARE_TIMEOUT; i++) { + u8 tmp = 0; + int ret; + + udelay(1); + ret = sr_read_reg(dev, EPCR, tmp); + if (ret 0) + return ret; + + /* ready */ + if (!(tmp EPCR_ERRE)) + return 0; + } + + netdev_err(dev-net, %s write timed out!\n, phy ? phy : eeprom); + + return -EIO; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) +{ + int ret; + + mutex_lock(dev-phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); + sr_write_reg(dev, EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret 0) + 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: +
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
Dear David : Thanks a lot. please check the patch. thanks again. 2013-08-29 liujunliang_ljl 发件人: David Miller 发送时间: 2013-08-29 05:44:06 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support From: liujunliang_...@163.com Date: Sat, 24 Aug 2013 19:26:00 +0800 > From: liujl Your proper name is not "liujl", please put something more reasonable here and also in your Signoff. Also, integrate Joe Perches's white space fixes into this patch as part of your resubmission. Thank you.
[PATCH] USB2NET : SR9700 : One Chip USB 1.1 USB2NET SR9700 Device Driver Support
From: Liu Junliang Signed-off-by: Liu Junliang --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 558 ++ drivers/net/usb/sr9700.h | 172 ++ 4 files changed, 739 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..76e11f5 --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,558 @@ +/* + * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices + * + * Author : Liu Junliang + * + * 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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i, ret; + + ret = 0; + for (i = 0; i < SR_SHARE_TIMEOUT; i++) { + u8 tmp = 0; + + udelay(1); + ret = sr_read_reg(dev, EPCR, ); + if (ret < 0) + goto out; + + /* ready */ + if ((tmp & EPCR_ERRE) == 0) + break; + } + + if (i >= SR_SHARE_TIMEOUT) { + netdev_err(dev->net, "%s write timed out!\n", + phy ? "phy" : "eeprom"); + ret = -EIO; + goto out; + } + +out: + return ret; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) +{ + int ret; + + mutex_lock(>phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); + sr_write_reg(dev, EPCR, phy ? 0xc : 0x4); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret < 0) + goto out; + + 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: + mutex_unlock(>phy_mutex); + return ret; +} + +static int sr_share_write_word(struct usbnet *dev, int phy,
[PATCH] USB2NET : SR9700 : One Chip USB 1.1 USB2NET SR9700 Device Driver Support
From: Liu Junliang liujunliang_...@163.com Signed-off-by: Liu Junliang liujunliang_...@163.com --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 558 ++ drivers/net/usb/sr9700.h | 172 ++ 4 files changed, 739 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..76e11f5 --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,558 @@ +/* + * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices + * + * Author : Liu Junliang liujunliang_...@163.com + * + * 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 linux/module.h +#include linux/sched.h +#include linux/stddef.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h + +#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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i, ret; + + ret = 0; + 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; + + /* ready */ + if ((tmp EPCR_ERRE) == 0) + break; + } + + if (i = SR_SHARE_TIMEOUT) { + netdev_err(dev-net, %s write timed out!\n, + phy ? phy : eeprom); + ret = -EIO; + goto out; + } + +out: + return ret; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) +{ + int ret; + + mutex_lock(dev-phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); + sr_write_reg(dev, EPCR, phy ? 0xc : 0x4); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret 0) + goto out; + + sr_write_reg(dev, EPCR, 0x0); + ret = sr_read(dev, EPDR, 2, value); + + netdev_dbg(dev-net, read shared
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
Dear David : Thanks a lot. please check the patch. thanks again. 2013-08-29 liujunliang_ljl 发件人: David Miller 发送时间: 2013-08-29 05:44:06 收件人: liujunliang_ljl 抄送: horms; joe; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support From: liujunliang_...@163.com Date: Sat, 24 Aug 2013 19:26:00 +0800 From: liujl liujunliang_...@163.com Your proper name is not liujl, please put something more reasonable here and also in your Signoff. Also, integrate Joe Perches's white space fixes into this patch as part of your resubmission. Thank you.
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
DearJoe : I'm sorry to ask you that, do you need me to merge the patch and re-send it again. And which version of kernel will release this driver. Thanks a lot and apologizing for making you trouble. Thanks again. 2013-08-26 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-25 02:15:19 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support Some whitespace and neatening fixups. Some conversions from 4 indent tabs to normal tabs Signed-off-by: Joe Perches --- Just doing this instead of commenting about spacing again. drivers/net/usb/sr9700.c | 127 +-- 1 file changed, 67 insertions(+), 60 deletions(-) diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c index 27c86ec..4262b9d 100644 --- a/drivers/net/usb/sr9700.c +++ b/drivers/net/usb/sr9700.c @@ -29,7 +29,7 @@ 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); + 0, reg, data, length); if ((err != length) && (err >= 0)) err = -EINVAL; return err; @@ -40,7 +40,7 @@ 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); +0, reg, data, length); if ((err >= 0) && (err < length)) err = -EINVAL; return err; @@ -54,19 +54,19 @@ static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *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); + 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); +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); +value, reg, NULL, 0); } static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) @@ -89,7 +89,7 @@ static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) if (i >= SR_SHARE_TIMEOUT) { netdev_err(dev->net, "%s write timed out!\n", - phy ? "phy" : "eeprom"); +phy ? "phy" : "eeprom"); ret = -EIO; goto out; } @@ -98,7 +98,8 @@ out: return ret; } -static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) { int ret; @@ -115,14 +116,15 @@ static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value 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); +phy, reg, *value, ret); out: mutex_unlock(>phy_mutex); return ret; } -static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 value) +static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, +__le16 value) { int ret; @@ -156,7 +158,8 @@ static int sr9700_get_eeprom_len(struct net_device *dev) return SR_EEPROM_LEN; } -static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 *data) +static int sr9700_get_eeprom(struct net_device *net, + struct ethtool_eeprom *eeprom, u8 *data) { struct usbnet *dev = netdev_priv(net); __le16 *ebuf = (__le16 *)data; @@ -168,7 +171,8 @@ static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom *eepr return -EINVAL; for (i = 0; i < eeprom->len / 2; i++) - ret = sr_read_eeprom_word(dev, eeprom->offset / 2 + i, [i]); + ret = sr_read_eeprom_word(dev, eeprom->offset / 2 + i, + [i]); return ret; } @@ -199,12 +203,13 @@ static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc) res = le16_to_cpu(res) & ~BMSR_LSTATUS; netdev_dbg(dev->net, "sr_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n", - phy_id, loc, res); +phy_id, loc, res); return res; } -static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) +static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, + int val) { struct usbnet *dev = netdev_priv(netdev); __le16 res = cpu_to_le16(val); @@ -215,7 +220,7 @@ static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, int va } netdev_dbg(dev->net, "sr_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n", - phy_id, loc, val); +phy_id, loc, val); sr_share_write_word(dev, 1, loc, res)
Re: Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear all : Thanks a lot. 2013-08-26 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-26 10:19:35 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support On Mon, 2013-08-26 at 10:14 +0800, liujunliang_ljl wrote: > do you need me to merge the patch and re-send it again. I do not. > And which version of kernel will release this driver. No idea. That's up to David Miller or Greg KH to pick up the driver and maybe take the follow-on patch I sent. I just sent the patch because you seemed to have a bit of difficulty integrating the suggestions others were giving you. > Thanks a lot and apologizing for making you trouble. Oh, no worries. It was a trifle. cheers, Joe .
Re: Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support
Dear all : Thanks a lot. 2013-08-26 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-26 10:19:35 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NETSR9700Device Driver Support On Mon, 2013-08-26 at 10:14 +0800, liujunliang_ljl wrote: do you need me to merge the patch and re-send it again. I do not. And which version of kernel will release this driver. No idea. That's up to David Miller or Greg KH to pick up the driver and maybe take the follow-on patch I sent. I just sent the patch because you seemed to have a bit of difficulty integrating the suggestions others were giving you. Thanks a lot and apologizing for making you trouble. Oh, no worries. It was a trifle. cheers, Joe .
Re: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support
DearJoe : I'm sorry to ask you that, do you need me to merge the patch and re-send it again. And which version of kernel will release this driver. Thanks a lot and apologizing for making you trouble. Thanks again. 2013-08-26 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-25 02:15:19 收件人: liujunliang_ljl 抄送: davem; horms; romieu; gregkh; netdev; linux-usb; linux-kernel; sunhecheng 主题: Re: [PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support Some whitespace and neatening fixups. Some conversions from 4 indent tabs to normal tabs Signed-off-by: Joe Perches j...@perches.com --- Just doing this instead of commenting about spacing again. drivers/net/usb/sr9700.c | 127 +-- 1 file changed, 67 insertions(+), 60 deletions(-) diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c index 27c86ec..4262b9d 100644 --- a/drivers/net/usb/sr9700.c +++ b/drivers/net/usb/sr9700.c @@ -29,7 +29,7 @@ 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); + 0, reg, data, length); if ((err != length) (err = 0)) err = -EINVAL; return err; @@ -40,7 +40,7 @@ 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); +0, reg, data, length); if ((err = 0) (err length)) err = -EINVAL; return err; @@ -54,19 +54,19 @@ static int sr_read_reg(struct usbnet *dev, u8 reg, u8 *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); + 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); +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); +value, reg, NULL, 0); } static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) @@ -89,7 +89,7 @@ static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) if (i = SR_SHARE_TIMEOUT) { netdev_err(dev-net, %s write timed out!\n, - phy ? phy : eeprom); +phy ? phy : eeprom); ret = -EIO; goto out; } @@ -98,7 +98,8 @@ out: return ret; } -static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, + __le16 *value) { int ret; @@ -115,14 +116,15 @@ static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value 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); +phy, reg, *value, ret); out: mutex_unlock(dev-phy_mutex); return ret; } -static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 value) +static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, +__le16 value) { int ret; @@ -156,7 +158,8 @@ static int sr9700_get_eeprom_len(struct net_device *dev) return SR_EEPROM_LEN; } -static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 *data) +static int sr9700_get_eeprom(struct net_device *net, + struct ethtool_eeprom *eeprom, u8 *data) { struct usbnet *dev = netdev_priv(net); __le16 *ebuf = (__le16 *)data; @@ -168,7 +171,8 @@ static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom *eepr return -EINVAL; for (i = 0; i eeprom-len / 2; i++) - ret = sr_read_eeprom_word(dev, eeprom-offset / 2 + i, ebuf[i]); + ret = sr_read_eeprom_word(dev, eeprom-offset / 2 + i, + ebuf[i]); return ret; } @@ -199,12 +203,13 @@ static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc) res = le16_to_cpu(res) ~BMSR_LSTATUS; netdev_dbg(dev-net, sr_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n, - phy_id, loc, res); +phy_id, loc, res); return res; } -static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) +static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, + int val) { struct usbnet *dev = netdev_priv(netdev); __le16 res = cpu_to_le16(val); @@ -215,7 +220,7 @@ static void sr_mdio_write(struct net_device *netdev, int phy_id, int loc, int va } netdev_dbg(dev-net, sr_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n, - phy_id, loc, val); +phy_id, loc, val); sr_share_write_word(dev, 1, loc, res); } @@ -242,15 +247,15 @@ static int sr9700_ioctl(struct net_device *net, struct ifreq *rq, int cmd) } static const struct ethtool_ops
[PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700 Device Driver Support
From: liujl Signed-off-by: liujl --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 551 ++ drivers/net/usb/sr9700.h | 172 ++ 4 files changed, 732 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..27c86ec --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,551 @@ +/* + * 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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i, ret; + + ret = 0; + for (i = 0; i < SR_SHARE_TIMEOUT; i++) { + u8 tmp = 0; + + udelay(1); + ret = sr_read_reg(dev, EPCR, ); + if (ret < 0) + goto out; + + /* ready */ + if ((tmp & EPCR_ERRE) == 0) + break; + } + + if (i >= SR_SHARE_TIMEOUT) { + netdev_err(dev->net, "%s write timed out!\n", + phy ? "phy" : "eeprom"); + ret = -EIO; + goto out; + } + +out: + return ret; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) +{ + int ret; + + mutex_lock(>phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); + sr_write_reg(dev, EPCR, phy ? 0xc : 0x4); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret < 0) + goto out; + + 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: + mutex_unlock(>phy_mutex); + return ret; +} + +static int
[PATCH] USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700 Device Driver Support
From: liujl liujunliang_...@163.com Signed-off-by: liujl liujunliang_...@163.com --- drivers/net/usb/Kconfig |8 + drivers/net/usb/Makefile |1 + drivers/net/usb/sr9700.c | 551 ++ drivers/net/usb/sr9700.h | 172 ++ 4 files changed, 732 insertions(+), 0 deletions(-) create mode 100644 drivers/net/usb/sr9700.c create mode 100644 drivers/net/usb/sr9700.h 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..27c86ec --- /dev/null +++ b/drivers/net/usb/sr9700.c @@ -0,0 +1,551 @@ +/* + * CoreChip-sz SR9700 one chip USB 1.1 Ethernet Devices + * + * Author : liujl liujunliang_...@163.com + * + * 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 linux/module.h +#include linux/sched.h +#include linux/stddef.h +#include linux/init.h +#include linux/netdevice.h +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/mii.h +#include linux/usb.h +#include linux/crc32.h +#include linux/usb/usbnet.h + +#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 wait_phy_eeprom_ready(struct usbnet *dev, int phy) +{ + int i, ret; + + ret = 0; + 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; + + /* ready */ + if ((tmp EPCR_ERRE) == 0) + break; + } + + if (i = SR_SHARE_TIMEOUT) { + netdev_err(dev-net, %s write timed out!\n, + phy ? phy : eeprom); + ret = -EIO; + goto out; + } + +out: + return ret; +} + +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) +{ + int ret; + + mutex_lock(dev-phy_mutex); + + sr_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); + sr_write_reg(dev, EPCR, phy ? 0xc : 0x4); + + ret = wait_phy_eeprom_ready(dev, phy); + if (ret 0) + goto out; + + sr_write_reg(dev, EPCR, 0x0); + ret = sr_read(dev, EPDR, 2, value); + +
Re: Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700DeviceDriver into the Linux Kernel
Dear all : Thanks all of you about your attentions and suggestions, and I think firstly I should read the documentations carefully. and then commiting the patch. Thanks all of you for your help and welcome all of you to come to china. Thanks again. 2013-08-22 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-21 19:34:10 收件人: liujunliang_ljl 抄送: Francois Romieu; gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700DeviceDriver into the Linux Kernel 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, [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. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�:+v���zZ+��+zf���h���~i���z��w���?�&�)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700DeviceDriver into the Linux Kernel
Dear all : Thanks all of you about your attentions and suggestions, and I think firstly I should read the documentations carefully. and then commiting the patch. Thanks all of you for your help and welcome all of you to come to china. Thanks again. 2013-08-22 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-21 19:34:10 收件人: liujunliang_ljl 抄送: Francois Romieu; gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700DeviceDriver into the Linux Kernel 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. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�j:+v���zZ+��+zf���h���~i���z��w���?��)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
* Product ID register */ +#definePID 0x2A/* 0x2A ~ 0x2B 2 bytes for PID */ +/* CHIP Revision register */ +#defineCHIPR 0x2C +/* 0x2D --> 0xEF unused */ +/* USB Device Address */ +#defineUSBDA 0xF0 +#defineUSBDA_USBFA (0x7F << 0) +/* RX packet Counter Reg */ +#defineRXC 0xF1 +/* Tx packet Counter & USB Status Reg */ +#defineTXC_USBS0xF2 +#defineTXC_USBS_TXC0 (1 << 0) +#defineTXC_USBS_TXC1 (1 << 1) +#defineTXC_USBS_TXC2 (1 << 2) +#defineTXC_USBS_EP1RDY (1 << 5) +#define TXC_USBS_SUSFLAG(1 << 6) +#defineTXC_USBS_RXFAULT (1 << 7) +/* USB Control register */ +#defineUSBC0xF4 +#defineUSBC_EP3NAK (1 << 4) +#defineUSBC_EP3ACK (1 << 5) + +/* Register access commands and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-21 04:58:27 收件人: Francois Romieu 抄送: liujunliang_ljl; gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel On Tue, 2013-08-20 at 22:46 +0200, Francois Romieu wrote: > liujunliang_ljl : > > + if (i >= SR_SHARE_TIMEOUT) { > > + netdev_err(dev->net, "%s read timed out!", phy ? "phy" : "eeprom"); netdev_, like almost all other printk messages needs a terminating "\n" newline to avoid any possible message interleaving by other printks. > > + if (!is_valid_ether_addr(addr->sa_data)) { > > + dev_err(>dev, "not setting invalid mac address %pM\n", > > + addr->sa_data); > > dev_err(>dev, "not setting invalid mac address %pM\n", > addr->sa_data); prefer netdev_ to dev_ where possible. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�:+v���zZ+��+zf���h���~i���z��w���?�&�)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
0x27 +/* Vendor ID register */ +#defineVID 0x28/* 0x28 ~ 0x29 2 bytes for VID */ +/* Product ID register */ +#definePID 0x2A/* 0x2A ~ 0x2B 2 bytes for PID */ +/* CHIP Revision register */ +#defineCHIPR 0x2C +/* 0x2D --> 0xEF unused */ +/* USB Device Address */ +#defineUSBDA 0xF0 +#defineUSBDA_USBFA (0x7F << 0) +/* RX packet Counter Reg */ +#defineRXC 0xF1 +/* Tx packet Counter & USB Status Reg */ +#defineTXC_USBS0xF2 +#defineTXC_USBS_TXC0 (1 << 0) +#defineTXC_USBS_TXC1 (1 << 1) +#defineTXC_USBS_TXC2 (1 << 2) +#defineTXC_USBS_EP1RDY (1 << 5) +#defineTXC_USBS_SUSFLAG(1 << 6) +#defineTXC_USBS_RXFAULT(1 << 7) +/* USB Control register */ +#defineUSBC0xF4 +#defineUSBC_EP3NAK (1 << 4) +#define USBC_EP3ACK (1 << 5) + +/* Register access commands and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Francois Romieu 发送时间: 2013-08-21 04:46:12 收件人: liujunliang_ljl 抄送: gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel liujunliang_ljl : [...] > We want to merge SR9700 device driver into the Linux Kernel. The following > is the Linux 3.10.7 version patch for SR9700, Please give us the assessment > and support. Welcome. Go ahead. [...] > diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c > new file mode 100644 > index 000..6a6429a > --- /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); > + if(err != length && err >= 0) ^^ missing space > + 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 above. > + 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); Sic. > +} > + > +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); Sic. > +} > + > +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); Sic. > +} > + > +static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 > *value) > +{ > + int ret, i; > + > + mutex_lock(>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, ); > + if (ret < 0) > + goto out; goto out_unlock; > + > + /* ready */ > + if ((tmp & 1) == 0) if ((tmp & EPCR_ERRE) == 0) > + break; > + } > + > + if (i >= SR_SHARE_TIMEOUT) { > + netdev_err(dev->net, "%s read timed out!", phy ? "phy" : "eeprom"); > + ret = -EIO; > + goto out; > + } > + > + sr_write_reg(dev, EPCR, 0x0); > + ret = sr_read(dev, EPDR, 2, value); > + > + netdev_dbg(dev->net, "
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
TRPAH 0x23 +/* Rx sdram Write Pointer Address Low */ +#defineRWPAL 0x24 +/* Rx sdram Write Pointer Address High */ +#defineRWPAH 0x25 +/* Rx sdram Read Pointer Address Low */ +#defineRRPAL 0x26 +/* Rx sdram Read Pointer Address High */ +#defineRRPAH 0x27 +/* Vendor ID register */ +#defineVID 0x28/* 0x28 ~ 0x29 2 bytes for VID */ +/* Product ID register */ +#definePID 0x2A/* 0x2A ~ 0x2B 2 bytes for PID */ +/* CHIP Revision register */ +#defineCHIPR 0x2C +/* 0x2D --> 0xEF unused */ +/* USB Device Address */ +#defineUSBDA 0xF0 +#defineUSBDA_USBFA (0x7F << 0) +/* RX packet Counter Reg */ +#defineRXC 0xF1 +/* Tx packet Counter & USB Status Reg */ +#defineTXC_USBS0xF2 +#defineTXC_USBS_TXC0 (1 << 0) +#defineTXC_USBS_TXC1 (1 << 1) +#defineTXC_USBS_TXC2 (1 << 2) +#defineTXC_USBS_EP1RDY (1 << 5) +#define TXC_USBS_SUSFLAG(1 << 6) +#define TXC_USBS_RXFAULT(1 << 7) +/* USB Control register */ +#defineUSBC0xF4 +#defineUSBC_EP3NAK (1 << 4) +#defineUSBC_EP3ACK (1 << 5) + +/* Register access commands and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Ben Hutchings 发送时间: 2013-08-20 21:36:50 收件人: liujunliang_ljl 抄送: gregkh; linux-usb; netdev; linux-kernel; sunhecheng 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel On Tue, 2013-08-20 at 18:50 +0800, liujunliang_ljl wrote: > Dear Gregkh & all : > > I am the software engineer Liu Junliang from ShenZhen CoreChips high > technology company, on the market of SR9700 chip is designed and owned by us. > SR9700 is a type of USB to Ethernet Converter and is compatible with > USB 1.1 protocol, We want to merge SR9700 device driver into the Linux > Kernel. The following is the Linux 3.10.7 version patch for SR9700, Please > give us the assessment and support. > Thanks a lot. As this is a net driver, the relevant maintainer is David Miller and not Greg. There are some style errors here which can be found using scripts/checkpatch.pl. You'll need to fix those and re-submit. I'll point out some more problems inline. > --- /dev/null > +++ b/drivers/net/usb/sr9700.c [...] > +static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom > *eeprom, u8 * data) > +{ > + struct usbnet *dev = netdev_priv(net); > + __le16 *ebuf = (__le16 *) data; > + int i; > + > + /* access is 16bit */ > + if ((eeprom->offset % 2) || (eeprom->len % 2)) > + return -EINVAL; You're really supposed to handle these cases by shifting as necessary. > + for (i = 0; i < eeprom->len / 2; i++) { > + if (sr_read_eeprom_word(dev, eeprom->offset / 2 + i, [i]) < 0) > + return -EINVAL; You should pass up the error code, not substitute -EINVAL. [...] > +static void sr9700_get_drvinfo(struct net_device *net, struct > ethtool_drvinfo *info) > +{ > + /* Inherit standard device info */ > + usbnet_get_drvinfo(net, info); > + info->eedump_len = SR_EEPROM_LEN; You don't need to set eedump_len; the ethtool core will set it after calling sr9700_get_eeprom_len(). So you don't need your own implementation of get_drvinfo at all. [...] > +static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) > +{ [...] > + /* read MAC */ > + if (sr_read(dev, PAR, ETH_ALEN, dev->net->dev_addr) < 0) { > + printk(KERN_ERR "Error reading MAC address\n"); > + ret = -ENODEV; > + goto out; > + } [...] I think this should read the MAC address from EEPROM and copy it to both dev_addr to perm_addr. MAC address changes should not persist if the driver is reloaded. Ben. -- Ben Hutchings, Staff Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�:+v���zZ+��+zf���h���~i���z��w���?�&�)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
TXC_USBS_TXC1 (1 1) +#defineTXC_USBS_TXC2 (1 2) +#defineTXC_USBS_EP1RDY (1 5) +#defineTXC_USBS_SUSFLAG(1 6) +#defineTXC_USBS_RXFAULT(1 7) +/* USB Control register */ +#defineUSBC0xF4 +#defineUSBC_EP3NAK (1 4) +#defineUSBC_EP3ACK (1 5) + +/* Register access commands and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Ben Hutchings 发送时间: 2013-08-20 21:36:50 收件人: liujunliang_ljl 抄送: gregkh; linux-usb; netdev; linux-kernel; sunhecheng 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel On Tue, 2013-08-20 at 18:50 +0800, liujunliang_ljl wrote: Dear Gregkh all : I am the software engineer Liu Junliang from ShenZhen CoreChips high technology company, on the market of SR9700 chip is designed and owned by us. SR9700 is a type of USB to Ethernet Converter and is compatible with USB 1.1 protocol, We want to merge SR9700 device driver into the Linux Kernel. The following is the Linux 3.10.7 version patch for SR9700, Please give us the assessment and support. Thanks a lot. As this is a net driver, the relevant maintainer is David Miller and not Greg. There are some style errors here which can be found using scripts/checkpatch.pl. You'll need to fix those and re-submit. I'll point out some more problems inline. --- /dev/null +++ b/drivers/net/usb/sr9700.c [...] +static int sr9700_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 * data) +{ + struct usbnet *dev = netdev_priv(net); + __le16 *ebuf = (__le16 *) data; + int i; + + /* access is 16bit */ + if ((eeprom-offset % 2) || (eeprom-len % 2)) + return -EINVAL; You're really supposed to handle these cases by shifting as necessary. + for (i = 0; i eeprom-len / 2; i++) { + if (sr_read_eeprom_word(dev, eeprom-offset / 2 + i, ebuf[i]) 0) + return -EINVAL; You should pass up the error code, not substitute -EINVAL. [...] +static void sr9700_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) +{ + /* Inherit standard device info */ + usbnet_get_drvinfo(net, info); + info-eedump_len = SR_EEPROM_LEN; You don't need to set eedump_len; the ethtool core will set it after calling sr9700_get_eeprom_len(). So you don't need your own implementation of get_drvinfo at all. [...] +static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) +{ [...] + /* read MAC */ + if (sr_read(dev, PAR, ETH_ALEN, dev-net-dev_addr) 0) { + printk(KERN_ERR Error reading MAC address\n); + ret = -ENODEV; + goto out; + } [...] I think this should read the MAC address from EEPROM and copy it to both dev_addr to perm_addr. MAC address changes should not persist if the driver is reloaded. Ben. -- Ben Hutchings, Staff Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�j:+v���zZ+��+zf���h���~i���z��w���?��)ߢf��^jǫy�m��@A�a��� 0��h���i
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
(1 4) +#defineUSBC_EP3ACK (1 5) + +/* Register access commands and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Francois Romieu 发送时间: 2013-08-21 04:46:12 收件人: liujunliang_ljl 抄送: gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel liujunliang_ljl liujunliang_...@163.com : [...] We want to merge SR9700 device driver into the Linux Kernel. The following is the Linux 3.10.7 version patch for SR9700, Please give us the assessment and support. Welcome. Go ahead. [...] diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c new file mode 100644 index 000..6a6429a --- /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); + if(err != length err = 0) ^^ missing space + 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 above. + 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); Sic. +} + +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); Sic. +} + +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); Sic. +} + +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; goto out_unlock; + + /* ready */ + if ((tmp 1) == 0) if ((tmp EPCR_ERRE) == 0) + break; + } + + if (i = SR_SHARE_TIMEOUT) { + netdev_err(dev-net, %s read timed out!, phy ? phy : eeprom); + ret = -EIO; + goto out; + } + + 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, +phy, reg, *value, ret); + + out: ^ please remove space. + 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; + + 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; + + /* ready */ + if ((tmp 1) == 0) + break; + } The 11 lines above are identical in sr_share_read_word. Please refactor. [...] +static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc) +{ + struct usbnet *dev = netdev_priv(netdev); + + __le16 res; Excess empty line. + int rc = 0; + + if (phy_id) { + netdev_dbg(dev-net, Only internal phy supported); + return 0; + } + + /* Access NSR_LINKST bit for link status instead of MII_BMSR */ + if(loc == MII_BMSR){ ^^ ^^ Missing spaces. + u8 value; Excess tabs and missing empty line. + sr_read_reg(dev, NSR, value); + if(value NSR_LINKST) { Excess tabs, missing spaces, useless {. + rc = 1; + } + } + sr_share_read_word(dev, 1, loc, res); + if(rc == 1) + return (le16_to_cpu(res) | BMSR_LSTATUS); + else + return (le16_to_cpu(res) ~BMSR_LSTATUS); Excess ( (aka return is not a function
Re: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel
and flags */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +/* parameters */ +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_ADDR_FLAG 0x80 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 /* 2bytes header */ +#defineSR_RX_OVERHEAD 7 /* 3bytes header + 4crc tail */ + +#endif /* _SR9700_H */ 2013-08-21 liujunliang_ljl 发件人: Joe Perches 发送时间: 2013-08-21 04:58:27 收件人: Francois Romieu 抄送: liujunliang_ljl; gregkh; sunhecheng; linux-usb; netdev; linux-kernel 主题: Re: [PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 DeviceDriver into the Linux Kernel On Tue, 2013-08-20 at 22:46 +0200, Francois Romieu wrote: liujunliang_ljl liujunliang_...@163.com : + if (i = SR_SHARE_TIMEOUT) { + netdev_err(dev-net, %s read timed out!, phy ? phy : eeprom); netdev_level, like almost all other printk messages needs a terminating \n newline to avoid any possible message interleaving by other printks. + if (!is_valid_ether_addr(addr-sa_data)) { + dev_err(net-dev, not setting invalid mac address %pM\n, + addr-sa_data); dev_err(net-dev, not setting invalid mac address %pM\n, addr-sa_data); prefer netdev_level to dev_level where possible. N�r��yb�X��ǧv�^�){.n�+{zX����ܨ}���Ơz�j:+v���zZ+��+zf���h���~i���z��w���?��)ߢf��^jǫy�m��@A�a��� 0��h���i
[PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 Device Driver into the Linux Kernel
0x16 +#definePRR 0x1F +#defineTWPAL 0x20 +#defineTWPAH 0x21 +#defineTRPAL 0x22 +#defineTRPAH 0x23 +#defineRWPAL 0x24 +#defineRWPAH 0x25 +#defineRRPAL 0x26 +#defineRRPAH 0x27 +#defineVID 0x28 +#definePID 0x2A +#defineCHIPR 0x2C +#defineUSBDA 0xF0 +#defineRXC 0xF1 +#defineTXC_USBS0xF2 +#defineUSBC0xF4 + +/* Bit definition for registers */ +// Network Control Reg +#defineNCR_RST (1 << 0) +#defineNCR_LBK (3 << 1) +#defineNCR_FDX (1 << 3) +#defineNCR_WAKEEN (1 << 6) +// Network Status Reg +#defineNSR_RXRDY (1 << 0) +#defineNSR_RXOV(1 << 1) +#defineNSR_TX1END (1 << 2) +#defineNSR_TX2END (1 << 3) +#defineNSR_TXFULL (1 << 4) +#defineNSR_WAKEST (1 << 5) +#defineNSR_LINKST (1 << 6) +#defineNSR_SPEED (1 << 7) +// Tx Control Reg +#defineTCR_CRC_DIS (1 << 1) +#defineTCR_PAD_DIS (1 << 2) +#defineTCR_LC_CARE (1 << 3) +#defineTCR_CRS_CARE(1 << 4) +#defineTCR_EXCECM (1 << 5) +#defineTCR_LF_EN (1 << 6) +// Tx Status Reg for Packet 1 +#defineTSR1_EC (1 << 2) +#defineTSR1_COL(1 << 3) +#defineTSR1_LC (1 << 4) +#defineTSR1_NC (1 << 5) +#defineTSR1_LOC(1 << 6) +#defineTSR1_TLF(1 << 7) +// Tx Status Reg for Packet 2 +#defineTSR2_EC (1 << 2) +#defineTSR2_COL(1 << 3) +#defineTSR2_LC (1 << 4) +#defineTSR2_NC (1 << 5) +#defineTSR2_LOC(1 << 6) +#defineTSR2_TLF(1 << 7) +// Rx Control Reg +#defineRCR_RXEN(1 << 0) +#defineRCR_PRMSC (1 << 1) +#defineRCR_RUNT(1 << 2) +#defineRCR_ALL (1 << 3) +#defineRCR_DIS_CRC (1 << 4) +#defineRCR_DIS_LONG(1 << 5) +// Rx Status Reg +#defineRSR_AE (1 << 2) +#defineRSR_MF (1 << 6) +#defineRSR_RF (1 << 7) +// Recv Overflow Counter Reg +#defineROCR_ROC(0x7F << 0) +#defineROCR_RXFU (1 << 7) +// Back Pressure Threshold Reg +#defineBPTR_JPT(0x0F << 0) +#defineBPTR_BPHW (0x0F << 4) +// Flow Control Threshold Reg +#defineFCTR_LWOT (0x0F << 0) +#defineFCTR_HWOT (0x0F << 4) +// rx/tx Flow Control Reg +#defineFCR_FLCE(1 << 0) +#defineFCR_BKPA(1 << 4) +#defineFCR_TXPEN (1 << 5) +#defineFCR_TXPF(1 << 6) +#defineFCR_TXP0(1 << 7) +// EEPROM & PHY Control Reg +#defineEPCR_ERRE (1 << 0) +#defineEPCR_ERPRW (1 << 1) +#defineEPCR_ERPRR (1 << 2) +#defineEPCR_EPOS (1 << 3) +#defineEPCR_WEP(1 << 4) +// EEPROM & PHY Address Reg +#defineEPAR_EROA (0x3F << 0) +#defineEPAR_PHY_ADR(0x03 << 6) +// Wakeup Control Reg +#defineWCR_MAGICST (1 << 0) +#defineWCR_LINKST (1 << 2) +#defineWCR_MAGICEN (1 << 3) +#defineWCR_LINKEN (1 << 5) +// Phy Reset Reg +#definePRR_PHY_RST (1 << 0) +// USB Device Address Reg +#defineUSBDA_USBFA (0x7F << 0) +// TX packet Counter & USB Status Reg +#defineTXC_USBS_TXC0 (1 << 0) +#defineTXC_USBS_TXC1 (1 << 1) +#defineTXC_USBS_TXC2 (1 << 2) +#defineTXC_USBS_EP1RDY (1 << 5) +#defineTXC_USBS_SUSFLAG(1 << 6) +#defineTXC_USBS_RXFAULT(1 << 7) +// USB Control Reg +#defineUSBC_EP3NAK (1 << 4) +#defineUSBC_EP3ACK (1 << 5) + +/* Variables */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 // 2bytes header +#defineSR_RX_OVERHEAD 7 // 3bytes header + 4crc tail + +/*--*/ -- 2013-08-20 liujunliang_ljl www.corechip-sz.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 Device Driver into the Linux Kernel
6 +#definePRR 0x1F +#defineTWPAL 0x20 +#defineTWPAH 0x21 +#defineTRPAL 0x22 +#defineTRPAH 0x23 +#defineRWPAL 0x24 +#defineRWPAH 0x25 +#defineRRPAL 0x26 +#defineRRPAH 0x27 +#defineVID 0x28 +#definePID 0x2A +#defineCHIPR 0x2C +#defineUSBDA 0xF0 +#defineRXC 0xF1 +#defineTXC_USBS0xF2 +#defineUSBC0xF4 + +/* Bit definition for registers */ +// Network Control Reg +#defineNCR_RST (1 << 0) +#defineNCR_LBK (3 << 1) +#defineNCR_FDX (1 << 3) +#defineNCR_WAKEEN (1 << 6) +// Network Status Reg +#defineNSR_RXRDY (1 << 0) +#defineNSR_RXOV(1 << 1) +#defineNSR_TX1END (1 << 2) +#defineNSR_TX2END (1 << 3) +#defineNSR_TXFULL (1 << 4) +#defineNSR_WAKEST (1 << 5) +#defineNSR_LINKST (1 << 6) +#defineNSR_SPEED (1 << 7) +// Tx Control Reg +#defineTCR_CRC_DIS (1 << 1) +#defineTCR_PAD_DIS (1 << 2) +#defineTCR_LC_CARE (1 << 3) +#defineTCR_CRS_CARE(1 << 4) +#defineTCR_EXCECM (1 << 5) +#defineTCR_LF_EN (1 << 6) +// Tx Status Reg for Packet 1 +#defineTSR1_EC (1 << 2) +#defineTSR1_COL(1 << 3) +#defineTSR1_LC (1 << 4) +#defineTSR1_NC (1 << 5) +#defineTSR1_LOC(1 << 6) +#defineTSR1_TLF(1 << 7) +// Tx Status Reg for Packet 2 +#defineTSR2_EC (1 << 2) +#defineTSR2_COL(1 << 3) +#defineTSR2_LC (1 << 4) +#defineTSR2_NC (1 << 5) +#defineTSR2_LOC(1 << 6) +#defineTSR2_TLF(1 << 7) +// Rx Control Reg +#defineRCR_RXEN(1 << 0) +#defineRCR_PRMSC (1 << 1) +#defineRCR_RUNT(1 << 2) +#defineRCR_ALL (1 << 3) +#defineRCR_DIS_CRC (1 << 4) +#defineRCR_DIS_LONG(1 << 5) +// Rx Status Reg +#defineRSR_AE (1 << 2) +#defineRSR_MF (1 << 6) +#defineRSR_RF (1 << 7) +// Recv Overflow Counter Reg +#defineROCR_ROC(0x7F << 0) +#defineROCR_RXFU (1 << 7) +// Back Pressure Threshold Reg +#defineBPTR_JPT(0x0F << 0) +#defineBPTR_BPHW (0x0F << 4) +// Flow Control Threshold Reg +#defineFCTR_LWOT (0x0F << 0) +#defineFCTR_HWOT (0x0F << 4) +// rx/tx Flow Control Reg +#defineFCR_FLCE(1 << 0) +#defineFCR_BKPA(1 << 4) +#defineFCR_TXPEN (1 << 5) +#defineFCR_TXPF(1 << 6) +#defineFCR_TXP0(1 << 7) +// EEPROM & PHY Control Reg +#defineEPCR_ERRE (1 << 0) +#defineEPCR_ERPRW (1 << 1) +#defineEPCR_ERPRR (1 << 2) +#defineEPCR_EPOS (1 << 3) +#defineEPCR_WEP(1 << 4) +// EEPROM & PHY Address Reg +#defineEPAR_EROA (0x3F << 0) +#defineEPAR_PHY_ADR(0x03 << 6) +// Wakeup Control Reg +#defineWCR_MAGICST (1 << 0) +#defineWCR_LINKST (1 << 2) +#defineWCR_MAGICEN (1 << 3) +#defineWCR_LINKEN (1 << 5) +// Phy Reset Reg +#definePRR_PHY_RST (1 << 0) +// USB Device Address Reg +#defineUSBDA_USBFA (0x7F << 0) +// TX packet Counter & USB Status Reg +#defineTXC_USBS_TXC0 (1 << 0) +#defineTXC_USBS_TXC1 (1 << 1) +#defineTXC_USBS_TXC2 (1 << 2) +#defineTXC_USBS_EP1RDY (1 << 5) +#defineTXC_USBS_SUSFLAG(1 << 6) +#defineTXC_USBS_RXFAULT(1 << 7) +// USB Control Reg +#defineUSBC_EP3NAK (1 << 4) +#defineUSBC_EP3ACK (1 << 5) + +/* Variables */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 // 2bytes header +#defineSR_RX_OVERHEAD 7 // 3bytes header + 4crc tail + +/*--*/ -- 2013-08-20 liujunliang_ljl www.corechip-sz.com
[PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 Device Driver into the Linux Kernel
+#defineRXC 0xF1 +#defineTXC_USBS0xF2 +#defineUSBC0xF4 + +/* Bit definition for registers */ +// Network Control Reg +#defineNCR_RST (1 0) +#defineNCR_LBK (3 1) +#defineNCR_FDX (1 3) +#defineNCR_WAKEEN (1 6) +// Network Status Reg +#defineNSR_RXRDY (1 0) +#defineNSR_RXOV(1 1) +#defineNSR_TX1END (1 2) +#defineNSR_TX2END (1 3) +#defineNSR_TXFULL (1 4) +#defineNSR_WAKEST (1 5) +#defineNSR_LINKST (1 6) +#defineNSR_SPEED (1 7) +// Tx Control Reg +#defineTCR_CRC_DIS (1 1) +#defineTCR_PAD_DIS (1 2) +#defineTCR_LC_CARE (1 3) +#defineTCR_CRS_CARE(1 4) +#defineTCR_EXCECM (1 5) +#defineTCR_LF_EN (1 6) +// Tx Status Reg for Packet 1 +#defineTSR1_EC (1 2) +#defineTSR1_COL(1 3) +#defineTSR1_LC (1 4) +#defineTSR1_NC (1 5) +#defineTSR1_LOC(1 6) +#defineTSR1_TLF(1 7) +// Tx Status Reg for Packet 2 +#defineTSR2_EC (1 2) +#defineTSR2_COL(1 3) +#defineTSR2_LC (1 4) +#defineTSR2_NC (1 5) +#defineTSR2_LOC(1 6) +#defineTSR2_TLF(1 7) +// Rx Control Reg +#defineRCR_RXEN(1 0) +#defineRCR_PRMSC (1 1) +#defineRCR_RUNT(1 2) +#defineRCR_ALL (1 3) +#defineRCR_DIS_CRC (1 4) +#defineRCR_DIS_LONG(1 5) +// Rx Status Reg +#defineRSR_AE (1 2) +#defineRSR_MF (1 6) +#defineRSR_RF (1 7) +// Recv Overflow Counter Reg +#defineROCR_ROC(0x7F 0) +#defineROCR_RXFU (1 7) +// Back Pressure Threshold Reg +#defineBPTR_JPT(0x0F 0) +#defineBPTR_BPHW (0x0F 4) +// Flow Control Threshold Reg +#defineFCTR_LWOT (0x0F 0) +#defineFCTR_HWOT (0x0F 4) +// rx/tx Flow Control Reg +#defineFCR_FLCE(1 0) +#defineFCR_BKPA(1 4) +#defineFCR_TXPEN (1 5) +#defineFCR_TXPF(1 6) +#defineFCR_TXP0(1 7) +// EEPROM PHY Control Reg +#defineEPCR_ERRE (1 0) +#defineEPCR_ERPRW (1 1) +#defineEPCR_ERPRR (1 2) +#defineEPCR_EPOS (1 3) +#defineEPCR_WEP(1 4) +// EEPROM PHY Address Reg +#defineEPAR_EROA (0x3F 0) +#defineEPAR_PHY_ADR(0x03 6) +// Wakeup Control Reg +#defineWCR_MAGICST (1 0) +#defineWCR_LINKST (1 2) +#defineWCR_MAGICEN (1 3) +#defineWCR_LINKEN (1 5) +// Phy Reset Reg +#definePRR_PHY_RST (1 0) +// USB Device Address Reg +#defineUSBDA_USBFA (0x7F 0) +// TX packet Counter USB Status Reg +#defineTXC_USBS_TXC0 (1 0) +#defineTXC_USBS_TXC1 (1 1) +#defineTXC_USBS_TXC2 (1 2) +#defineTXC_USBS_EP1RDY (1 5) +#defineTXC_USBS_SUSFLAG(1 6) +#defineTXC_USBS_RXFAULT(1 7) +// USB Control Reg +#defineUSBC_EP3NAK (1 4) +#defineUSBC_EP3ACK (1 5) + +/* Variables */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 // 2bytes header +#defineSR_RX_OVERHEAD 7 // 3bytes header + 4crc tail + +/*--*/ -- 2013-08-20 liujunliang_ljl www.corechip-sz.com
[PATCH-SR9700] Merge USB 1.1 Ethernet Adapter SR9700 Device Driver into the Linux Kernel
0xF0 +#defineRXC 0xF1 +#defineTXC_USBS0xF2 +#defineUSBC0xF4 + +/* Bit definition for registers */ +// Network Control Reg +#defineNCR_RST (1 0) +#defineNCR_LBK (3 1) +#defineNCR_FDX (1 3) +#defineNCR_WAKEEN (1 6) +// Network Status Reg +#defineNSR_RXRDY (1 0) +#defineNSR_RXOV(1 1) +#defineNSR_TX1END (1 2) +#defineNSR_TX2END (1 3) +#defineNSR_TXFULL (1 4) +#defineNSR_WAKEST (1 5) +#defineNSR_LINKST (1 6) +#defineNSR_SPEED (1 7) +// Tx Control Reg +#defineTCR_CRC_DIS (1 1) +#defineTCR_PAD_DIS (1 2) +#defineTCR_LC_CARE (1 3) +#defineTCR_CRS_CARE(1 4) +#defineTCR_EXCECM (1 5) +#defineTCR_LF_EN (1 6) +// Tx Status Reg for Packet 1 +#defineTSR1_EC (1 2) +#defineTSR1_COL(1 3) +#defineTSR1_LC (1 4) +#defineTSR1_NC (1 5) +#defineTSR1_LOC(1 6) +#defineTSR1_TLF(1 7) +// Tx Status Reg for Packet 2 +#defineTSR2_EC (1 2) +#defineTSR2_COL(1 3) +#defineTSR2_LC (1 4) +#defineTSR2_NC (1 5) +#defineTSR2_LOC(1 6) +#defineTSR2_TLF(1 7) +// Rx Control Reg +#defineRCR_RXEN(1 0) +#defineRCR_PRMSC (1 1) +#defineRCR_RUNT(1 2) +#defineRCR_ALL (1 3) +#defineRCR_DIS_CRC (1 4) +#defineRCR_DIS_LONG(1 5) +// Rx Status Reg +#defineRSR_AE (1 2) +#defineRSR_MF (1 6) +#defineRSR_RF (1 7) +// Recv Overflow Counter Reg +#defineROCR_ROC(0x7F 0) +#defineROCR_RXFU (1 7) +// Back Pressure Threshold Reg +#defineBPTR_JPT(0x0F 0) +#defineBPTR_BPHW (0x0F 4) +// Flow Control Threshold Reg +#defineFCTR_LWOT (0x0F 0) +#defineFCTR_HWOT (0x0F 4) +// rx/tx Flow Control Reg +#defineFCR_FLCE(1 0) +#defineFCR_BKPA(1 4) +#defineFCR_TXPEN (1 5) +#defineFCR_TXPF(1 6) +#defineFCR_TXP0(1 7) +// EEPROM PHY Control Reg +#defineEPCR_ERRE (1 0) +#defineEPCR_ERPRW (1 1) +#defineEPCR_ERPRR (1 2) +#defineEPCR_EPOS (1 3) +#defineEPCR_WEP(1 4) +// EEPROM PHY Address Reg +#defineEPAR_EROA (0x3F 0) +#defineEPAR_PHY_ADR(0x03 6) +// Wakeup Control Reg +#defineWCR_MAGICST (1 0) +#defineWCR_LINKST (1 2) +#defineWCR_MAGICEN (1 3) +#defineWCR_LINKEN (1 5) +// Phy Reset Reg +#definePRR_PHY_RST (1 0) +// USB Device Address Reg +#defineUSBDA_USBFA (0x7F 0) +// TX packet Counter USB Status Reg +#defineTXC_USBS_TXC0 (1 0) +#defineTXC_USBS_TXC1 (1 1) +#defineTXC_USBS_TXC2 (1 2) +#defineTXC_USBS_EP1RDY (1 5) +#defineTXC_USBS_SUSFLAG(1 6) +#defineTXC_USBS_RXFAULT(1 7) +// USB Control Reg +#defineUSBC_EP3NAK (1 4) +#defineUSBC_EP3ACK (1 5) + +/* Variables */ +#defineSR_RD_REGS 0x00 +#defineSR_WR_REGS 0x01 +#defineSR_WR_REG 0x03 +#defineSR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#defineSR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +#defineSR_SHARE_TIMEOUT1000 +#defineSR_EEPROM_LEN 256 +#defineSR_MCAST_SIZE 8 +#defineSR_MCAST_MAX64 +#defineSR_TX_OVERHEAD 2 // 2bytes header +#defineSR_RX_OVERHEAD 7 // 3bytes header + 4crc tail + +/*--*/ -- 2013-08-20 liujunliang_ljl www.corechip-sz.com -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/