Realtek RTL8152 driver attempt

Kevin Lo kevlo at FreeBSD.org
Thu Feb 5 15:34:41 UTC 2015


On Thu, Feb 05, 2015 at 09:17:40AM +0100, Rick van der Zwet wrote:
> 
> Hi Folks,

Hi Rick,

> 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).

What a coincidence.  I've been slowly working on porting r8152 driver from
Linux to FreeBSD since last month.

> 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.

I contacted with a Linux driver maintainer and asked if he could 
provide me the data sheet of RTL8152, not surprisingly, he couldn't
send me a copy, but he would try to answer my questions.

> 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?

Mine basically is working but needs serious cleanup and bug fixes.
http://people.freebsd.org/~kevlo/ure.diff

Please let me know if it works for you, thanks.

> Thanks in advance!
> /Rick

	Kevin


More information about the freebsd-usb mailing list