ax88772b support for axe(4)

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

ax88772b support for axe(4)

joshua stein-3
this adds support to axe(4) for the ax88772b usb ethernet adapter
that came with my asus ux21.

it adds the usb device and an ax88772b-specific register that
freebsd sets[1].

according to linux[2], the ax88772b only uses 11 bits of the header
for the actual packet size and the other bits are used for something
else.  older chips didn't use those extra 5 bits, so they didn't
produce length mismatches.  this makes the length checks only look
at 11 bits.

tested and working on the ax88772b with no input errors.  tested and
still working on an older apple ax88772 usb adapter.


1. http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/usb/net/if_axe.c.diff?r1=1.37;r2=1.38
and http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/usb/net/if_axereg.h.diff?r1=1.7;r2=1.8

2. http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=bca0beb9363f8487ac902931a50eb00180a2d14a


Index: dev/usb/if_axe.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
retrieving revision 1.107
diff -u -p -u -p -r1.107 if_axe.c
--- dev/usb/if_axe.c 16 Sep 2011 17:20:07 -0000 1.107
+++ dev/usb/if_axe.c 20 Oct 2011 03:51:24 -0000
@@ -150,6 +150,7 @@ const struct axe_type axe_devs[] = {
  { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88172}, 0 },
  { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772}, AX772 },
  { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772A}, AX772 },
+ { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772B}, AX772 | AX772B },
  { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88178}, AX178 },
  { { USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC210T}, 0 },
  { { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D5055 }, AX178 },
