Rt3070usb
Jump to navigation
Jump to search
Intro
This page explains how to get the rt3070usb (aka rt3070sta) linux driver working in openembedded for the overo on Lisa.
Background
I have an edimax usb wifi stick I needed to get working with Lisa. It's USB id is 7392:7711. Initial search seemed to show the rt2870usb driver was the one to use, and I guess at one time that might have been the case for the chip in this stick. But rt3070usb is now the one to use.
There's a recipe for the rt3070 driver in openembedded (which I'm pulling from : ). It doesn't compile for me for two reasons :
- 1. My linux kernel has real-time patches so the init_MUTEX() in the driver source can't be found
- 2. Some sort of device structure change has occurred in the kernel since who knows when
The fixes are:
- 1. replace init_MUTEX(blah) with sema_init(blah,1)
- 2. Apply patch from http://lists.rpmfusion.org/pipermail/rpmfusion-commits/2009-August/005943.html (copied below just in case)
Configuration
- insmod rt3070sta.ko
- at this point iwconfig shows an ra0 interface
- ifconfig ra0 up
- iwconfig ra0 essid ap_h16
wpa_supplicant
As usual, the wpa key goes in /etc/wpa_supplicant.conf and started wpa_supplicant with
- wpa_supplicant -ira0 -c/etc/wpa_supplicant.conf &
DHCP
- dhclient ra0
Console output
root@overo:/home/paul# iwconfig ra0 ra0 RT2870 Wireless ESSID:"ap_h16" Nickname:"RT2870STA" Mode:Managed Frequency=2.412 GHz Access Point: 00:25:4B:06:E3:9F Bit Rate=65 Mb/s RTS thr:off Fragment thr:off Encryption key:447F-01CB-C235-6BF1-0F8C-0E61-5C88-EEEA Link Quality=100/100 Signal level:-39 dBm Noise level:-83 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 root@overo:/home/paul# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 7392:7711 root@overo:/home/paul# ping bill PING bill.recherche.enac.fr (10.31.4.5) 56(84) bytes of data. 64 bytes from bill.recherche.enac.fr (10.31.4.5): icmp_seq=1 ttl=64 time=367 ms ^C --- bill.recherche.enac.fr ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 367.279/367.279/367.279/0.000 ms root@overo:/home/paul# WPA: Group rekeying completed with 00:25:4b:06:e3:9f [GTK=TKIP]
Patch
diff -rupN 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/include/rtmp_os.h 2009_0525_RT3070_Linux_STA_v2.1.1.0/include/rtmp_os.h --- 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/include/rtmp_os.h 2009-05-20 23:33:56.000000000 -0400 +++ 2009_0525_RT3070_Linux_STA_v2.1.1.0/include/rtmp_os.h 2009-08-04 00:00:46.000000000 -0400 @@ -53,6 +53,7 @@ */ typedef struct _RTMP_OS_NETDEV_OP_HOOK_ { + /* void *open; void *stop; void *xmit; @@ -63,6 +64,8 @@ typedef struct _RTMP_OS_NETDEV_OP_HOOK_ unsigned char devAddr[6]; unsigned char devName[16]; unsigned char needProtcted; + */ + struct net_device_ops *netdev_ops; }RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK; diff -rupN 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/os/linux/rt_linux.c 2009_0525_RT3070_Linux_STA_v2.1.1.0/os/linux/rt_linux.c --- 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/os/linux/rt_linux.c 2009-05-20 23:33:56.000000000 -0400 +++ 2009_0525_RT3070_Linux_STA_v2.1.1.0/os/linux/rt_linux.c 2009-08-04 00:04:15.000000000 -0400 @@ -1506,20 +1506,21 @@ int RtmpOSNetDevAttach( if (pDevOpHook) { PRTMP_ADAPTER pAd = RTMP_OS_NETDEV_GET_PRIV(pNetDev); - + pNetDev->netdev_ops = pDevOpHook->netdev_ops; + /* pNetDev->open = pDevOpHook->open; pNetDev->stop = pDevOpHook->stop; pNetDev->hard_start_xmit = (HARD_START_XMIT_FUNC)(pDevOpHook->xmit); pNetDev->do_ioctl = pDevOpHook->ioctl; - + */ /* if you don't implement get_stats, just leave the callback function as NULL, a dummy function will make kernel panic. */ - if (pDevOpHook->get_stats) + /*if (pDevOpHook->get_stats) pNetDev->get_stats = pDevOpHook->get_stats; - + */ /* OS specific flags, here we used to indicate if we are virtual interface */ - pNetDev->priv_flags = pDevOpHook->priv_flags; + // pNetDev->priv_flags = pDevOpHook->priv_flags; #if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) pNetDev->get_wireless_stats = rt28xx_get_wireless_stats; @@ -1544,15 +1545,15 @@ int RtmpOSNetDevAttach( #endif // CONFIG_APSTA_MIXED_SUPPORT // // copy the net device mac address to the net_device structure. - NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN); + // NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN); - rtnl_locked = pDevOpHook->needProtcted; + // rtnl_locked = pDevOpHook->needProtcted; } - + /* #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) pNetDev->validate_addr = NULL; #endif - + */ if (rtnl_locked) ret = register_netdevice(pNetDev); else diff -rupN 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/os/linux/rt_main_dev.c 2009_0525_RT3070_Linux_STA_v2.1.1.0/os/linux/rt_main_dev.c --- 2009_0525_RT3070_Linux_STA_v2.1.1.0.old/os/linux/rt_main_dev.c 2009-05-20 23:33:56.000000000 -0400 +++ 2009_0525_RT3070_Linux_STA_v2.1.1.0/os/linux/rt_main_dev.c 2009-08-04 00:06:08.000000000 -0400 @@ -504,6 +504,21 @@ err: return (-1); } /* End of rt28xx_open */ +static const struct net_device_ops rt2870_netdev_ops = { + .ndo_open = MainVirtualIF_open,// + .ndo_stop = MainVirtualIF_close,// + .ndo_do_ioctl = rt28xx_ioctl,// + .ndo_get_stats = RT28xx_get_ether_stats,// + .ndo_validate_addr = NULL, + .ndo_set_mac_address = eth_mac_addr, + .ndo_change_mtu = eth_change_mtu, +#ifdef IKANOS_VX_1X0 + .ndo_start_xmit = IKANOS_DataFramesTx,// +#else + .ndo_start_xmit = rt28xx_send_packets,// +#endif +}; + PNET_DEV RtmpPhyNetDevInit( IN RTMP_ADAPTER *pAd, @@ -520,6 +535,8 @@ PNET_DEV RtmpPhyNetDevInit( } NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); + pNetDevHook->netdev_ops = &rt2870_netdev_ops; + /* pNetDevHook->open = MainVirtualIF_open; pNetDevHook->stop = MainVirtualIF_close; pNetDevHook->xmit = rt28xx_send_packets; @@ -531,7 +548,7 @@ PNET_DEV RtmpPhyNetDevInit( pNetDevHook->get_stats = RT28xx_get_ether_stats; pNetDevHook->needProtcted = FALSE; - + */ RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); //net_dev->priv = (PVOID)pAd; pAd->net_dev = net_dev;