wcn36xx

wcn36xx is a mac80211 driver for wcn3660 and wcn3680 chips found from Qualcomm SoC.

Caveats

Currently wcn36xx only compiles with msm kernels and backports infrastructure is needed to get latest cfg80211 and mac80211.

Supported chips

wcn36xx supports both WCN3660 and WCN3680 chips.

Available devices

wcn36xx was tested on Google Nexus 4(Mako), Sony Xperia - T(Mint), Z(Yuga), ZR(Dogo) and Z1(Honami). Basically, wcn36xx can support all MSM based devices.

Features

As a general rule for this section, don't list every tiny detail, just the most important things one should know about.

Working

list wireless features that your driver supports, e.g. station mode, access point mode etc

  • 11b, 11g, 11n, 11a
  • HW rate control
  • hardware encryption(TKIP, CCMP, WEP)
  • HW connection monitoring
  • aggregation (Immediate BA only)
  • ProbeResponse offloading

  • Beacon filtering
  • Multicast filtering
  • WoW
  • power save
  • AP mode support
  • Ad-Hoc
  • 11s mesh

Not working (yet)

list features that could be supported but are not yet

  • ARP offloading
  • 80211AC
  • P2P
  • Miracast
  • Bluetooth coexistence
  • WAPI
  • WMM
  • CQM
  • DFS
  • Recovery(In case of chip hanging, wcn36xx must restart it)

Not supported

  • list important features that the device will not support

Sources

wcn36xx is part of the mainline kernel. The latest developement version can be found on github:

https://github.com/KrasnikovEugene/wcn36xx

Device firmware

The latest greatest firmware can be found on here https://www.codeaurora.org/cgit/external/hisense/platform/vendor/qcom-opensource/wlan/prima/tree/firmware_bin?h=8130_CS

wcn36xx loads WCNSS_qcom_wlan_nv.bin file and sends it to the hardware.

Support

Mailing list:

http://lists.infradead.org/mailman/listinfo/wcn36xx

There's an IRC channel #wcn36xx at Freenode.

Bug tracker:

https://github.com/KrasnikovEugene/wcn36xx/issues

Dissector

If you are hacking on wcn36xx and want to see see what Qualcomm's prima driver (or wcn36xx) sends to and from fw, check out the wcn36xx-dissector. It allows you to view all commands and data in wireshark. It understands most commands and buffer structures.

https://github.com/kanstrup/wcn36xx-dissector

Compilation

Go to working directory

Change to a directory where you'll keep your git repositories like ~/git/

Checkout backports

git clone git://github.com/hauke/backports.git

Checkout linux-next

git clone --no-checkout git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

The –no-checkout is there to save space since backports will pickout the relevant stuff anyway.

Checkout wcn36xx

git clone git://github.com/KrasnikovEugene/wcn36xx.git

Checkout wcn36xx from upstream or your own branch

Generate a build tree

Make sure you have "coccinelle" installed otherwise gentree will fail. Create a file named copy-list.wcn36xx in the backports folder containing:

wcn36xx/ -> drivers/net/wireless/ath/wcn36xx/

Do a git log, find the first commit that says something like: "refresh on next-20131122". Then execute the command:

cd backports
./gentree.py --verbose --clean --git-revision next-20131122 --extra-driver ../ copy-list.wcn36xx ../linux-next/ ../backport-wcn

This command will create the folder ../backport-wcn where it will put all the necessary linux stuff from linux-next. It will also apply a number of patches, if any of these fail you must sort it out otherwise the build folder will not be ready.

Time to build

cd ../backport-wcn

Symlink the wcn36xx-folder into the backport-wcn-folder:

ln -s ~/git/wcn36xx drivers/net/wireless/ath/wcn36xx

This sets up some links to your cm build:

export CM_BUILD=mako
export CM_ROOT=~/mako/cm-10.1

This executes the defconfig for the environment:

make KLIB=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
KLIB_BUILD=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
ARCH=arm \
CROSS_COMPILE=$CM_ROOT/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- \
defconfig-wcn36xx

Builds the module and all necessary compat/cfg80211/mac80211 modules as well:

make KLIB=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
KLIB_BUILD=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
ARCH=arm \
CROSS_COMPILE=$CM_ROOT/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-

Build platform driver wcn36xx_msm