@@ -765,6 +766,8 @@ axe_attach(struct device *parent, struct
  printf("%s:", sc->axe_dev.dv_xname);
  if (sc->axe_flags & AX178)
  printf(" AX88178");
+ else if (sc->axe_flags & AX772B)
+ printf(" AX88772B");
  else if (sc->axe_flags & AX772)
  printf(" AX88772");
  else
@@ -1025,11 +1028,11 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_pr
  memcpy(&hdr, buf, sizeof(hdr));
  total_len -= sizeof(hdr);
 
- if ((hdr.len ^ hdr.ilen) != 0xffff) {
+ if (((hdr.len & 0x07ff) ^ (hdr.ilen & 0x07ff)) != 0x07ff) {
  ifp->if_ierrors++;
  goto done;
  }
- pktlen = letoh16(hdr.len);
+ pktlen = letoh16(hdr.len & 0x07ff);
  if (pktlen > total_len) {
  ifp->if_ierrors++;
  goto done;
@@ -1334,7 +1337,9 @@ axe_init(void *xsc)
 
  /* Enable receiver, set RX mode */
  rxmode = AXE_RXCMD_MULTICAST|AXE_RXCMD_ENABLE;
- if (sc->axe_flags & AX178 || sc->axe_flags & AX772) {
+ if (sc->axe_flags & AX772B)
+ rxmode |= AXE_772B_RXCMD_HDR_TYPE_1;
+ else if (sc->axe_flags & AX178 || sc->axe_flags & AX772) {
  if (sc->axe_udev->speed == USB_SPEED_HIGH) {
  /* largest possible USB buffer size for AX88178 */
  rxmode |= AXE_178_RXCMD_MFB;
Index: dev/usb/if_axereg.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_axereg.h,v
retrieving revision 1.20
diff -u -p -u -p -r1.20 if_axereg.h
--- dev/usb/if_axereg.h 6 Dec 2010 04:41:39 -0000 1.20
+++ dev/usb/if_axereg.h 20 Oct 2011 03:51:24 -0000
@@ -149,6 +149,8 @@
 
 #define        AXE_PHY_NO_AX772_EPHY   0x10    /* Embedded 10/100 PHY of AX88772 */
 
+#define AXE_772B_RXCMD_HDR_TYPE_1 0x0100
+
 #define AXE_TIMEOUT 1000
 #define AXE_172_BUFSZ 1536
 #define AXE_178_MIN_BUFSZ 2048
@@ -177,6 +179,7 @@ struct axe_type {
  u_int16_t axe_flags;
 #define AX178 0x0001 /* AX88178 */
 #define AX772 0x0002 /* AX88772 */
+#define AX772B 0x0004 /* AX88772B */
 };
 
 struct axe_softc;
Index: dev/usb/usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.558
diff -u -p -u -p -r1.558 usbdevs
--- dev/usb/usbdevs 7 Oct 2011 06:01:49 -0000 1.558
+++ dev/usb/usbdevs 20 Oct 2011 03:51:28 -0000
@@ -908,6 +908,7 @@ product ASIX AX88172 0x1720 USB 2.0 10/
 product ASIX AX88178 0x1780 AX88178
 product ASIX AX88772 0x7720 AX88772
 product ASIX AX88772A 0x772a AX88772a
+product ASIX AX88772B 0x7e2b AX88772b
 
 /* ASUS products */
 product ASUS2 USBN11 0x0b05 USB-N11
Index: dev/usb/usbdevs.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
retrieving revision 1.568
diff -u -p -u -p -r1.568 usbdevs.h
--- dev/usb/usbdevs.h 7 Oct 2011 06:02:19 -0000 1.568
+++ dev/usb/usbdevs.h 20 Oct 2011 03:51:34 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdevs.h,v 1.568 2011/10/07 06:02:19 ckuethe Exp $ */
+/* $OpenBSD$ */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -915,6 +915,7 @@
 #define USB_PRODUCT_ASIX_AX88178 0x1780 /* AX88178 */
 #define USB_PRODUCT_ASIX_AX88772 0x7720 /* AX88772 */
 #define USB_PRODUCT_ASIX_AX88772A 0x772a /* AX88772a */
+#define USB_PRODUCT_ASIX_AX88772B 0x7e2b /* AX88772b */
 
 /* ASUS products */
 #define USB_PRODUCT_ASUS2_USBN11 0x0b05 /* USB-N11 */
Index: dev/usb/usbdevs_data.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v
retrieving revision 1.562
diff -u -p -u -p -r1.562 usbdevs_data.h
--- dev/usb/usbdevs_data.h 7 Oct 2011 06:02:19 -0000 1.562
+++ dev/usb/usbdevs_data.h 20 Oct 2011 03:51:39 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdevs_data.h,v 1.562 2011/10/07 06:02:19 ckuethe Exp $ */
+/* $OpenBSD$ */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -784,6 +784,10 @@ const struct usb_known_product usb_known
  {
     USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772A,
     "AX88772a",
+ },
+ {
+    USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772B,
+    "AX88772b",
  },
  {
     USB_VENDOR_ASUS2, USB_PRODUCT_ASUS2_USBN11,

Reply | Threaded
Open this post in threaded view
|

Re: ax88772b support for axe(4)

Jonathan Gray
Comments inline

On Wed, Oct 19, 2011 at 10:53:32PM -0500, joshua stein wrote:

> this adds support to axe(4) for the ax88772b usb ethernet adapter
> that came with my asus ux21.
>
> it adds the usb device and an ax88772b-specific register that
> freebsd sets[1].
>
> according to linux[2], the ax88772b only uses 11 bits of the header
> for the actual packet size and the other bits are used for something
> else.  older chips didn't use those extra 5 bits, so they didn't
> produce length mismatches.  this makes the length checks only look
> at 11 bits.
>
> tested and working on the ax88772b with no input errors.  tested and
> still working on an older apple ax88772 usb adapter.
>
>
> 1. http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/usb/net/if_axe.c.diff?r1=1.37;r2=1.38
> and http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/usb/net/if_axereg.h.diff?r1=1.7;r2=1.8
>
> 2. http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=bca0beb9363f8487ac902931a50eb00180a2d14a
>
>
> Index: dev/usb/if_axe.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
> retrieving revision 1.107
> diff -u -p -u -p -r1.107 if_axe.c
> --- dev/usb/if_axe.c 16 Sep 2011 17:20:07 -0000 1.107
> +++ dev/usb/if_axe.c 20 Oct 2011 03:51:24 -0000
> @@ -150,6 +150,7 @@ const struct axe_type axe_devs[] = {
>   { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88172}, 0 },
>   { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772}, AX772 },
>   { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772A}, AX772 },
> + { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772B}, AX772 | AX772B },
>   { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88178}, AX178 },
>   { { USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC210T}, 0 },
>   { { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D5055 }, AX178 },
> @@ -765,6 +766,8 @@ axe_attach(struct device *parent, struct
>   printf("%s:", sc->axe_dev.dv_xname);
>   if (sc->axe_flags & AX178)
>   printf(" AX88178");
> + else if (sc->axe_flags & AX772B)
> + printf(" AX88772B");
>   else if (sc->axe_flags & AX772)
>   printf(" AX88772");
>   else
> @@ -1025,11 +1028,11 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_pr
>   memcpy(&hdr, buf, sizeof(hdr));
>   total_len -= sizeof(hdr);
>  
> - if ((hdr.len ^ hdr.ilen) != 0xffff) {
> + if (((hdr.len & 0x07ff) ^ (hdr.ilen & 0x07ff)) != 0x07ff) {
>   ifp->if_ierrors++;
>   goto done;
>   }
> - pktlen = letoh16(hdr.len);
> + pktlen = letoh16(hdr.len & 0x07ff);

please define the mask to something

>   if (pktlen > total_len) {
>   ifp->if_ierrors++;
>   goto done;
> @@ -1334,7 +1337,9 @@ axe_init(void *xsc)
>  
>   /* Enable receiver, set RX mode */
>   rxmode = AXE_RXCMD_MULTICAST|AXE_RXCMD_ENABLE;
> - if (sc->axe_flags & AX178 || sc->axe_flags & AX772) {
> + if (sc->axe_flags & AX772B)
> + rxmode |= AXE_772B_RXCMD_HDR_TYPE_1;
> + else if (sc->axe_flags & AX178 || sc->axe_flags & AX772) {
>   if (sc->axe_udev->speed == USB_SPEED_HIGH) {
>   /* largest possible USB buffer size for AX88178 */
>   rxmode |= AXE_178_RXCMD_MFB;
> Index: dev/usb/if_axereg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_axereg.h,v
> retrieving revision 1.20
> diff -u -p -u -p -r1.20 if_axereg.h
> --- dev/usb/if_axereg.h 6 Dec 2010 04:41:39 -0000 1.20
> +++ dev/usb/if_axereg.h 20 Oct 2011 03:51:24 -0000
> @@ -149,6 +149,8 @@
>  
>  #define        AXE_PHY_NO_AX772_EPHY   0x10    /* Embedded 10/100 PHY of AX88772 */
>  
> +#define AXE_772B_RXCMD_HDR_TYPE_1 0x0100
> +

The datasheet calls this RH1M, it would be nice to have

AXE_772B_RXCMD_RH1M instead, along with
#define      AXE_772B_RXCMD_RH2M       0x0200
#define      AXE_772B_RXCMD_RH3M       0x0400

It also says format 1 is the default, though it
can't hurt to set it again.


>  #define AXE_TIMEOUT 1000
>  #define AXE_172_BUFSZ 1536
>  #define AXE_178_MIN_BUFSZ 2048
> @@ -177,6 +179,7 @@ struct axe_type {
>   u_int16_t axe_flags;
>  #define AX178 0x0001 /* AX88178 */
>  #define AX772 0x0002 /* AX88772 */
> +#define AX772B 0x0004 /* AX88772B */
>  };
>  
>  struct axe_softc;
> Index: dev/usb/usbdevs
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usbdevs,v
> retrieving revision 1.558
> diff -u -p -u -p -r1.558 usbdevs
> --- dev/usb/usbdevs 7 Oct 2011 06:01:49 -0000 1.558
> +++ dev/usb/usbdevs 20 Oct 2011 03:51:28 -0000
> @@ -908,6 +908,7 @@ product ASIX AX88172 0x1720 USB 2.0 10/
>  product ASIX AX88178 0x1780 AX88178
>  product ASIX AX88772 0x7720 AX88772
>  product ASIX AX88772A 0x772a AX88772a
> +product ASIX AX88772B 0x7e2b AX88772b

ASIX capitalise the 'b' so might as well make this AX88772B
(and fix the other one).