Realtek RTL8152 driver attempt

Hans Petter Selasky hps at selasky.org
Thu Feb 5 08:58:56 UTC 2015


On 02/05/15 09:17, Rick van der Zwet wrote:
> Hi Folks,
>
> I have been trying to write a FreeBSD driver (if_rtl) for the Realtek
> RTL8152 chipset, which is a USB to Ethernet dongle (using the Sitecom
> LN-030 v3).
>
> Some more details on the device:
> [root at vbsd101 /usr/src]# usbconfig  -d ugen1.2 dump_device_desc
> ugen1.2: <USB 10100 LAN Realtek> at usbus1, cfg=0 md=HOST spd=HIGH
> (480Mbps) pwr=ON (100mA)
>
>    bLength = 0x0012
>    bDescriptorType = 0x0001
>    bcdUSB = 0x0210
>    bDeviceClass = 0x0000
>    bDeviceSubClass = 0x0000
>    bDeviceProtocol = 0x0000
>    bMaxPacketSize0 = 0x0040
>    idVendor = 0x0bda
>    idProduct = 0x8152
>    bcdDevice = 0x2000
>    iManufacturer = 0x0001  <Realtek>
>    iProduct = 0x0002  <USB 10/100 LAN>
>    iSerialNumber = 0x0003  <64D1A3318180>
>    bNumConfigurations = 0x0002
>
>
>
> [root at vbsd101 /usr/src]# usbconfig  -d ugen1.2 dump_all_config_desc
> ugen1.2: <USB 10100 LAN Realtek> at usbus1, cfg=0 md=HOST spd=HIGH
> (480Mbps) pwr=ON (100mA)
>
>
>   Configuration index 0
>
>      bLength = 0x0009
>      bDescriptorType = 0x0002
>      wTotalLength = 0x0027
>      bNumInterfaces = 0x0001
>      bConfigurationValue = 0x0001
>      iConfiguration = 0x0000  <no string>
>      bmAttributes = 0x00a0
>      bMaxPower = 0x0032
>
>      Interface 0
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0000
>        bAlternateSetting = 0x0000
>        bNumEndpoints = 0x0003
>        bInterfaceClass = 0x00ff
>        bInterfaceSubClass = 0x00ff
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
>
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0002  <BULK>
>          wMaxPacketSize = 0x0200
>          bInterval = 0x0000
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>       Endpoint 1
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0002  <OUT>
>          bmAttributes = 0x0002  <BULK>
>          wMaxPacketSize = 0x0200
>          bInterval = 0x0000
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>       Endpoint 2
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0083  <IN>
>          bmAttributes = 0x0003  <INTERRUPT>
>          wMaxPacketSize = 0x0002
>          bInterval = 0x0008
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>
>
>   Configuration index 1
>
>      bLength = 0x0009
>      bDescriptorType = 0x0002
>      wTotalLength = 0x0050
>      bNumInterfaces = 0x0002
>      bConfigurationValue = 0x0002
>      iConfiguration = 0x0000  <no string>
>      bmAttributes = 0x00a0
>      bMaxPower = 0x0032
>
>      Interface 0
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0000
>        bAlternateSetting = 0x0000
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x0002
>        bInterfaceSubClass = 0x0006
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0005  <CDC Communications Control>
>
>        Additional Descriptor
>
>        bLength = 0x05
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x00
>         RAW dump:
>         0x00 | 0x05, 0x24, 0x00, 0x10, 0x01
>
>
>        Additional Descriptor
>
>        bLength = 0x05
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x06
>         RAW dump:
>         0x00 | 0x05, 0x24, 0x06, 0x00, 0x01
>
>
>        Additional Descriptor
>
>        bLength = 0x0d
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x0f
>         RAW dump:
>         0x00 | 0x0d, 0x24, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00,
>         0x08 | 0xea, 0x05, 0x00, 0x00, 0x00
>
>
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0083  <IN>
>          bmAttributes = 0x0003  <INTERRUPT>
>          wMaxPacketSize = 0x0010
>          bInterval = 0x0008
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>
>      Interface 1
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0000
>        bNumEndpoints = 0x0000
>        bInterfaceClass = 0x000a
>        bInterfaceSubClass = 0x0000
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
>
>
>      Interface 1 Alt 1
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0001
>        bNumEndpoints = 0x0002
>        bInterfaceClass = 0x000a
>        bInterfaceSubClass = 0x0000
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0004  <Ethernet Data>
>
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0002  <BULK>
>          wMaxPacketSize = 0x0200
>          bInterval = 0x0000
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>       Endpoint 1
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0002  <OUT>
>          bmAttributes = 0x0002  <BULK>
>          wMaxPacketSize = 0x0200
>          bInterval = 0x0000
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
>
>
> Unfortunately there is no datasheet available, I quote ``` Due to
> company policy, we only release Datasheet to our ODM/OEM (which have
> signed a company to company NDA with Realtek). Please follow the linux
> source code for porting, thanks.''' so I am stuck with 'reverse'
> engineering and best guessing.
>
>
> When looking at the usb trace on Linux with wireshark
> (https://rickvanderzwet.nl/svn/personal/freebsd-rtl-driver/linux-trace.pcapng.gz)
> I see a "CDC" like packets passing by, the description of the chipset
> also hints something in this way: "Supports CDC-ECM".
>
>
> [root at vbsd101 /usr/src]# usbconfig -d ugen1.2 set_config 1
>
> [root at vbsd101 /usr/src]# tail -4 /var/log/messages
> Feb  5 08:58:12 vbsd101 kernel: cdce0: <CDC Communications Control> on
> usbus1
> Feb  5 08:58:12 vbsd101 kernel: ue0: <USB Ethernet> on cdce0
> Feb  5 08:58:12 vbsd101 kernel: ue0: Ethernet address: 64:d1:a3:31:81:80
> Feb  5 08:58:12 vbsd101 devd: Executing '/etc/pccard_ether ue0 start'
>
> [root at vbsd101 /usr/src]# ifconfig ue0
> ue0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
>      ether 64:d1:a3:31:81:80
>      inet 192.168.5.200 netmask 0xffffff00 broadcast 192.168.5.255
>      nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
>
> How-ever there is no traffic possible and also no bulk requests are done.
>
>
>
> Looking at the if_rue(4) and the linux r8152.c code, basically I got
> this far in porting but yet no working code:
>      https://rickvanderzwet.nl/svn/personal/freebsd-rtl-driver/
>
> There are no bulk out and in packets passing trough, so I am basically
> stuck now, not knowing how-to continue this journey. Could anybody give
> me an hint on how-to get this train going again?
>
> Thanks in advance!
> /Rick

Hi Rick,

I think this hardware is compatible to if_cdce, but you need to 
implement some vendor specific codes to handle the PHY/MIIBUS. That is 
what makes it a bit difficult.

--HPS



More information about the freebsd-usb mailing list