Some follow-up:

I purchased an Anker USB device with AX88179A and experienced the same
results.


The patch, below, did produce a cdce interface and it has been working
for a few days
without issue (~100Mb/sec).


Thanks!


On 4/21/22 05:24, Gerhard Roth wrote:
> On Mon, 28 Mar 2022 09:25:32 +0200 Gerhard Roth <gerhard_r...@genua.de> wrote:
>> Hi Stephan,
>>
>> although the newer AX88179A chip set (note the "A" at the end) uses the
>> same product ID as the older AX88179, it is quite different.
>>
>> I will work on support for AX88179A, but that'll take some time.
>>
>> Regards,
>>
>> Gerhard
>>
>>
>> On 3/26/22 22:05, Stephan Mending wrote:
>>> Hi *,
>>> I am currently in the unlucky position having to use two 
>>> usb-to-ethernet-adapters on a router.
>>>
>>> Therefore, I bought a model from "ISY" called "USB-A to Gigabit LAN Adapter 
>>> IAD-1010-A". You probably don't care about
>>> the name of it.
>>>
>>>      axen0 at uhub0 port 12 configuration 1 interface 0 "ASIX AX88179A" rev 
>>> 2.10/2.00 addr 9
>>>      axen0: AX88179, address f8:e4:3b:08:10:e2
>>>      ukphy0 at axen0 phy 3: Generic IEEE 802.3u media interface, rev. 1: 
>>> OUI 0x000700, model 0x0006
>>>
>>> The adapters are configured to act as interfaces for a local network.
>>>
>>> As soon as packets are received following messages are printed to 
>>> /var/log/messages:
>>>
>>>      axen0: invalid buffer(pkt#1), continue
>>>
>>> These messages are issued with each and every packet that is received on 
>>> the interface.
>>>
>>> Taking a look at tcpdump:
>>>
>>>      truncated-ip - 4 bytes missing!<normal dhcp request here>
>>>
>>> This message prefixes every packet that I sent towards the axen usb-adapter 
>>> (not just dhcp).
>>> Same behavior for both of the adapters.
>>>
>>> Do you guys have any idea, what might be the issue?
>>>
>>> Best regards,
>>> Stephan
>>>   
> I got a sample driver from ASIX for the AX88179A chipset and they allow me
> to use it to write a driver but they won't allow me to publish it :(
>
> ASIX recomended to use the CDC/NCM interface of the chipset, but OpenBSD
> has no driver for CDC/NCM. Looking at the USB descriptor it turns out,
> that it also has a configuration for CDC/ECM.
>
> If you try the patch below, the AX88179A should attach via cdce(4). Don't
> know if this is the way to go, but at least you should be able to use
> your adapters.
>
> Good luck,
>
> Gerhard
>
>
> Index: sys/dev/usb/if_cdce.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
> retrieving revision 1.80
> diff -u -p -u -p -r1.80 if_cdce.c
> --- sys/dev/usb/if_cdce.c     29 Jan 2021 17:12:19 -0000      1.80
> +++ sys/dev/usb/if_cdce.c     21 Apr 2022 11:55:15 -0000
> @@ -59,8 +59,11 @@
>  #include <netinet/in.h>
>  #include <netinet/if_ether.h>
>  
> +#include <machine/bus.h>
> +
>  #include <dev/usb/usb.h>
>  #include <dev/usb/usbdi.h>
> +#include <dev/usb/usbdivar.h>
>  #include <dev/usb/usbdi_util.h>
>  #include <dev/usb/usbdevs.h>
>  #include <dev/usb/usbcdc.h>
> @@ -90,18 +93,19 @@ void       cdce_stop(struct cdce_softc *);
>  void  cdce_intr(struct usbd_xfer *, void *, usbd_status);
>  
>  const struct cdce_type cdce_devs[] = {
> -    {{ USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632 }, 0 },
> -    {{ USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2501 }, 0 },
> -    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5500 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_A300 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5600 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C700 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C750 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN }, CDCE_CRC32 },
> -    {{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN2 }, CDCE_CRC32 },
> -    {{ USB_VENDOR_GMATE, USB_PRODUCT_GMATE_YP3X00 }, 0 },
> -    {{ USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX }, 0 },
> -    {{ USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250 }, CDCE_SWAPUNION },
> +    {{ USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632 }, 0, 0, -1 },
> +    {{ USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2501 }, 0, 0, -1 },
> +    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5500 }, 0, CDCE_CRC32, -1 },
> +    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_A300 }, 0, CDCE_CRC32, -1 },
> +    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5600 }, 0, CDCE_CRC32, -1 },
> +    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C700 }, 0, CDCE_CRC32, -1 },
> +    {{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C750 }, 0, CDCE_CRC32, -1 },
> +    {{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN }, 0, CDCE_CRC32, 
> -1 },
> +    {{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN2 }, 0, CDCE_CRC32, 
> -1 },
> +    {{ USB_VENDOR_GMATE, USB_PRODUCT_GMATE_YP3X00 }, 0, 0, -1 },
> +    {{ USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX }, 0, 0, -1 },
> +    {{ USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250 }, 0, CDCE_SWAPUNION, -1 
> },
> +    {{ USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88179 }, 0x0200, CDCE_MATCHREV, 3 
> },
>  };
>  #define cdce_lookup(v, p) \
>      ((const struct cdce_type *)usb_lookup(cdce_devs, v, p))
> @@ -123,6 +127,15 @@ cdce_match(struct device *parent, void *
>  {
>       struct usb_attach_arg *uaa = aux;
>       usb_interface_descriptor_t *id;
> +     const struct cdce_type *type;
> +
> +     if ((type = cdce_lookup(uaa->vendor, uaa->product)) != NULL) {
> +             if (type->cdce_flags & CDCE_MATCHREV) {
> +                     if (type->cdce_rev == uaa->release)
> +                             return (UMATCH_VENDOR_PRODUCT_REV);
> +             } else
> +                     return (UMATCH_VENDOR_PRODUCT);
> +     }
>  
>       if (uaa->iface == NULL)
>               return (UMATCH_NONE);
> @@ -131,9 +144,6 @@ cdce_match(struct device *parent, void *
>       if (id == NULL)
>               return (UMATCH_NONE);
>  
> -     if (cdce_lookup(uaa->vendor, uaa->product) != NULL)
> -             return (UMATCH_VENDOR_PRODUCT);
> -
>       if (id->bInterfaceClass == UICLASS_CDC &&
>           (id->bInterfaceSubClass ==
>           UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL ||
> @@ -150,7 +160,6 @@ cdce_attach(struct device *parent, struc
>       struct usb_attach_arg           *uaa = aux;
>       int                              s;
>       struct ifnet                    *ifp = GET_IFP(sc);
> -     struct usbd_device              *dev = uaa->device;
>       const struct cdce_type          *t;
>       usb_interface_descriptor_t      *id;
>       usb_endpoint_descriptor_t       *ed;
> @@ -163,19 +172,51 @@ cdce_attach(struct device *parent, struc
>       int                              i, j, numalts, len;
>       int                              ctl_ifcno = -1;
>       int                              data_ifcno = -1;
> +     usbd_status                      err;
> +
> +     t = cdce_lookup(uaa->vendor, uaa->product);
> +     if (uaa->configno < 0) {
> +             if (t == NULL || t->cdce_cfgno < 0) {
> +                     printf("%s: unknown configuration for vid/pid match\n",
> +                         sc->cdce_dev.dv_xname);
> +                     return;
> +             }
> +             uaa->configno = t->cdce_cfgno;
> +             DPRINTF(("%s: switching to config #%d\n",
> +                 sc->cdce_dev.dv_xname));
> +             err = usbd_set_config_no(uaa->device, uaa->configno, 1);
> +             if (err) {
> +                     printf("%s: failed to switch to config #%d: %s\n",
> +                         sc->cdce_dev.dv_xname, uaa->configno,
> +                         usbd_errstr(err));
> +                     return;
> +             }
> +             for (i = 0; i <  uaa->device->cdesc->bNumInterfaces; i++) {
> +                     if (usbd_iface_claimed(uaa->device, i))
> +                             continue;
> +                     id = usbd_get_interface_descriptor(
> +                         &uaa->device->ifaces[i]);
> +                     if (id != NULL && id->bInterfaceClass == UICLASS_CDC &&
> +                         id->bInterfaceSubClass ==
> +                         UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL) {
> +                             uaa->iface = &uaa->device->ifaces[i];
> +                             uaa->ifaceno = 
> uaa->iface->idesc->bInterfaceNumber;
> +                             break;
> +                     }
> +             }
> +     }
>  
>       sc->cdce_udev = uaa->device;
>       sc->cdce_ctl_iface = uaa->iface;
>       id = usbd_get_interface_descriptor(sc->cdce_ctl_iface);
>       ctl_ifcno = id->bInterfaceNumber;
>  
> -     t = cdce_lookup(uaa->vendor, uaa->product);
>       if (t)
>               sc->cdce_flags = t->cdce_flags;
>  
>       /* Get the data interface no. and capabilities */
>       ethd = NULL;
> -     usbd_desc_iter_init(dev, &iter);
> +     usbd_desc_iter_init(sc->cdce_udev, &iter);
>       desc = usbd_desc_iter_next(&iter);
>       while (desc) {
>               if (desc->bDescriptorType != UDESC_CS_INTERFACE) {
> @@ -210,12 +251,13 @@ cdce_attach(struct device *parent, struc
>       } else {
>               DPRINTF(("cdce_attach: union interface: ctl=%d, data=%d\n",
>                   ctl_ifcno, data_ifcno));
> -             for (i = 0; i < uaa->nifaces; i++) {
> +             for (i = 0; i < uaa->device->cdesc->bNumInterfaces; i++) {
>                       if (usbd_iface_claimed(sc->cdce_udev, i))
>                               continue;
> -                     id = usbd_get_interface_descriptor(uaa->ifaces[i]);
> +                     id = usbd_get_interface_descriptor(
> +                         &uaa->device->ifaces[i]);
>                       if (id != NULL && id->bInterfaceNumber == data_ifcno) {
> -                             sc->cdce_data_iface = uaa->ifaces[i];
> +                             sc->cdce_data_iface = &uaa->device->ifaces[i];
>                               usbd_claim_iface(sc->cdce_udev, i);
>                       }
>               }
> @@ -303,8 +345,8 @@ cdce_attach(struct device *parent, struc
>  found:
>       s = splnet();
>  
> -     if (!ethd || usbd_get_string_desc(sc->cdce_udev, ethd->iMacAddress, 0,
> -         &eaddr_str, &len)) {
> +     if (!ethd || usbd_get_string_desc(sc->cdce_udev, ethd->iMacAddress,
> +         sc->cdce_udev->langid, &eaddr_str, &len)) {
>               ether_fakeaddr(ifp);
>       } else {
>               for (i = 0; i < ETHER_ADDR_LEN * 2; i++) {
> Index: sys/dev/usb/if_cdcereg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_cdcereg.h,v
> retrieving revision 1.7
> diff -u -p -u -p -r1.7 if_cdcereg.h
> --- sys/dev/usb/if_cdcereg.h  12 Oct 2016 21:51:11 -0000      1.7
> +++ sys/dev/usb/if_cdcereg.h  21 Apr 2022 11:25:14 -0000
> @@ -40,9 +40,12 @@
>  
>  struct cdce_type {
>       struct usb_devno         cdce_dev;
> +     u_int16_t                cdce_rev;
>       u_int16_t                cdce_flags;
>  #define CDCE_CRC32   1
>  #define CDCE_SWAPUNION       2
> +#define CDCE_MATCHREV        4
> +     int                      cdce_cfgno;
>  };
>  
>  struct cdce_softc;

Reply via email to