cd drivers/net/wireless/ath/wcn36xx/wcn36xx_msm/
make KLIB=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
KLIB_BUILD=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
ARCH=arm \
CROSS_COMPILE=$CM_ROOT/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-

NOTES FOR OSX

To make this run on OSX (Mountain Lion) I had to do some changes. 1) The make commands shall not use the same path for the CROSS_COMPILE option. "linux-x86" must be replaced with "darwin-x86".

2) The Makefile in backport-wcn must be modified.

  • The comment on line 101 looking like this:
    • # RHEL as well, sadly we need to grep for it ;\
      • It must be remove or else you will get a bash error.

3) You must modify the kconf/Makefile

  • To the first line in this file (beginning with CFLAGS) add -DKBUILD_NO_NLS to the end. Otherwise you will get a lkc.h error when building.

Installation

Mako on CM 10.1

1) Compile CyanogenMod as per instructions: http://wiki.cyanogenmod.org/w/Build_for_mako Be sure to checkout CM10.1:

repo init -u git://github.com/CyanogenMod/android.git -b cm-10.1

2) From your CM_ROOT-folder configure the CM Kernel:

make  -C kernel/lge/mako \
O=$CM_ROOT/out/target/product/$CM_BUILD/obj/KERNEL_OBJ \
INSTALL_MOD_PATH=../../system \
ARCH=arm \
CROSS_COMPILE="$CM_ROOT/prebuilts/misc/linux-x86/ccache/ccache $CM_ROOT/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-" \
menuconfig
  • Enable loadable module support and all sub-menu entries.
  • Enable CCM support under Cryptographic API.
  • Disable cfg80211 - wireless configuration API under Networking support -> Wireless.

  • Disable PRIMA-WLAN under Device drivers -> Staging drivers -> Qualcomm Atheros Prima WLAN module

3) Replace mako_defconfig with the new .config:

cp out/target/product/mako/obj/KERNEL_OBJ/.config \
kernel/lge/mako/arch/arm/configs/mako_defconfig

4) Create new file device/lge/mako/init.mako.wcn36xx.sh:

#!/system/bin/sh /system/bin/insmod /system/lib/modules/wcn36xx_msm.ko /system/bin/insmod /system/lib/modules/compat.ko /system/bin/insmod /system/lib/modules/cfg80211.ko /system/bin/insmod /system/lib/modules/mac80211.ko /system/bin/insmod /system/lib/modules/wcn36xx.ko  5) Edit device/lge/mako/device.mk and add init.mako.wcn36xx.sh to PRODUCT_COPY_FILES:

PRODUCT_COPY_FILES += \
        device/lge/mako/init.mako.bt.sh:system/etc/init.mako.bt.sh \
        device/lge/mako/init.mako.wcn36xx.sh:system/etc/init.mako.wcn36xx.sh

6) Edit device/lge/mako/init.mako.rc and comment out section 'service p2p_supplicant'. Then copy 'service wpa_supplicant' and rename that to 'service p2p_supplicant'.

7) Add to the end of device/lge/mako/init.mako.rc:

service wcn36xx /system/bin/sh /system/etc/init.mako.wcn36xx.sh
    class main
    user root
    oneshot

8) Compile new images and flash them according to CyanogenMod instructions.

9) Compile wcn36xx as per instructions above.

10) Install kernel modules to the device:

adb root
adb remount

cd ../backports-output
adb push compat/compat.ko /system/lib/modules/
adb push net/wireless/cfg80211.ko /system/lib/modules/
adb push net/mac80211/mac80211.ko /system/lib/modules/
adb push drivers/net/wireless/ath/wcn36xx/wcn36xx.ko /system/lib/modules/
adb push drivers/net/wireless/ath/wcn36xx/wcn36xx_msm/wcn36xx_msm.ko /system/lib/modules/

11) Reboot the device and now you should be able to use wcn36xx from GUI.

Mint on CM 10.1

  1. Follow instructions (http://wiki.cyanogenmod.org/w/Build_for_mint) do download and build CM sources.

  2. In case of build error "No such file or directory: 'vendor/sony/blue-common/proprietary/boot/RPM.bin'" download file RPM.bin from https://github.com/TheMuppets/proprietary_vendor_sony and put it to the folder 'vendor/sony/blue-common/proprietary/boot'

  3. Flash built image to the phone as described here http://www.xperiablog.net/2012/12/04/how-to-install-cyanogenmod-10-on-your-sony-xperia-t-guide/