===== 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|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|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|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|http://lists.infradead.org/mailman/listinfo/wcn36xx]]
There's an IRC channel #wcn36xx at Freenode.
Bug tracker:
[[https://github.com/KrasnikovEugene/wcn36xx/issues|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|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|CyanogenMod]] as per instructions: [[http://wiki.cyanogenmod.org/w/Build_for_mako|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|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 ====
* * - Follow instructions ([[http://wiki.cyanogenmod.org/w/Build_for_mint|http://wiki.cyanogenmod.org/w/Build_for_mint]]) do download and build CM sources.
* * - 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|https://github.com/TheMuppets/proprietary_vendor_sony]] and put it to the folder 'vendor/sony/blue-common/proprietary/boot'
* * - 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/|http://www.xperiablog.net/2012/12/04/how-to-install-cyanogenmod-10-on-your-sony-xperia-t-guide/]]