diff options
author | codeworkx <codeworkx@cyanogenmod.com> | 2012-10-19 19:14:29 +0200 |
---|---|---|
committer | codeworkx <codeworkx@cyanogenmod.com> | 2012-10-19 19:31:14 +0200 |
commit | 400f867149041da36a769e5a22415231dcbd7fff (patch) | |
tree | 23902b39ae058bddb21217f5169887d137f092f8 | |
parent | 95661c37c0cfde204ea56c63f97b6bb9c5244625 (diff) | |
download | kernel_samsung_smdk4412-400f867149041da36a769e5a22415231dcbd7fff.zip kernel_samsung_smdk4412-400f867149041da36a769e5a22415231dcbd7fff.tar.gz kernel_samsung_smdk4412-400f867149041da36a769e5a22415231dcbd7fff.tar.bz2 |
bcmdhd: restore state from edd8a9171858fad7713b8fc07b158df5114b3c1a (samsung update 4)
Change-Id: I5f216c0b67ce9a956d2af26f58fa0744cdc1d7f5
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/Kconfig | 63 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/Makefile | 246 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/bcmspibrcm.c | 1851 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/bcmwifi_rates.h | 306 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/include/Makefile | 53 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/bcmdevs.h | 495 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/bcmspibrcm.h | 168 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h | 607 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h | 900 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/dbus.h | 571 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/epivers.h | 56 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/proto/802.11.h | 2254 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/proto/bcmevent.h | 342 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h | 104 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/proto/p2p.h | 564 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/sbhnddma.h | 370 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/include/spid.h | 165 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh.c (renamed from drivers/net/wireless/bcmdhd/bcmsdh.c) | 81 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_linux.c (renamed from drivers/net/wireless/bcmdhd/bcmsdh_linux.c) | 120 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc.c (renamed from drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c) | 72 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc_linux.c (renamed from drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c) | 83 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd.h (renamed from drivers/net/wireless/bcmdhd/dhd.h) | 170 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.c (renamed from drivers/net/wireless/bcmdhd/dhd_bta.c) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.h (renamed from drivers/net/wireless/bcmdhd/dhd_bta.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bus.h (renamed from drivers/net/wireless/bcmdhd/dhd_bus.h) | 14 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cdc.c (renamed from drivers/net/wireless/bcmdhd/dhd_cdc.c) | 139 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.c (renamed from drivers/net/wireless/bcmdhd/dhd_cfg80211.c) | 79 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.h (renamed from drivers/net/wireless/bcmdhd/dhd_cfg80211.h) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_common.c (renamed from drivers/net/wireless/bcmdhd/dhd_common.c) | 137 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_gpio.c (renamed from drivers/net/wireless/bcmdhd/dhd_custom_gpio.c) | 145 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_sec.c (renamed from drivers/net/wireless/bcmdhd/dhd_custom_sec.c) | 388 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_dbg.h (renamed from drivers/net/wireless/bcmdhd/dhd_dbg.h) | 35 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux.c (renamed from drivers/net/wireless/bcmdhd/dhd_linux.c) | 1700 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux_sched.c (renamed from drivers/net/wireless/bcmdhd/dhd_linux_sched.c) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_proto.h (renamed from drivers/net/wireless/bcmdhd/dhd_proto.h) | 14 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sdio.c (renamed from drivers/net/wireless/bcmdhd/dhd_sdio.c) | 1253 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sec_feature.h (renamed from drivers/net/wireless/bcmdhd/dhd_sec_feature.h) | 17 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_wlfc.h (renamed from drivers/net/wireless/bcmdhd/dhd_wlfc.h) | 18 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dongle/dngl_stats.h (renamed from drivers/net/wireless/bcmdhd/dngl_stats.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/dongle/dngl_wlhdr.h (renamed from drivers/net/wireless/bcmdhd/dngl_wlhdr.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/aidmp.h (renamed from drivers/net/wireless/bcmdhd/include/aidmp.h) | 186 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcm_cfg.h (renamed from drivers/net/wireless/bcmdhd/include/bcm_cfg.h) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcm_mpool_pub.h (renamed from drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmcdc.h (renamed from drivers/net/wireless/bcmdhd/include/bcmcdc.h) | 77 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmdefs.h (renamed from drivers/net/wireless/bcmdhd/include/bcmdefs.h) | 88 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/include/bcmdevs.h | 481 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmendian.h (renamed from drivers/net/wireless/bcmdhd/include/bcmendian.h) | 16 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmnvram.h (renamed from drivers/net/wireless/bcmdhd/include/bcmnvram.h) | 67 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmpcispi.h (renamed from drivers/net/wireless/bcmdhd/include/bcmpcispi.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmperf.h (renamed from drivers/net/wireless/bcmdhd/include/bcmperf.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdbus.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdbus.h) | 39 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdh.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdh.h) | 23 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdh_sdmmc.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h) | 32 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdpcm.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdpcm.h) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdspi.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdspi.h) | 52 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmsdstd.h (renamed from drivers/net/wireless/bcmdhd/include/bcmsdstd.h) | 105 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmspi.h (renamed from drivers/net/wireless/bcmdhd/include/bcmspi.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/bcmutils.h (renamed from drivers/net/wireless/bcmdhd/include/bcmutils.h) | 329 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/dhdioctl.h (renamed from drivers/net/wireless/bcmdhd/include/dhdioctl.h) | 15 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/include/epivers.h | 48 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/hndpmu.h (renamed from drivers/net/wireless/bcmdhd/include/hndpmu.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/hndrte_armtrap.h (renamed from drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/hndrte_cons.h (renamed from drivers/net/wireless/bcmdhd/include/hndrte_cons.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/hndsoc.h (renamed from drivers/net/wireless/bcmdhd/include/hndsoc.h) | 26 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/linux_osl.h (renamed from drivers/net/wireless/bcmdhd/include/linux_osl.h) | 121 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/linuxver.h (renamed from drivers/net/wireless/bcmdhd/include/linuxver.h) | 118 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/miniopt.h (renamed from drivers/net/wireless/bcmdhd/include/miniopt.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/msgtrace.h (renamed from drivers/net/wireless/bcmdhd/include/msgtrace.h) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/osl.h (renamed from drivers/net/wireless/bcmdhd/include/osl.h) | 35 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/packed_section_end.h (renamed from drivers/net/wireless/bcmdhd/include/packed_section_end.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/packed_section_start.h (renamed from drivers/net/wireless/bcmdhd/include/packed_section_start.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/pcicfg.h (renamed from drivers/net/wireless/bcmdhd/include/pcicfg.h) | 62 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/src/include/proto/802.11.h | 2240 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/src/include/proto/802.11_bta.h (renamed from drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h) | 8 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/src/include/proto/802.11e.h (renamed from drivers/net/wireless/bcmdhd/include/proto/802.11e.h) | 14 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/src/include/proto/802.1d.h (renamed from drivers/net/wireless/bcmdhd/include/proto/802.1d.h) | 30 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/bcmeth.h (renamed from drivers/net/wireless/bcmdhd/include/proto/bcmeth.h) | 18 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/include/proto/bcmevent.h | 311 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/bcmip.h (renamed from drivers/net/wireless/bcmdhd/include/proto/bcmip.h) | 112 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/bt_amp_hci.h (renamed from drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/eapol.h (renamed from drivers/net/wireless/bcmdhd/include/proto/eapol.h) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/ethernet.h (renamed from drivers/net/wireless/bcmdhd/include/proto/ethernet.h) | 50 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/include/proto/p2p.h | 564 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/sdspi.h (renamed from drivers/net/wireless/bcmdhd/include/proto/sdspi.h) | 42 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/vlan.h (renamed from drivers/net/wireless/bcmdhd/include/proto/vlan.h) | 26 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/wpa.h (renamed from drivers/net/wireless/bcmdhd/include/proto/wpa.h) | 104 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/proto/wps.h (renamed from drivers/net/wireless/bcmdhd/include/proto/wps.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbchipc.h (renamed from drivers/net/wireless/bcmdhd/include/sbchipc.h) | 1513 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbconfig.h (renamed from drivers/net/wireless/bcmdhd/include/sbconfig.h) | 232 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/include/sbhnddma.h | 370 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbpcmcia.h (renamed from drivers/net/wireless/bcmdhd/include/sbpcmcia.h) | 22 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbsdio.h (renamed from drivers/net/wireless/bcmdhd/include/sbsdio.h) | 22 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbsdpcmdev.h (renamed from drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h) | 12 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sbsocram.h (renamed from drivers/net/wireless/bcmdhd/include/sbsocram.h) | 40 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sdio.h (renamed from drivers/net/wireless/bcmdhd/include/sdio.h) | 14 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sdioh.h (renamed from drivers/net/wireless/bcmdhd/include/sdioh.h) | 94 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/sdiovar.h (renamed from drivers/net/wireless/bcmdhd/include/sdiovar.h) | 31 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/siutils.h (renamed from drivers/net/wireless/bcmdhd/include/siutils.h) | 108 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/trxhdr.h (renamed from drivers/net/wireless/bcmdhd/include/trxhdr.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/typedefs.h (renamed from drivers/net/wireless/bcmdhd/include/typedefs.h) | 54 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/wlfc_proto.h (renamed from drivers/net/wireless/bcmdhd/include/wlfc_proto.h) | 50 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/include/wlioctl.h (renamed from drivers/net/wireless/bcmdhd/include/wlioctl.h) | 596 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/aiutils.c (renamed from drivers/net/wireless/bcmdhd/aiutils.c) | 105 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/bcmevent.c (renamed from drivers/net/wireless/bcmdhd/bcmevent.c) | 29 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/bcmutils.c (renamed from drivers/net/wireless/bcmdhd/bcmutils.c) | 40 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/hndpmu.c (renamed from drivers/net/wireless/bcmdhd/hndpmu.c) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/linux_osl.c (renamed from drivers/net/wireless/bcmdhd/linux_osl.c) | 344 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/sbutils.c (renamed from drivers/net/wireless/bcmdhd/sbutils.c) | 10 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/siutils.c (renamed from drivers/net/wireless/bcmdhd/siutils.c) | 152 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/shared/siutils_priv.h (renamed from drivers/net/wireless/bcmdhd/siutils_priv.h) | 12 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/bcmwifi/include/bcmwifi_channels.h (renamed from drivers/net/wireless/bcmdhd/bcmwifi_channels.h) | 87 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/bcmwifi/src/bcmwifi_channels.c (renamed from drivers/net/wireless/bcmdhd/bcmwifi_channels.c) | 227 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/uamp_api.h (renamed from drivers/net/wireless/bcmdhd/uamp_api.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.c (renamed from drivers/net/wireless/bcmdhd/wl_android.c) | 1141 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.h (renamed from drivers/net/wireless/bcmdhd/wl_android.h) | 8 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.c (renamed from drivers/net/wireless/bcmdhd/wl_cfg80211.c) | 4149 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.h (renamed from drivers/net/wireless/bcmdhd/wl_cfg80211.h) | 273 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.c (renamed from drivers/net/wireless/bcmdhd/wl_cfgp2p.c) | 677 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.h (renamed from drivers/net/wireless/bcmdhd/wl_cfgp2p.h) | 87 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_dbg.h (renamed from drivers/net/wireless/bcmdhd/wl_dbg.h) | 12 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.c (renamed from drivers/net/wireless/bcmdhd/wl_iw.c) | 625 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.h (renamed from drivers/net/wireless/bcmdhd/wl_iw.h) | 61 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wl_linux_mon.c (renamed from drivers/net/wireless/bcmdhd/wl_linux_mon.c) | 25 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/src/wl/sys/wl_roam.c | 124 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.c (renamed from drivers/net/wireless/bcmdhd/wldev_common.c) | 60 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.h (renamed from drivers/net/wireless/bcmdhd/wldev_common.h) | 14 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/wl_roam.c | 288 |
127 files changed, 10976 insertions, 19963 deletions
diff --git a/drivers/net/wireless/bcmdhd/Kconfig b/drivers/net/wireless/bcmdhd/Kconfig index 2f801f2..2ec5aa8 100755..100644 --- a/drivers/net/wireless/bcmdhd/Kconfig +++ b/drivers/net/wireless/bcmdhd/Kconfig @@ -1,65 +1,32 @@ -config BCM4330 - tristate "Broadcom 4330 wireless cards support" - depends on WLAN - ---help--- - This module adds support for wireless adapters based on - Broadcom 4330 chipset. config BCM4334 - tristate "Broadcom 4334 wireless cards support" - depends on WLAN - ---help--- - This module adds support for wireless adapters based on - Broadcom 4334 chipset. - -config BCM43241 - tristate "Broadcom 43241 wireless cards support" + tristate "---Broadcom WiFi Driver for 4334" depends on WLAN ---help--- - This module adds support for wireless adapters based on - Broadcom 43241 chipset. + Select this option to build Broadcom wlan driver -config BCMDHD_FW_PATH +config BCM4330 + tristate "---Broadcom WiFi Driver for 4330" depends on WLAN - string "Firmware path" - default "/system/etc/firmware/fw_bcmdhd.bin" ---help--- - Path to the firmware file. + Select this option to build Broadcom wlan driver -config BCMDHD_NVRAM_PATH +config BCM43241 + tristate "---Broadcom WiFi Driver for 43241" depends on WLAN - string "NVRAM path" - default "/system/etc/wifi/bcmdhd.cal" - ---help--- - Path to the calibration file. - -config BCMDHD_WEXT - bool "Enable WEXT support" - depends on BCMDHD && CFG80211 = n - select WIRELESS_EXT - select WEXT_PRIV - help - Enables WEXT support - -config DHD_USE_STATIC_BUF - bool "Enable memory preallocation" - depends on BCMDHD - default n ---help--- - Use memory preallocated in platform - -config DHD_USE_SCHED_SCAN - bool "Use CFG80211 sched scan" - depends on BCMDHD && CFG80211 - default n - ---help--- - Use CFG80211 sched scan + Select this option to build Broadcom wlan driver config BROADCOM_WIFI_RESERVED_MEM bool "BROADCOM Reserved memory for wifi device" - depends on (BCM4330 || BCM4334 || BCM43241) + depends on (BCM4330 || BCM4334 || BCM43241) ---help--- - This is a configuration for broadcom WLAN driver. + This is a configuration for broadcom WLAN driver. + +config WLAN_COUNTRY_CODE + tristate "---Broadcom WiFi Driver for 5GH channel setting" + depends on WLAN + default n config WLAN_REGION_CODE int "---Region codes for Broadcom WiFi Driver" diff --git a/drivers/net/wireless/bcmdhd/Makefile b/drivers/net/wireless/bcmdhd/Makefile index ee9c1ed..48e5226 100755..100644 --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -1,136 +1,112 @@ # bcmdhd -##################### -# SDIO Basic feature -##################### - -DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DLINUX -DBCMDRIVER \ - -DBCMDONGLEHOST -DUNRELEASEDCHIP -DBCMDMA32 -DBCMFILEIMAGE \ - -DDHDTHREAD -DBDC -DOOB_INTR_ONLY \ - -DDHD_BCMEVENTS -DSHOW_EVENTS -DBCMDBG \ +DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DBCMDRIVER \ + -DBCMDONGLEHOST -DUNRELEASEDCHIP -DBCMDMA32 -DWLBTAMP -DBCMFILEIMAGE \ + -DDHDTHREAD -DDHD_GPL -DDHD_SCHED -DDHD_DEBUG -DBDC \ + -DDHD_BCMEVENTS -DSHOW_EVENTS -DDONGLEOVERLAYS -DBCMDBG \ + -DCUSTOMER_HW_SAMSUNG -DOOB_INTR_ONLY \ -DMMC_SDIO_ABORT -DBCMSDIO -DBCMLXSDMMC -DBCMPLATFORM_BUS -DWLP2P \ - -DWIFI_ACT_FRAME -DARP_OFFLOAD_SUPPORT \ + -DNEW_COMPAT_WIRELESS -DWIFI_ACT_FRAME -DARP_OFFLOAD_SUPPORT \ -DKEEP_ALIVE -DCSCAN -DPKT_FILTER_SUPPORT \ -DEMBEDDED_PLATFORM -DPNO_SUPPORT -################# -# Common feature -################# +# distinguish between the 43xx chip +ifeq ($(CONFIG_BCM4334),m) +DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DBCM4334_CHECK_CHIP_REV +DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM +DHDCFLAGS += -DPROP_TXSTATUS +DHDCFLAGS += -DVSDB -DHT40_GO +DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST +DHDCFLAGS += -DDHD_USE_IDLECOUNT +DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD +DHDCFLAGS += -DVSDB_DYNAMIC_F2_BLKSIZE -DSDIO_F2_BLKSIZE=512 -DVSDB_F2_BLKSIZE=64 +endif +ifeq ($(CONFIG_BCM4334),y) +DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DBCM4334_CHECK_CHIP_REV +DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM +DHDCFLAGS += -DPROP_TXSTATUS +DHDCFLAGS += -DVSDB -DHT40_GO +DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST +DHDCFLAGS += -DDHD_USE_IDLECOUNT +DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD +DHDCFLAGS += -DVSDB_DYNAMIC_F2_BLKSIZE -DSDIO_F2_BLKSIZE=512 -DVSDB_F2_BLKSIZE=64 +endif +ifeq ($(CONFIG_BCM4330),m) +DHDCFLAGS += -DBCM4330_CHIP +DHDCFLAGS += -DMCAST_LIST_ACCUMULATION +DHDCFLAGS += -DCONFIG_CONTROL_PM +DHDCFLAGS += -DROAM_ENABLE -DROAM_API -DROAM_CHANNEL_CACHE +endif -DHDCFLAGS += -DCUSTOMER_HW4 -DHDCFLAGS += -DSUPPORT_DEEP_SLEEP -DWL_CFG80211_STA_EVENT -DHDCFLAGS += -DSIMPLE_MAC_PRINT +ifeq ($(CONFIG_BCM4330),y) +DHDCFLAGS += -DBCM4330_CHIP +DHDCFLAGS += -DMCAST_LIST_ACCUMULATION +DHDCFLAGS += -DCONFIG_CONTROL_PM +DHDCFLAGS += -DROAM_ENABLE -DROAM_API -DROAM_CHANNEL_CACHE +endif +ifeq ($(CONFIG_BCM43241),m) +DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB +DHDCFLAGS += -DMCAST_LIST_ACCUMULATION +DHDCFLAGS += -DMIMO_ANT_SETTING -DCONFIG_CONTROL_PM +DHDCFLAGS += -fno-pic +endif +ifeq ($(CONFIG_BCM43241),y) +DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB +DHDCFLAGS += -DMCAST_LIST_ACCUMULATION +DHDCFLAGS += -DMIMO_ANT_SETTING -DCONFIG_CONTROL_PM +endif # For p2p connection issue DHDCFLAGS += -DWL_CFG80211_GON_COLLISION -DHDCFLAGS += -DWL_SCB_TIMEOUT=10 +DHDCFLAGS += -DWL_CFG80211_SYNC_GON_TIME +#end p2p connection # For Passing all multicast packets to host when not in suspend mode. DHDCFLAGS += -DPASS_ALL_MCAST_PKTS -# Early suspend -DHDCFLAGS += -DDHD_USE_EARLYSUSPEND +#For INITIAL 2G scan features +#select only one from USE_INIITAL_2G_SCAN and INITIAL_2G_SCAN_ORG + +#DHDCFLAGS += -DUSE_INITIAL_2G_SCAN +DHDCFLAGS += -DUSE_INITIAL_2G_SCAN_ORG -DHDCFLAGS += -DSUPPORT_PM2_ONLY +DHDCFLAGS +=-DINITIAL_2G_SCAN_BY_ESCAN # For Scan result patch DHDCFLAGS += -DESCAN_RESULT_PATCH -DHDCFLAGS += -DDUAL_ESCAN_RESULT_BUFFER - -DHDCFLAGS += -DROAM_ENABLE -DROAM_CHANNEL_CACHE -DROAM_API -DHDCFLAGS += -DDISABLE_FW_ROAM_SUSPEND -# For Static Buffer -ifeq ($(CONFIG_BROADCOM_WIFI_RESERVED_MEM),y) - DHDCFLAGS += -DCONFIG_DHD_USE_STATIC_BUF - DHDCFLAGS += -DENHANCED_STATIC_BUF - DHDCFLAGS += -DSTATIC_WL_PRIV_STRUCT +ifeq ($(CONFIG_MACH_SAMSUNG_T1),y) +DHDCFLAGS += -DUSE_CID_CHECK -DWRITE_MACADDR endif -# For CCX -ifeq ($(CONFIG_BRCM_CCX),y) - DHDCFLAGS += -DBCMCCX +ifeq ($(CONFIG_MACH_U1_NA_SPR),y) +DHDCFLAGS += -DRDWR_MACADDR endif -DHDCFLAGS += -DWL_CFG80211 - -# SoftAP -DHDCFLAGS += -DSUPPORT_AUTO_CHANNEL -DSUPPORT_HIDDEN_AP -DHDCFLAGS += -DSUPPORT_SOFTAP_SINGL_DISASSOC -DHDCFLAGS += -DUSE_STAMAC_4SOFTAP - -# DPC priority -DHDCFLAGS += -DCUSTOM_DPC_PRIO_SETTING=98 - -# WiFi turn off delay -DHDCFLAGS += -DWIFI_TURNOFF_DELAY=100 - -# WiFi Kernel thread type -DHDCFLAGS += -DUSE_KTHREAD_API - -############ -# JellyBean -############ -DHDCFLAGS += -DWL_ENABLE_P2P_IF -DHDCFLAGS += -DMULTIPLE_SUPPLICANT - -######################### -# Chip dependent feature -######################### - -ifneq ($(CONFIG_BCM4334),) - DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION - DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM - DHDCFLAGS += -DPROP_TXSTATUS - DHDCFLAGS += -DVSDB -DHT40_GO - DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - DHDCFLAGS += -DDHD_USE_IDLECOUNT - DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD - DHDCFLAGS += -DVSDB_DYNAMIC_F2_BLKSIZE -DSDIO_F2_BLKSIZE=512 -DVSDB_F2_BLKSIZE=64 - DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 -DENABLE_BCN_LI_BCN_WAKEUP -# DHDCFLAGS += -DWES_SUPPORT -endif +DHDCFLAGS += -DROAM_ENABLE -DROAM_CHANNEL_CACHE -DROAM_API -ifneq ($(CONFIG_BCM4330),) - DHDCFLAGS += -DBCM4330_CHIP - DHDCFLAGS += -DMCAST_LIST_ACCUMULATION - DHDCFLAGS += -DCONFIG_CONTROL_PM -endif - -ifneq ($(CONFIG_BCM43241),) - DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB - DHDCFLAGS += -DMCAST_LIST_ACCUMULATION - DHDCFLAGS += -DMIMO_ANT_SETTING -DCONFIG_CONTROL_PM - DHDCFLAGS += -DAMPDU_HOSTREORDER -DDHD_USE_IDLECOUNT - ifeq ($(CONFIG_BCM43241),m) - DHDCFLAGS += -fno-pic - endif -endif - - -############################# -# Platform dependent feature -############################# - -# NAT keepalive packet filter for GAN-lite -ifeq ($(SEC_MODEL_NAME),U1) - ifeq ($(X_BUILD_LOCALE),EUR_ORG) - DHDCFLAGS += -DGAN_LITE_NAT_KEEPALIVE_FILTER - endif +# For Static Buffer +ifeq ($(CONFIG_BROADCOM_WIFI_RESERVED_MEM),y) +DHDCFLAGS += -DCONFIG_DHD_USE_STATIC_BUF endif -#For INITIAL 2G scan features -ifneq ($(CONFIG_TARGET_LOCALE_KOR),y) - DHDCFLAGS += -DUSE_INITIAL_2G_SCAN +# For CCX +ifeq ($(CONFIG_BRCM_CCX),y) +DHDCFLAGS += -DBCMCCX endif # For SLP feature ifeq ($(CONFIG_SLP),y) - DHDCFLAGS += -DPLATFORM_SLP +DHDCFLAGS += -DSLP_PATH -DWRITE_MACADDR -DCUSTOMER_HW_SLP endif -# GGSM_WIFI_5GHz_CHANNELS feature is define for only GGSM model -ifeq ($(GGSM_WIFI_5GHz_CHANNELS),true) - DHDCFLAGS += -DCUSTOMER_SET_COUNTRY +# 5GHz channels setting +ifeq ($(CONFIG_WLAN_COUNTRY_CODE),y) +DHDCFLAGS += -DGLOBALCONFIG_WLAN_COUNTRY_CODE +endif + +# For ICS SEC Features +ifneq ($(findstring GlobalConfig, $(wildcard $(srctree)/include/sec_feature/*)),) +DHDCFLAGS += -DUSE_SECFEATURE endif ############################################################## @@ -164,33 +140,65 @@ DHDCFLAGS += -DWLAN_REGION_CODE=$(REGION_CODE) ############################################################## -######### -# Others -######### +# For Debug +EXTRA_CFLAGS += $(DHDCFLAGS) -DWL_CFG80211 -DRSSI_OFFSET=0 +EXTRA_CFLAGS += -DDHD_DEBUG -DSRCBASE=\"$(src)/src\" -#EXTRA_LDFLAGS += --strip-debug +EXTRA_CFLAGS += -I$(src)/src/include/ +EXTRA_CFLAGS += -I$(src)/src/dhd/sys/ +EXTRA_CFLAGS += -I$(src)/src/dongle/ +EXTRA_CFLAGS += -I$(src)/src/bcmsdio/sys/ +EXTRA_CFLAGS += -I$(src)/src/wl/sys/ +EXTRA_CFLAGS += -I$(src)/src/shared/ +EXTRA_CFLAGS += -I$(src)/src/wl/bcmwifi/src/ +EXTRA_CFLAGS += -I$(src)/src/wl/bcmwifi/include/ -EXTRA_CFLAGS += $(DHDCFLAGS) -DDHD_DEBUG -EXTRA_CFLAGS += -DSRCBASE=\"$(src)\" -EXTRA_CFLAGS += -I$(src)/include/ -I$(src)/ +ifeq ($(CONFIG_MACH_T0), y) +#EXTRA_LDFLAGS += --strip-debug +else +EXTRA_LDFLAGS += --strip-debug +endif KBUILD_CFLAGS += -I$(LINUXDIR)/include -I$(shell pwd) -DHDOFILES := bcmsdh.o bcmsdh_linux.o bcmsdh_sdmmc.o bcmsdh_sdmmc_linux.o \ - dhd_cdc.o dhd_common.o dhd_custom_gpio.o dhd_custom_sec.o \ - dhd_linux.o dhd_linux_sched.o dhd_cfg80211.o dhd_sdio.o aiutils.o bcmevent.o \ - bcmutils.o bcmwifi_channels.o hndpmu.o linux_osl.o sbutils.o siutils.o \ - wl_android.o wl_cfg80211.o wl_cfgp2p.o wldev_common.o wl_linux_mon.o wl_roam.o - -dhd-y := $(DHDOFILES) obj-m += dhd.o +dhd-y := src/bcmsdio/sys/bcmsdh.o src/bcmsdio/sys/bcmsdh_linux.o \ + src/bcmsdio/sys/bcmsdh_sdmmc.o src/bcmsdio/sys/bcmsdh_sdmmc_linux.o \ + src/dhd/sys/dhd_bta.o src/dhd/sys/dhd_cdc.o \ + src/dhd/sys/dhd_common.o src/dhd/sys/dhd_custom_gpio.o \ + src/dhd/sys/dhd_custom_sec.o \ + src/dhd/sys/dhd_linux.o src/dhd/sys/dhd_linux_sched.o \ + src/dhd/sys/dhd_cfg80211.o src/dhd/sys/dhd_sdio.o \ + src/shared/aiutils.o src/shared/bcmevent.o \ + src/shared/bcmutils.o src/wl/bcmwifi/src/bcmwifi_channels.o \ + src/shared/hndpmu.o src/shared/linux_osl.o \ + src/shared/sbutils.o src/shared/siutils.o \ + src/wl/sys/wl_android.o src/wl/sys/wl_cfg80211.o \ + src/wl/sys/wl_cfgp2p.o src/wl/sys/wldev_common.o \ + src/wl/sys/wl_linux_mon.o src/wl/sys/wl_roam.o + all: @echo "$(MAKE) --no-print-directory -C $(KDIR) SUBDIRS=$(CURDIR) modules" - @$(MAKE) --no-print-directory -C $(KDIR) SUBDIRS=$(CURDIR) modules + @$(MAKE) --no-print-directory -C $(KDIR) \ + SUBDIRS=$(CURDIR) modules clean: - rm -rf *.o *.ko *.mod.c *~ .*.cmd *.o.cmd .*.o.cmd \ - Module.symvers modules.order .tmp_versions modules.builtin + rm -rf *.o *.ko *.mod.c *~ .*.cmd \ + Module.symvers modules.order .tmp_versions modules.builtin \ + src/bcmsdio/sys/*.o \ + src/bcmsdio/sys/*.o.cmd \ + src/bcmsdio/sys/.*.o.cmd \ + src/dhd/sys/*.o \ + src/dhd/sys/*.o.cmd \ + src/dhd/sys/.*.o.cmd \ + src/shared/*.o \ + src/shared/*.o.cmd \ + src/shared/.*.o.cmd \ + src/wl/sys/*.o \ + src/wl/sys/*.o.cmd \ + src/wl/sys/.*.o.cmd \ + src/wl/bcmwifi/src/bcmwifi_channels.o \ + src/wl/bcmwifi/src/.*.o.cmd install: @$(MAKE) --no-print-directory -C $(KDIR) \ diff --git a/drivers/net/wireless/bcmdhd/bcmspibrcm.c b/drivers/net/wireless/bcmdhd/bcmspibrcm.c deleted file mode 100644 index cf54cc1..0000000 --- a/drivers/net/wireless/bcmdhd/bcmspibrcm.c +++ /dev/null @@ -1,1851 +0,0 @@ -/* - * Broadcom BCMSDH to gSPI Protocol Conversion Layer - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmspibrcm.c 354197 2012-08-30 09:05:59Z $ - */ - -#define HSMODE - -#include <typedefs.h> - -#include <bcmdevs.h> -#include <bcmendian.h> -#include <bcmutils.h> -#include <osl.h> -#include <hndsoc.h> -#include <siutils.h> -#include <sbchipc.h> -#include <sbsdio.h> /* SDIO device core hardware definitions. */ -#include <spid.h> - -#include <bcmsdbus.h> /* bcmsdh to/from specific controller APIs */ -#include <sdiovar.h> /* ioctl/iovars */ -#include <sdio.h> /* SDIO Device and Protocol Specs */ - -#include <pcicfg.h> - - -#include <bcmspibrcm.h> -#ifdef BCMSPI_ANDROID -extern void spi_sendrecv(sdioh_info_t *sd, uint8 *msg_out, uint8 *msg_in, int msglen); -#else -#include <bcmspi.h> -#endif /* BCMSPI_ANDROID */ - -/* these are for the older cores... for newer cores we have control for each of them */ -#define F0_RESPONSE_DELAY 16 -#define F1_RESPONSE_DELAY 16 -#define F2_RESPONSE_DELAY F0_RESPONSE_DELAY - - -#define GSPI_F0_RESP_DELAY 0 -#define GSPI_F1_RESP_DELAY F1_RESPONSE_DELAY -#define GSPI_F2_RESP_DELAY 0 -#define GSPI_F3_RESP_DELAY 0 - -#define CMDLEN 4 - -#define DWORDMODE_ON (sd->chip == BCM4329_CHIP_ID) && (sd->chiprev == 2) && (sd->dwordmode == TRUE) - -/* Globals */ -#if defined(DHD_DEBUG) -uint sd_msglevel = SDH_ERROR_VAL; -#else -uint sd_msglevel = 0; -#endif - -uint sd_hiok = FALSE; /* Use hi-speed mode if available? */ -uint sd_sdmode = SDIOH_MODE_SPI; /* Use SD4 mode by default */ -uint sd_f2_blocksize = 64; /* Default blocksize */ - - -uint sd_divisor = 2; -uint sd_power = 1; /* Default to SD Slot powered ON */ -uint sd_clock = 1; /* Default to SD Clock turned ON */ -uint sd_crc = 0; /* Default to SPI CRC Check turned OFF */ -uint sd_pci_slot = 0xFFFFffff; /* Used to force selection of a particular PCI slot */ - -uint8 spi_outbuf[SPI_MAX_PKT_LEN]; -uint8 spi_inbuf[SPI_MAX_PKT_LEN]; - -/* 128bytes buffer is enough to clear data-not-available and program response-delay F0 bits - * assuming we will not exceed F0 response delay > 100 bytes at 48MHz. - */ -#define BUF2_PKT_LEN 128 -uint8 spi_outbuf2[BUF2_PKT_LEN]; -uint8 spi_inbuf2[BUF2_PKT_LEN]; - -/* Prototypes */ -static bool bcmspi_test_card(sdioh_info_t *sd); -static bool bcmspi_host_device_init_adapt(sdioh_info_t *sd); -static int bcmspi_set_highspeed_mode(sdioh_info_t *sd, bool hsmode); -static int bcmspi_cmd_issue(sdioh_info_t *sd, bool use_dma, uint32 cmd_arg, - uint32 *data, uint32 datalen); -static int bcmspi_card_regread(sdioh_info_t *sd, int func, uint32 regaddr, - int regsize, uint32 *data); -static int bcmspi_card_regwrite(sdioh_info_t *sd, int func, uint32 regaddr, - int regsize, uint32 data); -static int bcmspi_card_bytewrite(sdioh_info_t *sd, int func, uint32 regaddr, - uint8 *data); -static int bcmspi_driver_init(sdioh_info_t *sd); -static int bcmspi_card_buf(sdioh_info_t *sd, int rw, int func, bool fifo, - uint32 addr, int nbytes, uint32 *data); -static int bcmspi_card_regread_fixedaddr(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, - uint32 *data); -static void bcmspi_cmd_getdstatus(sdioh_info_t *sd, uint32 *dstatus_buffer); -static int bcmspi_update_stats(sdioh_info_t *sd, uint32 cmd_arg); - -/* - * Public entry points & extern's - */ -extern sdioh_info_t * -sdioh_attach(osl_t *osh, void *bar0, uint irq) -{ - sdioh_info_t *sd; - - sd_trace(("%s\n", __FUNCTION__)); - if ((sd = (sdioh_info_t *)MALLOC(osh, sizeof(sdioh_info_t))) == NULL) { - sd_err(("%s: out of memory, malloced %d bytes\n", __FUNCTION__, MALLOCED(osh))); - return NULL; - } - bzero((char *)sd, sizeof(sdioh_info_t)); - sd->osh = osh; - if (spi_osinit(sd) != 0) { - sd_err(("%s: spi_osinit() failed\n", __FUNCTION__)); - MFREE(sd->osh, sd, sizeof(sdioh_info_t)); - return NULL; - } - -#ifndef BCMSPI_ANDROID - sd->bar0 = bar0; -#endif /* !BCMSPI_ANDROID */ - sd->irq = irq; -#ifndef BCMSPI_ANDROID - sd->intr_handler = NULL; - sd->intr_handler_arg = NULL; - sd->intr_handler_valid = FALSE; -#endif /* !BCMSPI_ANDROID */ - - /* Set defaults */ - sd->use_client_ints = TRUE; - sd->sd_use_dma = FALSE; /* DMA Not supported */ - - /* Spi device default is 16bit mode, change to 4 when device is changed to 32bit - * mode - */ - sd->wordlen = 2; - -#ifndef BCMSPI_ANDROID - if (!spi_hw_attach(sd)) { - sd_err(("%s: spi_hw_attach() failed\n", __FUNCTION__)); - spi_osfree(sd); - MFREE(sd->osh, sd, sizeof(sdioh_info_t)); - return (NULL); - } -#endif /* !BCMSPI_ANDROID */ - - if (bcmspi_driver_init(sd) != SUCCESS) { - sd_err(("%s: bcmspi_driver_init() failed()\n", __FUNCTION__)); -#ifndef BCMSPI_ANDROID - spi_hw_detach(sd); -#endif /* !BCMSPI_ANDROID */ - spi_osfree(sd); - MFREE(sd->osh, sd, sizeof(sdioh_info_t)); - return (NULL); - } - - if (spi_register_irq(sd, irq) != SUCCESS) { - sd_err(("%s: spi_register_irq() failed for irq = %d\n", __FUNCTION__, irq)); -#ifndef BCMSPI_ANDROID - spi_hw_detach(sd); -#endif /* !BCMSPI_ANDROID */ - spi_osfree(sd); - MFREE(sd->osh, sd, sizeof(sdioh_info_t)); - return (NULL); - } - - sd_trace(("%s: Done\n", __FUNCTION__)); - - return sd; -} - -extern SDIOH_API_RC -sdioh_detach(osl_t *osh, sdioh_info_t *sd) -{ - sd_trace(("%s\n", __FUNCTION__)); - if (sd) { - sd_err(("%s: detaching from hardware\n", __FUNCTION__)); - spi_free_irq(sd->irq, sd); -#ifndef BCMSPI_ANDROID - spi_hw_detach(sd); -#endif /* !BCMSPI_ANDROID */ - spi_osfree(sd); - MFREE(sd->osh, sd, sizeof(sdioh_info_t)); - } - return SDIOH_API_RC_SUCCESS; -} - -/* Configure callback to client when we recieve client interrupt */ -extern SDIOH_API_RC -sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh) -{ -#ifndef BCMSPI_ANDROID - sd_trace(("%s: Entering\n", __FUNCTION__)); - sd->intr_handler = fn; - sd->intr_handler_arg = argh; - sd->intr_handler_valid = TRUE; -#endif /* !BCMSPI_ANDROID */ - return SDIOH_API_RC_SUCCESS; -} - -extern SDIOH_API_RC -sdioh_interrupt_deregister(sdioh_info_t *sd) -{ -#ifndef BCMSPI_ANDROID - sd_trace(("%s: Entering\n", __FUNCTION__)); - sd->intr_handler_valid = FALSE; - sd->intr_handler = NULL; - sd->intr_handler_arg = NULL; -#endif /* !BCMSPI_ANDROID */ - return SDIOH_API_RC_SUCCESS; -} - -extern SDIOH_API_RC -sdioh_interrupt_query(sdioh_info_t *sd, bool *onoff) -{ -#ifndef BCMSPI_ANDROID - sd_trace(("%s: Entering\n", __FUNCTION__)); - *onoff = sd->client_intr_enabled; -#endif /* !BCMSPI_ANDROID */ - return SDIOH_API_RC_SUCCESS; -} - -#if defined(DHD_DEBUG) -extern bool -sdioh_interrupt_pending(sdioh_info_t *sd) -{ - return 0; -} -#endif - -extern SDIOH_API_RC -sdioh_query_device(sdioh_info_t *sd) -{ - /* Return a BRCM ID appropriate to the dongle class */ - return (sd->num_funcs > 1) ? BCM4329_D11N_ID : BCM4318_D11G_ID; -} - -/* Provide dstatus bits of spi-transaction for dhd layers. */ -extern uint32 -sdioh_get_dstatus(sdioh_info_t *sd) -{ - return sd->card_dstatus; -} - -extern void -sdioh_chipinfo(sdioh_info_t *sd, uint32 chip, uint32 chiprev) -{ - sd->chip = chip; - sd->chiprev = chiprev; -} - -extern void -sdioh_dwordmode(sdioh_info_t *sd, bool set) -{ - uint8 reg = 0; - int status; - - if ((status = sdioh_request_byte(sd, SDIOH_READ, SPI_FUNC_0, SPID_STATUS_ENABLE, ®)) != - SUCCESS) { - sd_err(("%s: Failed to set dwordmode in gSPI\n", __FUNCTION__)); - return; - } - - if (set) { - reg |= DWORD_PKT_LEN_EN; - sd->dwordmode = TRUE; - sd->client_block_size[SPI_FUNC_2] = 4096; /* h2spi's limit is 4KB, we support 8KB */ - } else { - reg &= ~DWORD_PKT_LEN_EN; - sd->dwordmode = FALSE; - sd->client_block_size[SPI_FUNC_2] = 2048; - } - - if ((status = sdioh_request_byte(sd, SDIOH_WRITE, SPI_FUNC_0, SPID_STATUS_ENABLE, ®)) != - SUCCESS) { - sd_err(("%s: Failed to set dwordmode in gSPI\n", __FUNCTION__)); - return; - } -} - - -uint -sdioh_query_iofnum(sdioh_info_t *sd) -{ - return sd->num_funcs; -} - -/* IOVar table */ -enum { - IOV_MSGLEVEL = 1, - IOV_BLOCKMODE, - IOV_BLOCKSIZE, - IOV_DMA, - IOV_USEINTS, - IOV_NUMINTS, - IOV_NUMLOCALINTS, - IOV_HOSTREG, - IOV_DEVREG, - IOV_DIVISOR, - IOV_SDMODE, - IOV_HISPEED, - IOV_HCIREGS, - IOV_POWER, - IOV_CLOCK, - IOV_SPIERRSTATS, - IOV_RESP_DELAY_ALL -}; - -const bcm_iovar_t sdioh_iovars[] = { - {"sd_msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, - {"sd_blocksize", IOV_BLOCKSIZE, 0, IOVT_UINT32, 0 }, /* ((fn << 16) | size) */ - {"sd_dma", IOV_DMA, 0, IOVT_BOOL, 0 }, - {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0 }, - {"sd_numints", IOV_NUMINTS, 0, IOVT_UINT32, 0 }, - {"sd_numlocalints", IOV_NUMLOCALINTS, 0, IOVT_UINT32, 0 }, - {"sd_hostreg", IOV_HOSTREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, - {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, - {"sd_divisor", IOV_DIVISOR, 0, IOVT_UINT32, 0 }, - {"sd_power", IOV_POWER, 0, IOVT_UINT32, 0 }, - {"sd_clock", IOV_CLOCK, 0, IOVT_UINT32, 0 }, - {"sd_mode", IOV_SDMODE, 0, IOVT_UINT32, 100}, - {"sd_highspeed", IOV_HISPEED, 0, IOVT_UINT32, 0}, - {"spi_errstats", IOV_SPIERRSTATS, 0, IOVT_BUFFER, sizeof(struct spierrstats_t) }, - {"spi_respdelay", IOV_RESP_DELAY_ALL, 0, IOVT_BOOL, 0 }, - {NULL, 0, 0, 0, 0 } -}; - -int -sdioh_iovar_op(sdioh_info_t *si, const char *name, - void *params, int plen, void *arg, int len, bool set) -{ - const bcm_iovar_t *vi = NULL; - int bcmerror = 0; - int val_size; - int32 int_val = 0; - bool bool_val; - uint32 actionid; -/* - sdioh_regs_t *regs; -*/ - - ASSERT(name); - ASSERT(len >= 0); - - /* Get must have return space; Set does not take qualifiers */ - ASSERT(set || (arg && len)); - ASSERT(!set || (!params && !plen)); - - sd_trace(("%s: Enter (%s %s)\n", __FUNCTION__, (set ? "set" : "get"), name)); - - if ((vi = bcm_iovar_lookup(sdioh_iovars, name)) == NULL) { - bcmerror = BCME_UNSUPPORTED; - goto exit; - } - - if ((bcmerror = bcm_iovar_lencheck(vi, arg, len, set)) != 0) - goto exit; - - /* Set up params so get and set can share the convenience variables */ - if (params == NULL) { - params = arg; - plen = len; - } - - if (vi->type == IOVT_VOID) - val_size = 0; - else if (vi->type == IOVT_BUFFER) - val_size = len; - else - val_size = sizeof(int); - - if (plen >= (int)sizeof(int_val)) - bcopy(params, &int_val, sizeof(int_val)); - - bool_val = (int_val != 0) ? TRUE : FALSE; - - actionid = set ? IOV_SVAL(vi->varid) : IOV_GVAL(vi->varid); - switch (actionid) { - case IOV_GVAL(IOV_MSGLEVEL): - int_val = (int32)sd_msglevel; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_MSGLEVEL): - sd_msglevel = int_val; - break; - - case IOV_GVAL(IOV_BLOCKSIZE): - if ((uint32)int_val > si->num_funcs) { - bcmerror = BCME_BADARG; - break; - } - int_val = (int32)si->client_block_size[int_val]; - bcopy(&int_val, arg, val_size); - break; - - case IOV_GVAL(IOV_DMA): - int_val = (int32)si->sd_use_dma; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_DMA): - si->sd_use_dma = (bool)int_val; - break; - - case IOV_GVAL(IOV_USEINTS): - int_val = (int32)si->use_client_ints; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_USEINTS): - break; - - case IOV_GVAL(IOV_DIVISOR): - int_val = (uint32)sd_divisor; - bcopy(&int_val, arg, val_size); - break; - -#ifndef BCMSPI_ANDROID - case IOV_SVAL(IOV_DIVISOR): - sd_divisor = int_val; - if (!spi_start_clock(si, (uint16)sd_divisor)) { - sd_err(("%s: set clock failed\n", __FUNCTION__)); - bcmerror = BCME_ERROR; - } - break; -#endif /* !BCMSPI_ANDROID */ - - case IOV_GVAL(IOV_POWER): - int_val = (uint32)sd_power; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_POWER): - sd_power = int_val; - break; - - case IOV_GVAL(IOV_CLOCK): - int_val = (uint32)sd_clock; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_CLOCK): - sd_clock = int_val; - break; - - case IOV_GVAL(IOV_SDMODE): - int_val = (uint32)sd_sdmode; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_SDMODE): - sd_sdmode = int_val; - break; - - case IOV_GVAL(IOV_HISPEED): - int_val = (uint32)sd_hiok; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_HISPEED): - sd_hiok = int_val; - - if (!bcmspi_set_highspeed_mode(si, (bool)sd_hiok)) { - sd_err(("%s: Failed changing highspeed mode to %d.\n", - __FUNCTION__, sd_hiok)); - bcmerror = BCME_ERROR; - return ERROR; - } - break; - - case IOV_GVAL(IOV_NUMINTS): - int_val = (int32)si->intrcount; - bcopy(&int_val, arg, val_size); - break; - - case IOV_GVAL(IOV_NUMLOCALINTS): - int_val = (int32)si->local_intrcount; - bcopy(&int_val, arg, val_size); - break; - case IOV_GVAL(IOV_DEVREG): - { - sdreg_t *sd_ptr = (sdreg_t *)params; - uint8 data; - - if (sdioh_cfg_read(si, sd_ptr->func, sd_ptr->offset, &data)) { - bcmerror = BCME_SDIO_ERROR; - break; - } - - int_val = (int)data; - bcopy(&int_val, arg, sizeof(int_val)); - break; - } - - case IOV_SVAL(IOV_DEVREG): - { - sdreg_t *sd_ptr = (sdreg_t *)params; - uint8 data = (uint8)sd_ptr->value; - - if (sdioh_cfg_write(si, sd_ptr->func, sd_ptr->offset, &data)) { - bcmerror = BCME_SDIO_ERROR; - break; - } - break; - } - - - case IOV_GVAL(IOV_SPIERRSTATS): - { - bcopy(&si->spierrstats, arg, sizeof(struct spierrstats_t)); - break; - } - - case IOV_SVAL(IOV_SPIERRSTATS): - { - bzero(&si->spierrstats, sizeof(struct spierrstats_t)); - break; - } - - case IOV_GVAL(IOV_RESP_DELAY_ALL): - int_val = (int32)si->resp_delay_all; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_RESP_DELAY_ALL): - si->resp_delay_all = (bool)int_val; - int_val = STATUS_ENABLE|INTR_WITH_STATUS; - if (si->resp_delay_all) - int_val |= RESP_DELAY_ALL; - else { - if (bcmspi_card_regwrite(si, SPI_FUNC_0, SPID_RESPONSE_DELAY, 1, - F1_RESPONSE_DELAY) != SUCCESS) { - sd_err(("%s: Unable to set response delay.\n", __FUNCTION__)); - bcmerror = BCME_SDIO_ERROR; - break; - } - } - - if (bcmspi_card_regwrite(si, SPI_FUNC_0, SPID_STATUS_ENABLE, 1, int_val) - != SUCCESS) { - sd_err(("%s: Unable to set response delay.\n", __FUNCTION__)); - bcmerror = BCME_SDIO_ERROR; - break; - } - break; - - default: - bcmerror = BCME_UNSUPPORTED; - break; - } -exit: - - return bcmerror; -} - -extern SDIOH_API_RC -sdioh_cfg_read(sdioh_info_t *sd, uint fnc_num, uint32 addr, uint8 *data) -{ - SDIOH_API_RC status; - /* No lock needed since sdioh_request_byte does locking */ - status = sdioh_request_byte(sd, SDIOH_READ, fnc_num, addr, data); - return status; -} - -extern SDIOH_API_RC -sdioh_cfg_write(sdioh_info_t *sd, uint fnc_num, uint32 addr, uint8 *data) -{ - /* No lock needed since sdioh_request_byte does locking */ - SDIOH_API_RC status; - - if ((fnc_num == SPI_FUNC_1) && (addr == SBSDIO_FUNC1_FRAMECTRL)) { - uint8 dummy_data; - status = sdioh_cfg_read(sd, fnc_num, addr, &dummy_data); - if (status) { - sd_err(("sdioh_cfg_read() failed.\n")); - return status; - } - } - - status = sdioh_request_byte(sd, SDIOH_WRITE, fnc_num, addr, data); - return status; -} - -extern SDIOH_API_RC -sdioh_cis_read(sdioh_info_t *sd, uint func, uint8 *cisd, uint32 length) -{ - uint32 count; - int offset; - uint32 cis_byte; - uint16 *cis = (uint16 *)cisd; - uint bar0 = SI_ENUM_BASE; - int status; - uint8 data; - - sd_trace(("%s: Func %d\n", __FUNCTION__, func)); - - spi_lock(sd); - - /* Set sb window address to 0x18000000 */ - data = (bar0 >> 8) & SBSDIO_SBADDRLOW_MASK; - status = bcmspi_card_bytewrite(sd, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW, &data); - if (status == SUCCESS) { - data = (bar0 >> 16) & SBSDIO_SBADDRMID_MASK; - status = bcmspi_card_bytewrite(sd, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRMID, &data); - } else { - sd_err(("%s: Unable to set sb-addr-windows\n", __FUNCTION__)); - spi_unlock(sd); - return (BCME_ERROR); - } - if (status == SUCCESS) { - data = (bar0 >> 24) & SBSDIO_SBADDRHIGH_MASK; - status = bcmspi_card_bytewrite(sd, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRHIGH, &data); - } else { - sd_err(("%s: Unable to set sb-addr-windows\n", __FUNCTION__)); - spi_unlock(sd); - return (BCME_ERROR); - } - - offset = CC_SROM_OTP; /* OTP offset in chipcommon. */ - for (count = 0; count < length/2; count++) { - if (bcmspi_card_regread (sd, SDIO_FUNC_1, offset, 2, &cis_byte) < 0) { - sd_err(("%s: regread failed: Can't read CIS\n", __FUNCTION__)); - spi_unlock(sd); - return (BCME_ERROR); - } - - *cis = (uint16)cis_byte; - cis++; - offset += 2; - } - - spi_unlock(sd); - - return (BCME_OK); -} - -extern SDIOH_API_RC -sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *byte) -{ - int status; - uint32 cmd_arg; - uint32 dstatus; - uint32 data = (uint32)(*byte); - - spi_lock(sd); - - cmd_arg = 0; - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); /* Incremental access */ - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, rw == SDIOH_READ ? 0 : 1); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, 1); - - if (rw == SDIOH_READ) { - sd_trace(("%s: RD cmd_arg=0x%x func=%d regaddr=0x%x\n", - __FUNCTION__, cmd_arg, func, regaddr)); - } else { - sd_trace(("%s: WR cmd_arg=0x%x func=%d regaddr=0x%x data=0x%x\n", - __FUNCTION__, cmd_arg, func, regaddr, data)); - } - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, &data, 1)) != SUCCESS) { - spi_unlock(sd); - return status; - } - - if (rw == SDIOH_READ) { - *byte = (uint8)data; - sd_trace(("%s: RD result=0x%x\n", __FUNCTION__, *byte)); - } - - bcmspi_cmd_getdstatus(sd, &dstatus); - if (dstatus) - sd_trace(("dstatus=0x%x\n", dstatus)); - - spi_unlock(sd); - return SDIOH_API_RC_SUCCESS; -} - -extern SDIOH_API_RC -sdioh_request_word(sdioh_info_t *sd, uint cmd_type, uint rw, uint func, uint addr, - uint32 *word, uint nbytes) -{ - int status; - - spi_lock(sd); - - if (rw == SDIOH_READ) - status = bcmspi_card_regread(sd, func, addr, nbytes, word); - else - status = bcmspi_card_regwrite(sd, func, addr, nbytes, *word); - - spi_unlock(sd); - return (status == SUCCESS ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL); -} - -extern SDIOH_API_RC -sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint rw, uint func, - uint addr, uint reg_width, uint buflen_u, uint8 *buffer, void *pkt) -{ - int len; - int buflen = (int)buflen_u; - bool fifo = (fix_inc == SDIOH_DATA_FIX); - - spi_lock(sd); - - ASSERT(reg_width == 4); - ASSERT(buflen_u < (1 << 30)); - ASSERT(sd->client_block_size[func]); - - sd_data(("%s: %c len %d r_cnt %d t_cnt %d, pkt @0x%p\n", - __FUNCTION__, rw == SDIOH_READ ? 'R' : 'W', - buflen_u, sd->r_cnt, sd->t_cnt, pkt)); - - /* Break buffer down into blocksize chunks. */ - while (buflen > 0) { - len = MIN(sd->client_block_size[func], buflen); - if (bcmspi_card_buf(sd, rw, func, fifo, addr, len, (uint32 *)buffer) != SUCCESS) { - sd_err(("%s: bcmspi_card_buf %s failed\n", - __FUNCTION__, rw == SDIOH_READ ? "Read" : "Write")); - spi_unlock(sd); - return SDIOH_API_RC_FAIL; - } - buffer += len; - buflen -= len; - if (!fifo) - addr += len; - } - spi_unlock(sd); - return SDIOH_API_RC_SUCCESS; -} - -/* This function allows write to gspi bus when another rd/wr function is deep down the call stack. - * Its main aim is to have simpler spi writes rather than recursive writes. - * e.g. When there is a need to program response delay on the fly after detecting the SPI-func - * this call will allow to program the response delay. - */ -static int -bcmspi_card_byterewrite(sdioh_info_t *sd, int func, uint32 regaddr, uint8 byte) -{ - uint32 cmd_arg; - uint32 datalen = 1; - uint32 hostlen; - - cmd_arg = 0; - - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, 1); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); /* Incremental access */ - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, datalen); - - sd_trace(("%s cmd_arg = 0x%x\n", __FUNCTION__, cmd_arg)); - - - /* Set up and issue the SPI command. MSByte goes out on bus first. Increase datalen - * according to the wordlen mode(16/32bit) the device is in. - */ - ASSERT(sd->wordlen == 4 || sd->wordlen == 2); - datalen = ROUNDUP(datalen, sd->wordlen); - - /* Start by copying command in the spi-outbuffer */ - if (sd->wordlen == 4) { /* 32bit spid */ - *(uint32 *)spi_outbuf2 = bcmswap32(cmd_arg); - if (datalen & 0x3) - datalen += (4 - (datalen & 0x3)); - } else if (sd->wordlen == 2) { /* 16bit spid */ - *(uint16 *)spi_outbuf2 = bcmswap16(cmd_arg & 0xffff); - *(uint16 *)&spi_outbuf2[2] = bcmswap16((cmd_arg & 0xffff0000) >> 16); - if (datalen & 0x1) - datalen++; - } else { - sd_err(("%s: Host is %d bit spid, could not create SPI command.\n", - __FUNCTION__, 8 * sd->wordlen)); - return ERROR; - } - - /* for Write, put the data into the output buffer */ - if (datalen != 0) { - if (sd->wordlen == 4) { /* 32bit spid */ - *(uint32 *)&spi_outbuf2[CMDLEN] = bcmswap32(byte); - } else if (sd->wordlen == 2) { /* 16bit spid */ - *(uint16 *)&spi_outbuf2[CMDLEN] = bcmswap16(byte & 0xffff); - *(uint16 *)&spi_outbuf2[CMDLEN + 2] = - bcmswap16((byte & 0xffff0000) >> 16); - } - } - - /* +4 for cmd, +4 for dstatus */ - hostlen = datalen + 8; - hostlen += (4 - (hostlen & 0x3)); - spi_sendrecv(sd, spi_outbuf2, spi_inbuf2, hostlen); - - /* Last 4bytes are dstatus. Device is configured to return status bits. */ - if (sd->wordlen == 4) { /* 32bit spid */ - sd->card_dstatus = bcmswap32(*(uint32 *)&spi_inbuf2[datalen + CMDLEN ]); - } else if (sd->wordlen == 2) { /* 16bit spid */ - sd->card_dstatus = (bcmswap16(*(uint16 *)&spi_inbuf2[datalen + CMDLEN ]) | - (bcmswap16(*(uint16 *)&spi_inbuf2[datalen + CMDLEN + 2]) << 16)); - } else { - sd_err(("%s: Host is %d bit machine, could not read SPI dstatus.\n", - __FUNCTION__, 8 * sd->wordlen)); - return ERROR; - } - - if (sd->card_dstatus) - sd_trace(("dstatus after byte rewrite = 0x%x\n", sd->card_dstatus)); - - return (BCME_OK); -} - -/* Program the response delay corresponding to the spi function */ -static int -bcmspi_prog_resp_delay(sdioh_info_t *sd, int func, uint8 resp_delay) -{ - if (sd->resp_delay_all == FALSE) - return (BCME_OK); - - if (sd->prev_fun == func) - return (BCME_OK); - - if (F0_RESPONSE_DELAY == F1_RESPONSE_DELAY) - return (BCME_OK); - - bcmspi_card_byterewrite(sd, SPI_FUNC_0, SPID_RESPONSE_DELAY, resp_delay); - - /* Remember function for which to avoid reprogramming resp-delay in next iteration */ - sd->prev_fun = func; - - return (BCME_OK); - -} - -#define GSPI_RESYNC_PATTERN 0x0 - -/* A resync pattern is a 32bit MOSI line with all zeros. Its a special command in gSPI. - * It resets the spi-bkplane logic so that all F1 related ping-pong buffer logic is - * synchronised and all queued resuests are cancelled. - */ -static int -bcmspi_resync_f1(sdioh_info_t *sd) -{ - uint32 cmd_arg = GSPI_RESYNC_PATTERN, data = 0, datalen = 0; - - - /* Set up and issue the SPI command. MSByte goes out on bus first. Increase datalen - * according to the wordlen mode(16/32bit) the device is in. - */ - ASSERT(sd->wordlen == 4 || sd->wordlen == 2); - datalen = ROUNDUP(datalen, sd->wordlen); - - /* Start by copying command in the spi-outbuffer */ - *(uint32 *)spi_outbuf2 = cmd_arg; - - /* for Write, put the data into the output buffer */ - *(uint32 *)&spi_outbuf2[CMDLEN] = data; - - /* +4 for cmd, +4 for dstatus */ - spi_sendrecv(sd, spi_outbuf2, spi_inbuf2, datalen + 8); - - /* Last 4bytes are dstatus. Device is configured to return status bits. */ - if (sd->wordlen == 4) { /* 32bit spid */ - sd->card_dstatus = bcmswap32(*(uint32 *)&spi_inbuf2[datalen + CMDLEN ]); - } else if (sd->wordlen == 2) { /* 16bit spid */ - sd->card_dstatus = (bcmswap16(*(uint16 *)&spi_inbuf2[datalen + CMDLEN ]) | - (bcmswap16(*(uint16 *)&spi_inbuf2[datalen + CMDLEN + 2]) << 16)); - } else { - sd_err(("%s: Host is %d bit machine, could not read SPI dstatus.\n", - __FUNCTION__, 8 * sd->wordlen)); - return ERROR; - } - - if (sd->card_dstatus) - sd_trace(("dstatus after resync pattern write = 0x%x\n", sd->card_dstatus)); - - return (BCME_OK); -} - -uint32 dstatus_count = 0; - -static int -bcmspi_update_stats(sdioh_info_t *sd, uint32 cmd_arg) -{ - uint32 dstatus = sd->card_dstatus; - struct spierrstats_t *spierrstats = &sd->spierrstats; - int err = SUCCESS; - - sd_trace(("cmd = 0x%x, dstatus = 0x%x\n", cmd_arg, dstatus)); - - /* Store dstatus of last few gSPI transactions */ - spierrstats->dstatus[dstatus_count % NUM_PREV_TRANSACTIONS] = dstatus; - spierrstats->spicmd[dstatus_count % NUM_PREV_TRANSACTIONS] = cmd_arg; - dstatus_count++; - - if (sd->card_init_done == FALSE) - return err; - - if (dstatus & STATUS_DATA_NOT_AVAILABLE) { - spierrstats->dna++; - sd_trace(("Read data not available on F1 addr = 0x%x\n", - GFIELD(cmd_arg, SPI_REG_ADDR))); - /* Clear dna bit */ - bcmspi_card_byterewrite(sd, SPI_FUNC_0, SPID_INTR_REG, DATA_UNAVAILABLE); - } - - if (dstatus & STATUS_UNDERFLOW) { - spierrstats->rdunderflow++; - sd_err(("FIFO underflow happened due to current F2 read command.\n")); - } - - if (dstatus & STATUS_OVERFLOW) { - spierrstats->wroverflow++; - sd_err(("FIFO overflow happened due to current (F1/F2) write command.\n")); - bcmspi_card_byterewrite(sd, SPI_FUNC_0, SPID_INTR_REG, F1_OVERFLOW); - bcmspi_resync_f1(sd); - sd_err(("Recovering from F1 FIFO overflow.\n")); - } - - if (dstatus & STATUS_F2_INTR) { - spierrstats->f2interrupt++; - sd_trace(("Interrupt from F2. SW should clear corresponding IntStatus bits\n")); - } - - if (dstatus & STATUS_F3_INTR) { - spierrstats->f3interrupt++; - sd_err(("Interrupt from F3. SW should clear corresponding IntStatus bits\n")); - } - - if (dstatus & STATUS_HOST_CMD_DATA_ERR) { - spierrstats->hostcmddataerr++; - sd_err(("Error in CMD or Host data, detected by CRC/Checksum (optional)\n")); - } - - if (dstatus & STATUS_F2_PKT_AVAILABLE) { - spierrstats->f2pktavailable++; - sd_trace(("Packet is available/ready in F2 TX FIFO\n")); - sd_trace(("Packet length = %d\n", sd->dwordmode ? - ((dstatus & STATUS_F2_PKT_LEN_MASK) >> (STATUS_F2_PKT_LEN_SHIFT - 2)) : - ((dstatus & STATUS_F2_PKT_LEN_MASK) >> STATUS_F2_PKT_LEN_SHIFT))); - } - - if (dstatus & STATUS_F3_PKT_AVAILABLE) { - spierrstats->f3pktavailable++; - sd_err(("Packet is available/ready in F3 TX FIFO\n")); - sd_err(("Packet length = %d\n", - (dstatus & STATUS_F3_PKT_LEN_MASK) >> STATUS_F3_PKT_LEN_SHIFT)); - } - - return err; -} - -extern int -sdioh_abort(sdioh_info_t *sd, uint func) -{ - return 0; -} - -int -sdioh_start(sdioh_info_t *sd, int stage) -{ - return SUCCESS; -} - -int -sdioh_stop(sdioh_info_t *sd) -{ - return SUCCESS; -} - -int -sdioh_waitlockfree(sdioh_info_t *sd) -{ - return SUCCESS; -} - - -/* - * Private/Static work routines - */ -static int -bcmspi_host_init(sdioh_info_t *sd) -{ - - /* Default power on mode */ - sd->sd_mode = SDIOH_MODE_SPI; - sd->polled_mode = TRUE; - sd->host_init_done = TRUE; - sd->card_init_done = FALSE; - sd->adapter_slot = 1; - - return (SUCCESS); -} - -static int -get_client_blocksize(sdioh_info_t *sd) -{ - uint32 regdata[2]; - int status; - - /* Find F1/F2/F3 max packet size */ - if ((status = bcmspi_card_regread(sd, 0, SPID_F1_INFO_REG, - 8, regdata)) != SUCCESS) { - return status; - } - - sd_trace(("pkt_size regdata[0] = 0x%x, regdata[1] = 0x%x\n", - regdata[0], regdata[1])); - - sd->client_block_size[1] = (regdata[0] & F1_MAX_PKT_SIZE) >> 2; - sd_trace(("Func1 blocksize = %d\n", sd->client_block_size[1])); - ASSERT(sd->client_block_size[1] == BLOCK_SIZE_F1); - - sd->client_block_size[2] = ((regdata[0] >> 16) & F2_MAX_PKT_SIZE) >> 2; - sd_trace(("Func2 blocksize = %d\n", sd->client_block_size[2])); - ASSERT(sd->client_block_size[2] == BLOCK_SIZE_F2); - - sd->client_block_size[3] = (regdata[1] & F3_MAX_PKT_SIZE) >> 2; - sd_trace(("Func3 blocksize = %d\n", sd->client_block_size[3])); - ASSERT(sd->client_block_size[3] == BLOCK_SIZE_F3); - - return 0; -} - -static int -bcmspi_client_init(sdioh_info_t *sd) -{ - uint32 status_en_reg = 0; - sd_trace(("%s: Powering up slot %d\n", __FUNCTION__, sd->adapter_slot)); - -#ifndef BCMSPI_ANDROID -#ifdef HSMODE - if (!spi_start_clock(sd, (uint16)sd_divisor)) { - sd_err(("spi_start_clock failed\n")); - return ERROR; - } -#else - /* Start at ~400KHz clock rate for initialization */ - if (!spi_start_clock(sd, 128)) { - sd_err(("spi_start_clock failed\n")); - return ERROR; - } -#endif /* HSMODE */ -#endif /* !BCMSPI_ANDROID */ - - if (!bcmspi_host_device_init_adapt(sd)) { - sd_err(("bcmspi_host_device_init_adapt failed\n")); - return ERROR; - } - - if (!bcmspi_test_card(sd)) { - sd_err(("bcmspi_test_card failed\n")); - return ERROR; - } - - sd->num_funcs = SPI_MAX_IOFUNCS; - - get_client_blocksize(sd); - - /* Apply resync pattern cmd with all zeros to reset spi-bkplane F1 logic */ - bcmspi_resync_f1(sd); - - sd->dwordmode = FALSE; - - bcmspi_card_regread(sd, 0, SPID_STATUS_ENABLE, 1, &status_en_reg); - - sd_trace(("%s: Enabling interrupt with dstatus \n", __FUNCTION__)); - status_en_reg |= INTR_WITH_STATUS; - - if (bcmspi_card_regwrite(sd, SPI_FUNC_0, SPID_STATUS_ENABLE, 1, - status_en_reg & 0xff) != SUCCESS) { - sd_err(("%s: Unable to set response delay for all fun's.\n", __FUNCTION__)); - return ERROR; - } - -#ifndef HSMODE -#ifndef BCMSPI_ANDROID - /* After configuring for High-Speed mode, set the desired clock rate. */ - if (!spi_start_clock(sd, 4)) { - sd_err(("spi_start_clock failed\n")); - return ERROR; - } -#endif /* !BCMSPI_ANDROID */ -#endif /* HSMODE */ - - /* check to see if the response delay needs to be programmed properly */ - { - uint32 f1_respdelay = 0; - bcmspi_card_regread(sd, 0, SPID_RESP_DELAY_F1, 1, &f1_respdelay); - if ((f1_respdelay == 0) || (f1_respdelay == 0xFF)) { - /* older sdiodevice core and has no separte resp delay for each of */ - sd_err(("older corerev < 4 so use the same resp delay for all funcs\n")); - sd->resp_delay_new = FALSE; - } - else { - /* older sdiodevice core and has no separte resp delay for each of */ - int ret_val; - sd->resp_delay_new = TRUE; - sd_err(("new corerev >= 4 so set the resp delay for each of the funcs\n")); - sd_trace(("resp delay for funcs f0(%d), f1(%d), f2(%d), f3(%d)\n", - GSPI_F0_RESP_DELAY, GSPI_F1_RESP_DELAY, - GSPI_F2_RESP_DELAY, GSPI_F3_RESP_DELAY)); - ret_val = bcmspi_card_regwrite(sd, SPI_FUNC_0, SPID_RESP_DELAY_F0, 1, - GSPI_F0_RESP_DELAY); - if (ret_val != SUCCESS) { - sd_err(("%s: Unable to set response delay for F0\n", __FUNCTION__)); - return ERROR; - } - ret_val = bcmspi_card_regwrite(sd, SPI_FUNC_0, SPID_RESP_DELAY_F1, 1, - GSPI_F1_RESP_DELAY); - if (ret_val != SUCCESS) { - sd_err(("%s: Unable to set response delay for F1\n", __FUNCTION__)); - return ERROR; - } - ret_val = bcmspi_card_regwrite(sd, SPI_FUNC_0, SPID_RESP_DELAY_F2, 1, - GSPI_F2_RESP_DELAY); - if (ret_val != SUCCESS) { - sd_err(("%s: Unable to set response delay for F2\n", __FUNCTION__)); - return ERROR; - } - ret_val = bcmspi_card_regwrite(sd, SPI_FUNC_0, SPID_RESP_DELAY_F3, 1, - GSPI_F3_RESP_DELAY); - if (ret_val != SUCCESS) { - sd_err(("%s: Unable to set response delay for F2\n", __FUNCTION__)); - return ERROR; - } - } - } - - - sd->card_init_done = TRUE; - - /* get the device rev to program the prop respdelays */ - - return SUCCESS; -} - -static int -bcmspi_set_highspeed_mode(sdioh_info_t *sd, bool hsmode) -{ - uint32 regdata; - int status; - - if ((status = bcmspi_card_regread(sd, 0, SPID_CONFIG, - 4, ®data)) != SUCCESS) - return status; - - sd_trace(("In %s spih-ctrl = 0x%x \n", __FUNCTION__, regdata)); - - - if (hsmode == TRUE) { - sd_trace(("Attempting to enable High-Speed mode.\n")); - - if (regdata & HIGH_SPEED_MODE) { - sd_trace(("Device is already in High-Speed mode.\n")); - return status; - } else { - regdata |= HIGH_SPEED_MODE; - sd_trace(("Writing %08x to device at %08x\n", regdata, SPID_CONFIG)); - if ((status = bcmspi_card_regwrite(sd, 0, SPID_CONFIG, - 4, regdata)) != SUCCESS) { - return status; - } - } - } else { - sd_trace(("Attempting to disable High-Speed mode.\n")); - - if (regdata & HIGH_SPEED_MODE) { - regdata &= ~HIGH_SPEED_MODE; - sd_trace(("Writing %08x to device at %08x\n", regdata, SPID_CONFIG)); - if ((status = bcmspi_card_regwrite(sd, 0, SPID_CONFIG, - 4, regdata)) != SUCCESS) - return status; - } - else { - sd_trace(("Device is already in Low-Speed mode.\n")); - return status; - } - } -#ifndef BCMSPI_ANDROID - spi_controller_highspeed_mode(sd, hsmode); -#endif /* !BCMSPI_ANDROID */ - - return TRUE; -} - -#define bcmspi_find_curr_mode(sd) { \ - sd->wordlen = 2; \ - status = bcmspi_card_regread_fixedaddr(sd, 0, SPID_TEST_READ, 4, ®data); \ - regdata &= 0xff; \ - if ((regdata == 0xad) || (regdata == 0x5b) || \ - (regdata == 0x5d) || (regdata == 0x5a)) \ - break; \ - sd->wordlen = 4; \ - status = bcmspi_card_regread_fixedaddr(sd, 0, SPID_TEST_READ, 4, ®data); \ - regdata &= 0xff; \ - if ((regdata == 0xad) || (regdata == 0x5b) || \ - (regdata == 0x5d) || (regdata == 0x5a)) \ - break; \ - sd_trace(("Silicon testability issue: regdata = 0x%x." \ - " Expected 0xad, 0x5a, 0x5b or 0x5d.\n", regdata)); \ - OSL_DELAY(100000); \ -} - -#define INIT_ADAPT_LOOP 100 - -/* Adapt clock-phase-speed-bitwidth between host and device */ -static bool -bcmspi_host_device_init_adapt(sdioh_info_t *sd) -{ - uint32 wrregdata, regdata = 0; - int status; - int i; - - /* Due to a silicon testability issue, the first command from the Host - * to the device will get corrupted (first bit will be lost). So the - * Host should poll the device with a safe read request. ie: The Host - * should try to read F0 addr 0x14 using the Fixed address mode - * (This will prevent a unintended write command to be detected by device) - */ - for (i = 0; i < INIT_ADAPT_LOOP; i++) { - /* If device was not power-cycled it will stay in 32bit mode with - * response-delay-all bit set. Alternate the iteration so that - * read either with or without response-delay for F0 to succeed. - */ - bcmspi_find_curr_mode(sd); - sd->resp_delay_all = (i & 0x1) ? TRUE : FALSE; - - bcmspi_find_curr_mode(sd); - sd->dwordmode = TRUE; - - bcmspi_find_curr_mode(sd); - sd->dwordmode = FALSE; - } - - /* Bail out, device not detected */ - if (i == INIT_ADAPT_LOOP) - return FALSE; - - /* Softreset the spid logic */ - if ((sd->dwordmode) || (sd->wordlen == 4)) { - bcmspi_card_regwrite(sd, 0, SPID_RESET_BP, 1, RESET_ON_WLAN_BP_RESET|RESET_SPI); - bcmspi_card_regread(sd, 0, SPID_RESET_BP, 1, ®data); - sd_trace(("reset reg read = 0x%x\n", regdata)); - sd_trace(("dwordmode = %d, wordlen = %d, resp_delay_all = %d\n", sd->dwordmode, - sd->wordlen, sd->resp_delay_all)); - /* Restore default state after softreset */ - sd->wordlen = 2; - sd->dwordmode = FALSE; - } - - if (sd->wordlen == 4) { - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_READ, 4, ®data)) != - SUCCESS) - return FALSE; - if (regdata == TEST_RO_DATA_32BIT_LE) { - sd_trace(("Spid is already in 32bit LE mode. Value read = 0x%x\n", - regdata)); - sd_trace(("Spid power was left on.\n")); - } else { - sd_err(("Spid power was left on but signature read failed." - " Value read = 0x%x\n", regdata)); - return FALSE; - } - } else { - sd->wordlen = 2; - -#define CTRL_REG_DEFAULT 0x00010430 /* according to the host m/c */ - - wrregdata = (CTRL_REG_DEFAULT); - - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_READ, 4, ®data)) != SUCCESS) - return FALSE; - sd_trace(("(we are still in 16bit mode) 32bit READ LE regdata = 0x%x\n", regdata)); - -#ifndef HSMODE - wrregdata |= (CLOCK_PHASE | CLOCK_POLARITY); - wrregdata &= ~HIGH_SPEED_MODE; - bcmspi_card_regwrite(sd, 0, SPID_CONFIG, 4, wrregdata); -#endif /* HSMODE */ - - for (i = 0; i < INIT_ADAPT_LOOP; i++) { - if ((regdata == 0xfdda7d5b) || (regdata == 0xfdda7d5a)) { - sd_trace(("0xfeedbead was leftshifted by 1-bit.\n")); - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_READ, 4, - ®data)) != SUCCESS) - return FALSE; - } - OSL_DELAY(1000); - } - - - /* Change to host controller intr-polarity of active-low */ - wrregdata &= ~INTR_POLARITY; - sd_trace(("(we are still in 16bit mode) 32bit Write LE reg-ctrl-data = 0x%x\n", - wrregdata)); - /* Change to 32bit mode */ - wrregdata |= WORD_LENGTH_32; - bcmspi_card_regwrite(sd, 0, SPID_CONFIG, 4, wrregdata); - - /* Change command/data packaging in 32bit LE mode */ - sd->wordlen = 4; - - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_READ, 4, ®data)) != SUCCESS) - return FALSE; - - if (regdata == TEST_RO_DATA_32BIT_LE) { - sd_trace(("Read spid passed. Value read = 0x%x\n", regdata)); - sd_trace(("Spid had power-on cycle OR spi was soft-resetted \n")); - } else { - sd_err(("Stale spid reg values read as it was kept powered. Value read =" - "0x%x\n", regdata)); - return FALSE; - } - } - - - return TRUE; -} - -static bool -bcmspi_test_card(sdioh_info_t *sd) -{ - uint32 regdata; - int status; - - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_READ, 4, ®data)) != SUCCESS) - return FALSE; - - if (regdata == (TEST_RO_DATA_32BIT_LE)) - sd_trace(("32bit LE regdata = 0x%x\n", regdata)); - else { - sd_trace(("Incorrect 32bit LE regdata = 0x%x\n", regdata)); - return FALSE; - } - - -#define RW_PATTERN1 0xA0A1A2A3 -#define RW_PATTERN2 0x4B5B6B7B - - regdata = RW_PATTERN1; - if ((status = bcmspi_card_regwrite(sd, 0, SPID_TEST_RW, 4, regdata)) != SUCCESS) - return FALSE; - regdata = 0; - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_RW, 4, ®data)) != SUCCESS) - return FALSE; - if (regdata != RW_PATTERN1) { - sd_err(("Write-Read spid failed. Value wrote = 0x%x, Value read = 0x%x\n", - RW_PATTERN1, regdata)); - return FALSE; - } else - sd_trace(("R/W spid passed. Value read = 0x%x\n", regdata)); - - regdata = RW_PATTERN2; - if ((status = bcmspi_card_regwrite(sd, 0, SPID_TEST_RW, 4, regdata)) != SUCCESS) - return FALSE; - regdata = 0; - if ((status = bcmspi_card_regread(sd, 0, SPID_TEST_RW, 4, ®data)) != SUCCESS) - return FALSE; - if (regdata != RW_PATTERN2) { - sd_err(("Write-Read spid failed. Value wrote = 0x%x, Value read = 0x%x\n", - RW_PATTERN2, regdata)); - return FALSE; - } else - sd_trace(("R/W spid passed. Value read = 0x%x\n", regdata)); - - return TRUE; -} - -static int -bcmspi_driver_init(sdioh_info_t *sd) -{ - sd_trace(("%s\n", __FUNCTION__)); - if ((bcmspi_host_init(sd)) != SUCCESS) { - return ERROR; - } - - if (bcmspi_client_init(sd) != SUCCESS) { - return ERROR; - } - - return SUCCESS; -} - -/* Read device reg */ -static int -bcmspi_card_regread(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 *data) -{ - int status; - uint32 cmd_arg, dstatus; - - ASSERT(regsize); - - if (func == 2) - sd_trace(("Reg access on F2 will generate error indication in dstatus bits.\n")); - - cmd_arg = 0; - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, 0); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); /* Incremental access */ - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, regsize == BLOCK_SIZE_F2 ? 0 : regsize); - - sd_trace(("%s: RD cmd_arg=0x%x func=%d regaddr=0x%x regsize=%d\n", - __FUNCTION__, cmd_arg, func, regaddr, regsize)); - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, data, regsize)) != SUCCESS) - return status; - - bcmspi_cmd_getdstatus(sd, &dstatus); - if (dstatus) - sd_trace(("dstatus =0x%x\n", dstatus)); - - return SUCCESS; -} - -static int -bcmspi_card_regread_fixedaddr(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 *data) -{ - - int status; - uint32 cmd_arg; - uint32 dstatus; - - ASSERT(regsize); - - if (func == 2) - sd_trace(("Reg access on F2 will generate error indication in dstatus bits.\n")); - - cmd_arg = 0; - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, 0); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 0); /* Fixed access */ - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, regsize); - - sd_trace(("%s: RD cmd_arg=0x%x func=%d regaddr=0x%x regsize=%d\n", - __FUNCTION__, cmd_arg, func, regaddr, regsize)); - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, data, regsize)) != SUCCESS) - return status; - - sd_trace(("%s: RD result=0x%x\n", __FUNCTION__, *data)); - - bcmspi_cmd_getdstatus(sd, &dstatus); - sd_trace(("dstatus =0x%x\n", dstatus)); - return SUCCESS; -} - -/* write a device register */ -static int -bcmspi_card_regwrite(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 data) -{ - int status; - uint32 cmd_arg, dstatus; - - ASSERT(regsize); - - cmd_arg = 0; - - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, 1); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); /* Incremental access */ - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, regsize == BLOCK_SIZE_F2 ? 0 : regsize); - - sd_trace(("%s: WR cmd_arg=0x%x func=%d regaddr=0x%x regsize=%d data=0x%x\n", - __FUNCTION__, cmd_arg, func, regaddr, regsize, data)); - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, &data, regsize)) != SUCCESS) - return status; - - bcmspi_cmd_getdstatus(sd, &dstatus); - if (dstatus) - sd_trace(("dstatus=0x%x\n", dstatus)); - - return SUCCESS; -} - -/* write a device register - 1 byte */ -static int -bcmspi_card_bytewrite(sdioh_info_t *sd, int func, uint32 regaddr, uint8 *byte) -{ - int status; - uint32 cmd_arg; - uint32 dstatus; - uint32 data = (uint32)(*byte); - - cmd_arg = 0; - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); /* Incremental access */ - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, regaddr); - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, 1); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, 1); - - sd_trace(("%s: WR cmd_arg=0x%x func=%d regaddr=0x%x data=0x%x\n", - __FUNCTION__, cmd_arg, func, regaddr, data)); - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, &data, 1)) != SUCCESS) - return status; - - bcmspi_cmd_getdstatus(sd, &dstatus); - if (dstatus) - sd_trace(("dstatus =0x%x\n", dstatus)); - - return SUCCESS; -} - -void -bcmspi_cmd_getdstatus(sdioh_info_t *sd, uint32 *dstatus_buffer) -{ - *dstatus_buffer = sd->card_dstatus; -} - -/* 'data' is of type uint32 whereas other buffers are of type uint8 */ -static int -bcmspi_cmd_issue(sdioh_info_t *sd, bool use_dma, uint32 cmd_arg, - uint32 *data, uint32 datalen) -{ - uint32 i, j; - uint8 resp_delay = 0; - int err = SUCCESS; - uint32 hostlen; - uint32 spilen = 0; - uint32 dstatus_idx = 0; - uint16 templen, buslen, len, *ptr = NULL; - - sd_trace(("spi cmd = 0x%x\n", cmd_arg)); - - if (DWORDMODE_ON) { - spilen = GFIELD(cmd_arg, SPI_LEN); - if ((GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_0) || - (GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_1)) - dstatus_idx = spilen * 3; - - if ((GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_2) && - (GFIELD(cmd_arg, SPI_RW_FLAG) == 1)) { - spilen = spilen << 2; - dstatus_idx = (spilen % 16) ? (16 - (spilen % 16)) : 0; - /* convert len to mod16 size */ - spilen = ROUNDUP(spilen, 16); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, (spilen >> 2)); - } - } - - /* Set up and issue the SPI command. MSByte goes out on bus first. Increase datalen - * according to the wordlen mode(16/32bit) the device is in. - */ - if (sd->wordlen == 4) { /* 32bit spid */ - *(uint32 *)spi_outbuf = bcmswap32(cmd_arg); - if (datalen & 0x3) - datalen += (4 - (datalen & 0x3)); - } else if (sd->wordlen == 2) { /* 16bit spid */ - *(uint16 *)spi_outbuf = bcmswap16(cmd_arg & 0xffff); - *(uint16 *)&spi_outbuf[2] = bcmswap16((cmd_arg & 0xffff0000) >> 16); - if (datalen & 0x1) - datalen++; - if (datalen < 4) - datalen = ROUNDUP(datalen, 4); - } else { - sd_err(("Host is %d bit spid, could not create SPI command.\n", - 8 * sd->wordlen)); - return ERROR; - } - - /* for Write, put the data into the output buffer */ - if (GFIELD(cmd_arg, SPI_RW_FLAG) == 1) { - /* We send len field of hw-header always a mod16 size, both from host and dongle */ - if (DWORDMODE_ON) { - if (GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_2) { - ptr = (uint16 *)&data[0]; - templen = *ptr; - /* ASSERT(*ptr == ~*(ptr + 1)); */ - templen = ROUNDUP(templen, 16); - *ptr = templen; - sd_trace(("actual tx len = %d\n", (uint16)(~*(ptr+1)))); - } - } - - if (datalen != 0) { - for (i = 0; i < datalen/4; i++) { - if (sd->wordlen == 4) { /* 32bit spid */ - *(uint32 *)&spi_outbuf[i * 4 + CMDLEN] = - bcmswap32(data[i]); - } else if (sd->wordlen == 2) { /* 16bit spid */ - *(uint16 *)&spi_outbuf[i * 4 + CMDLEN] = - bcmswap16(data[i] & 0xffff); - *(uint16 *)&spi_outbuf[i * 4 + CMDLEN + 2] = - bcmswap16((data[i] & 0xffff0000) >> 16); - } - } - } - } - - /* Append resp-delay number of bytes and clock them out for F0/1/2 reads. */ - if ((GFIELD(cmd_arg, SPI_RW_FLAG) == 0)) { - int func = GFIELD(cmd_arg, SPI_FUNCTION); - switch (func) { - case 0: - if (sd->resp_delay_new) - resp_delay = GSPI_F0_RESP_DELAY; - else - resp_delay = sd->resp_delay_all ? F0_RESPONSE_DELAY : 0; - break; - case 1: - if (sd->resp_delay_new) - resp_delay = GSPI_F1_RESP_DELAY; - else - resp_delay = F1_RESPONSE_DELAY; - break; - case 2: - if (sd->resp_delay_new) - resp_delay = GSPI_F2_RESP_DELAY; - else - resp_delay = sd->resp_delay_all ? F2_RESPONSE_DELAY : 0; - break; - default: - ASSERT(0); - break; - } - /* Program response delay */ - if (sd->resp_delay_new == FALSE) - bcmspi_prog_resp_delay(sd, func, resp_delay); - } - - /* +4 for cmd and +4 for dstatus */ - hostlen = datalen + 8 + resp_delay; - hostlen += dstatus_idx; -#ifdef BCMSPI_ANDROID - if (hostlen%4) { - sd_err(("Unaligned data len %d, hostlen %d\n", - datalen, hostlen)); -#endif /* BCMSPI_ANDROID */ - hostlen += (4 - (hostlen & 0x3)); -#ifdef BCMSPI_ANDROID - } -#endif /* BCMSPI_ANDROID */ - spi_sendrecv(sd, spi_outbuf, spi_inbuf, hostlen); - - /* for Read, get the data into the input buffer */ - if (datalen != 0) { - if (GFIELD(cmd_arg, SPI_RW_FLAG) == 0) { /* if read cmd */ - for (j = 0; j < datalen/4; j++) { - if (sd->wordlen == 4) { /* 32bit spid */ - data[j] = bcmswap32(*(uint32 *)&spi_inbuf[j * 4 + - CMDLEN + resp_delay]); - } else if (sd->wordlen == 2) { /* 16bit spid */ - data[j] = (bcmswap16(*(uint16 *)&spi_inbuf[j * 4 + - CMDLEN + resp_delay])) | - ((bcmswap16(*(uint16 *)&spi_inbuf[j * 4 + - CMDLEN + resp_delay + 2])) << 16); - } - } - - if ((DWORDMODE_ON) && (GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_2)) { - ptr = (uint16 *)&data[0]; - templen = *ptr; - buslen = len = ~(*(ptr + 1)); - buslen = ROUNDUP(buslen, 16); - /* populate actual len in hw-header */ - if (templen == buslen) - *ptr = len; - } - } - } - - /* Restore back the len field of the hw header */ - if (DWORDMODE_ON) { - if ((GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_2) && - (GFIELD(cmd_arg, SPI_RW_FLAG) == 1)) { - ptr = (uint16 *)&data[0]; - *ptr = (uint16)(~*(ptr+1)); - } - } - - dstatus_idx += (datalen + CMDLEN + resp_delay); - /* Last 4bytes are dstatus. Device is configured to return status bits. */ - if (sd->wordlen == 4) { /* 32bit spid */ - sd->card_dstatus = bcmswap32(*(uint32 *)&spi_inbuf[dstatus_idx]); - } else if (sd->wordlen == 2) { /* 16bit spid */ - sd->card_dstatus = (bcmswap16(*(uint16 *)&spi_inbuf[dstatus_idx]) | - (bcmswap16(*(uint16 *)&spi_inbuf[dstatus_idx + 2]) << 16)); - } else { - sd_err(("Host is %d bit machine, could not read SPI dstatus.\n", - 8 * sd->wordlen)); - return ERROR; - } - if (sd->card_dstatus == 0xffffffff) { - sd_err(("looks like not a GSPI device or device is not powered.\n")); - } - - err = bcmspi_update_stats(sd, cmd_arg); - - return err; - -} - -static int -bcmspi_card_buf(sdioh_info_t *sd, int rw, int func, bool fifo, - uint32 addr, int nbytes, uint32 *data) -{ - int status; - uint32 cmd_arg; - bool write = rw == SDIOH_READ ? 0 : 1; - uint retries = 0; - - bool enable; - uint32 spilen; - - cmd_arg = 0; - - ASSERT(nbytes); - ASSERT(nbytes <= sd->client_block_size[func]); - - if (write) sd->t_cnt++; else sd->r_cnt++; - - if (func == 2) { - /* Frame len check limited by gSPI. */ - if ((nbytes > 2000) && write) { - sd_trace((">2KB write: F2 wr of %d bytes\n", nbytes)); - } - /* ASSERT(nbytes <= 2048); Fix bigger len gspi issue and uncomment. */ - /* If F2 fifo on device is not ready to receive data, don't do F2 transfer */ - if (write) { - uint32 dstatus; - /* check F2 ready with cached one */ - bcmspi_cmd_getdstatus(sd, &dstatus); - if ((dstatus & STATUS_F2_RX_READY) == 0) { - retries = WAIT_F2RXFIFORDY; - enable = 0; - while (retries-- && !enable) { - OSL_DELAY(WAIT_F2RXFIFORDY_DELAY * 1000); - bcmspi_card_regread(sd, SPI_FUNC_0, SPID_STATUS_REG, 4, - &dstatus); - if (dstatus & STATUS_F2_RX_READY) - enable = TRUE; - } - if (!enable) { - struct spierrstats_t *spierrstats = &sd->spierrstats; - spierrstats->f2rxnotready++; - sd_err(("F2 FIFO is not ready to receive data.\n")); - return ERROR; - } - sd_trace(("No of retries on F2 ready %d\n", - (WAIT_F2RXFIFORDY - retries))); - } - } - } - - /* F2 transfers happen on 0 addr */ - addr = (func == 2) ? 0 : addr; - - /* In pio mode buffer is read using fixed address fifo in func 1 */ - if ((func == 1) && (fifo)) - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 0); - else - cmd_arg = SFIELD(cmd_arg, SPI_ACCESS, 1); - - cmd_arg = SFIELD(cmd_arg, SPI_FUNCTION, func); - cmd_arg = SFIELD(cmd_arg, SPI_REG_ADDR, addr); - cmd_arg = SFIELD(cmd_arg, SPI_RW_FLAG, write); - spilen = sd->data_xfer_count = MIN(sd->client_block_size[func], nbytes); - if ((sd->dwordmode == TRUE) && (GFIELD(cmd_arg, SPI_FUNCTION) == SPI_FUNC_2)) { - /* convert len to mod4 size */ - spilen = spilen + ((spilen & 0x3) ? (4 - (spilen & 0x3)): 0); - cmd_arg = SFIELD(cmd_arg, SPI_LEN, (spilen >> 2)); - } else - cmd_arg = SFIELD(cmd_arg, SPI_LEN, spilen); - - if ((func == 2) && (fifo == 1)) { - sd_data(("%s: %s func %d, %s, addr 0x%x, len %d bytes, r_cnt %d t_cnt %d\n", - __FUNCTION__, write ? "Wr" : "Rd", func, "INCR", - addr, nbytes, sd->r_cnt, sd->t_cnt)); - } - - sd_trace(("%s cmd_arg = 0x%x\n", __FUNCTION__, cmd_arg)); - sd_data(("%s: %s func %d, %s, addr 0x%x, len %d bytes, r_cnt %d t_cnt %d\n", - __FUNCTION__, write ? "Wd" : "Rd", func, "INCR", - addr, nbytes, sd->r_cnt, sd->t_cnt)); - - - if ((status = bcmspi_cmd_issue(sd, sd->sd_use_dma, cmd_arg, data, nbytes)) != SUCCESS) { - sd_err(("%s: cmd_issue failed for %s\n", __FUNCTION__, - (write ? "write" : "read"))); - return status; - } - - /* gSPI expects that hw-header-len is equal to spi-command-len */ - if ((func == 2) && (rw == SDIOH_WRITE) && (sd->dwordmode == FALSE)) { - ASSERT((uint16)sd->data_xfer_count == (uint16)(*data & 0xffff)); - ASSERT((uint16)sd->data_xfer_count == (uint16)(~((*data & 0xffff0000) >> 16))); - } - - if ((nbytes > 2000) && !write) { - sd_trace((">2KB read: F2 rd of %d bytes\n", nbytes)); - } - - return SUCCESS; -} - -/* Reset and re-initialize the device */ -int -sdioh_sdio_reset(sdioh_info_t *si) -{ - si->card_init_done = FALSE; - return bcmspi_client_init(si); -} - -SDIOH_API_RC -sdioh_gpioouten(sdioh_info_t *sd, uint32 gpio) -{ - return SDIOH_API_RC_FAIL; -} - -SDIOH_API_RC -sdioh_gpioout(sdioh_info_t *sd, uint32 gpio, bool enab) -{ - return SDIOH_API_RC_FAIL; -} - -bool -sdioh_gpioin(sdioh_info_t *sd, uint32 gpio) -{ - return FALSE; -} - -SDIOH_API_RC -sdioh_gpio_init(sdioh_info_t *sd) -{ - return SDIOH_API_RC_FAIL; -} diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_rates.h b/drivers/net/wireless/bcmdhd/bcmwifi_rates.h deleted file mode 100755 index 9896b23..0000000 --- a/drivers/net/wireless/bcmdhd/bcmwifi_rates.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Indices for 802.11 a/b/g/n/ac 1-3 chain symmetric transmit rates - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmwifi_rates.h 252708 2011-04-12 06:45:56Z $ - */ - -#ifndef _bcmwifi_rates_h_ -#define _bcmwifi_rates_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -#define WL_RATESET_SZ_DSSS 4 -#define WL_RATESET_SZ_OFDM 8 -#define WL_RATESET_SZ_HT_MCS 8 -#define WL_RATESET_SZ_VHT_MCS 10 - -#define WL_TX_CHAINS_MAX 3 - -#define WL_RATE_DISABLED (-128) - - -typedef enum wl_tx_bw { - WL_TX_BW_20, - WL_TX_BW_40, - WL_TX_BW_80, - WL_TX_BW_20IN40, - WL_TX_BW_20IN80, - WL_TX_BW_40IN80, - WL_TX_BW_ALL -} wl_tx_bw_t; - - - -typedef enum wl_tx_mode { - WL_TX_MODE_NONE, - WL_TX_MODE_STBC, - WL_TX_MODE_CDD, - WL_TX_MODE_SDM -} wl_tx_mode_t; - - - -typedef enum wl_tx_chains { - WL_TX_CHAINS_1 = 1, - WL_TX_CHAINS_2, - WL_TX_CHAINS_3 -} wl_tx_chains_t; - - - -typedef enum wl_tx_nss { - WL_TX_NSS_1 = 1, - WL_TX_NSS_2, - WL_TX_NSS_3 -} wl_tx_nss_t; - - -typedef enum clm_rates { - - - - WL_RATE_1X1_DSSS_1 = 0, - WL_RATE_1X1_DSSS_2 = 1, - WL_RATE_1X1_DSSS_5_5 = 2, - WL_RATE_1X1_DSSS_11 = 3, - - WL_RATE_1X1_OFDM_6 = 4, - WL_RATE_1X1_OFDM_9 = 5, - WL_RATE_1X1_OFDM_12 = 6, - WL_RATE_1X1_OFDM_18 = 7, - WL_RATE_1X1_OFDM_24 = 8, - WL_RATE_1X1_OFDM_36 = 9, - WL_RATE_1X1_OFDM_48 = 10, - WL_RATE_1X1_OFDM_54 = 11, - - WL_RATE_1X1_MCS0 = 12, - WL_RATE_1X1_MCS1 = 13, - WL_RATE_1X1_MCS2 = 14, - WL_RATE_1X1_MCS3 = 15, - WL_RATE_1X1_MCS4 = 16, - WL_RATE_1X1_MCS5 = 17, - WL_RATE_1X1_MCS6 = 18, - WL_RATE_1X1_MCS7 = 19, - - WL_RATE_1X1_VHT0SS1 = 12, - WL_RATE_1X1_VHT1SS1 = 13, - WL_RATE_1X1_VHT2SS1 = 14, - WL_RATE_1X1_VHT3SS1 = 15, - WL_RATE_1X1_VHT4SS1 = 16, - WL_RATE_1X1_VHT5SS1 = 17, - WL_RATE_1X1_VHT6SS1 = 18, - WL_RATE_1X1_VHT7SS1 = 19, - WL_RATE_1X1_VHT8SS1 = 20, - WL_RATE_1X1_VHT9SS1 = 21, - - - - - - WL_RATE_1X2_DSSS_1 = 22, - WL_RATE_1X2_DSSS_2 = 23, - WL_RATE_1X2_DSSS_5_5 = 24, - WL_RATE_1X2_DSSS_11 = 25, - - WL_RATE_1X2_CDD_OFDM_6 = 26, - WL_RATE_1X2_CDD_OFDM_9 = 27, - WL_RATE_1X2_CDD_OFDM_12 = 28, - WL_RATE_1X2_CDD_OFDM_18 = 29, - WL_RATE_1X2_CDD_OFDM_24 = 30, - WL_RATE_1X2_CDD_OFDM_36 = 31, - WL_RATE_1X2_CDD_OFDM_48 = 32, - WL_RATE_1X2_CDD_OFDM_54 = 33, - - WL_RATE_1X2_CDD_MCS0 = 34, - WL_RATE_1X2_CDD_MCS1 = 35, - WL_RATE_1X2_CDD_MCS2 = 36, - WL_RATE_1X2_CDD_MCS3 = 37, - WL_RATE_1X2_CDD_MCS4 = 38, - WL_RATE_1X2_CDD_MCS5 = 39, - WL_RATE_1X2_CDD_MCS6 = 40, - WL_RATE_1X2_CDD_MCS7 = 41, - - WL_RATE_1X2_VHT0SS1 = 34, - WL_RATE_1X2_VHT1SS1 = 35, - WL_RATE_1X2_VHT2SS1 = 36, - WL_RATE_1X2_VHT3SS1 = 37, - WL_RATE_1X2_VHT4SS1 = 38, - WL_RATE_1X2_VHT5SS1 = 39, - WL_RATE_1X2_VHT6SS1 = 40, - WL_RATE_1X2_VHT7SS1 = 41, - WL_RATE_1X2_VHT8SS1 = 42, - WL_RATE_1X2_VHT9SS1 = 43, - - - WL_RATE_2X2_STBC_MCS0 = 44, - WL_RATE_2X2_STBC_MCS1 = 45, - WL_RATE_2X2_STBC_MCS2 = 46, - WL_RATE_2X2_STBC_MCS3 = 47, - WL_RATE_2X2_STBC_MCS4 = 48, - WL_RATE_2X2_STBC_MCS5 = 49, - WL_RATE_2X2_STBC_MCS6 = 50, - WL_RATE_2X2_STBC_MCS7 = 51, - - WL_RATE_2X2_STBC_VHT0SS1 = 44, - WL_RATE_2X2_STBC_VHT1SS1 = 45, - WL_RATE_2X2_STBC_VHT2SS1 = 46, - WL_RATE_2X2_STBC_VHT3SS1 = 47, - WL_RATE_2X2_STBC_VHT4SS1 = 48, - WL_RATE_2X2_STBC_VHT5SS1 = 49, - WL_RATE_2X2_STBC_VHT6SS1 = 50, - WL_RATE_2X2_STBC_VHT7SS1 = 51, - WL_RATE_2X2_STBC_VHT8SS1 = 52, - WL_RATE_2X2_STBC_VHT9SS1 = 53, - - WL_RATE_2X2_SDM_MCS8 = 54, - WL_RATE_2X2_SDM_MCS9 = 55, - WL_RATE_2X2_SDM_MCS10 = 56, - WL_RATE_2X2_SDM_MCS11 = 57, - WL_RATE_2X2_SDM_MCS12 = 58, - WL_RATE_2X2_SDM_MCS13 = 59, - WL_RATE_2X2_SDM_MCS14 = 60, - WL_RATE_2X2_SDM_MCS15 = 61, - - WL_RATE_2X2_VHT0SS2 = 54, - WL_RATE_2X2_VHT1SS2 = 55, - WL_RATE_2X2_VHT2SS2 = 56, - WL_RATE_2X2_VHT3SS2 = 57, - WL_RATE_2X2_VHT4SS2 = 58, - WL_RATE_2X2_VHT5SS2 = 59, - WL_RATE_2X2_VHT6SS2 = 60, - WL_RATE_2X2_VHT7SS2 = 61, - WL_RATE_2X2_VHT8SS2 = 62, - WL_RATE_2X2_VHT9SS2 = 63, - - - - - - WL_RATE_1X3_DSSS_1 = 64, - WL_RATE_1X3_DSSS_2 = 65, - WL_RATE_1X3_DSSS_5_5 = 66, - WL_RATE_1X3_DSSS_11 = 67, - - WL_RATE_1X3_CDD_OFDM_6 = 68, - WL_RATE_1X3_CDD_OFDM_9 = 69, - WL_RATE_1X3_CDD_OFDM_12 = 70, - WL_RATE_1X3_CDD_OFDM_18 = 71, - WL_RATE_1X3_CDD_OFDM_24 = 72, - WL_RATE_1X3_CDD_OFDM_36 = 73, - WL_RATE_1X3_CDD_OFDM_48 = 74, - WL_RATE_1X3_CDD_OFDM_54 = 75, - - WL_RATE_1X3_CDD_MCS0 = 76, - WL_RATE_1X3_CDD_MCS1 = 77, - WL_RATE_1X3_CDD_MCS2 = 78, - WL_RATE_1X3_CDD_MCS3 = 79, - WL_RATE_1X3_CDD_MCS4 = 80, - WL_RATE_1X3_CDD_MCS5 = 81, - WL_RATE_1X3_CDD_MCS6 = 82, - WL_RATE_1X3_CDD_MCS7 = 83, - - WL_RATE_1X3_VHT0SS1 = 76, - WL_RATE_1X3_VHT1SS1 = 77, - WL_RATE_1X3_VHT2SS1 = 78, - WL_RATE_1X3_VHT3SS1 = 79, - WL_RATE_1X3_VHT4SS1 = 80, - WL_RATE_1X3_VHT5SS1 = 81, - WL_RATE_1X3_VHT6SS1 = 82, - WL_RATE_1X3_VHT7SS1 = 83, - WL_RATE_1X3_VHT8SS1 = 84, - WL_RATE_1X3_VHT9SS1 = 85, - - - WL_RATE_2X3_STBC_MCS0 = 86, - WL_RATE_2X3_STBC_MCS1 = 87, - WL_RATE_2X3_STBC_MCS2 = 88, - WL_RATE_2X3_STBC_MCS3 = 89, - WL_RATE_2X3_STBC_MCS4 = 90, - WL_RATE_2X3_STBC_MCS5 = 91, - WL_RATE_2X3_STBC_MCS6 = 92, - WL_RATE_2X3_STBC_MCS7 = 93, - - WL_RATE_2X3_STBC_VHT0SS1 = 86, - WL_RATE_2X3_STBC_VHT1SS1 = 87, - WL_RATE_2X3_STBC_VHT2SS1 = 88, - WL_RATE_2X3_STBC_VHT3SS1 = 89, - WL_RATE_2X3_STBC_VHT4SS1 = 90, - WL_RATE_2X3_STBC_VHT5SS1 = 91, - WL_RATE_2X3_STBC_VHT6SS1 = 92, - WL_RATE_2X3_STBC_VHT7SS1 = 93, - WL_RATE_2X3_STBC_VHT8SS1 = 94, - WL_RATE_2X3_STBC_VHT9SS1 = 95, - - WL_RATE_2X3_SDM_MCS8 = 96, - WL_RATE_2X3_SDM_MCS9 = 97, - WL_RATE_2X3_SDM_MCS10 = 98, - WL_RATE_2X3_SDM_MCS11 = 99, - WL_RATE_2X3_SDM_MCS12 = 100, - WL_RATE_2X3_SDM_MCS13 = 101, - WL_RATE_2X3_SDM_MCS14 = 102, - WL_RATE_2X3_SDM_MCS15 = 103, - - WL_RATE_2X3_VHT0SS2 = 96, - WL_RATE_2X3_VHT1SS2 = 97, - WL_RATE_2X3_VHT2SS2 = 98, - WL_RATE_2X3_VHT3SS2 = 99, - WL_RATE_2X3_VHT4SS2 = 100, - WL_RATE_2X3_VHT5SS2 = 101, - WL_RATE_2X3_VHT6SS2 = 102, - WL_RATE_2X3_VHT7SS2 = 103, - WL_RATE_2X3_VHT8SS2 = 104, - WL_RATE_2X3_VHT9SS2 = 105, - - - WL_RATE_3X3_SDM_MCS16 = 106, - WL_RATE_3X3_SDM_MCS17 = 107, - WL_RATE_3X3_SDM_MCS18 = 108, - WL_RATE_3X3_SDM_MCS19 = 109, - WL_RATE_3X3_SDM_MCS20 = 110, - WL_RATE_3X3_SDM_MCS21 = 111, - WL_RATE_3X3_SDM_MCS22 = 112, - WL_RATE_3X3_SDM_MCS23 = 113, - - WL_RATE_3X3_VHT0SS3 = 106, - WL_RATE_3X3_VHT1SS3 = 107, - WL_RATE_3X3_VHT2SS3 = 108, - WL_RATE_3X3_VHT3SS3 = 109, - WL_RATE_3X3_VHT4SS3 = 110, - WL_RATE_3X3_VHT5SS3 = 111, - WL_RATE_3X3_VHT6SS3 = 112, - WL_RATE_3X3_VHT7SS3 = 113, - WL_RATE_3X3_VHT8SS3 = 114, - WL_RATE_3X3_VHT9SS3 = 115, - - - WL_NUMRATES = 116 -} clm_rates_t; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/Makefile b/drivers/net/wireless/bcmdhd/include/Makefile deleted file mode 100644 index eca939f..0000000 --- a/drivers/net/wireless/bcmdhd/include/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# -# This script serves following purpose: -# -# 1. It generates native version information by querying -# automerger maintained database to see where src/include -# came from -# 2. For select components, as listed in compvers.sh -# it generates component version files -# -# Copyright 2005, Broadcom, Inc. -# -# $Id: Makefile 241686 2011-02-19 00:22:45Z prakashd $ -# - -SRCBASE := .. - -TARGETS := epivers.h - -ifdef VERBOSE -export VERBOSE -endif - -all release: epivers compvers - -# Generate epivers.h for native branch version -epivers: - bash epivers.sh - -# Generate epivers.h for native branch version -compvers: - @if [ -s "compvers.sh" ]; then \ - echo "Generating component versions, if any"; \ - bash compvers.sh; \ - else \ - echo "Skipping component version generation"; \ - fi - -# Generate epivers.h for native branch version -clean_compvers: - @if [ -s "compvers.sh" ]; then \ - echo "bash compvers.sh clean"; \ - bash compvers.sh clean; \ - else \ - echo "Skipping component version clean"; \ - fi - -clean: - rm -f $(TARGETS) *.prev - -clean_all: clean clean_compvers - -.PHONY: all release clean epivers compvers clean_compvers diff --git a/drivers/net/wireless/bcmdhd/include/bcmdevs.h b/drivers/net/wireless/bcmdhd/include/bcmdevs.h deleted file mode 100755 index c7e06ff..0000000 --- a/drivers/net/wireless/bcmdhd/include/bcmdevs.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Broadcom device-specific manifest constants. - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmdevs.h 329854 2012-04-27 01:42:28Z $ - */ - -#ifndef _BCMDEVS_H -#define _BCMDEVS_H - - -#define VENDOR_EPIGRAM 0xfeda -#define VENDOR_BROADCOM 0x14e4 -#define VENDOR_3COM 0x10b7 -#define VENDOR_NETGEAR 0x1385 -#define VENDOR_DIAMOND 0x1092 -#define VENDOR_INTEL 0x8086 -#define VENDOR_DELL 0x1028 -#define VENDOR_HP 0x103c -#define VENDOR_HP_COMPAQ 0x0e11 -#define VENDOR_APPLE 0x106b -#define VENDOR_SI_IMAGE 0x1095 -#define VENDOR_BUFFALO 0x1154 -#define VENDOR_TI 0x104c -#define VENDOR_RICOH 0x1180 -#define VENDOR_JMICRON 0x197b - - - -#define VENDOR_BROADCOM_PCMCIA 0x02d0 - - -#define VENDOR_BROADCOM_SDIO 0x00BF - - -#define BCM_DNGL_VID 0x0a5c -#define BCM_DNGL_BL_PID_4328 0xbd12 -#define BCM_DNGL_BL_PID_4322 0xbd13 -#define BCM_DNGL_BL_PID_4319 0xbd16 -#define BCM_DNGL_BL_PID_43236 0xbd17 -#define BCM_DNGL_BL_PID_4332 0xbd18 -#define BCM_DNGL_BL_PID_4330 0xbd19 -#define BCM_DNGL_BL_PID_4334 0xbd1a -#define BCM_DNGL_BL_PID_43239 0xbd1b -#define BCM_DNGL_BL_PID_4324 0xbd1c -#define BCM_DNGL_BL_PID_4360 0xbd1d - -#define BCM_DNGL_BDC_PID 0x0bdc -#define BCM_DNGL_JTAG_PID 0x4a44 - - -#define BCM_HWUSB_PID_43239 43239 - - -#define BCM4210_DEVICE_ID 0x1072 -#define BCM4230_DEVICE_ID 0x1086 -#define BCM4401_ENET_ID 0x170c -#define BCM3352_DEVICE_ID 0x3352 -#define BCM3360_DEVICE_ID 0x3360 -#define BCM4211_DEVICE_ID 0x4211 -#define BCM4231_DEVICE_ID 0x4231 -#define BCM4303_D11B_ID 0x4303 -#define BCM4311_D11G_ID 0x4311 -#define BCM4311_D11DUAL_ID 0x4312 -#define BCM4311_D11A_ID 0x4313 -#define BCM4328_D11DUAL_ID 0x4314 -#define BCM4328_D11G_ID 0x4315 -#define BCM4328_D11A_ID 0x4316 -#define BCM4318_D11G_ID 0x4318 -#define BCM4318_D11DUAL_ID 0x4319 -#define BCM4318_D11A_ID 0x431a -#define BCM4325_D11DUAL_ID 0x431b -#define BCM4325_D11G_ID 0x431c -#define BCM4325_D11A_ID 0x431d -#define BCM4306_D11G_ID 0x4320 -#define BCM4306_D11A_ID 0x4321 -#define BCM4306_UART_ID 0x4322 -#define BCM4306_V90_ID 0x4323 -#define BCM4306_D11DUAL_ID 0x4324 -#define BCM4306_D11G_ID2 0x4325 -#define BCM4321_D11N_ID 0x4328 -#define BCM4321_D11N2G_ID 0x4329 -#define BCM4321_D11N5G_ID 0x432a -#define BCM4322_D11N_ID 0x432b -#define BCM4322_D11N2G_ID 0x432c -#define BCM4322_D11N5G_ID 0x432d -#define BCM4329_D11N_ID 0x432e -#define BCM4329_D11N2G_ID 0x432f -#define BCM4329_D11N5G_ID 0x4330 -#define BCM4315_D11DUAL_ID 0x4334 -#define BCM4315_D11G_ID 0x4335 -#define BCM4315_D11A_ID 0x4336 -#define BCM4319_D11N_ID 0x4337 -#define BCM4319_D11N2G_ID 0x4338 -#define BCM4319_D11N5G_ID 0x4339 -#define BCM43231_D11N2G_ID 0x4340 -#define BCM43221_D11N2G_ID 0x4341 -#define BCM43222_D11N_ID 0x4350 -#define BCM43222_D11N2G_ID 0x4351 -#define BCM43222_D11N5G_ID 0x4352 -#define BCM43224_D11N_ID 0x4353 -#define BCM43224_D11N_ID_VEN1 0x0576 -#define BCM43226_D11N_ID 0x4354 -#define BCM43236_D11N_ID 0x4346 -#define BCM43236_D11N2G_ID 0x4347 -#define BCM43236_D11N5G_ID 0x4348 -#define BCM43225_D11N2G_ID 0x4357 -#define BCM43421_D11N_ID 0xA99D -#define BCM4313_D11N2G_ID 0x4727 -#define BCM4330_D11N_ID 0x4360 -#define BCM4330_D11N2G_ID 0x4361 -#define BCM4330_D11N5G_ID 0x4362 -#define BCM4336_D11N_ID 0x4343 -#define BCM6362_D11N_ID 0x435f -#define BCM4331_D11N_ID 0x4331 -#define BCM4331_D11N2G_ID 0x4332 -#define BCM4331_D11N5G_ID 0x4333 -#define BCM43237_D11N_ID 0x4355 -#define BCM43237_D11N5G_ID 0x4356 -#define BCM43227_D11N2G_ID 0x4358 -#define BCM43228_D11N_ID 0x4359 -#define BCM43228_D11N5G_ID 0x435a -#define BCM43362_D11N_ID 0x4363 -#define BCM43239_D11N_ID 0x4370 -#define BCM4324_D11N_ID 0x4374 -#define BCM43217_D11N2G_ID 0x43a9 -#define BCM43131_D11N2G_ID 0x43aa -#define BCM4314_D11N2G_ID 0x4364 -#define BCM43142_D11N2G_ID 0x4365 -#define BCM4334_D11N_ID 0x4380 -#define BCM4334_D11N2G_ID 0x4381 -#define BCM4334_D11N5G_ID 0x4382 -#define BCM43341_D11N_ID 0x4386 -#define BCM43341_D11N2G_ID 0x4387 -#define BCM43341_D11N5G_ID 0x4388 -#define BCM4360_D11AC_ID 0x43a0 -#define BCM4360_D11AC2G_ID 0x43a1 -#define BCM4360_D11AC5G_ID 0x43a2 - - -#define BCM943228HMB_SSID_VEN1 0x0607 -#define BCM94313HMGBL_SSID_VEN1 0x0608 -#define BCM94313HMG_SSID_VEN1 0x0609 - - -#define BCM4335_D11AC_ID 0x43ae -#define BCM4335_D11AC2G_ID 0x43af -#define BCM4335_D11AC5G_ID 0x43b0 -#define BCM4352_D11AC_ID 0x43b1 -#define BCM4352_D11AC2G_ID 0x43b2 -#define BCM4352_D11AC5G_ID 0x43b3 - -#define BCMGPRS_UART_ID 0x4333 -#define BCMGPRS2_UART_ID 0x4344 -#define FPGA_JTAGM_ID 0x43f0 -#define BCM_JTAGM_ID 0x43f1 -#define SDIOH_FPGA_ID 0x43f2 -#define BCM_SDIOH_ID 0x43f3 -#define SDIOD_FPGA_ID 0x43f4 -#define SPIH_FPGA_ID 0x43f5 -#define BCM_SPIH_ID 0x43f6 -#define MIMO_FPGA_ID 0x43f8 -#define BCM_JTAGM2_ID 0x43f9 -#define SDHCI_FPGA_ID 0x43fa -#define BCM4402_ENET_ID 0x4402 -#define BCM4402_V90_ID 0x4403 -#define BCM4410_DEVICE_ID 0x4410 -#define BCM4412_DEVICE_ID 0x4412 -#define BCM4430_DEVICE_ID 0x4430 -#define BCM4432_DEVICE_ID 0x4432 -#define BCM4704_ENET_ID 0x4706 -#define BCM4710_DEVICE_ID 0x4710 -#define BCM47XX_AUDIO_ID 0x4711 -#define BCM47XX_V90_ID 0x4712 -#define BCM47XX_ENET_ID 0x4713 -#define BCM47XX_EXT_ID 0x4714 -#define BCM47XX_GMAC_ID 0x4715 -#define BCM47XX_USBH_ID 0x4716 -#define BCM47XX_USBD_ID 0x4717 -#define BCM47XX_IPSEC_ID 0x4718 -#define BCM47XX_ROBO_ID 0x4719 -#define BCM47XX_USB20H_ID 0x471a -#define BCM47XX_USB20D_ID 0x471b -#define BCM47XX_ATA100_ID 0x471d -#define BCM47XX_SATAXOR_ID 0x471e -#define BCM47XX_GIGETH_ID 0x471f -#define BCM4712_MIPS_ID 0x4720 -#define BCM4716_DEVICE_ID 0x4722 -#define BCM47XX_SMBUS_EMU_ID 0x47fe -#define BCM47XX_XOR_EMU_ID 0x47ff -#define EPI41210_DEVICE_ID 0xa0fa -#define EPI41230_DEVICE_ID 0xa10e -#define JINVANI_SDIOH_ID 0x4743 -#define BCM27XX_SDIOH_ID 0x2702 -#define PCIXX21_FLASHMEDIA_ID 0x803b -#define PCIXX21_SDIOH_ID 0x803c -#define R5C822_SDIOH_ID 0x0822 -#define JMICRON_SDIOH_ID 0x2381 - - -#define BCM4306_CHIP_ID 0x4306 -#define BCM4311_CHIP_ID 0x4311 -#define BCM43111_CHIP_ID 43111 -#define BCM43112_CHIP_ID 43112 -#define BCM4312_CHIP_ID 0x4312 -#define BCM4313_CHIP_ID 0x4313 -#define BCM43131_CHIP_ID 43131 -#define BCM4315_CHIP_ID 0x4315 -#define BCM4318_CHIP_ID 0x4318 -#define BCM4319_CHIP_ID 0x4319 -#define BCM4320_CHIP_ID 0x4320 -#define BCM4321_CHIP_ID 0x4321 -#define BCM43217_CHIP_ID 43217 -#define BCM4322_CHIP_ID 0x4322 -#define BCM43221_CHIP_ID 43221 -#define BCM43222_CHIP_ID 43222 -#define BCM43224_CHIP_ID 43224 -#define BCM43225_CHIP_ID 43225 -#define BCM43227_CHIP_ID 43227 -#define BCM43228_CHIP_ID 43228 -#define BCM43226_CHIP_ID 43226 -#define BCM43231_CHIP_ID 43231 -#define BCM43234_CHIP_ID 43234 -#define BCM43235_CHIP_ID 43235 -#define BCM43236_CHIP_ID 43236 -#define BCM43237_CHIP_ID 43237 -#define BCM43238_CHIP_ID 43238 -#define BCM43239_CHIP_ID 43239 -#define BCM43420_CHIP_ID 43420 -#define BCM43421_CHIP_ID 43421 -#define BCM43428_CHIP_ID 43428 -#define BCM43431_CHIP_ID 43431 -#define BCM43460_CHIP_ID 43460 -#define BCM4325_CHIP_ID 0x4325 -#define BCM4328_CHIP_ID 0x4328 -#define BCM4329_CHIP_ID 0x4329 -#define BCM4331_CHIP_ID 0x4331 -#define BCM4336_CHIP_ID 0x4336 -#define BCM43362_CHIP_ID 43362 -#define BCM4330_CHIP_ID 0x4330 -#define BCM6362_CHIP_ID 0x6362 -#define BCM4314_CHIP_ID 0x4314 -#define BCM43142_CHIP_ID 43142 -#define BCM4324_CHIP_ID 0x4324 -#define BCM43242_CHIP_ID 43242 -#define BCM4334_CHIP_ID 0x4334 -#define BCM4360_CHIP_ID 0x4360 -#define BCM4352_CHIP_ID 0x4352 -#define BCM43526_CHIP_ID 0xAA06 -#define BCM43341_CHIP_ID 43341 -#define BCM43342_CHIP_ID 43342 - -#define BCM4335_CHIP_ID 0x4335 - -#define BCM4342_CHIP_ID 4342 -#define BCM4402_CHIP_ID 0x4402 -#define BCM4704_CHIP_ID 0x4704 -#define BCM4706_CHIP_ID 0x5300 -#define BCM4710_CHIP_ID 0x4710 -#define BCM4712_CHIP_ID 0x4712 -#define BCM4716_CHIP_ID 0x4716 -#define BCM47162_CHIP_ID 47162 -#define BCM4748_CHIP_ID 0x4748 -#define BCM4749_CHIP_ID 0x4749 -#define BCM4785_CHIP_ID 0x4785 -#define BCM5350_CHIP_ID 0x5350 -#define BCM5352_CHIP_ID 0x5352 -#define BCM5354_CHIP_ID 0x5354 -#define BCM5365_CHIP_ID 0x5365 -#define BCM5356_CHIP_ID 0x5356 -#define BCM5357_CHIP_ID 0x5357 -#define BCM53572_CHIP_ID 53572 - - -#define BCM4303_PKG_ID 2 -#define BCM4309_PKG_ID 1 -#define BCM4712LARGE_PKG_ID 0 -#define BCM4712SMALL_PKG_ID 1 -#define BCM4712MID_PKG_ID 2 -#define BCM4328USBD11G_PKG_ID 2 -#define BCM4328USBDUAL_PKG_ID 3 -#define BCM4328SDIOD11G_PKG_ID 4 -#define BCM4328SDIODUAL_PKG_ID 5 -#define BCM4329_289PIN_PKG_ID 0 -#define BCM4329_182PIN_PKG_ID 1 -#define BCM5354E_PKG_ID 1 -#define BCM4716_PKG_ID 8 -#define BCM4717_PKG_ID 9 -#define BCM4718_PKG_ID 10 -#define BCM5356_PKG_NONMODE 1 -#define BCM5358U_PKG_ID 8 -#define BCM5358_PKG_ID 9 -#define BCM47186_PKG_ID 10 -#define BCM5357_PKG_ID 11 -#define BCM5356U_PKG_ID 12 -#define BCM53572_PKG_ID 8 -#define BCM5357C0_PKG_ID 8 -#define BCM47188_PKG_ID 9 -#define BCM5358C0_PKG_ID 0xa -#define BCM5356C0_PKG_ID 0xb -#define BCM4331TT_PKG_ID 8 -#define BCM4331TN_PKG_ID 9 -#define BCM4331TNA0_PKG_ID 0xb -#define BCM4706L_PKG_ID 1 - -#define HDLSIM5350_PKG_ID 1 -#define HDLSIM_PKG_ID 14 -#define HWSIM_PKG_ID 15 -#define BCM43224_FAB_CSM 0x8 -#define BCM43224_FAB_SMIC 0xa -#define BCM4336_WLBGA_PKG_ID 0x8 -#define BCM4330_WLBGA_PKG_ID 0x0 -#define BCM4314PCIE_ARM_PKG_ID (8 | 0) -#define BCM4314SDIO_PKG_ID (8 | 1) -#define BCM4314PCIE_PKG_ID (8 | 2) -#define BCM4314SDIO_ARM_PKG_ID (8 | 3) -#define BCM4314SDIO_FPBGA_PKG_ID (8 | 4) -#define BCM4314DEV_PKG_ID (8 | 6) - -#define PCIXX21_FLASHMEDIA0_ID 0x8033 -#define PCIXX21_SDIOH0_ID 0x8034 - - -#define BFL_BTC2WIRE 0x00000001 -#define BFL_BTCOEX 0x00000001 -#define BFL_PACTRL 0x00000002 -#define BFL_AIRLINEMODE 0x00000004 -#define BFL_ADCDIV 0x00000008 -#define BFL_RFPLL 0x00000008 -#define BFL_ENETROBO 0x00000010 -#define BFL_NOPLLDOWN 0x00000020 -#define BFL_CCKHIPWR 0x00000040 -#define BFL_ENETADM 0x00000080 -#define BFL_ENETVLAN 0x00000100 -#define BFL_UNUSED 0x00000200 -#define BFL_NOPCI 0x00000400 -#define BFL_FEM 0x00000800 -#define BFL_EXTLNA 0x00001000 -#define BFL_HGPA 0x00002000 -#define BFL_BTC2WIRE_ALTGPIO 0x00004000 -#define BFL_ALTIQ 0x00008000 -#define BFL_NOPA 0x00010000 -#define BFL_RSSIINV 0x00020000 -#define BFL_PAREF 0x00040000 -#define BFL_3TSWITCH 0x00080000 -#define BFL_PHASESHIFT 0x00100000 -#define BFL_BUCKBOOST 0x00200000 -#define BFL_FEM_BT 0x00400000 -#define BFL_NOCBUCK 0x00800000 -#define BFL_CCKFAVOREVM 0x01000000 -#define BFL_PALDO 0x02000000 -#define BFL_LNLDO2_2P5 0x04000000 -#define BFL_FASTPWR 0x08000000 -#define BFL_UCPWRCTL_MININDX 0x08000000 -#define BFL_EXTLNA_5GHz 0x10000000 -#define BFL_TRSW_1by2 0x20000000 -#define BFL_LO_TRSW_R_5GHz 0x40000000 -#define BFL_ELNA_GAINDEF 0x80000000 -#define BFL_EXTLNA_TX 0x20000000 - - -#define BFL2_RXBB_INT_REG_DIS 0x00000001 -#define BFL2_APLL_WAR 0x00000002 -#define BFL2_TXPWRCTRL_EN 0x00000004 -#define BFL2_2X4_DIV 0x00000008 -#define BFL2_5G_PWRGAIN 0x00000010 -#define BFL2_PCIEWAR_OVR 0x00000020 -#define BFL2_CAESERS_BRD 0x00000040 -#define BFL2_BTC3WIRE 0x00000080 -#define BFL2_BTCLEGACY 0x00000080 -#define BFL2_SKWRKFEM_BRD 0x00000100 -#define BFL2_SPUR_WAR 0x00000200 -#define BFL2_GPLL_WAR 0x00000400 -#define BFL2_TRISTATE_LED 0x00000800 -#define BFL2_SINGLEANT_CCK 0x00001000 -#define BFL2_2G_SPUR_WAR 0x00002000 -#define BFL2_BPHY_ALL_TXCORES 0x00004000 -#define BFL2_FCC_BANDEDGE_WAR 0x00008000 -#define BFL2_GPLL_WAR2 0x00010000 -#define BFL2_IPALVLSHIFT_3P3 0x00020000 -#define BFL2_INTERNDET_TXIQCAL 0x00040000 -#define BFL2_XTALBUFOUTEN 0x00080000 - - - -#define BFL2_ANAPACTRL_2G 0x00100000 -#define BFL2_ANAPACTRL_5G 0x00200000 -#define BFL2_ELNACTRL_TRSW_2G 0x00400000 -#define BFL2_BT_SHARE_ANT0 0x00800000 -#define BFL2_TEMPSENSE_HIGHER 0x01000000 -#define BFL2_BTC3WIREONLY 0x02000000 -#define BFL2_PWR_NOMINAL 0x04000000 -#define BFL2_EXTLNA_PWRSAVE 0x08000000 - -#define BFL2_4313_RADIOREG 0x10000000 - -#define BFL2_SDR_EN 0x20000000 - - -#define BOARD_GPIO_BTC3W_IN 0x850 -#define BOARD_GPIO_BTC3W_OUT 0x020 -#define BOARD_GPIO_BTCMOD_IN 0x010 -#define BOARD_GPIO_BTCMOD_OUT 0x020 -#define BOARD_GPIO_BTC_IN 0x080 -#define BOARD_GPIO_BTC_OUT 0x100 -#define BOARD_GPIO_PACTRL 0x200 -#define BOARD_GPIO_12 0x1000 -#define BOARD_GPIO_13 0x2000 -#define BOARD_GPIO_BTC4_IN 0x0800 -#define BOARD_GPIO_BTC4_BT 0x2000 -#define BOARD_GPIO_BTC4_STAT 0x4000 -#define BOARD_GPIO_BTC4_WLAN 0x8000 -#define BOARD_GPIO_1_WLAN_PWR 0x02 -#define BOARD_GPIO_3_WLAN_PWR 0x08 -#define BOARD_GPIO_4_WLAN_PWR 0x10 - -#define GPIO_BTC4W_OUT_4312 0x010 -#define GPIO_BTC4W_OUT_43224 0x020 -#define GPIO_BTC4W_OUT_43224_SHARED 0x0e0 -#define GPIO_BTC4W_OUT_43225 0x0e0 -#define GPIO_BTC4W_OUT_43421 0x020 -#define GPIO_BTC4W_OUT_4313 0x060 -#define GPIO_BTC4W_OUT_4331_SHARED 0x010 - -#define PCI_CFG_GPIO_SCS 0x10 -#define PCI_CFG_GPIO_HWRAD 0x20 -#define PCI_CFG_GPIO_XTAL 0x40 -#define PCI_CFG_GPIO_PLL 0x80 - - -#define PLL_DELAY 150 -#define FREF_DELAY 200 -#define MIN_SLOW_CLK 32 -#define XTAL_ON_DELAY 1000 - - - -#define BCM943341WLABGS_SSID 0x062d - - -#define GPIO_NUMPINS 32 - - -#define RDL_RAM_BASE_4319 0x60000000 -#define RDL_RAM_BASE_4329 0x60000000 -#define RDL_RAM_SIZE_4319 0x48000 -#define RDL_RAM_SIZE_4329 0x48000 -#define RDL_RAM_SIZE_43236 0x70000 -#define RDL_RAM_BASE_43236 0x60000000 -#define RDL_RAM_SIZE_4328 0x60000 -#define RDL_RAM_BASE_4328 0x80000000 -#define RDL_RAM_SIZE_4322 0x60000 -#define RDL_RAM_BASE_4322 0x60000000 - - -#define MUXENAB_UART 0x00000001 -#define MUXENAB_GPIO 0x00000002 -#define MUXENAB_ERCX 0x00000004 -#define MUXENAB_JTAG 0x00000008 -#define MUXENAB_HOST_WAKE 0x00000010 -#define MUXENAB_I2S_EN 0x00000020 -#define MUXENAB_I2S_MASTER 0x00000040 -#define MUXENAB_I2S_FULL 0x00000080 -#define MUXENAB_SFLASH 0x00000100 -#define MUXENAB_RFSWCTRL0 0x00000200 -#define MUXENAB_RFSWCTRL1 0x00000400 -#define MUXENAB_RFSWCTRL2 0x00000800 -#define MUXENAB_SECI 0x00001000 -#define MUXENAB_BT_LEGACY 0x00002000 -#define MUXENAB_HOST_WAKE1 0x00004000 - - -#define FLASH_KERNEL_NFLASH 0x00000001 -#define FLASH_BOOT_NFLASH 0x00000002 - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h b/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h deleted file mode 100755 index 13d6557..0000000 --- a/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * SD-SPI Protocol Conversion - BCMSDH->gSPI Translation Layer - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmspibrcm.h 354197 2012-08-30 09:05:59Z $ - */ -#ifndef _BCM_SPI_BRCM_H -#define _BCM_SPI_BRCM_H - -#ifndef SPI_MAX_IOFUNCS -/* Maximum number of I/O funcs */ -#define SPI_MAX_IOFUNCS 4 -#endif -/* global msglevel for debug messages - bitvals come from sdiovar.h */ - -#if defined(DHD_DEBUG) -#define sd_err(x) do { if (sd_msglevel & SDH_ERROR_VAL) printf x; } while (0) -#define sd_trace(x) do { if (sd_msglevel & SDH_TRACE_VAL) printf x; } while (0) -#define sd_info(x) do { if (sd_msglevel & SDH_INFO_VAL) printf x; } while (0) -#define sd_debug(x) do { if (sd_msglevel & SDH_DEBUG_VAL) printf x; } while (0) -#define sd_data(x) do { if (sd_msglevel & SDH_DATA_VAL) printf x; } while (0) -#define sd_ctrl(x) do { if (sd_msglevel & SDH_CTRL_VAL) printf x; } while (0) -#else -#define sd_err(x) -#define sd_trace(x) -#define sd_info(x) -#define sd_debug(x) -#define sd_data(x) -#define sd_ctrl(x) -#endif - -#define sd_log(x) - -#define SDIOH_ASSERT(exp) \ - do { if (!(exp)) \ - printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \ - } while (0) - -#define BLOCK_SIZE_F1 64 -#define BLOCK_SIZE_F2 2048 -#define BLOCK_SIZE_F3 2048 - -/* internal return code */ -#define SUCCESS 0 -#undef ERROR -#define ERROR 1 -#define ERROR_UF 2 -#define ERROR_OF 3 - -/* private bus modes */ -#define SDIOH_MODE_SPI 0 - -#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */ -#define USE_MULTIBLOCK 0x4 - -struct sdioh_info { - uint cfg_bar; /* pci cfg address for bar */ - uint32 caps; /* cached value of capabilities reg */ -#ifndef BCMSPI_ANDROID - void *bar0; /* BAR0 for PCI Device */ -#endif /* !BCMSPI_ANDROID */ - osl_t *osh; /* osh handler */ - void *controller; /* Pointer to SPI Controller's private data struct */ -#ifndef BCMSPI_ANDROID - uint lockcount; /* nest count of spi_lock() calls */ - bool client_intr_enabled; /* interrupt connnected flag */ - bool intr_handler_valid; /* client driver interrupt handler valid */ - sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ - void *intr_handler_arg; /* argument to call interrupt handler */ -#endif /* !BCMSPI_ANDROID */ - bool initialized; /* card initialized */ - uint32 target_dev; /* Target device ID */ - uint32 intmask; /* Current active interrupts */ -#ifndef BCMSPI_ANDROID - void *sdos_info; /* Pointer to per-OS private data */ -#endif /* !BCMSPI_ANDROID */ - uint32 controller_type; /* Host controller type */ - uint8 version; /* Host Controller Spec Compliance Version */ - uint irq; /* Client irq */ - uint32 intrcount; /* Client interrupts */ - uint32 local_intrcount; /* Controller interrupts */ - bool host_init_done; /* Controller initted */ - bool card_init_done; /* Client SDIO interface initted */ - bool polled_mode; /* polling for command completion */ - - bool sd_use_dma; /* DMA on CMD53 */ - bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ - /* Must be on for sd_multiblock to be effective */ - bool use_client_ints; /* If this is false, make sure to restore */ - /* polling hack in wl_linux.c:wl_timer() */ - int adapter_slot; /* Maybe dealing with multiple slots/controllers */ - int sd_mode; /* SD1/SD4/SPI */ - int client_block_size[SPI_MAX_IOFUNCS]; /* Blocksize */ - uint32 data_xfer_count; /* Current transfer */ - uint16 card_rca; /* Current Address */ - uint8 num_funcs; /* Supported funcs on client */ - uint32 card_dstatus; /* 32bit device status */ - uint32 com_cis_ptr; - uint32 func_cis_ptr[SPI_MAX_IOFUNCS]; - void *dma_buf; - ulong dma_phys; - int r_cnt; /* rx count */ - int t_cnt; /* tx_count */ - uint32 wordlen; /* host processor 16/32bits */ - uint32 prev_fun; - uint32 chip; - uint32 chiprev; - bool resp_delay_all; - bool dwordmode; - bool resp_delay_new; - - struct spierrstats_t spierrstats; -}; - -/************************************************************ - * Internal interfaces: per-port references into bcmspibrcm.c - */ - -/* Global message bits */ -extern uint sd_msglevel; - -/************************************************************** - * Internal interfaces: bcmspibrcm.c references to per-port code - */ - -/* Interrupt (de)registration routines */ -extern int spi_register_irq(sdioh_info_t *sd, uint irq); -extern void spi_free_irq(uint irq, sdioh_info_t *sd); - -/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */ -extern void spi_lock(sdioh_info_t *sd); -extern void spi_unlock(sdioh_info_t *sd); - -/* Allocate/init/free per-OS private data */ -extern int spi_osinit(sdioh_info_t *sd); -extern void spi_osfree(sdioh_info_t *sd); - -#define SPI_RW_FLAG_M BITFIELD_MASK(1) /* Bit [31] - R/W Command Bit */ -#define SPI_RW_FLAG_S 31 -#define SPI_ACCESS_M BITFIELD_MASK(1) /* Bit [30] - Fixed/Incr Access */ -#define SPI_ACCESS_S 30 -#define SPI_FUNCTION_M BITFIELD_MASK(2) /* Bit [29:28] - Function Number */ -#define SPI_FUNCTION_S 28 -#define SPI_REG_ADDR_M BITFIELD_MASK(17) /* Bit [27:11] - Address */ -#define SPI_REG_ADDR_S 11 -#define SPI_LEN_M BITFIELD_MASK(11) /* Bit [10:0] - Packet length */ -#define SPI_LEN_S 0 - -#endif /* _BCM_SPI_BRCM_H */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h b/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h deleted file mode 100755 index f5246a5..0000000 --- a/drivers/net/wireless/bcmdhd/include/bcmsrom_fmt.h +++ /dev/null @@ -1,607 +0,0 @@ -/* - * SROM format definition. - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmsrom_fmt.h 327439 2012-04-13 17:44:48Z $ - */ - -#ifndef _bcmsrom_fmt_h_ -#define _bcmsrom_fmt_h_ - -#define SROM_MAXREV 11 /* max revisiton supported by driver */ - -/* Maximum srom: 6 Kilobits == 768 bytes */ -#define SROM_MAX 768 -#define SROM_MAXW 384 -#define VARS_MAX 4096 - -/* PCI fields */ -#define PCI_F0DEVID 48 - - -#define SROM_WORDS 64 - -#define SROM3_SWRGN_OFF 28 /* s/w region offset in words */ - -#define SROM_SSID 2 - -#define SROM_WL1LHMAXP 29 - -#define SROM_WL1LPAB0 30 -#define SROM_WL1LPAB1 31 -#define SROM_WL1LPAB2 32 - -#define SROM_WL1HPAB0 33 -#define SROM_WL1HPAB1 34 -#define SROM_WL1HPAB2 35 - -#define SROM_MACHI_IL0 36 -#define SROM_MACMID_IL0 37 -#define SROM_MACLO_IL0 38 -#define SROM_MACHI_ET0 39 -#define SROM_MACMID_ET0 40 -#define SROM_MACLO_ET0 41 -#define SROM_MACHI_ET1 42 -#define SROM_MACMID_ET1 43 -#define SROM_MACLO_ET1 44 -#define SROM3_MACHI 37 -#define SROM3_MACMID 38 -#define SROM3_MACLO 39 - -#define SROM_BXARSSI2G 40 -#define SROM_BXARSSI5G 41 - -#define SROM_TRI52G 42 -#define SROM_TRI5GHL 43 - -#define SROM_RXPO52G 45 - -#define SROM2_ENETPHY 45 - -#define SROM_AABREV 46 -/* Fields in AABREV */ -#define SROM_BR_MASK 0x00ff -#define SROM_CC_MASK 0x0f00 -#define SROM_CC_SHIFT 8 -#define SROM_AA0_MASK 0x3000 -#define SROM_AA0_SHIFT 12 -#define SROM_AA1_MASK 0xc000 -#define SROM_AA1_SHIFT 14 - -#define SROM_WL0PAB0 47 -#define SROM_WL0PAB1 48 -#define SROM_WL0PAB2 49 - -#define SROM_LEDBH10 50 -#define SROM_LEDBH32 51 - -#define SROM_WL10MAXP 52 - -#define SROM_WL1PAB0 53 -#define SROM_WL1PAB1 54 -#define SROM_WL1PAB2 55 - -#define SROM_ITT 56 - -#define SROM_BFL 57 -#define SROM_BFL2 28 -#define SROM3_BFL2 61 - -#define SROM_AG10 58 - -#define SROM_CCODE 59 - -#define SROM_OPO 60 - -#define SROM3_LEDDC 62 - -#define SROM_CRCREV 63 - -/* SROM Rev 4: Reallocate the software part of the srom to accomodate - * MIMO features. It assumes up to two PCIE functions and 440 bytes - * of useable srom i.e. the useable storage in chips with OTP that - * implements hardware redundancy. - */ - -#define SROM4_WORDS 220 - -#define SROM4_SIGN 32 -#define SROM4_SIGNATURE 0x5372 - -#define SROM4_BREV 33 - -#define SROM4_BFL0 34 -#define SROM4_BFL1 35 -#define SROM4_BFL2 36 -#define SROM4_BFL3 37 -#define SROM5_BFL0 37 -#define SROM5_BFL1 38 -#define SROM5_BFL2 39 -#define SROM5_BFL3 40 - -#define SROM4_MACHI 38 -#define SROM4_MACMID 39 -#define SROM4_MACLO 40 -#define SROM5_MACHI 41 -#define SROM5_MACMID 42 -#define SROM5_MACLO 43 - -#define SROM4_CCODE 41 -#define SROM4_REGREV 42 -#define SROM5_CCODE 34 -#define SROM5_REGREV 35 - -#define SROM4_LEDBH10 43 -#define SROM4_LEDBH32 44 -#define SROM5_LEDBH10 59 -#define SROM5_LEDBH32 60 - -#define SROM4_LEDDC 45 -#define SROM5_LEDDC 45 - -#define SROM4_AA 46 -#define SROM4_AA2G_MASK 0x00ff -#define SROM4_AA2G_SHIFT 0 -#define SROM4_AA5G_MASK 0xff00 -#define SROM4_AA5G_SHIFT 8 - -#define SROM4_AG10 47 -#define SROM4_AG32 48 - -#define SROM4_TXPID2G 49 -#define SROM4_TXPID5G 51 -#define SROM4_TXPID5GL 53 -#define SROM4_TXPID5GH 55 - -#define SROM4_TXRXC 61 -#define SROM4_TXCHAIN_MASK 0x000f -#define SROM4_TXCHAIN_SHIFT 0 -#define SROM4_RXCHAIN_MASK 0x00f0 -#define SROM4_RXCHAIN_SHIFT 4 -#define SROM4_SWITCH_MASK 0xff00 -#define SROM4_SWITCH_SHIFT 8 - - -/* Per-path fields */ -#define MAX_PATH_SROM 4 -#define SROM4_PATH0 64 -#define SROM4_PATH1 87 -#define SROM4_PATH2 110 -#define SROM4_PATH3 133 - -#define SROM4_2G_ITT_MAXP 0 -#define SROM4_2G_PA 1 -#define SROM4_5G_ITT_MAXP 5 -#define SROM4_5GLH_MAXP 6 -#define SROM4_5G_PA 7 -#define SROM4_5GL_PA 11 -#define SROM4_5GH_PA 15 - -/* Fields in the ITT_MAXP and 5GLH_MAXP words */ -#define B2G_MAXP_MASK 0xff -#define B2G_ITT_SHIFT 8 -#define B5G_MAXP_MASK 0xff -#define B5G_ITT_SHIFT 8 -#define B5GH_MAXP_MASK 0xff -#define B5GL_MAXP_SHIFT 8 - -/* All the miriad power offsets */ -#define SROM4_2G_CCKPO 156 -#define SROM4_2G_OFDMPO 157 -#define SROM4_5G_OFDMPO 159 -#define SROM4_5GL_OFDMPO 161 -#define SROM4_5GH_OFDMPO 163 -#define SROM4_2G_MCSPO 165 -#define SROM4_5G_MCSPO 173 -#define SROM4_5GL_MCSPO 181 -#define SROM4_5GH_MCSPO 189 -#define SROM4_CDDPO 197 -#define SROM4_STBCPO 198 -#define SROM4_BW40PO 199 -#define SROM4_BWDUPPO 200 - -#define SROM4_CRCREV 219 - - -/* SROM Rev 8: Make space for a 48word hardware header for PCIe rev >= 6. - * This is acombined srom for both MIMO and SISO boards, usable in - * the .130 4Kilobit OTP with hardware redundancy. - */ - -#define SROM8_SIGN 64 - -#define SROM8_BREV 65 - -#define SROM8_BFL0 66 -#define SROM8_BFL1 67 -#define SROM8_BFL2 68 -#define SROM8_BFL3 69 - -#define SROM8_MACHI 70 -#define SROM8_MACMID 71 -#define SROM8_MACLO 72 - -#define SROM8_CCODE 73 -#define SROM8_REGREV 74 - -#define SROM8_LEDBH10 75 -#define SROM8_LEDBH32 76 - -#define SROM8_LEDDC 77 - -#define SROM8_AA 78 - -#define SROM8_AG10 79 -#define SROM8_AG32 80 - -#define SROM8_TXRXC 81 - -#define SROM8_BXARSSI2G 82 -#define SROM8_BXARSSI5G 83 -#define SROM8_TRI52G 84 -#define SROM8_TRI5GHL 85 -#define SROM8_RXPO52G 86 - -#define SROM8_FEM2G 87 -#define SROM8_FEM5G 88 -#define SROM8_FEM_ANTSWLUT_MASK 0xf800 -#define SROM8_FEM_ANTSWLUT_SHIFT 11 -#define SROM8_FEM_TR_ISO_MASK 0x0700 -#define SROM8_FEM_TR_ISO_SHIFT 8 -#define SROM8_FEM_PDET_RANGE_MASK 0x00f8 -#define SROM8_FEM_PDET_RANGE_SHIFT 3 -#define SROM8_FEM_EXTPA_GAIN_MASK 0x0006 -#define SROM8_FEM_EXTPA_GAIN_SHIFT 1 -#define SROM8_FEM_TSSIPOS_MASK 0x0001 -#define SROM8_FEM_TSSIPOS_SHIFT 0 - -#define SROM8_THERMAL 89 - -/* Temp sense related entries */ -#define SROM8_MPWR_RAWTS 90 -#define SROM8_TS_SLP_OPT_CORRX 91 -/* FOC: freiquency offset correction, HWIQ: H/W IOCAL enable, IQSWP: IQ CAL swap disable */ -#define SROM8_FOC_HWIQ_IQSWP 92 - -#define SROM8_EXTLNAGAIN 93 - -/* Temperature delta for PHY calibration */ -#define SROM8_PHYCAL_TEMPDELTA 94 - -/* Measured power 1 & 2, 0-13 bits at offset 95, MSB 2 bits are unused for now. */ -#define SROM8_MPWR_1_AND_2 95 - - -/* Per-path offsets & fields */ -#define SROM8_PATH0 96 -#define SROM8_PATH1 112 -#define SROM8_PATH2 128 -#define SROM8_PATH3 144 - -#define SROM8_2G_ITT_MAXP 0 -#define SROM8_2G_PA 1 -#define SROM8_5G_ITT_MAXP 4 -#define SROM8_5GLH_MAXP 5 -#define SROM8_5G_PA 6 -#define SROM8_5GL_PA 9 -#define SROM8_5GH_PA 12 - -/* All the miriad power offsets */ -#define SROM8_2G_CCKPO 160 - -#define SROM8_2G_OFDMPO 161 -#define SROM8_5G_OFDMPO 163 -#define SROM8_5GL_OFDMPO 165 -#define SROM8_5GH_OFDMPO 167 - -#define SROM8_2G_MCSPO 169 -#define SROM8_5G_MCSPO 177 -#define SROM8_5GL_MCSPO 185 -#define SROM8_5GH_MCSPO 193 - -#define SROM8_CDDPO 201 -#define SROM8_STBCPO 202 -#define SROM8_BW40PO 203 -#define SROM8_BWDUPPO 204 - -/* SISO PA parameters are in the path0 spaces */ -#define SROM8_SISO 96 - -/* Legacy names for SISO PA paramters */ -#define SROM8_W0_ITTMAXP (SROM8_SISO + SROM8_2G_ITT_MAXP) -#define SROM8_W0_PAB0 (SROM8_SISO + SROM8_2G_PA) -#define SROM8_W0_PAB1 (SROM8_SISO + SROM8_2G_PA + 1) -#define SROM8_W0_PAB2 (SROM8_SISO + SROM8_2G_PA + 2) -#define SROM8_W1_ITTMAXP (SROM8_SISO + SROM8_5G_ITT_MAXP) -#define SROM8_W1_MAXP_LCHC (SROM8_SISO + SROM8_5GLH_MAXP) -#define SROM8_W1_PAB0 (SROM8_SISO + SROM8_5G_PA) -#define SROM8_W1_PAB1 (SROM8_SISO + SROM8_5G_PA + 1) -#define SROM8_W1_PAB2 (SROM8_SISO + SROM8_5G_PA + 2) -#define SROM8_W1_PAB0_LC (SROM8_SISO + SROM8_5GL_PA) -#define SROM8_W1_PAB1_LC (SROM8_SISO + SROM8_5GL_PA + 1) -#define SROM8_W1_PAB2_LC (SROM8_SISO + SROM8_5GL_PA + 2) -#define SROM8_W1_PAB0_HC (SROM8_SISO + SROM8_5GH_PA) -#define SROM8_W1_PAB1_HC (SROM8_SISO + SROM8_5GH_PA + 1) -#define SROM8_W1_PAB2_HC (SROM8_SISO + SROM8_5GH_PA + 2) - -#define SROM8_CRCREV 219 - -/* SROM REV 9 */ -#define SROM9_2GPO_CCKBW20 160 -#define SROM9_2GPO_CCKBW20UL 161 -#define SROM9_2GPO_LOFDMBW20 162 -#define SROM9_2GPO_LOFDMBW20UL 164 - -#define SROM9_5GLPO_LOFDMBW20 166 -#define SROM9_5GLPO_LOFDMBW20UL 168 -#define SROM9_5GMPO_LOFDMBW20 170 -#define SROM9_5GMPO_LOFDMBW20UL 172 -#define SROM9_5GHPO_LOFDMBW20 174 -#define SROM9_5GHPO_LOFDMBW20UL 176 - -#define SROM9_2GPO_MCSBW20 178 -#define SROM9_2GPO_MCSBW20UL 180 -#define SROM9_2GPO_MCSBW40 182 - -#define SROM9_5GLPO_MCSBW20 184 -#define SROM9_5GLPO_MCSBW20UL 186 -#define SROM9_5GLPO_MCSBW40 188 -#define SROM9_5GMPO_MCSBW20 190 -#define SROM9_5GMPO_MCSBW20UL 192 -#define SROM9_5GMPO_MCSBW40 194 -#define SROM9_5GHPO_MCSBW20 196 -#define SROM9_5GHPO_MCSBW20UL 198 -#define SROM9_5GHPO_MCSBW40 200 - -#define SROM9_PO_MCS32 202 -#define SROM9_PO_LOFDM40DUP 203 -#define SROM8_RXGAINERR_2G 205 -#define SROM8_RXGAINERR_5GL 206 -#define SROM8_RXGAINERR_5GM 207 -#define SROM8_RXGAINERR_5GH 208 -#define SROM8_RXGAINERR_5GU 209 -#define SROM8_SUBBAND_PPR 210 -#define SROM8_PCIEINGRESS_WAR 211 -#define SROM9_SAR 212 - -#define SROM8_NOISELVL_2G 213 -#define SROM8_NOISELVL_5GL 214 -#define SROM8_NOISELVL_5GM 215 -#define SROM8_NOISELVL_5GH 216 -#define SROM8_NOISELVL_5GU 217 - -#define SROM9_REV_CRC 219 - -#define SROM10_CCKPWROFFSET 218 -#define SROM10_SIGN 219 -#define SROM10_SWCTRLMAP_2G 220 -#define SROM10_CRCREV 229 - -#define SROM10_WORDS 230 -#define SROM10_SIGNATURE SROM4_SIGNATURE - - -/* SROM REV 11 */ -#define SROM11_BREV 65 - -#define SROM11_BFL0 66 -#define SROM11_BFL1 67 -#define SROM11_BFL2 68 -#define SROM11_BFL3 69 -#define SROM11_BFL4 70 -#define SROM11_BFL5 71 - -#define SROM11_MACHI 72 -#define SROM11_MACMID 73 -#define SROM11_MACLO 74 - -#define SROM11_CCODE 75 -#define SROM11_REGREV 76 - -#define SROM11_LEDBH10 77 -#define SROM11_LEDBH32 78 - -#define SROM11_LEDDC 79 - -#define SROM11_AA 80 - -#define SROM11_AGBG10 81 -#define SROM11_AGBG2A0 82 -#define SROM11_AGA21 83 - -#define SROM11_TXRXC 84 - -#define SROM11_FEM_CFG1 85 -#define SROM11_FEM_CFG2 86 - -/* Masks and offsets for FEM_CFG */ -#define SROM11_FEMCTRL_MASK 0xf800 -#define SROM11_FEMCTRL_SHIFT 11 -#define SROM11_PAPDCAP_MASK 0x0400 -#define SROM11_PAPDCAP_SHIFT 10 -#define SROM11_TWORANGETSSI_MASK 0x0200 -#define SROM11_TWORANGETSSI_SHIFT 9 -#define SROM11_PDGAIN_MASK 0x01f0 -#define SROM11_PDGAIN_SHIFT 4 -#define SROM11_EPAGAIN_MASK 0x000e -#define SROM11_EPAGAIN_SHIFT 1 -#define SROM11_TSSIPOSSLOPE_MASK 0x0001 -#define SROM11_TSSIPOSSLOPE_SHIFT 0 -#define SROM11_GAINCTRLSPH_MASK 0xf800 -#define SROM11_GAINCTRLSPH_SHIFT 11 - -#define SROM11_THERMAL 87 -#define SROM11_MPWR_RAWTS 88 -#define SROM11_TS_SLP_OPT_CORRX 89 -#define SROM11_PHYCAL_TEMPDELTA 92 -#define SROM11_MPWR_1_AND_2 93 - -/* Masks and offsets for Terrmal parameters */ -#define SROM11_TEMPS_PERIOD_MASK 0xf0 -#define SROM11_TEMPS_PERIOD_SHIFT 4 -#define SROM11_TEMPS_HYSTERESIS_MASK 0x0f -#define SROM11_TEMPS_HYSTERESIS_SHIFT 0 -#define SROM11_TEMPCORRX_MASK 0xfc -#define SROM11_TEMPCORRX_SHIFT 2 -#define SROM11_TEMPSENSE_OPTION_MASK 0x3 -#define SROM11_TEMPSENSE_OPTION_SHIFT 0 - -#define SROM11_PDOFF_40M_A0 101 -#define SROM11_PDOFF_40M_A1 102 -#define SROM11_PDOFF_40M_A2 103 -#define SROM11_PDOFF_80M_A0 104 -#define SROM11_PDOFF_80M_A1 105 -#define SROM11_PDOFF_80M_A2 106 - -#define SROM11_SUBBAND5GVER 107 - -/* Per-path fields and offset */ -#define MAX_PATH_SROM_11 3 -#define SROM11_PATH0 108 -#define SROM11_PATH1 128 -#define SROM11_PATH2 148 - -#define SROM11_2G_MAXP 0 -#define SROM11_2G_PA 1 -#define SROM11_RXGAINS1 4 -#define SROM11_RXGAINS 5 -#define SROM11_5GB1B0_MAXP 6 -#define SROM11_5GB3B2_MAXP 7 -#define SROM11_5GB0_PA 8 -#define SROM11_5GB1_PA 11 -#define SROM11_5GB2_PA 14 -#define SROM11_5GB3_PA 17 - -/* Masks and offsets for rxgains */ -#define SROM11_RXGAINS5GTRELNABYPA_MASK 0x8000 -#define SROM11_RXGAINS5GTRELNABYPA_SHIFT 15 -#define SROM11_RXGAINS5GTRISOA_MASK 0x7800 -#define SROM11_RXGAINS5GTRISOA_SHIFT 11 -#define SROM11_RXGAINS5GELNAGAINA_MASK 0x0700 -#define SROM11_RXGAINS5GELNAGAINA_SHIFT 8 -#define SROM11_RXGAINS2GTRELNABYPA_MASK 0x0080 -#define SROM11_RXGAINS2GTRELNABYPA_SHIFT 7 -#define SROM11_RXGAINS2GTRISOA_MASK 0x0078 -#define SROM11_RXGAINS2GTRISOA_SHIFT 3 -#define SROM11_RXGAINS2GELNAGAINA_MASK 0x0007 -#define SROM11_RXGAINS2GELNAGAINA_SHIFT 0 -#define SROM11_RXGAINS5GHTRELNABYPA_MASK 0x8000 -#define SROM11_RXGAINS5GHTRELNABYPA_SHIFT 15 -#define SROM11_RXGAINS5GHTRISOA_MASK 0x7800 -#define SROM11_RXGAINS5GHTRISOA_SHIFT 11 -#define SROM11_RXGAINS5GHELNAGAINA_MASK 0x0700 -#define SROM11_RXGAINS5GHELNAGAINA_SHIFT 8 -#define SROM11_RXGAINS5GMTRELNABYPA_MASK 0x0080 -#define SROM11_RXGAINS5GMTRELNABYPA_SHIFT 7 -#define SROM11_RXGAINS5GMTRISOA_MASK 0x0078 -#define SROM11_RXGAINS5GMTRISOA_SHIFT 3 -#define SROM11_RXGAINS5GMELNAGAINA_MASK 0x0007 -#define SROM11_RXGAINS5GMELNAGAINA_SHIFT 0 - -/* Power per rate */ -#define SROM11_CCKBW202GPO 168 -#define SROM11_CCKBW20UL2GPO 169 -#define SROM11_MCSBW202GPO 170 -#define SROM11_MCSBW202GPO_1 171 -#define SROM11_MCSBW402GPO 172 -#define SROM11_MCSBW402GPO_1 173 -#define SROM11_DOT11AGOFDMHRBW202GPO 174 -#define SROM11_OFDMLRBW202GPO 175 - -#define SROM11_MCSBW205GLPO 176 -#define SROM11_MCSBW205GLPO_1 177 -#define SROM11_MCSBW405GLPO 178 -#define SROM11_MCSBW405GLPO_1 179 -#define SROM11_MCSBW805GLPO 180 -#define SROM11_MCSBW805GLPO_1 181 -#define SROM11_MCSBW1605GLPO 182 -#define SROM11_MCSBW1605GLPO_1 183 -#define SROM11_MCSBW205GMPO 184 -#define SROM11_MCSBW205GMPO_1 185 -#define SROM11_MCSBW405GMPO 186 -#define SROM11_MCSBW405GMPO_1 187 -#define SROM11_MCSBW805GMPO 188 -#define SROM11_MCSBW805GMPO_1 189 -#define SROM11_MCSBW1605GMPO 190 -#define SROM11_MCSBW1605GMPO_1 191 -#define SROM11_MCSBW205GHPO 192 -#define SROM11_MCSBW205GHPO_1 193 -#define SROM11_MCSBW405GHPO 194 -#define SROM11_MCSBW405GHPO_1 195 -#define SROM11_MCSBW805GHPO 196 -#define SROM11_MCSBW805GHPO_1 197 -#define SROM11_MCSBW1605GHPO 198 -#define SROM11_MCSBW1605GHPO_1 199 - -#define SROM11_MCSLR5GLPO 200 -#define SROM11_MCSLR5GMPO 201 -#define SROM11_MCSLR5GHPO 202 - -#define SROM11_SB20IN40HRPO 203 -#define SROM11_SB20IN80AND160HR5GLPO 204 -#define SROM11_SB40AND80HR5GLPO 205 -#define SROM11_SB20IN80AND160HR5GMPO 206 -#define SROM11_SB40AND80HR5GMPO 207 -#define SROM11_SB20IN80AND160HR5GHPO 208 -#define SROM11_SB40AND80HR5GHPO 209 -#define SROM11_SB20IN40LRPO 210 -#define SROM11_SB20IN80AND160LR5GLPO 211 -#define SROM11_SB40AND80LR5GLPO 212 -#define SROM11_SB20IN80AND160LR5GMPO 213 -#define SROM11_SB40AND80LR5GMPO 214 -#define SROM11_SB20IN80AND160LR5GHPO 215 -#define SROM11_SB40AND80LR5GHPO 216 - -#define SROM11_DOT11AGDUPHRPO 217 -#define SROM11_DOT11AGDUPLRPO 218 - -/* MISC */ -#define SROM11_PCIEINGRESS_WAR 220 -#define SROM11_SAR 221 - -#define SROM11_NOISELVL_2G 222 -#define SROM11_NOISELVL_5GL 223 -#define SROM11_NOISELVL_5GM 224 -#define SROM11_NOISELVL_5GH 225 -#define SROM11_NOISELVL_5GU 226 - -#define SROM11_RXGAINERR_2G 227 -#define SROM11_RXGAINERR_5GL 228 -#define SROM11_RXGAINERR_5GM 229 -#define SROM11_RXGAINERR_5GH 230 -#define SROM11_RXGAINERR_5GU 231 - -#define SROM11_SIGN 64 -#define SROM11_CRCREV 233 - -#define SROM11_WORDS 234 -#define SROM11_SIGNATURE 0x0634 - -typedef struct { - uint8 tssipos; /* TSSI positive slope, 1: positive, 0: negative */ - uint8 extpagain; /* Ext PA gain-type: full-gain: 0, pa-lite: 1, no_pa: 2 */ - uint8 pdetrange; /* support 32 combinations of different Pdet dynamic ranges */ - uint8 triso; /* TR switch isolation */ - uint8 antswctrllut; /* antswctrl lookup table configuration: 32 possible choices */ -} srom_fem_t; - -#endif /* _bcmsrom_fmt_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h b/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h deleted file mode 100755 index 040ae6a..0000000 --- a/drivers/net/wireless/bcmdhd/include/bcmsrom_tbl.h +++ /dev/null @@ -1,900 +0,0 @@ -/* - * Table that encodes the srom formats for PCI/PCIe NICs. - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmsrom_tbl.h 327694 2012-04-16 13:22:24Z $ - */ - -#ifndef _bcmsrom_tbl_h_ -#define _bcmsrom_tbl_h_ - -#include "sbpcmcia.h" -#include "wlioctl.h" - -typedef struct { - const char *name; - uint32 revmask; - uint32 flags; - uint16 off; - uint16 mask; -} sromvar_t; - -#define SRFL_MORE 1 /* value continues as described by the next entry */ -#define SRFL_NOFFS 2 /* value bits can't be all one's */ -#define SRFL_PRHEX 4 /* value is in hexdecimal format */ -#define SRFL_PRSIGN 8 /* value is in signed decimal format */ -#define SRFL_CCODE 0x10 /* value is in country code format */ -#define SRFL_ETHADDR 0x20 /* value is an Ethernet address */ -#define SRFL_LEDDC 0x40 /* value is an LED duty cycle */ -#define SRFL_NOVAR 0x80 /* do not generate a nvram param, entry is for mfgc */ -#define SRFL_ARRAY 0x100 /* value is in an array. All elements EXCEPT FOR THE LAST - * ONE in the array should have this flag set. - */ - - -/* Assumptions: - * - Ethernet address spans across 3 consective words - * - * Table rules: - * - Add multiple entries next to each other if a value spans across multiple words - * (even multiple fields in the same word) with each entry except the last having - * it's SRFL_MORE bit set. - * - Ethernet address entry does not follow above rule and must not have SRFL_MORE - * bit set. Its SRFL_ETHADDR bit implies it takes multiple words. - * - The last entry's name field must be NULL to indicate the end of the table. Other - * entries must have non-NULL name. - */ - -static const sromvar_t pci_sromvars[] = { - {"devid", 0xffffff00, SRFL_PRHEX|SRFL_NOVAR, PCI_F0DEVID, 0xffff}, - {"boardrev", 0x0000000e, SRFL_PRHEX, SROM_AABREV, SROM_BR_MASK}, - {"boardrev", 0x000000f0, SRFL_PRHEX, SROM4_BREV, 0xffff}, - {"boardrev", 0xffffff00, SRFL_PRHEX, SROM8_BREV, 0xffff}, - {"boardflags", 0x00000002, SRFL_PRHEX, SROM_BFL, 0xffff}, - {"boardflags", 0x00000004, SRFL_PRHEX|SRFL_MORE, SROM_BFL, 0xffff}, - {"", 0, 0, SROM_BFL2, 0xffff}, - {"boardflags", 0x00000008, SRFL_PRHEX|SRFL_MORE, SROM_BFL, 0xffff}, - {"", 0, 0, SROM3_BFL2, 0xffff}, - {"boardflags", 0x00000010, SRFL_PRHEX|SRFL_MORE, SROM4_BFL0, 0xffff}, - {"", 0, 0, SROM4_BFL1, 0xffff}, - {"boardflags", 0x000000e0, SRFL_PRHEX|SRFL_MORE, SROM5_BFL0, 0xffff}, - {"", 0, 0, SROM5_BFL1, 0xffff}, - {"boardflags", 0xffffff00, SRFL_PRHEX|SRFL_MORE, SROM8_BFL0, 0xffff}, - {"", 0, 0, SROM8_BFL1, 0xffff}, - {"boardflags2", 0x00000010, SRFL_PRHEX|SRFL_MORE, SROM4_BFL2, 0xffff}, - {"", 0, 0, SROM4_BFL3, 0xffff}, - {"boardflags2", 0x000000e0, SRFL_PRHEX|SRFL_MORE, SROM5_BFL2, 0xffff}, - {"", 0, 0, SROM5_BFL3, 0xffff}, - {"boardflags2", 0xffffff00, SRFL_PRHEX|SRFL_MORE, SROM8_BFL2, 0xffff}, - {"", 0, 0, SROM8_BFL3, 0xffff}, - {"boardtype", 0xfffffffc, SRFL_PRHEX, SROM_SSID, 0xffff}, - - {"boardnum", 0x00000006, 0, SROM_MACLO_IL0, 0xffff}, - {"boardnum", 0x00000008, 0, SROM3_MACLO, 0xffff}, - {"boardnum", 0x00000010, 0, SROM4_MACLO, 0xffff}, - {"boardnum", 0x000000e0, 0, SROM5_MACLO, 0xffff}, - {"boardnum", 0x00000700, 0, SROM8_MACLO, 0xffff}, - {"cc", 0x00000002, 0, SROM_AABREV, SROM_CC_MASK}, - {"regrev", 0x00000008, 0, SROM_OPO, 0xff00}, - {"regrev", 0x00000010, 0, SROM4_REGREV, 0x00ff}, - {"regrev", 0x000000e0, 0, SROM5_REGREV, 0x00ff}, - {"regrev", 0x00000700, 0, SROM8_REGREV, 0x00ff}, - {"ledbh0", 0x0000000e, SRFL_NOFFS, SROM_LEDBH10, 0x00ff}, - {"ledbh1", 0x0000000e, SRFL_NOFFS, SROM_LEDBH10, 0xff00}, - {"ledbh2", 0x0000000e, SRFL_NOFFS, SROM_LEDBH32, 0x00ff}, - {"ledbh3", 0x0000000e, SRFL_NOFFS, SROM_LEDBH32, 0xff00}, - {"ledbh0", 0x00000010, SRFL_NOFFS, SROM4_LEDBH10, 0x00ff}, - {"ledbh1", 0x00000010, SRFL_NOFFS, SROM4_LEDBH10, 0xff00}, - {"ledbh2", 0x00000010, SRFL_NOFFS, SROM4_LEDBH32, 0x00ff}, - {"ledbh3", 0x00000010, SRFL_NOFFS, SROM4_LEDBH32, 0xff00}, - {"ledbh0", 0x000000e0, SRFL_NOFFS, SROM5_LEDBH10, 0x00ff}, - {"ledbh1", 0x000000e0, SRFL_NOFFS, SROM5_LEDBH10, 0xff00}, - {"ledbh2", 0x000000e0, SRFL_NOFFS, SROM5_LEDBH32, 0x00ff}, - {"ledbh3", 0x000000e0, SRFL_NOFFS, SROM5_LEDBH32, 0xff00}, - {"ledbh0", 0x00000700, SRFL_NOFFS, SROM8_LEDBH10, 0x00ff}, - {"ledbh1", 0x00000700, SRFL_NOFFS, SROM8_LEDBH10, 0xff00}, - {"ledbh2", 0x00000700, SRFL_NOFFS, SROM8_LEDBH32, 0x00ff}, - {"ledbh3", 0x00000700, SRFL_NOFFS, SROM8_LEDBH32, 0xff00}, - {"pa0b0", 0x0000000e, SRFL_PRHEX, SROM_WL0PAB0, 0xffff}, - {"pa0b1", 0x0000000e, SRFL_PRHEX, SROM_WL0PAB1, 0xffff}, - {"pa0b2", 0x0000000e, SRFL_PRHEX, SROM_WL0PAB2, 0xffff}, - {"pa0itssit", 0x0000000e, 0, SROM_ITT, 0x00ff}, - {"pa0maxpwr", 0x0000000e, 0, SROM_WL10MAXP, 0x00ff}, - {"pa0b0", 0x00000700, SRFL_PRHEX, SROM8_W0_PAB0, 0xffff}, - {"pa0b1", 0x00000700, SRFL_PRHEX, SROM8_W0_PAB1, 0xffff}, - {"pa0b2", 0x00000700, SRFL_PRHEX, SROM8_W0_PAB2, 0xffff}, - {"pa0itssit", 0x00000700, 0, SROM8_W0_ITTMAXP, 0xff00}, - {"pa0maxpwr", 0x00000700, 0, SROM8_W0_ITTMAXP, 0x00ff}, - {"opo", 0x0000000c, 0, SROM_OPO, 0x00ff}, - {"opo", 0x00000700, 0, SROM8_2G_OFDMPO, 0x00ff}, - {"aa2g", 0x0000000e, 0, SROM_AABREV, SROM_AA0_MASK}, - {"aa2g", 0x000000f0, 0, SROM4_AA, 0x00ff}, - {"aa2g", 0x00000700, 0, SROM8_AA, 0x00ff}, - {"aa5g", 0x0000000e, 0, SROM_AABREV, SROM_AA1_MASK}, - {"aa5g", 0x000000f0, 0, SROM4_AA, 0xff00}, - {"aa5g", 0x00000700, 0, SROM8_AA, 0xff00}, - {"ag0", 0x0000000e, 0, SROM_AG10, 0x00ff}, - {"ag1", 0x0000000e, 0, SROM_AG10, 0xff00}, - {"ag0", 0x000000f0, 0, SROM4_AG10, 0x00ff}, - {"ag1", 0x000000f0, 0, SROM4_AG10, 0xff00}, - {"ag2", 0x000000f0, 0, SROM4_AG32, 0x00ff}, - {"ag3", 0x000000f0, 0, SROM4_AG32, 0xff00}, - {"ag0", 0x00000700, 0, SROM8_AG10, 0x00ff}, - {"ag1", 0x00000700, 0, SROM8_AG10, 0xff00}, - {"ag2", 0x00000700, 0, SROM8_AG32, 0x00ff}, - {"ag3", 0x00000700, 0, SROM8_AG32, 0xff00}, - {"pa1b0", 0x0000000e, SRFL_PRHEX, SROM_WL1PAB0, 0xffff}, - {"pa1b1", 0x0000000e, SRFL_PRHEX, SROM_WL1PAB1, 0xffff}, - {"pa1b2", 0x0000000e, SRFL_PRHEX, SROM_WL1PAB2, 0xffff}, - {"pa1lob0", 0x0000000c, SRFL_PRHEX, SROM_WL1LPAB0, 0xffff}, - {"pa1lob1", 0x0000000c, SRFL_PRHEX, SROM_WL1LPAB1, 0xffff}, - {"pa1lob2", 0x0000000c, SRFL_PRHEX, SROM_WL1LPAB2, 0xffff}, - {"pa1hib0", 0x0000000c, SRFL_PRHEX, SROM_WL1HPAB0, 0xffff}, - {"pa1hib1", 0x0000000c, SRFL_PRHEX, SROM_WL1HPAB1, 0xffff}, - {"pa1hib2", 0x0000000c, SRFL_PRHEX, SROM_WL1HPAB2, 0xffff}, - {"pa1itssit", 0x0000000e, 0, SROM_ITT, 0xff00}, - {"pa1maxpwr", 0x0000000e, 0, SROM_WL10MAXP, 0xff00}, - {"pa1lomaxpwr", 0x0000000c, 0, SROM_WL1LHMAXP, 0xff00}, - {"pa1himaxpwr", 0x0000000c, 0, SROM_WL1LHMAXP, 0x00ff}, - {"pa1b0", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB0, 0xffff}, - {"pa1b1", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB1, 0xffff}, - {"pa1b2", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB2, 0xffff}, - {"pa1lob0", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB0_LC, 0xffff}, - {"pa1lob1", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB1_LC, 0xffff}, - {"pa1lob2", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB2_LC, 0xffff}, - {"pa1hib0", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB0_HC, 0xffff}, - {"pa1hib1", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB1_HC, 0xffff}, - {"pa1hib2", 0x00000700, SRFL_PRHEX, SROM8_W1_PAB2_HC, 0xffff}, - {"pa1itssit", 0x00000700, 0, SROM8_W1_ITTMAXP, 0xff00}, - {"pa1maxpwr", 0x00000700, 0, SROM8_W1_ITTMAXP, 0x00ff}, - {"pa1lomaxpwr", 0x00000700, 0, SROM8_W1_MAXP_LCHC, 0xff00}, - {"pa1himaxpwr", 0x00000700, 0, SROM8_W1_MAXP_LCHC, 0x00ff}, - {"bxa2g", 0x00000008, 0, SROM_BXARSSI2G, 0x1800}, - {"rssisav2g", 0x00000008, 0, SROM_BXARSSI2G, 0x0700}, - {"rssismc2g", 0x00000008, 0, SROM_BXARSSI2G, 0x00f0}, - {"rssismf2g", 0x00000008, 0, SROM_BXARSSI2G, 0x000f}, - {"bxa2g", 0x00000700, 0, SROM8_BXARSSI2G, 0x1800}, - {"rssisav2g", 0x00000700, 0, SROM8_BXARSSI2G, 0x0700}, - {"rssismc2g", 0x00000700, 0, SROM8_BXARSSI2G, 0x00f0}, - {"rssismf2g", 0x00000700, 0, SROM8_BXARSSI2G, 0x000f}, - {"bxa5g", 0x00000008, 0, SROM_BXARSSI5G, 0x1800}, - {"rssisav5g", 0x00000008, 0, SROM_BXARSSI5G, 0x0700}, - {"rssismc5g", 0x00000008, 0, SROM_BXARSSI5G, 0x00f0}, - {"rssismf5g", 0x00000008, 0, SROM_BXARSSI5G, 0x000f}, - {"bxa5g", 0x00000700, 0, SROM8_BXARSSI5G, 0x1800}, - {"rssisav5g", 0x00000700, 0, SROM8_BXARSSI5G, 0x0700}, - {"rssismc5g", 0x00000700, 0, SROM8_BXARSSI5G, 0x00f0}, - {"rssismf5g", 0x00000700, 0, SROM8_BXARSSI5G, 0x000f}, - {"tri2g", 0x00000008, 0, SROM_TRI52G, 0x00ff}, - {"tri5g", 0x00000008, 0, SROM_TRI52G, 0xff00}, - {"tri5gl", 0x00000008, 0, SROM_TRI5GHL, 0x00ff}, - {"tri5gh", 0x00000008, 0, SROM_TRI5GHL, 0xff00}, - {"tri2g", 0x00000700, 0, SROM8_TRI52G, 0x00ff}, - {"tri5g", 0x00000700, 0, SROM8_TRI52G, 0xff00}, - {"tri5gl", 0x00000700, 0, SROM8_TRI5GHL, 0x00ff}, - {"tri5gh", 0x00000700, 0, SROM8_TRI5GHL, 0xff00}, - {"rxpo2g", 0x00000008, SRFL_PRSIGN, SROM_RXPO52G, 0x00ff}, - {"rxpo5g", 0x00000008, SRFL_PRSIGN, SROM_RXPO52G, 0xff00}, - {"rxpo2g", 0x00000700, SRFL_PRSIGN, SROM8_RXPO52G, 0x00ff}, - {"rxpo5g", 0x00000700, SRFL_PRSIGN, SROM8_RXPO52G, 0xff00}, - {"txchain", 0x000000f0, SRFL_NOFFS, SROM4_TXRXC, SROM4_TXCHAIN_MASK}, - {"rxchain", 0x000000f0, SRFL_NOFFS, SROM4_TXRXC, SROM4_RXCHAIN_MASK}, - {"antswitch", 0x000000f0, SRFL_NOFFS, SROM4_TXRXC, SROM4_SWITCH_MASK}, - {"txchain", 0x00000700, SRFL_NOFFS, SROM8_TXRXC, SROM4_TXCHAIN_MASK}, - {"rxchain", 0x00000700, SRFL_NOFFS, SROM8_TXRXC, SROM4_RXCHAIN_MASK}, - {"antswitch", 0x00000700, SRFL_NOFFS, SROM8_TXRXC, SROM4_SWITCH_MASK}, - {"tssipos2g", 0x00000700, 0, SROM8_FEM2G, SROM8_FEM_TSSIPOS_MASK}, - {"extpagain2g", 0x00000700, 0, SROM8_FEM2G, SROM8_FEM_EXTPA_GAIN_MASK}, - {"pdetrange2g", 0x00000700, 0, SROM8_FEM2G, SROM8_FEM_PDET_RANGE_MASK}, - {"triso2g", 0x00000700, 0, SROM8_FEM2G, SROM8_FEM_TR_ISO_MASK}, - {"antswctl2g", 0x00000700, 0, SROM8_FEM2G, SROM8_FEM_ANTSWLUT_MASK}, - {"tssipos5g", 0x00000700, 0, SROM8_FEM5G, SROM8_FEM_TSSIPOS_MASK}, - {"extpagain5g", 0x00000700, 0, SROM8_FEM5G, SROM8_FEM_EXTPA_GAIN_MASK}, - {"pdetrange5g", 0x00000700, 0, SROM8_FEM5G, SROM8_FEM_PDET_RANGE_MASK}, - {"triso5g", 0x00000700, 0, SROM8_FEM5G, SROM8_FEM_TR_ISO_MASK}, - {"antswctl5g", 0x00000700, 0, SROM8_FEM5G, SROM8_FEM_ANTSWLUT_MASK}, - {"txpid2ga0", 0x000000f0, 0, SROM4_TXPID2G, 0x00ff}, - {"txpid2ga1", 0x000000f0, 0, SROM4_TXPID2G, 0xff00}, - {"txpid2ga2", 0x000000f0, 0, SROM4_TXPID2G + 1, 0x00ff}, - {"txpid2ga3", 0x000000f0, 0, SROM4_TXPID2G + 1, 0xff00}, - {"txpid5ga0", 0x000000f0, 0, SROM4_TXPID5G, 0x00ff}, - {"txpid5ga1", 0x000000f0, 0, SROM4_TXPID5G, 0xff00}, - {"txpid5ga2", 0x000000f0, 0, SROM4_TXPID5G + 1, 0x00ff}, - {"txpid5ga3", 0x000000f0, 0, SROM4_TXPID5G + 1, 0xff00}, - {"txpid5gla0", 0x000000f0, 0, SROM4_TXPID5GL, 0x00ff}, - {"txpid5gla1", 0x000000f0, 0, SROM4_TXPID5GL, 0xff00}, - {"txpid5gla2", 0x000000f0, 0, SROM4_TXPID5GL + 1, 0x00ff}, - {"txpid5gla3", 0x000000f0, 0, SROM4_TXPID5GL + 1, 0xff00}, - {"txpid5gha0", 0x000000f0, 0, SROM4_TXPID5GH, 0x00ff}, - {"txpid5gha1", 0x000000f0, 0, SROM4_TXPID5GH, 0xff00}, - {"txpid5gha2", 0x000000f0, 0, SROM4_TXPID5GH + 1, 0x00ff}, - {"txpid5gha3", 0x000000f0, 0, SROM4_TXPID5GH + 1, 0xff00}, - - {"ccode", 0x0000000f, SRFL_CCODE, SROM_CCODE, 0xffff}, - {"ccode", 0x00000010, SRFL_CCODE, SROM4_CCODE, 0xffff}, - {"ccode", 0x000000e0, SRFL_CCODE, SROM5_CCODE, 0xffff}, - {"ccode", 0x00000700, SRFL_CCODE, SROM8_CCODE, 0xffff}, - {"macaddr", 0x00000700, SRFL_ETHADDR, SROM8_MACHI, 0xffff}, - {"macaddr", 0x000000e0, SRFL_ETHADDR, SROM5_MACHI, 0xffff}, - {"macaddr", 0x00000010, SRFL_ETHADDR, SROM4_MACHI, 0xffff}, - {"macaddr", 0x00000008, SRFL_ETHADDR, SROM3_MACHI, 0xffff}, - {"il0macaddr", 0x00000007, SRFL_ETHADDR, SROM_MACHI_IL0, 0xffff}, - {"et1macaddr", 0x00000007, SRFL_ETHADDR, SROM_MACHI_ET1, 0xffff}, - {"leddc", 0x00000700, SRFL_NOFFS|SRFL_LEDDC, SROM8_LEDDC, 0xffff}, - {"leddc", 0x000000e0, SRFL_NOFFS|SRFL_LEDDC, SROM5_LEDDC, 0xffff}, - {"leddc", 0x00000010, SRFL_NOFFS|SRFL_LEDDC, SROM4_LEDDC, 0xffff}, - {"leddc", 0x00000008, SRFL_NOFFS|SRFL_LEDDC, SROM3_LEDDC, 0xffff}, - - {"tempthresh", 0x00000700, 0, SROM8_THERMAL, 0xff00}, - {"tempoffset", 0x00000700, 0, SROM8_THERMAL, 0x00ff}, - {"rawtempsense", 0x00000700, SRFL_PRHEX, SROM8_MPWR_RAWTS, 0x01ff}, - {"measpower", 0x00000700, SRFL_PRHEX, SROM8_MPWR_RAWTS, 0xfe00}, - {"tempsense_slope", 0x00000700, SRFL_PRHEX, SROM8_TS_SLP_OPT_CORRX, 0x00ff}, - {"tempcorrx", 0x00000700, SRFL_PRHEX, SROM8_TS_SLP_OPT_CORRX, 0xfc00}, - {"tempsense_option", 0x00000700, SRFL_PRHEX, SROM8_TS_SLP_OPT_CORRX, 0x0300}, - {"freqoffset_corr", 0x00000700, SRFL_PRHEX, SROM8_FOC_HWIQ_IQSWP, 0x000f}, - {"iqcal_swp_dis", 0x00000700, SRFL_PRHEX, SROM8_FOC_HWIQ_IQSWP, 0x0010}, - {"hw_iqcal_en", 0x00000700, SRFL_PRHEX, SROM8_FOC_HWIQ_IQSWP, 0x0020}, - {"elna2g", 0x00000700, 0, SROM8_EXTLNAGAIN, 0x00ff}, - {"elna5g", 0x00000700, 0, SROM8_EXTLNAGAIN, 0xff00}, - {"phycal_tempdelta", 0x00000700, 0, SROM8_PHYCAL_TEMPDELTA, 0x00ff}, - {"temps_period", 0x00000700, 0, SROM8_PHYCAL_TEMPDELTA, 0x0f00}, - {"temps_hysteresis", 0x00000700, 0, SROM8_PHYCAL_TEMPDELTA, 0xf000}, - {"measpower1", 0x00000700, SRFL_PRHEX, SROM8_MPWR_1_AND_2, 0x007f}, - {"measpower2", 0x00000700, SRFL_PRHEX, SROM8_MPWR_1_AND_2, 0x3f80}, - - {"cck2gpo", 0x000000f0, 0, SROM4_2G_CCKPO, 0xffff}, - {"cck2gpo", 0x00000100, 0, SROM8_2G_CCKPO, 0xffff}, - {"ofdm2gpo", 0x000000f0, SRFL_MORE, SROM4_2G_OFDMPO, 0xffff}, - {"", 0, 0, SROM4_2G_OFDMPO + 1, 0xffff}, - {"ofdm5gpo", 0x000000f0, SRFL_MORE, SROM4_5G_OFDMPO, 0xffff}, - {"", 0, 0, SROM4_5G_OFDMPO + 1, 0xffff}, - {"ofdm5glpo", 0x000000f0, SRFL_MORE, SROM4_5GL_OFDMPO, 0xffff}, - {"", 0, 0, SROM4_5GL_OFDMPO + 1, 0xffff}, - {"ofdm5ghpo", 0x000000f0, SRFL_MORE, SROM4_5GH_OFDMPO, 0xffff}, - {"", 0, 0, SROM4_5GH_OFDMPO + 1, 0xffff}, - {"ofdm2gpo", 0x00000100, SRFL_MORE, SROM8_2G_OFDMPO, 0xffff}, - {"", 0, 0, SROM8_2G_OFDMPO + 1, 0xffff}, - {"ofdm5gpo", 0x00000100, SRFL_MORE, SROM8_5G_OFDMPO, 0xffff}, - {"", 0, 0, SROM8_5G_OFDMPO + 1, 0xffff}, - {"ofdm5glpo", 0x00000100, SRFL_MORE, SROM8_5GL_OFDMPO, 0xffff}, - {"", 0, 0, SROM8_5GL_OFDMPO + 1, 0xffff}, - {"ofdm5ghpo", 0x00000100, SRFL_MORE, SROM8_5GH_OFDMPO, 0xffff}, - {"", 0, 0, SROM8_5GH_OFDMPO + 1, 0xffff}, - {"mcs2gpo0", 0x000000f0, 0, SROM4_2G_MCSPO, 0xffff}, - {"mcs2gpo1", 0x000000f0, 0, SROM4_2G_MCSPO + 1, 0xffff}, - {"mcs2gpo2", 0x000000f0, 0, SROM4_2G_MCSPO + 2, 0xffff}, - {"mcs2gpo3", 0x000000f0, 0, SROM4_2G_MCSPO + 3, 0xffff}, - {"mcs2gpo4", 0x000000f0, 0, SROM4_2G_MCSPO + 4, 0xffff}, - {"mcs2gpo5", 0x000000f0, 0, SROM4_2G_MCSPO + 5, 0xffff}, - {"mcs2gpo6", 0x000000f0, 0, SROM4_2G_MCSPO + 6, 0xffff}, - {"mcs2gpo7", 0x000000f0, 0, SROM4_2G_MCSPO + 7, 0xffff}, - {"mcs5gpo0", 0x000000f0, 0, SROM4_5G_MCSPO, 0xffff}, - {"mcs5gpo1", 0x000000f0, 0, SROM4_5G_MCSPO + 1, 0xffff}, - {"mcs5gpo2", 0x000000f0, 0, SROM4_5G_MCSPO + 2, 0xffff}, - {"mcs5gpo3", 0x000000f0, 0, SROM4_5G_MCSPO + 3, 0xffff}, - {"mcs5gpo4", 0x000000f0, 0, SROM4_5G_MCSPO + 4, 0xffff}, - {"mcs5gpo5", 0x000000f0, 0, SROM4_5G_MCSPO + 5, 0xffff}, - {"mcs5gpo6", 0x000000f0, 0, SROM4_5G_MCSPO + 6, 0xffff}, - {"mcs5gpo7", 0x000000f0, 0, SROM4_5G_MCSPO + 7, 0xffff}, - {"mcs5glpo0", 0x000000f0, 0, SROM4_5GL_MCSPO, 0xffff}, - {"mcs5glpo1", 0x000000f0, 0, SROM4_5GL_MCSPO + 1, 0xffff}, - {"mcs5glpo2", 0x000000f0, 0, SROM4_5GL_MCSPO + 2, 0xffff}, - {"mcs5glpo3", 0x000000f0, 0, SROM4_5GL_MCSPO + 3, 0xffff}, - {"mcs5glpo4", 0x000000f0, 0, SROM4_5GL_MCSPO + 4, 0xffff}, - {"mcs5glpo5", 0x000000f0, 0, SROM4_5GL_MCSPO + 5, 0xffff}, - {"mcs5glpo6", 0x000000f0, 0, SROM4_5GL_MCSPO + 6, 0xffff}, - {"mcs5glpo7", 0x000000f0, 0, SROM4_5GL_MCSPO + 7, 0xffff}, - {"mcs5ghpo0", 0x000000f0, 0, SROM4_5GH_MCSPO, 0xffff}, - {"mcs5ghpo1", 0x000000f0, 0, SROM4_5GH_MCSPO + 1, 0xffff}, - {"mcs5ghpo2", 0x000000f0, 0, SROM4_5GH_MCSPO + 2, 0xffff}, - {"mcs5ghpo3", 0x000000f0, 0, SROM4_5GH_MCSPO + 3, 0xffff}, - {"mcs5ghpo4", 0x000000f0, 0, SROM4_5GH_MCSPO + 4, 0xffff}, - {"mcs5ghpo5", 0x000000f0, 0, SROM4_5GH_MCSPO + 5, 0xffff}, - {"mcs5ghpo6", 0x000000f0, 0, SROM4_5GH_MCSPO + 6, 0xffff}, - {"mcs5ghpo7", 0x000000f0, 0, SROM4_5GH_MCSPO + 7, 0xffff}, - {"mcs2gpo0", 0x00000100, 0, SROM8_2G_MCSPO, 0xffff}, - {"mcs2gpo1", 0x00000100, 0, SROM8_2G_MCSPO + 1, 0xffff}, - {"mcs2gpo2", 0x00000100, 0, SROM8_2G_MCSPO + 2, 0xffff}, - {"mcs2gpo3", 0x00000100, 0, SROM8_2G_MCSPO + 3, 0xffff}, - {"mcs2gpo4", 0x00000100, 0, SROM8_2G_MCSPO + 4, 0xffff}, - {"mcs2gpo5", 0x00000100, 0, SROM8_2G_MCSPO + 5, 0xffff}, - {"mcs2gpo6", 0x00000100, 0, SROM8_2G_MCSPO + 6, 0xffff}, - {"mcs2gpo7", 0x00000100, 0, SROM8_2G_MCSPO + 7, 0xffff}, - {"mcs5gpo0", 0x00000100, 0, SROM8_5G_MCSPO, 0xffff}, - {"mcs5gpo1", 0x00000100, 0, SROM8_5G_MCSPO + 1, 0xffff}, - {"mcs5gpo2", 0x00000100, 0, SROM8_5G_MCSPO + 2, 0xffff}, - {"mcs5gpo3", 0x00000100, 0, SROM8_5G_MCSPO + 3, 0xffff}, - {"mcs5gpo4", 0x00000100, 0, SROM8_5G_MCSPO + 4, 0xffff}, - {"mcs5gpo5", 0x00000100, 0, SROM8_5G_MCSPO + 5, 0xffff}, - {"mcs5gpo6", 0x00000100, 0, SROM8_5G_MCSPO + 6, 0xffff}, - {"mcs5gpo7", 0x00000100, 0, SROM8_5G_MCSPO + 7, 0xffff}, - {"mcs5glpo0", 0x00000100, 0, SROM8_5GL_MCSPO, 0xffff}, - {"mcs5glpo1", 0x00000100, 0, SROM8_5GL_MCSPO + 1, 0xffff}, - {"mcs5glpo2", 0x00000100, 0, SROM8_5GL_MCSPO + 2, 0xffff}, - {"mcs5glpo3", 0x00000100, 0, SROM8_5GL_MCSPO + 3, 0xffff}, - {"mcs5glpo4", 0x00000100, 0, SROM8_5GL_MCSPO + 4, 0xffff}, - {"mcs5glpo5", 0x00000100, 0, SROM8_5GL_MCSPO + 5, 0xffff}, - {"mcs5glpo6", 0x00000100, 0, SROM8_5GL_MCSPO + 6, 0xffff}, - {"mcs5glpo7", 0x00000100, 0, SROM8_5GL_MCSPO + 7, 0xffff}, - {"mcs5ghpo0", 0x00000100, 0, SROM8_5GH_MCSPO, 0xffff}, - {"mcs5ghpo1", 0x00000100, 0, SROM8_5GH_MCSPO + 1, 0xffff}, - {"mcs5ghpo2", 0x00000100, 0, SROM8_5GH_MCSPO + 2, 0xffff}, - {"mcs5ghpo3", 0x00000100, 0, SROM8_5GH_MCSPO + 3, 0xffff}, - {"mcs5ghpo4", 0x00000100, 0, SROM8_5GH_MCSPO + 4, 0xffff}, - {"mcs5ghpo5", 0x00000100, 0, SROM8_5GH_MCSPO + 5, 0xffff}, - {"mcs5ghpo6", 0x00000100, 0, SROM8_5GH_MCSPO + 6, 0xffff}, - {"mcs5ghpo7", 0x00000100, 0, SROM8_5GH_MCSPO + 7, 0xffff}, - {"cddpo", 0x000000f0, 0, SROM4_CDDPO, 0xffff}, - {"stbcpo", 0x000000f0, 0, SROM4_STBCPO, 0xffff}, - {"bw40po", 0x000000f0, 0, SROM4_BW40PO, 0xffff}, - {"bwduppo", 0x000000f0, 0, SROM4_BWDUPPO, 0xffff}, - {"cddpo", 0x00000100, 0, SROM8_CDDPO, 0xffff}, - {"stbcpo", 0x00000100, 0, SROM8_STBCPO, 0xffff}, - {"bw40po", 0x00000100, 0, SROM8_BW40PO, 0xffff}, - {"bwduppo", 0x00000100, 0, SROM8_BWDUPPO, 0xffff}, - - /* power per rate from sromrev 9 */ - {"cckbw202gpo", 0x00000600, 0, SROM9_2GPO_CCKBW20, 0xffff}, - {"cckbw20ul2gpo", 0x00000600, 0, SROM9_2GPO_CCKBW20UL, 0xffff}, - {"legofdmbw202gpo", 0x00000600, SRFL_MORE, SROM9_2GPO_LOFDMBW20, 0xffff}, - {"", 0, 0, SROM9_2GPO_LOFDMBW20 + 1, 0xffff}, - {"legofdmbw20ul2gpo", 0x00000600, SRFL_MORE, SROM9_2GPO_LOFDMBW20UL, 0xffff}, - {"", 0, 0, SROM9_2GPO_LOFDMBW20UL + 1, 0xffff}, - {"legofdmbw205glpo", 0x00000600, SRFL_MORE, SROM9_5GLPO_LOFDMBW20, 0xffff}, - {"", 0, 0, SROM9_5GLPO_LOFDMBW20 + 1, 0xffff}, - {"legofdmbw20ul5glpo", 0x00000600, SRFL_MORE, SROM9_5GLPO_LOFDMBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GLPO_LOFDMBW20UL + 1, 0xffff}, - {"legofdmbw205gmpo", 0x00000600, SRFL_MORE, SROM9_5GMPO_LOFDMBW20, 0xffff}, - {"", 0, 0, SROM9_5GMPO_LOFDMBW20 + 1, 0xffff}, - {"legofdmbw20ul5gmpo", 0x00000600, SRFL_MORE, SROM9_5GMPO_LOFDMBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GMPO_LOFDMBW20UL + 1, 0xffff}, - {"legofdmbw205ghpo", 0x00000600, SRFL_MORE, SROM9_5GHPO_LOFDMBW20, 0xffff}, - {"", 0, 0, SROM9_5GHPO_LOFDMBW20 + 1, 0xffff}, - {"legofdmbw20ul5ghpo", 0x00000600, SRFL_MORE, SROM9_5GHPO_LOFDMBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GHPO_LOFDMBW20UL + 1, 0xffff}, - {"mcsbw202gpo", 0x00000600, SRFL_MORE, SROM9_2GPO_MCSBW20, 0xffff}, - {"", 0, 0, SROM9_2GPO_MCSBW20 + 1, 0xffff}, - {"mcsbw20ul2gpo", 0x00000600, SRFL_MORE, SROM9_2GPO_MCSBW20UL, 0xffff}, - {"", 0, 0, SROM9_2GPO_MCSBW20UL + 1, 0xffff}, - {"mcsbw402gpo", 0x00000600, SRFL_MORE, SROM9_2GPO_MCSBW40, 0xffff}, - {"", 0, 0, SROM9_2GPO_MCSBW40 + 1, 0xffff}, - {"mcsbw205glpo", 0x00000600, SRFL_MORE, SROM9_5GLPO_MCSBW20, 0xffff}, - {"", 0, 0, SROM9_5GLPO_MCSBW20 + 1, 0xffff}, - {"mcsbw20ul5glpo", 0x00000600, SRFL_MORE, SROM9_5GLPO_MCSBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GLPO_MCSBW20UL + 1, 0xffff}, - {"mcsbw405glpo", 0x00000600, SRFL_MORE, SROM9_5GLPO_MCSBW40, 0xffff}, - {"", 0, 0, SROM9_5GLPO_MCSBW40 + 1, 0xffff}, - {"mcsbw205gmpo", 0x00000600, SRFL_MORE, SROM9_5GMPO_MCSBW20, 0xffff}, - {"", 0, 0, SROM9_5GMPO_MCSBW20 + 1, 0xffff}, - {"mcsbw20ul5gmpo", 0x00000600, SRFL_MORE, SROM9_5GMPO_MCSBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GMPO_MCSBW20UL + 1, 0xffff}, - {"mcsbw405gmpo", 0x00000600, SRFL_MORE, SROM9_5GMPO_MCSBW40, 0xffff}, - {"", 0, 0, SROM9_5GMPO_MCSBW40 + 1, 0xffff}, - {"mcsbw205ghpo", 0x00000600, SRFL_MORE, SROM9_5GHPO_MCSBW20, 0xffff}, - {"", 0, 0, SROM9_5GHPO_MCSBW20 + 1, 0xffff}, - {"mcsbw20ul5ghpo", 0x00000600, SRFL_MORE, SROM9_5GHPO_MCSBW20UL, 0xffff}, - {"", 0, 0, SROM9_5GHPO_MCSBW20UL + 1, 0xffff}, - {"mcsbw405ghpo", 0x00000600, SRFL_MORE, SROM9_5GHPO_MCSBW40, 0xffff}, - {"", 0, 0, SROM9_5GHPO_MCSBW40 + 1, 0xffff}, - {"mcs32po", 0x00000600, 0, SROM9_PO_MCS32, 0xffff}, - {"legofdm40duppo", 0x00000600, 0, SROM9_PO_LOFDM40DUP, 0xffff}, - {"pcieingress_war", 0x00000700, 0, SROM8_PCIEINGRESS_WAR, 0xf}, - {"rxgainerr2ga0", 0x00000700, 0, SROM8_RXGAINERR_2G, 0x003f}, - {"rxgainerr2ga1", 0x00000700, 0, SROM8_RXGAINERR_2G, 0x07c0}, - {"rxgainerr2ga2", 0x00000700, 0, SROM8_RXGAINERR_2G, 0xf800}, - {"rxgainerr5gla0", 0x00000700, 0, SROM8_RXGAINERR_5GL, 0x003f}, - {"rxgainerr5gla1", 0x00000700, 0, SROM8_RXGAINERR_5GL, 0x07c0}, - {"rxgainerr5gla2", 0x00000700, 0, SROM8_RXGAINERR_5GL, 0xf800}, - {"rxgainerr5gma0", 0x00000700, 0, SROM8_RXGAINERR_5GM, 0x003f}, - {"rxgainerr5gma1", 0x00000700, 0, SROM8_RXGAINERR_5GM, 0x07c0}, - {"rxgainerr5gma2", 0x00000700, 0, SROM8_RXGAINERR_5GM, 0xf800}, - {"rxgainerr5gha0", 0x00000700, 0, SROM8_RXGAINERR_5GH, 0x003f}, - {"rxgainerr5gha1", 0x00000700, 0, SROM8_RXGAINERR_5GH, 0x07c0}, - {"rxgainerr5gha2", 0x00000700, 0, SROM8_RXGAINERR_5GH, 0xf800}, - {"rxgainerr5gua0", 0x00000700, 0, SROM8_RXGAINERR_5GU, 0x003f}, - {"rxgainerr5gua1", 0x00000700, 0, SROM8_RXGAINERR_5GU, 0x07c0}, - {"rxgainerr5gua2", 0x00000700, 0, SROM8_RXGAINERR_5GU, 0xf800}, - {"sar2g", 0x00000600, 0, SROM9_SAR, 0x00ff}, - {"sar5g", 0x00000600, 0, SROM9_SAR, 0xff00}, - {"noiselvl2ga0", 0x00000700, 0, SROM8_NOISELVL_2G, 0x001f}, - {"noiselvl2ga1", 0x00000700, 0, SROM8_NOISELVL_2G, 0x03e0}, - {"noiselvl2ga2", 0x00000700, 0, SROM8_NOISELVL_2G, 0x7c00}, - {"noiselvl5gla0", 0x00000700, 0, SROM8_NOISELVL_5GL, 0x001f}, - {"noiselvl5gla1", 0x00000700, 0, SROM8_NOISELVL_5GL, 0x03e0}, - {"noiselvl5gla2", 0x00000700, 0, SROM8_NOISELVL_5GL, 0x7c00}, - {"noiselvl5gma0", 0x00000700, 0, SROM8_NOISELVL_5GM, 0x001f}, - {"noiselvl5gma1", 0x00000700, 0, SROM8_NOISELVL_5GM, 0x03e0}, - {"noiselvl5gma2", 0x00000700, 0, SROM8_NOISELVL_5GM, 0x7c00}, - {"noiselvl5gha0", 0x00000700, 0, SROM8_NOISELVL_5GH, 0x001f}, - {"noiselvl5gha1", 0x00000700, 0, SROM8_NOISELVL_5GH, 0x03e0}, - {"noiselvl5gha2", 0x00000700, 0, SROM8_NOISELVL_5GH, 0x7c00}, - {"noiselvl5gua0", 0x00000700, 0, SROM8_NOISELVL_5GU, 0x001f}, - {"noiselvl5gua1", 0x00000700, 0, SROM8_NOISELVL_5GU, 0x03e0}, - {"noiselvl5gua2", 0x00000700, 0, SROM8_NOISELVL_5GU, 0x7c00}, - {"subband5gver", 0x00000700, 0, SROM8_SUBBAND_PPR, 0x7}, - - {"cckPwrOffset", 0x00000400, 0, SROM10_CCKPWROFFSET, 0xffff}, - /* swctrlmap_2g array, note that the last element doesn't have SRFL_ARRAY flag set */ - {"swctrlmap_2g", 0x00000400, SRFL_MORE|SRFL_PRHEX|SRFL_ARRAY, SROM10_SWCTRLMAP_2G, 0xffff}, - {"", 0x00000400, SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 1, 0xffff}, - {"", 0x00000400, SRFL_MORE|SRFL_PRHEX|SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 2, 0xffff}, - {"", 0x00000400, SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 3, 0xffff}, - {"", 0x00000400, SRFL_MORE|SRFL_PRHEX|SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 4, 0xffff}, - {"", 0x00000400, SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 5, 0xffff}, - {"", 0x00000400, SRFL_MORE|SRFL_PRHEX|SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 6, 0xffff}, - {"", 0x00000400, SRFL_ARRAY, SROM10_SWCTRLMAP_2G + 7, 0xffff}, - {"", 0x00000400, SRFL_PRHEX, SROM10_SWCTRLMAP_2G + 8, 0xffff}, - - /* sromrev 11 */ - {"boardflags3", 0xfffff800, SRFL_PRHEX|SRFL_MORE, SROM11_BFL3, 0xffff}, - {"", 0, 0, SROM11_BFL3, 0xffff}, - {"boardnum", 0xfffff800, 0, SROM11_MACLO, 0xffff}, - {"macaddr", 0xfffff800, SRFL_ETHADDR, SROM11_MACHI, 0xffff}, - {"ccode", 0xfffff800, SRFL_CCODE, SROM11_CCODE, 0xffff}, - {"regrev", 0xfffff800, 0, SROM11_REGREV, 0x00ff}, - {"ledbh0", 0xfffff800, SRFL_NOFFS, SROM11_LEDBH10, 0x00ff}, - {"ledbh1", 0xfffff800, SRFL_NOFFS, SROM11_LEDBH10, 0xff00}, - {"ledbh2", 0xfffff800, SRFL_NOFFS, SROM11_LEDBH32, 0x00ff}, - {"ledbh3", 0xfffff800, SRFL_NOFFS, SROM11_LEDBH32, 0xff00}, - {"leddc", 0xfffff800, SRFL_NOFFS|SRFL_LEDDC, SROM11_LEDDC, 0xffff}, - {"aa2g", 0xfffff800, 0, SROM11_AA, 0x00ff}, - {"aa5g", 0xfffff800, 0, SROM11_AA, 0xff00}, - {"agbg0", 0xfffff800, 0, SROM11_AGBG10, 0x00ff}, - {"agbg1", 0xfffff800, 0, SROM11_AGBG10, 0xff00}, - {"agbg2", 0xfffff800, 0, SROM11_AGBG2A0, 0x00ff}, - {"aga0", 0xfffff800, 0, SROM11_AGBG2A0, 0xff00}, - {"aga1", 0xfffff800, 0, SROM11_AGA21, 0x00ff}, - {"aga2", 0xfffff800, 0, SROM11_AGA21, 0xff00}, - {"txchain", 0xfffff800, SRFL_NOFFS, SROM11_TXRXC, SROM4_TXCHAIN_MASK}, - {"rxchain", 0xfffff800, SRFL_NOFFS, SROM11_TXRXC, SROM4_RXCHAIN_MASK}, - {"antswitch", 0xfffff800, SRFL_NOFFS, SROM11_TXRXC, SROM4_SWITCH_MASK}, - - {"tssiposslope2g", 0xfffff800, 0, SROM11_FEM_CFG1, 0x0001}, - {"epagain2g", 0xfffff800, 0, SROM11_FEM_CFG1, 0x000e}, - {"pdgain2g", 0xfffff800, 0, SROM11_FEM_CFG1, 0x01f0}, - {"tworangetssi2g", 0xfffff800, 0, SROM11_FEM_CFG1, 0x0200}, - {"papdcap2g", 0xfffff800, 0, SROM11_FEM_CFG1, 0x0400}, - {"femctrl", 0xfffff800, 0, SROM11_FEM_CFG1, 0xf800}, - - {"tssiposslope5g", 0xfffff800, 0, SROM11_FEM_CFG2, 0x0001}, - {"epagain5g", 0xfffff800, 0, SROM11_FEM_CFG2, 0x000e}, - {"pdgain5g", 0xfffff800, 0, SROM11_FEM_CFG2, 0x01f0}, - {"tworangetssi5g", 0xfffff800, 0, SROM11_FEM_CFG2, 0x0200}, - {"papdcap5g", 0xfffff800, 0, SROM11_FEM_CFG2, 0x0400}, - {"gainctrlsph", 0xfffff800, 0, SROM11_FEM_CFG2, 0xf800}, - - {"tempthresh", 0xfffff800, 0, SROM11_THERMAL, 0xff00}, - {"tempoffset", 0xfffff800, 0, SROM11_THERMAL, 0x00ff}, - {"rawtempsense", 0xfffff800, SRFL_PRHEX, SROM11_MPWR_RAWTS, 0x01ff}, - {"measpower", 0xfffff800, SRFL_PRHEX, SROM11_MPWR_RAWTS, 0xfe00}, - {"tempsense_slope", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0x00ff}, - {"tempcorrx", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0xfc00}, - {"tempsense_option", 0xfffff800, SRFL_PRHEX, SROM11_TS_SLP_OPT_CORRX, 0x0300}, - {"phycal_tempdelta", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0x00ff}, - {"temps_period", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0x0f00}, - {"temps_hysteresis", 0xfffff800, 0, SROM11_PHYCAL_TEMPDELTA, 0xf000}, - {"measpower1", 0xfffff800, SRFL_PRHEX, SROM11_MPWR_1_AND_2, 0x007f}, - {"measpower2", 0xfffff800, SRFL_PRHEX, SROM11_MPWR_1_AND_2, 0x3f80}, - {"pdoffset40ma0", 0xfffff800, 0, SROM11_PDOFF_40M_A0, 0xffff}, - {"pdoffset40ma1", 0xfffff800, 0, SROM11_PDOFF_40M_A1, 0xffff}, - {"pdoffset40ma2", 0xfffff800, 0, SROM11_PDOFF_40M_A2, 0xffff}, - {"pdoffset80ma0", 0xfffff800, 0, SROM11_PDOFF_80M_A0, 0xffff}, - {"pdoffset80ma1", 0xfffff800, 0, SROM11_PDOFF_80M_A1, 0xffff}, - {"pdoffset80ma2", 0xfffff800, 0, SROM11_PDOFF_80M_A2, 0xffff}, - - {"subband5gver", 0xfffff800, SRFL_PRHEX, SROM11_SUBBAND5GVER, 0xffff}, - - /* power per rate */ - {"cckbw202gpo", 0xfffff800, 0, SROM11_CCKBW202GPO, 0xffff}, - {"cckbw20ul2gpo", 0xfffff800, 0, SROM11_CCKBW20UL2GPO, 0xffff}, - {"mcsbw202gpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW202GPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW202GPO_1, 0xffff}, - {"mcsbw402gpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW402GPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW402GPO_1, 0xffff}, - {"dot11agofdmhrbw202gpo", 0xfffff800, 0, SROM11_DOT11AGOFDMHRBW202GPO, 0xffff}, - {"ofdmlrbw202gpo", 0xfffff800, 0, SROM11_OFDMLRBW202GPO, 0xffff}, - {"mcsbw205glpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW205GLPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW205GLPO_1, 0xffff}, - {"mcsbw405glpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW405GLPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW405GLPO_1, 0xffff}, - {"mcsbw805glpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW805GLPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW805GLPO_1, 0xffff}, - {"mcsbw1605glpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW1605GLPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW1605GLPO_1, 0xffff}, - {"mcsbw205gmpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW205GMPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW205GMPO_1, 0xffff}, - {"mcsbw405gmpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW405GMPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW405GMPO_1, 0xffff}, - {"mcsbw805gmpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW805GMPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW805GMPO_1, 0xffff}, - {"mcsbw1605gmpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW1605GMPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW1605GMPO_1, 0xffff}, - {"mcsbw205ghpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW205GHPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW205GHPO_1, 0xffff}, - {"mcsbw405ghpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW405GHPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW405GHPO_1, 0xffff}, - {"mcsbw805ghpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW805GHPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW805GHPO_1, 0xffff}, - {"mcsbw1605ghpo", 0xfffff800, SRFL_MORE, SROM11_MCSBW1605GHPO, 0xffff}, - {"", 0xfffff800, 0, SROM11_MCSBW1605GHPO_1, 0xffff}, - {"mcslr5glpo", 0xfffff800, 0, SROM11_MCSLR5GLPO, 0xffff}, - {"mcslr5gmpo", 0xfffff800, 0, SROM11_MCSLR5GMPO, 0xffff}, - {"mcslr5ghpo", 0xfffff800, 0, SROM11_MCSLR5GHPO, 0xffff}, - {"sb20in40hrrpo", 0xfffff800, 0, SROM11_SB20IN40HRPO, 0xffff}, - {"sb20in80and160hr5glpo", 0xfffff800, 0, SROM11_SB20IN80AND160HR5GLPO, 0xffff}, - {"sb40and80hr5glpo", 0xfffff800, 0, SROM11_SB40AND80HR5GLPO, 0xffff}, - {"sb20in80and160hr5gmpo", 0xfffff800, 0, SROM11_SB20IN80AND160HR5GMPO, 0xffff}, - {"sb40and80hr5gmpo", 0xfffff800, 0, SROM11_SB40AND80HR5GMPO, 0xffff}, - {"sb20in80and160hr5ghpo", 0xfffff800, 0, SROM11_SB20IN80AND160HR5GHPO, 0xffff}, - {"sb40and80hr5ghpo", 0xfffff800, 0, SROM11_SB40AND80HR5GHPO, 0xffff}, - {"sb20in40lrpo", 0xfffff800, 0, SROM11_SB20IN40LRPO, 0xffff}, - {"sb20in80and160lr5glpo", 0xfffff800, 0, SROM11_SB20IN80AND160LR5GLPO, 0xffff}, - {"sb40and80lr5glpo", 0xfffff800, 0, SROM11_SB40AND80LR5GLPO, 0xffff}, - {"sb20in80and160lr5gmpo", 0xfffff800, 0, SROM11_SB20IN80AND160LR5GMPO, 0xffff}, - {"sb40and80lr5gmpo", 0xfffff800, 0, SROM11_SB40AND80LR5GMPO, 0xffff}, - {"sb20in80and160lr5ghpo", 0xfffff800, 0, SROM11_SB20IN80AND160LR5GHPO, 0xffff}, - {"sb40and80lr5ghpo", 0xfffff800, 0, SROM11_SB40AND80LR5GHPO, 0xffff}, - {"dot11agduphrpo", 0xfffff800, 0, SROM11_DOT11AGDUPHRPO, 0xffff}, - {"dot11agduplrpo", 0xfffff800, 0, SROM11_DOT11AGDUPLRPO, 0xffff}, - - /* Misc */ - {"pcieingress_war", 0xfffff800, 0, SROM11_PCIEINGRESS_WAR, 0xf}, - {"sar2g", 0xfffff800, 0, SROM11_SAR, 0x00ff}, - {"sar5g", 0xfffff800, 0, SROM11_SAR, 0xff00}, - - {"noiselvl2ga0", 0xfffff800, 0, SROM11_NOISELVL_2G, 0x001f}, - {"noiselvl2ga1", 0xfffff800, 0, SROM11_NOISELVL_2G, 0x03e0}, - {"noiselvl2ga2", 0xfffff800, 0, SROM11_NOISELVL_2G, 0x7c00}, - {"noiselvl5ga0", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GL, 0x001f}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GM, 0x001f}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GH, 0x001f}, - {"", 0xfffff800, 0, SROM11_NOISELVL_5GU, 0x001f}, - {"noiselvl5ga1", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GL, 0x03e0}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GM, 0x03e0}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GH, 0x03e0}, - {"", 0xfffff800, 0, SROM11_NOISELVL_5GU, 0x03e0}, - {"noiselvl5ga2", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GL, 0x7c00}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GM, 0x7c00}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_NOISELVL_5GH, 0x7c00}, - {"", 0xfffff800, 0, SROM11_NOISELVL_5GU, 0x7c00}, - - {"rxgainerr2ga0", 0xfffff800, 0, SROM11_RXGAINERR_2G, 0x003f}, - {"rxgainerr2ga1", 0xfffff800, 0, SROM11_RXGAINERR_2G, 0x07c0}, - {"rxgainerr2ga2", 0xfffff800, 0, SROM11_RXGAINERR_2G, 0xf800}, - {"rxgainerr5ga0", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GL, 0x003f}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GM, 0x003f}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GH, 0x003f}, - {"", 0xfffff800, 0, SROM11_RXGAINERR_5GU, 0x003f}, - {"rxgainerr5ga1", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GL, 0x07c0}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GM, 0x07c0}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GH, 0x07c0}, - {"", 0xfffff800, 0, SROM11_RXGAINERR_5GU, 0x07c0}, - {"rxgainerr5ga2", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GL, 0xf800}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GM, 0xf800}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_RXGAINERR_5GH, 0xf800}, - {"", 0xfffff800, 0, SROM11_RXGAINERR_5GU, 0xf800}, - - {NULL, 0, 0, 0, 0} -}; - -static const sromvar_t perpath_pci_sromvars[] = { - {"maxp2ga", 0x000000f0, 0, SROM4_2G_ITT_MAXP, 0x00ff}, - {"itt2ga", 0x000000f0, 0, SROM4_2G_ITT_MAXP, 0xff00}, - {"itt5ga", 0x000000f0, 0, SROM4_5G_ITT_MAXP, 0xff00}, - {"pa2gw0a", 0x000000f0, SRFL_PRHEX, SROM4_2G_PA, 0xffff}, - {"pa2gw1a", 0x000000f0, SRFL_PRHEX, SROM4_2G_PA + 1, 0xffff}, - {"pa2gw2a", 0x000000f0, SRFL_PRHEX, SROM4_2G_PA + 2, 0xffff}, - {"pa2gw3a", 0x000000f0, SRFL_PRHEX, SROM4_2G_PA + 3, 0xffff}, - {"maxp5ga", 0x000000f0, 0, SROM4_5G_ITT_MAXP, 0x00ff}, - {"maxp5gha", 0x000000f0, 0, SROM4_5GLH_MAXP, 0x00ff}, - {"maxp5gla", 0x000000f0, 0, SROM4_5GLH_MAXP, 0xff00}, - {"pa5gw0a", 0x000000f0, SRFL_PRHEX, SROM4_5G_PA, 0xffff}, - {"pa5gw1a", 0x000000f0, SRFL_PRHEX, SROM4_5G_PA + 1, 0xffff}, - {"pa5gw2a", 0x000000f0, SRFL_PRHEX, SROM4_5G_PA + 2, 0xffff}, - {"pa5gw3a", 0x000000f0, SRFL_PRHEX, SROM4_5G_PA + 3, 0xffff}, - {"pa5glw0a", 0x000000f0, SRFL_PRHEX, SROM4_5GL_PA, 0xffff}, - {"pa5glw1a", 0x000000f0, SRFL_PRHEX, SROM4_5GL_PA + 1, 0xffff}, - {"pa5glw2a", 0x000000f0, SRFL_PRHEX, SROM4_5GL_PA + 2, 0xffff}, - {"pa5glw3a", 0x000000f0, SRFL_PRHEX, SROM4_5GL_PA + 3, 0xffff}, - {"pa5ghw0a", 0x000000f0, SRFL_PRHEX, SROM4_5GH_PA, 0xffff}, - {"pa5ghw1a", 0x000000f0, SRFL_PRHEX, SROM4_5GH_PA + 1, 0xffff}, - {"pa5ghw2a", 0x000000f0, SRFL_PRHEX, SROM4_5GH_PA + 2, 0xffff}, - {"pa5ghw3a", 0x000000f0, SRFL_PRHEX, SROM4_5GH_PA + 3, 0xffff}, - {"maxp2ga", 0x00000700, 0, SROM8_2G_ITT_MAXP, 0x00ff}, - {"itt2ga", 0x00000700, 0, SROM8_2G_ITT_MAXP, 0xff00}, - {"itt5ga", 0x00000700, 0, SROM8_5G_ITT_MAXP, 0xff00}, - {"pa2gw0a", 0x00000700, SRFL_PRHEX, SROM8_2G_PA, 0xffff}, - {"pa2gw1a", 0x00000700, SRFL_PRHEX, SROM8_2G_PA + 1, 0xffff}, - {"pa2gw2a", 0x00000700, SRFL_PRHEX, SROM8_2G_PA + 2, 0xffff}, - {"maxp5ga", 0x00000700, 0, SROM8_5G_ITT_MAXP, 0x00ff}, - {"maxp5gha", 0x00000700, 0, SROM8_5GLH_MAXP, 0x00ff}, - {"maxp5gla", 0x00000700, 0, SROM8_5GLH_MAXP, 0xff00}, - {"pa5gw0a", 0x00000700, SRFL_PRHEX, SROM8_5G_PA, 0xffff}, - {"pa5gw1a", 0x00000700, SRFL_PRHEX, SROM8_5G_PA + 1, 0xffff}, - {"pa5gw2a", 0x00000700, SRFL_PRHEX, SROM8_5G_PA + 2, 0xffff}, - {"pa5glw0a", 0x00000700, SRFL_PRHEX, SROM8_5GL_PA, 0xffff}, - {"pa5glw1a", 0x00000700, SRFL_PRHEX, SROM8_5GL_PA + 1, 0xffff}, - {"pa5glw2a", 0x00000700, SRFL_PRHEX, SROM8_5GL_PA + 2, 0xffff}, - {"pa5ghw0a", 0x00000700, SRFL_PRHEX, SROM8_5GH_PA, 0xffff}, - {"pa5ghw1a", 0x00000700, SRFL_PRHEX, SROM8_5GH_PA + 1, 0xffff}, - {"pa5ghw2a", 0x00000700, SRFL_PRHEX, SROM8_5GH_PA + 2, 0xffff}, - - /* sromrev 11 */ - {"maxp2ga", 0xfffff800, 0, SROM11_2G_MAXP, 0x00ff}, - {"pa2ga", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_2G_PA, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_2G_PA + 1, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX, SROM11_2G_PA + 2, 0xffff}, - {"rxgains5gmelnagaina", 0xfffff800, 0, SROM11_RXGAINS1, 0x0007}, - {"rxgains5gmtrisoa", 0xfffff800, 0, SROM11_RXGAINS1, 0x0078}, - {"rxgains5gmtrelnabypa", 0xfffff800, 0, SROM11_RXGAINS1, 0x0080}, - {"rxgains5ghelnagaina", 0xfffff800, 0, SROM11_RXGAINS1, 0x0700}, - {"rxgains5ghtrisoa", 0xfffff800, 0, SROM11_RXGAINS1, 0x7800}, - {"rxgains5ghtrelnabypa", 0xfffff800, 0, SROM11_RXGAINS1, 0x8000}, - {"rxgains2gelnagaina", 0xfffff800, 0, SROM11_RXGAINS, 0x0007}, - {"rxgains2gtrisoa", 0xfffff800, 0, SROM11_RXGAINS, 0x0078}, - {"rxgains2gtrelnabypa", 0xfffff800, 0, SROM11_RXGAINS, 0x0080}, - {"rxgains5gelnagaina", 0xfffff800, 0, SROM11_RXGAINS, 0x0700}, - {"rxgains5gtrisoa", 0xfffff800, 0, SROM11_RXGAINS, 0x7800}, - {"rxgains5gtrelnabypa", 0xfffff800, 0, SROM11_RXGAINS, 0x8000}, - {"maxp5ga", 0xfffff800, SRFL_ARRAY, SROM11_5GB1B0_MAXP, 0x00ff}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_5GB1B0_MAXP, 0xff00}, - {"", 0xfffff800, SRFL_ARRAY, SROM11_5GB3B2_MAXP, 0x00ff}, - {"", 0xfffff800, 0, SROM11_5GB3B2_MAXP, 0xff00}, - {"pa5ga", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_PA, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_PA + 1, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB0_PA + 2, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB1_PA, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB1_PA + 1, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB1_PA + 2, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB2_PA, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB2_PA + 1, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB2_PA + 2, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB3_PA, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX | SRFL_ARRAY, SROM11_5GB3_PA + 1, 0xffff}, - {"", 0xfffff800, SRFL_PRHEX, SROM11_5GB3_PA + 2, 0xffff}, - - {NULL, 0, 0, 0, 0} -}; - -#if !(defined(PHY_TYPE_HT) && defined(PHY_TYPE_N) && defined(PHY_TYPE_LP)) -#define PHY_TYPE_HT 7 /* HT-Phy value */ -#define PHY_TYPE_N 4 /* N-Phy value */ -#define PHY_TYPE_LP 5 /* LP-Phy value */ -#endif /* !(defined(PHY_TYPE_HT) && defined(PHY_TYPE_N) && defined(PHY_TYPE_LP)) */ -#if !defined(PHY_TYPE_AC) -#define PHY_TYPE_AC 11 /* AC-Phy value */ -#endif /* !defined(PHY_TYPE_AC) */ -#if !defined(PHY_TYPE_NULL) -#define PHY_TYPE_NULL 0xf /* Invalid Phy value */ -#endif /* !defined(PHY_TYPE_NULL) */ - -typedef struct { - uint16 phy_type; - uint16 bandrange; - uint16 chain; - const char *vars; -} pavars_t; - -static const pavars_t pavars[] = { - /* HTPHY */ - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_2G, 0, "pa2gw0a0 pa2gw1a0 pa2gw2a0"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_2G, 1, "pa2gw0a1 pa2gw1a1 pa2gw2a1"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_2G, 2, "pa2gw0a2 pa2gw1a2 pa2gw2a2"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND0, 0, "pa5glw0a0 pa5glw1a0 pa5glw2a0"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND0, 1, "pa5glw0a1 pa5glw1a1 pa5glw2a1"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND0, 2, "pa5glw0a2 pa5glw1a2 pa5glw2a2"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND1, 0, "pa5gw0a0 pa5gw1a0 pa5gw2a0"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND1, 1, "pa5gw0a1 pa5gw1a1 pa5gw2a1"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND1, 2, "pa5gw0a2 pa5gw1a2 pa5gw2a2"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND2, 0, "pa5ghw0a0 pa5ghw1a0 pa5ghw2a0"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND2, 1, "pa5ghw0a1 pa5ghw1a1 pa5ghw2a1"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND2, 2, "pa5ghw0a2 pa5ghw1a2 pa5ghw2a2"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND3, 0, "pa5gw0a3 pa5gw1a3 pa5gw2a3"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND3, 1, "pa5glw0a3 pa5glw1a3 pa5glw2a3"}, - {PHY_TYPE_HT, WL_CHAN_FREQ_RANGE_5G_BAND3, 2, "pa5ghw0a3 pa5ghw1a3 pa5ghw2a3"}, - /* NPHY */ - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_2G, 0, "pa2gw0a0 pa2gw1a0 pa2gw2a0"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_2G, 1, "pa2gw0a1 pa2gw1a1 pa2gw2a1"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND0, 0, "pa5glw0a0 pa5glw1a0 pa5glw2a0"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND0, 1, "pa5glw0a1 pa5glw1a1 pa5glw2a1"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND1, 0, "pa5gw0a0 pa5gw1a0 pa5gw2a0"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND1, 1, "pa5gw0a1 pa5gw1a1 pa5gw2a1"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND2, 0, "pa5ghw0a0 pa5ghw1a0 pa5ghw2a0"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5G_BAND2, 1, "pa5ghw0a1 pa5ghw1a1 pa5ghw2a1"}, - /* LPPHY */ - {PHY_TYPE_LP, WL_CHAN_FREQ_RANGE_2G, 0, "pa0b0 pa0b1 pa0b2"}, - {PHY_TYPE_LP, WL_CHAN_FREQ_RANGE_5GL, 0, "pa1lob0 pa1lob1 pa1lob2"}, - {PHY_TYPE_LP, WL_CHAN_FREQ_RANGE_5GM, 0, "pa1b0 pa1b1 pa1b2"}, - {PHY_TYPE_LP, WL_CHAN_FREQ_RANGE_5GH, 0, "pa1hib0 pa1hib1 pa1hib2"}, - /* ACPHY */ - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 0, "pa2ga0"}, - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 1, "pa2ga1"}, - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_2G, 2, "pa2ga2"}, - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 0, "pa5ga0"}, - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 1, "pa5ga1"}, - {PHY_TYPE_AC, WL_CHAN_FREQ_RANGE_5G_4BAND, 2, "pa5ga2"}, - {PHY_TYPE_NULL, 0, 0, ""} -}; - -typedef struct { - uint16 phy_type; - uint16 bandrange; - const char *vars; -} povars_t; - -static const povars_t povars[] = { - /* NPHY */ - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_2G, "mcs2gpo0 mcs2gpo1 mcs2gpo2 mcs2gpo3 " - "mcs2gpo4 mcs2gpo5 mcs2gpo6 mcs2gpo7"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5GL, "mcs5glpo0 mcs5glpo1 mcs5glpo2 mcs5glpo3 " - "mcs5glpo4 mcs5glpo5 mcs5glpo6 mcs5glpo7"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5GM, "mcs5gpo0 mcs5gpo1 mcs5gpo2 mcs5gpo3 " - "mcs5gpo4 mcs5gpo5 mcs5gpo6 mcs5gpo7"}, - {PHY_TYPE_N, WL_CHAN_FREQ_RANGE_5GH, "mcs5ghpo0 mcs5ghpo1 mcs5ghpo2 mcs5ghpo3 " - "mcs5ghpo4 mcs5ghpo5 mcs5ghpo6 mcs5ghpo7"}, - {PHY_TYPE_NULL, 0, ""} -}; - -typedef struct { - uint8 tag; /* Broadcom subtag name */ - uint32 revmask; /* Supported cis_sromrev */ - uint8 len; /* Length field of the tuple, note that it includes the - * subtag name (1 byte): 1 + tuple content length - */ - const char *params; -} cis_tuple_t; - -#define OTP_RAW (0xff - 1) /* Reserved tuple number for wrvar Raw input */ -#define OTP_VERS_1 (0xff - 2) /* CISTPL_VERS_1 */ -#define OTP_MANFID (0xff - 3) /* CISTPL_MANFID */ -#define OTP_RAW1 (0xff - 4) /* Like RAW, but comes first */ - -static const cis_tuple_t cis_hnbuvars[] = { - {OTP_RAW1, 0xffffffff, 0, ""}, /* special case */ - {OTP_VERS_1, 0xffffffff, 0, "smanf sproductname"}, /* special case (non BRCM tuple) */ - {OTP_MANFID, 0xffffffff, 4, "2manfid 2prodid"}, /* special case (non BRCM tuple) */ - /* Unified OTP: tupple to embed USB manfid inside SDIO CIS */ - {HNBU_UMANFID, 0xffffffff, 8, "8usbmanfid"}, - {HNBU_SROMREV, 0xffffffff, 2, "1sromrev"}, - /* NOTE: subdevid is also written to boardtype. - * Need to write HNBU_BOARDTYPE to change it if it is different. - */ - {HNBU_CHIPID, 0xffffffff, 11, "2vendid 2devid 2chiprev 2subvendid 2subdevid"}, - {HNBU_BOARDREV, 0xffffffff, 3, "2boardrev"}, - {HNBU_PAPARMS, 0xffffffff, 10, "2pa0b0 2pa0b1 2pa0b2 1pa0itssit 1pa0maxpwr 1opo"}, - {HNBU_AA, 0xffffffff, 3, "1aa2g 1aa5g"}, - {HNBU_AA, 0xffffffff, 3, "1aa0 1aa1"}, /* backward compatibility */ - {HNBU_AG, 0xffffffff, 5, "1ag0 1ag1 1ag2 1ag3"}, - {HNBU_BOARDFLAGS, 0xffffffff, 13, "4boardflags 4boardflags2 4boardflags3"}, - {HNBU_LEDS, 0xffffffff, 5, "1ledbh0 1ledbh1 1ledbh2 1ledbh3"}, - {HNBU_CCODE, 0xffffffff, 4, "2ccode 1cctl"}, - {HNBU_CCKPO, 0xffffffff, 3, "2cckpo"}, - {HNBU_OFDMPO, 0xffffffff, 5, "4ofdmpo"}, - {HNBU_PAPARMS5G, 0xffffffff, 23, "2pa1b0 2pa1b1 2pa1b2 2pa1lob0 2pa1lob1 2pa1lob2 " - "2pa1hib0 2pa1hib1 2pa1hib2 1pa1itssit " - "1pa1maxpwr 1pa1lomaxpwr 1pa1himaxpwr"}, - {HNBU_RDLID, 0xffffffff, 3, "2rdlid"}, - {HNBU_RSSISMBXA2G, 0xffffffff, 3, "0rssismf2g 0rssismc2g " - "0rssisav2g 0bxa2g"}, /* special case */ - {HNBU_RSSISMBXA5G, 0xffffffff, 3, "0rssismf5g 0rssismc5g " - "0rssisav5g 0bxa5g"}, /* special case */ - {HNBU_XTALFREQ, 0xffffffff, 5, "4xtalfreq"}, - {HNBU_TRI2G, 0xffffffff, 2, "1tri2g"}, - {HNBU_TRI5G, 0xffffffff, 4, "1tri5gl 1tri5g 1tri5gh"}, - {HNBU_RXPO2G, 0xffffffff, 2, "1rxpo2g"}, - {HNBU_RXPO5G, 0xffffffff, 2, "1rxpo5g"}, - {HNBU_BOARDNUM, 0xffffffff, 3, "2boardnum"}, - {HNBU_MACADDR, 0xffffffff, 7, "6macaddr"}, /* special case */ - {HNBU_RDLSN, 0xffffffff, 3, "2rdlsn"}, - {HNBU_BOARDTYPE, 0xffffffff, 3, "2boardtype"}, - {HNBU_LEDDC, 0xffffffff, 3, "2leddc"}, - {HNBU_RDLRNDIS, 0xffffffff, 2, "1rdlndis"}, - {HNBU_CHAINSWITCH, 0xffffffff, 5, "1txchain 1rxchain 2antswitch"}, - {HNBU_REGREV, 0xffffffff, 2, "1regrev"}, - {HNBU_FEM, 0x000007fe, 5, "0antswctl2g 0triso2g 0pdetrange2g 0extpagain2g " - "0tssipos2g 0antswctl5g 0triso5g 0pdetrange5g 0extpagain5g 0tssipos5g"}, /* special case */ - {HNBU_PAPARMS_C0, 0x000007fe, 31, "1maxp2ga0 1itt2ga0 2pa2gw0a0 2pa2gw1a0 " - "2pa2gw2a0 1maxp5ga0 1itt5ga0 1maxp5gha0 1maxp5gla0 2pa5gw0a0 2pa5gw1a0 2pa5gw2a0 " - "2pa5glw0a0 2pa5glw1a0 2pa5glw2a0 2pa5ghw0a0 2pa5ghw1a0 2pa5ghw2a0"}, - {HNBU_PAPARMS_C1, 0x000007fe, 31, "1maxp2ga1 1itt2ga1 2pa2gw0a1 2pa2gw1a1 " - "2pa2gw2a1 1maxp5ga1 1itt5ga1 1maxp5gha1 1maxp5gla1 2pa5gw0a1 2pa5gw1a1 2pa5gw2a1 " - "2pa5glw0a1 2pa5glw1a1 2pa5glw2a1 2pa5ghw0a1 2pa5ghw1a1 2pa5ghw2a1"}, - {HNBU_PO_CCKOFDM, 0xffffffff, 19, "2cck2gpo 4ofdm2gpo 4ofdm5gpo 4ofdm5glpo " - "4ofdm5ghpo"}, - {HNBU_PO_MCS2G, 0xffffffff, 17, "2mcs2gpo0 2mcs2gpo1 2mcs2gpo2 2mcs2gpo3 " - "2mcs2gpo4 2mcs2gpo5 2mcs2gpo6 2mcs2gpo7"}, - {HNBU_PO_MCS5GM, 0xffffffff, 17, "2mcs5gpo0 2mcs5gpo1 2mcs5gpo2 2mcs5gpo3 " - "2mcs5gpo4 2mcs5gpo5 2mcs5gpo6 2mcs5gpo7"}, - {HNBU_PO_MCS5GLH, 0xffffffff, 33, "2mcs5glpo0 2mcs5glpo1 2mcs5glpo2 2mcs5glpo3 " - "2mcs5glpo4 2mcs5glpo5 2mcs5glpo6 2mcs5glpo7 " - "2mcs5ghpo0 2mcs5ghpo1 2mcs5ghpo2 2mcs5ghpo3 " - "2mcs5ghpo4 2mcs5ghpo5 2mcs5ghpo6 2mcs5ghpo7"}, - {HNBU_CCKFILTTYPE, 0xffffffff, 2, "1cckdigfilttype"}, - {HNBU_PO_CDD, 0xffffffff, 3, "2cddpo"}, - {HNBU_PO_STBC, 0xffffffff, 3, "2stbcpo"}, - {HNBU_PO_40M, 0xffffffff, 3, "2bw40po"}, - {HNBU_PO_40MDUP, 0xffffffff, 3, "2bwduppo"}, - {HNBU_RDLRWU, 0xffffffff, 2, "1rdlrwu"}, - {HNBU_WPS, 0xffffffff, 3, "1wpsgpio 1wpsled"}, - {HNBU_USBFS, 0xffffffff, 2, "1usbfs"}, - {HNBU_ELNA2G, 0xffffffff, 2, "1elna2g"}, - {HNBU_ELNA5G, 0xffffffff, 2, "1elna5g"}, - {HNBU_CUSTOM1, 0xffffffff, 5, "4customvar1"}, - {OTP_RAW, 0xffffffff, 0, ""}, /* special case */ - {HNBU_OFDMPO5G, 0xffffffff, 13, "4ofdm5gpo 4ofdm5glpo 4ofdm5ghpo"}, - {HNBU_USBEPNUM, 0xffffffff, 3, "2usbepnum"}, - {HNBU_CCKBW202GPO, 0xffffffff, 5, "2cckbw202gpo 2cckbw20ul2gpo"}, - {HNBU_LEGOFDMBW202GPO, 0xffffffff, 9, "4legofdmbw202gpo 4legofdmbw20ul2gp"}, - {HNBU_LEGOFDMBW205GPO, 0xffffffff, 25, "4legofdmbw205glpo 4legofdmbw20ul5glpo " - "4legofdmbw205gmpo 4legofdmbw20ul5gmpo 4legofdmbw205ghpo 4legofdmbw20ul5ghpo"}, - {HNBU_MCS2GPO, 0xffffffff, 13, "4mcsbw202gpo 4mcsbw20ul2gpo 4mcsbw402gpo"}, - {HNBU_MCS5GLPO, 0xffffffff, 13, "4mcsbw205glpo 4mcsbw20ul5glpo 4mcsbw405glpo"}, - {HNBU_MCS5GMPO, 0xffffffff, 13, "4mcsbw205gmpo 4mcsbw20ul5gmpo 4mcsbw405gmpo"}, - {HNBU_MCS5GHPO, 0xffffffff, 13, "4mcsbw205ghpo 4mcsbw20ul5ghpo 4mcsbw405ghpo"}, - {HNBU_MCS32PO, 0xffffffff, 3, "2mcs32po"}, - {HNBU_LEG40DUPPO, 0xffffffff, 3, "2legofdm40duppo"}, - {HNBU_TEMPTHRESH, 0xffffffff, 7, "1tempthresh 0temps_period 0temps_hysteresis " - "1tempoffset 1tempsense_slope 0tempcorrx 0tempsense_option " - "1phycal_tempdelta"}, /* special case */ - {HNBU_MUXENAB, 0xffffffff, 2, "1muxenab"}, - {HNBU_FEM_CFG, 0xfffff800, 5, "0femctrl 0papdcap2g 0tworangetssi2g 0pdgain2g " - "0epagain2g 0tssiposslope2g 0gainctrlsph 0papdcap5g 0tworangetssi5g 0pdgain5g 0epagain5g " - "0tssiposslope5g"}, /* special case */ - {HNBU_ACPA_C0, 0xfffff800, 39, "2subband5gver 2maxp2ga0 2*3pa2ga0 " - "1*4maxp5ga0 2*12pa5ga0"}, - {HNBU_ACPA_C1, 0xfffff800, 37, "2maxp2ga1 2*3pa2ga1 1*4maxp5ga1 2*12pa5ga1"}, - {HNBU_ACPA_C2, 0xfffff800, 37, "2maxp2ga2 2*3pa2ga2 1*4maxp5ga2 2*12pa5ga2"}, - {HNBU_MEAS_PWR, 0xfffff800, 5, "1measpower 1measpower1 1measpower2 2rawtempsense"}, - {HNBU_PDOFF, 0xfffff800, 13, "2pdoffset40ma0 2pdoffset40ma1 2pdoffset40ma2 " - "2pdoffset80ma0 2pdoffset80ma1 2pdoffset80ma2"}, - {HNBU_ACPPR_2GPO, 0xfffff800, 5, "2dot11agofdmhrbw202gpo 2ofdmlrbw202gpo"}, - {HNBU_ACPPR_5GPO, 0xfffff800, 31, "4mcsbw805glpo 4mcsbw1605glpo 4mcsbw805gmpo " - "4mcsbw1605gmpo 4mcsbw805ghpo 4mcsbw1605ghpo 2mcslr5rlpo 2mcslr5gmpo 2mcslr5ghpo"}, - {HNBU_ACPPR_SBPO, 0xfffff800, 33, "2sb20in40hrrpo 2sb20in80and160hr5glpo " - "2sb40and80hr5glpo 2sb20in80and160hr5gmpo 2sb40and80hr5gmpo 2sb20in80and160hr5ghpo " - "2sb40and80hr5ghpo 2sb20in40lrpo 2sb20in80and160lr5glpo 2sb40and80lr5glpo " - "2sb20in80and160lr5gmpo 2sb40and80lr5gmpo 2sb20in80and160lr5ghpo 2sb40and80lr5ghpo " - "2dot11agduphrpo 2dot11agduplrpo"}, - {HNBU_NOISELVL, 0xfffff800, 16, "1noiselvl2ga0 1noiselvl2ga1 1noiselvl2ga2 " - "1*4noiselvl5ga0 1*4noiselvl5ga1 1*4noiselvl5ga2"}, - {HNBU_RXGAIN_ERR, 0xfffff800, 16, "1rxgainerr2ga0 1rxgainerr2ga1 1rxgainerr2ga2 " - "1*4rxgainerr5ga0 1*4rxgainerr5ga1 1*4rxgainerr5ga2"}, - {HNBU_AGBGA, 0xfffff800, 7, "1agbg0 1agbg1 1agbg2 1aga0 1aga1 1aga2"}, - {HNBU_UUID, 0xffffffff, 17, "16uuid"}, - {HNBU_WOWLGPIO, 0xffffffff, 2, "1wowl_gpio"}, - {HNBU_ACRXGAINS_C0, 0xfffff800, 5, "0rxgains5gtrelnabypa0 0rxgains5gtrisoa0 " - "0rxgains5gelnagaina0 0rxgains2gtrelnabypa0 0rxgains2gtrisoa0 0rxgains2gelnagaina0 " - "0rxgains5ghtrelnabypa0 0rxgains5ghtrisoa0 0rxgains5ghelnagaina0 0rxgains5gmtrelnabypa0 " - "0rxgains5gmtrisoa0 0rxgains5gmelnagaina0"}, /* special case */ - {HNBU_ACRXGAINS_C1, 0xfffff800, 5, "0rxgains5gtrelnabypa1 0rxgains5gtrisoa1 " - "0rxgains5gelnagaina1 0rxgains2gtrelnabypa1 0rxgains2gtrisoa1 0rxgains2gelnagaina1 " - "0rxgains5ghtrelnabypa1 0rxgains5ghtrisoa1 0rxgains5ghelnagaina1 0rxgains5gmtrelnabypa1 " - "0rxgains5gmtrisoa1 0rxgains5gmelnagaina1"}, /* special case */ - {HNBU_ACRXGAINS_C2, 0xfffff800, 5, "0rxgains5gtrelnabypa2 0rxgains5gtrisoa2 " - "0rxgains5gelnagaina2 0rxgains2gtrelnabypa2 0rxgains2gtrisoa2 0rxgains2gelnagaina2 " - "0rxgains5ghtrelnabypa2 0rxgains5ghtrisoa2 0rxgains5ghelnagaina2 0rxgains5gmtrelnabypa2 " - "0rxgains5gmtrisoa2 0rxgains5gmelnagaina2"}, /* special case */ - {0xFF, 0xffffffff, 0, ""} -}; - -#endif /* _bcmsrom_tbl_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/dbus.h b/drivers/net/wireless/bcmdhd/include/dbus.h deleted file mode 100755 index c5ea223..0000000 --- a/drivers/net/wireless/bcmdhd/include/dbus.h +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Dongle BUS interface Abstraction layer - * target serial buses like USB, SDIO, SPI, etc. - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: dbus.h 323680 2012-03-26 17:52:31Z $ - */ - -#ifndef __DBUS_H__ -#define __DBUS_H__ - -#include "typedefs.h" - -#define DBUSTRACE(args) -#define DBUSERR(args) -#define DBUSINFO(args) -#define DBUSTRACE(args) -#define DBUSDBGLOCK(args) - -enum { - DBUS_OK = 0, - DBUS_ERR = -200, - DBUS_ERR_TIMEOUT, - DBUS_ERR_DISCONNECT, - DBUS_ERR_NODEVICE, - DBUS_ERR_UNSUPPORTED, - DBUS_ERR_PENDING, - DBUS_ERR_NOMEM, - DBUS_ERR_TXFAIL, - DBUS_ERR_TXTIMEOUT, - DBUS_ERR_TXDROP, - DBUS_ERR_RXFAIL, - DBUS_ERR_RXDROP, - DBUS_ERR_TXCTLFAIL, - DBUS_ERR_RXCTLFAIL, - DBUS_ERR_REG_PARAM, - DBUS_STATUS_CANCELLED, - DBUS_ERR_NVRAM, - DBUS_JUMBO_NOMATCH, - DBUS_JUMBO_BAD_FORMAT, - DBUS_NVRAM_NONTXT -}; - -#define BCM_OTP_SIZE_43236 84 /* number of 16 bit values */ -#define BCM_OTP_SW_RGN_43236 24 /* start offset of SW config region */ -#define BCM_OTP_ADDR_43236 0x18000800 /* address of otp base */ - -#define ERR_CBMASK_TXFAIL 0x00000001 -#define ERR_CBMASK_RXFAIL 0x00000002 -#define ERR_CBMASK_ALL 0xFFFFFFFF - -#define DBUS_CBCTL_WRITE 0 -#define DBUS_CBCTL_READ 1 -#if defined(INTR_EP_ENABLE) -#define DBUS_CBINTR_POLL 2 -#endif /* defined(INTR_EP_ENABLE) */ - -#define DBUS_TX_RETRY_LIMIT 3 /* retries for failed txirb */ -#define DBUS_TX_TIMEOUT_INTERVAL 250 /* timeout for txirb complete, in ms */ - -#define DBUS_BUFFER_SIZE_TX 16000 -#define DBUS_BUFFER_SIZE_RX 5000 - -#define DBUS_BUFFER_SIZE_TX_NOAGG 2048 -#define DBUS_BUFFER_SIZE_RX_NOAGG 2048 - -/* DBUS types */ -enum { - DBUS_USB, - DBUS_SDIO, - DBUS_SPI, - DBUS_UNKNOWN -}; - -enum dbus_state { - DBUS_STATE_DL_PENDING, - DBUS_STATE_DL_DONE, - DBUS_STATE_UP, - DBUS_STATE_DOWN, - DBUS_STATE_PNP_FWDL, - DBUS_STATE_DISCONNECT, - DBUS_STATE_SLEEP -}; - -enum dbus_pnp_state { - DBUS_PNP_DISCONNECT, - DBUS_PNP_SLEEP, - DBUS_PNP_RESUME -}; - -enum dbus_file { - DBUS_FIRMWARE, - DBUS_NVFILE -}; - -typedef enum _DEVICE_SPEED { - INVALID_SPEED = -1, - LOW_SPEED = 1, /* USB 1.1: 1.5 Mbps */ - FULL_SPEED, /* USB 1.1: 12 Mbps */ - HIGH_SPEED, /* USB 2.0: 480 Mbps */ - SUPER_SPEED, /* USB 3.0: 4.8 Gbps */ -} DEVICE_SPEED; - -typedef struct { - int bustype; - int vid; - int pid; - int devid; - int chiprev; /* chip revsion number */ - int mtu; - int nchan; /* Data Channels */ - int has_2nd_bulk_in_ep; -} dbus_attrib_t; - -/* FIX: Account for errors related to DBUS; - * Let upper layer account for packets/bytes - */ -typedef struct { - uint32 rx_errors; - uint32 tx_errors; - uint32 rx_dropped; - uint32 tx_dropped; -} dbus_stats_t; - -/* - * Configurable BUS parameters - */ -typedef struct { - bool rxctl_deferrespok; -} dbus_config_t; - -/* - * External Download Info - */ -typedef struct dbus_extdl { - uint8 *fw; - int fwlen; - uint8 *vars; - int varslen; -} dbus_extdl_t; - -struct dbus_callbacks; -struct exec_parms; - -typedef void *(*probe_cb_t)(void *arg, const char *desc, uint32 bustype, uint32 hdrlen); -typedef void (*disconnect_cb_t)(void *arg); -typedef void *(*exec_cb_t)(struct exec_parms *args); - -/* Client callbacks registered during dbus_attach() */ -typedef struct dbus_callbacks { - void (*send_complete)(void *cbarg, void *info, int status); - void (*recv_buf)(void *cbarg, uint8 *buf, int len); - void (*recv_pkt)(void *cbarg, void *pkt); - void (*txflowcontrol)(void *cbarg, bool onoff); - void (*errhandler)(void *cbarg, int err); - void (*ctl_complete)(void *cbarg, int type, int status); - void (*state_change)(void *cbarg, int state); - void *(*pktget)(void *cbarg, uint len, bool send); - void (*pktfree)(void *cbarg, void *p, bool send); -} dbus_callbacks_t; - -struct dbus_pub; -struct bcmstrbuf; -struct dbus_irb; -struct dbus_irb_rx; -struct dbus_irb_tx; -struct dbus_intf_callbacks; - -typedef struct { - void* (*attach)(struct dbus_pub *pub, void *cbarg, struct dbus_intf_callbacks *cbs); - void (*detach)(struct dbus_pub *pub, void *bus); - - int (*up)(void *bus); - int (*down)(void *bus); - int (*send_irb)(void *bus, struct dbus_irb_tx *txirb); - int (*recv_irb)(void *bus, struct dbus_irb_rx *rxirb); - int (*cancel_irb)(void *bus, struct dbus_irb_tx *txirb); - int (*send_ctl)(void *bus, uint8 *buf, int len); - int (*recv_ctl)(void *bus, uint8 *buf, int len); - int (*get_stats)(void *bus, dbus_stats_t *stats); - int (*get_attrib)(void *bus, dbus_attrib_t *attrib); - - int (*pnp)(void *bus, int evnt); - int (*remove)(void *bus); - int (*resume)(void *bus); - int (*suspend)(void *bus); - int (*stop)(void *bus); - int (*reset)(void *bus); - - /* Access to bus buffers directly */ - void *(*pktget)(void *bus, int len); - void (*pktfree)(void *bus, void *pkt); - - int (*iovar_op)(void *bus, const char *name, void *params, int plen, void *arg, int len, - bool set); - void (*dump)(void *bus, struct bcmstrbuf *strbuf); - int (*set_config)(void *bus, dbus_config_t *config); - int (*get_config)(void *bus, dbus_config_t *config); - - bool (*device_exists)(void *bus); - bool (*dlneeded)(void *bus); - int (*dlstart)(void *bus, uint8 *fw, int len); - int (*dlrun)(void *bus); - bool (*recv_needed)(void *bus); - - void *(*exec_rxlock)(void *bus, exec_cb_t func, struct exec_parms *args); - void *(*exec_txlock)(void *bus, exec_cb_t func, struct exec_parms *args); - - int (*tx_timer_init)(void *bus); - int (*tx_timer_start)(void *bus, uint timeout); - int (*tx_timer_stop)(void *bus); - - int (*sched_dpc)(void *bus); - int (*lock)(void *bus); - int (*unlock)(void *bus); - int (*sched_probe_cb)(void *bus); - - int (*shutdown)(void *bus); - - int (*recv_stop)(void *bus); - int (*recv_resume)(void *bus); - - int (*recv_irb_from_ep)(void *bus, struct dbus_irb_rx *rxirb, uint ep_idx); - - int (*readreg)(void *bus, uint32 regaddr, int datalen, uint32 *value); - - /* Add from the bottom */ -} dbus_intf_t; - -typedef struct dbus_pub { - struct osl_info *osh; - dbus_stats_t stats; - dbus_attrib_t attrib; - enum dbus_state busstate; - DEVICE_SPEED device_speed; - int ntxq, nrxq, rxsize; - void *bus; - struct shared_info *sh; - void *dev_info; -} dbus_pub_t; - -#define BUS_INFO(bus, type) (((type *) bus)->pub->bus) - -#define ALIGNED_LOCAL_VARIABLE(var, align) \ - uint8 buffer[SDALIGN+64]; \ - uint8 *var = (uint8 *)(((uintptr)&buffer[0]) & ~(align-1)) + align; - -/* - * Public Bus Function Interface - */ - -/* - * FIX: Is there better way to pass OS/Host handles to DBUS but still - * maintain common interface for all OS?? - * Under NDIS, param1 needs to be MiniportHandle - * For NDIS60, param2 is WdfDevice - * Under Linux, param1 and param2 are NULL; - */ -extern int dbus_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, void *prarg, - void *param1, void *param2); -extern int dbus_deregister(void); - -extern dbus_pub_t *dbus_attach(struct osl_info *osh, int rxsize, int nrxq, int ntxq, - void *cbarg, dbus_callbacks_t *cbs, dbus_extdl_t *extdl, struct shared_info *sh); -extern void dbus_detach(dbus_pub_t *pub); - -extern int dbus_up(dbus_pub_t *pub); -extern int dbus_down(dbus_pub_t *pub); -extern int dbus_stop(dbus_pub_t *pub); -extern int dbus_shutdown(dbus_pub_t *pub); -extern void dbus_flowctrl_rx(dbus_pub_t *pub, bool on); - -extern int dbus_send_txdata(dbus_pub_t *dbus, void *pktbuf); -extern int dbus_send_buf(dbus_pub_t *pub, uint8 *buf, int len, void *info); -extern int dbus_send_pkt(dbus_pub_t *pub, void *pkt, void *info); -extern int dbus_send_ctl(dbus_pub_t *pub, uint8 *buf, int len); -extern int dbus_recv_ctl(dbus_pub_t *pub, uint8 *buf, int len); -extern int dbus_recv_bulk(dbus_pub_t *pub, uint32 ep_idx); -extern int dbus_poll_intr(dbus_pub_t *pub); - -extern int dbus_get_stats(dbus_pub_t *pub, dbus_stats_t *stats); -extern int dbus_get_attrib(dbus_pub_t *pub, dbus_attrib_t *attrib); -extern int dbus_get_device_speed(dbus_pub_t *pub); -extern int dbus_set_config(dbus_pub_t *pub, dbus_config_t *config); -extern int dbus_get_config(dbus_pub_t *pub, dbus_config_t *config); -extern void * dbus_get_devinfo(dbus_pub_t *pub); - -extern void *dbus_pktget(dbus_pub_t *pub, int len); -extern void dbus_pktfree(dbus_pub_t *pub, void* pkt); - -extern int dbus_set_errmask(dbus_pub_t *pub, uint32 mask); -extern int dbus_pnp_sleep(dbus_pub_t *pub); -extern int dbus_pnp_resume(dbus_pub_t *pub, int *fw_reload); -extern int dbus_pnp_disconnect(dbus_pub_t *pub); - -extern int dbus_iovar_op(dbus_pub_t *pub, const char *name, - void *params, int plen, void *arg, int len, bool set); - -extern void *dhd_dbus_txq(const dbus_pub_t *pub); -extern uint dhd_dbus_hdrlen(const dbus_pub_t *pub); - -/* - * Private Common Bus Interface - */ - -/* IO Request Block (IRB) */ -typedef struct dbus_irb { - struct dbus_irb *next; /* it's casted from dbus_irb_tx or dbus_irb_rx struct */ -} dbus_irb_t; - -typedef struct dbus_irb_rx { - struct dbus_irb irb; /* Must be first */ - uint8 *buf; - int buf_len; - int actual_len; - void *pkt; - void *info; - void *arg; -} dbus_irb_rx_t; - -typedef struct dbus_irb_tx { - struct dbus_irb irb; /* Must be first */ - uint8 *buf; - int len; - void *pkt; - int retry_count; - void *info; - void *arg; - void *send_buf; /* linear bufffer for LINUX when aggreagtion is enabled */ -} dbus_irb_tx_t; - -/* DBUS interface callbacks are different from user callbacks - * so, internally, different info can be passed to upper layer - */ -typedef struct dbus_intf_callbacks { - void (*send_irb_timeout)(void *cbarg, dbus_irb_tx_t *txirb); - void (*send_irb_complete)(void *cbarg, dbus_irb_tx_t *txirb, int status); - void (*recv_irb_complete)(void *cbarg, dbus_irb_rx_t *rxirb, int status); - void (*errhandler)(void *cbarg, int err); - void (*ctl_complete)(void *cbarg, int type, int status); - void (*state_change)(void *cbarg, int state); - bool (*isr)(void *cbarg, bool *wantdpc); - bool (*dpc)(void *cbarg, bool bounded); - void (*watchdog)(void *cbarg); - void *(*pktget)(void *cbarg, uint len, bool send); - void (*pktfree)(void *cbarg, void *p, bool send); - struct dbus_irb* (*getirb)(void *cbarg, bool send); - void (*rxerr_indicate)(void *cbarg, bool on); -} dbus_intf_callbacks_t; - -/* - * Porting: To support new bus, port these functions below - */ - -/* - * Bus specific Interface - * Implemented by dbus_usb.c/dbus_sdio.c - */ -extern int dbus_bus_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, void *prarg, - dbus_intf_t **intf, void *param1, void *param2); -extern int dbus_bus_deregister(void); -extern void dbus_bus_fw_get(void *bus, uint8 **fw, int *fwlen, int *decomp); - -/* - * Bus-specific and OS-specific Interface - * Implemented by dbus_usb_[linux/ndis].c/dbus_sdio_[linux/ndis].c - */ -extern int dbus_bus_osl_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, - void *prarg, dbus_intf_t **intf, void *param1, void *param2); -extern int dbus_bus_osl_deregister(void); - -/* - * Bus-specific, OS-specific, HW-specific Interface - * Mainly for SDIO Host HW controller - */ -extern int dbus_bus_osl_hw_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, - void *prarg, dbus_intf_t **intf); -extern int dbus_bus_osl_hw_deregister(void); - -extern uint usbdev_bulkin_eps(void); -#if defined(BCM_REQUEST_FW) -extern void *dbus_get_fw_nvfile(int devid, uint8 **fw, int *fwlen, int type, - uint16 boardtype, uint16 boardrev); -extern void dbus_release_fw_nvfile(void *firmware); -#endif /* #if defined(BCM_REQUEST_FW) */ - - -#if defined(EHCI_FASTPATH_TX) || defined(EHCI_FASTPATH_RX) - - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) - /* Backward compatibility */ - typedef unsigned int gfp_t; - - #define dma_pool pci_pool - #define dma_pool_create(name, dev, size, align, alloc) \ - pci_pool_create(name, dev, size, align, alloc, GFP_DMA | GFP_ATOMIC) - #define dma_pool_destroy(pool) pci_pool_destroy(pool) - #define dma_pool_alloc(pool, flags, handle) pci_pool_alloc(pool, flags, handle) - #define dma_pool_free(pool, vaddr, addr) pci_pool_free(pool, vaddr, addr) - - #define dma_map_single(dev, addr, size, dir) pci_map_single(dev, addr, size, dir) - #define dma_unmap_single(dev, hnd, size, dir) pci_unmap_single(dev, hnd, size, dir) - #define DMA_FROM_DEVICE PCI_DMA_FROMDEVICE - #define DMA_TO_DEVICE PCI_DMA_TODEVICE -#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) */ - -/* Availability of these functions varies (when present, they have two arguments) */ -#ifndef hc32_to_cpu - #define hc32_to_cpu(x) le32_to_cpu(x) - #define cpu_to_hc32(x) cpu_to_le32(x) - typedef unsigned int __hc32; -#else - #error Two-argument functions needed -#endif - -/* Private USB opcode base */ -#define EHCI_FASTPATH 0x31 -#define EHCI_SET_EP_BYPASS EHCI_FASTPATH -#define EHCI_SET_BYPASS_CB (EHCI_FASTPATH + 1) -#define EHCI_SET_BYPASS_DEV (EHCI_FASTPATH + 2) -#define EHCI_DUMP_STATE (EHCI_FASTPATH + 3) -#define EHCI_SET_BYPASS_POOL (EHCI_FASTPATH + 4) -#define EHCI_CLR_EP_BYPASS (EHCI_FASTPATH + 5) - -/* - * EHCI QTD structure (hardware and extension) - * NOTE that is does not need to (and does not) match its kernel counterpart - */ -#define EHCI_QTD_NBUFFERS 5 -#define EHCI_QTD_ALIGN 32 -#define EHCI_BULK_PACKET_SIZE 512 -#define EHCI_QTD_XACTERR_MAX 32 - -struct ehci_qtd { - /* Hardware map */ - volatile uint32_t qtd_next; - volatile uint32_t qtd_altnext; - volatile uint32_t qtd_status; -#define EHCI_QTD_GET_BYTES(x) (((x)>>16) & 0x7fff) -#define EHCI_QTD_IOC 0x00008000 -#define EHCI_QTD_GET_CERR(x) (((x)>>10) & 0x3) -#define EHCI_QTD_SET_CERR(x) ((x) << 10) -#define EHCI_QTD_GET_PID(x) (((x)>>8) & 0x3) -#define EHCI_QTD_SET_PID(x) ((x) << 8) -#define EHCI_QTD_ACTIVE 0x80 -#define EHCI_QTD_HALTED 0x40 -#define EHCI_QTD_BUFERR 0x20 -#define EHCI_QTD_BABBLE 0x10 -#define EHCI_QTD_XACTERR 0x08 -#define EHCI_QTD_MISSEDMICRO 0x04 - volatile uint32_t qtd_buffer[EHCI_QTD_NBUFFERS]; - volatile uint32_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; - - /* Implementation extension */ - dma_addr_t qtd_self; /* own hardware address */ - struct ehci_qtd *obj_next; /* software link to the next QTD */ - void *rpc; /* pointer to the rpc buffer */ - size_t length; /* length of the data in the buffer */ - void *buff; /* pointer to the reassembly buffer */ - int xacterrs; /* retry counter for qtd xact error */ -} __attribute__ ((aligned(EHCI_QTD_ALIGN))); - -#define EHCI_NULL __constant_cpu_to_le32(1) /* HW null pointer shall be odd */ - -#define SHORT_READ_Q(token) (EHCI_QTD_GET_BYTES(token) != 0 && EHCI_QTD_GET_PID(token) == 1) - -/* Queue Head */ -/* NOTE This structure is slightly different from the one in the kernel; but needs to stay - * compatible - */ -struct ehci_qh { - /* Hardware map */ - volatile uint32_t qh_link; - volatile uint32_t qh_endp; - volatile uint32_t qh_endphub; - volatile uint32_t qh_curqtd; - - /* QTD overlay */ - volatile uint32_t ow_next; - volatile uint32_t ow_altnext; - volatile uint32_t ow_status; - volatile uint32_t ow_buffer [EHCI_QTD_NBUFFERS]; - volatile uint32_t ow_buffer_hi [EHCI_QTD_NBUFFERS]; - - /* Extension (should match the kernel layout) */ - dma_addr_t unused0; - void *unused1; - struct list_head unused2; - struct ehci_qtd *dummy; - struct ehci_qh *unused3; - - struct ehci_hcd *unused4; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) - struct kref unused5; - unsigned unused6; - - uint8_t unused7; - - /* periodic schedule info */ - uint8_t unused8; - uint8_t unused9; - uint8_t unused10; - uint16_t unused11; - uint16_t unused12; - uint16_t unused13; - struct usb_device *unused14; -#else - unsigned unused5; - - u8 unused6; - - /* periodic schedule info */ - u8 unused7; - u8 unused8; - u8 unused9; - unsigned short unused10; - unsigned short unused11; -#define NO_FRAME ((unsigned short)~0) -#ifdef EHCI_QUIRK_FIX - struct usb_device *unused12; -#endif /* EHCI_QUIRK_FIX */ -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) */ - struct ehci_qtd *first_qtd; - /* Link to the first QTD; this is an optimized equivalent of the qtd_list field */ - /* NOTE that ehci_qh in ehci.h shall reserve this word */ -} __attribute__ ((aligned(EHCI_QTD_ALIGN))); - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) -/* The corresponding structure in the kernel is used to get the QH */ -struct hcd_dev { /* usb_device.hcpriv points to this */ - struct list_head unused0; - struct list_head unused1; - - /* array of QH pointers */ - void *ep[32]; -}; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) */ - -int optimize_qtd_fill_with_rpc(const dbus_pub_t *pub, int epn, struct ehci_qtd *qtd, void *rpc, - int token, int len); -int optimize_qtd_fill_with_data(const dbus_pub_t *pub, int epn, struct ehci_qtd *qtd, void *data, - int token, int len); -int optimize_submit_async(struct ehci_qtd *qtd, int epn); -void inline optimize_ehci_qtd_init(struct ehci_qtd *qtd, dma_addr_t dma); -struct ehci_qtd *optimize_ehci_qtd_alloc(gfp_t flags); -void optimize_ehci_qtd_free(struct ehci_qtd *qtd); -void optimize_submit_rx_request(const dbus_pub_t *pub, int epn, struct ehci_qtd *qtd_in, void *buf); -#endif /* EHCI_FASTPATH_TX || EHCI_FASTPATH_RX */ - -void dbus_flowctrl_tx(void *dbi, bool on); -#endif /* __DBUS_H__ */ diff --git a/drivers/net/wireless/bcmdhd/include/epivers.h b/drivers/net/wireless/bcmdhd/include/epivers.h deleted file mode 100755 index b6c3b9b..0000000 --- a/drivers/net/wireless/bcmdhd/include/epivers.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: epivers.h.in,v 13.33 2010-09-08 22:08:53 csm Exp $ - * -*/ - -#ifndef _epivers_h_ -#define _epivers_h_ - -#define EPI_MAJOR_VERSION 1 - -#define EPI_MINOR_VERSION 28 - -#define EPI_RC_NUMBER 11 - -#define EPI_INCREMENTAL_NUMBER 5 - -#define EPI_BUILD_NUMBER 0 - -#define EPI_VERSION 1, 28, 11, 5 - -#define EPI_VERSION_NUM 0x011c0b05 - -#define EPI_VERSION_DEV 1.28.11 - -/* Driver Version String, ASCII, 32 chars max */ -#ifdef BCMINTERNAL -#define EPI_VERSION_STR "1.28.11.5 (r BCMINT)" -#else -#ifdef WLTEST -#define EPI_VERSION_STR "1.28.11.5 (r WLTEST)" -#else -#define EPI_VERSION_STR "1.28.11.5 (r)" -#endif -#endif /* BCMINTERNAL */ - -#endif /* _epivers_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11.h b/drivers/net/wireless/bcmdhd/include/proto/802.11.h deleted file mode 100755 index 1632e7d..0000000 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11.h +++ /dev/null @@ -1,2254 +0,0 @@ -/* - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * Fundamental types and constants relating to 802.11 - * - * $Id: 802.11.h 346820 2012-07-24 13:53:12Z $ - */ - -#ifndef _802_11_H_ -#define _802_11_H_ - -#ifndef _TYPEDEFS_H_ -#include <typedefs.h> -#endif - -#ifndef _NET_ETHERNET_H_ -#include <proto/ethernet.h> -#endif - -#include <proto/wpa.h> - - -#include <packed_section_start.h> - - -#define DOT11_TU_TO_US 1024 - - -#define DOT11_A3_HDR_LEN 24 -#define DOT11_A4_HDR_LEN 30 -#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN -#define DOT11_FCS_LEN 4 -#define DOT11_ICV_LEN 4 -#define DOT11_ICV_AES_LEN 8 -#define DOT11_QOS_LEN 2 -#define DOT11_HTC_LEN 4 - -#define DOT11_KEY_INDEX_SHIFT 6 -#define DOT11_IV_LEN 4 -#define DOT11_IV_TKIP_LEN 8 -#define DOT11_IV_AES_OCB_LEN 4 -#define DOT11_IV_AES_CCM_LEN 8 -#define DOT11_IV_MAX_LEN 8 - - -#define DOT11_MAX_MPDU_BODY_LEN 2304 - -#define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \ - DOT11_QOS_LEN + \ - DOT11_IV_AES_CCM_LEN + \ - DOT11_MAX_MPDU_BODY_LEN + \ - DOT11_ICV_LEN + \ - DOT11_FCS_LEN) - -#define DOT11_MAX_SSID_LEN 32 - - -#define DOT11_DEFAULT_RTS_LEN 2347 -#define DOT11_MAX_RTS_LEN 2347 - - -#define DOT11_MIN_FRAG_LEN 256 -#define DOT11_MAX_FRAG_LEN 2346 -#define DOT11_DEFAULT_FRAG_LEN 2346 - - -#define DOT11_MIN_BEACON_PERIOD 1 -#define DOT11_MAX_BEACON_PERIOD 0xFFFF - - -#define DOT11_MIN_DTIM_PERIOD 1 -#define DOT11_MAX_DTIM_PERIOD 0xFF - - -#define DOT11_LLC_SNAP_HDR_LEN 8 -#define DOT11_OUI_LEN 3 -BWL_PRE_PACKED_STRUCT struct dot11_llc_snap_header { - uint8 dsap; - uint8 ssap; - uint8 ctl; - uint8 oui[DOT11_OUI_LEN]; - uint16 type; -} BWL_POST_PACKED_STRUCT; - - -#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) - - - -BWL_PRE_PACKED_STRUCT struct dot11_header { - uint16 fc; - uint16 durid; - struct ether_addr a1; - struct ether_addr a2; - struct ether_addr a3; - uint16 seq; - struct ether_addr a4; -} BWL_POST_PACKED_STRUCT; - - - -BWL_PRE_PACKED_STRUCT struct dot11_rts_frame { - uint16 fc; - uint16 durid; - struct ether_addr ra; - struct ether_addr ta; -} BWL_POST_PACKED_STRUCT; -#define DOT11_RTS_LEN 16 - -BWL_PRE_PACKED_STRUCT struct dot11_cts_frame { - uint16 fc; - uint16 durid; - struct ether_addr ra; -} BWL_POST_PACKED_STRUCT; -#define DOT11_CTS_LEN 10 - -BWL_PRE_PACKED_STRUCT struct dot11_ack_frame { - uint16 fc; - uint16 durid; - struct ether_addr ra; -} BWL_POST_PACKED_STRUCT; -#define DOT11_ACK_LEN 10 - -BWL_PRE_PACKED_STRUCT struct dot11_ps_poll_frame { - uint16 fc; - uint16 durid; - struct ether_addr bssid; - struct ether_addr ta; -} BWL_POST_PACKED_STRUCT; -#define DOT11_PS_POLL_LEN 16 - -BWL_PRE_PACKED_STRUCT struct dot11_cf_end_frame { - uint16 fc; - uint16 durid; - struct ether_addr ra; - struct ether_addr bssid; -} BWL_POST_PACKED_STRUCT; -#define DOT11_CS_END_LEN 16 - - -BWL_PRE_PACKED_STRUCT struct dot11_action_wifi_vendor_specific { - uint8 category; - uint8 OUI[3]; - uint8 type; - uint8 subtype; - uint8 data[1040]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_action_wifi_vendor_specific dot11_action_wifi_vendor_specific_t; - - -BWL_PRE_PACKED_STRUCT struct dot11_action_vs_frmhdr { - uint8 category; - uint8 OUI[3]; - uint8 type; - uint8 subtype; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_action_vs_frmhdr dot11_action_vs_frmhdr_t; -#define DOT11_ACTION_VS_HDR_LEN 6 - -#define BCM_ACTION_OUI_BYTE0 0x00 -#define BCM_ACTION_OUI_BYTE1 0x90 -#define BCM_ACTION_OUI_BYTE2 0x4c - - -#define DOT11_BA_CTL_POLICY_NORMAL 0x0000 -#define DOT11_BA_CTL_POLICY_NOACK 0x0001 -#define DOT11_BA_CTL_POLICY_MASK 0x0001 - -#define DOT11_BA_CTL_MTID 0x0002 -#define DOT11_BA_CTL_COMPRESSED 0x0004 - -#define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 -#define DOT11_BA_CTL_NUMMSDU_SHIFT 6 - -#define DOT11_BA_CTL_TID_MASK 0xF000 -#define DOT11_BA_CTL_TID_SHIFT 12 - - -BWL_PRE_PACKED_STRUCT struct dot11_ctl_header { - uint16 fc; - uint16 durid; - struct ether_addr ra; - struct ether_addr ta; -} BWL_POST_PACKED_STRUCT; -#define DOT11_CTL_HDR_LEN 16 - - -BWL_PRE_PACKED_STRUCT struct dot11_bar { - uint16 bar_control; - uint16 seqnum; -} BWL_POST_PACKED_STRUCT; -#define DOT11_BAR_LEN 4 - -#define DOT11_BA_BITMAP_LEN 128 -#define DOT11_BA_CMP_BITMAP_LEN 8 - -BWL_PRE_PACKED_STRUCT struct dot11_ba { - uint16 ba_control; - uint16 seqnum; - uint8 bitmap[DOT11_BA_BITMAP_LEN]; -} BWL_POST_PACKED_STRUCT; -#define DOT11_BA_LEN 4 - - -BWL_PRE_PACKED_STRUCT struct dot11_management_header { - uint16 fc; - uint16 durid; - struct ether_addr da; - struct ether_addr sa; - struct ether_addr bssid; - uint16 seq; -} BWL_POST_PACKED_STRUCT; -#define DOT11_MGMT_HDR_LEN 24 - - - -BWL_PRE_PACKED_STRUCT struct dot11_bcn_prb { - uint32 timestamp[2]; - uint16 beacon_interval; - uint16 capability; -} BWL_POST_PACKED_STRUCT; -#define DOT11_BCN_PRB_LEN 12 -#define DOT11_BCN_PRB_FIXED_LEN 12 - -BWL_PRE_PACKED_STRUCT struct dot11_auth { - uint16 alg; - uint16 seq; - uint16 status; -} BWL_POST_PACKED_STRUCT; -#define DOT11_AUTH_FIXED_LEN 6 - -BWL_PRE_PACKED_STRUCT struct dot11_assoc_req { - uint16 capability; - uint16 listen; -} BWL_POST_PACKED_STRUCT; -#define DOT11_ASSOC_REQ_FIXED_LEN 4 - -BWL_PRE_PACKED_STRUCT struct dot11_reassoc_req { - uint16 capability; - uint16 listen; - struct ether_addr ap; -} BWL_POST_PACKED_STRUCT; -#define DOT11_REASSOC_REQ_FIXED_LEN 10 - -BWL_PRE_PACKED_STRUCT struct dot11_assoc_resp { - uint16 capability; - uint16 status; - uint16 aid; -} BWL_POST_PACKED_STRUCT; -#define DOT11_ASSOC_RESP_FIXED_LEN 6 - -BWL_PRE_PACKED_STRUCT struct dot11_action_measure { - uint8 category; - uint8 action; - uint8 token; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -#define DOT11_ACTION_MEASURE_LEN 3 - -BWL_PRE_PACKED_STRUCT struct dot11_action_ht_ch_width { - uint8 category; - uint8 action; - uint8 ch_width; -} BWL_POST_PACKED_STRUCT; - -BWL_PRE_PACKED_STRUCT struct dot11_action_ht_mimops { - uint8 category; - uint8 action; - uint8 control; -} BWL_POST_PACKED_STRUCT; - -BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query { - uint8 category; - uint8 action; - uint16 id; -} BWL_POST_PACKED_STRUCT; - -#define SM_PWRSAVE_ENABLE 1 -#define SM_PWRSAVE_MODE 2 - - -BWL_PRE_PACKED_STRUCT struct dot11_power_cnst { - uint8 id; - uint8 len; - uint8 power; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_power_cnst dot11_power_cnst_t; - -BWL_PRE_PACKED_STRUCT struct dot11_power_cap { - uint8 min; - uint8 max; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_power_cap dot11_power_cap_t; - -BWL_PRE_PACKED_STRUCT struct dot11_tpc_rep { - uint8 id; - uint8 len; - uint8 tx_pwr; - uint8 margin; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_tpc_rep dot11_tpc_rep_t; -#define DOT11_MNG_IE_TPC_REPORT_LEN 2 - -BWL_PRE_PACKED_STRUCT struct dot11_supp_channels { - uint8 id; - uint8 len; - uint8 first_channel; - uint8 num_channels; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_supp_channels dot11_supp_channels_t; - - -BWL_PRE_PACKED_STRUCT struct dot11_extch { - uint8 id; - uint8 len; - uint8 extch; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_extch dot11_extch_ie_t; - -BWL_PRE_PACKED_STRUCT struct dot11_brcm_extch { - uint8 id; - uint8 len; - uint8 oui[3]; - uint8 type; - uint8 extch; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t; - -#define BRCM_EXTCH_IE_LEN 5 -#define BRCM_EXTCH_IE_TYPE 53 -#define DOT11_EXTCH_IE_LEN 1 -#define DOT11_EXT_CH_MASK 0x03 -#define DOT11_EXT_CH_UPPER 0x01 -#define DOT11_EXT_CH_LOWER 0x03 -#define DOT11_EXT_CH_NONE 0x00 - -BWL_PRE_PACKED_STRUCT struct dot11_action_frmhdr { - uint8 category; - uint8 action; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -#define DOT11_ACTION_FRMHDR_LEN 2 - - -BWL_PRE_PACKED_STRUCT struct dot11_channel_switch { - uint8 id; - uint8 len; - uint8 mode; - uint8 channel; - uint8 count; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_channel_switch dot11_chan_switch_ie_t; - -#define DOT11_SWITCH_IE_LEN 3 - -#define DOT11_CSA_MODE_ADVISORY 0 -#define DOT11_CSA_MODE_NO_TX 1 - -BWL_PRE_PACKED_STRUCT struct dot11_action_switch_channel { - uint8 category; - uint8 action; - dot11_chan_switch_ie_t chan_switch_ie; - dot11_brcm_extch_ie_t extch_ie; -} BWL_POST_PACKED_STRUCT; - -BWL_PRE_PACKED_STRUCT struct dot11_csa_body { - uint8 mode; - uint8 reg; - uint8 channel; - uint8 count; -} BWL_POST_PACKED_STRUCT; - - -BWL_PRE_PACKED_STRUCT struct dot11_ext_csa { - uint8 id; - uint8 len; - struct dot11_csa_body b; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_ext_csa dot11_ext_csa_ie_t; -#define DOT11_EXT_CSA_IE_LEN 4 - -BWL_PRE_PACKED_STRUCT struct dot11_action_ext_csa { - uint8 category; - uint8 action; - dot11_ext_csa_ie_t chan_switch_ie; -} BWL_POST_PACKED_STRUCT; - -BWL_PRE_PACKED_STRUCT struct dot11y_action_ext_csa { - uint8 category; - uint8 action; - struct dot11_csa_body b; -} BWL_POST_PACKED_STRUCT; - -BWL_PRE_PACKED_STRUCT struct dot11_obss_coex { - uint8 id; - uint8 len; - uint8 info; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_obss_coex dot11_obss_coex_t; -#define DOT11_OBSS_COEXINFO_LEN 1 - -#define DOT11_OBSS_COEX_INFO_REQ 0x01 -#define DOT11_OBSS_COEX_40MHZ_INTOLERANT 0x02 -#define DOT11_OBSS_COEX_20MHZ_WIDTH_REQ 0x04 - -BWL_PRE_PACKED_STRUCT struct dot11_obss_chanlist { - uint8 id; - uint8 len; - uint8 regclass; - uint8 chanlist[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_obss_chanlist dot11_obss_chanlist_t; -#define DOT11_OBSS_CHANLIST_FIXED_LEN 1 - -BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie { - uint8 id; - uint8 len; - uint8 cap[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_extcap_ie dot11_extcap_ie_t; - -#define DOT11_EXTCAP_LEN_MAX 7 -#define DOT11_EXTCAP_LEN_COEX 1 -#define DOT11_EXTCAP_LEN_BT 3 -#define DOT11_EXTCAP_LEN_IW 4 -#define DOT11_EXTCAP_LEN_SI 6 - -#define DOT11_EXTCAP_LEN_TDLS 5 -BWL_PRE_PACKED_STRUCT struct dot11_extcap { - uint8 extcap[DOT11_EXTCAP_LEN_TDLS]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_extcap dot11_extcap_t; - - -#define TDLS_CAP_TDLS 37 -#define TDLS_CAP_PU_BUFFER_STA 28 -#define TDLS_CAP_PEER_PSM 20 -#define TDLS_CAP_CH_SW 30 -#define TDLS_CAP_PROH 38 -#define TDLS_CAP_CH_SW_PROH 39 - -#define TDLS_CAP_MAX_BIT 39 - - - -#define DOT11_MEASURE_TYPE_BASIC 0 -#define DOT11_MEASURE_TYPE_CCA 1 -#define DOT11_MEASURE_TYPE_RPI 2 -#define DOT11_MEASURE_TYPE_CHLOAD 3 -#define DOT11_MEASURE_TYPE_NOISE 4 -#define DOT11_MEASURE_TYPE_BEACON 5 -#define DOT11_MEASURE_TYPE_FRAME 6 -#define DOT11_MEASURE_TYPE_STATS 7 -#define DOT11_MEASURE_TYPE_LCI 8 -#define DOT11_MEASURE_TYPE_TXSTREAM 9 -#define DOT11_MEASURE_TYPE_PAUSE 255 - - -#define DOT11_MEASURE_MODE_PARALLEL (1<<0) -#define DOT11_MEASURE_MODE_ENABLE (1<<1) -#define DOT11_MEASURE_MODE_REQUEST (1<<2) -#define DOT11_MEASURE_MODE_REPORT (1<<3) -#define DOT11_MEASURE_MODE_DUR (1<<4) - -#define DOT11_MEASURE_MODE_LATE (1<<0) -#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) -#define DOT11_MEASURE_MODE_REFUSED (1<<2) - -#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) -#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) -#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) -#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) -#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) - -BWL_PRE_PACKED_STRUCT struct dot11_meas_req { - uint8 id; - uint8 len; - uint8 token; - uint8 mode; - uint8 type; - uint8 channel; - uint8 start_time[8]; - uint16 duration; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_meas_req dot11_meas_req_t; -#define DOT11_MNG_IE_MREQ_LEN 14 - -#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 - -BWL_PRE_PACKED_STRUCT struct dot11_meas_rep { - uint8 id; - uint8 len; - uint8 token; - uint8 mode; - uint8 type; - BWL_PRE_PACKED_STRUCT union - { - BWL_PRE_PACKED_STRUCT struct { - uint8 channel; - uint8 start_time[8]; - uint16 duration; - uint8 map; - } BWL_POST_PACKED_STRUCT basic; - uint8 data[1]; - } BWL_POST_PACKED_STRUCT rep; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_meas_rep dot11_meas_rep_t; - - -#define DOT11_MNG_IE_MREP_FIXED_LEN 3 - -BWL_PRE_PACKED_STRUCT struct dot11_meas_rep_basic { - uint8 channel; - uint8 start_time[8]; - uint16 duration; - uint8 map; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t; -#define DOT11_MEASURE_BASIC_REP_LEN 12 - -BWL_PRE_PACKED_STRUCT struct dot11_quiet { - uint8 id; - uint8 len; - uint8 count; - uint8 period; - uint16 duration; - uint16 offset; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_quiet dot11_quiet_t; - -BWL_PRE_PACKED_STRUCT struct chan_map_tuple { - uint8 channel; - uint8 map; -} BWL_POST_PACKED_STRUCT; -typedef struct chan_map_tuple chan_map_tuple_t; - -BWL_PRE_PACKED_STRUCT struct dot11_ibss_dfs { - uint8 id; - uint8 len; - uint8 eaddr[ETHER_ADDR_LEN]; - uint8 interval; - chan_map_tuple_t map[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_ibss_dfs dot11_ibss_dfs_t; - - -#define WME_OUI "\x00\x50\xf2" -#define WME_OUI_LEN 3 -#define WME_OUI_TYPE 2 -#define WME_TYPE 2 -#define WME_SUBTYPE_IE 0 -#define WME_SUBTYPE_PARAM_IE 1 -#define WME_SUBTYPE_TSPEC 2 -#define WME_VER 1 - - -#define AC_BE 0 -#define AC_BK 1 -#define AC_VI 2 -#define AC_VO 3 -#define AC_COUNT 4 - -typedef uint8 ac_bitmap_t; - -#define AC_BITMAP_NONE 0x0 -#define AC_BITMAP_ALL 0xf -#define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0) -#define AC_BITMAP_SET(ab, ac) (((ab) |= (1 << (ac)))) -#define AC_BITMAP_RESET(ab, ac) (((ab) &= ~(1 << (ac)))) - - -BWL_PRE_PACKED_STRUCT struct wme_ie { - uint8 oui[3]; - uint8 type; - uint8 subtype; - uint8 version; - uint8 qosinfo; -} BWL_POST_PACKED_STRUCT; -typedef struct wme_ie wme_ie_t; -#define WME_IE_LEN 7 - -BWL_PRE_PACKED_STRUCT struct edcf_acparam { - uint8 ACI; - uint8 ECW; - uint16 TXOP; -} BWL_POST_PACKED_STRUCT; -typedef struct edcf_acparam edcf_acparam_t; - - -BWL_PRE_PACKED_STRUCT struct wme_param_ie { - uint8 oui[3]; - uint8 type; - uint8 subtype; - uint8 version; - uint8 qosinfo; - uint8 rsvd; - edcf_acparam_t acparam[AC_COUNT]; -} BWL_POST_PACKED_STRUCT; -typedef struct wme_param_ie wme_param_ie_t; -#define WME_PARAM_IE_LEN 24 - - -#define WME_QI_AP_APSD_MASK 0x80 -#define WME_QI_AP_APSD_SHIFT 7 -#define WME_QI_AP_COUNT_MASK 0x0f -#define WME_QI_AP_COUNT_SHIFT 0 - - -#define WME_QI_STA_MAXSPLEN_MASK 0x60 -#define WME_QI_STA_MAXSPLEN_SHIFT 5 -#define WME_QI_STA_APSD_ALL_MASK 0xf -#define WME_QI_STA_APSD_ALL_SHIFT 0 -#define WME_QI_STA_APSD_BE_MASK 0x8 -#define WME_QI_STA_APSD_BE_SHIFT 3 -#define WME_QI_STA_APSD_BK_MASK 0x4 -#define WME_QI_STA_APSD_BK_SHIFT 2 -#define WME_QI_STA_APSD_VI_MASK 0x2 -#define WME_QI_STA_APSD_VI_SHIFT 1 -#define WME_QI_STA_APSD_VO_MASK 0x1 -#define WME_QI_STA_APSD_VO_SHIFT 0 - - -#define EDCF_AIFSN_MIN 1 -#define EDCF_AIFSN_MAX 15 -#define EDCF_AIFSN_MASK 0x0f -#define EDCF_ACM_MASK 0x10 -#define EDCF_ACI_MASK 0x60 -#define EDCF_ACI_SHIFT 5 -#define EDCF_AIFSN_SHIFT 12 - - -#define EDCF_ECW_MIN 0 -#define EDCF_ECW_MAX 15 -#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) -#define EDCF_ECWMIN_MASK 0x0f -#define EDCF_ECWMAX_MASK 0xf0 -#define EDCF_ECWMAX_SHIFT 4 - - -#define EDCF_TXOP_MIN 0 -#define EDCF_TXOP_MAX 65535 -#define EDCF_TXOP2USEC(txop) ((txop) << 5) - - -#define NON_EDCF_AC_BE_ACI_STA 0x02 - - -#define EDCF_AC_BE_ACI_STA 0x03 -#define EDCF_AC_BE_ECW_STA 0xA4 -#define EDCF_AC_BE_TXOP_STA 0x0000 -#define EDCF_AC_BK_ACI_STA 0x27 -#define EDCF_AC_BK_ECW_STA 0xA4 -#define EDCF_AC_BK_TXOP_STA 0x0000 -#define EDCF_AC_VI_ACI_STA 0x42 -#define EDCF_AC_VI_ECW_STA 0x43 -#define EDCF_AC_VI_TXOP_STA 0x005e -#define EDCF_AC_VO_ACI_STA 0x62 -#define EDCF_AC_VO_ECW_STA 0x32 -#define EDCF_AC_VO_TXOP_STA 0x002f - - -#define EDCF_AC_BE_ACI_AP 0x03 -#define EDCF_AC_BE_ECW_AP 0x64 -#define EDCF_AC_BE_TXOP_AP 0x0000 -#define EDCF_AC_BK_ACI_AP 0x27 -#define EDCF_AC_BK_ECW_AP 0xA4 -#define EDCF_AC_BK_TXOP_AP 0x0000 -#define EDCF_AC_VI_ACI_AP 0x41 -#define EDCF_AC_VI_ECW_AP 0x43 -#define EDCF_AC_VI_TXOP_AP 0x005e -#define EDCF_AC_VO_ACI_AP 0x61 -#define EDCF_AC_VO_ECW_AP 0x32 -#define EDCF_AC_VO_TXOP_AP 0x002f - - -BWL_PRE_PACKED_STRUCT struct edca_param_ie { - uint8 qosinfo; - uint8 rsvd; - edcf_acparam_t acparam[AC_COUNT]; -} BWL_POST_PACKED_STRUCT; -typedef struct edca_param_ie edca_param_ie_t; -#define EDCA_PARAM_IE_LEN 18 - - -BWL_PRE_PACKED_STRUCT struct qos_cap_ie { - uint8 qosinfo; -} BWL_POST_PACKED_STRUCT; -typedef struct qos_cap_ie qos_cap_ie_t; - -BWL_PRE_PACKED_STRUCT struct dot11_qbss_load_ie { - uint8 id; - uint8 length; - uint16 station_count; - uint8 channel_utilization; - uint16 aac; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t; -#define BSS_LOAD_IE_SIZE 7 - - -#define FIXED_MSDU_SIZE 0x8000 -#define MSDU_SIZE_MASK 0x7fff - - - -#define INTEGER_SHIFT 13 -#define FRACTION_MASK 0x1FFF - - -BWL_PRE_PACKED_STRUCT struct dot11_management_notification { - uint8 category; - uint8 action; - uint8 token; - uint8 status; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -#define DOT11_MGMT_NOTIFICATION_LEN 4 - - -BWL_PRE_PACKED_STRUCT struct ti_ie { - uint8 ti_type; - uint32 ti_val; -} BWL_POST_PACKED_STRUCT; -typedef struct ti_ie ti_ie_t; -#define TI_TYPE_REASSOC_DEADLINE 1 -#define TI_TYPE_KEY_LIFETIME 2 - - -#define WME_ADDTS_REQUEST 0 -#define WME_ADDTS_RESPONSE 1 -#define WME_DELTS_REQUEST 2 - - -#define WME_ADMISSION_ACCEPTED 0 -#define WME_INVALID_PARAMETERS 1 -#define WME_ADMISSION_REFUSED 3 - - -#define BCN_PRB_SSID(body) ((char*)(body) + DOT11_BCN_PRB_LEN) - - -#define DOT11_OPEN_SYSTEM 0 -#define DOT11_SHARED_KEY 1 -#define DOT11_FAST_BSS 2 -#define DOT11_CHALLENGE_LEN 128 - - -#define FC_PVER_MASK 0x3 -#define FC_PVER_SHIFT 0 -#define FC_TYPE_MASK 0xC -#define FC_TYPE_SHIFT 2 -#define FC_SUBTYPE_MASK 0xF0 -#define FC_SUBTYPE_SHIFT 4 -#define FC_TODS 0x100 -#define FC_TODS_SHIFT 8 -#define FC_FROMDS 0x200 -#define FC_FROMDS_SHIFT 9 -#define FC_MOREFRAG 0x400 -#define FC_MOREFRAG_SHIFT 10 -#define FC_RETRY 0x800 -#define FC_RETRY_SHIFT 11 -#define FC_PM 0x1000 -#define FC_PM_SHIFT 12 -#define FC_MOREDATA 0x2000 -#define FC_MOREDATA_SHIFT 13 -#define FC_WEP 0x4000 -#define FC_WEP_SHIFT 14 -#define FC_ORDER 0x8000 -#define FC_ORDER_SHIFT 15 - - -#define SEQNUM_SHIFT 4 -#define SEQNUM_MAX 0x1000 -#define FRAGNUM_MASK 0xF - - - - -#define FC_TYPE_MNG 0 -#define FC_TYPE_CTL 1 -#define FC_TYPE_DATA 2 - - -#define FC_SUBTYPE_ASSOC_REQ 0 -#define FC_SUBTYPE_ASSOC_RESP 1 -#define FC_SUBTYPE_REASSOC_REQ 2 -#define FC_SUBTYPE_REASSOC_RESP 3 -#define FC_SUBTYPE_PROBE_REQ 4 -#define FC_SUBTYPE_PROBE_RESP 5 -#define FC_SUBTYPE_BEACON 8 -#define FC_SUBTYPE_ATIM 9 -#define FC_SUBTYPE_DISASSOC 10 -#define FC_SUBTYPE_AUTH 11 -#define FC_SUBTYPE_DEAUTH 12 -#define FC_SUBTYPE_ACTION 13 -#define FC_SUBTYPE_ACTION_NOACK 14 - - -#define FC_SUBTYPE_CTL_WRAPPER 7 -#define FC_SUBTYPE_BLOCKACK_REQ 8 -#define FC_SUBTYPE_BLOCKACK 9 -#define FC_SUBTYPE_PS_POLL 10 -#define FC_SUBTYPE_RTS 11 -#define FC_SUBTYPE_CTS 12 -#define FC_SUBTYPE_ACK 13 -#define FC_SUBTYPE_CF_END 14 -#define FC_SUBTYPE_CF_END_ACK 15 - - -#define FC_SUBTYPE_DATA 0 -#define FC_SUBTYPE_DATA_CF_ACK 1 -#define FC_SUBTYPE_DATA_CF_POLL 2 -#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 -#define FC_SUBTYPE_NULL 4 -#define FC_SUBTYPE_CF_ACK 5 -#define FC_SUBTYPE_CF_POLL 6 -#define FC_SUBTYPE_CF_ACK_POLL 7 -#define FC_SUBTYPE_QOS_DATA 8 -#define FC_SUBTYPE_QOS_DATA_CF_ACK 9 -#define FC_SUBTYPE_QOS_DATA_CF_POLL 10 -#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 -#define FC_SUBTYPE_QOS_NULL 12 -#define FC_SUBTYPE_QOS_CF_POLL 14 -#define FC_SUBTYPE_QOS_CF_ACK_POLL 15 - - -#define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0) -#define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) -#define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) -#define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) - - -#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) - -#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) - -#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) -#define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) - -#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) -#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) -#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) -#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) -#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) -#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) -#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) -#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) -#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) -#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) -#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) -#define FC_ACTION_NOACK FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION_NOACK) - -#define FC_CTL_WRAPPER FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTL_WRAPPER) -#define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) -#define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) -#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) -#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) -#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) -#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) -#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) -#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) - -#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) -#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) -#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) -#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) -#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) - - - - -#define QOS_PRIO_SHIFT 0 -#define QOS_PRIO_MASK 0x0007 -#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) - - -#define QOS_TID_SHIFT 0 -#define QOS_TID_MASK 0x000f -#define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) - - -#define QOS_EOSP_SHIFT 4 -#define QOS_EOSP_MASK 0x0010 -#define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) - - -#define QOS_ACK_NORMAL_ACK 0 -#define QOS_ACK_NO_ACK 1 -#define QOS_ACK_NO_EXP_ACK 2 -#define QOS_ACK_BLOCK_ACK 3 -#define QOS_ACK_SHIFT 5 -#define QOS_ACK_MASK 0x0060 -#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) - - -#define QOS_AMSDU_SHIFT 7 -#define QOS_AMSDU_MASK 0x0080 - - - - - - -#define DOT11_MNG_AUTH_ALGO_LEN 2 -#define DOT11_MNG_AUTH_SEQ_LEN 2 -#define DOT11_MNG_BEACON_INT_LEN 2 -#define DOT11_MNG_CAP_LEN 2 -#define DOT11_MNG_AP_ADDR_LEN 6 -#define DOT11_MNG_LISTEN_INT_LEN 2 -#define DOT11_MNG_REASON_LEN 2 -#define DOT11_MNG_AID_LEN 2 -#define DOT11_MNG_STATUS_LEN 2 -#define DOT11_MNG_TIMESTAMP_LEN 8 - - -#define DOT11_AID_MASK 0x3fff - - -#define DOT11_RC_RESERVED 0 -#define DOT11_RC_UNSPECIFIED 1 -#define DOT11_RC_AUTH_INVAL 2 -#define DOT11_RC_DEAUTH_LEAVING 3 -#define DOT11_RC_INACTIVITY 4 -#define DOT11_RC_BUSY 5 -#define DOT11_RC_INVAL_CLASS_2 6 -#define DOT11_RC_INVAL_CLASS_3 7 -#define DOT11_RC_DISASSOC_LEAVING 8 -#define DOT11_RC_NOT_AUTH 9 -#define DOT11_RC_BAD_PC 10 -#define DOT11_RC_BAD_CHANNELS 11 - - - -#define DOT11_RC_UNSPECIFIED_QOS 32 -#define DOT11_RC_INSUFFCIENT_BW 33 -#define DOT11_RC_EXCESSIVE_FRAMES 34 -#define DOT11_RC_TX_OUTSIDE_TXOP 35 -#define DOT11_RC_LEAVING_QBSS 36 -#define DOT11_RC_BAD_MECHANISM 37 -#define DOT11_RC_SETUP_NEEDED 38 -#define DOT11_RC_TIMEOUT 39 - -#define DOT11_RC_MAX 23 - -#define DOT11_RC_TDLS_PEER_UNREACH 25 -#define DOT11_RC_TDLS_DOWN_UNSPECIFIED 26 - - -#define DOT11_SC_SUCCESS 0 -#define DOT11_SC_FAILURE 1 -#define DOT11_SC_TDLS_WAKEUP_SCH_ALT 2 - -#define DOT11_SC_TDLS_WAKEUP_SCH_REJ 3 -#define DOT11_SC_TDLS_SEC_DISABLED 5 -#define DOT11_SC_LIFETIME_REJ 6 -#define DOT11_SC_NOT_SAME_BSS 7 -#define DOT11_SC_CAP_MISMATCH 10 -#define DOT11_SC_REASSOC_FAIL 11 -#define DOT11_SC_ASSOC_FAIL 12 -#define DOT11_SC_AUTH_MISMATCH 13 -#define DOT11_SC_AUTH_SEQ 14 -#define DOT11_SC_AUTH_CHALLENGE_FAIL 15 -#define DOT11_SC_AUTH_TIMEOUT 16 -#define DOT11_SC_ASSOC_BUSY_FAIL 17 -#define DOT11_SC_ASSOC_RATE_MISMATCH 18 -#define DOT11_SC_ASSOC_SHORT_REQUIRED 19 -#define DOT11_SC_ASSOC_PBCC_REQUIRED 20 -#define DOT11_SC_ASSOC_AGILITY_REQUIRED 21 -#define DOT11_SC_ASSOC_SPECTRUM_REQUIRED 22 -#define DOT11_SC_ASSOC_BAD_POWER_CAP 23 -#define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24 -#define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED 25 -#define DOT11_SC_ASSOC_ERPBCC_REQUIRED 26 -#define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27 -#define DOT11_SC_ASSOC_R0KH_UNREACHABLE 28 -#define DOT11_SC_ASSOC_TRY_LATER 30 -#define DOT11_SC_ASSOC_MFP_VIOLATION 31 - -#define DOT11_SC_DECLINED 37 -#define DOT11_SC_INVALID_PARAMS 38 -#define DOT11_SC_INVALID_PAIRWISE_CIPHER 42 -#define DOT11_SC_INVALID_AKMP 43 -#define DOT11_SC_INVALID_RSNIE_CAP 45 -#define DOT11_SC_DLS_NOT_ALLOWED 48 -#define DOT11_SC_INVALID_PMKID 53 -#define DOT11_SC_INVALID_MDID 54 -#define DOT11_SC_INVALID_FTIE 55 - -#define DOT11_SC_UNEXP_MSG 70 -#define DOT11_SC_INVALID_SNONCE 71 -#define DOT11_SC_INVALID_RSNIE 72 - - -#define DOT11_MNG_DS_PARAM_LEN 1 -#define DOT11_MNG_IBSS_PARAM_LEN 2 - - -#define DOT11_MNG_TIM_FIXED_LEN 3 -#define DOT11_MNG_TIM_DTIM_COUNT 0 -#define DOT11_MNG_TIM_DTIM_PERIOD 1 -#define DOT11_MNG_TIM_BITMAP_CTL 2 -#define DOT11_MNG_TIM_PVB 3 - - -#define TLV_TAG_OFF 0 -#define TLV_LEN_OFF 1 -#define TLV_HDR_LEN 2 -#define TLV_BODY_OFF 2 - - -#define DOT11_MNG_SSID_ID 0 -#define DOT11_MNG_RATES_ID 1 -#define DOT11_MNG_FH_PARMS_ID 2 -#define DOT11_MNG_DS_PARMS_ID 3 -#define DOT11_MNG_CF_PARMS_ID 4 -#define DOT11_MNG_TIM_ID 5 -#define DOT11_MNG_IBSS_PARMS_ID 6 -#define DOT11_MNG_COUNTRY_ID 7 -#define DOT11_MNG_HOPPING_PARMS_ID 8 -#define DOT11_MNG_HOPPING_TABLE_ID 9 -#define DOT11_MNG_REQUEST_ID 10 -#define DOT11_MNG_QBSS_LOAD_ID 11 -#define DOT11_MNG_EDCA_PARAM_ID 12 -#define DOT11_MNG_CHALLENGE_ID 16 -#define DOT11_MNG_PWR_CONSTRAINT_ID 32 -#define DOT11_MNG_PWR_CAP_ID 33 -#define DOT11_MNG_TPC_REQUEST_ID 34 -#define DOT11_MNG_TPC_REPORT_ID 35 -#define DOT11_MNG_SUPP_CHANNELS_ID 36 -#define DOT11_MNG_CHANNEL_SWITCH_ID 37 -#define DOT11_MNG_MEASURE_REQUEST_ID 38 -#define DOT11_MNG_MEASURE_REPORT_ID 39 -#define DOT11_MNG_QUIET_ID 40 -#define DOT11_MNG_IBSS_DFS_ID 41 -#define DOT11_MNG_ERP_ID 42 -#define DOT11_MNG_TS_DELAY_ID 43 -#define DOT11_MNG_HT_CAP 45 -#define DOT11_MNG_QOS_CAP_ID 46 -#define DOT11_MNG_NONERP_ID 47 -#define DOT11_MNG_RSN_ID 48 -#define DOT11_MNG_EXT_RATES_ID 50 -#define DOT11_MNG_AP_CHREP_ID 51 -#define DOT11_MNG_NBR_REP_ID 52 -#define DOT11_MNG_MDIE_ID 54 -#define DOT11_MNG_FTIE_ID 55 -#define DOT11_MNG_FT_TI_ID 56 -#define DOT11_MNG_REGCLASS_ID 59 -#define DOT11_MNG_EXT_CSA_ID 60 -#define DOT11_MNG_HT_ADD 61 -#define DOT11_MNG_EXT_CHANNEL_OFFSET 62 -#define DOT11_MNG_WAPI_ID 68 -#define DOT11_MNG_TIME_ADVERTISE_ID 69 -#define DOT11_MNG_RRM_CAP_ID 70 -#define DOT11_MNG_HT_BSS_COEXINFO_ID 72 -#define DOT11_MNG_HT_BSS_CHANNEL_REPORT_ID 73 -#define DOT11_MNG_HT_OBSS_ID 74 -#define DOT11_MNG_CHANNEL_USAGE 97 -#define DOT11_MNG_TIME_ZONE_ID 98 -#define DOT11_MNG_LINK_IDENTIFIER_ID 101 -#define DOT11_MNG_WAKEUP_SCHEDULE_ID 102 -#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID 104 -#define DOT11_MNG_PTI_CONTROL_ID 105 -#define DOT11_MNG_PU_BUFFER_STATUS_ID 106 -#define DOT11_MNG_INTERWORKING_ID 107 -#define DOT11_MNG_ADVERTISEMENT_ID 108 -#define DOT11_MNG_EXP_BW_REQ_ID 109 -#define DOT11_MNG_QOS_MAP_ID 110 -#define DOT11_MNG_ROAM_CONSORT_ID 111 -#define DOT11_MNG_EMERGCY_ALERT_ID 112 -#define DOT11_MNG_EXT_CAP_ID 127 -#define DOT11_MNG_VHT_CAP_ID 191 -#define DOT11_MNG_VHT_OPERATION_ID 192 - -#define DOT11_MNG_WPA_ID 221 -#define DOT11_MNG_PROPR_ID 221 - -#define DOT11_MNG_VS_ID 221 - - -#define DOT11_RATE_BASIC 0x80 -#define DOT11_RATE_MASK 0x7F - - -#define DOT11_MNG_ERP_LEN 1 -#define DOT11_MNG_NONERP_PRESENT 0x01 -#define DOT11_MNG_USE_PROTECTION 0x02 -#define DOT11_MNG_BARKER_PREAMBLE 0x04 - -#define DOT11_MGN_TS_DELAY_LEN 4 -#define TS_DELAY_FIELD_SIZE 4 - - -#define DOT11_CAP_ESS 0x0001 -#define DOT11_CAP_IBSS 0x0002 -#define DOT11_CAP_POLLABLE 0x0004 -#define DOT11_CAP_POLL_RQ 0x0008 -#define DOT11_CAP_PRIVACY 0x0010 -#define DOT11_CAP_SHORT 0x0020 -#define DOT11_CAP_PBCC 0x0040 -#define DOT11_CAP_AGILITY 0x0080 -#define DOT11_CAP_SPECTRUM 0x0100 -#define DOT11_CAP_SHORTSLOT 0x0400 -#define DOT11_CAP_RRM 0x1000 -#define DOT11_CAP_CCK_OFDM 0x2000 - - - -#define DOT11_EXT_CAP_OBSS_COEX_MGMT 0 - -#define DOT11_EXT_CAP_SPSMP 6 - -#define DOT11_EXT_CAP_BSS_TRANSITION_MGMT 19 - -#define DOT11_EXT_CAP_IW 31 - -#define DOT11_EXT_CAP_SI 41 -#define DOT11_EXT_CAP_SI_MASK 0x0E - - -#define DOT11_ACTION_HDR_LEN 2 -#define DOT11_ACTION_CAT_OFF 0 -#define DOT11_ACTION_ACT_OFF 1 - - -#define DOT11_ACTION_CAT_ERR_MASK 0x80 -#define DOT11_ACTION_CAT_MASK 0x7F -#define DOT11_ACTION_CAT_SPECT_MNG 0 -#define DOT11_ACTION_CAT_QOS 1 -#define DOT11_ACTION_CAT_DLS 2 -#define DOT11_ACTION_CAT_BLOCKACK 3 -#define DOT11_ACTION_CAT_PUBLIC 4 -#define DOT11_ACTION_CAT_RRM 5 -#define DOT11_ACTION_CAT_FBT 6 -#define DOT11_ACTION_CAT_HT 7 -#define DOT11_ACTION_CAT_SA_QUERY 8 -#define DOT11_ACTION_CAT_PDPA 9 -#define DOT11_ACTION_CAT_BSSMGMT 10 -#define DOT11_ACTION_NOTIFICATION 17 -#define DOT11_ACTION_CAT_VSP 126 -#define DOT11_ACTION_CAT_VS 127 - - -#define DOT11_SM_ACTION_M_REQ 0 -#define DOT11_SM_ACTION_M_REP 1 -#define DOT11_SM_ACTION_TPC_REQ 2 -#define DOT11_SM_ACTION_TPC_REP 3 -#define DOT11_SM_ACTION_CHANNEL_SWITCH 4 -#define DOT11_SM_ACTION_EXT_CSA 5 - - -#define DOT11_ACTION_ID_HT_CH_WIDTH 0 -#define DOT11_ACTION_ID_HT_MIMO_PS 1 - - -#define DOT11_PUB_ACTION_BSS_COEX_MNG 0 -#define DOT11_PUB_ACTION_CHANNEL_SWITCH 4 - - -#define DOT11_BA_ACTION_ADDBA_REQ 0 -#define DOT11_BA_ACTION_ADDBA_RESP 1 -#define DOT11_BA_ACTION_DELBA 2 - - -#define DOT11_ADDBA_PARAM_AMSDU_SUP 0x0001 -#define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 -#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 -#define DOT11_ADDBA_PARAM_TID_MASK 0x003c -#define DOT11_ADDBA_PARAM_TID_SHIFT 2 -#define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 -#define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 - -#define DOT11_ADDBA_POLICY_DELAYED 0 -#define DOT11_ADDBA_POLICY_IMMEDIATE 1 - - -#define DOT11_FT_ACTION_FT_RESERVED 0 -#define DOT11_FT_ACTION_FT_REQ 1 -#define DOT11_FT_ACTION_FT_RES 2 -#define DOT11_FT_ACTION_FT_CON 3 -#define DOT11_FT_ACTION_FT_ACK 4 - - -#define DOT11_DLS_ACTION_REQ 0 -#define DOT11_DLS_ACTION_RESP 1 -#define DOT11_DLS_ACTION_TD 2 - - -#define DOT11_WNM_ACTION_EVENT_REQ 0 -#define DOT11_WNM_ACTION_EVENT_REP 1 -#define DOT11_WNM_ACTION_DIAG_REQ 2 -#define DOT11_WNM_ACTION_DIAG_REP 3 -#define DOT11_WNM_ACTION_LOC_CFG_REQ 4 -#define DOT11_WNM_ACTION_LOC_RFG_RESP 5 -#define DOT11_WNM_ACTION_BSS_TRANS_QURY 6 -#define DOT11_WNM_ACTION_BSS_TRANS_REQ 7 -#define DOT11_WNM_ACTION_BSS_TRANS_RESP 8 -#define DOT11_WNM_ACTION_FMS_REQ 9 -#define DOT11_WNM_ACTION_FMS_RESP 10 -#define DOT11_WNM_ACTION_COL_INTRFRNCE_REQ 11 -#define DOT11_WNM_ACTION_COL_INTRFRNCE_REP 12 -#define DOT11_WNM_ACTION_TFS_REQ 13 -#define DOT11_WNM_ACTION_TFS_RESP 14 -#define DOT11_WNM_ACTION_TFS_NOTIFY 15 -#define DOT11_WNM_ACTION_WNM_SLEEP_REQ 16 -#define DOT11_WNM_ACTION_WNM_SLEEP_RESP 17 -#define DOT11_WNM_ACTION_TIM_BCAST_REQ 18 -#define DOT11_WNM_ACTION_TIM_BCAST_RESP 19 -#define DOT11_WNM_ACTION_QOS_TRFC_CAP_UPD 20 -#define DOT11_WNM_ACTION_CHAN_USAGE_REQ 21 -#define DOT11_WNM_ACTION_CHAN_USAGE_RESP 22 -#define DOT11_WNM_ACTION_DMS_REQ 23 -#define DOT11_WNM_ACTION_DMS_RESP 24 -#define DOT11_WNM_ACTION_TMNG_MEASUR_REQ 25 -#define DOT11_WNM_ACTION_NOTFCTN_REQ 26 -#define DOT11_WNM_ACTION_NOTFCTN_RES 27 - -#define DOT11_MNG_COUNTRY_ID_LEN 3 - - -BWL_PRE_PACKED_STRUCT struct dot11_dls_req { - uint8 category; - uint8 action; - struct ether_addr da; - struct ether_addr sa; - uint16 cap; - uint16 timeout; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_dls_req dot11_dls_req_t; -#define DOT11_DLS_REQ_LEN 18 - - -BWL_PRE_PACKED_STRUCT struct dot11_dls_resp { - uint8 category; - uint8 action; - uint16 status; - struct ether_addr da; - struct ether_addr sa; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_dls_resp dot11_dls_resp_t; -#define DOT11_DLS_RESP_LEN 16 - - - -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_query { - uint8 category; - uint8 action; - uint8 token; - uint8 reason; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_query dot11_bss_trans_query_t; -#define DOT11_BSS_TRANS_QUERY_LEN 4 - - -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_req { - uint8 category; - uint8 action; - uint8 token; - uint8 reqmode; - uint16 disassoc_tmr; - uint8 validity_intrvl; - uint8 data[1]; - -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_req dot11_bss_trans_req_t; -#define DOT11_BSS_TRANS_REQ_LEN 7 - -#define DOT11_BSS_TERM_DUR_LEN 12 - - - -#define DOT11_BSS_TRNS_REQMODE_PREF_LIST_INCL 0x01 -#define DOT11_BSS_TRNS_REQMODE_ABRIDGED 0x02 -#define DOT11_BSS_TRNS_REQMODE_DISASSOC_IMMINENT 0x04 -#define DOT11_BSS_TRNS_REQMODE_BSS_TERM_INCL 0x08 -#define DOT11_BSS_TRNS_REQMODE_ESS_DISASSOC_IMNT 0x10 - - - -BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_res { - uint8 category; - uint8 action; - uint8 token; - uint8 status; - uint8 term_delay; - uint8 data[1]; - -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_bss_trans_res dot11_bss_trans_res_t; -#define DOT11_BSS_TRANS_RES_LEN 5 - - -#define DOT11_BSS_TRNS_RES_STATUS_ACCEPT 0 -#define DOT11_BSS_TRNS_RES_STATUS_REJECT 1 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_BCN 2 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_CAP 3 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_UNDESIRED 4 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_DELAY_REQ 5 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_BSS_LIST_PROVIDED 6 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_NO_SUITABLE_BSS 7 -#define DOT11_BSS_TRNS_RES_STATUS_REJ_LEAVING_ESS 8 - - - -#define DOT11_NBR_RPRT_BSSID_INFO_REACHABILTY 0x0003 -#define DOT11_NBR_RPRT_BSSID_INFO_SEC 0x0004 -#define DOT11_NBR_RPRT_BSSID_INFO_KEY_SCOPE 0x0008 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP 0x03f0 - -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_SPEC_MGMT 0x0010 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_QOS 0x0020 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_APSD 0x0040 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_RDIO_MSMT 0x0080 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_DEL_BA 0x0100 -#define DOT11_NBR_RPRT_BSSID_INFO_CAP_IMM_BA 0x0200 - - -#define DOT11_NBR_RPRT_SUBELEM_BSS_CANDDT_PREF_ID 3 - - -BWL_PRE_PACKED_STRUCT struct dot11_addba_req { - uint8 category; - uint8 action; - uint8 token; - uint16 addba_param_set; - uint16 timeout; - uint16 start_seqnum; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_addba_req dot11_addba_req_t; -#define DOT11_ADDBA_REQ_LEN 9 - -BWL_PRE_PACKED_STRUCT struct dot11_addba_resp { - uint8 category; - uint8 action; - uint8 token; - uint16 status; - uint16 addba_param_set; - uint16 timeout; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_addba_resp dot11_addba_resp_t; -#define DOT11_ADDBA_RESP_LEN 9 - - -#define DOT11_DELBA_PARAM_INIT_MASK 0x0800 -#define DOT11_DELBA_PARAM_INIT_SHIFT 11 -#define DOT11_DELBA_PARAM_TID_MASK 0xf000 -#define DOT11_DELBA_PARAM_TID_SHIFT 12 - -BWL_PRE_PACKED_STRUCT struct dot11_delba { - uint8 category; - uint8 action; - uint16 delba_param_set; - uint16 reason; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_delba dot11_delba_t; -#define DOT11_DELBA_LEN 6 - - -#define SA_QUERY_REQUEST 0 -#define SA_QUERY_RESPONSE 1 - - - - -BWL_PRE_PACKED_STRUCT struct dot11_ft_req { - uint8 category; - uint8 action; - uint8 sta_addr[ETHER_ADDR_LEN]; - uint8 tgt_ap_addr[ETHER_ADDR_LEN]; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_ft_req dot11_ft_req_t; -#define DOT11_FT_REQ_FIXED_LEN 14 - - -BWL_PRE_PACKED_STRUCT struct dot11_ft_res { - uint8 category; - uint8 action; - uint8 sta_addr[ETHER_ADDR_LEN]; - uint8 tgt_ap_addr[ETHER_ADDR_LEN]; - uint16 status; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_ft_res dot11_ft_res_t; -#define DOT11_FT_RES_FIXED_LEN 16 - - - - - - -#define DOT11_RRM_CAP_LEN 5 -BWL_PRE_PACKED_STRUCT struct dot11_rrm_cap_ie { - uint8 cap[DOT11_RRM_CAP_LEN]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rrm_cap_ie dot11_rrm_cap_ie_t; - - -#define DOT11_RRM_CAP_LINK 0 -#define DOT11_RRM_CAP_NEIGHBOR_REPORT 1 -#define DOT11_RRM_CAP_PARALLEL 2 -#define DOT11_RRM_CAP_REPEATED 3 -#define DOT11_RRM_CAP_BCN_PASSIVE 4 -#define DOT11_RRM_CAP_BCN_ACTIVE 5 -#define DOT11_RRM_CAP_BCN_TABLE 6 -#define DOT11_RRM_CAP_BCN_REP_COND 7 -#define DOT11_RRM_CAP_AP_CHANREP 16 - - - -#define DOT11_OP_CLASS_NONE 255 - - - -#define DOT11_RM_ACTION_RM_REQ 0 -#define DOT11_RM_ACTION_RM_REP 1 -#define DOT11_RM_ACTION_LM_REQ 2 -#define DOT11_RM_ACTION_LM_REP 3 -#define DOT11_RM_ACTION_NR_REQ 4 -#define DOT11_RM_ACTION_NR_REP 5 - - -BWL_PRE_PACKED_STRUCT struct dot11_rm_action { - uint8 category; - uint8 action; - uint8 token; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rm_action dot11_rm_action_t; -#define DOT11_RM_ACTION_LEN 3 - -BWL_PRE_PACKED_STRUCT struct dot11_rmreq { - uint8 category; - uint8 action; - uint8 token; - uint16 reps; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rmreq dot11_rmreq_t; -#define DOT11_RMREQ_LEN 5 - -BWL_PRE_PACKED_STRUCT struct dot11_rm_ie { - uint8 id; - uint8 len; - uint8 token; - uint8 mode; - uint8 type; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rm_ie dot11_rm_ie_t; -#define DOT11_RM_IE_LEN 5 - - -#define DOT11_RMREQ_MODE_PARALLEL 1 -#define DOT11_RMREQ_MODE_ENABLE 2 -#define DOT11_RMREQ_MODE_REQUEST 4 -#define DOT11_RMREQ_MODE_REPORT 8 -#define DOT11_RMREQ_MODE_DURMAND 0x10 - - -#define DOT11_RMREP_MODE_LATE 1 -#define DOT11_RMREP_MODE_INCAPABLE 2 -#define DOT11_RMREP_MODE_REFUSED 4 - -BWL_PRE_PACKED_STRUCT struct dot11_rmreq_bcn { - uint8 id; - uint8 len; - uint8 token; - uint8 mode; - uint8 type; - uint8 reg; - uint8 channel; - uint16 interval; - uint16 duration; - uint8 bcn_mode; - struct ether_addr bssid; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rmreq_bcn dot11_rmreq_bcn_t; -#define DOT11_RMREQ_BCN_LEN 18 - -BWL_PRE_PACKED_STRUCT struct dot11_rmrep_bcn { - uint8 reg; - uint8 channel; - uint32 starttime[2]; - uint16 duration; - uint8 frame_info; - uint8 rcpi; - uint8 rsni; - struct ether_addr bssid; - uint8 antenna_id; - uint32 parent_tsf; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rmrep_bcn dot11_rmrep_bcn_t; -#define DOT11_RMREP_BCN_LEN 26 - - -#define DOT11_RMREQ_BCN_PASSIVE 0 -#define DOT11_RMREQ_BCN_ACTIVE 1 -#define DOT11_RMREQ_BCN_TABLE 2 - - -#define DOT11_RMREQ_BCN_SSID_ID 0 -#define DOT11_RMREQ_BCN_REPINFO_ID 1 -#define DOT11_RMREQ_BCN_REPDET_ID 2 -#define DOT11_RMREQ_BCN_REQUEST_ID 10 -#define DOT11_RMREQ_BCN_APCHREP_ID 51 - - -#define DOT11_RMREQ_BCN_REPDET_FIXED 0 -#define DOT11_RMREQ_BCN_REPDET_REQUEST 1 -#define DOT11_RMREQ_BCN_REPDET_ALL 2 - - -#define DOT11_RMREP_BCN_FRM_BODY 1 - - -BWL_PRE_PACKED_STRUCT struct dot11_rmrep_nbr { - struct ether_addr bssid; - uint32 bssid_info; - uint8 reg; - uint8 channel; - uint8 phytype; - uchar sub_elements[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_rmrep_nbr dot11_rmrep_nbr_t; -#define DOT11_RMREP_NBR_LEN 13 - - -#define DOT11_BSSTYPE_INFRASTRUCTURE 0 -#define DOT11_BSSTYPE_INDEPENDENT 1 -#define DOT11_BSSTYPE_ANY 2 -#define DOT11_SCANTYPE_ACTIVE 0 -#define DOT11_SCANTYPE_PASSIVE 1 - - -BWL_PRE_PACKED_STRUCT struct dot11_lmreq { - uint8 category; - uint8 action; - uint8 token; - uint8 txpwr; - uint8 maxtxpwr; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_lmreq dot11_lmreq_t; -#define DOT11_LMREQ_LEN 5 - -BWL_PRE_PACKED_STRUCT struct dot11_lmrep { - uint8 category; - uint8 action; - uint8 token; - dot11_tpc_rep_t tpc; - uint8 rxant; - uint8 txant; - uint8 rcpi; - uint8 rsni; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_lmrep dot11_lmrep_t; -#define DOT11_LMREP_LEN 11 - - -#define PREN_PREAMBLE 24 -#define PREN_MM_EXT 12 -#define PREN_PREAMBLE_EXT 4 - - -#define RIFS_11N_TIME 2 - - - -#define HT_SIG1_MCS_MASK 0x00007F -#define HT_SIG1_CBW 0x000080 -#define HT_SIG1_HT_LENGTH 0xFFFF00 - - -#define HT_SIG2_SMOOTHING 0x000001 -#define HT_SIG2_NOT_SOUNDING 0x000002 -#define HT_SIG2_RESERVED 0x000004 -#define HT_SIG2_AGGREGATION 0x000008 -#define HT_SIG2_STBC_MASK 0x000030 -#define HT_SIG2_STBC_SHIFT 4 -#define HT_SIG2_FEC_CODING 0x000040 -#define HT_SIG2_SHORT_GI 0x000080 -#define HT_SIG2_ESS_MASK 0x000300 -#define HT_SIG2_ESS_SHIFT 8 -#define HT_SIG2_CRC 0x03FC00 -#define HT_SIG2_TAIL 0x1C0000 - - -#define APHY_SLOT_TIME 9 -#define APHY_SIFS_TIME 16 -#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) -#define APHY_PREAMBLE_TIME 16 -#define APHY_SIGNAL_TIME 4 -#define APHY_SYMBOL_TIME 4 -#define APHY_SERVICE_NBITS 16 -#define APHY_TAIL_NBITS 6 -#define APHY_CWMIN 15 - - -#define BPHY_SLOT_TIME 20 -#define BPHY_SIFS_TIME 10 -#define BPHY_DIFS_TIME 50 -#define BPHY_PLCP_TIME 192 -#define BPHY_PLCP_SHORT_TIME 96 -#define BPHY_CWMIN 31 - - -#define DOT11_OFDM_SIGNAL_EXTENSION 6 - -#define PHY_CWMAX 1023 - -#define DOT11_MAXNUMFRAGS 16 - - - -typedef int vht_group_id_t; - - - -#define VHT_SIGA1_CONST_MASK 0x800004 - -#define VHT_SIGA1_20MHZ_VAL 0x000000 -#define VHT_SIGA1_40MHZ_VAL 0x000001 -#define VHT_SIGA1_80MHZ_VAL 0x000002 -#define VHT_SIGA1_160MHZ_VAL 0x000003 - -#define VHT_SIGA1_STBC 0x000008 - -#define VHT_SIGA1_GID_MAX_GID 0x3f -#define VHT_SIGA1_GID_SHIFT 4 -#define VHT_SIGA1_GID_TO_AP 0x00 -#define VHT_SIGA1_GID_NOT_TO_AP 0x3f - -#define VHT_SIGA1_NSTS_SHIFT 10 -#define VHT_SIGA1_NSTS_SHIFT_MASK_USER0 0x001C00 - -#define VHT_SIGA1_PARTIAL_AID_SHIFT 13 - - -#define VHT_SIGA2_GI_NONE 0x000000 -#define VHT_SIGA2_GI_SHORT 0x000001 -#define VHT_SIGA2_GI_W_MOD10 0x000002 -#define VHT_SIGA2_CODING_LDPC 0x000004 -#define VHT_SIGA2_BEAMFORM_ENABLE 0x000100 -#define VHT_SIGA2_MCS_SHIFT 4 - -#define VHT_SIGA2_B9_RESERVED 0x000200 -#define VHT_SIGA2_TAIL_MASK 0xfc0000 -#define VHT_SIGA2_TAIL_VALUE 0x000000 - -#define VHT_SIGA2_SVC_BITS 16 -#define VHT_SIGA2_TAIL_BITS 6 - - - -typedef struct d11cnt { - uint32 txfrag; - uint32 txmulti; - uint32 txfail; - uint32 txretry; - uint32 txretrie; - uint32 rxdup; - uint32 txrts; - uint32 txnocts; - uint32 txnoack; - uint32 rxfrag; - uint32 rxmulti; - uint32 rxcrc; - uint32 txfrmsnt; - uint32 rxundec; -} d11cnt_t; - - -#define BRCM_PROP_OUI "\x00\x90\x4C" - - - -#define BRCM_OUI "\x00\x10\x18" - - -BWL_PRE_PACKED_STRUCT struct brcm_ie { - uint8 id; - uint8 len; - uint8 oui[3]; - uint8 ver; - uint8 assoc; - uint8 flags; - uint8 flags1; - uint16 amsdu_mtu_pref; -} BWL_POST_PACKED_STRUCT; -typedef struct brcm_ie brcm_ie_t; -#define BRCM_IE_LEN 11 -#define BRCM_IE_VER 2 -#define BRCM_IE_LEGACY_AES_VER 1 - - -#define BRF_LZWDS 0x4 -#define BRF_BLOCKACK 0x8 - - -#define BRF1_AMSDU 0x1 -#define BRF1_WMEPS 0x4 -#define BRF1_PSOFIX 0x8 -#define BRF1_RX_LARGE_AGG 0x10 -#define BRF1_RFAWARE_DCS 0x20 -#define BRF1_SOFTAP 0x40 - - -BWL_PRE_PACKED_STRUCT struct vndr_ie { - uchar id; - uchar len; - uchar oui [3]; - uchar data [1]; -} BWL_POST_PACKED_STRUCT; -typedef struct vndr_ie vndr_ie_t; - -#define VNDR_IE_HDR_LEN 2 -#define VNDR_IE_MIN_LEN 3 -#define VNDR_IE_FIXED_LEN (VNDR_IE_HDR_LEN + VNDR_IE_MIN_LEN) -#define VNDR_IE_MAX_LEN 256 - - -#define MCSSET_LEN 16 -#define MAX_MCS_NUM (128) - -BWL_PRE_PACKED_STRUCT struct ht_cap_ie { - uint16 cap; - uint8 params; - uint8 supp_mcs[MCSSET_LEN]; - uint16 ext_htcap; - uint32 txbf_cap; - uint8 as_cap; -} BWL_POST_PACKED_STRUCT; -typedef struct ht_cap_ie ht_cap_ie_t; - - - -BWL_PRE_PACKED_STRUCT struct ht_prop_cap_ie { - uint8 id; - uint8 len; - uint8 oui[3]; - uint8 type; - ht_cap_ie_t cap_ie; -} BWL_POST_PACKED_STRUCT; -typedef struct ht_prop_cap_ie ht_prop_cap_ie_t; - -#define HT_PROP_IE_OVERHEAD 4 -#define HT_CAP_IE_LEN 26 -#define HT_CAP_IE_TYPE 51 - -#define HT_CAP_LDPC_CODING 0x0001 -#define HT_CAP_40MHZ 0x0002 -#define HT_CAP_MIMO_PS_MASK 0x000C -#define HT_CAP_MIMO_PS_SHIFT 0x0002 -#define HT_CAP_MIMO_PS_OFF 0x0003 -#define HT_CAP_MIMO_PS_RTS 0x0001 -#define HT_CAP_MIMO_PS_ON 0x0000 -#define HT_CAP_GF 0x0010 -#define HT_CAP_SHORT_GI_20 0x0020 -#define HT_CAP_SHORT_GI_40 0x0040 -#define HT_CAP_TX_STBC 0x0080 -#define HT_CAP_RX_STBC_MASK 0x0300 -#define HT_CAP_RX_STBC_SHIFT 8 -#define HT_CAP_DELAYED_BA 0x0400 -#define HT_CAP_MAX_AMSDU 0x0800 - -#define HT_CAP_DSSS_CCK 0x1000 -#define HT_CAP_PSMP 0x2000 -#define HT_CAP_40MHZ_INTOLERANT 0x4000 -#define HT_CAP_LSIG_TXOP 0x8000 - -#define HT_CAP_RX_STBC_NO 0x0 -#define HT_CAP_RX_STBC_ONE_STREAM 0x1 -#define HT_CAP_RX_STBC_TWO_STREAM 0x2 -#define HT_CAP_RX_STBC_THREE_STREAM 0x3 - -#define VHT_MAX_MPDU 11454 -#define VHT_MPDU_MSDU_DELTA 56 - -#define VHT_MAX_AMSDU (VHT_MAX_MPDU - VHT_MPDU_MSDU_DELTA) - -#define HT_MAX_AMSDU 7935 -#define HT_MIN_AMSDU 3835 - -#define HT_PARAMS_RX_FACTOR_MASK 0x03 -#define HT_PARAMS_DENSITY_MASK 0x1C -#define HT_PARAMS_DENSITY_SHIFT 2 - - -#define AMPDU_MAX_MPDU_DENSITY 7 -#define AMPDU_DENSITY_NONE 0 -#define AMPDU_DENSITY_1over4_US 1 -#define AMPDU_DENSITY_1over2_US 2 -#define AMPDU_DENSITY_1_US 3 -#define AMPDU_DENSITY_2_US 4 -#define AMPDU_DENSITY_4_US 5 -#define AMPDU_DENSITY_8_US 6 -#define AMPDU_DENSITY_16_US 7 -#define AMPDU_RX_FACTOR_8K 0 -#define AMPDU_RX_FACTOR_16K 1 -#define AMPDU_RX_FACTOR_32K 2 -#define AMPDU_RX_FACTOR_64K 3 -#define AMPDU_RX_FACTOR_BASE 8*1024 - -#define AMPDU_DELIMITER_LEN 4 -#define AMPDU_DELIMITER_LEN_MAX 63 - -#define HT_CAP_EXT_PCO 0x0001 -#define HT_CAP_EXT_PCO_TTIME_MASK 0x0006 -#define HT_CAP_EXT_PCO_TTIME_SHIFT 1 -#define HT_CAP_EXT_MCS_FEEDBACK_MASK 0x0300 -#define HT_CAP_EXT_MCS_FEEDBACK_SHIFT 8 -#define HT_CAP_EXT_HTC 0x0400 -#define HT_CAP_EXT_RD_RESP 0x0800 - -BWL_PRE_PACKED_STRUCT struct ht_add_ie { - uint8 ctl_ch; - uint8 byte1; - uint16 opmode; - uint16 misc_bits; - uint8 basic_mcs[MCSSET_LEN]; -} BWL_POST_PACKED_STRUCT; -typedef struct ht_add_ie ht_add_ie_t; - - - -BWL_PRE_PACKED_STRUCT struct ht_prop_add_ie { - uint8 id; - uint8 len; - uint8 oui[3]; - uint8 type; - ht_add_ie_t add_ie; -} BWL_POST_PACKED_STRUCT; -typedef struct ht_prop_add_ie ht_prop_add_ie_t; - -#define HT_ADD_IE_LEN 22 -#define HT_ADD_IE_TYPE 52 - - -#define HT_BW_ANY 0x04 -#define HT_RIFS_PERMITTED 0x08 - - -#define HT_OPMODE_MASK 0x0003 -#define HT_OPMODE_SHIFT 0 -#define HT_OPMODE_PURE 0x0000 -#define HT_OPMODE_OPTIONAL 0x0001 -#define HT_OPMODE_HT20IN40 0x0002 -#define HT_OPMODE_MIXED 0x0003 -#define HT_OPMODE_NONGF 0x0004 -#define DOT11N_TXBURST 0x0008 -#define DOT11N_OBSS_NONHT 0x0010 - - -#define HT_BASIC_STBC_MCS 0x007f -#define HT_DUAL_STBC_PROT 0x0080 -#define HT_SECOND_BCN 0x0100 -#define HT_LSIG_TXOP 0x0200 -#define HT_PCO_ACTIVE 0x0400 -#define HT_PCO_PHASE 0x0800 -#define HT_DUALCTS_PROTECTION 0x0080 - - -#define DOT11N_2G_TXBURST_LIMIT 6160 -#define DOT11N_5G_TXBURST_LIMIT 3080 - - -#define GET_HT_OPMODE(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ - >> HT_OPMODE_SHIFT) -#define HT_MIXEDMODE_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ - == HT_OPMODE_MIXED) -#define HT_HT20_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ - == HT_OPMODE_HT20IN40) -#define HT_OPTIONAL_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ - == HT_OPMODE_OPTIONAL) -#define HT_USE_PROTECTION(add_ie) (HT_HT20_PRESENT((add_ie)) || \ - HT_MIXEDMODE_PRESENT((add_ie))) -#define HT_NONGF_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_NONGF) \ - == HT_OPMODE_NONGF) -#define DOT11N_TXBURST_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_TXBURST) \ - == DOT11N_TXBURST) -#define DOT11N_OBSS_NONHT_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_OBSS_NONHT) \ - == DOT11N_OBSS_NONHT) - -BWL_PRE_PACKED_STRUCT struct obss_params { - uint16 passive_dwell; - uint16 active_dwell; - uint16 bss_widthscan_interval; - uint16 passive_total; - uint16 active_total; - uint16 chanwidth_transition_dly; - uint16 activity_threshold; -} BWL_POST_PACKED_STRUCT; -typedef struct obss_params obss_params_t; - -BWL_PRE_PACKED_STRUCT struct dot11_obss_ie { - uint8 id; - uint8 len; - obss_params_t obss_params; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_obss_ie dot11_obss_ie_t; -#define DOT11_OBSS_SCAN_IE_LEN sizeof(obss_params_t) - - -#define HT_CTRL_LA_TRQ 0x00000002 -#define HT_CTRL_LA_MAI 0x0000003C -#define HT_CTRL_LA_MAI_SHIFT 2 -#define HT_CTRL_LA_MAI_MRQ 0x00000004 -#define HT_CTRL_LA_MAI_MSI 0x00000038 -#define HT_CTRL_LA_MFSI 0x000001C0 -#define HT_CTRL_LA_MFSI_SHIFT 6 -#define HT_CTRL_LA_MFB_ASELC 0x0000FE00 -#define HT_CTRL_LA_MFB_ASELC_SH 9 -#define HT_CTRL_LA_ASELC_CMD 0x00000C00 -#define HT_CTRL_LA_ASELC_DATA 0x0000F000 -#define HT_CTRL_CAL_POS 0x00030000 -#define HT_CTRL_CAL_SEQ 0x000C0000 -#define HT_CTRL_CSI_STEERING 0x00C00000 -#define HT_CTRL_CSI_STEER_SHIFT 22 -#define HT_CTRL_CSI_STEER_NFB 0 -#define HT_CTRL_CSI_STEER_CSI 1 -#define HT_CTRL_CSI_STEER_NCOM 2 -#define HT_CTRL_CSI_STEER_COM 3 -#define HT_CTRL_NDP_ANNOUNCE 0x01000000 -#define HT_CTRL_AC_CONSTRAINT 0x40000000 -#define HT_CTRL_RDG_MOREPPDU 0x80000000 - -#define HT_OPMODE_OPTIONAL 0x0001 -#define HT_OPMODE_HT20IN40 0x0002 -#define HT_OPMODE_MIXED 0x0003 -#define HT_OPMODE_NONGF 0x0004 -#define DOT11N_TXBURST 0x0008 -#define DOT11N_OBSS_NONHT 0x0010 - - - -BWL_PRE_PACKED_STRUCT struct vht_cap_ie { - uint32 vht_cap_info; - - uint16 rx_mcs_map; - uint16 rx_max_rate; - uint16 tx_mcs_map; - uint16 tx_max_rate; -} BWL_POST_PACKED_STRUCT; -typedef struct vht_cap_ie vht_cap_ie_t; - -#define VHT_CAP_IE_LEN 12 - -#define VHT_CAP_INFO_MAX_MPDU_LEN_MASK 0x00000003 -#define VHT_CAP_INFO_SUPP_CHAN_WIDTH_MASK 0x0000000c -#define VHT_CAP_INFO_LDPC 0x00000010 -#define VHT_CAP_INFO_SGI_80MHZ 0x00000020 - -#define VHT_CAP_INFO_SGI_160MHZ 0x00000040 -#define VHT_CAP_INFO_TX_STBC 0x00000080 - -#define VHT_CAP_INFO_RX_STBC_MASK 0x00000700 -#define VHT_CAP_INFO_RX_STBC_SHIFT 8 -#define VHT_CAP_INFO_SU_BEAMFMR 0x00000800 -#define VHT_CAP_INFO_SU_BEAMFMEE 0x00001000 -#define VHT_CAP_INFO_NUM_BMFMR_ANT_MASK 0x0000e000 -#define VHT_CAP_INFO_NUM_BMFMR_ANT_SHIFT 13 - -#define VHT_CAP_INFO_NUM_SOUNDING_DIM_MASK 0x00070000 -#define VHT_CAP_INFO_NUM_SOUNDING_DIM_SHIFT 16 -#define VHT_CAP_INFO_MU_BEAMFMR 0x00080000 -#define VHT_CAP_INFO_MU_BEAMFMEE 0x00100000 -#define VHT_CAP_INFO_TXOPPS 0x00200000 -#define VHT_CAP_INFO_HTCVHT 0x00400000 -#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_MASK 0x03800000 -#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_SHIFT 23 - -#define VHT_CAP_INFO_LINK_ADAPT_CAP_MASK 0x0c000000 -#define VHT_CAP_INFO_LINK_ADAPT_CAP_SHIFT 26 - - -#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_MASK 0x1fff -#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_SHIFT 0 - -#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_MASK 0x1fff -#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_SHIFT 0 - -#define VHT_CAP_MCS_MAP_0_7 0 -#define VHT_CAP_MCS_MAP_0_8 1 -#define VHT_CAP_MCS_MAP_0_9 2 -#define VHT_CAP_MCS_MAP_NONE 3 - -#define VHT_CAP_MCS_MAP_NSS_MAX 8 - - -typedef enum vht_cap_chan_width { - VHT_CAP_CHAN_WIDTH_20_40 = 0x00, - VHT_CAP_CHAN_WIDTH_80 = 0x04, - VHT_CAP_CHAN_WIDTH_160 = 0x08 -} vht_cap_chan_width_t; - - -typedef enum vht_cap_max_mpdu_len { - VHT_CAP_MPDU_MAX_4K = 0x00, - VHT_CAP_MPDU_MAX_8K = 0x01, - VHT_CAP_MPDU_MAX_11K = 0x02 -} vht_cap_max_mpdu_len_t; - - -BWL_PRE_PACKED_STRUCT struct vht_op_ie { - uint8 chan_width; - uint8 chan1; - uint8 chan2; - uint16 supp_mcs; -} BWL_POST_PACKED_STRUCT; -typedef struct vht_op_ie vht_op_ie_t; - -#define VHT_OP_IE_LEN 5 - -typedef enum vht_op_chan_width { - VHT_OP_CHAN_WIDTH_20_40 = 0, - VHT_OP_CHAN_WIDTH_80 = 1, - VHT_OP_CHAN_WIDTH_160 = 2, - VHT_OP_CHAN_WIDTH_80_80 = 3 -} vht_op_chan_width_t; - - -#define VHT_MCS_MAP_GET_SS_IDX(nss) (((nss)-1)*2) -#define VHT_MCS_MAP_GET_MCS_PER_SS(nss, mcsMap) \ - (((mcsMap) >> VHT_MCS_MAP_GET_SS_IDX(nss)) & 0x3) -#define VHT_MCS_MAP_SET_MCS_PER_SS(nss, numMcs, mcsMap) \ - ((mcsMap) |= (((numMcs) & 0x3) << VHT_MCS_MAP_GET_SS_IDX(nss))) - - -#define WPA_OUI "\x00\x50\xF2" -#define WPA_OUI_LEN 3 -#define WPA_OUI_TYPE 1 -#define WPA_VERSION 1 -#define WPA2_OUI "\x00\x0F\xAC" -#define WPA2_OUI_LEN 3 -#define WPA2_VERSION 1 -#define WPA2_VERSION_LEN 2 - - -#define WPS_OUI "\x00\x50\xF2" -#define WPS_OUI_LEN 3 -#define WPS_OUI_TYPE 4 - - - -#ifdef P2P_IE_OVRD -#define WFA_OUI MAC_OUI -#else -#define WFA_OUI "\x50\x6F\x9A" -#endif -#define WFA_OUI_LEN 3 -#ifdef P2P_IE_OVRD -#define WFA_OUI_TYPE_P2P MAC_OUI_TYPE_P2P -#else -#define WFA_OUI_TYPE_P2P 9 -#endif - -#define WFA_OUI_TYPE_TPC 8 -#ifdef WLTDLS -#define WFA_OUI_TYPE_WFD 10 -#endif - - -#define RSN_AKM_NONE 0 -#define RSN_AKM_UNSPECIFIED 1 -#define RSN_AKM_PSK 2 -#define RSN_AKM_FBT_1X 3 -#define RSN_AKM_FBT_PSK 4 -#define RSN_AKM_MFP_1X 5 -#define RSN_AKM_MFP_PSK 6 -#define RSN_AKM_TPK 7 - - -#define DOT11_MAX_DEFAULT_KEYS 4 -#define DOT11_MAX_KEY_SIZE 32 -#define DOT11_MAX_IV_SIZE 16 -#define DOT11_EXT_IV_FLAG (1<<5) -#define DOT11_WPA_KEY_RSC_LEN 8 - -#define WEP1_KEY_SIZE 5 -#define WEP1_KEY_HEX_SIZE 10 -#define WEP128_KEY_SIZE 13 -#define WEP128_KEY_HEX_SIZE 26 -#define TKIP_MIC_SIZE 8 -#define TKIP_EOM_SIZE 7 -#define TKIP_EOM_FLAG 0x5a -#define TKIP_KEY_SIZE 32 -#define TKIP_MIC_AUTH_TX 16 -#define TKIP_MIC_AUTH_RX 24 -#define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX -#define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX -#define AES_KEY_SIZE 16 -#define AES_MIC_SIZE 8 -#define BIP_KEY_SIZE 16 - - -#define WCN_OUI "\x00\x50\xf2" -#define WCN_TYPE 4 - -#ifdef BCMWAPI_WPI -#define SMS4_KEY_LEN 16 -#define SMS4_WPI_CBC_MAC_LEN 16 -#endif - - - - -BWL_PRE_PACKED_STRUCT struct dot11_mdid_ie { - uint8 id; - uint8 len; - uint16 mdid; - uint8 cap; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_mdid_ie dot11_mdid_ie_t; - -#define FBT_MDID_CAP_OVERDS 0x01 -#define FBT_MDID_CAP_RRP 0x02 - - -BWL_PRE_PACKED_STRUCT struct dot11_ft_ie { - uint8 id; - uint8 len; - uint16 mic_control; - uint8 mic[16]; - uint8 anonce[32]; - uint8 snonce[32]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_ft_ie dot11_ft_ie_t; - -#define TIE_TYPE_RESERVED 0 -#define TIE_TYPE_REASSOC_DEADLINE 1 -#define TIE_TYPE_KEY_LIEFTIME 2 -#define TIE_TYPE_ASSOC_COMEBACK 3 -BWL_PRE_PACKED_STRUCT struct dot11_timeout_ie { - uint8 id; - uint8 len; - uint8 type; - uint32 value; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_timeout_ie dot11_timeout_ie_t; - - - -BWL_PRE_PACKED_STRUCT struct dot11_gtk_ie { - uint8 id; - uint8 len; - uint16 key_info; - uint8 key_len; - uint8 rsc[8]; - uint8 data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct dot11_gtk_ie dot11_gtk_ie_t; - -#define BSSID_INVALID "\x00\x00\x00\x00\x00\x00" -#define BSSID_BROADCAST "\xFF\xFF\xFF\xFF\xFF\xFF" - -#ifdef BCMWAPI_WAI -#define WAPI_IE_MIN_LEN 20 -#define WAPI_VERSION 1 -#define WAPI_VERSION_LEN 2 -#define WAPI_OUI "\x00\x14\x72" -#define WAPI_OUI_LEN DOT11_OUI_LEN -#endif - - -#define WMM_OUI "\x00\x50\xF2" -#define WMM_OUI_LEN 3 -#define WMM_OUI_TYPE 2 -#define WMM_VERSION 1 -#define WMM_VERSION_LEN 1 - - -#define WMM_OUI_SUBTYPE_PARAMETER 1 -#define WMM_PARAMETER_IE_LEN 24 - - -BWL_PRE_PACKED_STRUCT struct link_id_ie { - uint8 id; - uint8 len; - struct ether_addr bssid; - struct ether_addr tdls_init_mac; - struct ether_addr tdls_resp_mac; -} BWL_POST_PACKED_STRUCT; -typedef struct link_id_ie link_id_ie_t; -#define TDLS_LINK_ID_IE_LEN 18 - - -BWL_PRE_PACKED_STRUCT struct wakeup_sch_ie { - uint8 id; - uint8 len; - uint32 offset; - uint32 interval; - uint32 awake_win_slots; - uint32 max_wake_win; - uint16 idle_cnt; -} BWL_POST_PACKED_STRUCT; -typedef struct wakeup_sch_ie wakeup_sch_ie_t; -#define TDLS_WAKEUP_SCH_IE_LEN 18 - - -BWL_PRE_PACKED_STRUCT struct channel_switch_timing_ie { - uint8 id; - uint8 len; - uint16 switch_time; - uint16 switch_timeout; -} BWL_POST_PACKED_STRUCT; -typedef struct channel_switch_timing_ie channel_switch_timing_ie_t; -#define TDLS_CHANNEL_SWITCH_TIMING_IE_LEN 4 - - -BWL_PRE_PACKED_STRUCT struct pti_control_ie { - uint8 id; - uint8 len; - uint8 tid; - uint16 seq_control; -} BWL_POST_PACKED_STRUCT; -typedef struct pti_control_ie pti_control_ie_t; -#define TDLS_PTI_CONTROL_IE_LEN 3 - - -BWL_PRE_PACKED_STRUCT struct pu_buffer_status_ie { - uint8 id; - uint8 len; - uint8 status; -} BWL_POST_PACKED_STRUCT; -typedef struct pu_buffer_status_ie pu_buffer_status_ie_t; -#define TDLS_PU_BUFFER_STATUS_IE_LEN 1 -#define TDLS_PU_BUFFER_STATUS_AC_BK 1 -#define TDLS_PU_BUFFER_STATUS_AC_BE 2 -#define TDLS_PU_BUFFER_STATUS_AC_VI 4 -#define TDLS_PU_BUFFER_STATUS_AC_VO 8 - - -#include <packed_section_end.h> - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h b/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h deleted file mode 100755 index 312074d..0000000 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Broadcom Event protocol definitions - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * Dependencies: proto/bcmeth.h - * - * $Id: bcmevent.h 326276 2012-04-06 23:16:42Z $ - * - */ - - - -#ifndef _BCMEVENT_H_ -#define _BCMEVENT_H_ - -#ifndef _TYPEDEFS_H_ -#include <typedefs.h> -#endif - - -#include <packed_section_start.h> - -#define BCM_EVENT_MSG_VERSION 2 -#define BCM_MSG_IFNAME_MAX 16 - - -#define WLC_EVENT_MSG_LINK 0x01 -#define WLC_EVENT_MSG_FLUSHTXQ 0x02 -#define WLC_EVENT_MSG_GROUP 0x04 -#define WLC_EVENT_MSG_UNKBSS 0x08 -#define WLC_EVENT_MSG_UNKIF 0x10 - - - - -typedef BWL_PRE_PACKED_STRUCT struct -{ - uint16 version; - uint16 flags; - uint32 event_type; - uint32 status; - uint32 reason; - uint32 auth_type; - uint32 datalen; - struct ether_addr addr; - char ifname[BCM_MSG_IFNAME_MAX]; -} BWL_POST_PACKED_STRUCT wl_event_msg_v1_t; - - -typedef BWL_PRE_PACKED_STRUCT struct -{ - uint16 version; - uint16 flags; - uint32 event_type; - uint32 status; - uint32 reason; - uint32 auth_type; - uint32 datalen; - struct ether_addr addr; - char ifname[BCM_MSG_IFNAME_MAX]; - uint8 ifidx; - uint8 bsscfgidx; -} BWL_POST_PACKED_STRUCT wl_event_msg_t; - - -typedef BWL_PRE_PACKED_STRUCT struct bcm_event { - struct ether_header eth; - bcmeth_hdr_t bcm_hdr; - wl_event_msg_t event; - -} BWL_POST_PACKED_STRUCT bcm_event_t; - -#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header)) - - -#define WLC_E_SET_SSID 0 -#define WLC_E_JOIN 1 -#define WLC_E_START 2 -#define WLC_E_AUTH 3 -#define WLC_E_AUTH_IND 4 -#define WLC_E_DEAUTH 5 -#define WLC_E_DEAUTH_IND 6 -#define WLC_E_ASSOC 7 -#define WLC_E_ASSOC_IND 8 -#define WLC_E_REASSOC 9 -#define WLC_E_REASSOC_IND 10 -#define WLC_E_DISASSOC 11 -#define WLC_E_DISASSOC_IND 12 -#define WLC_E_QUIET_START 13 -#define WLC_E_QUIET_END 14 -#define WLC_E_BEACON_RX 15 -#define WLC_E_LINK 16 -#define WLC_E_MIC_ERROR 17 -#define WLC_E_NDIS_LINK 18 -#define WLC_E_ROAM 19 -#define WLC_E_TXFAIL 20 -#define WLC_E_PMKID_CACHE 21 -#define WLC_E_RETROGRADE_TSF 22 -#define WLC_E_PRUNE 23 -#define WLC_E_AUTOAUTH 24 -#define WLC_E_EAPOL_MSG 25 -#define WLC_E_SCAN_COMPLETE 26 -#define WLC_E_ADDTS_IND 27 -#define WLC_E_DELTS_IND 28 -#define WLC_E_BCNSENT_IND 29 -#define WLC_E_BCNRX_MSG 30 -#define WLC_E_BCNLOST_MSG 31 -#define WLC_E_ROAM_PREP 32 -#define WLC_E_PFN_NET_FOUND 33 -#define WLC_E_PFN_NET_LOST 34 -#define WLC_E_RESET_COMPLETE 35 -#define WLC_E_JOIN_START 36 -#define WLC_E_ROAM_START 37 -#define WLC_E_ASSOC_START 38 -#define WLC_E_IBSS_ASSOC 39 -#define WLC_E_RADIO 40 -#define WLC_E_PSM_WATCHDOG 41 -#define WLC_E_PROBREQ_MSG 44 -#define WLC_E_SCAN_CONFIRM_IND 45 -#define WLC_E_PSK_SUP 46 -#define WLC_E_COUNTRY_CODE_CHANGED 47 -#define WLC_E_EXCEEDED_MEDIUM_TIME 48 -#define WLC_E_ICV_ERROR 49 -#define WLC_E_UNICAST_DECODE_ERROR 50 -#define WLC_E_MULTICAST_DECODE_ERROR 51 -#define WLC_E_TRACE 52 -#ifdef WLBTAMP -#define WLC_E_BTA_HCI_EVENT 53 -#endif -#define WLC_E_IF 54 -#define WLC_E_P2P_DISC_LISTEN_COMPLETE 55 -#define WLC_E_RSSI 56 -#define WLC_E_PFN_SCAN_COMPLETE 57 -#define WLC_E_EXTLOG_MSG 58 -#define WLC_E_ACTION_FRAME 59 -#define WLC_E_ACTION_FRAME_COMPLETE 60 -#define WLC_E_PRE_ASSOC_IND 61 -#define WLC_E_PRE_REASSOC_IND 62 -#define WLC_E_CHANNEL_ADOPTED 63 -#define WLC_E_AP_STARTED 64 -#define WLC_E_DFS_AP_STOP 65 -#define WLC_E_DFS_AP_RESUME 66 -#define WLC_E_WAI_STA_EVENT 67 -#define WLC_E_WAI_MSG 68 -#define WLC_E_ESCAN_RESULT 69 -#define WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE 70 -#define WLC_E_PROBRESP_MSG 71 -#define WLC_E_P2P_PROBREQ_MSG 72 -#define WLC_E_DCS_REQUEST 73 - -#define WLC_E_FIFO_CREDIT_MAP 74 - -#define WLC_E_ACTION_FRAME_RX 75 -#define WLC_E_WAKE_EVENT 76 -#define WLC_E_RM_COMPLETE 77 -#define WLC_E_HTSFSYNC 78 -#define WLC_E_OVERLAY_REQ 79 -#define WLC_E_CSA_COMPLETE_IND 80 -#define WLC_E_EXCESS_PM_WAKE_EVENT 81 -#define WLC_E_PFN_SCAN_NONE 82 -#define WLC_E_PFN_SCAN_ALLGONE 83 -#define WLC_E_GTK_PLUMBED 84 -#define WLC_E_ASSOC_IND_NDIS 85 -#define WLC_E_REASSOC_IND_NDIS 86 -#define WLC_E_ASSOC_REQ_IE 87 -#define WLC_E_ASSOC_RESP_IE 88 -#define WLC_E_ASSOC_RECREATED 89 -#define WLC_E_ACTION_FRAME_RX_NDIS 90 -#define WLC_E_AUTH_REQ 91 -#define WLC_E_TDLS_PEER_EVENT 92 -#define WLC_E_SPEEDY_RECREATE_FAIL 93 -#define WLC_E_LAST 94 - - - -typedef struct { - uint event; - const char *name; -} bcmevent_name_t; - -extern const bcmevent_name_t bcmevent_names[]; -extern const int bcmevent_names_size; - - -#define WLC_E_STATUS_SUCCESS 0 -#define WLC_E_STATUS_FAIL 1 -#define WLC_E_STATUS_TIMEOUT 2 -#define WLC_E_STATUS_NO_NETWORKS 3 -#define WLC_E_STATUS_ABORT 4 -#define WLC_E_STATUS_NO_ACK 5 -#define WLC_E_STATUS_UNSOLICITED 6 -#define WLC_E_STATUS_ATTEMPT 7 -#define WLC_E_STATUS_PARTIAL 8 -#define WLC_E_STATUS_NEWSCAN 9 -#define WLC_E_STATUS_NEWASSOC 10 -#define WLC_E_STATUS_11HQUIET 11 -#define WLC_E_STATUS_SUPPRESS 12 -#define WLC_E_STATUS_NOCHANS 13 -#ifdef BCMCCX -#define WLC_E_STATUS_CCXFASTRM 14 -#endif -#define WLC_E_STATUS_CS_ABORT 15 -#define WLC_E_STATUS_ERROR 16 - - -#define WLC_E_REASON_INITIAL_ASSOC 0 -#define WLC_E_REASON_LOW_RSSI 1 -#define WLC_E_REASON_DEAUTH 2 -#define WLC_E_REASON_DISASSOC 3 -#define WLC_E_REASON_BCNS_LOST 4 -#define WLC_E_REASON_MINTXRATE 9 -#define WLC_E_REASON_TXFAIL 10 - - -#define WLC_E_REASON_FAST_ROAM_FAILED 5 -#define WLC_E_REASON_DIRECTED_ROAM 6 -#define WLC_E_REASON_TSPEC_REJECTED 7 -#define WLC_E_REASON_BETTER_AP 8 - - -#define WLC_E_REASON_REQUESTED_ROAM 11 - - -#define WLC_E_PRUNE_ENCR_MISMATCH 1 -#define WLC_E_PRUNE_BCAST_BSSID 2 -#define WLC_E_PRUNE_MAC_DENY 3 -#define WLC_E_PRUNE_MAC_NA 4 -#define WLC_E_PRUNE_REG_PASSV 5 -#define WLC_E_PRUNE_SPCT_MGMT 6 -#define WLC_E_PRUNE_RADAR 7 -#define WLC_E_RSN_MISMATCH 8 -#define WLC_E_PRUNE_NO_COMMON_RATES 9 -#define WLC_E_PRUNE_BASIC_RATES 10 -#ifdef BCMCCX -#define WLC_E_PRUNE_CCXFAST_PREVAP 11 -#endif -#define WLC_E_PRUNE_CIPHER_NA 12 -#define WLC_E_PRUNE_KNOWN_STA 13 -#ifdef BCMCCX -#define WLC_E_PRUNE_CCXFAST_DROAM 14 -#endif -#define WLC_E_PRUNE_WDS_PEER 15 -#define WLC_E_PRUNE_QBSS_LOAD 16 -#define WLC_E_PRUNE_HOME_AP 17 -#ifdef BCMCCX -#define WLC_E_PRUNE_AP_BLOCKED 18 -#define WLC_E_PRUNE_NO_DIAG_SUPPORT 19 -#endif - - -#define WLC_E_SUP_OTHER 0 -#define WLC_E_SUP_DECRYPT_KEY_DATA 1 -#define WLC_E_SUP_BAD_UCAST_WEP128 2 -#define WLC_E_SUP_BAD_UCAST_WEP40 3 -#define WLC_E_SUP_UNSUP_KEY_LEN 4 -#define WLC_E_SUP_PW_KEY_CIPHER 5 -#define WLC_E_SUP_MSG3_TOO_MANY_IE 6 -#define WLC_E_SUP_MSG3_IE_MISMATCH 7 -#define WLC_E_SUP_NO_INSTALL_FLAG 8 -#define WLC_E_SUP_MSG3_NO_GTK 9 -#define WLC_E_SUP_GRP_KEY_CIPHER 10 -#define WLC_E_SUP_GRP_MSG1_NO_GTK 11 -#define WLC_E_SUP_GTK_DECRYPT_FAIL 12 -#define WLC_E_SUP_SEND_FAIL 13 -#define WLC_E_SUP_DEAUTH 14 -#define WLC_E_SUP_WPA_PSK_TMO 15 - - - -typedef BWL_PRE_PACKED_STRUCT struct wl_event_rx_frame_data { - uint16 version; - uint16 channel; - int32 rssi; - uint32 mactime; - uint32 rate; -} BWL_POST_PACKED_STRUCT wl_event_rx_frame_data_t; - -#define BCM_RX_FRAME_DATA_VERSION 1 - - -typedef struct wl_event_data_if { - uint8 ifidx; - uint8 opcode; - uint8 reserved; - uint8 bssidx; - uint8 role; -} wl_event_data_if_t; - - -#define WLC_E_IF_ADD 1 -#define WLC_E_IF_DEL 2 -#define WLC_E_IF_CHANGE 3 - - -#define WLC_E_IF_ROLE_STA 0 -#define WLC_E_IF_ROLE_AP 1 -#define WLC_E_IF_ROLE_WDS 2 -#define WLC_E_IF_ROLE_P2P_GO 3 -#define WLC_E_IF_ROLE_P2P_CLIENT 4 -#ifdef WLBTAMP -#define WLC_E_IF_ROLE_BTA_CREATOR 5 -#define WLC_E_IF_ROLE_BTA_ACCEPTOR 6 -#endif - - -#define WLC_E_LINK_BCN_LOSS 1 -#define WLC_E_LINK_DISASSOC 2 -#define WLC_E_LINK_ASSOC_REC 3 -#define WLC_E_LINK_BSSCFG_DIS 4 - - -#define WLC_E_OVL_DOWNLOAD 0 -#define WLC_E_OVL_UPDATE_IND 1 - - -#define WLC_E_TDLS_PEER_DISCOVERED 0 -#define WLC_E_TDLS_PEER_CONNECTED 1 -#define WLC_E_TDLS_PEER_DISCONNECTED 2 - - -#include <packed_section_end.h> - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h b/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h deleted file mode 100755 index 9533391..0000000 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmipv6.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * Fundamental constants relating to Neighbor Discovery Protocol - * - * $Id: bcmipv6.h 309193 2012-01-19 00:03:57Z $ - */ - -#ifndef _bcmipv6_h_ -#define _bcmipv6_h_ - -#ifndef _TYPEDEFS_H_ -#include <typedefs.h> -#endif - -/* This marks the start of a packed structure section. */ -#include <packed_section_start.h> - -#define ICMPV6_HEADER_TYPE 0x3A -#define ICMPV6_PKT_TYPE_NS 135 -#define ICMPV6_PKT_TYPE_NA 136 - -#define ICMPV6_ND_OPT_TYPE_TARGET_MAC 2 -#define ICMPV6_ND_OPT_TYPE_SRC_MAC 1 - -#define IPV6_VERSION 6 -#define IPV6_HOP_LIMIT 255 - -#define IPV6_ADDR_NULL(a) ((a[0] | a[1] | a[2] | a[3] | a[4] | \ - a[5] | a[6] | a[7] | a[8] | a[9] | \ - a[10] | a[11] | a[12] | a[13] | \ - a[14] | a[15]) == 0) - -/* IPV6 address */ -BWL_PRE_PACKED_STRUCT struct ipv6_addr { - uint8 addr[16]; -} BWL_POST_PACKED_STRUCT; - - -/* ICMPV6 Header */ -BWL_PRE_PACKED_STRUCT struct icmp6_hdr { - uint8 icmp6_type; - uint8 icmp6_code; - uint16 icmp6_cksum; - BWL_PRE_PACKED_STRUCT union { - uint32 reserved; - BWL_PRE_PACKED_STRUCT struct nd_advt { - uint32 reserved1:5, - override:1, - solicited:1, - router:1, - reserved2:24; - } BWL_POST_PACKED_STRUCT nd_advt; - } BWL_POST_PACKED_STRUCT opt; -} BWL_POST_PACKED_STRUCT; - -/* Ipv6 Header Format */ -BWL_PRE_PACKED_STRUCT struct ipv6_hdr { - uint8 priority:4, - version:4; - uint8 flow_lbl[3]; - uint16 payload_len; - uint8 nexthdr; - uint8 hop_limit; - struct ipv6_addr saddr; - struct ipv6_addr daddr; -} BWL_POST_PACKED_STRUCT; - -/* Neighbor Advertisement/Solicitation Packet Structure */ -BWL_PRE_PACKED_STRUCT struct nd_msg { - struct icmp6_hdr icmph; - struct ipv6_addr target; -} BWL_POST_PACKED_STRUCT; - - -/* Neighibor Solicitation/Advertisement Optional Structure */ -BWL_PRE_PACKED_STRUCT struct nd_msg_opt { - uint8 type; - uint8 len; - uint8 mac_addr[ETHER_ADDR_LEN]; -} BWL_POST_PACKED_STRUCT; - -/* This marks the end of a packed structure section. */ -#include <packed_section_end.h> - -#endif /* !defined(_bcmipv6_h_) */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/p2p.h b/drivers/net/wireless/bcmdhd/include/proto/p2p.h deleted file mode 100755 index 19493eb..0000000 --- a/drivers/net/wireless/bcmdhd/include/proto/p2p.h +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) - * - * $Id: p2p.h 326276 2012-04-06 23:16:42Z $ - */ - -#ifndef _P2P_H_ -#define _P2P_H_ - -#ifndef _TYPEDEFS_H_ -#include <typedefs.h> -#endif -#include <wlioctl.h> -#include <proto/802.11.h> - - -#include <packed_section_start.h> - - - -#define P2P_OUI WFA_OUI -#define P2P_VER WFA_OUI_TYPE_P2P - -#define P2P_IE_ID 0xdd - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_ie { - uint8 id; - uint8 len; - uint8 OUI[3]; - uint8 oui_type; - uint8 subelts[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_ie wifi_p2p_ie_t; - -#define P2P_IE_FIXED_LEN 6 - -#define P2P_ATTR_ID_OFF 0 -#define P2P_ATTR_LEN_OFF 1 -#define P2P_ATTR_DATA_OFF 3 - -#define P2P_ATTR_ID_LEN 1 -#define P2P_ATTR_LEN_LEN 2 -#define P2P_ATTR_HDR_LEN 3 - - -#define P2P_SEID_STATUS 0 -#define P2P_SEID_MINOR_RC 1 -#define P2P_SEID_P2P_INFO 2 -#define P2P_SEID_DEV_ID 3 -#define P2P_SEID_INTENT 4 -#define P2P_SEID_CFG_TIMEOUT 5 -#define P2P_SEID_CHANNEL 6 -#define P2P_SEID_GRP_BSSID 7 -#define P2P_SEID_XT_TIMING 8 -#define P2P_SEID_INTINTADDR 9 -#define P2P_SEID_P2P_MGBTY 10 -#define P2P_SEID_CHAN_LIST 11 -#define P2P_SEID_ABSENCE 12 -#define P2P_SEID_DEV_INFO 13 -#define P2P_SEID_GROUP_INFO 14 -#define P2P_SEID_GROUP_ID 15 -#define P2P_SEID_P2P_IF 16 -#define P2P_SEID_OP_CHANNEL 17 -#define P2P_SEID_INVITE_FLAGS 18 -#define P2P_SEID_VNDR 221 - -#define P2P_SE_VS_ID_SERVICES 0x1b - - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_info_se_s { - uint8 eltId; - uint8 len[2]; - uint8 dev; - uint8 group; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_info_se_s wifi_p2p_info_se_t; - - -#define P2P_CAPSE_DEV_SERVICE_DIS 0x1 -#define P2P_CAPSE_DEV_CLIENT_DIS 0x2 -#define P2P_CAPSE_DEV_CONCURRENT 0x4 -#define P2P_CAPSE_DEV_INFRA_MAN 0x8 -#define P2P_CAPSE_DEV_LIMIT 0x10 -#define P2P_CAPSE_INVITE_PROC 0x20 - - -#define P2P_CAPSE_GRP_OWNER 0x1 -#define P2P_CAPSE_PERSIST_GRP 0x2 -#define P2P_CAPSE_GRP_LIMIT 0x4 -#define P2P_CAPSE_GRP_INTRA_BSS 0x8 -#define P2P_CAPSE_GRP_X_CONNECT 0x10 -#define P2P_CAPSE_GRP_PERSISTENT 0x20 -#define P2P_CAPSE_GRP_FORMATION 0x40 - - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_intent_se_s { - uint8 eltId; - uint8 len[2]; - uint8 intent; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_intent_se_s wifi_p2p_intent_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_cfg_tmo_se_s { - uint8 eltId; - uint8 len[2]; - uint8 go_tmo; - uint8 client_tmo; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_cfg_tmo_se_s wifi_p2p_cfg_tmo_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_listen_channel_se_s { - uint8 eltId; - uint8 len[2]; - uint8 country[3]; - uint8 op_class; - uint8 channel; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_listen_channel_se_s wifi_p2p_listen_channel_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_bssid_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mac[6]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_grp_bssid_se_s wifi_p2p_grp_bssid_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_id_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mac[6]; - uint8 ssid[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_grp_id_se_s wifi_p2p_grp_id_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_intf_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mac[6]; - uint8 ifaddrs; - uint8 ifaddr[1][6]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_intf_se_s wifi_p2p_intf_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_status_se_s { - uint8 eltId; - uint8 len[2]; - uint8 status; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_status_se_s wifi_p2p_status_se_t; - - -#define P2P_STATSE_SUCCESS 0 - -#define P2P_STATSE_FAIL_INFO_CURR_UNAVAIL 1 - -#define P2P_STATSE_PASSED_UP P2P_STATSE_FAIL_INFO_CURR_UNAVAIL - -#define P2P_STATSE_FAIL_INCOMPAT_PARAMS 2 - -#define P2P_STATSE_FAIL_LIMIT_REACHED 3 - -#define P2P_STATSE_FAIL_INVALID_PARAMS 4 - -#define P2P_STATSE_FAIL_UNABLE_TO_ACCOM 5 - -#define P2P_STATSE_FAIL_PROTO_ERROR 6 - -#define P2P_STATSE_FAIL_NO_COMMON_CHAN 7 - -#define P2P_STATSE_FAIL_UNKNOWN_GROUP 8 - -#define P2P_STATSE_FAIL_INTENT 9 - -#define P2P_STATSE_FAIL_INCOMPAT_PROVIS 10 - -#define P2P_STATSE_FAIL_USER_REJECT 11 - - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_ext_se_s { - uint8 eltId; - uint8 len[2]; - uint8 avail[2]; - uint8 interval[2]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_ext_se_s wifi_p2p_ext_se_t; - -#define P2P_EXT_MIN 10 - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_intintad_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mac[6]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_intintad_se_s wifi_p2p_intintad_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_channel_se_s { - uint8 eltId; - uint8 len[2]; - uint8 band; - uint8 channel; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_channel_se_s wifi_p2p_channel_se_t; - - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_entry_s { - uint8 band; - uint8 num_channels; - uint8 channels[WL_NUMCHANNELS]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_chanlist_entry_s wifi_p2p_chanlist_entry_t; -#define WIFI_P2P_CHANLIST_SE_MAX_ENTRIES 2 - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_se_s { - uint8 eltId; - uint8 len[2]; - uint8 country[3]; - uint8 num_entries; - wifi_p2p_chanlist_entry_t entries[WIFI_P2P_CHANLIST_SE_MAX_ENTRIES]; - -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_chanlist_se_s wifi_p2p_chanlist_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_pri_devtype_s { - uint16 cat_id; - uint8 OUI[3]; - uint8 oui_type; - uint16 sub_cat_id; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_pri_devtype_s wifi_p2p_pri_devtype_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_devinfo_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mac[6]; - uint16 wps_cfg_meths; - uint8 pri_devtype[8]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_devinfo_se_s wifi_p2p_devinfo_se_t; - -#define P2P_DEV_TYPE_LEN 8 - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_cid_fixed_s { - uint8 len; - uint8 devaddr[ETHER_ADDR_LEN]; - uint8 ifaddr[ETHER_ADDR_LEN]; - uint8 devcap; - uint8 cfg_meths[2]; - uint8 pridt[P2P_DEV_TYPE_LEN]; - uint8 secdts; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_cid_fixed_s wifi_p2p_cid_fixed_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_devid_se_s { - uint8 eltId; - uint8 len[2]; - struct ether_addr addr; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_devid_se_s wifi_p2p_devid_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_mgbt_se_s { - uint8 eltId; - uint8 len[2]; - uint8 mg_bitmap; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_mgbt_se_s wifi_p2p_mgbt_se_t; - -#define P2P_MGBTSE_P2PDEVMGMT_FLAG 0x1 - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_grpinfo_se_s { - uint8 eltId; - uint8 len[2]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_grpinfo_se_s wifi_p2p_grpinfo_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_op_channel_se_s { - uint8 eltId; - uint8 len[2]; - uint8 country[3]; - uint8 op_class; - uint8 channel; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_op_channel_se_s wifi_p2p_op_channel_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_invite_flags_se_s { - uint8 eltId; - uint8 len[2]; - uint8 flags; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_invite_flags_se_s wifi_p2p_invite_flags_se_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_action_frame { - uint8 category; - uint8 OUI[3]; - uint8 type; - uint8 subtype; - uint8 dialog_token; - uint8 elts[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_action_frame wifi_p2p_action_frame_t; -#define P2P_AF_CATEGORY 0x7f - -#define P2P_AF_FIXED_LEN 7 - - -#define P2P_AF_NOTICE_OF_ABSENCE 0 -#define P2P_AF_PRESENCE_REQ 1 -#define P2P_AF_PRESENCE_RSP 2 -#define P2P_AF_GO_DISC_REQ 3 - - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_pub_act_frame { - uint8 category; - uint8 action; - uint8 oui[3]; - uint8 oui_type; - uint8 subtype; - uint8 dialog_token; - uint8 elts[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t; -#define P2P_PUB_AF_FIXED_LEN 8 -#define P2P_PUB_AF_CATEGORY 0x04 -#define P2P_PUB_AF_ACTION 0x09 - - -#define P2P_PAF_GON_REQ 0 -#define P2P_PAF_GON_RSP 1 -#define P2P_PAF_GON_CONF 2 -#define P2P_PAF_INVITE_REQ 3 -#define P2P_PAF_INVITE_RSP 4 -#define P2P_PAF_DEVDIS_REQ 5 -#define P2P_PAF_DEVDIS_RSP 6 -#define P2P_PAF_PROVDIS_REQ 7 -#define P2P_PAF_PROVDIS_RSP 8 - - -#define P2P_TYPE_MNREQ P2P_PAF_GON_REQ -#define P2P_TYPE_MNRSP P2P_PAF_GON_RSP -#define P2P_TYPE_MNCONF P2P_PAF_GON_CONF - - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_desc { - uint8 cnt_type; - uint32 duration; - uint32 interval; - uint32 start; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_noa_desc wifi_p2p_noa_desc_t; - -BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_se { - uint8 eltId; - uint8 len[2]; - uint8 index; - uint8 ops_ctw_parms; - wifi_p2p_noa_desc_t desc[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t; - -#define P2P_NOA_SE_FIXED_LEN 5 - - -#define P2P_NOA_DESC_CNT_RESERVED 0 -#define P2P_NOA_DESC_CNT_REPEAT 255 -#define P2P_NOA_DESC_TYPE_PREFERRED 1 -#define P2P_NOA_DESC_TYPE_ACCEPTABLE 2 - - -#define P2P_NOA_CTW_MASK 0x7f -#define P2P_NOA_OPS_MASK 0x80 -#define P2P_NOA_OPS_SHIFT 7 - -#define P2P_CTW_MIN 10 - - -#define P2PSD_ACTION_CATEGORY 0x04 - -#define P2PSD_ACTION_ID_GAS_IREQ 0x0a - -#define P2PSD_ACTION_ID_GAS_IRESP 0x0b - -#define P2PSD_ACTION_ID_GAS_CREQ 0x0c - -#define P2PSD_ACTION_ID_GAS_CRESP 0x0d - -#define P2PSD_AD_EID 0x6c - -#define P2PSD_ADP_TUPLE_QLMT_PAMEBI 0x00 - -#define P2PSD_ADP_PROTO_ID 0x00 - -#define P2PSD_GAS_OUI P2P_OUI - -#define P2PSD_GAS_OUI_SUBTYPE P2P_VER - -#define P2PSD_GAS_NQP_INFOID 0xDDDD - -#define P2PSD_GAS_COMEBACKDEALY 0x00 - - - -typedef enum p2psd_svc_protype { - SVC_RPOTYPE_ALL = 0, - SVC_RPOTYPE_BONJOUR = 1, - SVC_RPOTYPE_UPNP = 2, - SVC_RPOTYPE_WSD = 3, - SVC_RPOTYPE_VENDOR = 255 -} p2psd_svc_protype_t; - - -typedef enum { - P2PSD_RESP_STATUS_SUCCESS = 0, - P2PSD_RESP_STATUS_PROTYPE_NA = 1, - P2PSD_RESP_STATUS_DATA_NA = 2, - P2PSD_RESP_STATUS_BAD_REQUEST = 3 -} p2psd_resp_status_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_tpl { - uint8 llm_pamebi; - uint8 adp_id; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_adp_tpl wifi_p2psd_adp_tpl_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_ie { - uint8 id; - uint8 len; - wifi_p2psd_adp_tpl_t adp_tpl; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_adp_ie wifi_p2psd_adp_ie_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_nqp_query_vsc { - uint8 oui_subtype; - uint16 svc_updi; - uint8 svc_tlvs[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_nqp_query_vsc wifi_p2psd_nqp_query_vsc_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_tlv { - uint16 len; - uint8 svc_prot; - uint8 svc_tscid; - uint8 query_data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_qreq_tlv wifi_p2psd_qreq_tlv_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_frame { - uint16 info_id; - uint16 len; - uint8 oui[3]; - uint8 qreq_vsc[1]; - -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_qreq_frame wifi_p2psd_qreq_frame_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_ireq_frame { - wifi_p2psd_adp_ie_t adp_ie; - uint16 qreq_len; - uint8 qreq_frm[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_gas_ireq_frame wifi_p2psd_gas_ireq_frame_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_tlv { - uint16 len; - uint8 svc_prot; - uint8 svc_tscid; - uint8 status; - uint8 query_data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_qresp_tlv wifi_p2psd_qresp_tlv_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_frame { - uint16 info_id; - uint16 len; - uint8 oui[3]; - uint8 qresp_vsc[1]; - -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_qresp_frame wifi_p2psd_qresp_frame_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_iresp_frame { - uint16 status; - uint16 cb_delay; - wifi_p2psd_adp_ie_t adp_ie; - uint16 qresp_len; - uint8 qresp_frm[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_gas_iresp_frame wifi_p2psd_gas_iresp_frame_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_cresp_frame { - uint16 status; - uint8 fragment_id; - uint16 cb_delay; - wifi_p2psd_adp_ie_t adp_ie; - uint16 qresp_len; - uint8 qresp_frm[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_gas_cresp_frame wifi_p2psd_gas_cresp_frame_t; - - -BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_pub_act_frame { - uint8 category; - uint8 action; - uint8 dialog_token; - uint8 query_data[1]; -} BWL_POST_PACKED_STRUCT; -typedef struct wifi_p2psd_gas_pub_act_frame wifi_p2psd_gas_pub_act_frame_t; - - -#include <packed_section_end.h> - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/sbhnddma.h b/drivers/net/wireless/bcmdhd/include/sbhnddma.h deleted file mode 100755 index da1f1a1..0000000 --- a/drivers/net/wireless/bcmdhd/include/sbhnddma.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Generic Broadcom Home Networking Division (HND) DMA engine HW interface - * This supports the following chips: BCM42xx, 44xx, 47xx . - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: sbhnddma.h 309193 2012-01-19 00:03:57Z $ - */ - -#ifndef _sbhnddma_h_ -#define _sbhnddma_h_ - - - - - - - -typedef volatile struct { - uint32 control; - uint32 addr; - uint32 ptr; - uint32 status; -} dma32regs_t; - -typedef volatile struct { - dma32regs_t xmt; - dma32regs_t rcv; -} dma32regp_t; - -typedef volatile struct { - uint32 fifoaddr; - uint32 fifodatalow; - uint32 fifodatahigh; - uint32 pad; -} dma32diag_t; - - -typedef volatile struct { - uint32 ctrl; - uint32 addr; -} dma32dd_t; - - -#define D32RINGALIGN_BITS 12 -#define D32MAXRINGSZ (1 << D32RINGALIGN_BITS) -#define D32RINGALIGN (1 << D32RINGALIGN_BITS) - -#define D32MAXDD (D32MAXRINGSZ / sizeof (dma32dd_t)) - - -#define XC_XE ((uint32)1 << 0) -#define XC_SE ((uint32)1 << 1) -#define XC_LE ((uint32)1 << 2) -#define XC_FL ((uint32)1 << 4) -#define XC_MR_MASK 0x000000C0 -#define XC_MR_SHIFT 6 -#define XC_PD ((uint32)1 << 11) -#define XC_AE ((uint32)3 << 16) -#define XC_AE_SHIFT 16 -#define XC_BL_MASK 0x001C0000 -#define XC_BL_SHIFT 18 -#define XC_PC_MASK 0x00E00000 -#define XC_PC_SHIFT 21 -#define XC_PT_MASK 0x03000000 -#define XC_PT_SHIFT 24 - - -#define DMA_MR_1 0 -#define DMA_MR_2 1 - - - -#define DMA_BL_16 0 -#define DMA_BL_32 1 -#define DMA_BL_64 2 -#define DMA_BL_128 3 -#define DMA_BL_256 4 -#define DMA_BL_512 5 -#define DMA_BL_1024 6 - - -#define DMA_PC_0 0 -#define DMA_PC_4 1 -#define DMA_PC_8 2 -#define DMA_PC_16 3 - - - -#define DMA_PT_1 0 -#define DMA_PT_2 1 -#define DMA_PT_4 2 -#define DMA_PT_8 3 - - -#define XP_LD_MASK 0xfff - - -#define XS_CD_MASK 0x0fff -#define XS_XS_MASK 0xf000 -#define XS_XS_SHIFT 12 -#define XS_XS_DISABLED 0x0000 -#define XS_XS_ACTIVE 0x1000 -#define XS_XS_IDLE 0x2000 -#define XS_XS_STOPPED 0x3000 -#define XS_XS_SUSP 0x4000 -#define XS_XE_MASK 0xf0000 -#define XS_XE_SHIFT 16 -#define XS_XE_NOERR 0x00000 -#define XS_XE_DPE 0x10000 -#define XS_XE_DFU 0x20000 -#define XS_XE_BEBR 0x30000 -#define XS_XE_BEDA 0x40000 -#define XS_AD_MASK 0xfff00000 -#define XS_AD_SHIFT 20 - - -#define RC_RE ((uint32)1 << 0) -#define RC_RO_MASK 0xfe -#define RC_RO_SHIFT 1 -#define RC_FM ((uint32)1 << 8) -#define RC_SH ((uint32)1 << 9) -#define RC_OC ((uint32)1 << 10) -#define RC_PD ((uint32)1 << 11) -#define RC_AE ((uint32)3 << 16) -#define RC_AE_SHIFT 16 -#define RC_BL_MASK 0x001C0000 -#define RC_BL_SHIFT 18 -#define RC_PC_MASK 0x00E00000 -#define RC_PC_SHIFT 21 -#define RC_PT_MASK 0x03000000 -#define RC_PT_SHIFT 24 - - -#define RP_LD_MASK 0xfff - - -#define RS_CD_MASK 0x0fff -#define RS_RS_MASK 0xf000 -#define RS_RS_SHIFT 12 -#define RS_RS_DISABLED 0x0000 -#define RS_RS_ACTIVE 0x1000 -#define RS_RS_IDLE 0x2000 -#define RS_RS_STOPPED 0x3000 -#define RS_RE_MASK 0xf0000 -#define RS_RE_SHIFT 16 -#define RS_RE_NOERR 0x00000 -#define RS_RE_DPE 0x10000 -#define RS_RE_DFO 0x20000 -#define RS_RE_BEBW 0x30000 -#define RS_RE_BEDA 0x40000 -#define RS_AD_MASK 0xfff00000 -#define RS_AD_SHIFT 20 - - -#define FA_OFF_MASK 0xffff -#define FA_SEL_MASK 0xf0000 -#define FA_SEL_SHIFT 16 -#define FA_SEL_XDD 0x00000 -#define FA_SEL_XDP 0x10000 -#define FA_SEL_RDD 0x40000 -#define FA_SEL_RDP 0x50000 -#define FA_SEL_XFD 0x80000 -#define FA_SEL_XFP 0x90000 -#define FA_SEL_RFD 0xc0000 -#define FA_SEL_RFP 0xd0000 -#define FA_SEL_RSD 0xe0000 -#define FA_SEL_RSP 0xf0000 - - -#define CTRL_BC_MASK 0x00001fff -#define CTRL_AE ((uint32)3 << 16) -#define CTRL_AE_SHIFT 16 -#define CTRL_PARITY ((uint32)3 << 18) -#define CTRL_EOT ((uint32)1 << 28) -#define CTRL_IOC ((uint32)1 << 29) -#define CTRL_EOF ((uint32)1 << 30) -#define CTRL_SOF ((uint32)1 << 31) - - -#define CTRL_CORE_MASK 0x0ff00000 - - - - -typedef volatile struct { - uint32 control; - uint32 ptr; - uint32 addrlow; - uint32 addrhigh; - uint32 status0; - uint32 status1; -} dma64regs_t; - -typedef volatile struct { - dma64regs_t tx; - dma64regs_t rx; -} dma64regp_t; - -typedef volatile struct { - uint32 fifoaddr; - uint32 fifodatalow; - uint32 fifodatahigh; - uint32 pad; -} dma64diag_t; - - -typedef volatile struct { - uint32 ctrl1; - uint32 ctrl2; - uint32 addrlow; - uint32 addrhigh; -} dma64dd_t; - - -#define D64RINGALIGN_BITS 13 -#define D64MAXRINGSZ (1 << D64RINGALIGN_BITS) -#define D64RINGALIGN (1 << D64RINGALIGN_BITS) - -#define D64MAXDD (D64MAXRINGSZ / sizeof (dma64dd_t)) - - -#define D64_XC_XE 0x00000001 -#define D64_XC_SE 0x00000002 -#define D64_XC_LE 0x00000004 -#define D64_XC_FL 0x00000010 -#define D64_XC_MR_MASK 0x000000C0 -#define D64_XC_MR_SHIFT 6 -#define D64_XC_PD 0x00000800 -#define D64_XC_AE 0x00030000 -#define D64_XC_AE_SHIFT 16 -#define D64_XC_BL_MASK 0x001C0000 -#define D64_XC_BL_SHIFT 18 -#define D64_XC_PC_MASK 0x00E00000 -#define D64_XC_PC_SHIFT 21 -#define D64_XC_PT_MASK 0x03000000 -#define D64_XC_PT_SHIFT 24 - - -#define D64_XP_LD_MASK 0x00001fff - - -#define D64_XS0_CD_MASK 0x00001fff -#define D64_XS0_XS_MASK 0xf0000000 -#define D64_XS0_XS_SHIFT 28 -#define D64_XS0_XS_DISABLED 0x00000000 -#define D64_XS0_XS_ACTIVE 0x10000000 -#define D64_XS0_XS_IDLE 0x20000000 -#define D64_XS0_XS_STOPPED 0x30000000 -#define D64_XS0_XS_SUSP 0x40000000 - -#define D64_XS1_AD_MASK 0x00001fff -#define D64_XS1_XE_MASK 0xf0000000 -#define D64_XS1_XE_SHIFT 28 -#define D64_XS1_XE_NOERR 0x00000000 -#define D64_XS1_XE_DPE 0x10000000 -#define D64_XS1_XE_DFU 0x20000000 -#define D64_XS1_XE_DTE 0x30000000 -#define D64_XS1_XE_DESRE 0x40000000 -#define D64_XS1_XE_COREE 0x50000000 - - -#define D64_RC_RE 0x00000001 -#define D64_RC_RO_MASK 0x000000fe -#define D64_RC_RO_SHIFT 1 -#define D64_RC_FM 0x00000100 -#define D64_RC_SH 0x00000200 -#define D64_RC_OC 0x00000400 -#define D64_RC_PD 0x00000800 -#define D64_RC_AE 0x00030000 -#define D64_RC_AE_SHIFT 16 -#define D64_RC_BL_MASK 0x001C0000 -#define D64_RC_BL_SHIFT 18 -#define D64_RC_PC_MASK 0x00E00000 -#define D64_RC_PC_SHIFT 21 -#define D64_RC_PT_MASK 0x03000000 -#define D64_RC_PT_SHIFT 24 - - -#define DMA_CTRL_PEN (1 << 0) -#define DMA_CTRL_ROC (1 << 1) -#define DMA_CTRL_RXMULTI (1 << 2) -#define DMA_CTRL_UNFRAMED (1 << 3) -#define DMA_CTRL_USB_BOUNDRY4KB_WAR (1 << 4) -#define DMA_CTRL_DMA_AVOIDANCE_WAR (1 << 5) - - -#define D64_RP_LD_MASK 0x00001fff - - -#define D64_RS0_CD_MASK 0x00001fff -#define D64_RS0_RS_MASK 0xf0000000 -#define D64_RS0_RS_SHIFT 28 -#define D64_RS0_RS_DISABLED 0x00000000 -#define D64_RS0_RS_ACTIVE 0x10000000 -#define D64_RS0_RS_IDLE 0x20000000 -#define D64_RS0_RS_STOPPED 0x30000000 -#define D64_RS0_RS_SUSP 0x40000000 - -#define D64_RS1_AD_MASK 0x0001ffff -#define D64_RS1_RE_MASK 0xf0000000 -#define D64_RS1_RE_SHIFT 28 -#define D64_RS1_RE_NOERR 0x00000000 -#define D64_RS1_RE_DPO 0x10000000 -#define D64_RS1_RE_DFU 0x20000000 -#define D64_RS1_RE_DTE 0x30000000 -#define D64_RS1_RE_DESRE 0x40000000 -#define D64_RS1_RE_COREE 0x50000000 - - -#define D64_FA_OFF_MASK 0xffff -#define D64_FA_SEL_MASK 0xf0000 -#define D64_FA_SEL_SHIFT 16 -#define D64_FA_SEL_XDD 0x00000 -#define D64_FA_SEL_XDP 0x10000 -#define D64_FA_SEL_RDD 0x40000 -#define D64_FA_SEL_RDP 0x50000 -#define D64_FA_SEL_XFD 0x80000 -#define D64_FA_SEL_XFP 0x90000 -#define D64_FA_SEL_RFD 0xc0000 -#define D64_FA_SEL_RFP 0xd0000 -#define D64_FA_SEL_RSD 0xe0000 -#define D64_FA_SEL_RSP 0xf0000 - - -#define D64_CTRL_COREFLAGS 0x0ff00000 -#define D64_CTRL1_EOT ((uint32)1 << 28) -#define D64_CTRL1_IOC ((uint32)1 << 29) -#define D64_CTRL1_EOF ((uint32)1 << 30) -#define D64_CTRL1_SOF ((uint32)1 << 31) - - -#define D64_CTRL2_BC_MASK 0x00007fff -#define D64_CTRL2_AE 0x00030000 -#define D64_CTRL2_AE_SHIFT 16 -#define D64_CTRL2_PARITY 0x00040000 - - -#define D64_CTRL_CORE_MASK 0x0ff00000 - -#define D64_RX_FRM_STS_LEN 0x0000ffff -#define D64_RX_FRM_STS_OVFL 0x00800000 -#define D64_RX_FRM_STS_DSCRCNT 0x0f000000 -#define D64_RX_FRM_STS_DATATYPE 0xf0000000 - - -typedef volatile struct { - uint16 len; - uint16 flags; -} dma_rxh_t; - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/spid.h b/drivers/net/wireless/bcmdhd/include/spid.h deleted file mode 100755 index f1ecc22..0000000 --- a/drivers/net/wireless/bcmdhd/include/spid.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * SPI device spec header file - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: spid.h 354197 2012-08-30 09:05:59Z $ - */ - -#ifndef _SPI_H -#define _SPI_H - -/* - * Brcm SPI Device Register Map. - * - */ - -typedef volatile struct { - uint8 config; /* 0x00, len, endian, clock, speed, polarity, wakeup */ - uint8 response_delay; /* 0x01, read response delay in bytes (corerev < 3) */ - uint8 status_enable; /* 0x02, status-enable, intr with status, response_delay - * function selection, command/data error check - */ - uint8 reset_bp; /* 0x03, reset on wlan/bt backplane reset (corerev >= 1) */ - uint16 intr_reg; /* 0x04, Intr status register */ - uint16 intr_en_reg; /* 0x06, Intr mask register */ - uint32 status_reg; /* 0x08, RO, Status bits of last spi transfer */ - uint16 f1_info_reg; /* 0x0c, RO, enabled, ready for data transfer, blocksize */ - uint16 f2_info_reg; /* 0x0e, RO, enabled, ready for data transfer, blocksize */ - uint16 f3_info_reg; /* 0x10, RO, enabled, ready for data transfer, blocksize */ - uint32 test_read; /* 0x14, RO 0xfeedbead signature */ - uint32 test_rw; /* 0x18, RW */ - uint8 resp_delay_f0; /* 0x1c, read resp delay bytes for F0 (corerev >= 3) */ - uint8 resp_delay_f1; /* 0x1d, read resp delay bytes for F1 (corerev >= 3) */ - uint8 resp_delay_f2; /* 0x1e, read resp delay bytes for F2 (corerev >= 3) */ - uint8 resp_delay_f3; /* 0x1f, read resp delay bytes for F3 (corerev >= 3) */ -} spi_regs_t; - -/* SPI device register offsets */ -#define SPID_CONFIG 0x00 -#define SPID_RESPONSE_DELAY 0x01 -#define SPID_STATUS_ENABLE 0x02 -#define SPID_RESET_BP 0x03 /* (corerev >= 1) */ -#define SPID_INTR_REG 0x04 /* 16 bits - Interrupt status */ -#define SPID_INTR_EN_REG 0x06 /* 16 bits - Interrupt mask */ -#define SPID_STATUS_REG 0x08 /* 32 bits */ -#define SPID_F1_INFO_REG 0x0C /* 16 bits */ -#define SPID_F2_INFO_REG 0x0E /* 16 bits */ -#define SPID_F3_INFO_REG 0x10 /* 16 bits */ -#define SPID_TEST_READ 0x14 /* 32 bits */ -#define SPID_TEST_RW 0x18 /* 32 bits */ -#define SPID_RESP_DELAY_F0 0x1c /* 8 bits (corerev >= 3) */ -#define SPID_RESP_DELAY_F1 0x1d /* 8 bits (corerev >= 3) */ -#define SPID_RESP_DELAY_F2 0x1e /* 8 bits (corerev >= 3) */ -#define SPID_RESP_DELAY_F3 0x1f /* 8 bits (corerev >= 3) */ - -/* Bit masks for SPID_CONFIG device register */ -#define WORD_LENGTH_32 0x1 /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG 0x2 /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE 0x4 /* 0/1 clock phase delay */ -#define CLOCK_POLARITY 0x8 /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE 0x10 /* 1/0 High Speed mode / Normal mode */ -#define INTR_POLARITY 0x20 /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP 0x80 /* 0/1 Wake-up command from Host to WLAN */ - -/* Bit mask for SPID_RESPONSE_DELAY device register */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* Bit mask for SPID_STATUS_ENABLE device register */ -#define STATUS_ENABLE 0x1 /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS 0x2 /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL 0x4 /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN 0x8 /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN 0x20 /* Command error check enable */ -#define DATA_ERR_CHK_EN 0x40 /* Data error check enable */ - -/* Bit mask for SPID_RESET_BP device register */ -#define RESET_ON_WLAN_BP_RESET 0x4 /* enable reset for WLAN backplane */ -#define RESET_ON_BT_BP_RESET 0x8 /* enable reset for BT backplane */ -#define RESET_SPI 0x80 /* reset the above enabled logic */ - -/* Bit mask for SPID_INTR_REG device register */ -#define DATA_UNAVAILABLE 0x0001 /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW 0x0002 -#define F2_F3_FIFO_WR_OVERFLOW 0x0004 -#define COMMAND_ERROR 0x0008 /* Cleared by writing 1 */ -#define DATA_ERROR 0x0010 /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE 0x0020 -#define F3_PACKET_AVAILABLE 0x0040 -#define F1_OVERFLOW 0x0080 /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 0x0100 -#define MISC_INTR1 0x0200 -#define MISC_INTR2 0x0400 -#define MISC_INTR3 0x0800 -#define MISC_INTR4 0x1000 -#define F1_INTR 0x2000 -#define F2_INTR 0x4000 -#define F3_INTR 0x8000 - -/* Bit mask for 32bit SPID_STATUS_REG device register */ -#define STATUS_DATA_NOT_AVAILABLE 0x00000001 -#define STATUS_UNDERFLOW 0x00000002 -#define STATUS_OVERFLOW 0x00000004 -#define STATUS_F2_INTR 0x00000008 -#define STATUS_F3_INTR 0x00000010 -#define STATUS_F2_RX_READY 0x00000020 -#define STATUS_F3_RX_READY 0x00000040 -#define STATUS_HOST_CMD_DATA_ERR 0x00000080 -#define STATUS_F2_PKT_AVAILABLE 0x00000100 -#define STATUS_F2_PKT_LEN_MASK 0x000FFE00 -#define STATUS_F2_PKT_LEN_SHIFT 9 -#define STATUS_F3_PKT_AVAILABLE 0x00100000 -#define STATUS_F3_PKT_LEN_MASK 0xFFE00000 -#define STATUS_F3_PKT_LEN_SHIFT 21 - -/* Bit mask for 16 bits SPID_F1_INFO_REG device register */ -#define F1_ENABLED 0x0001 -#define F1_RDY_FOR_DATA_TRANSFER 0x0002 -#define F1_MAX_PKT_SIZE 0x01FC - -/* Bit mask for 16 bits SPID_F2_INFO_REG device register */ -#define F2_ENABLED 0x0001 -#define F2_RDY_FOR_DATA_TRANSFER 0x0002 -#define F2_MAX_PKT_SIZE 0x3FFC - -/* Bit mask for 16 bits SPID_F3_INFO_REG device register */ -#define F3_ENABLED 0x0001 -#define F3_RDY_FOR_DATA_TRANSFER 0x0002 -#define F3_MAX_PKT_SIZE 0x3FFC - -/* Bit mask for 32 bits SPID_TEST_READ device register read in 16bit LE mode */ -#define TEST_RO_DATA_32BIT_LE 0xFEEDBEAD - -/* Maximum number of I/O funcs */ -#define SPI_MAX_IOFUNCS 4 - -#define SPI_MAX_PKT_LEN (2048*4) - -/* Misc defines */ -#define SPI_FUNC_0 0 -#define SPI_FUNC_1 1 -#define SPI_FUNC_2 2 -#define SPI_FUNC_3 3 - -#define WAIT_F2RXFIFORDY 100 -#define WAIT_F2RXFIFORDY_DELAY 20 - -#endif /* _SPI_H */ diff --git a/drivers/net/wireless/bcmdhd/bcmsdh.c b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh.c index 2f7c451..768ca3b 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh.c +++ b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh.c @@ -2,14 +2,14 @@ * BCMSDH interface glue * implement bcmsdh API for SDIOH driver * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh.c 347614 2012-07-27 10:24:51Z $ + * $Id: bcmsdh.c 300445 2011-12-03 05:37:20Z $ */ /** @@ -38,6 +38,7 @@ #include <hndsoc.h> #include <siutils.h> #include <osl.h> +#include <dhd_sec_feature.h> #include <bcmsdh.h> /* BRCM API for SDIO clients (such as wl, dhd) */ #include <bcmsdbus.h> /* common SDIO/controller interface */ @@ -45,8 +46,6 @@ #include <sdio.h> /* SDIO Device and Protocol Specs */ -#include <dhd_sec_feature.h> - #define SDIOH_API_ACCESS_RETRY_LIMIT 2 const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; @@ -364,10 +363,9 @@ bcmsdh_cis_read(void *sdh, uint func, uint8 *cis, uint length) } bcopy(cis, tmp_buf, length); for (tmp_ptr = tmp_buf, ptr = cis; ptr < (cis + length - 4); tmp_ptr++) { - ptr += snprintf((char*)ptr, (cis + length - ptr - 4), - "%.2x ", *tmp_ptr & 0xff); + ptr += sprintf((char*)ptr, "%.2x ", *tmp_ptr & 0xff); if ((((tmp_ptr - tmp_buf) + 1) & 0xf) == 0) - ptr += snprintf((char *)ptr, (cis + length - ptr -4), "\n"); + ptr += sprintf((char *)ptr, "\n"); } MFREE(bcmsdh->osh, tmp_buf, length); } @@ -622,17 +620,6 @@ bcmsdh_waitlockfree(void *sdh) } -#ifdef BCMSPI /* 4329 gSPI won't have CIS reads. */ -int -bcmsdh_query_device(void *sdh) -{ - bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; - - bcmsdh->vendevid = (VENDOR_BROADCOM << 16) | BCM4321_D11N2G_ID; - - return (bcmsdh->vendevid); -} -#else int bcmsdh_query_device(void *sdh) { @@ -640,7 +627,6 @@ bcmsdh_query_device(void *sdh) bcmsdh->vendevid = (VENDOR_BROADCOM << 16) | 0; return (bcmsdh->vendevid); } -#endif /* else BCMSPI */ uint bcmsdh_query_iofnum(void *sdh) @@ -671,13 +657,7 @@ void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh) uint32 bcmsdh_get_dstatus(void *sdh) { -#ifdef BCMSPI - bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; - sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); - return sdioh_get_dstatus(sd); -#else return 0; -#endif /* BCMSPI */ } uint32 bcmsdh_cur_sbwad(void *sdh) @@ -693,25 +673,9 @@ bcmsdh_cur_sbwad(void *sdh) void bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev) { -#ifdef BCMSPI - bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; - sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); - sdioh_chipinfo(sd, chip, chiprev); -#else return; -#endif /* BCMSPI */ } -#ifdef BCMSPI -void -bcmsdh_dwordmode(void *sdh, bool set) -{ - bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; - sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); - sdioh_dwordmode(sd, set); - return; -} -#endif /* BCMSPI */ int bcmsdh_sleep(void *sdh, bool enab) @@ -761,32 +725,3 @@ bcmsdh_gpioout(void *sdh, uint32 gpio, bool enab) return sdioh_gpioout(sd, gpio, enab); } - -#ifdef BCMSDIOH_TXGLOM -void -bcmsdh_glom_post(void *sdh, uint8 *frame, uint len) -{ - bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; - sdioh_glom_post(bcmsdh->sdioh, frame, len); -} - -void -bcmsdh_glom_clear(void *sdh) -{ - bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; - sdioh_glom_clear(bcmsdh->sdioh); -} - -uint -bcmsdh_set_mode(void *sdh, uint mode) -{ - bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; - return (sdioh_set_mode(bcmsdh->sdioh, mode)); -} - -bool -bcmsdh_glom_enabled(void) -{ - return (sdioh_glom_enabled()); -} -#endif /* BCMSDIOH_TXGLOM */ diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_linux.c b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_linux.c index cd62e4b..400397e 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_linux.c +++ b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_linux.c @@ -1,14 +1,14 @@ /* * SDIO access interface for drivers - linux specific (pci only) * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_linux.c 347638 2012-07-27 11:39:03Z $ + * $Id: bcmsdh_linux.c 294990 2011-11-09 00:13:10Z $ */ /** @@ -41,19 +41,18 @@ #include <bcmdefs.h> #include <bcmdevs.h> -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) #include <linux/irq.h> extern void dhdsdio_isr(void * args); #include <bcmutils.h> #include <dngl_stats.h> #include <dhd.h> -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ -#if defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) -/* SLP_wakelock_alternative_code */ +#if defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) +/*SLP_wakelock_alternative_code*/ struct device *pm_dev; -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ - +#endif /* CONFIG_PM_SLEEP && CUSTOMER_HW_SLP */ /** * SDIO Host Controller info */ @@ -74,9 +73,9 @@ struct bcmsdh_hc { unsigned long oob_flags; /* OOB Host specifiction as edge and etc */ bool oob_irq_registered; bool oob_irq_enable_flag; -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) spinlock_t irq_lock; -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif }; static bcmsdh_hc_t *sdhcinfo = NULL; @@ -137,7 +136,7 @@ bcmsdh_chipmatch(uint16 vendor, uint16 device) } #if defined(BCMPLATFORM_BUS) -#if defined(BCMLXSDMMC) || defined(BCMSPI_ANDROID) +#if defined(BCMLXSDMMC) /* forward declarations */ int bcmsdh_probe(struct device *dev); int bcmsdh_remove(struct device *dev); @@ -149,37 +148,37 @@ EXPORT_SYMBOL(bcmsdh_remove); /* forward declarations */ static int __devinit bcmsdh_probe(struct device *dev); static int __devexit bcmsdh_remove(struct device *dev); -#endif /* defined(BCMLXSDMMC) || defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ -#if !defined(BCMLXSDMMC) && !defined(BCMSPI_ANDROID) +#ifndef BCMLXSDMMC static -#endif /* !defined(BCMLXSDMMC) && !defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ int bcmsdh_probe(struct device *dev) { osl_t *osh = NULL; bcmsdh_hc_t *sdhc = NULL; ulong regs = 0; bcmsdh_info_t *sdh = NULL; -#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) && !defined(BCMSPI_ANDROID) +#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) struct platform_device *pdev; struct resource *r; -#endif /* !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) && !defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ int irq = 0; uint32 vendevid; unsigned long irq_flags = 0; -#if defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) +#if defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) int ret = 0; -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ +#endif /* CONFIG_PM_SLEEP && CUSTOMER_HW_SLP */ -#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) && !defined(BCMSPI_ANDROID) +#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) pdev = to_platform_device(dev); r = platform_get_resource(pdev, IORESOURCE_MEM, 0); irq = platform_get_irq(pdev, 0); if (!r || irq == NO_IRQ) return -ENXIO; -#endif /* !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) && !defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) #ifdef HW_OOB irq_flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; @@ -189,11 +188,15 @@ int bcmsdh_probe(struct device *dev) /* Get customer specific OOB IRQ parametres: IRQ number as IRQ type */ irq = dhd_customer_oob_irq_map(&irq_flags); +#if defined(BCMHOST) + /* Do not disable this IRQ during suspend */ + irq_flags |= IRQF_NO_SUSPEND; +#endif if (irq < 0) { SDLX_MSG(("%s: Host irq is not defined\n", __FUNCTION__)); return 1; } -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ /* allocate SDIO Host Controller state info */ if (!(osh = osl_attach(dev, PCI_BUS, FALSE))) { SDLX_MSG(("%s: osl_attach failed\n", __FUNCTION__)); @@ -210,7 +213,7 @@ int bcmsdh_probe(struct device *dev) sdhc->dev = (void *)dev; -#if defined(BCMLXSDMMC) || defined(BCMSPI_ANDROID) +#ifdef BCMLXSDMMC if (!(sdh = bcmsdh_attach(osh, (void *)0, (void **)®s, irq))) { SDLX_MSG(("%s: bcmsdh_attach failed\n", __FUNCTION__)); @@ -222,27 +225,26 @@ int bcmsdh_probe(struct device *dev) SDLX_MSG(("%s: bcmsdh_attach failed\n", __FUNCTION__)); goto err; } -#endif /* defined(BCMLXSDMMC) || defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ sdhc->sdh = sdh; sdhc->oob_irq = irq; sdhc->oob_flags = irq_flags; sdhc->oob_irq_registered = FALSE; /* to make sure.. */ sdhc->oob_irq_enable_flag = FALSE; -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) spin_lock_init(&sdhc->irq_lock); -#endif /* defined(BCMLXSDMMC) || defined(BCMSPI_ANDROID) */ +#endif /* chain SDIO Host Controller info together */ sdhc->next = sdhcinfo; sdhcinfo = sdhc; -#if defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) - /* SLP_wakelock_alternative_code */ - pm_dev = sdhc->dev; +#if defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) + /*SLP_wakelock_alternative_code*/ + pm_dev=sdhc->dev; ret = device_init_wakeup(pm_dev, 1); printf("%s : device_init_wakeup(pm_dev) enable, ret = %d\n", __func__, ret); -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ - +#endif /* CONFIG_PM_SLEEP && CUSTOMER_HW_SLP */ /* Read the vendor/device ID from the CIS */ vendevid = bcmsdh_query_device(sdh); /* try to attach to the target device */ @@ -267,20 +269,20 @@ err: return -ENODEV; } -#if !defined(BCMLXSDMMC) && !defined(BCMSPI_ANDROID) +#ifndef BCMLXSDMMC static -#endif /* !defined(BCMLXSDMMC) && !defined(BCMSPI_ANDROID) */ +#endif /* BCMLXSDMMC */ int bcmsdh_remove(struct device *dev) { bcmsdh_hc_t *sdhc, *prev; osl_t *osh; sdhc = sdhcinfo; -#if defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) - /* SLP_wakelock_alternative_code */ +#if defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) + /*SLP_wakelock_alternative_code*/ device_init_wakeup(pm_dev, 0); printf("%s : device_init_wakeup(pm_dev) disable\n", __func__); -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ +#endif /* CONFIG_PM_SLEEP && CUSTOMER_HW_SLP */ drvinfo.detach(sdhc->ch); bcmsdh_detach(sdhc->osh, sdhc->sdh); @@ -305,9 +307,9 @@ int bcmsdh_remove(struct device *dev) MFREE(osh, sdhc, sizeof(bcmsdh_hc_t)); osl_detach(osh); -#if !defined(BCMLXSDMMC) || defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if !defined(BCMLXSDMMC) || defined(OOB_INTR_ONLY) dev_set_drvdata(dev, NULL); -#endif /* !defined(BCMLXSDMMC) || defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* !defined(BCMLXSDMMC) || defined(OOB_INTR_ONLY) */ return 0; } @@ -530,11 +532,7 @@ bcmsdh_pci_remove(struct pci_dev *pdev) #endif /* BCMLXSDMMC */ #endif /* BCMPLATFORM_BUS */ -#ifdef BCMSPI_ANDROID -extern int spi_function_init(void); -#else extern int sdio_function_init(void); -#endif /* BCMSPI_ANDROID */ extern int sdio_func_reg_notify(void* semaphore); extern void sdio_func_unreg_notify(void); @@ -542,12 +540,15 @@ extern void sdio_func_unreg_notify(void); #if defined(BCMLXSDMMC) int bcmsdh_reg_sdio_notify(void* semaphore) { + return sdio_func_reg_notify(semaphore); + } void bcmsdh_unreg_sdio_notify(void) { sdio_func_unreg_notify(); + } #endif /* defined(BCMLXSDMMC) */ @@ -559,13 +560,8 @@ bcmsdh_register(bcmsdh_driver_t *driver) drvinfo = *driver; #if defined(BCMPLATFORM_BUS) -#ifdef BCMSPI_ANDROID - SDLX_MSG(("Linux Kernel SPI Driver\n")); - error = spi_function_init(); -#else /* BCMSPI_ANDROID */ SDLX_MSG(("Linux Kernel SDIO/MMC Driver\n")); error = sdio_function_init(); -#endif /* BCMSPI_ANDROID */ return error; #endif /* defined(BCMPLATFORM_BUS) */ @@ -584,11 +580,7 @@ bcmsdh_register(bcmsdh_driver_t *driver) return error; } -#ifdef BCMSPI_ANDROID -extern void spi_function_cleanup(void); -#else extern void sdio_function_cleanup(void); -#endif /* BCMSPI_ANDROID */ void bcmsdh_unregister(void) @@ -597,9 +589,6 @@ bcmsdh_unregister(void) if (bcmsdh_pci_driver.node.next) #endif -#ifdef BCMSPI_ANDROID - spi_function_cleanup(); -#endif /* BCMSPI_ANDROID */ #if defined(BCMLXSDMMC) sdio_function_cleanup(); #endif /* BCMLXSDMMC */ @@ -609,7 +598,7 @@ bcmsdh_unregister(void) #endif /* BCMPLATFORM_BUS */ } -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) void bcmsdh_oob_intr_set(bool enable) { static bool curstate = 1; @@ -663,9 +652,7 @@ int bcmsdh_register_oob_intr(void * dhdp) if (error) return -ENODEV; - error = enable_irq_wake(sdhcinfo->oob_irq); - if (error) - SDLX_MSG(("%s enable_irq_wake error=%d \n", __FUNCTION__, error)); + enable_irq_wake(sdhcinfo->oob_irq); sdhcinfo->oob_irq_registered = TRUE; sdhcinfo->oob_irq_enable_flag = TRUE; } @@ -682,9 +669,7 @@ void bcmsdh_set_irq(int flag) enable_irq(sdhcinfo->oob_irq); enable_irq_wake(sdhcinfo->oob_irq); } else { -#if !(defined(BCMSPI_ANDROID) && defined(CUSTOMER_HW4) && defined(CONFIG_NKERNEL)) disable_irq_wake(sdhcinfo->oob_irq); -#endif /* !defined(BCMSPI_ANDROID) */ disable_irq(sdhcinfo->oob_irq); } } @@ -700,7 +685,7 @@ void bcmsdh_unregister_oob_intr(void) sdhcinfo->oob_irq_registered = FALSE; } } -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ #if defined(BCMLXSDMMC) void *bcmsdh_get_drvdata(void) @@ -709,7 +694,7 @@ void *bcmsdh_get_drvdata(void) return NULL; return dev_get_drvdata(sdhcinfo->dev); } -#endif +#endif /* defined(OOB_INTR_ONLY) */ /* Module parameters specific to each host-controller driver */ @@ -739,11 +724,6 @@ extern int sd_uhsimode; module_param(sd_uhsimode, int, 0); #endif -#ifdef BCMSDIOH_TXGLOM -extern uint sd_txglom; -module_param(sd_txglom, uint, 0); -#endif - #ifdef BCMSDH_MODULE EXPORT_SYMBOL(bcmsdh_attach); EXPORT_SYMBOL(bcmsdh_detach); diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc.c index c743d09..d6a110a 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc.c @@ -2,13 +2,13 @@ * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.c 347640 2012-07-27 11:53:21Z $ + * $Id: bcmsdh_sdmmc.c 309548 2012-01-20 01:13:08Z $ */ #include <typedefs.h> @@ -168,12 +168,12 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) /* Release host controller F1 */ sdio_release_host(gInstance->func[1]); - } else { + }else { sd_err(("%s:gInstance->func[1] is null\n", __FUNCTION__)); MFREE(sd->osh, sd, sizeof(sdioh_info_t)); return NULL; } - + if (gInstance->func[2]) { /* Claim host controller F2 */ sdio_claim_host(gInstance->func[2]); @@ -187,7 +187,7 @@ sdioh_attach(osl_t *osh, void *bar0, uint irq) /* Release host controller F2 */ sdio_release_host(gInstance->func[2]); - } else { + }else { sd_err(("%s:gInstance->func[2] is null\n", __FUNCTION__)); MFREE(sd->osh, sd, sizeof(sdioh_info_t)); return NULL; @@ -404,17 +404,17 @@ const bcm_iovar_t sdioh_iovars[] = { {"sd_blockmode", IOV_BLOCKMODE, 0, IOVT_BOOL, 0 }, {"sd_blocksize", IOV_BLOCKSIZE, 0, IOVT_UINT32, 0 }, /* ((fn << 16) | size) */ {"sd_dma", IOV_DMA, 0, IOVT_BOOL, 0 }, - {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0 }, + {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0 }, {"sd_numints", IOV_NUMINTS, 0, IOVT_UINT32, 0 }, {"sd_numlocalints", IOV_NUMLOCALINTS, 0, IOVT_UINT32, 0 }, {"sd_hostreg", IOV_HOSTREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, - {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, + {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, {"sd_divisor", IOV_DIVISOR, 0, IOVT_UINT32, 0 }, {"sd_power", IOV_POWER, 0, IOVT_UINT32, 0 }, {"sd_clock", IOV_CLOCK, 0, IOVT_UINT32, 0 }, - {"sd_mode", IOV_SDMODE, 0, IOVT_UINT32, 100}, + {"sd_mode", IOV_SDMODE, 0, IOVT_UINT32, 100}, {"sd_highspeed", IOV_HISPEED, 0, IOVT_UINT32, 0 }, - {"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0 }, + {"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0 }, {NULL, 0, 0, 0, 0 } }; @@ -463,7 +463,6 @@ sdioh_iovar_op(sdioh_info_t *si, const char *name, bcopy(params, &int_val, sizeof(int_val)); bool_val = (int_val != 0) ? TRUE : FALSE; - BCM_REFERENCE(bool_val); actionid = set ? IOV_SVAL(vi->varid) : IOV_GVAL(vi->varid); switch (actionid) { @@ -523,7 +522,7 @@ sdioh_iovar_op(sdioh_info_t *si, const char *name, /* Now set it */ si->client_block_size[func] = blksize; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE if (gInstance == NULL || gInstance->func[func] == NULL) { sd_err(("%s: SDIO Device not present\n", __FUNCTION__)); bcmerror = BCME_NORESOURCE; @@ -532,11 +531,10 @@ sdioh_iovar_op(sdioh_info_t *si, const char *name, sdio_claim_host(gInstance->func[func]); bcmerror = sdio_set_block_size(gInstance->func[func], blksize); if (bcmerror) { - sd_err(("%s: Failed to set F%d blocksize to %d\n", __FUNCTION__, func, - blksize)); + sd_err(("%s: Failed to set F%d blocksize to %d\n", __FUNCTION__, func, blksize)); } sdio_release_host(gInstance->func[func]); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif break; } @@ -708,10 +706,15 @@ sdioh_enable_hw_oob_intr(sdioh_info_t *sd, bool enable) uint8 data; if (enable) - data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE | SDIO_SEPINT_ACT_HI; + data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; /* enable hw oob interrupt */ else data = SDIO_SEPINT_ACT_HI; /* disable hw oob interrupt */ +#if 1 && LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) + /* Needed for Android Linux Kernel 2.6.35 */ + data |= SDIO_SEPINT_ACT_HI; /* Active HIGH */ +#endif /* OEM_ANDROID */ + status = sdioh_request_byte(sd, SDIOH_WRITE, 0, SDIOD_CCCR_BRCM_SEPINT, &data); return status; } @@ -826,15 +829,14 @@ sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *by #if defined(MMC_SDIO_ABORT) /* to allow abort command through F1 */ else if (regaddr == SDIOD_CCCR_IOABORT) { - if (gInstance->func[func]) { + if (gInstance->func[func]){ sdio_claim_host(gInstance->func[func]); /* * this sdio_f0_writeb() can be replaced with another api * depending upon MMC driver change. * As of this time, this is temporaray one */ - sdio_writeb(gInstance->func[func], - *byte, regaddr, &err_ret); + sdio_writeb(gInstance->func[func], *byte, regaddr, &err_ret); sdio_release_host(gInstance->func[func]); } } @@ -843,16 +845,15 @@ sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *by sd_err(("bcmsdh_sdmmc: F0 Wr:0x%02x: write disallowed\n", regaddr)); } else { /* Claim host controller, perform F0 write, and release */ - if (gInstance->func[func]) { + if (gInstance->func[func]){ sdio_claim_host(gInstance->func[func]); - sdio_f0_writeb(gInstance->func[func], - *byte, regaddr, &err_ret); + sdio_f0_writeb(gInstance->func[func], *byte, regaddr, &err_ret); sdio_release_host(gInstance->func[func]); } } } else { /* Claim host controller, perform Fn write, and release */ - if (gInstance->func[func]) { + if (gInstance->func[func]){ sdio_claim_host(gInstance->func[func]); sdio_writeb(gInstance->func[func], *byte, regaddr, &err_ret); sdio_release_host(gInstance->func[func]); @@ -860,13 +861,15 @@ sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *by } } else { /* CMD52 Read */ /* Claim host controller, perform Fn read, and release */ - if (gInstance->func[func]) { + if (gInstance->func[func]){ sdio_claim_host(gInstance->func[func]); + if (func == 0) { *byte = sdio_f0_readb(gInstance->func[func], regaddr, &err_ret); } else { *byte = sdio_readb(gInstance->func[func], regaddr, &err_ret); } + sdio_release_host(gInstance->func[func]); } } @@ -1048,19 +1051,16 @@ sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, xfred_len = 0; } - /* Align Patch - * read or small packet(ex:BDC header) skip 32 byte align - * otherwise, padding DHD_SDALIGN for performance - */ - if (write == 0 || pkt_len < 32) + /* Align Patch */ + if (write == 0 || pkt_len < 32) // read or small packet(ex-BDC header) skip 32 byte align pkt_len = (pkt_len + 3) & 0xFFFFFFFC; - else if (pkt_len % DHD_SDALIGN) + else if(pkt_len % DHD_SDALIGN) // write pkt_len += DHD_SDALIGN - (pkt_len % DHD_SDALIGN); -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE if (write && pkt_len > 64 && (pkt_len % 64) == 32) pkt_len += 32; -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif #ifdef CONFIG_MMC_MSM7X00A if ((pkt_len % 64) == 32) { sd_trace(("%s: Rounding up TX packet +=32\n", __FUNCTION__)); @@ -1311,7 +1311,6 @@ static void IRQHandlerF2(struct sdio_func *func) sd = gInstance->sd; ASSERT(sd != NULL); - BCM_REFERENCE(sd); } #endif /* !defined(OOB_INTR_ONLY) */ @@ -1355,7 +1354,7 @@ sdioh_start(sdioh_info_t *si, int stage) sdio access will come in way */ if (gInstance->func[0]) { - if (stage == 0) { + if (stage == 0) { /* Since the power to the chip is killed, we will have re enumerate the device again. Set the block size and enable the fucntion 1 for in preparation for @@ -1375,7 +1374,7 @@ sdioh_start(sdioh_info_t *si, int stage) sd->use_client_ints = TRUE; sd->client_block_size[0] = 64; - if (gInstance->func[1]) { + if(gInstance->func[1]) { /* Claim host controller */ sdio_claim_host(gInstance->func[1]); @@ -1383,7 +1382,6 @@ sdioh_start(sdioh_info_t *si, int stage) if (sdio_set_block_size(gInstance->func[1], 64)) { sd_err(("bcmsdh_sdmmc: Failed to set F1 blocksize\n")); } - /* Release host controller F1 */ sdio_release_host(gInstance->func[1]); } diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc_linux.c index 36f2a6c..ca8478b 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd/src/bcmsdio/sys/bcmsdh_sdmmc_linux.c @@ -1,14 +1,14 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc_linux.c 353908 2012-08-29 08:09:02Z $ + * $Id: bcmsdh_sdmmc_linux.c 307731 2012-01-12 10:52:03Z $ */ #include <typedefs.h> @@ -131,30 +131,30 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func, gInstance->func[func->num] = func; if (func->num == 2) { - #ifdef WL_CFG80211 +#ifdef WL_CFG80211 wl_cfg80211_set_parent_dev(&func->dev); - #endif +#endif sd_trace(("F2 found, calling bcmsdh_probe...\n")); ret = bcmsdh_probe(&func->dev); } - } else { + }else { ret = -ENODEV; } - + return ret; } static void bcmsdh_sdmmc_remove(struct sdio_func *func) { if (func) { - sd_trace(("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__)); + sd_err(("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__)); sd_info(("sdio_bcmsdh: func->class=%x\n", func->class)); sd_info(("sdio_vendor: 0x%04x\n", func->vendor)); sd_info(("sdio_device: 0x%04x\n", func->device)); sd_info(("Function#: 0x%04x\n", func->num)); if (func->num == 2) { - sd_trace(("F2 found, calling bcmsdh_remove...\n")); + sd_err(("F2 found, calling bcmsdh_remove...\n")); bcmsdh_remove(&func->dev); } else if (func->num == 1) { sdio_claim_host(func); @@ -186,38 +186,21 @@ MODULE_DEVICE_TABLE(sdio, bcmsdh_sdmmc_ids); static int bcmsdh_sdmmc_suspend(struct device *pdev) { struct sdio_func *func = dev_to_sdio_func(pdev); - mmc_pm_flag_t sdio_flags; - int ret; if (func->num != 2) return 0; - sd_trace(("%s Enter\n", __FUNCTION__)); + sd_err(("%s Enter\n", __FUNCTION__)); if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) return -EBUSY; - - sdio_flags = sdio_get_host_pm_caps(func); - - if (!(sdio_flags & MMC_PM_KEEP_POWER)) { - sd_err(("%s: can't keep power while host is suspended\n", __FUNCTION__)); - return -EINVAL; - } - - /* keep power while host suspended */ - ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); - if (ret) { - sd_err(("%s: error while trying to keep power\n", __FUNCTION__)); - return ret; - } - -#if !defined(CUSTOMER_HW4) +#if !defined(CUSTOMER_HW_SAMSUNG) #if defined(OOB_INTR_ONLY) bcmsdh_oob_intr_set(0); #endif /* defined(OOB_INTR_ONLY) */ -#endif /* !defined(CUSTOMER_HW4) */ +#endif /* defined(OOB_INTR_ONLY) */ dhd_mmc_suspend = TRUE; -#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA) +#if defined (CUSTOMER_HW_SAMSUNG) && defined (CONFIG_ARCH_TEGRA) irq_set_irq_wake(390, 1); #endif smp_mb(); @@ -227,24 +210,23 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev) static int bcmsdh_sdmmc_resume(struct device *pdev) { -#if !defined(CUSTOMER_HW4) #if defined(OOB_INTR_ONLY) struct sdio_func *func = dev_to_sdio_func(pdev); -#endif /* defined(OOB_INTR_ONLY) */ -#endif /* defined(CUSTOMER_HW4) */ - sd_trace(("%s Enter\n", __FUNCTION__)); - +#endif + if (func->num == 2) + sd_err(("%s Enter\n", __FUNCTION__)); dhd_mmc_suspend = FALSE; -#if !defined(CUSTOMER_HW4) +#if !defined(CUSTOMER_HW_SAMSUNG) #if defined(OOB_INTR_ONLY) if ((func->num == 2) && dhd_os_check_if_up(bcmsdh_get_drvdata())) bcmsdh_oob_intr_set(1); #endif /* (OOB_INTR_ONLY) */ -#endif /* !(CUSTOMER_HW4) */ -#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA) +#endif /* !CUSTOMER_HW_SAMSUNG */ +#if defined (CUSTOMER_HW_SAMSUNG) && defined (CONFIG_ARCH_TEGRA) if (func->num == 2) irq_set_irq_wake(390, 0); #endif + smp_mb(); return 0; } @@ -262,7 +244,7 @@ static int dummy_probe(struct sdio_func *func, const struct sdio_device_id *id) { if (notify_semaphore) - up(notify_semaphore); + up(notify_semaphore); return 0; } @@ -287,7 +269,6 @@ void sdio_func_unreg_notify(void) { sdio_unregister_driver(&dummy_sdmmc_driver); } - #endif /* defined(BCMLXSDMMC) */ static struct sdio_driver bcmsdh_sdmmc_driver = { @@ -295,12 +276,14 @@ static struct sdio_driver bcmsdh_sdmmc_driver = { .remove = bcmsdh_sdmmc_remove, .name = "bcmsdh_sdmmc", .id_table = bcmsdh_sdmmc_ids, +#if !defined(BCMHOST) #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) .drv = { - .pm = &bcmsdh_sdmmc_pm_ops, + .pm = &bcmsdh_sdmmc_pm_ops, }, #endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) */ - }; +#endif +}; struct sdos_info { sdioh_info_t *sd; @@ -313,7 +296,7 @@ sdioh_sdmmc_osinit(sdioh_info_t *sd) { struct sdos_info *sdos; - if (!sd) + if(!sd) return BCME_BADARG; sdos = (struct sdos_info*)MALLOC(sd->osh, sizeof(struct sdos_info)); @@ -343,9 +326,9 @@ sdioh_interrupt_set(sdioh_info_t *sd, bool enable) ulong flags; struct sdos_info *sdos; - if (!sd) + if(!sd) return BCME_BADARG; - + sd_trace(("%s: %s\n", __FUNCTION__, enable ? "Enabling" : "Disabling")); sdos = (struct sdos_info *)sd->sdos_info; @@ -379,7 +362,7 @@ static int __init bcmsdh_module_init(void) { int error = 0; - error = sdio_function_init(); + sdio_function_init(); return error; } @@ -410,10 +393,6 @@ int sdio_function_init(void) return -ENOMEM; error = sdio_register_driver(&bcmsdh_sdmmc_driver); - if (error && gInstance) { - kfree(gInstance); - gInstance = 0; - } return error; } diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd.h index de040fa..44fd410 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd.h @@ -5,13 +5,13 @@ * DHD OS, bus, and protocol modules. * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,12 +19,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd.h 354524 2012-08-31 12:10:27Z $ + * $Id: dhd.h 309548 2012-01-20 01:13:08Z $ */ /**************** @@ -34,6 +34,7 @@ #ifndef _dhd_h_ #define _dhd_h_ +#include "dhd_sec_feature.h" #include <linux/init.h> #include <linux/kernel.h> #include <linux/slab.h> @@ -58,12 +59,8 @@ int setScheduler(struct task_struct *p, int policy, struct sched_param *param); #include <wlioctl.h> #include <wlfc_proto.h> -#include <dhd_sec_feature.h> - -#if defined(CUSTOMER_HW4_RELEASE) -/* Customer requirement */ +// For dual support of WCN3660 and BCM4334 #undef CONFIG_WIRELESS_EXT -#endif /* Forward decls */ struct dhd_bus; @@ -80,23 +77,23 @@ enum dhd_bus_state { /* Firmware requested operation mode */ #define STA_MASK 0x0001 -#define HOSTAPD_MASK 0x0002 +#define HOSTAPD_MASK 0x0002 #define WFD_MASK 0x0004 -#define SOFTAP_FW_MASK 0x0008 -#define CONCURRENT_FW_MASK (STA_MASK | WFD_MASK) -#define P2P_GO_ENABLED 0x0010 -#define P2P_GC_ENABLED 0x0020 -#define CONCURENT_MASK 0x00F0 -#define CONCURRENT_MULTI_CHAN 0x0100 -#define MANUFACTRING_FW "WLTEST" +#define SOFTAP_FW_MASK 0x0008 +#define CONCURRENT_MASK (STA_MASK | WFD_MASK) /* max sequential rxcntl timeouts to set HANG event */ -#ifndef MAX_CNTL_TIMEOUT +#ifdef BCM4334_CHIP +#define MAX_CNTL_TIMEOUT 1 +#else #define MAX_CNTL_TIMEOUT 2 #endif +#define DHD_SCAN_ACTIVE_TIME 40 /* ms : Embedded default Active setting from DHD Driver */ +#define DHD_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD Driver */ + #ifndef POWERUP_MAX_RETRY -#define POWERUP_MAX_RETRY 3 /* how many times we retry to power up the chip */ +#define POWERUP_MAX_RETRY (10) /* how many times we retry to power up the chip */ #endif #ifndef POWERUP_WAIT_MS #define POWERUP_WAIT_MS (2000) /* ms: time out in waiting wifi to come up */ @@ -123,15 +120,13 @@ enum dhd_prealloc_index { DHD_PREALLOC_PROT = 0, DHD_PREALLOC_RXBUF, DHD_PREALLOC_DATABUF, -#if defined(STATIC_WL_PRIV_STRUCT) +#if defined (CUSTOMER_HW_SAMSUNG) && defined (CONFIG_DHD_USE_STATIC_BUF) DHD_PREALLOC_OSL_BUF, DHD_PREALLOC_WIPHY_ESCAN0 = 5, -#if defined(DUAL_ESCAN_RESULT_BUFFER) DHD_PREALLOC_WIPHY_ESCAN1 -#endif #else DHD_PREALLOC_OSL_BUF -#endif /* STATIC_WL_PRIV_STRUCT */ +#endif }; typedef enum { @@ -247,16 +242,13 @@ typedef struct dhd_pub { char eventmask[WL_EVENTING_MASK_LEN]; int op_mode; /* STA, HostAPD, WFD, SoftAP */ -/* Set this to 1 to use a seperate interface (p2p0) for p2p operations. - * For ICS MR1 releases it should be disable to be compatable with ICS MR1 Framework - * see target dhd-cdc-sdmmc-panda-cfg80211-icsmr1-gpl-debug in Makefile - */ -/* #define WL_ENABLE_P2P_IF 1 */ - +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_HAS_WAKELOCK) + struct wake_lock wakelock[WAKE_LOCK_MAX]; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined (CONFIG_HAS_WAKELOCK) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 - struct mutex wl_start_stop_lock; /* lock/unlock for Android start/stop */ - struct mutex wl_softap_lock; /* lock/unlock for any SoftAP/STA settings */ -#endif + struct mutex wl_start_stop_lock; /* lock/unlock for Android start/stop */ + struct mutex wl_softap_lock; /* lock/unlock for any SoftAP/STA settings */ +#endif #ifdef WLBTAMP uint16 maxdatablks; @@ -265,8 +257,9 @@ typedef struct dhd_pub { int wlfc_enabled; void* wlfc_state; #endif + bool roam_env_detection; bool dongle_isolation; - bool dongle_trap_occured; /* flag for sending HANG event to upper layer */ + bool dongle_trap_occured; int hang_was_sent; int rxcnt_timeout; /* counter rxcnt timeout to send HANG */ int txcnt_timeout; /* counter txcnt timeout to send HANG */ @@ -274,9 +267,11 @@ typedef struct dhd_pub { uint8 htsfdlystat_sz; /* Size of delay stats, max 255B */ #endif struct reorder_info *reorder_bufs[WLHOST_REORDERDATA_MAXFLOWS]; +#if defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) + struct wake_lock pno_wakelock; +#endif } dhd_pub_t; - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) #define DHD_PM_RESUME_WAIT_INIT(a) DECLARE_WAIT_QUEUE_HEAD(a); @@ -285,29 +280,29 @@ typedef struct dhd_pub { SMP_RD_BARRIER_DEPENDS(); \ while (dhd_mmc_suspend && retry++ != b) { \ SMP_RD_BARRIER_DEPENDS(); \ - wait_event_interruptible_timeout(a, !dhd_mmc_suspend, 1); \ - } \ - } while (0) - #define DHD_PM_RESUME_WAIT(a) _DHD_PM_RESUME_WAIT(a, 200) - #define DHD_PM_RESUME_WAIT_FOREVER(a) _DHD_PM_RESUME_WAIT(a, ~0) -#ifdef CUSTOMER_HW4 - #define DHD_PM_RESUME_RETURN_ERROR(a) do { \ - if (dhd_mmc_suspend) { \ - printf("%s[%d]: mmc is still in suspend state!!!\n", \ - __FUNCTION__, __LINE__); \ - return a; \ + wait_event_interruptible_timeout(a, !dhd_mmc_suspend, HZ/100); \ } \ - } while (0) + } while (0) +#ifdef CUSTOMER_HW_SAMSUNG + #define DHD_PM_RESUME_WAIT(a) _DHD_PM_RESUME_WAIT(a, 500) #else - #define DHD_PM_RESUME_RETURN_ERROR(a) do { if (dhd_mmc_suspend) return a; } while (0) -#endif /* CUSTOMER_HW4 */ + #define DHD_PM_RESUME_WAIT(a) _DHD_PM_RESUME_WAIT(a, 200) +#endif /* CUSTOMER_HW_SAMSUNG */ + #define DHD_PM_RESUME_WAIT_FOREVER(a) _DHD_PM_RESUME_WAIT(a, ~0) + #define DHD_PM_RESUME_RETURN_ERROR(a) do { \ + if (dhd_mmc_suspend) { \ + printf("mmc in suspend yet!!!: %s %d\n", \ + __FUNCTION__, __LINE__); \ + return a; \ + } \ + } while (0) #define DHD_PM_RESUME_RETURN do { if (dhd_mmc_suspend) return; } while (0) #define DHD_SPINWAIT_SLEEP_INIT(a) DECLARE_WAIT_QUEUE_HEAD(a); #define SPINWAIT_SLEEP(a, exp, us) do { \ uint countdown = (us) + 9999; \ while ((exp) && (countdown >= 10000)) { \ - wait_event_interruptible_timeout(a, FALSE, 1); \ + wait_event_interruptible_timeout(a, FALSE, HZ/100); \ countdown -= 10000; \ } \ } while (0) @@ -343,8 +338,7 @@ void dhd_os_spin_unlock(dhd_pub_t *pub, unsigned long flags); extern int dhd_os_wake_lock(dhd_pub_t *pub); extern int dhd_os_wake_unlock(dhd_pub_t *pub); extern int dhd_os_wake_lock_timeout(dhd_pub_t *pub); -extern int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val); -extern int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val); +extern int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub, int val); inline static void MUTEX_LOCK_SOFTAP_SET_INIT(dhd_pub_t * dhdp) { @@ -386,14 +380,17 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) __FUNCTION__, __LINE__); \ dhd_os_wake_lock_timeout(pub); \ } while (0) +#define DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(pub, val) \ + do { \ + printf("call wake_lock_timeout_enable[%d]: %s %d\n", \ + val, __FUNCTION__, __LINE__); \ + dhd_os_wake_lock_timeout_enable(pub, val); \ + } while (0) #else -#define DHD_OS_WAKE_LOCK(pub) dhd_os_wake_lock(pub) -#define DHD_OS_WAKE_UNLOCK(pub) dhd_os_wake_unlock(pub) +#define DHD_OS_WAKE_LOCK(pub) dhd_os_wake_lock(pub) +#define DHD_OS_WAKE_UNLOCK(pub) dhd_os_wake_unlock(pub) #define DHD_OS_WAKE_LOCK_TIMEOUT(pub) dhd_os_wake_lock_timeout(pub) -#define DHD_OS_WAKE_LOCK_RX_TIMEOUT_ENABLE(pub, val) \ - dhd_os_wake_lock_rx_timeout_enable(pub, val) -#define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(pub, val) \ - dhd_os_wake_lock_ctrl_timeout_enable(pub, val) +#define DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(pub, val) dhd_os_wake_lock_timeout_enable(pub, val) #endif /* DHD_DEBUG_WAKE_LOCK */ #define DHD_PACKET_TIMEOUT_MS 1000 #define DHD_EVENT_TIMEOUT_MS 1500 @@ -428,7 +425,7 @@ typedef enum dhd_attach_states } dhd_attach_states_t; /* Value -1 means we are unsuccessful in creating the kthread. */ -#define DHD_PID_KT_INVALID -1 +#define DHD_PID_KT_INVALID -1 /* Value -2 means we are unsuccessful in both creating the kthread and tasklet */ #define DHD_PID_KT_TL_INVALID -2 @@ -498,9 +495,6 @@ extern void dhd_os_sdunlock_sndup_rxq(dhd_pub_t * pub); extern void dhd_os_sdlock_eventq(dhd_pub_t * pub); extern void dhd_os_sdunlock_eventq(dhd_pub_t * pub); extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret); -extern int dhd_os_send_hang_message(dhd_pub_t *dhdp); -extern int net_os_send_hang_message(struct net_device *dev); -extern void dhd_set_version_info(dhd_pub_t *pub, char *fw); #ifdef PNO_SUPPORT extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled); @@ -515,17 +509,12 @@ extern int dhd_dev_pno_enable(struct net_device *dev, int pfn_enabled); extern int dhd_dev_get_pno_status(struct net_device *dev); #endif /* PNO_SUPPORT */ -#ifdef PKT_FILTER_SUPPORT #define DHD_UNICAST_FILTER_NUM 0 #define DHD_BROADCAST_FILTER_NUM 1 #define DHD_MULTICAST4_FILTER_NUM 2 #define DHD_MULTICAST6_FILTER_NUM 3 -#define DHD_MDNS_FILTER_NUM 4 -extern void dhd_set_packet_filter(dhd_pub_t *dhd); -extern void dhd_enable_packet_filter(int value, dhd_pub_t *dhd); -extern int net_os_enable_packet_filter(struct net_device *dev, int val); +extern int net_os_set_packet_filter(struct net_device *dev, int val); extern int net_os_rxfilter_add_remove(struct net_device *dev, int val, int num); -#endif /* PKT_FILTER_SUPPORT */ extern int dhd_get_dtim_skip(dhd_pub_t *dhd); extern bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd); @@ -533,9 +522,9 @@ extern bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd); #ifdef DHD_DEBUG extern int write_to_file(dhd_pub_t *dhd, uint8 *buf, int size); #endif /* DHD_DEBUG */ -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) extern int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ extern void dhd_os_sdtxlock(dhd_pub_t * pub); extern void dhd_os_sdtxunlock(dhd_pub_t * pub); @@ -587,9 +576,6 @@ extern int dhd_bus_start(dhd_pub_t *dhdp); extern int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size); extern void dhd_print_buf(void *pbuf, int len, int bytes_per_line); extern bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf, int *retval); -extern uint dhd_bus_chip_id(dhd_pub_t *dhdp); -extern uint dhd_bus_chiprev_id(dhd_pub_t *dhdp); -extern uint dhd_bus_chippkg_id(dhd_pub_t *dhdp); #if defined(KEEP_ALIVE) extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); @@ -666,30 +652,13 @@ extern uint dhd_sdiod_drive_strength; /* Override to force tx queueing all the time */ extern uint dhd_force_tx_queueing; /* Default KEEP_ALIVE Period is 55 sec to prevent AP from sending Keep Alive probe frame */ -#if defined(CUSTOMER_HW4) #ifdef KEEP_ALIVE_PACKET_PERIOD_30_SEC #define KEEP_ALIVE_PERIOD 30000 #else /* KEEP_ALIVE_PACKET_PERIOD_30_SEC */ #define KEEP_ALIVE_PERIOD 55000 #endif /* KEEP_ALIVE_PACKET_PERIOD_30_SEC */ -#else -#define KEEP_ALIVE_PERIOD 55000 -#endif /* CUSTOMER_HW4 */ #define NULL_PKT_STR "null_pkt" -/* hooks for custom glom setting option via Makefile */ -#define DEFAULT_GLOM_VALUE -1 -#ifndef CUSTOM_GLOM_SETTING -#define CUSTOM_GLOM_SETTING DEFAULT_GLOM_VALUE -#endif - -/* hooks for custom dhd_dpc_prio setting option via Makefile */ -#define DEFAULT_DHP_DPC_PRIO 1 -#ifndef CUSTOM_DPC_PRIO_SETTING -#define CUSTOM_DPC_PRIO_SETTING DEFAULT_DHP_DPC_PRIO -#endif - - #ifdef SDTEST /* Echo packet generator (SDIO), pkts/s */ extern uint dhd_pktgen; @@ -705,8 +674,6 @@ extern uint dhd_pktgen_len; extern char fw_path[MOD_PARAM_PATHLEN]; extern char nv_path[MOD_PARAM_PATHLEN]; -#define MOD_PARAM_INFOLEN 512 - #ifdef SOFTAP extern char fw_path2[MOD_PARAM_PATHLEN]; #endif @@ -714,19 +681,28 @@ extern char fw_path2[MOD_PARAM_PATHLEN]; /* Flag to indicate if we should download firmware on driver load */ extern uint dhd_download_fw_on_driverload; -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) -/* Flags to indicate if we distingish power off policy when +#if defined(WL_CFG80211) && defined(CUSTOMER_HW_SAMSUNG) +/* CSP#505233: Flags to indicate if we distingish power off policy when * user set the memu "Keep Wi-Fi on during sleep" to "Never" */ extern int sleep_never; int dhd_deepsleep(struct net_device *dev, int flag); -#endif /* WL_CFG80211 && SUPPORT_DEEP_SLEEP */ +#endif /* WL_CFG80211 && CUSTOMER_HW_SAMSUNG */ + +#ifdef BCM4334_CHECK_CHIP_REV +/* Check chip revision */ +extern uint g_chipver; +extern char chipver_tag[4]; +extern char fw_down_path[MOD_PARAM_PATHLEN]; +#endif /* For supporting multiple interfaces */ #define DHD_MAX_IFS 16 #define DHD_DEL_IF -0xe #define DHD_BAD_IF -0xf +#define WL_AUTO_ROAM_TRIGGER -75 + #ifdef PROP_TXSTATUS /* Please be mindful that total pkttag space is 32 octets only */ typedef struct dhd_pkttag { @@ -880,11 +856,9 @@ int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen); void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr); #endif /* ARP_OFFLOAD_SUPPORT */ -#if defined(CUSTOMER_HW4) && defined(RDWR_KORICS_MACADDR) +#ifdef RDWR_KORICS_MACADDR extern int dhd_write_rdwr_korics_macaddr(struct dhd_info *dhd, struct ether_addr *mac); #endif -#if defined(SUPPORT_MULTIPLE_REVISION) -extern int concate_revision(struct dhd_bus *bus, char *path, int path_len); -#endif /* SUPPORT_MULTIPLE_REVISION */ + #endif /* _dhd_h_ */ diff --git a/drivers/net/wireless/bcmdhd/dhd_bta.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.c index 15c605e..52b51cc 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_bta.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.c @@ -1,14 +1,14 @@ /* * BT-AMP support routines * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/dhd_bta.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.h index 0337f15..0b18cdd 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_bta.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bta.h @@ -1,14 +1,14 @@ /* * BT-AMP support routines * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/dhd_bus.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bus.h index fcb4bbd..6774b65 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_bus.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_bus.h @@ -4,14 +4,14 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,12 +19,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_bus.h 347614 2012-07-27 10:24:51Z $ + * $Id: dhd_bus.h 291086 2011-10-21 01:17:24Z $ */ #ifndef _dhd_bus_h_ @@ -97,15 +97,11 @@ extern void *dhd_bus_pub(struct dhd_bus *bus); extern void *dhd_bus_txq(struct dhd_bus *bus); extern uint dhd_bus_hdrlen(struct dhd_bus *bus); - #define DHD_SET_BUS_STATE_DOWN(_bus) do { \ (_bus)->dhd->busstate = DHD_BUS_DOWN; \ } while (0) - /* Register a dummy SDIO client driver in order to be notified of new SDIO device */ extern int dhd_bus_reg_sdio_notify(void* semaphore); extern void dhd_bus_unreg_sdio_notify(void); -extern void dhd_txglom_enable(dhd_pub_t *dhdp, bool enable); - #endif /* _dhd_bus_h_ */ diff --git a/drivers/net/wireless/bcmdhd/dhd_cdc.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cdc.c index ab6dc52..0cb4fb4 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_cdc.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cdc.c @@ -2,13 +2,13 @@ * DHD Protocol Module for CDC and BDC. * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_cdc.c 353370 2012-08-27 09:10:22Z $ + * $Id: dhd_cdc.c 304241 2011-12-21 16:43:50Z $ * * BDC is like CDC, except it includes a header for data packets to convey * packet priority over the bus, and flags (e.g. to indicate checksum status @@ -49,7 +49,7 @@ #define RETRIES 2 /* # of retries to retrieve matching ioctl response */ -#define BUS_HEADER_LEN (24+DHD_SDALIGN) /* Must be at least SDPCM_RESERVE +#define BUS_HEADER_LEN (16+DHD_SDALIGN) /* Must be at least SDPCM_RESERVE * defined in dhd_sdio.c (amount of header tha might be added) * plus any space that might be needed for alignment padding. */ @@ -69,12 +69,11 @@ typedef struct dhd_wlfc_commit_info { } dhd_wlfc_commit_info_t; #endif /* PROP_TXSTATUS */ -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE extern uint sd_f2_blocksize; extern int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ - +#endif typedef struct dhd_prot { uint16 reqid; uint8 pending; @@ -119,20 +118,18 @@ dhdcdc_cmplt(dhd_pub_t *dhd, uint32 id, uint32 len) DHD_TRACE(("%s: Enter\n", __FUNCTION__)); -#if defined(CUSTOMER_HW4) +#ifdef CUSTOMER_HW_SAMSUNG DHD_OS_WAKE_LOCK(dhd); -#endif - +#endif /* CUSTOMER_HW_SAMSUNG */ do { ret = dhd_bus_rxctl(dhd->bus, (uchar*)&prot->msg, cdc_len); if (ret < 0) break; } while (CDC_IOC_ID(ltoh32(prot->msg.flags)) != id); -#if defined(CUSTOMER_HW4) +#ifdef CUSTOMER_HW_SAMSUNG DHD_OS_WAKE_UNLOCK(dhd); -#endif - +#endif /* CUSTOMER_HW_SAMSUNG */ return ret; } @@ -166,16 +163,6 @@ dhdcdc_query_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uin memset(msg, 0, sizeof(cdc_ioctl_t)); -#ifdef BCMSPI - /* 11bit gSPI bus allows 2048bytes of max-data. We restrict 'len' - * value which is 8Kbytes for various 'get' commands to 2000. 48 bytes are - * left for sw headers and misc. - */ - if (len > 2000) { - DHD_ERROR(("dhdcdc_query_ioctl: len is truncated to 2000 bytes\n")); - len = 2000; - } -#endif /* BCMSPI */ msg->cmd = htol32(cmd); msg->len = htol32(len); msg->flags = (++prot->reqid << CDCF_IOC_ID_SHIFT); @@ -260,7 +247,6 @@ dhdcdc_set_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uint8 __FUNCTION__)); return -EIO; } - #ifdef CONFIG_CONTROL_PM if ((g_pm_control == TRUE) && (cmd == WLC_SET_PM)) { @@ -512,7 +498,7 @@ dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) if (mac_table[i].occupied) { ea = mac_table[i].ea; bcm_bprintf(strbuf, "MAC_table[%d].ea = " - "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, + "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d\n", i, ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], mac_table[i].interface_id); @@ -902,6 +888,7 @@ _dhd_wlfc_find_table_entry(athost_wl_status_info_t* ctx, void* p) uint8 ifid = DHD_PKTTAG_IF(PKTTAG(p)); uint8* dstn = DHD_PKTTAG_DSTN(PKTTAG(p)); + /* no lookup necessary, only if this packet belongs to STA interface */ if (((ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_STA) || ETHER_ISMULTI(dstn) || (ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_P2P_CLIENT)) && @@ -1004,7 +991,9 @@ _dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint pq->len, if_id, __FUNCTION__)); */ WLFC_DBGMESG(("F")); +#ifndef BCMDBUS dhd_txflowcontrol(ctx->dhdp, if_id, OFF); +#endif ctx->toggle_host_if = 0; } if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { @@ -1015,7 +1004,10 @@ _dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint pq->len, if_id, __FUNCTION__)); */ WLFC_DBGMESG(("N")); + /* XXX: debug in progress */ +#ifndef BCMDBUS dhd_txflowcontrol(ctx->dhdp, if_id, ON); +#endif ctx->host_ifidx = if_id; ctx->toggle_host_if = 1; } @@ -1162,6 +1154,7 @@ _dhd_wlfc_pretx_pktprocess(athost_wl_status_info_t* ctx, WL_TXSTATUS_SET_FLAGS(htod, WLFC_PKTFLAG_PKTFROMHOST); WL_TXSTATUS_SET_FIFO(htod, DHD_PKTTAG_FIFO(PKTTAG(p))); + if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { /* Indicate that this packet is being sent in response to an @@ -1269,10 +1262,10 @@ _dhd_wlfc_deque_delayedq(athost_wl_status_info_t* ctx, if (!_dhd_wlfc_is_destination_closed(ctx, entry, prec)) { p = pktq_mdeq(&entry->psq, /* higher precedence will be picked up first, - * i.e. suppressed packets before delayed ones - */ + i.e. suppressed packets before delayed ones + */ NBITVAL((prec << 1) + 1), &pout); - *needs_hdr = 0; + *needs_hdr = 0; if (p == NULL) { if (entry->suppressed == TRUE) { @@ -1414,6 +1407,7 @@ _dhd_wlfc_mac_entry_update(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* if (ea != NULL) memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); } + else if (action == eWLFC_MAC_ENTRY_ACTION_DEL) { entry->occupied = 0; entry->state = WLFC_STATE_CLOSE; @@ -1567,7 +1561,7 @@ dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx) { int ac; int credit; - int rc; + int rc; dhd_wlfc_commit_info_t commit_info; athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; int credit_count = 0; @@ -1665,7 +1659,6 @@ dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx) } } } - ctx->FIFO_credit[ac] -= credit; @@ -1783,9 +1776,8 @@ dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success) #ifdef PROP_TXSTATUS_DEBUG wlfc->stats.signal_only_pkts_freed++; #endif - if (success) - /* is this a signal-only packet? */ - PKTFREE(wlfc->osh, txp, TRUE); + /* is this a signal-only packet? */ + PKTFREE(wlfc->osh, txp, TRUE); return; } if (!success) { @@ -1827,7 +1819,7 @@ dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success) static int dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) { - uint8 status_flag; + uint8 status_flag; uint32 status; int ret; int remove_from_hanger = 1; @@ -1873,7 +1865,7 @@ dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { entry->suppressed = TRUE; entry->suppress_count = pktq_mlen(&entry->psq, - NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); + NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); entry->suppr_transit_count = entry->transit_count; } entry->generation = WLFC_PKTID_GEN(status); @@ -1942,7 +1934,6 @@ dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) } if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { - ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); if (ret != BCME_OK) { /* delay q is full, drop this packet */ @@ -1952,15 +1943,14 @@ dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) /* indicate failure and free the packet */ dhd_txcomplete(dhd, pktbuf, FALSE); entry->transit_count--; - /* This packet is transmitted Successfully by - * dongle even after first suppress. - */ - if (entry->suppressed) { + /* This packet is transmitted Successfully by dongle even after first suppress. */ + if (entry->suppressed){ entry->suppr_transit_count--; } PKTFREE(wlfc->osh, pktbuf, TRUE); } else { /* Mark suppressed to avoid a double free during wlfc cleanup */ + dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); entry->suppress_count++; @@ -1971,7 +1961,7 @@ dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) entry->transit_count--; /* This packet is transmitted Successfully by dongle even after first suppress. */ - if (entry->suppressed) { + if (entry->suppressed){ entry->suppr_transit_count--; } /* free the packet */ @@ -2023,19 +2013,6 @@ dhd_wlfc_fifocreditback_indicate(dhd_pub_t *dhd, uint8* credits) } static int -dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) -{ - uint32 timestamp; - - (void)dhd; - - bcopy(&value[2], ×tamp, sizeof(uint32)); - DHD_INFO(("RXPKT: SEQ: %d, timestamp %d\n", value[1], timestamp)); - return BCME_OK; -} - - -static int dhd_wlfc_rssi_indicate(dhd_pub_t *dhd, uint8* rssi) { (void)dhd; @@ -2299,9 +2276,6 @@ dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, uchar (type == WLFC_CTL_TYPE_MACDESC_DEL)) dhd_wlfc_mac_table_update(dhd, value, type); - else if (type == WLFC_CTL_TYPE_TRANS_ID) - dhd_wlfc_dbg_senum_check(dhd, value); - else if ((type == WLFC_CTL_TYPE_INTERFACE_OPEN) || (type == WLFC_CTL_TYPE_INTERFACE_CLOSE)) { dhd_wlfc_interface_update(dhd, value, type); @@ -2400,9 +2374,9 @@ dhd_wlfc_enable(dhd_pub_t *dhd) wlfc->allow_credit_borrow = TRUE; wlfc->borrow_defer_timestamp = 0; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE dhdsdio_func_blocksize(dhd, 2, VSDB_F2_BLKSIZE); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif return BCME_OK; } @@ -2416,15 +2390,10 @@ dhd_wlfc_cleanup(dhd_pub_t *dhd) dhd->wlfc_state; wlfc_mac_descriptor_t* table; wlfc_hanger_t* h; - int prec; - void *pkt = NULL; - struct pktq *txq = NULL; + if (dhd->wlfc_state == NULL) return; - /* flush bus->txq */ - txq = dhd_bus_txq(dhd->bus); - /* any in the hanger? */ - h = (wlfc_hanger_t*)wlfc->hanger; + total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); /* search all entries, include nodes as well as interfaces */ table = (wlfc_mac_descriptor_t*)&wlfc->destination_entries; @@ -2443,26 +2412,8 @@ dhd_wlfc_cleanup(dhd_pub_t *dhd) /* release packets held in SENDQ */ if (wlfc->SENDQ.len) pktq_flush(wlfc->osh, &wlfc->SENDQ, TRUE, NULL, 0); - for (prec = 0; prec < txq->num_prec; prec++) { - pkt = pktq_pdeq(txq, prec); - while (pkt) { - for (i = 0; i < h->max_items; i++) { - if (pkt == h->items[i].pkt) { - if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { - PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } else if (h->items[i].state == - WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { - /* These are already freed from the psq */ - h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; - } - break; - } - } - pkt = pktq_pdeq(txq, prec); - } - } - /* flush remained pkt in hanger queue, not in bus->txq */ + /* any in the hanger? */ + h = (wlfc_hanger_t*)wlfc->hanger; for (i = 0; i < h->max_items; i++) { if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); @@ -2504,9 +2455,9 @@ dhd_wlfc_deinit(dhd_pub_t *dhd) /* free top structure */ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); dhd->wlfc_state = NULL; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE dhdsdio_func_blocksize(dhd, 2, sd_f2_blocksize); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif return; } #endif /* PROP_TXSTATUS */ @@ -2625,7 +2576,7 @@ dhd_prot_hdrpull(dhd_pub_t *dhd, int *ifidx, void *pktbuf, uchar *reorder_buf_in } #endif /* PROP_TXSTATUS */ #if !defined(NDIS630) - PKTPULL(dhd->osh, pktbuf, (h->dataOffset << 2)); + PKTPULL(dhd->osh, pktbuf, (h->dataOffset << 2)); #endif return 0; } @@ -2758,7 +2709,7 @@ dhd_get_hostreorder_pkts(void *osh, struct reorder_info *ptr, void **pkt, if (plast == NULL) *pkt = p; else - PKTSETNEXT(osh, plast, p); + PKTSETNEXT(dhd->osh, plast, p); plast = p; pkt_cnt++; @@ -2786,6 +2737,8 @@ dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reord *pkt_count = 0; return 0; } + cur_pkt = *pkt; + *pkt = NULL; flow_id = reorder_info_buf[WLHOST_REORDERDATA_FLOWID_OFFSET]; flags = reorder_info_buf[WLHOST_REORDERDATA_FLAGS_OFFSET]; @@ -2802,9 +2755,6 @@ dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reord return 0; } - cur_pkt = *pkt; - *pkt = NULL; - ptr = dhd->reorder_bufs[flow_id]; if (flags & WLHOST_REORDERDATA_DEL_FLOW) { uint32 buf_size = sizeof(struct reorder_info); @@ -2816,7 +2766,6 @@ dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reord DHD_ERROR(("%s: received flags to cleanup, but no flow (%d) yet\n", __FUNCTION__, flow_id)); *pkt_count = 1; - *pkt = cur_pkt; return 0; } diff --git a/drivers/net/wireless/bcmdhd/dhd_cfg80211.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.c index 8a8925a..61369cb 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.c @@ -2,13 +2,13 @@ * Linux cfg80211 driver - Dongle Host Driver (DHD) related * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -46,12 +46,6 @@ extern void dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, static int dhd_dongle_up = FALSE; -#include <dngl_stats.h> -#include <dhd.h> -#include <dhdioctl.h> -#include <wlioctl.h> -#include <dhd_cfg80211.h> - static s32 wl_dongle_up(struct net_device *ndev, u32 up); /** @@ -76,38 +70,6 @@ s32 dhd_cfg80211_down(struct wl_priv *wl) return 0; } -s32 dhd_cfg80211_set_p2p_info(struct wl_priv *wl, int val) -{ - dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); - dhd->op_mode |= val; - WL_ERR(("Set : op_mode=%d\n", dhd->op_mode)); -#ifdef ARP_OFFLOAD_SUPPORT - if ((dhd->op_mode & CONCURRENT_MULTI_CHAN) != - CONCURRENT_MULTI_CHAN) { - /* IF P2P is enabled, disable arpoe */ - dhd_arp_offload_set(dhd, 0); - dhd_arp_offload_enable(dhd, false); - } -#endif /* ARP_OFFLOAD_SUPPORT */ - - return 0; -} - -s32 dhd_cfg80211_clean_p2p_info(struct wl_priv *wl) -{ - dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); - dhd->op_mode &= ~CONCURENT_MASK; - WL_ERR(("Clean : op_mode=%d\n", dhd->op_mode)); - -#ifdef ARP_OFFLOAD_SUPPORT - /* IF P2P is disabled, enable arpoe back for STA mode. */ - dhd_arp_offload_set(dhd, dhd_arp_mode); - dhd_arp_offload_enable(dhd, true); -#endif /* ARP_OFFLOAD_SUPPORT */ - - return 0; -} - static s32 wl_dongle_up(struct net_device *ndev, u32 up) { s32 err = 0; @@ -422,7 +384,7 @@ static void wl_cfg80211_bt_handler(struct work_struct *work) __FUNCTION__)); btcx_inf->bt_state = BT_DHCP_OPPR_WIN; mod_timer(&btcx_inf->timer, - jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); + jiffies + BT_DHCP_OPPR_WIN_TIME*HZ/1000); btcx_inf->timer_on = 1; break; @@ -442,7 +404,7 @@ static void wl_cfg80211_bt_handler(struct work_struct *work) wl_cfg80211_bt_setflag(btcx_inf->dev, TRUE); btcx_inf->bt_state = BT_DHCP_FLAG_FORCE_TIMEOUT; mod_timer(&btcx_inf->timer, - jiffies + msecs_to_jiffies(BT_DHCP_FLAG_FORCE_TIME)); + jiffies + BT_DHCP_FLAG_FORCE_TIME*HZ/1000); btcx_inf->timer_on = 1; break; @@ -518,7 +480,7 @@ void wl_cfg80211_btcoex_deinit(struct wl_priv *wl) kfree(wl->btcoex_info); wl->btcoex_info = NULL; } -#endif +#endif /* COEX_DHCP */ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) { @@ -542,20 +504,27 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) #ifdef PKT_FILTER_SUPPORT dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); + int i; #endif /* Figure out powermode 1 or o command */ strncpy((char *)&powermode_val, command + strlen("BTCOEXMODE") +1, 1); + WL_ERR(("%s: DHCP session Enter\n", __FUNCTION__)); if (strnicmp((char *)&powermode_val, "1", strlen("1")) == 0) { - WL_TRACE_HW4(("%s: DHCP session starts\n", __FUNCTION__)); + + WL_ERR(("%s: DHCP session starts\n", __FUNCTION__)); #ifdef PKT_FILTER_SUPPORT dhd->dhcp_in_progress = 1; - if (dhd->early_suspended) { - WL_TRACE_HW4(("DHCP in progressing , disable packet filter!!!\n")); - dhd_enable_packet_filter(0, dhd); + /* Disable packet filtering */ + if (dhd_pkt_filter_enable && dhd->early_suspended) { + WL_ERR(("DHCP in progressing , disable packet filter!!!\n")); + for (i = 0; i < dhd->pktfilter_count; i++) { + dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], + 0, dhd_master_mode); + } } #endif @@ -602,15 +571,17 @@ int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) } else if (strnicmp((char *)&powermode_val, "2", strlen("2")) == 0) { - #ifdef PKT_FILTER_SUPPORT - dhd->dhcp_in_progress = 0; - WL_TRACE_HW4(("%s: DHCP is complete \n", __FUNCTION__)); + dhd->dhcp_in_progress = 0; + WL_ERR(("%s: DHCP is complete \n", __FUNCTION__)); /* Enable packet filtering */ - if (dhd->early_suspended) { - WL_TRACE_HW4(("DHCP is complete , enable packet filter!!!\n")); - dhd_enable_packet_filter(1, dhd); + if (dhd_pkt_filter_enable && dhd->early_suspended) { + WL_ERR(("DHCP is complete , enable packet filter!!!\n")); + for (i = 0; i < dhd->pktfilter_count; i++) { + dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], + 1, dhd_master_mode); + } } #endif diff --git a/drivers/net/wireless/bcmdhd/dhd_cfg80211.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.h index 922d6ed..f4374f1 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_cfg80211.h @@ -1,14 +1,14 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -34,8 +34,6 @@ s32 dhd_cfg80211_init(struct wl_priv *wl); s32 dhd_cfg80211_deinit(struct wl_priv *wl); s32 dhd_cfg80211_down(struct wl_priv *wl); -s32 dhd_cfg80211_set_p2p_info(struct wl_priv *wl, int val); -s32 dhd_cfg80211_clean_p2p_info(struct wl_priv *wl); s32 dhd_config_dongle(struct wl_priv *wl, bool need_lock); int wl_cfg80211_btcoex_init(struct wl_priv *wl); diff --git a/drivers/net/wireless/bcmdhd/dhd_common.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_common.c index 919407c..9fda3c1 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_common.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_common.c @@ -2,13 +2,13 @@ * Broadcom Dongle Host Driver (DHD), common DHD core. * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_common.c 353739 2012-08-28 18:25:49Z $ + * $Id: dhd_common.c 304622 2011-12-22 19:51:18Z $ */ #include <typedefs.h> #include <osl.h> @@ -93,9 +93,7 @@ extern int dhd_iscan_in_progress(void *h); void dhd_iscan_lock(void); void dhd_iscan_unlock(void); extern int dhd_change_mtu(dhd_pub_t *dhd, int new_mtu, int ifidx); -#if !defined(AP) && defined(WLP2P) -extern int dhd_get_concurrent_capabilites(dhd_pub_t *dhd); -#endif +extern bool dhd_concurrent_fw(dhd_pub_t *dhd); bool ap_cfg_running = FALSE; bool ap_fw_loaded = FALSE; @@ -145,7 +143,7 @@ enum { }; const bcm_iovar_t dhd_iovars[] = { - {"version", IOV_VERSION, 0, IOVT_BUFFER, sizeof(dhd_version) }, + {"version", IOV_VERSION, 0, IOVT_BUFFER, sizeof(dhd_version) }, #ifdef DHD_DEBUG {"msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, #endif /* DHD_DEBUG */ @@ -187,6 +185,15 @@ const bcm_iovar_t dhd_iovars[] = { void dhd_common_init(osl_t *osh) { + + /* Init global variables at run-time, not as part of the declaration. + * This is required to support init/de-init of the driver. Initialization + * of globals as part of the declaration results in non-deterministic + * behavior since the value of the globals may be different on the + * first time that the driver is initialized vs subsequent initializations. + */ + /* Allocate private bus interface state */ + #ifdef CONFIG_BCMDHD_FW_PATH bcm_strncpy_s(fw_path, sizeof(fw_path), CONFIG_BCMDHD_FW_PATH, MOD_PARAM_PATHLEN-1); #else /* CONFIG_BCMDHD_FW_PATH */ @@ -200,6 +207,7 @@ dhd_common_init(osl_t *osh) #ifdef SOFTAP fw_path2[0] = '\0'; #endif + } static int @@ -277,29 +285,26 @@ dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int le dhd_os_proto_block(dhd_pub); ret = dhd_prot_ioctl(dhd_pub, ifindex, ioc, buf, len); -#if defined(CUSTOMER_HW4) - if ((ret || ret == -ETIMEDOUT) && (dhd_pub->up)) -#else - if ((ret) && (dhd_pub->up)) -#endif /* CUSTOMER_HW4 */ + if (!ret || ret == -ETIMEDOUT) { /* Send hang event only if dhd_open() was success */ + if (dhd_pub->up) dhd_os_check_hang(dhd_pub, ifindex, ret); + } dhd_os_proto_unblock(dhd_pub); - -#if defined(CUSTOMER_HW4) +#ifdef CUSTOMER_HW_SAMSUNG if (ret < 0) { if (ioc->cmd == WLC_GET_VAR) DHD_ERROR(("%s: WLC_GET_VAR: %s, ret = %d\n", - __FUNCTION__, (char *)ioc->buf, ret)); + __FUNCTION__, (char *)ioc->buf, ret)); else if (ioc->cmd == WLC_SET_VAR) DHD_ERROR(("%s: WLC_SET_VAR: %s, ret = %d\n", - __FUNCTION__, (char *)ioc->buf, ret)); + __FUNCTION__, (char *)ioc->buf, ret)); else DHD_ERROR(("%s: WLC_IOCTL: cmd: %d, ret = %d\n", - __FUNCTION__, ioc->cmd, ret)); + __FUNCTION__, ioc->cmd, ret)); } -#endif +#endif /* CUSTOMER_HW_SAMSUNG */ return ret; } @@ -332,12 +337,6 @@ dhd_doiovar(dhd_pub_t *dhd_pub, const bcm_iovar_t *vi, uint32 actionid, const ch break; case IOV_SVAL(IOV_MSGLEVEL): -#ifdef WL_CFG80211 - /* Enable DHD and WL logs in oneshot */ - if (int_val & DHD_WL_VAL) - wl_cfg80211_enable_trace(int_val & (~DHD_WL_VAL)); - else -#endif dhd_msg_level = int_val; break; case IOV_GVAL(IOV_BCMERRORSTR): @@ -577,7 +576,8 @@ dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec) if (pktq_pfull(q, prec)) eprec = prec; else if (pktq_full(q)) { - pktq_peek_tail(q, &eprec); + p = pktq_peek_tail(q, &eprec); +// ASSERT(p); if (eprec > prec || eprec < 0) return FALSE; } @@ -597,7 +597,8 @@ dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec) } /* Enqueue */ - pktq_penq(q, prec, pkt); + p = pktq_penq(q, prec, pkt); +// ASSERT(p); return TRUE; } @@ -751,12 +752,11 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) flags = ntoh16(event->flags); status = ntoh32(event->status); reason = ntoh32(event->reason); - BCM_REFERENCE(reason); auth_type = ntoh32(event->auth_type); datalen = ntoh32(event->datalen); /* debug dump of event messages */ - snprintf(eabuf, sizeof(eabuf), "%02x:%02x:%02x:%02x:%02x:%02x", + sprintf(eabuf, "%02x:%02x:%02x:%02x:%02x:%02x", (uchar)event->addr.octet[0]&0xff, (uchar)event->addr.octet[1]&0xff, (uchar)event->addr.octet[2]&0xff, @@ -816,7 +816,7 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) else if (auth_type == DOT11_SHARED_KEY) auth_str = "Shared Key"; else { - snprintf(err_msg, sizeof(err_msg), "AUTH unknown: %d", (int)auth_type); + sprintf(err_msg, "AUTH unknown: %d", (int)auth_type); auth_str = err_msg; } if (event_type == WLC_E_AUTH_IND) { @@ -831,7 +831,6 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) DHD_EVENT(("MACEVENT: %s, MAC %s, %s, FAILURE, reason %d\n", event_name, eabuf, auth_str, (int)reason)); } - BCM_REFERENCE(auth_str); break; @@ -862,14 +861,11 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) case WLC_E_LINK: DHD_EVENT(("MACEVENT: %s %s\n", event_name, link?"UP":"DOWN")); - BCM_REFERENCE(link); break; case WLC_E_MIC_ERROR: DHD_EVENT(("MACEVENT: %s, MAC %s, Group %d, Flush %d\n", event_name, eabuf, group, flush_txq)); - BCM_REFERENCE(group); - BCM_REFERENCE(flush_txq); break; case WLC_E_ICV_ERROR: @@ -950,7 +946,7 @@ wl_show_host_event(wl_event_msg_t *event, void *event_data) p = (char *)&buf[MSGTRACE_HDRLEN]; while ((s = strstr(p, "\n")) != NULL) { *s = '\0'; - printf("%s\n", p); + printf("FW: %s\n", p); p = s+1; } printf("%s\n", p); @@ -1042,6 +1038,7 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, ((ifevent->is_AP == 0) ? "STA":"AP "), ea[0], ea[1], ea[2], ea[3], ea[4], ea[5])); (void)ea; + if (ifevent->action == WLC_E_IF_CHANGE) dhd_wlfc_interface_event(dhd_pub->info, eWLFC_MAC_ENTRY_ACTION_UPDATE, @@ -1064,8 +1061,8 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, DHD_ERROR(("%s: ifidx %d for %s action %d\n", __FUNCTION__, ifevent->ifidx, event->ifname, ifevent->action)); - if (ifevent->action == WLC_E_IF_ADD || - ifevent->action == WLC_E_IF_CHANGE) + if (ifevent->action == WLC_E_IF_ADD + || ifevent->action == WLC_E_IF_CHANGE) wl_cfg80211_notify_ifchange(); return (BCME_OK); } @@ -1085,7 +1082,7 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, } } else if (ifevent->action == WLC_E_IF_DEL) - dhd_del_if(dhd_pub->info, ifevent->ifidx); + dhd_del_if(dhd_pub->info, ifevent->ifidx); } else { #ifndef PROP_TXSTATUS DHD_ERROR(("%s: Invalid ifidx %d for %s\n", @@ -1115,7 +1112,7 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, memcpy((void *)(&pvt_data->event.event_type), &temp, sizeof(pvt_data->event.event_type)); } -#endif +#endif /* These are what external supplicant/authenticator wants */ /* fall through */ case WLC_E_LINK: @@ -1132,8 +1129,6 @@ wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, dhd_event(dhd_pub->info, (char *)pvt_data, evlen, *ifidx); DHD_TRACE(("%s: MAC event %d, flags %x, status %x\n", __FUNCTION__, type, flags, status)); - BCM_REFERENCE(flags); - BCM_REFERENCE(status); /* put it back to WLC_E_NDIS_LINK */ if (type == WLC_E_NDIS_LINK) { @@ -1195,11 +1190,9 @@ dhd_print_buf(void *pbuf, int len, int bytes_per_line) printf("\n"); #endif /* DHD_DEBUG */ } -#ifndef strtoul + #define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base)) -#endif -#ifdef PKT_FILTER_SUPPORT /* Convert user's input in hex pattern to byte-size mask */ static int wl_pattern_atoh(char *src, char *dst) @@ -1230,7 +1223,7 @@ dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_ { char *argv[8]; int i = 0; - const char *str; + const char *str; int buf_len; int str_len; char *arg_save = 0, *arg_org = 0; @@ -1302,12 +1295,12 @@ fail: void dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg) { - const char *str; + const char *str; wl_pkt_filter_t pkt_filter; wl_pkt_filter_t *pkt_filterp; int buf_len; int str_len; - int rc; + int rc; uint32 mask_size; uint32 pattern_size; char *argv[8], * buf = 0; @@ -1435,7 +1428,6 @@ fail: if (buf) MFREE(dhd->osh, buf, BUF_SIZE); } -#endif /* PKT_FILTER_SUPPORT */ /* ========================== */ /* ==== ARP OFFLOAD SUPPORT = */ @@ -1525,7 +1517,7 @@ int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen) { int retcode, i; - int iov_len; + int iov_len = 0; uint32 *ptr32 = buf; bool clr_bottom = FALSE; @@ -1533,7 +1525,6 @@ dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen) return -1; iov_len = bcm_mkiovar("arp_hostip", 0, 0, buf, buflen); - BCM_REFERENCE(iov_len); retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, buflen, FALSE, 0); if (retcode) { @@ -1778,7 +1769,6 @@ bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf, int *retval) if (ret == BCME_NOTASSOCIATED) { DHD_TRACE(("%s: not associated! res:%d\n", __FUNCTION__, ret)); } - if (retval) *retval = ret; @@ -1856,29 +1846,13 @@ exit: /* Check if HostAPD or WFD mode setup */ bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd) { -#if !defined(AP) && defined(WLP2P) - if ((dhd->op_mode & CONCURRENT_FW_MASK) == CONCURRENT_FW_MASK) - return FALSE; -#endif #ifdef WL_CFG80211 -#ifndef WL_ENABLE_P2P_IF - /* To be back compatble with ICS MR1 release where p2p interface - * disable but wlan0 used for p2p - */ + if ((dhd->op_mode & CONCURRENT_MASK) == CONCURRENT_MASK) + return FALSE; if (((dhd->op_mode & HOSTAPD_MASK) == HOSTAPD_MASK) || - ((dhd->op_mode & WFD_MASK) == WFD_MASK)) { - return TRUE; - } - else -#else - /* concurent mode with p2p interface for wfd and wlan0 for sta */ - if (((dhd->op_mode & P2P_GO_ENABLED) == P2P_GO_ENABLED) || - ((dhd->op_mode & P2P_GC_ENABLED) == P2P_GC_ENABLED)) { - DHD_ERROR(("%s P2P enabled for mode=%d\n", __FUNCTION__, dhd->op_mode)); + ((dhd->op_mode & WFD_MASK) == WFD_MASK)) return TRUE; - } else -#endif /* WL_ENABLE_P2P_IF */ #endif /* WL_CFG80211 */ return FALSE; } @@ -1968,8 +1942,7 @@ dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort scan_fr, DHD_TRACE(("%s nssid=%d nchan=%d\n", __FUNCTION__, nssid, scan_fr)); if ((!dhd) || (!ssids_local)) { - DHD_ERROR(("%s error exit(%s %s)\n", __FUNCTION__, - (!dhd)?"dhd is null":"", (!ssids_local)?"ssid is null":"")); + DHD_ERROR(("%s error exit(%s %s)\n", __FUNCTION__, (!dhd)?"dhd is null":"", (!ssids_local)?"ssids is null":"")); err = -1; return err; } @@ -2042,7 +2015,7 @@ dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort scan_fr, pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); pfn_element.wsec = htod32(0); pfn_element.infra = htod32(1); - pfn_element.flags = htod32(ENABLE << WL_PFN_HIDDEN_BIT); + pfn_element.bss_type = htod32(ENABLE << WL_PFN_HIDDEN_BIT); memcpy((char *)pfn_element.ssid.SSID, ssids_local[i].SSID, ssids_local[i].SSID_len); pfn_element.ssid.SSID_len = ssids_local[i].SSID_len; @@ -2079,18 +2052,18 @@ dhd_pno_get_status(dhd_pub_t *dhd) return (dhd->pno_enable); } -#endif /* OEM_ANDROID && PNO_SUPPORT */ +#endif /* PNO_SUPPORT */ #if defined(KEEP_ALIVE) int dhd_keep_alive_onoff(dhd_pub_t *dhd) { - char buf[256]; - const char *str; + char buf[256]; + const char *str; wl_mkeep_alive_pkt_t mkeep_alive_pkt; wl_mkeep_alive_pkt_t *mkeep_alive_pktp; int buf_len; int str_len; - int res = -1; + int res = -1; if (dhd_check_ap_wfd_mode_set(dhd) == TRUE) return (res); @@ -2110,7 +2083,6 @@ int dhd_keep_alive_onoff(dhd_pub_t *dhd) mkeep_alive_pkt.keep_alive_id = 0; mkeep_alive_pkt.len_bytes = 0; buf_len += WL_MKEEP_ALIVE_FIXED_LEN; - bzero(mkeep_alive_pkt.data, sizeof(mkeep_alive_pkt.data)); /* Keep-alive attributes are set in local variable (mkeep_alive_pkt), and * then memcpy'ed into buffer (mkeep_alive_pktp) since there is no * guarantee that the buffer is properly aligned. @@ -2131,7 +2103,7 @@ int wl_iw_parse_data_tlv(char** list_str, void *dst, int dst_size, const char token, int input_size, int *bytes_left) { - char* str; + char* str = *list_str; uint16 short_temp; uint32 int_temp; @@ -2139,7 +2111,6 @@ wl_iw_parse_data_tlv(char** list_str, void *dst, int dst_size, const char token, DHD_ERROR(("%s error paramters\n", __FUNCTION__)); return -1; } - str = *list_str; /* Clean all dest bytes */ memset(dst, 0, dst_size); @@ -2181,14 +2152,13 @@ int wl_iw_parse_channel_list_tlv(char** list_str, uint16* channel_list, int channel_num, int *bytes_left) { - char* str; + char* str = *list_str; int idx = 0; if ((list_str == NULL) || (*list_str == NULL) ||(bytes_left == NULL) || (*bytes_left < 0)) { DHD_ERROR(("%s error paramters\n", __FUNCTION__)); return -1; } - str = *list_str; while (*bytes_left > 0) { @@ -2327,8 +2297,7 @@ wl_iw_parse_ssid_list(char** list_str, wlc_ssid_t* ssid, int idx, int max) ssid[idx].SSID_len = 0; if (idx < max) { - bzero(ssid[idx].SSID, sizeof(ssid[idx].SSID)); - strncpy((char*)ssid[idx].SSID, str, sizeof(ssid[idx].SSID) - 1); + bcm_strcpy_s((char*)ssid[idx].SSID, sizeof(ssid[idx].SSID), str); ssid[idx].SSID_len = strlen(str); } idx++; diff --git a/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_gpio.c index 9421e98..433a12d 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_custom_gpio.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_gpio.c @@ -1,13 +1,13 @@ /* * Customer code to add GPIO control during WLAN start/stop * Copyright (C) 1999-2012, Broadcom Corporation -* +* * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: -* +* * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -15,12 +15,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. -* +* * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * -* $Id: dhd_custom_gpio.c 353167 2012-08-24 22:11:30Z $ +* $Id: dhd_custom_gpio.c 291086 2011-10-21 01:17:24Z $ */ #include <typedefs.h> @@ -41,7 +41,7 @@ extern void bcm_wlan_power_off(int); extern void bcm_wlan_power_on(int); #endif /* CUSTOMER_HW */ -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) #ifdef CONFIG_WIFI_CONTROL_FUNC int wifi_set_power(int on, unsigned long msec); int wifi_get_irq_number(unsigned long *irq_flags_ptr); @@ -53,9 +53,9 @@ int wifi_get_irq_number(unsigned long *irq_flags_ptr) { return -1; } int wifi_get_mac_addr(unsigned char *buf) { return -1; } void *wifi_get_country_code(char *ccode) { return NULL; } #endif /* CONFIG_WIFI_CONTROL_FUNC */ -#endif /* CUSTOMER_HW2 || CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW2 || CUSTOMER_HW_SAMSUNG */ -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) #if defined(BCMLXSDMMC) extern int sdioh_mmc_irq(int irq); @@ -86,7 +86,7 @@ int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) { int host_oob_irq = 0; -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) host_oob_irq = wifi_get_irq_number(irq_flags_ptr); #else @@ -98,7 +98,7 @@ int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) if (dhd_oob_gpio_num < 0) { WL_ERROR(("%s: ERROR customer specific Host GPIO is NOT defined \n", - __FUNCTION__)); + __FUNCTION__)); return (dhd_oob_gpio_num); } @@ -112,11 +112,11 @@ int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) host_oob_irq = gpio_to_irq(dhd_oob_gpio_num); gpio_direction_input(dhd_oob_gpio_num); #endif /* CUSTOMER_HW */ -#endif /* CUSTOMER_HW2 || CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW2 || CUSTOMER_HW_SAMSUNG */ return (host_oob_irq); } -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ /* Customer function to control hw specific wlan gpios */ void @@ -129,7 +129,7 @@ dhd_customer_gpio_wlan_ctrl(int onoff) #ifdef CUSTOMER_HW bcm_wlan_power_off(2); #endif /* CUSTOMER_HW */ -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) wifi_set_power(0, 0); #endif WL_ERROR(("=========== WLAN placed in RESET ========\n")); @@ -141,7 +141,7 @@ dhd_customer_gpio_wlan_ctrl(int onoff) #ifdef CUSTOMER_HW bcm_wlan_power_on(2); #endif /* CUSTOMER_HW */ -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) wifi_set_power(1, 0); #endif WL_ERROR(("=========== WLAN going back to live ========\n")); @@ -195,54 +195,77 @@ dhd_custom_get_mac_address(unsigned char *buf) } #endif /* GET_CUSTOM_MAC_ENABLE */ -#ifndef CUSTOMER_HW4 /* Customized Locale table : OPTIONAL feature */ const struct cntry_locales_custom translate_custom_table[] = { /* Table should be filled out based on custom platform regulatory requirement */ -#ifdef EXAMPLE_TABLE - {"", "XY", 4}, /* Universal if Country code is unknown or empty */ - {"US", "US", 69}, /* input ISO "US" to : US regrev 69 */ - {"CA", "US", 69}, /* input ISO "CA" to : US regrev 69 */ - {"EU", "EU", 5}, /* European union countries to : EU regrev 05 */ - {"AT", "EU", 5}, - {"BE", "EU", 5}, - {"BG", "EU", 5}, - {"CY", "EU", 5}, - {"CZ", "EU", 5}, - {"DK", "EU", 5}, - {"EE", "EU", 5}, - {"FI", "EU", 5}, - {"FR", "EU", 5}, - {"DE", "EU", 5}, - {"GR", "EU", 5}, - {"HU", "EU", 5}, - {"IE", "EU", 5}, - {"IT", "EU", 5}, - {"LV", "EU", 5}, - {"LI", "EU", 5}, - {"LT", "EU", 5}, - {"LU", "EU", 5}, - {"MT", "EU", 5}, - {"NL", "EU", 5}, - {"PL", "EU", 5}, - {"PT", "EU", 5}, - {"RO", "EU", 5}, - {"SK", "EU", 5}, - {"SI", "EU", 5}, - {"ES", "EU", 5}, - {"SE", "EU", 5}, - {"GB", "EU", 5}, - {"KR", "XY", 3}, - {"AU", "XY", 3}, - {"CN", "XY", 3}, /* input ISO "CN" to : XY regrev 03 */ - {"TW", "XY", 3}, - {"AR", "XY", 3}, - {"MX", "XY", 3}, - {"IL", "IL", 0}, - {"CH", "CH", 0}, - {"TR", "TR", 0}, - {"NO", "NO", 0}, -#endif /* EXMAPLE_TABLE */ +#ifdef BCM4334_CHIP + {"", "XZ", 11}, /* Universal if Country code is unknown or empty */ +#endif + {"AE", "AE", 1}, + {"AR", "AR", 1}, + {"AT", "AT", 1}, + {"AU", "AU", 2}, + {"BE", "BE", 1}, + {"BG", "BG", 1}, + {"BN", "BN", 1}, + {"CA", "CA", 2}, + {"CH", "CH", 1}, + {"CN", "CN", 0}, + {"CY", "CY", 1}, + {"CZ", "CZ", 1}, + {"DE", "DE", 3}, + {"DK", "DK", 1}, + {"EE", "EE", 1}, + {"ES", "ES", 1}, + {"FI", "FI", 1}, + {"FR", "FR", 1}, + {"GB", "GB", 1}, + {"GR", "GR", 1}, + {"HR", "HR", 1}, + {"HU", "HU", 1}, + {"IE", "IE", 1}, + {"IS", "IS", 1}, + {"IT", "IT", 1}, + {"JP", "JP", 5}, + {"KR", "KR", 24}, + {"KW", "KW", 1}, + {"LI", "LI", 1}, + {"LT", "LT", 1}, + {"LU", "LU", 1}, + {"LV", "LV", 1}, + {"MA", "MA", 1}, + {"MT", "MT", 1}, + {"MX", "MX", 1}, + {"NL", "NL", 1}, + {"NO", "NO", 1}, + {"PL", "PL", 1}, + {"PT", "PT", 1}, + {"PY", "PY", 1}, + {"RO", "RO", 1}, + {"SE", "SE", 1}, + {"SI", "SI", 1}, + {"SK", "SK", 1}, + {"TR", "TR", 7}, + {"TW", "TW", 2}, +#ifdef CUSTOMER_HW_SAMSUNG + {"IR", "XZ", 11}, /* Universal if Country code is IRAN, (ISLAMIC REPUBLIC OF) */ + {"SD", "XZ", 11}, /* Universal if Country code is SUDAN */ + {"SY", "XZ", 11}, /* Universal if Country code is SYRIAN ARAB REPUBLIC */ + {"GL", "XZ", 11}, /* Universal if Country code is GREENLAND */ + {"PS", "XZ", 11}, /* Universal if Country code is PALESTINIAN TERRITORY, OCCUPIED */ + {"TL", "XZ", 11}, /* Universal if Country code is TIMOR-LESTE (EAST TIMOR) */ + {"MH", "XZ", 11}, /* Universal if Country code is MARSHALL ISLANDS */ + {"PK", "XZ", 11}, /* Universal if Country code is PAKISTAN*/ +#endif +#ifdef BCM4334_CHIP + {"RU", "RU", 5}, + {"SG", "SG", 4}, + {"US", "US", 46} +#endif +#ifdef BCM4330_CHIP + {"RU", "RU", 1}, + {"US", "US", 5} +#endif }; @@ -252,8 +275,7 @@ const struct cntry_locales_custom translate_custom_table[] = { */ void get_customized_country_code(char *country_iso_code, wl_country_t *cspec) { -#if defined(CUSTOMER_HW2) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) - +#ifndef CUSTOMER_HW_SAMSUNG struct cntry_locales_custom *cloc_ptr; if (!cspec) @@ -290,6 +312,5 @@ void get_customized_country_code(char *country_iso_code, wl_country_t *cspec) cspec->rev = translate_custom_table[0].custom_locale_rev; #endif /* EXMAPLE_TABLE */ return; -#endif /* defined(CUSTOMER_HW2) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)) */ +#endif /* CUSTOMER_HW_SAMSUNG) */ } -#endif /* CUSTOMER_HW4 */ diff --git a/drivers/net/wireless/bcmdhd/dhd_custom_sec.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_sec.c index 39f92ab..74c5da3 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_custom_sec.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_custom_sec.c @@ -1,29 +1,19 @@ -/* - * Customer HW 4 dependant file - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: dhd_custom_sec.c 334946 2012-05-24 20:38:00Z $ - */ -#ifdef CUSTOMER_HW4 +/* Function list + 1. Module Type + a. For CID - Use 'USE_CID_CHECK' Feature + dhd_write_cid_file(), dhd_dump_cis(), dhd_check_module_cid() + b. For MAC - Use 'GET_MAC_FROM_OTP' Feature + dhd_write_mac_file(), dhd_check_module_mac() + 2. COB Type + a. For MAC - Use 'READ_MACADDR' Feature + dhd_read_macaddr() + 3. Etc + a. Power Save Mode - Use 'CONFIG_CONTROL_PM' Feature + sec_control_pm() + b. U1 Module only - Use 'WRITE_MACADDR' Feature + dhd_write_macaddr +*/ + #include <typedefs.h> #include <linuxver.h> #include <osl.h> @@ -39,110 +29,7 @@ struct dhd_info; extern int _dhd_set_mac_address(struct dhd_info *dhd, - int ifidx, struct ether_addr *addr); - -struct cntry_locales_custom { - char iso_abbrev[WLC_CNTRY_BUF_SZ]; /* ISO 3166-1 country abbreviation */ - char custom_locale[WLC_CNTRY_BUF_SZ]; /* Custom firmware locale */ - int32 custom_locale_rev; /* Custom local revisin default -1 */ -}; - -/* Locale table for sec */ -const struct cntry_locales_custom translate_custom_table[] = { -#ifdef BCM4334_CHIP - {"", "XZ", 11}, /* Universal if Country code is unknown or empty */ -#endif - {"AE", "AE", 1}, - {"AR", "AR", 1}, - {"AT", "AT", 1}, - {"AU", "AU", 2}, - {"BE", "BE", 1}, - {"BG", "BG", 1}, - {"BN", "BN", 1}, - {"CA", "CA", 2}, - {"CH", "CH", 1}, - {"CN", "CN", 0}, - {"CY", "CY", 1}, - {"CZ", "CZ", 1}, - {"DE", "DE", 3}, - {"DK", "DK", 1}, - {"EE", "EE", 1}, - {"ES", "ES", 1}, - {"FI", "FI", 1}, - {"FR", "FR", 1}, - {"GB", "GB", 1}, - {"GR", "GR", 1}, - {"HR", "HR", 1}, - {"HU", "HU", 1}, - {"IE", "IE", 1}, - {"IS", "IS", 1}, - {"IT", "IT", 1}, - {"JP", "JP", 5}, - {"KR", "KR", 24}, - {"KW", "KW", 1}, - {"LI", "LI", 1}, - {"LT", "LT", 1}, - {"LU", "LU", 1}, - {"LV", "LV", 1}, - {"MA", "MA", 1}, - {"MT", "MT", 1}, - {"MX", "MX", 1}, - {"NL", "NL", 1}, - {"NO", "NO", 1}, - {"PL", "PL", 1}, - {"PT", "PT", 1}, - {"PY", "PY", 1}, - {"RO", "RO", 1}, - {"SE", "SE", 1}, - {"SI", "SI", 1}, - {"SK", "SK", 1}, - {"TR", "TR", 7}, - {"TW", "TW", 2}, - {"IR", "XZ", 11}, /* Universal if Country code is IRAN, (ISLAMIC REPUBLIC OF) */ - {"SD", "XZ", 11}, /* Universal if Country code is SUDAN */ - {"SY", "XZ", 11}, /* Universal if Country code is SYRIAN ARAB REPUBLIC */ - {"GL", "XZ", 11}, /* Universal if Country code is GREENLAND */ - {"PS", "XZ", 11}, /* Universal if Country code is PALESTINIAN TERRITORY, OCCUPIED */ - {"TL", "XZ", 11}, /* Universal if Country code is TIMOR-LESTE (EAST TIMOR) */ - {"MH", "XZ", 11}, /* Universal if Country code is MARSHALL ISLANDS */ - {"PK", "XZ", 11}, /* Universal if Country code is PAKISTAN */ -#ifdef BCM4334_CHIP - {"RU", "RU", 5}, - {"SG", "SG", 4}, - {"US", "US", 46} -#endif -#ifdef BCM4330_CHIP - {"RU", "RU", 1}, - {"US", "US", 5} -#endif -}; - -/* Customized Locale convertor -* input : ISO 3166-1 country abbreviation -* output: customized cspec -*/ -void get_customized_country_code(char *country_iso_code, wl_country_t *cspec) -{ - int size, i; - - size = ARRAYSIZE(translate_custom_table); - - if (cspec == 0) - return; - - if (size == 0) - return; - - for (i = 0; i < size; i++) { - if (strcmp(country_iso_code, translate_custom_table[i].iso_abbrev) == 0) { - memcpy(cspec->ccode, - translate_custom_table[i].custom_locale, WLC_CNTRY_BUF_SZ); - cspec->rev = translate_custom_table[i].custom_locale_rev; - return; - } - } - return; -} + int ifidx, struct ether_addr *addr); #ifdef SLP_PATH #define CIDINFO "/opt/etc/.cid.info" @@ -157,7 +44,7 @@ void get_customized_country_code(char *country_iso_code, wl_country_t *cspec) #define REVINFO "/data/.rev" #define CIDINFO "/data/.cid.info" #define PSMINFO "/data/.psm.info" -#endif /* SLP_PATH */ +#endif /*SLP_PATH*/ #ifdef READ_MACADDR int dhd_read_macaddr(struct dhd_info *dhd, struct ether_addr *mac) @@ -178,7 +65,7 @@ int dhd_read_macaddr(struct dhd_info *dhd, struct ether_addr *mac) fp = filp_open(filepath_efs, O_RDONLY, 0); if (IS_ERR(fp)) { start_readmac: - /* File Doesn't Exist. Create and write mac addr. */ + /* File Doesn't Exist. Create and write mac addr.*/ fp = filp_open(filepath_efs, O_RDWR | O_CREAT, 0666); if (IS_ERR(fp)) { DHD_ERROR(("[WIFI] %s: File open error\n", filepath_efs)); @@ -187,38 +74,30 @@ start_readmac: oldfs = get_fs(); set_fs(get_ds()); - /* Generating the Random Bytes for 3 last octects of the MAC address */ + /* Generating the Random Bytes for 3 last octects of the MAC address */ get_random_bytes(randommac, 3); sprintf(macbuffer, "%02X:%02X:%02X:%02X:%02X:%02X\n", - 0x00, 0x12, 0x34, randommac[0], randommac[1], randommac[2]); - DHD_ERROR(("[WIFI]The Random Generated MAC ID: %s\n", macbuffer)); + 0x00, 0x12, 0x34, randommac[0], randommac[1], randommac[2]); + DHD_ERROR(("[WIFI]The Random Generated MAC ID: %s\n", macbuffer)); if (fp->f_mode & FMODE_WRITE) { - ret = fp->f_op->write(fp, (const char *)macbuffer, - sizeof(macbuffer), &fp->f_pos); + ret = fp->f_op->write(fp, (const char *)macbuffer, sizeof(macbuffer), &fp->f_pos); if (ret < 0) - DHD_ERROR(("[WIFI]MAC address [%s] Failed to write into File: %s\n", - macbuffer, filepath_efs)); + DHD_ERROR(("[WIFI]MAC address [%s] Failed to write into File: %s\n", macbuffer, filepath_efs)); else - DHD_ERROR(("[WIFI]MAC address [%s] written into File: %s\n", - macbuffer, filepath_efs)); + DHD_ERROR(("[WIFI]MAC address [%s] written into File: %s\n", macbuffer, filepath_efs)); } set_fs(oldfs); - /* Reading the MAC Address from .mac.info file - ( the existed file or just created file) - */ + /* Reading the MAC Address from .mac.info file( the existed file or just created file)*/ ret = kernel_read(fp, 0, buf, 18); } else { - /* Reading the MAC Address from - .mac.info file( the existed file or just created file) - */ + /* Reading the MAC Address from .mac.info file( the existed file or just created file)*/ ret = kernel_read(fp, 0, buf, 18); /* to prevent abnormal string display when mac address is displayed on the screen. */ buf[17] = '\0'; - DHD_ERROR(("Read MAC : [%s] [%d] \r\n", - buf, strncmp(buf, "00:00:00:00:00:00", 17))); - if (strncmp(buf, "00:00:00:00:00:00", 17) < 1) { + DHD_ERROR(("Read MAC : [%s] [%d] \r\n" , buf, strncmp(buf , "00:00:00:00:00:00" , 17))); + if (strncmp(buf , "00:00:00:00:00:00" , 17) < 1) { DHD_ERROR(("goto start_readmac \r\n")); filp_close(fp, NULL); goto start_readmac; @@ -227,9 +106,9 @@ start_readmac: if (ret) sscanf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", - (unsigned int *)&(mac->octet[0]), (unsigned int *)&(mac->octet[1]), - (unsigned int *)&(mac->octet[2]), (unsigned int *)&(mac->octet[3]), - (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); + (unsigned int *)&(mac->octet[0]), (unsigned int *)&(mac->octet[1]), + (unsigned int *)&(mac->octet[2]), (unsigned int *)&(mac->octet[3]), + (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); else DHD_ERROR(("dhd_bus_start: Reading from the '%s' returns 0 bytes\n", filepath_efs)); @@ -237,7 +116,7 @@ start_readmac: filp_close(fp, NULL); /* Writing Newly generated MAC ID to the Dongle */ - if (_dhd_set_mac_address(dhd, 0, mac) == 0) + if (0 == _dhd_set_mac_address(dhd, 0, mac)) DHD_INFO(("dhd_bus_start: MACID is overwritten\n")); else DHD_ERROR(("dhd_bus_start: _dhd_set_mac_address() failed\n")); @@ -250,7 +129,7 @@ start_readmac: static int g_imac_flag; enum { - MACADDR_NONE = 0, + MACADDR_NONE = 0 , MACADDR_MOD, MACADDR_MOD_RANDOM, MACADDR_MOD_NONE, @@ -271,8 +150,8 @@ int dhd_write_rdwr_macaddr(struct ether_addr *mac) return 0; sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X\n", - mac->octet[0], mac->octet[1], mac->octet[2], - mac->octet[3], mac->octet[4], mac->octet[5]); + mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5]); /* /data/.mac.info will be created */ fp_mac = filp_open(filepath_data, O_RDWR | O_CREAT, 0666); @@ -324,7 +203,7 @@ int dhd_write_rdwr_macaddr(struct ether_addr *mac) } int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, - struct ether_addr *mac) + struct ether_addr *mac) { struct file *fp_mac = NULL; struct file *fp_nvm = NULL; @@ -356,10 +235,10 @@ int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, /* read MAC Address */ strcpy(cur_mac, "cur_etheraddr"); ret = dhd_wl_ioctl_cmd(dhdp, WLC_GET_VAR, cur_mac, - sizeof(cur_mac), 0, 0); + sizeof(cur_mac), 0, 0); if (ret < 0) { DHD_ERROR(("Current READ MAC error \r\n")); - memset(cur_mac, 0, ETHER_ADDR_LEN); + memset(cur_mac , 0 , ETHER_ADDR_LEN); return -1; } else { DHD_ERROR(("MAC (OTP) : " @@ -405,10 +284,10 @@ int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); /* current MAC address is same as previous one */ - if (memcmp(cur_mac, mac->octet, ETHER_ADDR_LEN) == 0) { + if(memcmp(cur_mac,mac->octet,ETHER_ADDR_LEN) == 0) { g_imac_flag = MACADDR_NONE; } else { /* change MAC address */ - if (_dhd_set_mac_address(dhd, 0, mac) == 0) { + if (0 == _dhd_set_mac_address(dhd, 0, mac)) { DHD_INFO(("%s: MACID is" " overwritten\n", __FUNCTION__)); g_imac_flag = MACADDR_MOD; @@ -454,10 +333,10 @@ int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); /* current MAC address is same as previous one */ - if (memcmp(cur_mac, mac->octet, ETHER_ADDR_LEN) == 0) { + if(memcmp(cur_mac,mac->octet,ETHER_ADDR_LEN) == 0) { g_imac_flag = MACADDR_NONE; } else { /* change MAC address */ - if (_dhd_set_mac_address(dhd, 0, mac) == 0) { + if (0 == _dhd_set_mac_address(dhd, 0, mac)) { DHD_INFO(("%s: MACID is" " overwritten\n", __FUNCTION__)); g_imac_flag = MACADDR_MOD; @@ -495,7 +374,7 @@ int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); /* Writing Newly generated MAC ID to the Dongle */ - if (_dhd_set_mac_address(dhd, 0, mac) == 0) { + if (0 == _dhd_set_mac_address(dhd, 0, mac)) { DHD_INFO(("%s: MACID is overwritten\n", __FUNCTION__)); g_imac_flag = MACADDR_COB; @@ -522,7 +401,7 @@ int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, (unsigned int *)&(mac->octet[3]), (unsigned int *)&(mac->octet[4]), (unsigned int *)&(mac->octet[5])); - if (_dhd_set_mac_address(dhd, 0, mac) == 0) { + if (0 == _dhd_set_mac_address(dhd, 0, mac)) { DHD_INFO(("%s: MACID is overwritten\n", __FUNCTION__)); g_imac_flag = MACADDR_COB; } else { @@ -550,7 +429,7 @@ int dhd_write_rdwr_korics_macaddr(struct dhd_info *dhd, struct ether_addr *mac) fp = filp_open(filepath_efs, O_RDONLY, 0); if (IS_ERR(fp)) { - /* File Doesn't Exist. Create and write mac addr. */ + /* File Doesn't Exist. Create and write mac addr.*/ fp = filp_open(filepath_efs, O_RDWR | O_CREAT, 0666); if (IS_ERR(fp)) { DHD_ERROR(("[WIFI] %s: File open error\n", @@ -567,15 +446,15 @@ int dhd_write_rdwr_korics_macaddr(struct dhd_info *dhd, struct ether_addr *mac) get_random_bytes(randommac, 3); sprintf(macbuffer, "%02X:%02X:%02X:%02X:%02X:%02X\n", - 0x60, 0xd0, 0xa9, randommac[0], - randommac[1], randommac[2]); + 0x60, 0xd0, 0xa9, randommac[0], + randommac[1], randommac[2]); DHD_ERROR(("[WIFI] The Random Generated MAC ID : %s\n", - macbuffer)); + macbuffer)); if (fp->f_mode & FMODE_WRITE) { ret = fp->f_op->write(fp, (const char *)macbuffer, - sizeof(macbuffer), &fp->f_pos); + sizeof(macbuffer), &fp->f_pos); if (ret < 0) DHD_ERROR(("[WIFI] Mac address [%s]" " Failed to write into File:" @@ -596,9 +475,8 @@ int dhd_write_rdwr_korics_macaddr(struct dhd_info *dhd, struct ether_addr *mac) */ buf[17] = '\0'; /* Remove security log */ - /* DHD_ERROR(("Read MAC : [%s] [%d] \r\n", buf, - * strncmp(buf, "00:00:00:00:00:00", 17))); - */ + /*DHD_ERROR(("Read MAC : [%s] [%d] \r\n", buf, + strncmp(buf, "00:00:00:00:00:00", 17)));*/ if ((buf[0] == '\0') || (strncmp(buf, "00:00:00:00:00:00", 17) == 0)) { is_zeromac = 1; @@ -622,7 +500,7 @@ int dhd_write_rdwr_korics_macaddr(struct dhd_info *dhd, struct ether_addr *mac) if (!is_zeromac) { /* Writing Newly generated MAC ID to the Dongle */ - if (_dhd_set_mac_address(dhd, 0, mac) == 0) + if (0 == _dhd_set_mac_address(dhd, 0, mac)) DHD_INFO(("dhd_bus_start: MACID is overwritten\n")); else DHD_ERROR(("dhd_bus_start: _dhd_set_mac_address() " @@ -642,7 +520,7 @@ static int dhd_write_cid_file(const char *filepath_efs, const char *buf, int buf mm_segment_t oldfs = {0}; int ret = 0; - /* File is always created. */ + /* File is always created.*/ fp = filp_open(filepath_efs, O_RDWR | O_CREAT, 0666); if (IS_ERR(fp)) { DHD_ERROR(("[WIFI] %s: File open error\n", filepath_efs)); @@ -706,7 +584,7 @@ int dhd_check_module_cid(dhd_pub_t *dhd) strcpy(cis_buf, "cisdump"); ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, cis_buf, - sizeof(cis_buf), 0, 0); + sizeof(cis_buf), 0, 0); if (ret < 0) { DHD_TRACE(("%s: CIS reading failed, err=%d\n", __FUNCTION__, ret)); @@ -714,33 +592,29 @@ int dhd_check_module_cid(dhd_pub_t *dhd) } else { #ifdef BCM4334_CHIP unsigned char semco_id[4] = {0x00, 0x00, 0x33, 0x33}; - - /* for SHARP FEM(new) */ - unsigned char semco_id_sh[4] = {0x00, 0x00, 0xFB, 0x50}; + unsigned char semco_id_sh[4] = {0x00, 0x00, 0xFB, 0x50}; //for SHARP FEM(new) DHD_ERROR(("%s: CIS reading success, ret=%d\n", __FUNCTION__, ret)); #ifdef DUMP_CIS dump_cis(cis_buf, 48); #endif if (memcmp(&cis_buf[CIS_CID_OFFSET], semco_id, 4) == 0) { - DHD_ERROR(("CID MATCH FOUND : Semco, " - "0x%02X 0x%02X 0x%02X 0x%02X\n", - cis_buf[CIS_CID_OFFSET], - cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], - cis_buf[CIS_CID_OFFSET+3])); + DHD_ERROR(("CID MATCH FOUND : Semco, 0x%02X 0x%02X \ + 0x%02X 0x%02X\n", cis_buf[CIS_CID_OFFSET], + cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], + cis_buf[CIS_CID_OFFSET+3])); dhd_write_cid_file(cidfilepath, "semco", 5); } else if (memcmp(&cis_buf[CIS_CID_OFFSET], semco_id_sh, 4) == 0) { - DHD_ERROR(("CIS MATCH FOUND : Semco_sh, " - "0x%02X 0x%02X 0x%02X 0x%02X\n", - cis_buf[CIS_CID_OFFSET], - cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], - cis_buf[CIS_CID_OFFSET+3])); + DHD_ERROR(("CIS MATCH FOUND : Semco_sh, 0x%02X 0x%02X \ + 0x%02X 0x%02X\n", cis_buf[CIS_CID_OFFSET], + cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], + cis_buf[CIS_CID_OFFSET+3])); dhd_write_cid_file(cidfilepath, "semcosh", 7); } else { - DHD_ERROR(("CID MATCH FOUND : Murata, " - "0x%02X 0x%02X 0x%02X 0x%02X\n", cis_buf[CIS_CID_OFFSET], - cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], - cis_buf[CIS_CID_OFFSET+3])); + DHD_ERROR(("CID MATCH FOUND : Murata, 0x%02X 0x%02X \ + 0x%02X 0x%02X\n", cis_buf[CIS_CID_OFFSET], + cis_buf[CIS_CID_OFFSET+1], cis_buf[CIS_CID_OFFSET+2], + cis_buf[CIS_CID_OFFSET+3])); dhd_write_cid_file(cidfilepath, "murata", 6); } @@ -754,7 +628,7 @@ int dhd_check_module_cid(dhd_pub_t *dhd) strcpy(cis_buf, "otpdump"); ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, cis_buf, - sizeof(cis_buf), 0, 0); + sizeof(cis_buf), 0, 0); if (ret < 0) { DHD_ERROR(("%s: OTP reading failed, err=%d\n", __FUNCTION__, ret)); @@ -764,7 +638,7 @@ int dhd_check_module_cid(dhd_pub_t *dhd) /* otp 33th character is identifier for 4334B3 */ cis_buf[34] = '\0'; flag_b3 = bcm_atoi(&cis_buf[33]); - if (flag_b3 & 0x1) { + if(flag_b3 & 0x1){ DHD_ERROR(("REV MATCH FOUND : 4334B3, %c\n", cis_buf[33])); dhd_write_cid_file(revfilepath, "4334B3", 6); } @@ -808,7 +682,7 @@ static int dhd_write_mac_file(const char *filepath, const char *buf, int buf_len int ret = 0; fp = filp_open(filepath, O_RDWR | O_CREAT, 0666); - /* File is always created. */ + /*File is always created.*/ if (IS_ERR(fp)) { DHD_ERROR(("[WIFI] File open error\n")); return -1; @@ -878,7 +752,7 @@ int dhd_check_module_mac(dhd_pub_t *dhd) DHD_ERROR(("[WIFI]Check Mac address in .mac.info \n")); kernel_read(fp_mac, fp_mac->f_pos, mac_buf, sizeof(mac_buf)); - if (strncmp(mac_buf, otp_mac_buf, 17) != 0) { + if (strncmp(mac_buf , otp_mac_buf , 17) != 0) { DHD_ERROR(("[WIFI]file MAC is wrong. Write OTP MAC in .mac.info \n")); dhd_write_mac_file(macfilepath, otp_mac_buf, sizeof(otp_mac_buf)); } @@ -891,8 +765,8 @@ int dhd_check_module_mac(dhd_pub_t *dhd) #ifdef WRITE_MACADDR int dhd_write_macaddr(struct ether_addr *mac) { - char *filepath_data = MACINFO; - char *filepath_efs = MACINFO_EFS; + char *filepath_data = MACINFO; + char *filepath_efs = MACINFO_EFS; struct file *fp_mac = NULL; char buf[18] = {0}; @@ -903,8 +777,8 @@ int dhd_write_macaddr(struct ether_addr *mac) startwrite: sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X\n", - mac->octet[0], mac->octet[1], mac->octet[2], - mac->octet[3], mac->octet[4], mac->octet[5]); + mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5]); /* File will be created /data/.mac.info. */ fp_mac = filp_open(filepath_data, O_RDWR | O_CREAT, 0666); @@ -1020,13 +894,8 @@ void sec_control_pm(dhd_pub_t *dhd, uint *power_mode) set_fs(oldfs); } } else { - if (fp == NULL) { - DHD_ERROR(("[%s, %d] /data/.psm.info open failed\n", - __FUNCTION__, __LINE__)); - return; - } kernel_read(fp, fp->f_pos, &power_val, 1); - DHD_ERROR(("POWER_VAL = %c \r\n", power_val)); + DHD_ERROR(("POWER_VAL = %c \r\n" , power_val)); if (power_val == '0') { #ifdef ROAM_ENABLE @@ -1038,14 +907,14 @@ void sec_control_pm(dhd_pub_t *dhd, uint *power_mode) sizeof(uint), TRUE, 0); /* Turn off MPC in AP mode */ bcm_mkiovar("mpc", (char *)power_mode, 4, - iovbuf, sizeof(iovbuf)); + iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); g_pm_control = TRUE; #ifdef ROAM_ENABLE /* Roaming off of dongle */ bcm_mkiovar("roam_off", (char *)&roamvar, 4, - iovbuf, sizeof(iovbuf)); + iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif @@ -1058,7 +927,7 @@ void sec_control_pm(dhd_pub_t *dhd, uint *power_mode) if (fp) filp_close(fp, NULL); } -#endif /* CONFIG_CONTROL_PM */ +#endif #ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE int dhd_customer_set_country(dhd_pub_t *dhd) { @@ -1087,44 +956,28 @@ int dhd_customer_set_country(dhd_pub_t *dhd) country_code_size = country_offset; if (country_offset != 0) { strncpy(country_code, buffer, country_offset); - strncpy(country_rev_buf, buffer+country_offset+1, - strlen(buffer) - country_code_size + 1); + strncpy(country_rev_buf, buffer+country_offset+1, strlen(buffer) - country_code_size + 1); country_rev = bcm_atoi(country_rev_buf); - buf_len = bcm_mkiovar("country", (char *)&cspec, - sizeof(cspec), iovbuf, sizeof(iovbuf)); + buf_len = bcm_mkiovar("country", (char *)&cspec, sizeof(cspec), iovbuf, sizeof(iovbuf)); ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, buf_len, FALSE, 0); memcpy((void *)&cspec, iovbuf, sizeof(cspec)); if (!ret) { - DHD_ERROR(("%s: get country ccode:%s" - " country_abrev:%s rev:%d \n", - __FUNCTION__, cspec.ccode, - cspec.country_abbrev, cspec.rev)); - if ((strncmp(country_code, cspec.ccode, - WLC_CNTRY_BUF_SZ) != 0) || - (cspec.rev != country_rev)) { - strncpy(cspec.country_abbrev, - country_code, country_code_size); - strncpy(cspec.ccode, country_code, - country_code_size); + DHD_ERROR(("%s: get country ccode:%s country_abrev:%s rev:%d \n", __FUNCTION__, cspec.ccode, cspec.country_abbrev, cspec.rev)); + if ((strncmp(country_code, cspec.ccode, WLC_CNTRY_BUF_SZ) != 0) || (cspec.rev != country_rev)) { + strncpy(cspec.country_abbrev, country_code, country_code_size); + strncpy(cspec.ccode, country_code, country_code_size); cspec.rev = country_rev; - DHD_ERROR(("%s: set country ccode:%s" - "country_abrev:%s rev:%d\n", - __FUNCTION__, cspec.ccode, - cspec.country_abbrev, cspec.rev)); - buf_len = bcm_mkiovar("country", (char *)&cspec, - sizeof(cspec), iovbuf, sizeof(iovbuf)); - ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, - iovbuf, buf_len, TRUE, 0); + DHD_ERROR(("%s: set country ccode:%s country_abrev:%s rev:%d \n", __FUNCTION__, cspec.ccode, cspec.country_abbrev, cspec.rev)); + buf_len = bcm_mkiovar("country", (char *)&cspec, sizeof(cspec), iovbuf, sizeof(iovbuf)); + ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, buf_len, TRUE, 0); } } } else { - DHD_ERROR(("%s: set country %s failed code \n", - __FUNCTION__, country_code)); + DHD_ERROR(("%s: set country %s failed code \n", __FUNCTION__, country_code)); ret = -1; } } else { - DHD_ERROR(("%s: Reading from the '%s' returns 0 bytes \n", - __FUNCTION__, filepath)); + DHD_ERROR(("%s: Reading from the '%s' returns 0 bytes \n", __FUNCTION__, filepath)); ret = -1; } } @@ -1133,61 +986,4 @@ int dhd_customer_set_country(dhd_pub_t *dhd) return ret; } -#endif /* GLOBALCONFIG_WLAN_COUNTRY_CODE */ - -#ifdef MIMO_ANT_SETTING -int dhd_sel_ant_from_file(dhd_pub_t *dhd) -{ - struct file *fp = NULL; - int ret = -1; - uint32 ant_val = 0; - char *filepath = "/data/.ant.info"; - char iovbuf[WLC_IOCTL_SMLEN]; - - /* Read antenna settings from the file */ - fp = filp_open(filepath, O_RDONLY, 0); - if (IS_ERR(fp)) { - DHD_ERROR(("[WIFI] %s: File [%s] open error\n", __FUNCTION__, filepath)); - return ret; - } else { - ret = kernel_read(fp, 0, (char *)&ant_val, 4); - if (ret < 0) { - DHD_ERROR(("[WIFI] %s: File read error, ret=%d\n", __FUNCTION__, ret)); - filp_close(fp, NULL); - return ret; - } - - ant_val = bcm_atoi((char *)&ant_val); - - DHD_ERROR(("[WIFI] %s: ANT val = %d\n", __FUNCTION__, ant_val)); - filp_close(fp, NULL); - - /* Check value from the file */ - if (ant_val < 1 || ant_val > 3) { - DHD_ERROR(("[WIFI] %s: Invalid value %d read from the file %s\n", - __FUNCTION__, ant_val, filepath)); - return -1; - } - } - - /* Select Antenna */ - bcm_mkiovar("txchain", (char *)&ant_val, 4, iovbuf, sizeof(iovbuf)); - ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - if (ret) { - DHD_ERROR(("[WIFI] %s: Fail to execute dhd_wl_ioctl_cmd(): txchain, ret=%d\n", - __FUNCTION__, ret)); - return ret; - } - - bcm_mkiovar("rxchain", (char *)&ant_val, 4, iovbuf, sizeof(iovbuf)); - ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - if (ret) { - DHD_ERROR(("[WIFI] %s: Fail to execute dhd_wl_ioctl_cmd(): rxchain, ret=%d\n", - __FUNCTION__, ret)); - return ret; - } - - return 0; -} -#endif /* MIMO_ANTENNA_SETTING */ -#endif /* CUSTOMER_HW4 */ +#endif diff --git a/drivers/net/wireless/bcmdhd/dhd_dbg.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_dbg.h index 314f0ee..ac0713b 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_dbg.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_dbg.h @@ -1,14 +1,14 @@ /* * Debug/trace/assert driver definitions for Dongle Host Driver. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,27 +16,20 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_dbg.h 353490 2012-08-27 21:10:02Z $ + * $Id: dhd_dbg.h 303834 2011-12-20 06:17:39Z $ */ #ifndef _dhd_dbg_ #define _dhd_dbg_ -#if !defined(CUSTOMER_HW4) -#define USE_NET_RATELIMIT net_ratelimit() -#else -#define USE_NET_RATELIMIT 1 -#endif - #if defined(DHD_DEBUG) -#define DHD_ERROR(args) do {if ((dhd_msg_level & DHD_ERROR_VAL) && USE_NET_RATELIMIT) \ - printf args;} while (0) +#define DHD_ERROR(args) do {if (dhd_msg_level & DHD_ERROR_VAL) printf args;} while (0) #define DHD_TRACE(args) do {if (dhd_msg_level & DHD_TRACE_VAL) printf args;} while (0) #define DHD_INFO(args) do {if (dhd_msg_level & DHD_INFO_VAL) printf args;} while (0) #define DHD_DATA(args) do {if (dhd_msg_level & DHD_DATA_VAL) printf args;} while (0) @@ -52,12 +45,6 @@ #define DHD_ARPOE(args) do {if (dhd_msg_level & DHD_ARPOE_VAL) printf args;} while (0) #define DHD_REORDER(args) do {if (dhd_msg_level & DHD_REORDER_VAL) printf args;} while (0) -#ifdef CUSTOMER_HW4 -#define DHD_TRACE_HW4 DHD_ERROR -#else -#define DHD_TRACE_HW4 DHD_TRACE -#endif - #define DHD_ERROR_ON() (dhd_msg_level & DHD_ERROR_VAL) #define DHD_TRACE_ON() (dhd_msg_level & DHD_TRACE_VAL) #define DHD_INFO_ON() (dhd_msg_level & DHD_INFO_VAL) @@ -76,7 +63,7 @@ #else /* defined(BCMDBG) || defined(DHD_DEBUG) */ -#define DHD_ERROR(args) do {if (USE_NET_RATELIMIT) printf args;} while (0) +#define DHD_ERROR(args) do {if (net_ratelimit()) printf args;} while (0) #define DHD_TRACE(args) #define DHD_INFO(args) #define DHD_DATA(args) @@ -92,12 +79,6 @@ #define DHD_ARPOE(args) #define DHD_REORDER(args) -#ifdef CUSTOMER_HW4 -#define DHD_TRACE_HW4 DHD_ERROR -#else -#define DHD_TRACE_HW4 DHD_TRACE -#endif - #define DHD_ERROR_ON() 0 #define DHD_TRACE_ON() 0 #define DHD_INFO_ON() 0 @@ -113,7 +94,7 @@ #define DHD_ISCAN_ON() 0 #define DHD_ARPOE_ON() 0 #define DHD_REORDER_ON() 0 -#endif +#endif #define DHD_LOG(args) diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux.c index 02b8794..da72c75 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux.c @@ -3,13 +3,13 @@ * Basically selected code segments from usb-cdc.c and usb-rndis.c * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_linux.c 354680 2012-09-01 09:13:38Z $ + * $Id: dhd_linux.c 309571 2012-01-20 01:45:10Z $ */ #include <typedefs.h> @@ -49,7 +49,6 @@ #include <epivers.h> #include <bcmutils.h> #include <bcmendian.h> -#include <bcmdevs.h> #include <proto/ethernet.h> #include <dngl_stats.h> @@ -78,6 +77,7 @@ #define HTSF_BUS_DELAY 150 /* assume a fix propagation in us */ #define TSMAX 1000 /* max no. of timing record kept */ #define NUMBIN 34 + static uint32 tsidx = 0; static uint32 htsf_seqnum = 0; uint32 tsfsync; @@ -95,21 +95,6 @@ typedef struct histo_ { static histo_t vi_d1, vi_d2, vi_d3, vi_d4; #endif /* WLMEDIA_HTSF */ -#ifndef DTIM_COUNT -#define DTIM_COUNT 3 -#endif - -#if defined(PKT_FILTER_SUPPORT) -#if defined(BLOCK_IPV6_PACKET) -#define HEX_PREF_STR "0x" -#define UNI_FILTER_STR "010000000000" -#define ZERO_ADDR_STR "000000000000" -#define ETHER_TYPE_STR "0000" -#define IPV6_FILTER_STR "20" -#define ZERO_TYPE_STR "00" -#endif /* BLOCK_IPV6_PACKET */ -#endif /* PKT_FILTER_SUPPORT */ - #if defined(SOFTAP) extern bool ap_cfg_running; extern bool ap_fw_loaded; @@ -149,9 +134,6 @@ DECLARE_WAIT_QUEUE_HEAD(dhd_dpc_wait); #if defined(OOB_INTR_ONLY) extern void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable); #endif /* defined(OOB_INTR_ONLY) */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) -static void dhd_hang_process(struct work_struct *work); -#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) MODULE_LICENSE("GPL v2"); #endif /* LinuxVer */ @@ -182,16 +164,18 @@ print_tainted() extern wl_iw_extra_params_t g_wl_iw_params; #endif /* defined(CONFIG_WIRELESS_EXT) */ -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) +#if defined(CONFIG_HAS_EARLYSUSPEND) #include <linux/earlysuspend.h> -#endif /* defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) */ +extern int dhdcdc_set_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len); extern int dhd_get_dtim_skip(dhd_pub_t *dhd); +#endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ #ifdef PKT_FILTER_SUPPORT extern void dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg); extern void dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_mode); #endif +#ifdef CUSTOMER_HW_SAMSUNG #ifdef READ_MACADDR extern int dhd_read_macaddr(struct dhd_info *dhd, struct ether_addr *mac); #endif @@ -208,9 +192,7 @@ extern int dhd_check_module_cid(dhd_pub_t *dhd); #ifdef GET_MAC_FROM_OTP extern int dhd_check_module_mac(dhd_pub_t *dhd); #endif -#ifdef MIMO_ANT_SETTING -extern int dhd_sel_ant_from_file(dhd_pub_t *dhd); -#endif +#endif /* CUSTOMER_HW_SAMSUNG */ #ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE int dhd_customer_set_country(dhd_pub_t *dhd); @@ -222,9 +204,9 @@ typedef struct dhd_if { /* OS/stack specifics */ struct net_device *net; struct net_device_stats stats; - int idx; /* iface idx in dongle */ + int idx; /* iface idx in dongle */ dhd_if_state_t state; /* interface state */ - uint subunit; /* subunit */ + uint subunit; /* subunit */ uint8 mac_addr[ETHER_ADDR_LEN]; /* assigned MAC address */ bool attached; /* Delayed attachment when unset */ bool txflowcontrol; /* Per interface flow control indicator */ @@ -262,11 +244,20 @@ static uint32 maxdelay = 0, tspktcnt = 0, maxdelaypktno = 0; #endif /* WLMEDIA_HTSF */ -#if defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) -/* SLP_wakelock_alternative_code */ +#if defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) +/*SLP_wakelock_alternative_code*/ extern struct device *pm_dev; -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ - +#endif /* CONFIG_PM_SLEEP && CUSTOMER_HW_SLP */ +#if defined(PKT_FILTER_SUPPORT) +#if defined(CUSTOMER_HW_SAMSUNG) +#define HEX_PREF_STR "0x" +#define UNI_FILTER_STR "010000000000" +#define ZERO_ADDR_STR "000000000000" +#define ETHER_TYPE_STR "0000" +#define IPV6_FILTER_STR "20" +#define ZERO_TYPE_STR "00" +#endif /* CUSTOMER_HW_SAMSUNG */ +#endif /* PKT_FILTER_SUPPORT */ /* Local private structure (extension of pub) */ typedef struct dhd_info { #if defined(CONFIG_WIRELESS_EXT) @@ -299,18 +290,16 @@ typedef struct dhd_info { tsk_ctl_t thr_dpc_ctl; tsk_ctl_t thr_wdt_ctl; -#endif /* DHDTHREAD */ + +#else bool dhd_tasklet_create; +#endif /* DHDTHREAD */ tsk_ctl_t thr_sysioc_ctl; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - struct work_struct work_hang; -#endif /* Wakelocks */ #if defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) struct wake_lock wl_wifi; /* Wifi wakelock */ struct wake_lock wl_rxwake; /* Wifi rx wakelock */ - struct wake_lock wl_ctrlwake; /* Wifi ctrl wakelock */ #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 @@ -318,12 +307,10 @@ typedef struct dhd_info { * calls and wifi_on or wifi_off */ struct mutex dhd_net_if_mutex; - struct mutex dhd_suspend_mutex; #endif spinlock_t wakelock_spinlock; int wakelock_counter; - int wakelock_rx_timeout_enable; - int wakelock_ctrl_timeout_enable; + int wakelock_timeout_enable; /* Thread to issue ioctl for multicast */ unsigned char set_macaddress; @@ -332,9 +319,9 @@ typedef struct dhd_info { atomic_t pend_8021x_cnt; dhd_attach_states_t dhd_state; -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) +#ifdef CONFIG_HAS_EARLYSUSPEND struct early_suspend early_suspend; -#endif /* CONFIG_HAS_EARLYSUSPEND && defined(DHD_USE_EARLYSUSPEND) */ +#endif /* CONFIG_HAS_EARLYSUSPEND */ #ifdef ARP_OFFLOAD_SUPPORT u32 pend_ipaddr; @@ -344,25 +331,20 @@ typedef struct dhd_info { void *rpc_osh; struct timer_list rpcth_timer; bool rpcth_timer_active; - bool fdaggr; #endif } dhd_info_t; - /* Definitions to provide path to the firmware and nvram * example nvram_path[MOD_PARAM_PATHLEN]="/projects/wlan/nvram.txt" */ char firmware_path[MOD_PARAM_PATHLEN]; char nvram_path[MOD_PARAM_PATHLEN]; -/* information string to keep firmware, chio, cheip version info visiable from log */ -char info_string[MOD_PARAM_INFOLEN]; -module_param_string(info_string, info_string, MOD_PARAM_INFOLEN, 0444); - int op_mode = 0; int disable_proptx = 0; module_param(op_mode, int, 0644); extern int wl_control_wl_start(struct net_device *dev); +extern int net_os_send_hang_message(struct net_device *dev); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) struct semaphore dhd_registration_sem; struct semaphore dhd_chipup_sem; @@ -377,9 +359,8 @@ module_param(dhd_sysioc, uint, 0); /* Error bits */ module_param(dhd_msg_level, int, 0); +module_param(disable_proptx, int, 0); -/* Disable Prop tx */ -module_param(disable_proptx, int, 0644); /* load firmware and/or nvram values from the filesystem */ module_param_string(firmware_path, firmware_path, MOD_PARAM_PATHLEN, 0660); module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0); @@ -398,20 +379,18 @@ uint dhd_slpauto = TRUE; module_param(dhd_slpauto, uint, 0); /* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ -uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_HOST_AUTO_REPLY | ARP_OL_PEER_AUTO_REPLY | ARP_OL_SNOOP; +uint dhd_arp_mode = 0xb; module_param(dhd_arp_mode, uint, 0); /* ARP offload enable */ uint dhd_arp_enable = TRUE; module_param(dhd_arp_enable, uint, 0); -#ifdef PKT_FILTER_SUPPORT /* Global Pkt filter enable control */ uint dhd_pkt_filter_enable = TRUE; module_param(dhd_pkt_filter_enable, uint, 0); -#endif -/* Pkt filter init setup */ +/* Pkt filter init setup */ uint dhd_pkt_filter_init = 0; module_param(dhd_pkt_filter_init, uint, 0); @@ -421,14 +400,15 @@ uint dhd_master_mode = FALSE; #else uint dhd_master_mode = TRUE; #endif /* GAL_LITE_NAT_KEEPALIVE_FILTER */ -module_param(dhd_master_mode, uint, 0); +module_param(dhd_master_mode, uint, 1); #ifdef DHDTHREAD -int dhd_watchdog_prio = 0; +/* Watchdog thread priority, -1 to use kernel timer */ +int dhd_watchdog_prio = 97; module_param(dhd_watchdog_prio, int, 0); -/* DPC thread priority */ -int dhd_dpc_prio = CUSTOM_DPC_PRIO_SETTING; +/* DPC thread priority, -1 to use tasklet */ +int dhd_dpc_prio = 98; module_param(dhd_dpc_prio, int, 0); /* DPC thread priority, -1 to use tasklet */ @@ -436,11 +416,7 @@ extern int dhd_dongle_memsize; module_param(dhd_dongle_memsize, int, 0); #endif /* DHDTHREAD */ /* Control fw roaming */ -#ifdef BCMCCX uint dhd_roam_disable = 0; -#else -uint dhd_roam_disable = 0; -#endif /* BCMCCX */ /* Control radio state */ uint dhd_radio_up = 1; @@ -449,6 +425,25 @@ uint dhd_radio_up = 1; char iface_name[IFNAMSIZ] = {'\0'}; module_param_string(iface_name, iface_name, IFNAMSIZ, 0); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#define DAEMONIZE(a) daemonize(a); \ + allow_signal(SIGKILL); \ + allow_signal(SIGTERM); +#else /* Linux 2.4 (w/o preemption patch) */ +#define RAISE_RX_SOFTIRQ() \ + cpu_raise_softirq(smp_processor_id(), NET_RX_SOFTIRQ) +#define DAEMONIZE(a) daemonize(); \ + do { if (a) \ + strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a) + 1))); \ + } while (0); +#endif /* LINUX_VERSION_CODE */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#define BLOCKABLE() (!in_atomic()) +#else +#define BLOCKABLE() (!in_interrupt()) +#endif + /* The following are specific to the SDIO dongle */ /* IOCTL response timeout */ @@ -459,7 +454,11 @@ int dhd_idletime = DHD_IDLETIME_TICKS; module_param(dhd_idletime, int, 0); /* Use polling */ +#ifdef CONFIG_MACH_MIDAS_02_BD +uint dhd_poll = TRUE; +#else uint dhd_poll = FALSE; +#endif module_param(dhd_poll, uint, 0); /* Use interrupts */ @@ -485,8 +484,6 @@ extern void dhd_dbg_init(dhd_pub_t *dhdp); extern void dhd_dbg_remove(void); #endif /* BCMDBGFS */ - - #ifdef SDTEST /* Echo packet generator (pkts/s) */ uint dhd_pktgen = 0; @@ -514,8 +511,6 @@ static char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR ; static void dhd_net_if_lock_local(dhd_info_t *dhd); static void dhd_net_if_unlock_local(dhd_info_t *dhd); -static void dhd_suspend_lock(dhd_pub_t *dhdp); -static void dhd_suspend_unlock(dhd_pub_t *dhdp); #ifdef WLMEDIA_HTSF void htsf_update(dhd_info_t *dhd, void *data); @@ -538,7 +533,6 @@ bool g_pm_control; void sec_control_pm(dhd_pub_t *dhd, uint *); #endif - #if defined(CONFIG_WIRELESS_EXT) struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev); #endif /* defined(CONFIG_WIRELESS_EXT) */ @@ -562,8 +556,7 @@ static int dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, static int dhd_sleep_pm_callback(struct notifier_block *nfb, unsigned long action, void *ignored) { int ret = NOTIFY_DONE; - -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) || defined(BCMHOST) switch (action) { case PM_HIBERNATION_PREPARE: case PM_SUSPEND_PREPARE: @@ -583,197 +576,190 @@ static int dhd_sleep_pm_callback(struct notifier_block *nfb, unsigned long actio static struct notifier_block dhd_sleep_pm_notifier = { .notifier_call = dhd_sleep_pm_callback, - .priority = 10 + .priority = 0 }; extern int register_pm_notifier(struct notifier_block *nb); extern int unregister_pm_notifier(struct notifier_block *nb); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ -#ifdef PKT_FILTER_SUPPORT -void dhd_set_packet_filter(dhd_pub_t *dhd) +static void dhd_set_packet_filter(int value, dhd_pub_t *dhd) { - int i; - - DHD_TRACE(("%s: enter\n", __FUNCTION__)); - if (dhd_pkt_filter_enable) { - for (i = 0; i < dhd->pktfilter_count; i++) { - dhd_pktfilter_offload_set(dhd, dhd->pktfilter[i]); - } - } -} - -void dhd_enable_packet_filter(int value, dhd_pub_t *dhd) -{ - int i; - - DHD_TRACE(("%s: enter, value = %d\n", __FUNCTION__, value)); +#ifdef PKT_FILTER_SUPPORT + DHD_TRACE(("%s: %d\n", __FUNCTION__, value)); /* 1 - Enable packet filter, only allow unicast packet to send up */ /* 0 - Disable packet filter */ - if (dhd_pkt_filter_enable) { + if (dhd_pkt_filter_enable && !dhd->dhcp_in_progress) { + int i; +#ifdef PASS_ALL_MCAST_PKTS + char iovbuf[20]; + uint32 allmultivar = !value; +#endif /* PASS_ALL_MCAST_PKTS */ + for (i = 0; i < dhd->pktfilter_count; i++) { + dhd_pktfilter_offload_set(dhd, dhd->pktfilter[i]); dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], value, dhd_master_mode); } +#ifdef PASS_ALL_MCAST_PKTS + bcm_mkiovar("allmulti", (char *)&allmultivar, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif /* PASS_ALL_MCAST_PKTS */ } -} #endif /* PKT_FILTER_SUPPORT */ +} +#if defined(CONFIG_HAS_EARLYSUSPEND) static int dhd_set_suspend(int value, dhd_pub_t *dhd) { -#ifndef SUPPORT_PM2_ONLY + char iovbuf[32]; +#ifndef CUSTOMER_HW_SAMSUNG int power_mode = PM_MAX; -#endif /* wl_pkt_filter_enable_t enable_parm; */ - char iovbuf[32]; -#if !defined(CUSTOMER_HW4) - int bcn_li_dtim = DTIM_COUNT; -#endif -#ifndef DISABLE_FW_ROAM_SUSPEND + int bcn_li_dtim = 3; uint roamvar = 1; #endif -#ifdef ENABLE_BCN_LI_BCN_WAKEUP +#ifdef BCM4334_CHIP int bcn_li_bcn; -#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ +#endif #ifdef PASS_ALL_MCAST_PKTS uint32 allmulti; #endif /* PASS_ALL_MCAST_PKTS */ - DHD_TRACE(("%s: enter, value = %d in_suspend=%d\n", + DHD_ERROR(("%s: enter, value = %d in_suspend=%d\n", __FUNCTION__, value, dhd->in_suspend)); - dhd_suspend_lock(dhd); if (dhd && dhd->up) { if (value && dhd->in_suspend) { + if (wl_cfgp2p_p2p_listen_suspend()) + DHD_ERROR(("failed to set WLC_E_P2P_PROBREQ_MSG\n")); #ifdef PKT_FILTER_SUPPORT - dhd->early_suspended = 1; + dhd->early_suspended = 1; #endif - /* Kernel suspended */ - DHD_ERROR(("%s: force extra Suspend setting \n", __FUNCTION__)); -#ifndef SUPPORT_PM2_ONLY - dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, - sizeof(power_mode), TRUE, 0); + /* Kernel suspended */ + DHD_ERROR(("%s: force extra Suspend setting \n", __FUNCTION__)); + +#ifndef CUSTOMER_HW_SAMSUNG + dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, + sizeof(power_mode), TRUE, 0); #endif -#ifdef PKT_FILTER_SUPPORT - /* Enable packet filter, only allow unicast packet to send up */ - if (!dhd->dhcp_in_progress) - dhd_enable_packet_filter(1, dhd); -#endif /* PKT_FILTER_SUPPORT */ + + /* Enable packet filter, only allow unicast packet to send up */ + if (dhd_pkt_filter_enable && !dhd->dhcp_in_progress) { + int i; + for (i = 0; i < dhd->pktfilter_count; i++) + dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], + 1, dhd_master_mode); + } #ifdef PASS_ALL_MCAST_PKTS - allmulti = 0; - bcm_mkiovar("allmulti", (char *)&allmulti, - 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + allmulti = 0; + bcm_mkiovar("allmulti", (char *)&allmulti, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* PASS_ALL_MCAST_PKTS */ -#if !defined(CUSTOMER_HW4) - /* If DTIM skip is set up as default, force it to wake - * each third DTIM for better power savings. Note that - * one side effect is a chance to miss BC/MC packet. - */ - bcn_li_dtim = dhd_get_dtim_skip(dhd); - bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, - 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* !defined(CUSTOMER_HW4) */ -#ifndef DISABLE_FW_ROAM_SUSPEND - /* Disable firmware roaming during suspend */ - bcm_mkiovar("roam_off", (char *)&roamvar, 4, - iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif -#ifdef ENABLE_BCN_LI_BCN_WAKEUP - bcn_li_bcn = 0; - bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, - 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ +#ifndef CUSTOMER_HW_SAMSUNG + /* If DTIM skip is set up as default, force it to wake + * each third DTIM for better power savings. Note that + * one side effect is a chance to miss BC/MC packet. + */ + bcn_li_dtim = dhd_get_dtim_skip(dhd); + bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, + 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + + /* Disable firmware roaming during suspend */ + bcm_mkiovar("roam_off", (char *)&roamvar, 4, + iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif +#ifdef BCM4334_CHIP + bcn_li_bcn = 0; + bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, + 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif + } else { - } else { #ifdef PKT_FILTER_SUPPORT - dhd->early_suspended = 0; + dhd->early_suspended = 0; #endif - /* Kernel resumed */ - DHD_TRACE(("%s: Remove extra suspend setting \n", __FUNCTION__)); -#ifndef SUPPORT_PM2_ONLY - power_mode = PM_FAST; - dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, - sizeof(power_mode), TRUE, 0); + /* Kernel resumed */ + DHD_ERROR(("%s: Remove extra suspend setting \n", __FUNCTION__)); + +#ifndef CUSTOMER_HW_SAMSUNG + power_mode = PM_FAST; + dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, + sizeof(power_mode), TRUE, 0); #endif -#ifdef PKT_FILTER_SUPPORT - /* disable pkt filter */ - dhd_enable_packet_filter(0, dhd); -#endif /* PKT_FILTER_SUPPORT */ + + /* disable pkt filter */ + if (dhd_pkt_filter_enable && !dhd->dhcp_in_progress) { + int i; + for (i = 0; i < dhd->pktfilter_count; i++) + dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], + 0, dhd_master_mode); + } #ifdef PASS_ALL_MCAST_PKTS - allmulti = 1; - bcm_mkiovar("allmulti", (char *)&allmulti, - 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + allmulti = 1; + bcm_mkiovar("allmulti", (char *)&allmulti, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* PASS_ALL_MCAST_PKTS */ -#if !defined(CUSTOMER_HW4) - /* restore pre-suspend setting for dtim_skip */ - bcm_mkiovar("bcn_li_dtim", (char *)&dhd->dtim_skip, - 4, iovbuf, sizeof(iovbuf)); +#ifndef CUSTOMER_HW_SAMSUNG + /* restore pre-suspend setting for dtim_skip */ + bcm_mkiovar("bcn_li_dtim", (char *)&dhd->dtim_skip, + 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + + roamvar = dhd_roam_disable; + bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, + sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif -#ifndef DISABLE_FW_ROAM_SUSPEND - roamvar = dhd_roam_disable; - bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, - sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#ifdef BCM4334_CHIP + bcn_li_bcn = 1; + bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, + 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif -#ifdef ENABLE_BCN_LI_BCN_WAKEUP - bcn_li_bcn = 1; - bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, - 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ - - } + } } - dhd_suspend_unlock(dhd); return 0; } -static int dhd_suspend_resume_helper(struct dhd_info *dhd, int val, int force) +static void dhd_suspend_resume_helper(struct dhd_info *dhd, int val) { dhd_pub_t *dhdp = &dhd->pub; - int ret = 0; DHD_OS_WAKE_LOCK(dhdp); /* Set flag when early suspend was called */ dhdp->in_suspend = val; - if ((force || !dhdp->suspend_disable_flag) && - (dhd_check_ap_wfd_mode_set(dhdp) == FALSE)) - { - ret = dhd_set_suspend(val, dhdp); - } - + if ((!dhdp->suspend_disable_flag) && (dhd_check_ap_wfd_mode_set(dhdp) == FALSE)) + dhd_set_suspend(val, dhdp); DHD_OS_WAKE_UNLOCK(dhdp); - return ret; } -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) static void dhd_early_suspend(struct early_suspend *h) { struct dhd_info *dhd = container_of(h, struct dhd_info, early_suspend); - DHD_TRACE_HW4(("%s: enter\n", __FUNCTION__)); + + DHD_ERROR(("%s: enter\n", __FUNCTION__)); if (dhd) - dhd_suspend_resume_helper(dhd, 1, 0); + dhd_suspend_resume_helper(dhd, 1); } static void dhd_late_resume(struct early_suspend *h) { struct dhd_info *dhd = container_of(h, struct dhd_info, early_suspend); - DHD_TRACE_HW4(("%s: enter\n", __FUNCTION__)); + + DHD_ERROR(("%s: enter\n", __FUNCTION__)); if (dhd) - dhd_suspend_resume_helper(dhd, 0, 0); + dhd_suspend_resume_helper(dhd, 0); } #endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ @@ -795,7 +781,7 @@ dhd_timeout_start(dhd_timeout_t *tmo, uint usec) tmo->limit = usec; tmo->increment = 0; tmo->elapsed = 0; - tmo->tick = jiffies_to_usecs(1); + tmo->tick = 1000000 / HZ; } int @@ -821,12 +807,16 @@ dhd_timeout_expired(dhd_timeout_t *tmo) } else { wait_queue_head_t delay_wait; DECLARE_WAITQUEUE(wait, current); + int pending; init_waitqueue_head(&delay_wait); add_wait_queue(&delay_wait, &wait); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); + pending = signal_pending(current); remove_wait_queue(&delay_wait, &wait); set_current_state(TASK_RUNNING); + if (pending) + return 1; /* Interrupted */ } return 0; @@ -943,32 +933,32 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) if (dhd->iflist[i]) { dev = dhd->iflist[i]->net; #else - ASSERT(dhd && dhd->iflist[ifidx]); - dev = dhd->iflist[ifidx]->net; + ASSERT(dhd && dhd->iflist[ifidx]); + dev = dhd->iflist[ifidx]->net; #endif /* MCAST_LIST_ACCUMULATION */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - netif_addr_lock_bh(dev); + netif_addr_lock_bh(dev); #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) #ifdef MCAST_LIST_ACCUMULATION cnt_iface[i] = netdev_mc_count(dev); cnt += cnt_iface[i]; #else - cnt = netdev_mc_count(dev); + cnt = netdev_mc_count(dev); #endif /* MCAST_LIST_ACCUMULATION */ #else #ifdef MCAST_LIST_ACCUMULATION cnt += dev->mc_count; #else - cnt = dev->mc_count; + cnt = dev->mc_count; #endif /* MCAST_LIST_ACCUMULATION */ #endif /* LINUX_VERSION_CODE */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - netif_addr_unlock_bh(dev); + netif_addr_unlock_bh(dev); #endif - /* Determine initial value of allmulti flag */ + /* Determine initial value of allmulti flag */ #ifdef MCAST_LIST_ACCUMULATION allmulti |= (dev->flags & IFF_ALLMULTI) ? TRUE : FALSE; } @@ -980,8 +970,8 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) #ifdef PASS_ALL_MCAST_PKTS #ifdef PKT_FILTER_SUPPORT if (!dhd->pub.early_suspended) -#endif /* PKT_FILTER_SUPPORT */ - allmulti = TRUE; + allmulti = TRUE; +#endif #endif /* PASS_ALL_MCAST_PKTS */ /* Send down the multicast list first. */ @@ -994,8 +984,7 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) return; } - strncpy(bufp, "mcast_list", buflen - 1); - bufp[buflen - 1] = '\0'; + strcpy(bufp, "mcast_list"); bufp += strlen("mcast_list") + 1; cnt = htol32(cnt); @@ -1005,48 +994,49 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) #ifdef MCAST_LIST_ACCUMULATION for (i = 0; i < DHD_MAX_IFS; i++) { if (dhd->iflist[i]) { - DHD_TRACE(("_dhd_set_multicast_list: ifidx %d\n", i)); + DHD_TRACE(("_dhd_set_multicast_list: ifidx %d\n", i)); /* Shinuk */ dev = dhd->iflist[i]->net; #endif /* MCAST_LIST_ACCUMULATION */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - netif_addr_lock_bh(dev); + netif_addr_lock_bh(dev); #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) - netdev_for_each_mc_addr(ha, dev) { + netdev_for_each_mc_addr(ha, dev) { #ifdef MCAST_LIST_ACCUMULATION if (!cnt_iface[i]) #else - if (!cnt) + if (!cnt) #endif /* MCAST_LIST_ACCUMULATION */ - break; - memcpy(bufp, ha->addr, ETHER_ADDR_LEN); - bufp += ETHER_ADDR_LEN; + break; + memcpy(bufp, ha->addr, ETHER_ADDR_LEN); + bufp += ETHER_ADDR_LEN; #ifdef MCAST_LIST_ACCUMULATION - DHD_TRACE(("_dhd_set_multicast_list: cnt " - "%d " MACDBG "\n", - cnt_iface[i], STR_TO_MACD(ha->addr))); + DHD_TRACE(("_dhd_set_multicast_list: cnt %d %02x:%02x:%02x:%02x:%02x:%02x\n", + cnt_iface[i], ha->addr[0], ha->addr[1], + ha->addr[2], ha->addr[3], ha->addr[4], + ha->addr[5])); /* Shinuk */ cnt_iface[i]--; #else - cnt--; + cnt--; #endif /* MCAST_LIST_ACCUMULATION */ - } + + } #else #ifdef MCAST_LIST_ACCUMULATION - for (mclist = dev->mc_list; (mclist && (cnt_iface[i] > 0)); - cnt_iface[i]--, mclist = mclist->next) { + for (mclist = dev->mc_list; (mclist && (cnt_iface[i] > 0)); cnt_iface[i]--, mclist = mclist->next) { #else - for (mclist = dev->mc_list; (mclist && (cnt > 0)); - cnt--, mclist = mclist->next) { + for (mclist = dev->mc_list; (mclist && (cnt > 0)); cnt--, mclist = mclist->next) { #endif /* MCAST_LIST_ACCUMULATION */ - memcpy(bufp, (void *)mclist->dmi_addr, ETHER_ADDR_LEN); - bufp += ETHER_ADDR_LEN; - } + memcpy(bufp, (void *)mclist->dmi_addr, ETHER_ADDR_LEN); + bufp += ETHER_ADDR_LEN; + } #endif /* LINUX_VERSION_CODE */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - netif_addr_unlock_bh(dev); + netif_addr_unlock_bh(dev); #endif + #ifdef MCAST_LIST_ACCUMULATION } } @@ -1130,7 +1120,11 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) } } +#ifdef CUSTOMER_HW_SAMSUNG int +#else +static int +#endif _dhd_set_mac_address(dhd_info_t *dhd, int ifidx, struct ether_addr *addr) { char buf[32]; @@ -1243,20 +1237,15 @@ dhd_op_if(dhd_if_t *ifp) /* dhd_op_if is called again from some other context */ ifp->state = DHD_IF_DELETING; if (ifp->net != NULL) { - DHD_TRACE(("\n%s: got 'DHD_IF_DEL' state\n", __FUNCTION__)); + DHD_ERROR(("\n%s: (WAR TRACE) got 'DHD_IF_DEL' state\n", __FUNCTION__)); netif_stop_queue(ifp->net); #ifdef WL_CFG80211 if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { - wl_cfg80211_ifdel_ops(ifp->net); + wl_cfg80211_notify_ifdel(ifp->net); } #endif unregister_netdev(ifp->net); ret = DHD_DEL_IF; /* Make sure the free_netdev() is called */ -#ifdef WL_CFG80211 - if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { - wl_cfg80211_notify_ifdel(); - } -#endif } break; case DHD_IF_DELETING: @@ -1296,11 +1285,10 @@ _dhd_sysioc_thread(void *data) bool in_ap = FALSE; unsigned long flags; #endif -#ifndef USE_KTHREAD_API + DAEMONIZE("dhd_sysioc"); complete(&tsk->completed); -#endif while (down_interruptible(&tsk->sema) == 0) { #ifdef MCAST_LIST_ACCUMULATION @@ -1359,13 +1347,10 @@ _dhd_sysioc_thread(void *data) } if (dhd->set_macaddress == i+1) { dhd->set_macaddress = 0; - if (_dhd_set_mac_address(dhd, i, &dhd->macvalue) == 0) { - DHD_INFO(( - "dhd_sysioc_thread: MACID is overwritten\n")); - } else { - DHD_ERROR(( - "dhd_sysioc_thread: _dhd_set_mac_address() failed\n")); - } + if (0 == _dhd_set_mac_address(dhd, i, &dhd->macvalue)) + DHD_INFO(("dhd_sysioc_thread: MACID is overwritten\n")); + else + DHD_ERROR(("dhd_sysioc_thread: _dhd_set_mac_address() failed\n")); } } } @@ -1432,6 +1417,7 @@ dhd_os_wlfc_unblock(dhd_pub_t *pub) { dhd_info_t *di = (dhd_info_t *)(pub->info); + (void)di; ASSERT(di != NULL); spin_unlock_bh(&di->wlfc_spinlock); return 1; @@ -1538,6 +1524,12 @@ dhd_start_xmit(struct sk_buff *skb, struct net_device *net) DHD_OS_WAKE_LOCK(&dhd->pub); /* Reject if down */ +#ifdef CUSTOMER_HW_SAMSUNG + /* + * CSP #506108 + * kernel panic issue when first bootup time, + * rmmod without interface down make unnecessary hang event. + */ if (dhd->pub.busstate == DHD_BUS_DOWN || dhd->pub.hang_was_sent) { DHD_ERROR(("%s: xmit rejected pub.up=%d busstate=%d \n", __FUNCTION__, dhd->pub.up, dhd->pub.busstate)); @@ -1548,23 +1540,29 @@ dhd_start_xmit(struct sk_buff *skb, struct net_device *net) net_os_send_hang_message(net); } DHD_OS_WAKE_UNLOCK(&dhd->pub); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) return -ENODEV; + } #else - return NETDEV_TX_BUSY; -#endif + if (!dhd->pub.up || (dhd->pub.busstate == DHD_BUS_DOWN)) { + DHD_ERROR(("%s: xmit rejected pub.up=%d busstate=%d \n", + __FUNCTION__, dhd->pub.up, dhd->pub.busstate)); + netif_stop_queue(net); + /* Send Event when bus down detected during data session */ + if (dhd->pub.busstate == DHD_BUS_DOWN) { + DHD_ERROR(("%s: Event HANG sent up\n", __FUNCTION__)); + net_os_send_hang_message(net); + } + DHD_OS_WAKE_UNLOCK(&dhd->pub); + return -ENODEV; } +#endif /* CUSTOMER_HW_SAMSUNG */ ifidx = dhd_net2idx(dhd, net); if (ifidx == DHD_BAD_IF) { DHD_ERROR(("%s: bad ifidx %d\n", __FUNCTION__, ifidx)); netif_stop_queue(net); DHD_OS_WAKE_UNLOCK(&dhd->pub); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) return -ENODEV; -#else - return NETDEV_TX_BUSY; -#endif } /* Make sure there's enough room for any header */ @@ -1619,11 +1617,7 @@ done: DHD_OS_WAKE_UNLOCK(&dhd->pub); /* Return ok: we always eat the packet */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) return 0; -#else - return NETDEV_TX_OK; -#endif } void @@ -1681,7 +1675,6 @@ static const char *_get_packet_type_str(uint16 type) { int i; int n = sizeof(packet_type_info)/sizeof(packet_type_info[1]) - 1; - for (i = 0; i < n; i++) { if (packet_type_info[i].type == type) return packet_type_info[i].str; @@ -1691,11 +1684,6 @@ static const char *_get_packet_type_str(uint16 type) } #endif /* DHD_RX_DUMP */ -#ifdef CUSTOMER_HW4 -extern int pkt_free; -extern int caller; -extern void *free_ptr; -#endif void dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) { @@ -1707,9 +1695,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) int i; dhd_if_t *ifp; wl_event_msg_t event; - int tout_rx = 0; - int tout_ctrl = 0; - + int tout = DHD_PACKET_TIMEOUT_MS; #ifdef DHD_RX_DUMP #ifdef DHD_RX_FULL_DUMP int k; @@ -1718,6 +1704,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) uint16 protocol; #endif /* DHD_RX_DUMP */ + DHD_TRACE(("%s: Enter\n", __FUNCTION__)); for (i = 0; pktbuf && i < numpkt; i++, pktbuf = pnext) { @@ -1735,17 +1722,14 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) /* Dropping packets before registering net device to avoid kernel panic */ -#ifdef BCMDHDUSB - if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED) { -#else - if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || !dhd->pub.up) { -#endif /* BCMDHDUSB */ + if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || + !dhd->pub.up) { DHD_ERROR(("%s: net device is NOT registered yet. drop packet\n", __FUNCTION__)); PKTFREE(dhdp->osh, pktbuf, TRUE); continue; } -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) */ +#endif pnext = PKTNEXT(dhdp->osh, pktbuf); PKTSETNEXT(wl->sh.osh, pktbuf, NULL); @@ -1771,16 +1755,10 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) piggy-back on */ ((athost_wl_status_info_t*)dhdp->wlfc_state)->stats.wlfc_header_only_pkt++; -#ifdef CUSTOMER_HW4 - if (numpkt == 1 && pkt_free && (free_ptr == pktbuf)) { - DHD_ERROR(("DHD TRACE2(FREE):%d %d %p\n", - pkt_free, caller, free_ptr)); - } -#endif PKTFREE(dhdp->osh, pktbuf, TRUE); continue; } -#endif /* PROP_TXSTATUS */ +#endif skb = PKTTONATIVE(dhdp->osh, pktbuf); @@ -1800,7 +1778,6 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) dump_data = skb->data; protocol = (dump_data[12] << 8) | dump_data[13]; DHD_ERROR(("RX DUMP - %s\n", _get_packet_type_str(protocol))); - #ifdef DHD_RX_FULL_DUMP if (protocol != ETHER_TYPE_BRCM) { for (k = 0; k < skb->len; k++) { @@ -1811,7 +1788,6 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) DHD_ERROR(("\n")); } #endif /* DHD_RX_FULL_DUMP */ - if (protocol != ETHER_TYPE_BRCM) { if (dump_data[0] == 0xFF) { DHD_ERROR(("%s: BROADCAST\n", __FUNCTION__)); @@ -1822,8 +1798,12 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) __FUNCTION__, dump_data[0x15])); } } else if (dump_data[0] & 1) { - DHD_ERROR(("%s: MULTICAST: " MACDBG "\n", - __FUNCTION__, STR_TO_MACD(dump_data))); + DHD_ERROR(("%s: MULTICAST: " + "%02X:%02X:%02X:%02X:%02X:%02X\n", + __FUNCTION__, dump_data[0], + dump_data[1], dump_data[2], + dump_data[3], dump_data[4], + dump_data[5])); } if (protocol == ETHER_TYPE_802_1X) { @@ -1868,24 +1848,13 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) &event, &data); - wl_event_to_host_order(&event); - - if (!tout_ctrl) - tout_ctrl = DHD_PACKET_TIMEOUT_MS; - #ifdef WLBTAMP + wl_event_to_host_order(&event); if (event.event_type == WLC_E_BTA_HCI_EVENT) { dhd_bta_doevt(dhdp, data, event.datalen); } + tout = DHD_EVENT_TIMEOUT_MS; #endif /* WLBTAMP */ - -#if defined(PNO_SUPPORT) - if (event.event_type == WLC_E_PFN_NET_FOUND) { - tout_ctrl *= 2; - } -#endif /* PNO_SUPPORT */ - } else { - tout_rx = DHD_PACKET_TIMEOUT_MS; } ASSERT(ifidx < DHD_MAX_IFS && dhd->iflist[ifidx]); @@ -1918,9 +1887,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) */ } } - - DHD_OS_WAKE_LOCK_RX_TIMEOUT_ENABLE(dhdp, tout_rx); - DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(dhdp, tout_ctrl); + DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(dhdp, tout); } void @@ -2020,12 +1987,11 @@ dhd_watchdog_thread(void *data) dhd_watchdog_prio:(MAX_RT_PRIO-1); setScheduler(current, SCHED_FIFO, ¶m); } -#ifndef USE_KTHREAD_API + DAEMONIZE("dhd_watchdog"); /* Run until signal received */ complete(&tsk->completed); -#endif while (1) if (down_interruptible (&tsk->sema) == 0) { @@ -2049,7 +2015,7 @@ dhd_watchdog_thread(void *data) /* Reschedule the watchdog */ if (dhd->wd_timer_valid) mod_timer(&dhd->timer, - jiffies + msecs_to_jiffies(dhd_watchdog_ms)); + jiffies + dhd_watchdog_ms * HZ / 1000); dhd_os_spin_unlock(&dhd->pub, flags); } dhd_os_sdunlock(&dhd->pub); @@ -2067,6 +2033,10 @@ static void dhd_watchdog(ulong data) dhd_info_t *dhd = (dhd_info_t *)data; unsigned long flags; + /* To avoid kernel panic */ + if (!dhd->wd_timer_valid) + return; + DHD_OS_WAKE_LOCK(&dhd->pub); if (dhd->pub.dongle_reset) { DHD_OS_WAKE_UNLOCK(&dhd->pub); @@ -2090,7 +2060,7 @@ static void dhd_watchdog(ulong data) /* Reschedule the watchdog */ if (dhd->wd_timer_valid) - mod_timer(&dhd->timer, jiffies + msecs_to_jiffies(dhd_watchdog_ms)); + mod_timer(&dhd->timer, jiffies + dhd_watchdog_ms * HZ / 1000); dhd_os_spin_unlock(&dhd->pub, flags); dhd_os_sdunlock(&dhd->pub); DHD_OS_WAKE_UNLOCK(&dhd->pub); @@ -2112,13 +2082,12 @@ dhd_dpc_thread(void *data) param.sched_priority = (dhd_dpc_prio < MAX_RT_PRIO)?dhd_dpc_prio:(MAX_RT_PRIO-1); setScheduler(current, SCHED_FIFO, ¶m); } -#ifndef USE_KTHREAD_API + DAEMONIZE("dhd_dpc"); /* DHD_OS_WAKE_LOCK is called in dhd_sched_dpc[dhd_linux.c] down below */ /* signal: thread has started */ complete(&tsk->completed); -#endif /* Run until signal received */ while (1) { @@ -2187,8 +2156,7 @@ dhd_sched_dpc(dhd_pub_t *dhdp) } #endif /* DHDTHREAD */ - if (dhd->dhd_tasklet_create) - tasklet_schedule(&dhd->tasklet); + tasklet_schedule(&dhd->tasklet); } #ifdef TOE @@ -2207,8 +2175,7 @@ dhd_toe_get(dhd_info_t *dhd, int ifidx, uint32 *toe_ol) ioc.len = (uint)sizeof(buf); ioc.set = FALSE; - strncpy(buf, "toe_ol", sizeof(buf) - 1); - buf[sizeof(buf) - 1] = '\0'; + strcpy(buf, "toe_ol"); if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { /* Check for older dongle image that doesn't support toe_ol */ if (ret == -EIO) { @@ -2242,8 +2209,7 @@ dhd_toe_set(dhd_info_t *dhd, int ifidx, uint32 toe_ol) /* Set toe_ol as requested */ - strncpy(buf, "toe_ol", sizeof(buf) - 1); - buf[sizeof(buf) - 1] = '\0'; + strcpy(buf, "toe_ol"); memcpy(&buf[sizeof("toe_ol")], &toe_ol, sizeof(uint32)); if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { @@ -2274,8 +2240,8 @@ dhd_ethtool_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); - snprintf(info->driver, sizeof(info->driver), "wl"); - snprintf(info->version, sizeof(info->version), "%lu", dhd->pub.drv_version); + sprintf(info->driver, "wl"); + sprintf(info->version, "%lu", dhd->pub.drv_version); } struct ethtool_ops dhd_ethtool_ops = { @@ -2317,9 +2283,8 @@ dhd_ethtool(dhd_info_t *dhd, void *uaddr) /* if dhd requested, identify ourselves */ if (strcmp(drvname, "?dhd") == 0) { - snprintf(info.driver, sizeof(info.driver), "dhd"); - strncpy(info.version, EPI_VERSION_STR, sizeof(info.version) - 1); - info.version[sizeof(info.version) - 1] = '\0'; + sprintf(info.driver, "dhd"); + strcpy(info.version, EPI_VERSION_STR); } /* otherwise, require dongle to be up */ @@ -2330,11 +2295,11 @@ dhd_ethtool(dhd_info_t *dhd, void *uaddr) /* finally, report dongle driver type */ else if (dhd->pub.iswl) - snprintf(info.driver, sizeof(info.driver), "wl"); + sprintf(info.driver, "wl"); else - snprintf(info.driver, sizeof(info.driver), "xx"); + sprintf(info.driver, "xx"); - snprintf(info.version, sizeof(info.version), "%lu", dhd->pub.drv_version); + sprintf(info.version, "%lu", dhd->pub.drv_version); if (copy_to_user(uaddr, &info, sizeof(info))) return -EFAULT; DHD_CTL(("%s: given %*s, returning %s\n", __FUNCTION__, @@ -2404,13 +2369,13 @@ static bool dhd_check_hang(struct net_device *net, dhd_pub_t *dhdp, int error) return FALSE; dhd = (dhd_info_t *)dhdp->info; - if (dhd->thr_sysioc_ctl.thr_pid < 0) { + if (dhd->thr_sysioc_ctl.thr_pid <0) { DHD_ERROR(("%s : skipped due to negative pid - unloading?\n", __FUNCTION__)); return FALSE; } - if ((error == -ETIMEDOUT) || (error == -EREMOTEIO) || - ((dhdp->busstate == DHD_BUS_DOWN) && (!dhdp->dongle_reset))) { + if ((error == -ETIMEDOUT) || (error == -EREMOTEIO) + || ((dhdp->busstate == DHD_BUS_DOWN)&&(!dhdp->dongle_reset))) { DHD_ERROR(("%s: Event HANG send up due to re=%d te=%d e=%d s=%d\n", __FUNCTION__, dhdp->rxcnt_timeout, dhdp->txcnt_timeout, error, dhdp->busstate)); net_os_send_hang_message(net); @@ -2436,7 +2401,7 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) /* send to dongle only if we are not waiting for reload already */ if (dhd->pub.hang_was_sent) { DHD_ERROR(("%s: HANG was sent up earlier\n", __FUNCTION__)); - DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(&dhd->pub, DHD_EVENT_TIMEOUT_MS); + DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(&dhd->pub, DHD_EVENT_TIMEOUT_MS); DHD_OS_WAKE_UNLOCK(&dhd->pub); return OSL_ERROR(BCME_DONGLE_DOWN); } @@ -2610,15 +2575,13 @@ dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) } #endif /* WLMEDIA_HTSF */ +#ifdef BCM_FD_AGGR if ((ioc.cmd == WLC_SET_VAR || ioc.cmd == WLC_GET_VAR) && ioc.buf != NULL && strncmp("rpc_", ioc.buf, 4) == 0) { -#ifdef BCM_FD_AGGR bcmerror = dhd_fdaggr_ioctl(&dhd->pub, ifidx, (wl_ioctl_t *)&ioc, buf, buflen); -#else - bcmerror = BCME_UNSUPPORTED; -#endif goto done; } +#endif bcmerror = dhd_wl_ioctl(&dhd->pub, ifidx, (wl_ioctl_t *)&ioc, buf, buflen); done: @@ -2657,17 +2620,17 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd) #endif for (i = 1; i < DHD_MAX_IFS; i++) { - dhd_net_if_lock_local(dhd); if (dhd->iflist[i]) { - DHD_TRACE(("Deleting IF: %d \n", i)); + DHD_ERROR(("(WAR TRACE)Deleting IF: %d \n", i)); if ((dhd->iflist[i]->state != DHD_IF_DEL) && (dhd->iflist[i]->state != DHD_IF_DELETING)) { dhd->iflist[i]->state = DHD_IF_DEL; dhd->iflist[i]->idx = i; + dhd_net_if_lock_local(dhd); dhd_op_if(dhd->iflist[i]); + dhd_net_if_unlock_local(dhd); } } - dhd_net_if_unlock_local(dhd); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) @@ -2679,8 +2642,8 @@ dhd_cleanup_virt_ifaces(dhd_info_t *dhd) } #endif /* WL_CFG80211 */ -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) -/* Flags to indicate if we distingish power off policy when +#if defined(WL_CFG80211) && defined(CUSTOMER_HW_SAMSUNG) +/* CSP#505233: Flags to indicate if we distingish power off policy when * user set the memu "Keep Wi-Fi on during sleep" to "Never" */ int sleep_never = 0; @@ -2689,20 +2652,16 @@ int sleep_never = 0; static int dhd_stop(struct net_device *net) { - int ifidx = 0; + int ifidx; dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); DHD_OS_WAKE_LOCK(&dhd->pub); - DHD_TRACE(("%s: Enter %p\n", __FUNCTION__, net)); + DHD_TRACE(("%s: (WAR TRACE)Enter %p\n", __FUNCTION__, net)); if (dhd->pub.up == 0) { goto exit; } ifidx = dhd_net2idx(dhd, net); BCM_REFERENCE(ifidx); - /* Set state and stop OS transmissions */ - netif_stop_queue(net); - dhd->pub.up = 0; - #ifdef WL_CFG80211 if (ifidx == 0) { wl_cfg80211_down(NULL); @@ -2721,17 +2680,18 @@ dhd_stop(struct net_device *net) #ifdef PROP_TXSTATUS dhd_wlfc_cleanup(&dhd->pub); #endif + /* Set state and stop OS transmissions */ + dhd->pub.up = 0; + netif_stop_queue(net); /* Stop the protocol module */ dhd_prot_stop(&dhd->pub); - OLD_MOD_DEC_USE_COUNT; -exit: #if defined(WL_CFG80211) if (ifidx == 0) { if (!dhd_download_fw_on_driverload) wl_android_wifi_off(net); -#ifdef SUPPORT_DEEP_SLEEP +#ifdef CUSTOMER_HW_SAMSUNG else { /* CSP#505233: Flags to indicate if we distingish * power off policy when user set the memu @@ -2742,12 +2702,15 @@ exit: sleep_never = 0; } } -#endif /* SUPPORT_DEEP_SLEEP */ +#endif /* CUSTOMER_HW_SAMSUNG */ } -#endif +#endif /* WL_CFG80211 */ + dhd->pub.dongle_trap_occured = 0; + dhd->pub.hang_was_sent = 0; dhd->pub.rxcnt_timeout = 0; dhd->pub.txcnt_timeout = 0; - + OLD_MOD_DEC_USE_COUNT; +exit: DHD_OS_WAKE_UNLOCK(&dhd->pub); return 0; } @@ -2761,41 +2724,39 @@ dhd_open(struct net_device *net) #endif int ifidx; int32 ret = 0; - +#ifdef WL_CFG80211 + bool fw_changed = FALSE; +#endif DHD_OS_WAKE_LOCK(&dhd->pub); - DHD_ERROR(("%s: Enter, net[%p]\n", __FUNCTION__, net)); /* Update FW path if it was changed */ - if (strlen(firmware_path) != 0) { + if ((strlen(firmware_path) != 0) && (firmware_path[0] != '\0')) { if (firmware_path[strlen(firmware_path)-1] == '\n') firmware_path[strlen(firmware_path)-1] = '\0'; - strncpy(fw_path, firmware_path, sizeof(fw_path)-1); - fw_path[sizeof(fw_path)-1] = '\0'; -#if defined(SUPPORT_MULTIPLE_REVISION) - ret = concate_revision(dhd->pub.bus, fw_path, MOD_PARAM_PATHLEN); - if (ret != 0) { - DHD_ERROR(("%s: fail to concatnate revison \n", __FUNCTION__)); - goto exit; - } +#ifdef WL_CFG80211 + if (dhd_download_fw_on_driverload && + strcmp(fw_path, firmware_path)) + { + DHD_ERROR(("firmware path changed:%s --> %s\n", + fw_path, firmware_path)); + fw_changed = TRUE; + } +#endif /* WL_CFG80211 */ + strcpy(fw_path, firmware_path); +#if defined(BCM4334_CHECK_CHIP_REV) + strcpy(fw_down_path, fw_path); + strcat(fw_down_path, chipver_tag); #endif firmware_path[0] = '\0'; } - dhd->pub.dongle_trap_occured = 0; - dhd->pub.hang_was_sent = 0; #if !defined(WL_CFG80211) /* * Force start if ifconfig_up gets called before START command * We keep WEXT's wl_control_wl_start to provide backward compatibility * This should be removed in the future */ - ret = wl_control_wl_start(net); - if (ret != 0) { - DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); - ret = -1; - goto exit; - } - -#endif + wl_control_wl_start(net); +#endif ifidx = dhd_net2idx(dhd, net); DHD_TRACE(("%s: ifidx %d\n", __FUNCTION__, ifidx)); @@ -2819,52 +2780,43 @@ dhd_open(struct net_device *net) if (!dhd_download_fw_on_driverload) { ret = wl_android_wifi_on(net); if (ret != 0) { - DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); - ret = -1; + DHD_ERROR(("wl_android_wifi_on failed (%d)\n", ret)); goto exit; - } + } } else { -#ifdef SUPPORT_DEEP_SLEEP - /* Flags to indicate if we distingish +#ifdef CUSTOMER_HW_SAMSUNG + /* CSP#505233: Flags to indicate if we distingish * power off policy when user set the memu * "Keep Wi-Fi on during sleep" to "Never" */ if (sleep_never) { dhd_deepsleep(net, 0); sleep_never = 0; + } else { +#endif /* CUSTOMER_HW_SAMSUNG */ + if (fw_changed) { + wl_android_wifi_off(net); + msleep(300); + ret = wl_android_wifi_on(net); + if (ret != 0) { + DHD_ERROR(("wl_android_wifi_on failed (%d)\n", ret)); + goto exit; + } + } +#ifdef CUSTOMER_HW_SAMSUNG } -#endif /* SUPPORT_DEEP_SLEEP */ +#endif /* CUSTOMER_HW_SAMSUNG */ } -#endif +#endif /* WL_CFG80211 */ if (dhd->pub.busstate != DHD_BUS_DATA) { -#if defined(CUSTOMER_HW4) -#define WAIT_DHDBUS_READY 5 - /* Delay ifup until insmod completed in case of module type */ - if (dhd_download_fw_on_driverload) { - uint retry = 0; - - do { - OSL_DELAY(100*1000); - } while ((dhd->pub.busstate != DHD_BUS_DATA) && - (retry++ < WAIT_DHDBUS_READY)); - - if (dhd->pub.busstate != DHD_BUS_DATA) { - DHD_ERROR(("%s: call dev open before insmod complete!\n", - __FUNCTION__)); - ret = -1; - goto exit; - } + /* try to bring up bus */ + if ((ret = dhd_bus_start(&dhd->pub)) != 0) { + DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); + ret = -1; + goto exit; } - else -#endif /* CUSTOMER_HW4 */ - /* try to bring up bus */ - if ((ret = dhd_bus_start(&dhd->pub)) != 0) { - DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); - ret = -1; - goto exit; - } } @@ -2891,16 +2843,12 @@ dhd_open(struct net_device *net) /* Allow transmit calls */ netif_start_queue(net); dhd->pub.up = 1; - #ifdef BCMDBGFS dhd_dbg_init(&dhd->pub); #endif OLD_MOD_INC_USE_COUNT; exit: - if (ret) - dhd_stop(net); - DHD_OS_WAKE_UNLOCK(&dhd->pub); return ret; } @@ -2922,7 +2870,7 @@ int dhd_do_driver_init(struct net_device *net) DHD_TRACE(("Driver already Inititalized. Nothing to do")); return 0; } - DHD_ERROR(("%s: call dhd_open\n", __FUNCTION__)); + if (dhd_open(net) < 0) { DHD_ERROR(("Driver Init Failed \n")); return -1; @@ -2944,13 +2892,11 @@ dhd_osl_detach(osl_t *osh) DHD_ERROR(("%s: MEMORY LEAK %d bytes\n", __FUNCTION__, MALLOCED(osh))); } osl_detach(osh); -#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) dhd_registration_check = FALSE; up(&dhd_registration_sem); -#if defined(BCMLXSDMMC) up(&dhd_chipup_sem); #endif -#endif } int @@ -2993,7 +2939,6 @@ dhd_add_if(dhd_info_t *dhd, int ifidx, void *handle, char *name, up(&dhd->thr_sysioc_ctl.sema); } else ifp->net = (struct net_device *)handle; - if (ifidx == 0) { ifp->event2cfg80211 = TRUE; } @@ -3029,11 +2974,7 @@ static struct net_device_ops dhd_ops_pri = { .ndo_do_ioctl = dhd_ioctl_entry, .ndo_start_xmit = dhd_start_xmit, .ndo_set_mac_address = dhd_set_mac_address, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) - .ndo_set_rx_mode = dhd_set_multicast_list, -#else .ndo_set_multicast_list = dhd_set_multicast_list, -#endif }; static struct net_device_ops dhd_ops_virt = { @@ -3041,11 +2982,7 @@ static struct net_device_ops dhd_ops_virt = { .ndo_do_ioctl = dhd_ioctl_entry, .ndo_start_xmit = dhd_start_xmit, .ndo_set_mac_address = dhd_set_mac_address, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) - .ndo_set_rx_mode = dhd_set_multicast_list, -#else .ndo_set_multicast_list = dhd_set_multicast_list, -#endif }; #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) */ @@ -3058,22 +2995,29 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) dhd_attach_states_t dhd_state = DHD_ATTACH_STATE_INIT; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); +#ifdef BCM4334_CHECK_CHIP_REV + DHD_ERROR(("CHIP VER = [0x%x]\n", g_chipver)); + if (g_chipver == 1) { + DHD_ERROR(("----- CHIP bcm4334_B0 -----\n")); + strcpy(chipver_tag, "_b0"); + } else if (g_chipver == 2) { + DHD_ERROR(("----- CHIP bcm4334_B1 -----\n")); + strcpy(chipver_tag, "_b1"); + } else if (g_chipver == 3) { + DHD_ERROR(("----- CHIP bcm4334_B2 -----\n")); + strcpy(chipver_tag, "_b2"); + } + else { + DHD_ERROR(("----- Invalid chip version -----\n")); + goto fail; + } +#endif /* BCM4334_CHECK_CHIP_REV */ + /* updates firmware nvram path if it was provided as module parameters */ - if (strlen(firmware_path) != 0) { - strncpy(fw_path, firmware_path, sizeof(fw_path) - 1); - fw_path[sizeof(fw_path) - 1] = '\0'; - } - if (strlen(nvram_path) != 0) { - strncpy(nv_path, nvram_path, sizeof(nv_path) -1); - nv_path[sizeof(nv_path) -1] = '\0'; - } -#if defined(SUPPORT_MULTIPLE_REVISION) - if (strlen(fw_path) != 0 && - concate_revision(bus, fw_path, MOD_PARAM_PATHLEN) != 0) { - DHD_ERROR(("%s: fail to concatnate revison \n", __FUNCTION__)); - goto fail; - } -#endif + if ((strlen(firmware_path) != 0) && (firmware_path[0] != '\0')) + strcpy(fw_path, firmware_path); + if ((strlen(nvram_path) != 0) && (nvram_path[0] != '\0')) + strcpy(nv_path, nvram_path); /* Allocate etherdev, including space for private structure */ if (!(net = alloc_etherdev(sizeof(dhd)))) { @@ -3092,8 +3036,9 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) #ifdef DHDTHREAD dhd->thr_dpc_ctl.thr_pid = DHD_PID_KT_TL_INVALID; dhd->thr_wdt_ctl.thr_pid = DHD_PID_KT_INVALID; -#endif /* DHDTHREAD */ +#else dhd->dhd_tasklet_create = FALSE; +#endif /* DHDTHREAD */ dhd->thr_sysioc_ctl.thr_pid = DHD_PID_KT_INVALID; dhd_state |= DHD_ATTACH_STATE_DHD_ALLOC; @@ -3149,16 +3094,16 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) /* Initialize Wakelock stuff */ spin_lock_init(&dhd->wakelock_spinlock); dhd->wakelock_counter = 0; - dhd->wakelock_rx_timeout_enable = 0; - dhd->wakelock_ctrl_timeout_enable = 0; + dhd->wakelock_timeout_enable = 0; #ifdef CONFIG_HAS_WAKELOCK wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); - wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); +#ifdef PNO_SUPPORT + wake_lock_init(&dhd->pub.pno_wakelock, WAKE_LOCK_SUSPEND, "pno_wake_lock"); +#endif #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 mutex_init(&dhd->dhd_net_if_mutex); - mutex_init(&dhd->dhd_suspend_mutex); #endif dhd_state |= DHD_ATTACH_STATE_WAKELOCKS_INIT; @@ -3208,11 +3153,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) if (dhd_dpc_prio >= 0) { /* Initialize watchdog thread */ -#ifdef USE_KTHREAD_API - PROC_START2(dhd_watchdog_thread, dhd, &dhd->thr_wdt_ctl, 0, "dhd_watchdog_thread"); -#else PROC_START(dhd_watchdog_thread, dhd, &dhd->thr_wdt_ctl, 0); -#endif } else { dhd->thr_wdt_ctl.thr_pid = -1; } @@ -3220,11 +3161,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) /* Set up the bottom half handler */ if (dhd_dpc_prio >= 0) { /* Initialize DPC thread */ -#ifdef USE_KTHREAD_API - PROC_START2(dhd_dpc_thread, dhd, &dhd->thr_dpc_ctl, 0, "dhd_dpc"); -#else PROC_START(dhd_dpc_thread, dhd, &dhd->thr_dpc_ctl, 0); -#endif } else { /* use tasklet for dpc */ tasklet_init(&dhd->tasklet, dhd_dpc, (ulong)dhd); @@ -3237,18 +3174,12 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) #endif /* DHDTHREAD */ if (dhd_sysioc) { -#ifdef USE_KTHREAD_API - PROC_START2(_dhd_sysioc_thread, dhd, &dhd->thr_sysioc_ctl, 0, "dhd_sysioc"); -#else PROC_START(_dhd_sysioc_thread, dhd, &dhd->thr_sysioc_ctl, 0); -#endif } else { dhd->thr_sysioc_ctl.thr_pid = -1; } dhd_state |= DHD_ATTACH_STATE_THREADS_CREATED; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) - INIT_WORK(&dhd->work_hang, dhd_hang_process); -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ + /* * Save the dhd_info into the priv */ @@ -3258,7 +3189,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) register_pm_notifier(&dhd_sleep_pm_notifier); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) +#ifdef CONFIG_HAS_EARLYSUSPEND dhd->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 20; dhd->early_suspend.suspend = dhd_early_suspend; dhd->early_suspend.resume = dhd_late_resume; @@ -3295,6 +3226,7 @@ dhd_bus_start(dhd_pub_t *dhdp) int ret = -1; dhd_info_t *dhd = (dhd_info_t*)dhdp->info; unsigned long flags; + char *down_path; ASSERT(dhd); @@ -3308,13 +3240,19 @@ dhd_bus_start(dhd_pub_t *dhdp) /* try to download image and nvram to the dongle */ if ((dhd->pub.busstate == DHD_BUS_DOWN) && - (fw_path != NULL) && (fw_path[0] != '\0') && - (nv_path != NULL) && (nv_path[0] != '\0')) { + (fw_path[0] != '\0') && + (nv_path[0] != '\0')) { + down_path = fw_path; +#if defined(BCM4334_CHECK_CHIP_REV) + strcpy(fw_down_path, fw_path); + strcat(fw_down_path, chipver_tag); + down_path = fw_down_path; +#endif /* wake lock moved to dhdsdio_download_firmware */ if (!(dhd_bus_download_firmware(dhd->pub.bus, dhd->pub.osh, - fw_path, nv_path))) { - DHD_ERROR(("%s: dhdsdio_probe_download failed. firmware or nvram path is wrong\n", - __FUNCTION__)); + down_path, nv_path))) { + DHD_ERROR(("%s: dhdsdio_probe_download failed. firmware = %s nvram = %s\n", + __FUNCTION__, down_path, nv_path)); #ifdef DHDTHREAD if (dhd->threads_only) dhd_os_sdunlock(dhdp); @@ -3344,7 +3282,7 @@ dhd_bus_start(dhd_pub_t *dhdp) #endif /* DHDTHREAD */ return ret; } -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) /* Host registration for OOB interrupt */ if (bcmsdh_register_oob_intr(dhdp)) { /* deactivate timer and wait for the handler to finish */ @@ -3362,11 +3300,9 @@ dhd_bus_start(dhd_pub_t *dhdp) return -ENODEV; } -#ifndef BCMSPI_ANDROID /* Enable oob at firmware */ dhd_enable_oob_intr(dhd->pub.bus, TRUE); -#endif /* !BCMSPI_ANDROID */ -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ /* If bus is not ready, can't come up */ if (dhd->pub.busstate != DHD_BUS_DATA) { @@ -3387,13 +3323,7 @@ dhd_bus_start(dhd_pub_t *dhdp) dhd_os_sdunlock(dhdp); #endif /* DHDTHREAD */ -#ifdef BCMSDIOH_TXGLOM - if ((dhd->pub.busstate == DHD_BUS_DATA) && bcmsdh_glom_enabled()) { - dhd_txglom_enable(dhdp, TRUE); - } -#endif - -#ifdef CUSTOMER_HW4 +#ifdef CUSTOMER_HW_SAMSUNG #ifdef USE_CID_CHECK dhd_check_module_cid(dhdp); #endif @@ -3409,28 +3339,20 @@ dhd_bus_start(dhd_pub_t *dhdp) #ifdef RDWR_KORICS_MACADDR dhd_write_rdwr_korics_macaddr(dhd, &dhd->pub.mac); #endif -#else -#ifdef READ_MACADDR - dhd_read_macaddr(dhd); -#endif -#endif /* CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW_SAMSUNG */ /* Bus is ready, do any protocol initialization */ if ((ret = dhd_prot_init(&dhd->pub)) < 0) return ret; -#ifdef CUSTOMER_HW4 +#ifdef CUSTOMER_HW_SAMSUNG #ifdef RDWR_MACADDR dhd_write_rdwr_macaddr(&dhd->pub.mac); #endif #ifdef WRITE_MACADDR dhd_write_macaddr(&dhd->pub.mac); #endif -#else -#ifdef WRITE_MACADDR - dhd_write_macaddr(dhd->pub.mac.octet); -#endif -#endif /* CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW_SAMSUNG */ #ifdef ARP_OFFLOAD_SUPPORT if (dhd->pend_ipaddr) { @@ -3450,53 +3372,36 @@ dhd_bus_start(dhd_pub_t *dhdp) * firmware and accordingly enable concurrent mode (Apply P2P settings). SoftAP firmware * would still be named as fw_bcmdhd_apsta. */ -int -dhd_get_concurrent_capabilites(dhd_pub_t *dhd) +bool +dhd_concurrent_fw(dhd_pub_t *dhd) { - int ret = 0; + int i, ret = 0; char buf[WLC_IOCTL_SMLEN]; - bool vsdb_supported = false; - memset(buf, 0, sizeof(buf)); - bcm_mkiovar("cap", 0, 0, buf, sizeof(buf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), - FALSE, 0)) < 0) { - DHD_ERROR(("%s: Get Capability failed (error=%d)\n", - __FUNCTION__, ret)); - return 0; - } - if (strstr(buf, "vsdb")) { - vsdb_supported = true; - } - if (strstr(buf, "p2p") == NULL) { - DHD_TRACE(("Chip does not support p2p\n")); - return 0; - } - else { - /* Chip supports p2p but ensure that p2p is really implemented in firmware or not */ - memset(buf, 0, sizeof(buf)); - bcm_mkiovar("p2p", 0, 0, buf, sizeof(buf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), - FALSE, 0)) < 0) { - DHD_ERROR(("%s: Get P2P failed (error=%d)\n", __FUNCTION__, ret)); - return 0; - } - else { - if (buf[0] == 1) { - /* Chip supports p2p, now lets check for vsdb */ - if (vsdb_supported) - return 2; - else -#ifdef WL_ENABLE_P2P_IF - return 1; -#else - return 0; -#endif + char *cap[] = {"p2p", "mchan", "dsta", NULL}; + if ((!op_mode) && (strstr(fw_path, "_p2p") == NULL) && + (strstr(fw_path, "_apsta") == NULL)) { + /* Given path is for the STA firmware. Check whether VSDB + P2P support + * is present in the firmware. If so, set mode as P2P (concurrent support). + */ + for (i = 0; cap[i] != NULL; ) { + memset(buf, 0, sizeof(buf)); + bcm_mkiovar(cap[i++], 0, 0, buf, sizeof(buf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), + FALSE, 0)) < 0) { + DHD_TRACE(("%s: Get VSDB Capability(%s) failed (error=%d)\n", + __FUNCTION__, cap[i-1], ret)); + return 0; + } else if (buf[0] != 1) { + DHD_TRACE(("VSDB(%s) is not supported , ret : %d\n", + cap[i-1], buf[0])); + return 0; } } + return 1; } return 0; } -#endif +#endif /* !defined(AP) && defined(WLP2P) */ int dhd_preinit_ioctls(dhd_pub_t *dhd) { @@ -3504,73 +3409,89 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) char eventmask[WL_EVENTING_MASK_LEN]; char iovbuf[WL_EVENTING_MASK_LEN + 12]; /* Room for "event_msgs" + '\0' + bitvec */ -#if !defined(WL_CFG80211) uint up = 0; -#endif /* !defined(WL_CFG80211) */ uint power_mode = PM_FAST; uint32 dongle_align = DHD_SDALIGN; - uint32 glom = CUSTOM_GLOM_SETTING; +#if defined(BCM4334_CHIP) + uint32 glom = 5; /* 2012.02.21 for perfomance */ + uint32 bcn_li_bcn = 1; +#elif defined(BCM43241_CHIP) + uint32 glom = 1; +#else + uint32 glom = 0; +#endif #if defined(VSDB) || defined(ROAM_ENABLE) uint bcn_timeout = 8; #else uint bcn_timeout = 4; #endif -#ifdef ENABLE_BCN_LI_BCN_WAKEUP - uint32 bcn_li_bcn = 1; -#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ uint retry_max = 3; #if defined(ARP_OFFLOAD_SUPPORT) int arpoe = 1; #endif int scan_assoc_time = DHD_SCAN_ACTIVE_TIME; - int scan_unassoc_time = DHD_SCAN_UNASSOC_ACTIVE_TIME; + int scan_unassoc_time = 80; int scan_passive_time = DHD_SCAN_PASSIVE_TIME; char buf[WLC_IOCTL_SMLEN]; char *ptr; uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ +#ifdef CUSTOMER_HW_SAMSUNG #ifdef ROAM_ENABLE uint roamvar = 0; - int roam_trigger[2] = {-75, WLC_BAND_ALL}; + int roam_trigger[2] = {WL_AUTO_ROAM_TRIGGER, WLC_BAND_ALL}; int roam_scan_period[2] = {10, WLC_BAND_ALL}; int roam_delta[2] = {10, WLC_BAND_ALL}; + int roam_env_mode = AP_ENV_INDETERMINATE; #ifdef FULL_ROAMING_SCAN_PERIOD_60_SEC int roam_fullscan_period = 60; #else /* FULL_ROAMING_SCAN_PERIOD_60_SEC */ int roam_fullscan_period = 120; #endif /* FULL_ROAMING_SCAN_PERIOD_60_SEC */ #else -#ifdef DISABLE_BUILTIN_ROAM uint roamvar = 1; -#endif /* DISABLE_BUILTIN_ROAM */ #endif /* ROAM_ENABLE */ - +#ifdef WL_CFG80211 +#ifdef SOFTAP_DISABLE_WMM + uint32 wme = 0; +#endif /* SOFTAP_DISABLE_WMM */ + uint32 vlan_mode = 0; +#endif /* WL_CFG80211 */ +#endif /* CUSTOMER_HW_SAMSUNG */ #if defined(SOFTAP) uint dtim = 1; #endif #if (defined(AP) && !defined(WLP2P)) || (!defined(AP) && defined(WL_CFG80211)) uint32 mpc = 0; /* Turn MPC off for AP/APSTA mode */ - struct ether_addr p2p_ea; #endif #if defined(AP) || defined(WLP2P) uint32 apsta = 1; /* Enable APSTA mode */ + struct ether_addr p2p_ea; #endif /* defined(AP) || defined(WLP2P) */ #ifdef GET_CUSTOM_MAC_ENABLE struct ether_addr ea_addr; #endif /* GET_CUSTOM_MAC_ENABLE */ #ifdef OKC_SUPPORT uint32 okc = 1; -#endif -#ifdef AMPDU_HOSTREORDER - uint32 hostreorder = 1; -#endif -#if defined(VSDB) && defined(CUSTOMER_HW4) +#endif /* OKC_SUPPORT */ + +#ifdef VLAN_MODE_OFF + int vlanmode = 0; +#endif /* VLAN_MODE_OFF */ +#ifdef BCM43241_CHIP + int mimo_bw_cap = 2; +#endif /* BCM43241_CHIP */ +#ifdef AUTOCOUNTRY + int autocountry = 1; +#endif +#ifdef VSDB int interference_mode = 3; #endif #ifdef PROP_TXSTATUS dhd->wlfc_enabled = FALSE; /* enable WLFC only if the firmware is VSDB */ #endif /* PROP_TXSTATUS */ + DHD_TRACE(("Enter %s\n", __FUNCTION__)); dhd->op_mode = 0; #ifdef GET_CUSTOM_MAC_ENABLE @@ -3583,7 +3504,6 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) DHD_ERROR(("%s: can't set MAC address , error=%d\n", __FUNCTION__, ret)); return BCME_NOTUP; } - memcpy(dhd->mac.octet, ea_addr.octet, ETHER_ADDR_LEN); } else { #endif /* GET_CUSTOM_MAC_ENABLE */ /* Get the default device MAC address directly from firmware */ @@ -3601,22 +3521,13 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } #endif /* GET_CUSTOM_MAC_ENABLE */ - - if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == HOSTAPD_MASK)) { #ifdef SET_RANDOM_MAC_SOFTAP + if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == 0x02)) { uint rand_mac; -#endif - op_mode = HOSTAPD_MASK; -#if defined(ARP_OFFLOAD_SUPPORT) - arpoe = 0; -#endif -#ifdef PKT_FILTER_SUPPORT - dhd_pkt_filter_enable = FALSE; -#endif -#ifdef SET_RANDOM_MAC_SOFTAP + srandom32((uint)jiffies); rand_mac = random32(); - iovbuf[0] = 0x02; /* locally administered bit */ + iovbuf[0] = 0x02; /* locally administered bit */ iovbuf[1] = 0x1A; iovbuf[2] = 0x11; iovbuf[3] = (unsigned char)(rand_mac & 0x0F) | 0xF0; @@ -3629,66 +3540,90 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) DHD_ERROR(("%s: can't set MAC address , error=%d\n", __FUNCTION__, ret)); } else memcpy(dhd->mac.octet, iovbuf, ETHER_ADDR_LEN); + } #endif /* SET_RANDOM_MAC_SOFTAP */ -#if !defined(AP) && defined(WL_CFG80211) - /* Turn off MPC in AP mode */ - bcm_mkiovar("mpc", (char *)&mpc, 4, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, - sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s mpc for HostAPD failed %d\n", __FUNCTION__, ret)); - } -#endif - } - else { - int concurrent_capab = 0; - if ((!op_mode && strstr(fw_path, "_p2p") != NULL) || (op_mode == WFD_MASK)) { + DHD_TRACE(("Firmware = %s\n", fw_path)); +#if !defined(AP) && defined(WLP2P) + /* Check if firmware with WFD support used */ + if ((!op_mode && strstr(fw_path, "_p2p") != NULL) || (op_mode == 0x04) || + (dhd_concurrent_fw(dhd))) { + bcm_mkiovar("apsta", (char *)&apsta, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, + iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s APSTA for WFD failed ret= %d\n", __FUNCTION__, ret)); + } else if (!dhd_concurrent_fw(dhd)) { + dhd->op_mode |= WFD_MASK; #if defined(ARP_OFFLOAD_SUPPORT) arpoe = 0; -#endif -#ifdef PKT_FILTER_SUPPORT +#endif /* (ARP_OFFLOAD_SUPPORT) */ dhd_pkt_filter_enable = FALSE; -#endif - op_mode = WFD_MASK; } - else - op_mode = STA_MASK; -#if !defined(AP) && defined(WLP2P) - if ((concurrent_capab = dhd_get_concurrent_capabilites(dhd)) > 0) { - op_mode = STA_MASK | WFD_MASK; - if (concurrent_capab == 2) - op_mode = STA_MASK | WFD_MASK | CONCURRENT_MULTI_CHAN; + + memcpy(&p2p_ea, &dhd->mac, ETHER_ADDR_LEN); + ETHER_SET_LOCALADDR(&p2p_ea); + bcm_mkiovar("p2p_da_override", (char *)&p2p_ea, + ETHER_ADDR_LEN, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, + iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s p2p_da_override ret= %d\n", __FUNCTION__, ret)); + } else { + DHD_INFO(("dhd_preinit_ioctls: p2p_da_override succeeded\n")); } + } +#endif /* (ARP_OFFLOAD_SUPPORT) */ - /* Check if we are enabling p2p */ - if (op_mode & WFD_MASK) { - bcm_mkiovar("apsta", (char *)&apsta, 4, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, - iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s APSTA for WFD failed ret= %d\n", __FUNCTION__, ret)); - } +#if !defined(AP) && defined(WL_CFG80211) + /* Check if firmware with HostAPD support used */ + if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == 0x02)) { +#ifdef CUSTOMER_HW_SAMSUNG +#ifdef SOFTAP_DISABLE_WMM + /* WMM disable to avoid SoftAP hangup */ + bcm_mkiovar("wme", (char *)&wme, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s disable wme for HostAPD" + " failed %d\n", __FUNCTION__, ret)); + } +#endif /* SOFTAP_DISABLE_WMM */ - memcpy(&p2p_ea, &dhd->mac, ETHER_ADDR_LEN); - ETHER_SET_LOCALADDR(&p2p_ea); - bcm_mkiovar("p2p_da_override", (char *)&p2p_ea, - ETHER_ADDR_LEN, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, - iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s p2p_da_override ret= %d\n", __FUNCTION__, ret)); + /* VLAN tagging disable to avoid SoftAP hangup */ + bcm_mkiovar("vlan_mode", (char *)&vlan_mode, 4, + iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s disable VLAN tagging for" + " HostAPD failed %d\n", + __FUNCTION__, ret)); + } +#endif /* CUSTOMER_HW_SAMSUNG */ + /* Turn off MPC in AP mode */ + bcm_mkiovar("mpc", (char *)&mpc, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, 0)) < 0) { + DHD_ERROR(("%s mpc for HostAPD failed %d\n", __FUNCTION__, ret)); } else { - DHD_INFO(("dhd_preinit_ioctls: p2p_da_override succeeded\n")); + dhd->op_mode |= HOSTAPD_MASK; +#if defined(ARP_OFFLOAD_SUPPORT) + arpoe = 0; +#endif /* (ARP_OFFLOAD_SUPPORT) */ + dhd_pkt_filter_enable = FALSE; } + } +#endif /* (ARP_OFFLOAD_SUPPORT) */ + + if ((dhd->op_mode != WFD_MASK) && (dhd->op_mode != HOSTAPD_MASK)) { + /* STA only operation mode */ + dhd->op_mode |= STA_MASK; + dhd_pkt_filter_enable = TRUE; + if (dhd_concurrent_fw(dhd)) { + dhd->op_mode |= WFD_MASK; } -#else - (void)concurrent_capab; -#endif } - dhd->op_mode = op_mode; - DHD_ERROR(("Firmware up: op_mode=%d, " - "Broadcom Dongle Host Driver mac="MACDBG"\n", - dhd->op_mode, - STR_TO_MACD(dhd->mac.octet))); + DHD_ERROR(("Firmware up: op_mode=%d", dhd->op_mode)); + /* Set Country code */ if (dhd->dhd_cspec.ccode[0] != 0) { bcm_mkiovar("country", (char *)&dhd->dhd_cspec, @@ -3702,11 +3637,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) DHD_ERROR(("%s assoc_listen failed %d\n", __FUNCTION__, ret)); -#if defined(ROAM_ENABLE) || defined(DISABLE_BUILTIN_ROAM) +#ifdef CUSTOMER_HW_SAMSUNG /* Disable built-in roaming to allowed ext supplicant to take care of roaming */ bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* ROAM_ENABLE || DISABLE_BUILTIN_ROAM */ + #ifdef ROAM_ENABLE dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_TRIGGER, roam_trigger, sizeof(roam_trigger), TRUE, 0); dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_SCAN_PERIOD, roam_scan_period, @@ -3714,13 +3649,27 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_DELTA, roam_delta, sizeof(roam_delta), TRUE, 0); bcm_mkiovar("fullroamperiod", (char *)&roam_fullscan_period, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* ROAM_ENABLE */ + if (roam_trigger[0] == WL_AUTO_ROAM_TRIGGER) { + bcm_mkiovar("roam_env_detection", (char *)&roam_env_mode, 4, iovbuf, sizeof(iovbuf)); + if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) == BCME_OK) + dhd->roam_env_detection = TRUE; + else + dhd->roam_env_detection = FALSE; + } +#endif #ifdef OKC_SUPPORT bcm_mkiovar("okc_enable", (char *)&okc, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif +#ifdef AUTOCOUNTRY + bcm_mkiovar("autocountry", (char *)&autocountry, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif + +#endif /* CUSTOMER_HW_SAMSUNG */ + #ifdef CONFIG_CONTROL_PM sec_control_pm(dhd, &power_mode); #else @@ -3732,7 +3681,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcm_mkiovar("bus:txglomalign", (char *)&dongle_align, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - DHD_INFO(("%s set glom=0x%X\n", __FUNCTION__, glom)); + /* disable glom option per default */ bcm_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); @@ -3750,15 +3699,16 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* defined(AP) && !defined(WLP2P) */ -#if defined(CUSTOMER_HW4) && defined(MIMO_ANT_SETTING) - dhd_sel_ant_from_file(dhd); -#endif /* defined(CUSTOMER_HW4) && defined(MIMO_ANT_SETTING) */ +#ifdef BCM43241_CHIP + bcm_mkiovar("mimo_bw_cap", (char *)&mimo_bw_cap, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif #if defined(SOFTAP) if (ap_fw_loaded == TRUE) { dhd_wl_ioctl_cmd(dhd, WLC_SET_DTIMPRD, (char *)&dtim, sizeof(dtim), TRUE, 0); } -#endif +#endif #if defined(KEEP_ALIVE) { @@ -3767,11 +3717,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #if defined(SOFTAP) if (ap_fw_loaded == FALSE) -#endif - if ((dhd->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { - if ((res = dhd_keep_alive_onoff(dhd)) < 0) - DHD_ERROR(("%s set keeplive failed %d\n", - __FUNCTION__, res)); +#endif + if ((dhd->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { + if ((res = dhd_keep_alive_onoff(dhd)) < 0) + DHD_ERROR(("%s set keeplive failed %d\n", + __FUNCTION__, res)); } } #endif /* defined(KEEP_ALIVE) */ @@ -3788,7 +3738,6 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) setbit(eventmask, WLC_E_SET_SSID); setbit(eventmask, WLC_E_PRUNE); setbit(eventmask, WLC_E_AUTH); - setbit(eventmask, WLC_E_ASSOC); setbit(eventmask, WLC_E_REASSOC); setbit(eventmask, WLC_E_REASSOC_IND); setbit(eventmask, WLC_E_DEAUTH); @@ -3805,8 +3754,8 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) setbit(eventmask, WLC_E_ASSOC_RESP_IE); #ifndef WL_CFG80211 setbit(eventmask, WLC_E_PMKID_CACHE); - setbit(eventmask, WLC_E_TXFAIL); #endif + setbit(eventmask, WLC_E_TXFAIL); setbit(eventmask, WLC_E_JOIN_START); setbit(eventmask, WLC_E_SCAN_COMPLETE); #ifdef WLMEDIA_HTSF @@ -3815,12 +3764,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #ifdef PNO_SUPPORT setbit(eventmask, WLC_E_PFN_NET_FOUND); #endif /* PNO_SUPPORT */ +#ifdef USE_FW_TRACE + setbit(eventmask, WLC_E_TRACE); +#endif /* enable dongle roaming event */ setbit(eventmask, WLC_E_ROAM); -#ifdef BCMCCX - setbit(eventmask, WLC_E_ADDTS_IND); - setbit(eventmask, WLC_E_DELTS_IND); -#endif /* BCMCCX */ #ifdef WL_CFG80211 setbit(eventmask, WLC_E_ESCAN_RESULT); if ((dhd->op_mode & WFD_MASK) == WFD_MASK) { @@ -3829,12 +3777,13 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) setbit(eventmask, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE); setbit(eventmask, WLC_E_P2P_DISC_LISTEN_COMPLETE); } -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - else { - setbit(eventmask, WLC_E_ACTION_FRAME_RX); - } -#endif /* WES_SUPPORT */ #endif /* WL_CFG80211 */ +#ifdef OKC_DEBUG + setbit(eventmask, WLC_E_ROAM_START); +#endif /* OKC_DEBUG */ +#ifdef CUSTOMER_HW_SAMSUNG + clrbit(eventmask, WLC_E_TXFAIL); +#endif /* Write updated Event mask */ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, sizeof(iovbuf)); @@ -3856,8 +3805,8 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) if (arpoe && !ap_fw_loaded) { #else if (arpoe) { -#endif - dhd_arp_offload_enable(dhd, TRUE); +#endif + dhd_arp_offload_enable(dhd, arpoe); dhd_arp_offload_set(dhd, dhd_arp_mode); } else { dhd_arp_offload_enable(dhd, FALSE); @@ -3866,53 +3815,49 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #endif /* ARP_OFFLOAD_SUPPORT */ #ifdef PKT_FILTER_SUPPORT - /* Setup default defintions for pktfilter , enable in suspend */ + /* Setup defintions for pktfilter , enable in suspend */ dhd->pktfilter_count = 1; - /* Setup filter to allow only unicast */ dhd->pktfilter[0] = "100 0 0 0 0x01 0x00"; -#ifdef CUSTOMER_HW4 -#if defined(BLOCK_IPV6_PACKET) - dhd->pktfilter[0] = "100 0 0 0 " - HEX_PREF_STR UNI_FILTER_STR ZERO_ADDR_STR ETHER_TYPE_STR IPV6_FILTER_STR - " " - HEX_PREF_STR ZERO_ADDR_STR ZERO_ADDR_STR ETHER_TYPE_STR ZERO_TYPE_STR; -#endif /* BLOCK_IPV6_PACKET */ -#if defined(PASS_IPV4_SUSPEND) - dhd->pktfilter_count = 2; - dhd->pktfilter[1] = "104 0 0 0 0xFFFFFF 0x01005E"; -#endif -#endif /* CUSTOMER_HW4 */ - #if defined(SOFTAP) if (ap_fw_loaded) { - dhd_enable_packet_filter(0, dhd); + int i; + for (i = 0; i < dhd->pktfilter_count; i++) { + dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], + 0, dhd_master_mode); + } } #endif /* defined(SOFTAP) */ - dhd_set_packet_filter(dhd); + if (dhd->pktfilter_count) { + int i; + + for (i = 0; i < dhd->pktfilter_count; i++) + dhd_pktfilter_offload_set(dhd, dhd->pktfilter[i]); + } #endif /* PKT_FILTER_SUPPORT */ -#ifdef AMPDU_HOSTREORDER - bcm_mkiovar("ampdu_hostreorder", (char *)&hostreorder, 4, buf, sizeof(buf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); -#endif /* AMPDU_HOSTREORDER */ -#if !defined(WL_CFG80211) +#ifdef VLAN_MODE_OFF + bcm_mkiovar("vlan_mode", (char *)&vlanmode, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); +#endif /* VLAN_MODE_OFF */ +#ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE + if (dhd_customer_set_country(dhd) < 0) + DHD_ERROR(("%s: can't set country \n", __FUNCTION__)); +#endif + /* Force STA UP */ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_UP, (char *)&up, sizeof(up), TRUE, 0)) < 0) { DHD_ERROR(("%s Setting WL UP failed %d\n", __FUNCTION__, ret)); goto done; } +#ifdef VSDB + dhd_wl_ioctl_cmd(dhd, WLC_SET_INTERFERENCE_MODE, (int *)&interference_mode, sizeof(int), TRUE, 0); #endif -#if defined(VSDB) && defined(CUSTOMER_HW4) - dhd_wl_ioctl_cmd(dhd, WLC_SET_INTERFERENCE_MODE, - (int *)&interference_mode, sizeof(int), TRUE, 0); -#endif - -#ifdef ENABLE_BCN_LI_BCN_WAKEUP +#ifdef BCM4334_CHIP bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ +#endif /* query for 'ver' to get version info from firmware */ memset(buf, 0, sizeof(buf)); @@ -3924,18 +3869,6 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcmstrtok(&ptr, "\n", 0); /* Print fw version info */ DHD_ERROR(("Firmware version = %s\n", buf)); - - dhd_set_version_info(dhd, buf); - - DHD_BLOG(buf, strlen(buf) + 1); - DHD_BLOG(dhd_version, strlen(dhd_version) + 1); - - /* Check and adjust IOCTL response timeout for Manufactring firmware */ - if (strstr(buf, MANUFACTRING_FW) != NULL) { - dhd_os_set_ioctl_resp_timeout(IOCTL_RESP_TIMEOUT * 10); - DHD_ERROR(("%s : adjust IOCTL response time for Manufactring Firmware\n", - __FUNCTION__)); - } } done: @@ -4103,7 +4036,7 @@ static int dhd_device_event(struct notifier_block *this, if (!(ifa->ifa_label[strlen(ifa->ifa_label)-2] == 0x3a)) { /* 0x3a = ':' */ DHD_ARPOE(("%s: primary interface is down, AOE clr all\n", - __FUNCTION__)); + __FUNCTION__)); dhd_aoe_hostip_clr(&dhd->pub); dhd_aoe_arp_clr(&dhd->pub); } else @@ -4124,7 +4057,6 @@ static int dhd_device_event(struct notifier_block *this, return NOTIFY_DONE; } #endif /* ARP_OFFLOAD_SUPPORT */ - int dhd_net_attach(dhd_pub_t *dhdp, int ifidx) { @@ -4133,7 +4065,7 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx) int err = 0; uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x11, 0x22, 0x33 }; - DHD_ERROR(("%s: ifidx %d\n", __FUNCTION__, ifidx)); + DHD_TRACE(("%s: ifidx %d\n", __FUNCTION__, ifidx)); ASSERT(dhd && dhd->iflist[ifidx]); @@ -4164,8 +4096,7 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx) #else net->netdev_ops = &dhd_ops_pri; #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) */ - if (!ETHER_ISNULLADDR(dhd->pub.mac.octet)) - memcpy(temp_addr, dhd->pub.mac.octet, ETHER_ADDR_LEN); + memcpy(temp_addr, dhd->pub.mac.octet, ETHER_ADDR_LEN); } else { /* * We have to use the primary MAC for virtual interfaces @@ -4206,25 +4137,19 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx) DHD_ERROR(("couldn't register the net device, err %d\n", err)); goto fail; } - printf("Broadcom Dongle Host Driver: register interface [%s]" - " MAC: "MACDBG"\n", - net->name, -#if defined(CUSTOMER_HW4) - STR_TO_MACD(dhd->pub.mac.octet)); -#else - STR_TO_MACD(net->dev_addr)); -#endif /* CUSTOMER_HW4 */ + printf("Broadcom Dongle Host Driver: register interface [%s]", + net->name); #if defined(SOFTAP) && defined(CONFIG_WIRELESS_EXT) && !defined(WL_CFG80211) wl_iw_iscan_set_scan_broadcast_prep(net, 1); #endif -#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) if (ifidx == 0) { dhd_registration_check = TRUE; up(&dhd_registration_sem); } -#endif +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ return 0; fail: @@ -4259,9 +4184,9 @@ dhd_bus_detach(dhd_pub_t *dhdp) dhd_bus_stop(dhd->pub.bus, TRUE); } -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) bcmsdh_unregister_oob_intr(); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ } } } @@ -4282,35 +4207,44 @@ void dhd_detach(dhd_pub_t *dhdp) DHD_TRACE(("%s: Enter state 0x%x\n", __FUNCTION__, dhd->dhd_state)); +#ifdef CUSTOMER_HW_SAMSUNG + /* + * CSP #506108 + * kernel panic issue when first bootup time, + * rmmod without interface down make unnecessary hang event. + */ dhd->pub.up = 0; +#endif + if (!(dhd->dhd_state & DHD_ATTACH_STATE_DONE)) { /* Give sufficient time for threads to start running in case * dhd_attach() has failed */ osl_delay(1000*100); } - +#ifdef CUSTOMER_HW_SAMSUNG + /* CSP#482857: Change the location of dhd_bus_detach() + * to avoid Kernel panic problem + */ if (dhd->dhd_state & DHD_ATTACH_STATE_PROT_ATTACH) { dhd_bus_detach(dhdp); if (dhdp->prot) dhd_prot_detach(dhdp); } +#endif /* CUSTOMER_HW_SAMSUNG */ #ifdef ARP_OFFLOAD_SUPPORT unregister_inetaddr_notifier(&dhd_notifier); #endif /* ARP_OFFLOAD_SUPPORT */ -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) +#if defined(CONFIG_HAS_EARLYSUSPEND) if (dhd->dhd_state & DHD_ATTACH_STATE_EARLYSUSPEND_DONE) { if (dhd->early_suspend.suspend) unregister_early_suspend(&dhd->early_suspend); } #endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - cancel_work_sync(&dhd->work_hang); -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ #if defined(CONFIG_WIRELESS_EXT) if (dhd->dhd_state & DHD_ATTACH_STATE_WL_ATTACH) { @@ -4329,21 +4263,20 @@ void dhd_detach(dhd_pub_t *dhdp) dhd_if_t *ifp; /* Cleanup virtual interfaces */ - for (i = 1; i < DHD_MAX_IFS; i++) { - dhd_net_if_lock_local(dhd); + for (i = 1; i < DHD_MAX_IFS; i++) if (dhd->iflist[i]) { dhd->iflist[i]->state = DHD_IF_DEL; dhd->iflist[i]->idx = i; dhd_op_if(dhd->iflist[i]); } - dhd_net_if_unlock_local(dhd); - } /* delete primary interface 0 */ ifp = dhd->iflist[0]; ASSERT(ifp); ASSERT(ifp->net); - if (ifp && ifp->net) { + if (ifp && ifp->net) + { + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) if (ifp->net->open) #else @@ -4380,6 +4313,14 @@ void dhd_detach(dhd_pub_t *dhdp) #endif /* DHDTHREAD */ tasklet_kill(&dhd->tasklet); } +#ifndef CUSTOMER_HW_SAMSUNG + if (dhd->dhd_state & DHD_ATTACH_STATE_PROT_ATTACH) { + dhd_bus_detach(dhdp); + + if (dhdp->prot) + dhd_prot_detach(dhdp); + } +#endif /* CUSTOMER_HW_SAMSUNG */ #ifdef WL_CFG80211 if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { @@ -4397,12 +4338,13 @@ void dhd_detach(dhd_pub_t *dhdp) if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) { #ifdef CONFIG_HAS_WAKELOCK dhd->wakelock_counter = 0; - dhd->wakelock_rx_timeout_enable = 0; - dhd->wakelock_ctrl_timeout_enable = 0; + dhd->wakelock_timeout_enable = 0; wake_lock_destroy(&dhd->wl_wifi); wake_lock_destroy(&dhd->wl_rxwake); - wake_lock_destroy(&dhd->wl_ctrlwake); -#endif /* CONFIG_HAS_WAKELOCK */ +#ifdef PNO_SUPPORT + wake_lock_destroy(&dhdp->pno_wakelock); +#endif +#endif } } @@ -4458,10 +4400,10 @@ dhd_module_init(void) { int error = 0; -#if 1 && defined(BCMLXSDMMC) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) +#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) int retry = POWERUP_MAX_RETRY; int chip_up = 0; -#endif +#endif DHD_TRACE(("%s: Enter\n", __FUNCTION__)); @@ -4481,7 +4423,7 @@ dhd_module_init(void) DHD_ERROR(("Invalid module parameters.\n")); return -EINVAL; } while (0); -#endif +#endif #if 1 && defined(BCMLXSDMMC) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) do { @@ -4519,18 +4461,15 @@ dhd_module_init(void) if (wl_android_wifictrl_func_add() < 0) goto fail_1; #endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ - -#endif +#endif /* BCMLXSDMMC */ #if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) sema_init(&dhd_registration_sem, 0); -#endif - - +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ error = dhd_bus_register(); if (!error) - printf("\n%s\n", dhd_version); + DHD_TRACE(("%s: \n%s\n", __FUNCTION__, dhd_version)); else { DHD_ERROR(("%s: sdio_register_driver failed\n", __FUNCTION__)); goto fail_1; @@ -4542,11 +4481,15 @@ dhd_module_init(void) * It's needed to make sync up exit from dhd insmod and * Kernel MMC sdio device callback registration */ - if ((down_timeout(&dhd_registration_sem, - msecs_to_jiffies(DHD_REGISTRATION_TIMEOUT)) != 0) || - (dhd_registration_check != TRUE)) { + if (down_timeout(&dhd_registration_sem, msecs_to_jiffies(DHD_REGISTRATION_TIMEOUT)) != 0) { error = -ENODEV; - DHD_ERROR(("%s: sdio_register_driver timeout or error \n", __FUNCTION__)); + DHD_ERROR(("%s: sdio_register_driver timeout\n", __FUNCTION__)); + goto fail_2; + } + if (dhd_registration_check != TRUE) + { + error = -ENODEV; + DHD_ERROR(("%s: sdio_register_driver fail\n", __FUNCTION__)); goto fail_2; } #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ @@ -4565,7 +4508,7 @@ fail_1: #if defined(CONFIG_WIFI_CONTROL_FUNC) wl_android_wifictrl_func_del(); -#endif +#endif /* Call customer gpio to turn off power with WL_REG_ON signal */ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF); @@ -4626,16 +4569,36 @@ int dhd_os_ioctl_resp_wait(dhd_pub_t *pub, uint *condition, bool *pending) { dhd_info_t * dhd = (dhd_info_t *)(pub->info); - int timeout; + DECLARE_WAITQUEUE(wait, current); + int timeout = dhd_ioctl_timeout_msec; /* Convert timeout in millsecond to jiffies */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - timeout = msecs_to_jiffies(dhd_ioctl_timeout_msec); + timeout = msecs_to_jiffies(timeout); #else - timeout = dhd_ioctl_timeout_msec * HZ / 1000; + timeout = timeout * HZ / 1000; #endif - timeout = wait_event_timeout(dhd->ioctl_resp_wait, (*condition), timeout); + /* Wait until control frame is available */ + add_wait_queue(&dhd->ioctl_resp_wait, &wait); + set_current_state(TASK_INTERRUPTIBLE); + + /* Memory barrier to support multi-processing + * As the variable "condition", which points to dhd->rxlen (dhd_bus_rxctl[dhd_sdio.c]) + * Can be changed by another processor. + */ + smp_mb(); + while (!(*condition) && (!signal_pending(current) && timeout)) { + timeout = schedule_timeout(timeout); + smp_mb(); + } + + if (signal_pending(current)) + *pending = TRUE; + + set_current_state(TASK_RUNNING); + remove_wait_queue(&dhd->ioctl_resp_wait, &wait); + return timeout; } @@ -4645,7 +4608,7 @@ dhd_os_ioctl_resp_wake(dhd_pub_t *pub) dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (waitqueue_active(&dhd->ioctl_resp_wait)) { - wake_up(&dhd->ioctl_resp_wait); + wake_up_interruptible(&dhd->ioctl_resp_wait); } return 0; @@ -4671,10 +4634,11 @@ dhd_os_wd_timer(void *bus, uint wdtick) return; } - /* totally stop the timer */ + /* Totally stop the timer */ if (!wdtick && dhd->wd_timer_valid == TRUE) { dhd->wd_timer_valid = FALSE; dhd_os_spin_unlock(pub, flags); + if (dhd) #ifdef DHDTHREAD del_timer_sync(&dhd->timer); #else @@ -4686,7 +4650,7 @@ dhd_os_wd_timer(void *bus, uint wdtick) if (wdtick) { dhd_watchdog_ms = (uint)wdtick; /* Re arm the timer, at last watchdog period */ - mod_timer(&dhd->timer, jiffies + msecs_to_jiffies(dhd_watchdog_ms)); + mod_timer(&dhd->timer, jiffies + dhd_watchdog_ms * HZ / 1000); dhd->wd_timer_valid = TRUE; } dhd_os_spin_unlock(pub, flags); @@ -4985,7 +4949,7 @@ dhd_sendup_event(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data) else { /* Could not allocate a sk_buf */ DHD_ERROR(("%s: unable to alloc sk_buf", __FUNCTION__)); - } +} break; } /* case WLC_E_BTA_HCI_EVENT */ #endif /* WLBTAMP */ @@ -4999,17 +4963,10 @@ void dhd_wait_for_event(dhd_pub_t *dhd, bool *lockvar) { #if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) struct dhd_info *dhdinfo = dhd->info; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - int timeout = msecs_to_jiffies(2000); -#else - int timeout = 2 * HZ; -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ - dhd_os_sdunlock(dhd); - wait_event_timeout(dhdinfo->ctrl_wait, (*lockvar == FALSE), timeout); + wait_event_interruptible_timeout(dhdinfo->ctrl_wait, (*lockvar == FALSE), HZ * 5); dhd_os_sdlock(dhd); -#endif +#endif return; } @@ -5018,7 +4975,7 @@ void dhd_wait_event_wakeup(dhd_pub_t *dhd) #if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) struct dhd_info *dhdinfo = dhd->info; if (waitqueue_active(&dhdinfo->ctrl_wait)) - wake_up(&dhdinfo->ctrl_wait); + wake_up_interruptible(&dhdinfo->ctrl_wait); #endif return; } @@ -5030,13 +4987,6 @@ dhd_dev_reset(struct net_device *dev, uint8 flag) dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - if (flag == TRUE) { - /* Issue wl down command before resetting the chip */ - if (dhd_wl_ioctl_cmd(&dhd->pub, WLC_DOWN, NULL, 0, TRUE, 0) < 0) { - DHD_TRACE(("%s: wl down failed\n", __FUNCTION__)); - } - } - ret = dhd_bus_devreset(&dhd->pub, flag); if (ret) { DHD_ERROR(("%s: dhd_bus_devreset: %d\n", __FUNCTION__, ret)); @@ -5058,18 +5008,16 @@ int net_os_set_suspend_disable(struct net_device *dev, int val) return ret; } -int net_os_set_suspend(struct net_device *dev, int val, int force) +int net_os_set_suspend(struct net_device *dev, int val) { int ret = 0; +#if defined(CONFIG_HAS_EARLYSUSPEND) dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); if (dhd) { -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ret = dhd_set_suspend(val, &dhd->pub); -#else - ret = dhd_suspend_resume_helper(dhd, val, force); -#endif } +#endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ return ret; } @@ -5083,13 +5031,12 @@ int net_os_set_dtim_skip(struct net_device *dev, int val) return 0; } -#ifdef PKT_FILTER_SUPPORT int net_os_rxfilter_add_remove(struct net_device *dev, int add_remove, int num) { return 0; } -int net_os_enable_packet_filter(struct net_device *dev, int val) +int net_os_set_packet_filter(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); int ret = 0; @@ -5102,24 +5049,26 @@ int net_os_enable_packet_filter(struct net_device *dev, int val) if (dhd && dhd->pub.up) { if (dhd->pub.in_suspend) { if (!val || (val && !dhd->pub.suspend_disable_flag)) { - dhd_enable_packet_filter(val, &dhd->pub); + int i; + for (i = 0; i < dhd->pub.pktfilter_count; i++) + dhd_pktfilter_offload_enable(&dhd->pub, dhd->pub.pktfilter[i], + val, dhd_master_mode); } } } return ret; } -#endif /* PKT_FILTER_SUPPORT */ -int + +void dhd_dev_init_ioctl(struct net_device *dev) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); -#if defined(USE_STAMAC_4SOFTAP) - /* Writing STA's MAC ID to the Dongle for SOFTAP */ - if (_dhd_set_mac_address(dhd, 0, &dhd->pub.mac) == 0) - DHD_INFO(("dhd_bus_start: MAC ID is overwritten\n")); -#endif - return dhd_preinit_ioctls(&dhd->pub); + /* Writing STA's MAC ID to the Dongle for SOFTAP */ + if (_dhd_set_mac_address(dhd, 0, &dhd->pub.mac) == 0) + DHD_INFO(("dhd_bus_start: MAC ID is overwritten\n")); + + dhd_preinit_ioctls(&dhd->pub); } #ifdef PNO_SUPPORT @@ -5164,75 +5113,37 @@ dhd_dev_get_pno_status(struct net_device *dev) #endif /* PNO_SUPPORT */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) -static void dhd_hang_process(struct work_struct *work) +int net_os_send_hang_message(struct net_device *dev) { - dhd_info_t *dhd; - struct net_device *dev; - - dhd = (dhd_info_t *)container_of(work, dhd_info_t, work_hang); - dev = dhd->iflist[0]->net; + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + int ret = 0; - if (dev) { - rtnl_lock(); - dev_close(dev); - rtnl_unlock(); -#if defined(WL_WIRELESS_EXT) - wl_iw_send_priv_event(dev, "HANG"); + if (dhd) { + if (!dhd->pub.hang_was_sent) { + dhd->pub.hang_was_sent = 1; +#if defined(CONFIG_WIRELESS_EXT) + ret = wl_iw_send_priv_event(dev, "HANG"); #endif #if defined(WL_CFG80211) - wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); + ret = wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); +#if !defined(CUSTOMER_HW_SAMSUNG) +#error do not use these it cause kernel panic + dev_close(dev); + dev_open(dev); #endif - } -} - -int dhd_os_send_hang_message(dhd_pub_t *dhdp) -{ - int ret = 0; - if (dhdp) { - if (!dhdp->hang_was_sent) { - dhdp->hang_was_sent = 1; - schedule_work(&dhdp->info->work_hang); +#endif /* WL_CFG80211 */ } } return ret; } -int net_os_send_hang_message(struct net_device *dev) -{ - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - int ret = 0; - - if (dhd) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - ret = dhd_os_send_hang_message(&dhd->pub); -#else - ret = wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); -#endif - return ret; -} -#endif /* (OEM_ANDROID) */ - void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - if (dhd && dhd->pub.up) { - memcpy(&dhd->pub.dhd_cspec, cspec, sizeof(wl_country_t)); -#ifdef WL_CFG80211 - wl_update_wiphybands(NULL); -#endif - } -} -void dhd_bus_band_set(struct net_device *dev, uint band) -{ - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - if (dhd && dhd->pub.up) { -#ifdef WL_CFG80211 - wl_update_wiphybands(NULL); -#endif - } -} + if (dhd && dhd->pub.up) + memcpy(&dhd->pub.dhd_cspec, cspec, sizeof(wl_country_t)); +} void dhd_net_if_lock(struct net_device *dev) { @@ -5262,24 +5173,6 @@ static void dhd_net_if_unlock_local(dhd_info_t *dhd) #endif } -static void dhd_suspend_lock(dhd_pub_t *pub) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 - dhd_info_t *dhd = (dhd_info_t *)(pub->info); - if (dhd) - mutex_lock(&dhd->dhd_suspend_mutex); -#endif -} - -static void dhd_suspend_unlock(dhd_pub_t *pub) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 - dhd_info_t *dhd = (dhd_info_t *)(pub->info); - if (dhd) - mutex_unlock(&dhd->dhd_suspend_mutex); -#endif -} - unsigned long dhd_os_spin_lock(dhd_pub_t *pub) { dhd_info_t *dhd = (dhd_info_t *)(pub->info); @@ -5305,13 +5198,13 @@ dhd_get_pend_8021x_cnt(dhd_info_t *dhd) return (atomic_read(&dhd->pend_8021x_cnt)); } -#define MAX_WAIT_FOR_8021X_TX 25 +#define MAX_WAIT_FOR_8021X_TX 10 int dhd_wait_pend8021x(struct net_device *dev) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - int timeout = msecs_to_jiffies(10); + int timeout = 10 * HZ / 1000; int ntimes = MAX_WAIT_FOR_8021X_TX; int pend = dhd_get_pend_8021x_cnt(dhd); @@ -5324,8 +5217,6 @@ dhd_wait_pend8021x(struct net_device *dev) } pend = dhd_get_pend_8021x_cnt(dhd); } - if (ntimes == 0) - DHD_ERROR(("%s: TIMEOUT\n", __FUNCTION__)); return pend; } @@ -5374,18 +5265,13 @@ int dhd_os_wake_lock_timeout(dhd_pub_t *pub) if (dhd) { spin_lock_irqsave(&dhd->wakelock_spinlock, flags); - ret = dhd->wakelock_rx_timeout_enable > dhd->wakelock_ctrl_timeout_enable ? - dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable; + ret = dhd->wakelock_timeout_enable; #ifdef CONFIG_HAS_WAKELOCK - if (dhd->wakelock_rx_timeout_enable) + if (dhd->wakelock_timeout_enable) wake_lock_timeout(&dhd->wl_rxwake, - msecs_to_jiffies(dhd->wakelock_rx_timeout_enable)); - if (dhd->wakelock_ctrl_timeout_enable) - wake_lock_timeout(&dhd->wl_ctrlwake, - msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable)); + msecs_to_jiffies(dhd->wakelock_timeout_enable)); #endif - dhd->wakelock_rx_timeout_enable = 0; - dhd->wakelock_ctrl_timeout_enable = 0; + dhd->wakelock_timeout_enable = 0; spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); } return ret; @@ -5400,52 +5286,43 @@ int net_os_wake_lock_timeout(struct net_device *dev) ret = dhd_os_wake_lock_timeout(&dhd->pub); return ret; } - -int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val) +#if defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) +int net_os_wake_lock_timeout_for_pno(struct net_device *dev, int sec) { - dhd_info_t *dhd = (dhd_info_t *)(pub->info); + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + int ret = 0; unsigned long flags; if (dhd) { spin_lock_irqsave(&dhd->wakelock_spinlock, flags); - if (val > dhd->wakelock_rx_timeout_enable) - dhd->wakelock_rx_timeout_enable = val; + wake_lock_timeout(&dhd->pub.pno_wakelock, HZ * sec); spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); } - return 0; + return ret; } +#endif -int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val) +int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub, int val) { dhd_info_t *dhd = (dhd_info_t *)(pub->info); unsigned long flags; if (dhd) { spin_lock_irqsave(&dhd->wakelock_spinlock, flags); - if (val > dhd->wakelock_ctrl_timeout_enable) - dhd->wakelock_ctrl_timeout_enable = val; + if (val > dhd->wakelock_timeout_enable) + dhd->wakelock_timeout_enable = val; spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); } return 0; } -int net_os_wake_lock_rx_timeout_enable(struct net_device *dev, int val) +int net_os_wake_lock_timeout_enable(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); int ret = 0; if (dhd) - ret = dhd_os_wake_lock_rx_timeout_enable(&dhd->pub, val); - return ret; -} - -int net_os_wake_lock_ctrl_timeout_enable(struct net_device *dev, int val) -{ - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - int ret = 0; - - if (dhd) - ret = dhd_os_wake_lock_ctrl_timeout_enable(&dhd->pub, val); + ret = dhd_os_wake_lock_timeout_enable(&dhd->pub, val); return ret; } @@ -5460,10 +5337,10 @@ int dhd_os_wake_lock(dhd_pub_t *pub) #ifdef CONFIG_HAS_WAKELOCK if (!dhd->wakelock_counter) wake_lock(&dhd->wl_wifi); -#elif defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) - /* SLP_wakelock_alternative_code */ +#elif defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) + /*SLP_wakelock_alternative_code*/ pm_stay_awake(pm_dev); -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ +#endif dhd->wakelock_counter++; ret = dhd->wakelock_counter; spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); @@ -5495,10 +5372,10 @@ int dhd_os_wake_unlock(dhd_pub_t *pub) #ifdef CONFIG_HAS_WAKELOCK if (!dhd->wakelock_counter) wake_unlock(&dhd->wl_wifi); -#elif defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) - /* SLP_wakelock_alternative_code */ +#elif defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) + /*SLP_wakelock_alternative_code*/ pm_relax(pm_dev); -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ +#endif ret = dhd->wakelock_counter; } spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); @@ -5518,8 +5395,8 @@ int dhd_os_check_wakelock(void *dhdp) if (dhd && wake_lock_active(&dhd->wl_wifi)) return 1; -#elif defined(CUSTOMER_HW4) && defined(CONFIG_PM_SLEEP) && defined(PLATFORM_SLP) - /* SLP_wakelock_alternative_code */ +#elif defined(CONFIG_PM_SLEEP) && defined(CUSTOMER_HW_SLP) + /*SLP_wakelock_alternative_code*/ dhd_pub_t *pub = (dhd_pub_t *)dhdp; dhd_info_t *dhd; @@ -5527,11 +5404,11 @@ int dhd_os_check_wakelock(void *dhdp) return 0; dhd = (dhd_info_t *)(pub->info); - DHD_ERROR(("%s : wakelock_count = %d\n", __func__, dhd->wakelock_counter)); + DHD_ERROR(("%s : wakelock_count = %d\n", __func__, dhd->wakelock_counter )); if (dhd && (dhd->wakelock_counter > 0)) return 1; -#endif /* CUSTOMER_HW4 && CONFIG_PM_SLEEP && PLATFORM_SLP */ +#endif return 0; } int net_os_wake_unlock(struct net_device *dev) @@ -5552,23 +5429,6 @@ int dhd_os_check_if_up(void *dhdp) return 0; return pub->up; } - -/* function to collect firmware, chip id and chip version info */ -void dhd_set_version_info(dhd_pub_t *dhdp, char *fw) -{ - int i; - - i = snprintf(info_string, sizeof(info_string), - " Driver: %s\n Firmware: %s ", EPI_VERSION_STR, fw); - - if (!dhdp) - return; - - i = snprintf(&info_string[i], sizeof(info_string) - i, - "\n Chip: %x Rev %x Pkg %x", dhd_bus_chip_id(dhdp), - dhd_bus_chiprev_id(dhdp), dhd_bus_chippkg_id(dhdp)); -} - int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd) { int ifidx; @@ -5603,7 +5463,7 @@ bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret) return dhd_check_hang(net, dhdp, ret); } -#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) +#if defined(WL_CFG80211) && defined(CUSTOMER_HW_SAMSUNG) #define MAX_TRY_CNT 5 /* Number of tries to disable deepsleep */ int dhd_deepsleep(struct net_device *dev, int flag) { @@ -5618,62 +5478,59 @@ int dhd_deepsleep(struct net_device *dev, int flag) dhdp = &dhd->pub; switch (flag) { - case 1 : /* Deepsleep on */ - DHD_ERROR(("[WiFi] Deepsleep On\n")); - /* give some time to _dhd_sysioc_thread() before deepsleep */ - msleep(200); -#ifdef PKT_FILTER_SUPPORT - /* disable pkt filter */ - dhd_enable_packet_filter(0, dhdp); -#endif /* PKT_FILTER_SUPPORT */ - /* Disable MPC */ - powervar = 0; - memset(iovbuf, 0, sizeof(iovbuf)); - bcm_mkiovar("mpc", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - - /* Enable Deepsleep */ - powervar = 1; - memset(iovbuf, 0, sizeof(iovbuf)); - bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - break; - - case 0: /* Deepsleep Off */ - DHD_ERROR(("[WiFi] Deepsleep Off\n")); - - /* Disable Deepsleep */ - for (cnt = 0; cnt < MAX_TRY_CNT; cnt++) { + case 1 : /* Deepsleep on */ + DHD_ERROR(("[WiFi] Deepsleep On\n")); + /* give some time to _dhd_sysioc_thread() before deepsleep */ + msleep(200); + if (dhd_pkt_filter_enable) { + dhd_set_packet_filter(0, dhdp); + } + /* Disable MPC */ powervar = 0; memset(iovbuf, 0, sizeof(iovbuf)); - bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); + bcm_mkiovar("mpc", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + /* Enable Deepsleep*/ + powervar = 1; memset(iovbuf, 0, sizeof(iovbuf)); bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhdp, WLC_GET_VAR, iovbuf, sizeof(iovbuf), - FALSE, 0)) < 0) { - DHD_ERROR(("the error of dhd deepsleep status ret value :%d\n", - ret)); - } else { - if (!(*(int *)iovbuf)) { - DHD_ERROR(("deepsleep mode is 0, ok , count : %d\n", cnt)); - break; + dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + break; + + case 0: /* Deepsleep Off */ + DHD_ERROR(("[WiFi] Deepsleep Off\n")); + + /* Disable Deepsleep */ + for (cnt = 0; cnt < MAX_TRY_CNT; cnt++ ) { + powervar = 0; + memset(iovbuf, 0, sizeof(iovbuf)); + bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + + memset(iovbuf, 0, sizeof(iovbuf)); + bcm_mkiovar("deepsleep", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhd_wl_ioctl_cmd(dhdp, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0)) < 0) { + DHD_ERROR(("the error of dhd deepsleep status ret value : %d\n",ret)); + } else { + if(!(*(int *)iovbuf )) { + DHD_ERROR(("deepsleep mode is 0, ok , count : %d\n",cnt)); + break; + } } } - } - /* Enable MPC */ - powervar = 1; - memset(iovbuf, 0, sizeof(iovbuf)); - bcm_mkiovar("mpc", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - break; + /* Enable MPC */ + powervar = 1; + memset(iovbuf, 0, sizeof(iovbuf)); + bcm_mkiovar("mpc", (char *)&powervar, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + break; } return 0; } -#endif /* SUPPORT_DEEP_SLEEP */ +#endif /* CUSTOMER_HW_SAMSUNG */ #ifdef PROP_TXSTATUS extern int dhd_wlfc_interface_entry_update(void* state, ewlfc_mac_entry_action_t action, uint8 ifid, @@ -5713,8 +5570,8 @@ extern uint32 dhd_writeregl(void *bp, uint32 addr, uint32 data); typedef struct dhd_dbgfs { struct dentry *debugfs_dir; struct dentry *debugfs_mem; - dhd_pub_t *dhdp; - uint32 size; + dhd_pub_t *dhdp; + uint32 size; } dhd_dbgfs_t; dhd_dbgfs_t g_dbgfs; @@ -5861,9 +5718,9 @@ void dhd_htsf_addtxts(dhd_pub_t *dhdp, void *pktbuf) p1 = (char*) PKTDATA(dhdp->osh, pktbuf); if (PKTLEN(dhdp->osh, pktbuf) > HTSF_MINLEN) { -/* memcpy(&proto, p1+26, 4); */ +/* memcpy(&proto, p1+26, 4); */ memcpy(&dport, p1+40, 2); -/* proto = ((ntoh32(proto))>> 16) & 0xFF; */ +/* proto = ((ntoh32(proto))>> 16) & 0xFF; */ dport = ntoh16(dport); } @@ -6063,8 +5920,7 @@ dhd_ioctl_htsf_get(dhd_info_t *dhd, int ifidx) ioc.len = (uint)sizeof(buf); ioc.set = FALSE; - strncpy(buf, "tsf", sizeof(buf) - 1); - buf[sizeof(buf) - 1] = '\0'; + strcpy(buf, "tsf"); s1 = dhd_get_htsf(dhd, 0); if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { if (ret == -EIO) { @@ -6133,10 +5989,10 @@ void htsf_update(dhd_info_t *dhd, void *data) if (tsf_delta) { hfactor = cyc_delta / tsf_delta; - tmp = (cyc_delta - (hfactor * tsf_delta))*10; + tmp = (cyc_delta - (hfactor * tsf_delta))*10; dec1 = tmp/tsf_delta; dec2 = ((tmp - dec1*tsf_delta)*10) / tsf_delta; - tmp = (tmp - (dec1*tsf_delta))*10; + tmp = (tmp - (dec1*tsf_delta))*10; dec3 = ((tmp - dec2*tsf_delta)*10) / tsf_delta; if (dec3 > 4) { diff --git a/drivers/net/wireless/bcmdhd/dhd_linux_sched.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux_sched.c index 290caf7..76336b3 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux_sched.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_linux_sched.c @@ -1,14 +1,14 @@ /* * Expose some of the kernel scheduler routines * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/dhd_proto.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_proto.h index 09d5468..8cc2542 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_proto.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_proto.h @@ -4,14 +4,14 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,12 +19,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_proto.h 343390 2012-07-06 22:34:19Z $ + * $Id: dhd_proto.h 303834 2011-12-20 06:17:39Z $ */ #ifndef _dhd_proto_h_ @@ -34,7 +34,7 @@ #include <wlioctl.h> #ifndef IOCTL_RESP_TIMEOUT -#define IOCTL_RESP_TIMEOUT 2000 /* In milli second default value for Production FW */ +#define IOCTL_RESP_TIMEOUT 5000 /* In milli second */ #endif /* IOCTL_RESP_TIMEOUT */ /* @@ -57,7 +57,7 @@ extern void dhd_prot_stop(dhd_pub_t *dhdp); #ifdef PROP_TXSTATUS extern int dhd_wlfc_init(dhd_pub_t *dhd); extern void dhd_wlfc_deinit(dhd_pub_t *dhd); -#endif /* PROP_TXSTATUS */ +#endif /* Add any protocol-specific data header. * Caller must reserve prot_hdrlen prepend space. diff --git a/drivers/net/wireless/bcmdhd/dhd_sdio.c b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sdio.c index b271622..211c865 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sdio.c @@ -2,13 +2,13 @@ * DHD Bus Module for SDIO * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_sdio.c 354028 2012-08-29 20:08:39Z $ + * $Id: dhd_sdio.c 309548 2012-01-20 01:13:08Z $ */ #include <typedefs.h> @@ -49,9 +49,6 @@ #include <sbhnddma.h> #include <sdio.h> -#ifdef BCMSPI -#include <spid.h> -#endif /* BCMSPI */ #include <sbsdio.h> #include <sbsdpcmdev.h> #include <bcmsdpcm.h> @@ -97,17 +94,8 @@ #error DHD_FIRSTREAD is not a power of 2! #endif -#ifdef BCMSDIOH_TXGLOM -/* Total length of TX frame header for dongle protocol */ -#define SDPCM_HDRLEN (SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN + SDPCM_SWHEADER_LEN) -/* Total length of RX frame for dongle protocol */ -#else -/* Total length of TX frame header for dongle protocol */ +/* Total length of frame header for dongle protocol */ #define SDPCM_HDRLEN (SDPCM_FRAMETAG_LEN + SDPCM_SWHEADER_LEN) -#endif - -#define SDPCM_HDRLEN_RX (SDPCM_FRAMETAG_LEN + SDPCM_SWHEADER_LEN) - #ifdef SDTEST #define SDPCM_RESERVE (SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + DHD_SDALIGN) #else @@ -150,12 +138,13 @@ #define PKTFREE2() if ((bus->bus != SPI_BUS) || bus->usebufpool) \ PKTFREE(bus->dhd->osh, pkt, FALSE); DHD_SPINWAIT_SLEEP_INIT(sdioh_spinwait_sleep); -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) extern void bcmsdh_set_irq(int flag); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ #ifdef PROP_TXSTATUS extern void dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success); #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) DEFINE_MUTEX(_dhd_sdio_mutex_lock_); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ @@ -174,6 +163,13 @@ typedef struct dhd_console { } dhd_console_t; #endif /* DHD_DEBUG */ +#ifdef BCM4334_CHECK_CHIP_REV +#define REV_ID_ADDR 0x1E008F90 +uint g_chipver; +char chipver_tag[4]; +char fw_down_path[MOD_PARAM_PATHLEN]; +#endif + #define REMAP_ENAB(bus) ((bus)->remap) #define REMAP_ISADDR(bus, a) (((a) >= ((bus)->orig_ramsize)) && ((a) < ((bus)->ramsize))) #define KSO_ENAB(bus) ((bus)->kso) @@ -183,8 +179,8 @@ typedef struct dhd_console { #define MIN_RSRC_SR 0x3 #define CORE_CAPEXT_ADDR (SI_ENUM_BASE + 0x64c) #define CORE_CAPEXT_SR_SUPPORTED_MASK (1 << 1) -#define RCTL_MACPHY_DISABLE_MASK (1 << 26) -#define RCTL_LOGIC_DISABLE_MASK (1 << 27) +#define RCTL_MACPHY_DISABLE_MASK (1 << 26) +#define RCTL_LOGIC_DISABLE_MASK (1 << 27) #define OOB_WAKEUP_ENAB(bus) ((bus)->_oobwakeup) #define GPIO_DEV_SRSTATE 16 /* Host gpio17 mapped to device gpio0 SR state */ @@ -192,7 +188,7 @@ typedef struct dhd_console { #define GPIO_DEV_WAKEUP 17 /* Host gpio17 mapped to device gpio1 wakeup */ #define CC_CHIPCTRL2_GPIO1_WAKEUP (1 << 0) -#define CC_PMUCC3 (0x3) + /* Private data for SDIO bus interaction */ typedef struct dhd_bus { dhd_pub_t *dhd; @@ -253,7 +249,7 @@ typedef struct dhd_bus { bool poll; /* Use polling */ bool ipend; /* Device interrupt is pending */ bool intdis; /* Interrupts disabled by isr */ - uint intrcount; /* Count of device interrupt callbacks */ + uint intrcount; /* Count of device interrupt callbacks */ uint lastintrs; /* Count as of last watchdog timer */ uint spurious; /* Count of spurious interrupts */ uint pollrate; /* Ticks between device polls */ @@ -331,16 +327,11 @@ typedef struct dhd_bus { uint f2rxdata; /* Number of frame data reads */ uint f2txdata; /* Number of f2 frame writes */ uint f1regdata; /* Number of f1 register accesses */ -#ifdef BCMSPI - bool dwordmode; -#endif /* BCMSPI */ uint8 *ctrl_frame_buf; uint32 ctrl_frame_len; bool ctrl_frame_stat; -#ifndef BCMSPI uint32 rxint_mode; /* rx interrupt mode */ -#endif /* BCMSPI */ bool remap; /* Contiguous 1MB RAM: 512K socram + 512K devram * Available with socram rev 16 * Remap region not DMA-able @@ -349,18 +340,7 @@ typedef struct dhd_bus { bool _slpauto; bool _oobwakeup; bool _srenab; - bool readframes; - bool reqbussleep; - uint32 resetinstr; - uint32 dongle_ram_base; -#ifdef BCMSDIOH_TXGLOM - void *glom_pkt_arr[SDPCM_MAXGLOM_SIZE]; /* Array of pkts for glomming */ - uint16 glom_cnt; /* Number of pkts in the glom array */ - uint16 glom_total_len; /* Total length of pkts in glom array */ - bool glom_enable; /* Flag to indicate whether tx glom is enabled/disabled */ - uint8 glom_mode; /* Glom mode - 0-copy mode, 1 - Multi-descriptor mode */ - uint32 glomsize; /* Glom size limitation */ -#endif + bool readframes; } dhd_bus_t; /* clkstate */ @@ -399,14 +379,8 @@ static bool sd1idle; static bool retrydata; #define RETRYCHAN(chan) (((chan) == SDPCM_EVENT_CHANNEL) || retrydata) -#ifdef BCMSPI -/* At a watermark around 8 the spid hits underflow error. */ -static const uint watermark = 32; -static const uint mesbusyctrl = 0; -#else static const uint watermark = 8; static const uint mesbusyctrl = 0; -#endif /* BCMSPI */ static const uint firstread = DHD_FIRSTREAD; #define HDATLEN (firstread - (SDPCM_HDRLEN)) @@ -458,10 +432,6 @@ static bool dhd_readahead; (((uint8)(bus->tx_max - bus->tx_seq) != 0) && \ (((uint8)(bus->tx_max - bus->tx_seq) & 0x80) == 0)) -/* Number of pkts available in dongle for data RX */ -#define DATABUFCNT(bus) \ - ((uint8)(bus->tx_max - bus->tx_seq) - 1) - /* Macros to get register read/write status */ /* NOTE: these assume a local dhdsdio_bus_t *bus! */ #define R_SDREG(regvar, regaddr, retryvar) \ @@ -496,7 +466,6 @@ do { \ #define BUS_WAKE(bus) \ do { \ - bus->idlecount = 0; \ if ((bus)->sleeping) \ dhdsdio_bussleep((bus), FALSE); \ } while (0); @@ -522,35 +491,8 @@ do { \ #define SDIO_DEVICE_RXDATAINT_MODE_0 1 /* from sdiod rev 4 */ #define SDIO_DEVICE_RXDATAINT_MODE_1 2 /* from sdiod rev 4 */ -#ifdef BCMSPI - -#define FRAME_AVAIL_MASK(bus) I_HMB_FRAME_IND - -#define DHD_BUS SPI_BUS - -/* check packet-available-interrupt in piggybacked dstatus */ -#define PKT_AVAILABLE(bus, intstatus) (bcmsdh_get_dstatus(bus->sdh) & STATUS_F2_PKT_AVAILABLE) - -#define HOSTINTMASK (I_HMB_FC_CHANGE | I_HMB_HOST_INT) - -#define GSPI_PR55150_BAILOUT \ -do { \ - uint32 dstatussw = bcmsdh_get_dstatus((void *)bus->sdh); \ - uint32 dstatushw = bcmsdh_cfg_read_word(bus->sdh, SDIO_FUNC_0, SPID_STATUS_REG, NULL); \ - uint32 intstatuserr = 0; \ - uint retries = 0; \ - \ - R_SDREG(intstatuserr, &bus->regs->intstatus, retries); \ - printf("dstatussw = 0x%x, dstatushw = 0x%x, intstatus = 0x%x\n", \ - dstatussw, dstatushw, intstatuserr); \ - \ - bus->nextlen = 0; \ - *finished = TRUE; \ -} while (0) - -#else /* BCMSDIO */ -#define FRAME_AVAIL_MASK(bus) \ +#define FRAME_AVAIL_MASK(bus) \ ((bus->rxint_mode == SDIO_DEVICE_HMB_RXINT) ? I_HMB_FRAME_IND : I_XMTDATA_AVAIL) #define DHD_BUS SDIO_BUS @@ -561,8 +503,6 @@ do { \ #define GSPI_PR55150_BAILOUT -#endif /* BCMSPI */ - #ifdef SDTEST static void dhdsdio_testrcv(dhd_bus_t *bus, void *pkt, uint seq); static void dhdsdio_sdtest_set(dhd_bus_t *bus, uint8 count); @@ -594,10 +534,6 @@ static int dhd_bcmsdh_recv_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, static int dhd_bcmsdh_send_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf, uint nbytes, void *pkt, bcmsdh_cmplt_fn_t complete, void *handle); -#ifdef BCMSDIOH_TXGLOM -static void dhd_bcmsdh_glom_post(dhd_bus_t *bus, uint8 *frame, uint len); -static void dhd_bcmsdh_glom_clear(dhd_bus_t *bus); -#endif static bool dhdsdio_download_firmware(dhd_bus_t *bus, osl_t *osh, void *sdh); static int _dhdsdio_download_firmware(dhd_bus_t *bus); @@ -643,28 +579,6 @@ dhdsdio_set_siaddr_window(dhd_bus_t *bus, uint32 address) return err; } -#ifdef BCMSPI -static void -dhdsdio_wkwlan(dhd_bus_t *bus, bool on) -{ - int err; - uint32 regdata; - bcmsdh_info_t *sdh = bus->sdh; - - if (bus->sih->buscoretype == SDIOD_CORE_ID) { - /* wake up wlan function :WAKE_UP goes as ht_avail_request and alp_avail_request */ - regdata = bcmsdh_cfg_read_word(sdh, SDIO_FUNC_0, SPID_CONFIG, NULL); - DHD_INFO(("F0 REG0 rd = 0x%x\n", regdata)); - - if (on == TRUE) - regdata |= WAKE_UP; - else - regdata &= ~WAKE_UP; - - bcmsdh_cfg_write_word(sdh, SDIO_FUNC_0, SPID_CONFIG, regdata, &err); - } -} -#endif /* BCMSPI */ #ifdef USE_OOB_GPIO1 static int @@ -689,7 +603,7 @@ dhdsdio_oobwakeup_init(dhd_bus_t *bus) } #endif /* USE_OOB_GPIO1 */ -#ifndef BCMSPI +#ifdef BCM4334_CHIP /* * Query if FW is in SR mode */ @@ -697,37 +611,16 @@ static bool dhdsdio_sr_cap(dhd_bus_t *bus) { bool cap = FALSE; - uint32 min = 0, core_capext, addr, data; - if (bus->sih->chip == BCM4324_CHIP_ID) { - addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); - data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); - bcmsdh_reg_write(bus->sdh, addr, 4, 3); - core_capext = bcmsdh_reg_read(bus->sdh, data, 4); - } else if (bus->sih->chip == BCM4330_CHIP_ID) { - core_capext = FALSE; - } else if (bus->sih->chip == BCM4335_CHIP_ID) { - core_capext = TRUE; - } else { - core_capext = bcmsdh_reg_read(bus->sdh, CORE_CAPEXT_ADDR, 4); - core_capext = (core_capext & CORE_CAPEXT_SR_SUPPORTED_MASK); - } - if (!(core_capext)) + uint32 min = 0, core_capext, data; + + core_capext = bcmsdh_reg_read(bus->sdh, CORE_CAPEXT_ADDR, 4); + if (!(core_capext & CORE_CAPEXT_SR_SUPPORTED_MASK)) return FALSE; if (bus->sih->chip == BCM4324_CHIP_ID) { - /* FIX: Should change to query SR control register instead */ - min = bcmsdh_reg_read(bus->sdh, MIN_RSRC_ADDR, 4); + min = bcmsdh_reg_read(bus->sdh, MIN_RSRC_ADDR, 4); if (min == MIN_RSRC_SR) - cap = TRUE; - } else if (bus->sih->chip == BCM4335_CHIP_ID) { - uint32 enabval = 0; - addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); - data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); - bcmsdh_reg_write(bus->sdh, addr, 4, CC_PMUCC3); - enabval = bcmsdh_reg_read(bus->sdh, data, 4); - - if (enabval) - cap = TRUE; + cap = TRUE; } else { data = bcmsdh_reg_read(bus->sdh, SI_ENUM_BASE + OFFSETOF(chipcregs_t, retention_ctl), 4); @@ -761,6 +654,7 @@ dhdsdio_sr_init(dhd_bus_t *bus) if ((bus->sih->chip == BCM4334_CHIP_ID) && (bus->sih->chiprev == 2)) dhdsdio_srwar_init(bus); + val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_WAKEUPCTRL, NULL); val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT; bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_WAKEUPCTRL, @@ -780,7 +674,7 @@ dhdsdio_sr_init(dhd_bus_t *bus) return 0; } -#endif /* BCMSPI */ +#endif /* BCM4334_CHIP */ /* * FIX: Be sure KSO bit is enabled @@ -810,56 +704,19 @@ dhdsdio_clk_kso_init(dhd_bus_t *bus) return 0; } -#define KSO_DBG(x) -#define MAX_KSO_ATTEMPTS 64 static int dhdsdio_clk_kso_enab(dhd_bus_t *bus, bool on) { - uint8 wr_val = 0, rd_val, cmp_val, bmask; + uint8 val = 0; int err = 0; - int try_cnt = 0; - - KSO_DBG(("%s> op:%s\n", __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"))); - wr_val |= (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); - - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err); - - if (on) { - cmp_val = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK | SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK; - bmask = cmp_val; + /* Don't read here since sdio could be off so just write only */ + val |= (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, val, &err); - msleep(3); - - } else { - /* Put device to sleep, turn off KSO */ - cmp_val = 0; - bmask = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK; - } - - do { - rd_val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, &err); - if (((rd_val & bmask) == cmp_val) && !err) - break; - - KSO_DBG(("%s> KSO wr/rd retry:%d, ERR:%x \n", __FUNCTION__, try_cnt, err)); - OSL_DELAY(50); - - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err); - - } while (try_cnt++ < MAX_KSO_ATTEMPTS); - - - if (try_cnt > 1) { - KSO_DBG(("%s> op:%s, try_cnt:%d, rd_val:%x, ERR:%x \n", - __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"), try_cnt, rd_val, err)); - } - - if (try_cnt > MAX_KSO_ATTEMPTS) { - DHD_ERROR(("%s> op:%s, ERROR: try_cnt:%d, rd_val:%x, ERR:%x \n", - __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"), try_cnt, rd_val, err)); - } - return err; + if (err) + DHD_TRACE(("%s: KSO toggle %d failed: %d\n", __FUNCTION__, on, err)); + return 0; } static int @@ -901,7 +758,6 @@ dhdsdio_clk_kso_iovar(dhd_bus_t *bus, bool on) } bus->kso = on; - BCM_REFERENCE(err); return 0; } @@ -982,7 +838,7 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) /* Exit Sleep */ /* Make sure we have SD bus access */ if (bus->clkstate == CLK_NONE) { - DHD_TRACE(("%s: Request SD clk\n", __FUNCTION__)); + DHD_ERROR(("%s: Request SD clk\n", __FUNCTION__)); dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); } @@ -1027,8 +883,7 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) do { err = dhdsdio_clk_kso_enab(bus, TRUE); - if (err) - OSL_DELAY(10000); + OSL_DELAY(10000); } while ((err != 0) && (++retry < 3)); if (err != 0) { @@ -1043,7 +898,7 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) /* Wait for device ready during transition to wake-up */ SPINWAIT((((csr = dhdsdio_sleepcsr_get(bus)) & SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK) != - (SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)), (20000)); + (SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)), (10000)); DHD_TRACE(("%s: ExitSleep sleepcsr: 0x%x\n", __FUNCTION__, csr)); @@ -1074,17 +929,15 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) static int dhdsdio_htclk(dhd_bus_t *bus, bool on, bool pendok) { -#define HT_AVAIL_ERROR_MAX 10 - static int ht_avail_error = 0; int err; uint8 clkctl, clkreq, devctl; bcmsdh_info_t *sdh; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) pendok = FALSE; -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif clkctl = 0; sdh = bus->sdh; @@ -1100,26 +953,10 @@ dhdsdio_htclk(dhd_bus_t *bus, bool on, bool pendok) if (on) { /* Request HT Avail */ clkreq = bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; - -#ifdef BCMSPI - dhdsdio_wkwlan(bus, TRUE); -#endif /* BCMSPI */ - - bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkreq, &err); if (err) { - ht_avail_error++; - if (ht_avail_error < HT_AVAIL_ERROR_MAX) { - DHD_ERROR(("%s: HT Avail request error: %d\n", __FUNCTION__, err)); - } - - else { - if (ht_avail_error == HT_AVAIL_ERROR_MAX) - dhd_os_send_hang_message(bus->dhd); - } -return BCME_ERROR; - } else { - ht_avail_error = 0; + DHD_ERROR(("%s: HT Avail request error: %d\n", __FUNCTION__, err)); + return BCME_ERROR; } if (pendok && @@ -1208,17 +1045,14 @@ return BCME_ERROR; bus->clkstate = CLK_SDONLY; if (!SR_ENAB(bus)) { - bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkreq, &err); - DHD_INFO(("CLKCTL: turned OFF\n")); - if (err) { - DHD_ERROR(("%s: Failed access turning clock off: %d\n", - __FUNCTION__, err)); - return BCME_ERROR; - } + bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkreq, &err); + DHD_INFO(("CLKCTL: turned OFF\n")); + if (err) { + DHD_ERROR(("%s: Failed access turning clock off: %d\n", + __FUNCTION__, err)); + return BCME_ERROR; + } } -#ifdef BCMSPI - dhdsdio_wkwlan(bus, FALSE); -#endif /* BCMSPI */ } return BCME_OK; } @@ -1227,7 +1061,6 @@ return BCME_ERROR; static int dhdsdio_sdclk(dhd_bus_t *bus, bool on) { -#ifndef BCMSPI int err; int32 iovalue; @@ -1306,7 +1139,6 @@ dhdsdio_sdclk(dhd_bus_t *bus, bool on) } bus->clkstate = CLK_NONE; } -#endif /* BCMSPI */ return BCME_OK; } @@ -1343,7 +1175,7 @@ dhdsdio_clkctl(dhd_bus_t *bus, uint target, bool pendok) ret = dhdsdio_htclk(bus, TRUE, pendok); if (ret == BCME_OK) { dhd_os_wd_timer(bus->dhd, dhd_watchdog_ms); - bus->activity = TRUE; + bus->activity = TRUE; #ifdef DHD_USE_IDLECOUNT bus->idlecount = 0; #endif /* DHD_USE_IDLECOUNT */ @@ -1373,7 +1205,6 @@ dhdsdio_clkctl(dhd_bus_t *bus, uint target, bool pendok) #ifdef DHD_DEBUG if (dhd_console_ms == 0) #endif /* DHD_DEBUG */ - if (bus->poll == 0) dhd_os_wd_timer(bus->dhd, 0); break; } @@ -1403,11 +1234,7 @@ dhdsdio_bussleep(dhd_bus_t *bus, bool sleep) /* Going to sleep: set the alarm and turn off the lights... */ if (sleep) { /* Don't sleep if something is pending */ -#ifdef CUSTOMER_HW4 if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq) || bus->readframes) -#else - if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq)) -#endif /* CUSTOMER_HW4 */ return BCME_BUSY; @@ -1487,7 +1314,7 @@ dhdsdio_bussleep(dhd_bus_t *bus, bool sleep) return err; } -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#ifdef VSDB_DYNAMIC_F2_BLKSIZE int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) { @@ -1495,8 +1322,7 @@ dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) int bcmerr = 0; int result; - bcmerr = dhd_bus_iovar_op(dhd, "sd_blocksize", &func_blk_size, sizeof(int), &result, - sizeof(int), 0); + bcmerr = dhd_bus_iovar_op(dhd, "sd_blocksize", &func_blk_size, sizeof(int), &result, sizeof(int), 0); if (bcmerr != BCME_OK) { DHD_ERROR(("%s: Get F%d Block size error\n", __FUNCTION__, function_num)); @@ -1505,12 +1331,10 @@ dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) if (result != block_size) { - DHD_ERROR(("%s: F%d Block size set from %d to %d\n", __FUNCTION__, - function_num, result, block_size)); + DHD_ERROR(("%s: F%d Block size set from %d to %d\n", __FUNCTION__, function_num, result, block_size)); - func_blk_size = function_num << 16 | block_size; - bcmerr = dhd_bus_iovar_op(dhd, "sd_blocksize", &func_blk_size, sizeof(int32), - &result, sizeof(int32), 1); + func_blk_size = function_num << 16 | block_size ; + bcmerr = dhd_bus_iovar_op(dhd, "sd_blocksize", &func_blk_size, sizeof(int32), &result, sizeof(int32), 1); if (bcmerr != BCME_OK) { DHD_ERROR(("%s: Set F2 Block size error\n", __FUNCTION__)); @@ -1521,8 +1345,7 @@ dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) return BCME_OK; } -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ - +#endif #if defined(OOB_INTR_ONLY) void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) @@ -1557,7 +1380,7 @@ dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) /* Writes a HW/SW header into the packet and sends it. */ /* Assumes: (a) header space already there, (b) caller holds lock */ static int -dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_only) +dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt) { int ret; osl_t *osh; @@ -1568,10 +1391,6 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on bcmsdh_info_t *sdh; void *new; int i; - int pkt_cnt; -#ifdef BCMSDIOH_TXGLOM - uint8 *frame_tmp; -#endif #ifdef WLMEDIA_HTSF char *p; htsfts_t *htsf_ts; @@ -1602,7 +1421,7 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on #endif /* WLMEDIA_HTSF */ /* Add alignment padding, allocate new packet if needed */ - if (!((uintptr)frame & 1) && (pad1 = ((uintptr)frame % DHD_SDALIGN))) { + if ((pad1 = ((uintptr)frame % DHD_SDALIGN))) { if (PKTHEADROOM(osh, pkt) < pad1) { DHD_INFO(("%s: insufficient headroom %d for %d pad1\n", __FUNCTION__, (int)PKTHEADROOM(osh, pkt), pad1)); @@ -1626,6 +1445,14 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on ASSERT(((uintptr)frame % DHD_SDALIGN) == 0); pad1 = 0; } else { +#ifdef CUSTOMER_HW_SAMSUNG + /* Adjust pad value to fix firmware crash problems + * because of odd start address of the frame + * (CSP#455126) + */ + if ((int)frame & 1) + pad1--; +#endif PKTPUSH(osh, pkt, pad1); frame = (uint8*)PKTDATA(osh, pkt); @@ -1640,77 +1467,6 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on *(uint16*)frame = htol16(len); *(((uint16*)frame) + 1) = htol16(~len); -#ifdef BCMSDIOH_TXGLOM - if (bus->glom_enable) { - uint32 hwheader1 = 0, hwheader2 = 0, act_len = len; - - /* Software tag: channel, sequence number, data offset */ - swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | - ((bus->tx_seq + bus->glom_cnt) % SDPCM_SEQUENCE_WRAP) | - (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); - htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); - htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN + sizeof(swheader)); - - if (queue_only) { - if (forcealign && (len & (ALIGNMENT - 1))) - len = ROUNDUP(len, ALIGNMENT); - /* Hardware extention tag */ - /* 2byte frame length, 1byte-, 1byte frame flag, - * 2byte-hdrlength, 2byte padlenght - */ - hwheader1 = (act_len - SDPCM_FRAMETAG_LEN) | (0 << 24); - hwheader2 = (len - act_len) << 16; - htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); - htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); - /* Post the frame pointer to sdio glom array */ - dhd_bcmsdh_glom_post(bus, frame, len); - /* Save the pkt pointer in bus glom array */ - bus->glom_pkt_arr[bus->glom_cnt] = pkt; - bus->glom_total_len += len; - bus->glom_cnt++; - return BCME_OK; - } else { - /* Raise len to next SDIO block to eliminate tail command */ - if (bus->roundup && bus->blocksize && - ((bus->glom_total_len + len) > bus->blocksize)) { - uint16 pad2 = bus->blocksize - - ((bus->glom_total_len + len) % bus->blocksize); - if ((pad2 <= bus->roundup) && (pad2 < bus->blocksize)) { - len += pad2; - } else { - } - } else if ((bus->glom_total_len + len) % DHD_SDALIGN) { - len += DHD_SDALIGN - - ((bus->glom_total_len + len) % DHD_SDALIGN); - } - if (forcealign && (len & (ALIGNMENT - 1))) { - len = ROUNDUP(len, ALIGNMENT); - } - - /* Hardware extention tag */ - /* 2byte frame length, 1byte-, 1byte frame flag, - * 2byte-hdrlength, 2byte padlenght - */ - hwheader1 = (act_len - SDPCM_FRAMETAG_LEN) | (1 << 24); - hwheader2 = (len - act_len) << 16; - htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); - htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); - - /* Post the frame pointer to sdio glom array */ - dhd_bcmsdh_glom_post(bus, frame, len); - /* Save the pkt pointer in bus glom array */ - bus->glom_pkt_arr[bus->glom_cnt] = pkt; - bus->glom_cnt++; - bus->glom_total_len += len; - - /* Update the total length on the first pkt */ - frame_tmp = (uint8*)PKTDATA(osh, bus->glom_pkt_arr[0]); - *(uint16*)frame_tmp = htol16(bus->glom_total_len); - *(((uint16*)frame_tmp) + 1) = htol16(~bus->glom_total_len); - } - } else -#endif /* BCMSDIOH_TXGLOM */ - { /* Software tag: channel, sequence number, data offset */ swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); @@ -1730,7 +1486,6 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on } #endif -#ifndef BCMSPI /* Raise len to next SDIO block to eliminate tail command */ if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { uint16 pad2 = bus->blocksize - (len % bus->blocksize); @@ -1742,7 +1497,6 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on } else if (len % DHD_SDALIGN) { len += DHD_SDALIGN - (len % DHD_SDALIGN); } -#endif /* BCMSPI */ /* Some controllers have trouble with odd bytes -- round to even */ if (forcealign && (len & (ALIGNMENT - 1))) { @@ -1755,7 +1509,6 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on DHD_ERROR(("%s: sending unrounded %d-byte packet\n", __FUNCTION__, len)); #endif } - } do { ret = dhd_bcmsdh_send_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, @@ -1767,15 +1520,11 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on DHD_ERROR(("%s: Device asleep already\n", __FUNCTION__)); } else if (ret < 0) { /* On failure, abort the command and terminate the frame */ - DHD_ERROR(("%s: sdio error %d, abort command and terminate frame.\n", + DHD_INFO(("%s: sdio error %d, abort command and terminate frame.\n", __FUNCTION__, ret)); bus->tx_sderrs++; bcmsdh_abort(sdh, SDIO_FUNC_2); -#ifdef BCMSPI - DHD_ERROR(("%s: gSPI transmit error. Check Overflow or F2-fifo-not-ready" - " counters.\n", __FUNCTION__)); -#endif /* BCMSPI */ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL); bus->f1regdata++; @@ -1792,43 +1541,13 @@ dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_on } } if (ret == 0) { -#ifdef BCMSDIOH_TXGLOM - if (bus->glom_enable) { - bus->tx_seq = (bus->tx_seq + bus->glom_cnt) % SDPCM_SEQUENCE_WRAP; - } else -#endif - { bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; } - } } while ((ret < 0) && retrydata && retries++ < TXRETRIES); done: - -#ifdef BCMSDIOH_TXGLOM - if (bus->glom_enable) { - dhd_bcmsdh_glom_clear(bus); - pkt_cnt = bus->glom_cnt; - } else -#endif - { - pkt_cnt = 1; - } /* restore pkt buffer pointer before calling tx complete routine */ - while (pkt_cnt) { -#ifdef BCMSDIOH_TXGLOM - uint32 doff; - if (bus->glom_enable) { - pkt = bus->glom_pkt_arr[bus->glom_cnt - pkt_cnt]; - frame = (uint8*)PKTDATA(osh, pkt); - doff = ltoh32_ua(frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); - doff = (doff & SDPCM_DOFFSET_MASK) >> SDPCM_DOFFSET_SHIFT; - PKTPULL(osh, pkt, doff); - } else -#endif - { PKTPULL(osh, pkt, SDPCM_HDRLEN + pad1); - } #ifdef PROP_TXSTATUS if (bus->dhd->wlfc_state) { dhd_os_sdunlock(bus->dhd); @@ -1843,16 +1562,6 @@ done: #ifdef PROP_TXSTATUS } #endif - pkt_cnt--; - } - -#ifdef BCMSDIOH_TXGLOM - /* Reset the glom array */ - if (bus->glom_enable) { - bus->glom_cnt = 0; - bus->glom_total_len = 0; - } -#endif return ret; } @@ -1887,7 +1596,6 @@ dhd_bus_txdata(struct dhd_bus *bus, void *pkt) datalen += SDPCM_TEST_HDRLEN; } #endif /* SDTEST */ - #ifdef DHD_TX_DUMP dump_data = PKTDATA(osh, pkt); dump_data += 4; /* skip 4 bytes header */ @@ -1984,10 +1692,10 @@ dhd_bus_txdata(struct dhd_bus *bus, void *pkt) /* Make sure back plane ht clk is on, no pending allowed */ dhdsdio_clkctl(bus, CLK_AVAIL, TRUE); #ifndef SDTEST - ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE, FALSE); + ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE); #else ret = dhdsdio_txpkt(bus, pkt, - (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), TRUE, FALSE); + (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), TRUE); #endif if (ret) bus->dhd->tx_errors++; @@ -2021,10 +1729,6 @@ dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) uint cnt = 0; uint datalen; uint8 tx_prec_map; -#ifdef BCMSDIOH_TXGLOM - uint i; - uint8 glom_cnt; -#endif dhd_pub_t *dhd = bus->dhd; sdpcmd_regs_t *regs = bus->regs; @@ -2040,48 +1744,6 @@ dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) /* Send frames until the limit or some other event */ for (cnt = 0; (cnt < maxframes) && DATAOK(bus); cnt++) { -#ifdef BCMSDIOH_TXGLOM - if (bus->glom_enable) { - glom_cnt = MIN(DATABUFCNT(bus), bus->glomsize); - glom_cnt = MIN(glom_cnt, pktq_mlen(&bus->txq, tx_prec_map)); - glom_cnt = MIN(glom_cnt, maxframes-cnt); - - /* Limiting the size to 2pkts in case of copy */ - if (bus->glom_mode == SDPCM_TXGLOM_CPY) - glom_cnt = MIN(glom_cnt, 5); - - if (glom_cnt == 0) - break; - datalen = 0; - for (i = 0; i < glom_cnt; i++) { - dhd_os_sdlock_txq(bus->dhd); - if ((pkt = pktq_mdeq(&bus->txq, tx_prec_map, &prec_out)) == NULL) { - /* This case should not happen */ - DHD_ERROR(("No pkts in the queue for glomming\n")); - dhd_os_sdunlock_txq(bus->dhd); - break; - } - dhd_os_sdunlock_txq(bus->dhd); - - datalen += (PKTLEN(bus->dhd->osh, pkt) - SDPCM_HDRLEN); -#ifndef SDTEST - ret = dhdsdio_txpkt(bus, - pkt, - SDPCM_DATA_CHANNEL, - TRUE, - (i == (glom_cnt-1))? FALSE: TRUE); -#else - ret = dhdsdio_txpkt(bus, - pkt, - (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), - TRUE, - (i == (glom_cnt-1))? FALSE: TRUE); -#endif - } - cnt += i-1; - } else -#endif /* BCMSDIOH_TXGLOM */ - { dhd_os_sdlock_txq(bus->dhd); if ((pkt = pktq_mdeq(&bus->txq, tx_prec_map, &prec_out)) == NULL) { dhd_os_sdunlock_txq(bus->dhd); @@ -2091,16 +1753,11 @@ dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) datalen = PKTLEN(bus->dhd->osh, pkt) - SDPCM_HDRLEN; #ifndef SDTEST - ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE, FALSE); + ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE); #else - ret = dhdsdio_txpkt(bus, - pkt, - (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), - TRUE, - FALSE); + ret = dhdsdio_txpkt(bus, pkt, + (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), TRUE); #endif - } - if (ret) bus->dhd->tx_errors++; else @@ -2160,7 +1817,6 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) } doff += SDPCM_HDRLEN; -#ifndef BCMSPI /* Round send length to next SDIO block */ if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { uint16 pad = bus->blocksize - (len % bus->blocksize); @@ -2169,7 +1825,6 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) } else if (len % DHD_SDALIGN) { len += DHD_SDALIGN - (len % DHD_SDALIGN); } -#endif /* BCMSPI */ /* Satisfy length-alignment requirements */ if (forcealign && (len & (ALIGNMENT - 1))) @@ -2190,33 +1845,12 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) *(uint16*)frame = htol16((uint16)msglen); *(((uint16*)frame) + 1) = htol16(~msglen); -#ifdef BCMSDIOH_TXGLOM - if (bus->glom_enable) { - uint32 hwheader1, hwheader2; - /* Software tag: channel, sequence number, data offset */ - swheader = ((SDPCM_CONTROL_CHANNEL << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) - | bus->tx_seq - | ((doff << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); - htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); - htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN - + SDPCM_HWEXT_LEN + sizeof(swheader)); - - hwheader1 = (msglen - SDPCM_FRAMETAG_LEN) | (1 << 24); - hwheader2 = (len - (msglen)) << 16; - htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); - htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); - - *(uint16*)frame = htol16(len); - *(((uint16*)frame) + 1) = htol16(~(len)); - } else -#endif /* BCMSDIOH_TXGLOM */ - { /* Software tag: channel, sequence number, data offset */ swheader = ((SDPCM_CONTROL_CHANNEL << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | ((doff << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN); htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader)); - } + if (!TXCTLOK(bus)) { DHD_INFO(("%s: No bus credit bus->tx_max %d, bus->tx_seq %d\n", __FUNCTION__, bus->tx_max, bus->tx_seq)); @@ -2224,8 +1858,7 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) /* Send from dpc */ bus->ctrl_frame_buf = frame; bus->ctrl_frame_len = len; - - if (!bus->dpc_sched) { + if(!bus->dpc_sched) { bus->dpc_sched = TRUE; dhd_sched_dpc(bus->dhd); } @@ -2267,17 +1900,12 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) DHD_ERROR(("%s: Device asleep already\n", __FUNCTION__)); } else if (ret < 0) { /* On failure, abort the command and terminate the frame */ - DHD_INFO(("%s: sdio error %d, abort command and terminate frame.\n", + DHD_ERROR(("%s: sdio error %d, abort command and terminate frame.\n", __FUNCTION__, ret)); bus->tx_sderrs++; bcmsdh_abort(sdh, SDIO_FUNC_2); -#ifdef BCMSPI - DHD_ERROR(("%s: Check Overflow or F2-fifo-not-ready counters." - " gSPI transmit error on control channel.\n", - __FUNCTION__)); -#endif /* BCMSPI */ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL); bus->f1regdata++; @@ -2343,26 +1971,27 @@ dhd_bus_rxctl(struct dhd_bus *bus, uchar *msg, uint msglen) DHD_CTL(("%s: resumed on rxctl frame, got %d expected %d\n", __FUNCTION__, rxlen, msglen)); } else if (timeleft == 0) { -#ifdef DHD_DEBUG - uint32 status, retry = 0; + u32 status; + int retry = 0; R_SDREG(status, &bus->regs->intstatus, retry); - DHD_ERROR(("%s: resumed on timeout, INT status=0x%08X\n", - __FUNCTION__, status)); -#else - DHD_ERROR(("%s: resumed on timeout\n", __FUNCTION__)); -#endif /* DHD_DEBUG */ + DHD_ERROR(("%s: resumed on timeout, INT status=0x%08X\n", __FUNCTION__, status)); #ifdef DHD_DEBUG +#if !defined(CUSTOMER_HW_SAMSUNG) +#error need debug message if dongle trap occured + if (!SLPAUTO_ENAB(bus)) { +#endif dhd_os_sdlock(bus->dhd); dhdsdio_checkdied(bus, NULL, 0); dhd_os_sdunlock(bus->dhd); +#if !defined(CUSTOMER_HW_SAMSUNG) + } +#endif #endif /* DHD_DEBUG */ } else if (pending == TRUE) { - /* signal pending */ - DHD_ERROR(("%s: signal pending\n", __FUNCTION__)); - return -EINTR; - + DHD_ERROR(("%s: canceled\n", __FUNCTION__)); + return -ERESTARTSYS; } else { - DHD_CTL(("%s: resumed for unknown reason?\n", __FUNCTION__)); + DHD_ERROR(("%s: resumed for unknown reason?\n", __FUNCTION__)); #ifdef DHD_DEBUG dhd_os_sdlock(bus->dhd); dhdsdio_checkdied(bus, NULL, 0); @@ -2431,10 +2060,8 @@ enum { IOV_DEVCAP, IOV_VARS, #ifdef SOFTAP - IOV_FWPATH, + IOV_FWPATH #endif - IOV_TXGLOMSIZE, - IOV_TXGLOMMODE }; const bcm_iovar_t dhdsdio_iovars[] = { @@ -2480,8 +2107,6 @@ const bcm_iovar_t dhdsdio_iovars[] = { #ifdef SOFTAP {"fwpath", IOV_FWPATH, 0, IOVT_BUFFER, 0 }, #endif - {"txglomsize", IOV_TXGLOMSIZE, 0, IOVT_UINT32, 0 }, - {"txglommode", IOV_TXGLOMMODE, 0, IOVT_UINT32, 0 }, {NULL, 0, 0, 0, 0 } }; @@ -2733,16 +2358,17 @@ dhdsdio_readshared(dhd_bus_t *bus, sdpcm_shared_t *sh) int rv, i; uint32 shaddr = 0; - shaddr = bus->dongle_ram_base + bus->ramsize - 4; + shaddr = bus->ramsize - 4; + i = 0; do { /* Read last word in memory to determine address of sdpcm_shared structure */ if ((rv = dhdsdio_membytes(bus, FALSE, shaddr, (uint8 *)&addr, 4)) < 0) return rv; - addr = ltoh32(addr); + addr = ltoh32(addr); - DHD_INFO(("sdpcm_shared address 0x%08X\n", addr)); + DHD_INFO(("sdpcm_shared address 0x%08X\n", addr)); /* * Check if addr is valid. @@ -3144,7 +2770,7 @@ dhd_serialconsole(dhd_bus_t *bus, bool set, bool enable, int *bcmerror) return (int_val & uart_enab); } -#endif +#endif /* DHD_DEBUG */ static int dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const char *name, @@ -3403,7 +3029,6 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch else bus->use_rxchain = bool_val; break; -#ifndef BCMSPI case IOV_GVAL(IOV_ALIGNCTL): int_val = (int32)dhd_alignctl; bcopy(&int_val, arg, val_size); @@ -3412,7 +3037,6 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch case IOV_SVAL(IOV_ALIGNCTL): dhd_alignctl = bool_val; break; -#endif /* BCMSPI */ case IOV_GVAL(IOV_SDALIGN): int_val = DHD_SDALIGN; @@ -3552,9 +3176,6 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch case IOV_SVAL(IOV_SERIALCONS): dhd_serialconsole(bus, TRUE, bool_val, &bcmerror); break; - - - #endif /* DHD_DEBUG */ @@ -3660,33 +3281,6 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const ch dhdsdio_devcap_set(bus, (uint8) int_val); break; -#ifdef BCMSDIOH_TXGLOM - case IOV_GVAL(IOV_TXGLOMSIZE): - int_val = (int32)bus->glomsize; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_TXGLOMSIZE): - if (int_val > SDPCM_MAXGLOM_SIZE) { - bcmerror = BCME_ERROR; - } else { - bus->glomsize = (uint)int_val; - } - break; - case IOV_GVAL(IOV_TXGLOMMODE): - int_val = (int32)bus->glom_mode; - bcopy(&int_val, arg, val_size); - break; - - case IOV_SVAL(IOV_TXGLOMMODE): - if ((int_val != SDPCM_TXGLOM_CPY) && (int_val != SDPCM_TXGLOM_MDESC)) { - bcmerror = BCME_RANGE; - } else { - if ((bus->glom_mode = bcmsdh_set_mode(bus->sdh, (uint)int_val)) != int_val) - bcmerror = BCME_ERROR; - } - break; -#endif /* BCMSDIOH_TXGLOM */ default: bcmerror = BCME_UNSUPPORTED; break; @@ -3719,8 +3313,6 @@ dhdsdio_write_vars(dhd_bus_t *bus) varsize = bus->varsz ? ROUNDUP(bus->varsz, 4) : 0; varaddr = (bus->ramsize - 4) - varsize; - varaddr += bus->dongle_ram_base; - if (bus->vars) { if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev == 7)) { if (((varaddr & 0x3C) == 0x3C) && (varsize > 4)) { @@ -3770,8 +3362,6 @@ dhdsdio_write_vars(dhd_bus_t *bus) phys_size = REMAP_ENAB(bus) ? bus->ramsize : bus->orig_ramsize; - phys_size += bus->dongle_ram_base; - /* adjust to the user specified RAM */ DHD_INFO(("Physical memory size: %d, usable memory size: %d\n", phys_size, bus->ramsize)); @@ -3805,7 +3395,6 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter) { uint retries; int bcmerror = 0; - int foundcr4 = 0; /* To enter download state, disable ARM and reset SOCRAM. * To exit download state, simply reset ARM (default is RAM boot). @@ -3815,16 +3404,11 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter) if (!(si_setcore(bus->sih, ARM7S_CORE_ID, 0)) && !(si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { - if (si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { - foundcr4 = 1; - } else { DHD_ERROR(("%s: Failed to find ARM core!\n", __FUNCTION__)); bcmerror = BCME_ERROR; goto fail; } - } - if (!foundcr4) { si_core_disable(bus->sih, 0); if (bcmsdh_regfail(bus->sdh)) { bcmerror = BCME_SDIO_ERROR; @@ -3857,19 +3441,6 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter) } } } else { - /* For CR4, - * Halt ARM - * Remove ARM reset - * Read RAM base address [0x18_0000] - * [next] Download firmware - * [done at else] Populate the reset vector - * [done at else] Remove ARM halt - */ - /* Halt ARM & remove reset */ - si_core_reset(bus->sih, SICF_CPUHALT, SICF_CPUHALT); - } - } else { - if (!si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { if (!(si_setcore(bus->sih, SOCRAM_CORE_ID, 0))) { DHD_ERROR(("%s: Failed to find SOCRAM core!\n", __FUNCTION__)); bcmerror = BCME_ERROR; @@ -3886,6 +3457,7 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter) DHD_ERROR(("%s: could not write vars to RAM\n", __FUNCTION__)); goto fail; } + /* Enable remap before ARM reset but after vars. * No backplane access in remap mode */ @@ -3900,40 +3472,13 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter) } W_SDREG(0xFFFFFFFF, &bus->regs->intstatus, retries); + if (!(si_setcore(bus->sih, ARM7S_CORE_ID, 0)) && !(si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { DHD_ERROR(("%s: Failed to find ARM core!\n", __FUNCTION__)); bcmerror = BCME_ERROR; goto fail; } - } else { - /* cr4 has no socram, but tcm's */ - /* write vars */ - if ((bcmerror = dhdsdio_write_vars(bus))) { - DHD_ERROR(("%s: could not write vars to RAM\n", __FUNCTION__)); - goto fail; - } - - if (!si_setcore(bus->sih, PCMCIA_CORE_ID, 0) && - !si_setcore(bus->sih, SDIOD_CORE_ID, 0)) { - DHD_ERROR(("%s: Can't change back to SDIO core?\n", __FUNCTION__)); - bcmerror = BCME_ERROR; - goto fail; - } - W_SDREG(0xFFFFFFFF, &bus->regs->intstatus, retries); - - /* switch back to arm core again */ - if (!(si_setcore(bus->sih, ARMCR4_CORE_ID, 0))) { - DHD_ERROR(("%s: Failed to find ARM CR4 core!\n", __FUNCTION__)); - bcmerror = BCME_ERROR; - goto fail; - } - /* write address 0 with reset instruction */ - bcmerror = dhdsdio_membytes(bus, TRUE, 0, - (uint8 *)&bus->resetinstr, sizeof(bus->resetinstr)); - - /* now remove reset and halt and continue to run CR4 */ - } si_core_reset(bus->sih, 0, 0); if (bcmsdh_regfail(bus->sdh)) { @@ -4066,7 +3611,7 @@ dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex) { osl_t *osh; uint32 local_hostintmask; - uint8 saveclk, dat; + uint8 saveclk; uint retries; int err; if (!bus->dhd) @@ -4082,45 +3627,36 @@ dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex) BUS_WAKE(bus); - if (KSO_ENAB(bus)) { - /* Mask the interrupt */ - dat = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, NULL); - dat &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN); - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, dat, NULL); - } - /* Change our idea of bus state */ bus->dhd->busstate = DHD_BUS_DOWN; if (KSO_ENAB(bus)) { - /* Enable clock for device interrupts */ - dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); + /* Enable clock for device interrupts */ + dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); - /* Disable and clear interrupts at the chip level also */ - W_SDREG(0, &bus->regs->hostintmask, retries); - local_hostintmask = bus->hostintmask; - bus->hostintmask = 0; + /* Disable and clear interrupts at the chip level also */ + W_SDREG(0, &bus->regs->hostintmask, retries); + local_hostintmask = bus->hostintmask; + bus->hostintmask = 0; - /* Force clocks on backplane to be sure F2 interrupt propagates */ - saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); - if (!err) { - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, - (saveclk | SBSDIO_FORCE_HT), &err); - } - if (err) { - DHD_ERROR(("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err)); - } + /* Force clocks on backplane to be sure F2 interrupt propagates */ + saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); + if (!err) { + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, + (saveclk | SBSDIO_FORCE_HT), &err); + } + if (err) { + DHD_ERROR(("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err)); + } - /* Turn off the bus (F2), free any pending packets */ - DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); - bcmsdh_intr_disable(bus->sdh); -#ifndef BCMSPI - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); -#endif /* !BCMSPI */ + /* Turn off the bus (F2), free any pending packets */ + DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); + bcmsdh_intr_disable(bus->sdh); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); - /* Clear any pending interrupts now that F2 is disabled */ - W_SDREG(local_hostintmask, &bus->regs->intstatus, retries); + /* Clear any pending interrupts now that F2 is disabled */ + W_SDREG(local_hostintmask, &bus->regs->intstatus, retries); } /* Turn off the backplane clock (only) */ @@ -4150,33 +3686,6 @@ dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex) dhd_os_sdunlock(bus->dhd); } -#ifdef BCMSDIOH_TXGLOM -void -dhd_txglom_enable(dhd_pub_t *dhdp, bool enable) -{ - dhd_bus_t *bus = dhdp->bus; - - char buf[256]; - uint32 rxglom; - int32 ret; - - if (enable) { - rxglom = 1; - memset(buf, 0, sizeof(buf)); - bcm_mkiovar("bus:rxglom", - (void *)&rxglom, - 4, buf, sizeof(buf)); - ret = dhd_wl_ioctl_cmd(dhdp, - WLC_SET_VAR, buf, - sizeof(buf), TRUE, 0); - if (!(ret < 0)) { - bus->glom_enable = TRUE; - } - } else { - bus->glom_enable = FALSE; - } -} -#endif /* BCMSDIOH_TXGLOM */ int dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) @@ -4186,11 +3695,7 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) uint retries = 0; uint8 ready, enable; int err, ret = 0; -#ifdef BCMSPI - uint32 dstatus = 0; /* gSPI device-status bits */ -#else /* BCMSPI */ uint8 saveclk; -#endif /* BCMSPI */ DHD_TRACE(("%s: Enter\n", __FUNCTION__)); @@ -4205,33 +3710,9 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); if (bus->clkstate != CLK_AVAIL) { DHD_ERROR(("%s: clock state is wrong. state = %d\n", __FUNCTION__, bus->clkstate)); - ret = -1; goto exit; } -#ifdef BCMSPI - /* fake "ready" for spi, wake-wlan would have already enabled F1 and F2 */ - ready = (SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2); - enable = 0; - - /* Give the dongle some time to do its thing and set IOR2 */ - dhd_timeout_start(&tmo, WAIT_F2RXFIFORDY * WAIT_F2RXFIFORDY_DELAY * 1000); - while (!enable && !dhd_timeout_expired(&tmo)) { - dstatus = bcmsdh_cfg_read_word(bus->sdh, SDIO_FUNC_0, SPID_STATUS_REG, NULL); - if (dstatus & STATUS_F2_RX_READY) - enable = TRUE; - } - - if (enable) { - DHD_ERROR(("Took %u usec before dongle is ready\n", tmo.elapsed)); - enable = ready; - } else { - DHD_ERROR(("dstatus when timed out on f2-fifo not ready = 0x%x\n", dstatus)); - DHD_ERROR(("Waited %u usec, dongle is not ready\n", tmo.elapsed)); - ret = -1; - goto exit; - } -#else /* !BCMSPI */ /* Force clocks on backplane to be sure F2 interrupt propagates */ saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); @@ -4241,7 +3722,6 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) } if (err) { DHD_ERROR(("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err)); - ret = -1; goto exit; } @@ -4259,9 +3739,7 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) while (ready != enable && !dhd_timeout_expired(&tmo)) ready = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IORDY, NULL); -#endif /* !BCMSPI */ - - DHD_ERROR(("%s: enable 0x%02x, ready 0x%02x (waited %uus)\n", + DHD_INFO(("%s: enable 0x%02x, ready 0x%02x (waited %uus)\n", __FUNCTION__, enable, ready, tmo.elapsed)); @@ -4275,13 +3753,11 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) /* Set up the interrupt mask and enable interrupts */ bus->hostintmask = HOSTINTMASK; /* corerev 4 could use the newer interrupt logic to detect the frames */ -#ifndef BCMSPI if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev == 4) && (bus->rxint_mode != SDIO_DEVICE_HMB_RXINT)) { bus->hostintmask &= ~I_HMB_FRAME_IND; bus->hostintmask |= I_XMTDATA_AVAIL; } -#endif /* BCMSPI */ W_SDREG(bus->hostintmask, &bus->regs->hostintmask, retries); bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, &err); @@ -4302,7 +3778,6 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) } -#ifndef BCMSPI else { /* Disable F2 again */ @@ -4310,12 +3785,13 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, enable, NULL); } +#ifdef BCM4334_CHIP if (dhdsdio_sr_cap(bus)) dhdsdio_sr_init(bus); else +#endif /* BCM4334_CHIP */ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err); -#endif /* !BCMSPI */ /* If we didn't come up, turn off backplane clock */ if (dhdp->busstate != DHD_BUS_DATA) @@ -4492,11 +3968,6 @@ done: dhd_os_ioctl_resp_wake(bus->dhd); } -#ifdef CUSTOMER_HW4 -int pkt_free; -int caller; -void *free_ptr; -#endif static uint8 dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) { @@ -4519,9 +3990,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) int ifidx = 0; bool usechain = bus->use_rxchain; -#ifdef CUSTOMER_HW4 - pkt_free = 0; -#endif /* If packets, issue read(s) and send up packet chain */ /* Return sequence numbers consumed? */ @@ -4545,8 +4013,8 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) sublen = ltoh16_ua(dptr); dlen -= sizeof(uint16); dptr += sizeof(uint16); - if ((sublen < SDPCM_HDRLEN_RX) || - ((num == 0) && (sublen < (2 * SDPCM_HDRLEN_RX)))) { + if ((sublen < SDPCM_HDRLEN) || + ((num == 0) && (sublen < (2 * SDPCM_HDRLEN)))) { DHD_ERROR(("%s: descriptor len %d bad: %d\n", __FUNCTION__, num, sublen)); pnext = NULL; @@ -4715,11 +4183,10 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) } else if (SDPCM_GLOMDESC(&dptr[SDPCM_FRAMETAG_LEN])) { DHD_ERROR(("%s (superframe): got second descriptor?\n", __FUNCTION__)); errcode = -1; - } else if ((doff < SDPCM_HDRLEN_RX) || - (doff > (PKTLEN(osh, pfirst) - SDPCM_HDRLEN_RX))) { + } else if ((doff < SDPCM_HDRLEN) || + (doff > (PKTLEN(osh, pfirst) - SDPCM_HDRLEN))) { DHD_ERROR(("%s (superframe): Bad data offset %d: HW %d pkt %d min %d\n", - __FUNCTION__, doff, sublen, PKTLEN(osh, pfirst), - SDPCM_HDRLEN_RX)); + __FUNCTION__, doff, sublen, PKTLEN(osh, pfirst), SDPCM_HDRLEN)); errcode = -1; } @@ -4763,7 +4230,7 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) "len/check 0x%04x/0x%04x\n", __FUNCTION__, num, sublen, check)); errcode = -1; - } else if ((sublen > dlen) || (sublen < SDPCM_HDRLEN_RX)) { + } else if ((sublen > dlen) || (sublen < SDPCM_HDRLEN)) { DHD_ERROR(("%s (subframe %d): length mismatch: " "len 0x%04x, expect 0x%04x\n", __FUNCTION__, num, sublen, dlen)); @@ -4773,9 +4240,9 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) DHD_ERROR(("%s (subframe %d): bad channel %d\n", __FUNCTION__, num, chan)); errcode = -1; - } else if ((doff < SDPCM_HDRLEN_RX) || (doff > sublen)) { + } else if ((doff < SDPCM_HDRLEN) || (doff > sublen)) { DHD_ERROR(("%s (subframe %d): Bad data offset %d: HW %d min %d\n", - __FUNCTION__, num, doff, sublen, SDPCM_HDRLEN_RX)); + __FUNCTION__, num, doff, sublen, SDPCM_HDRLEN)); errcode = -1; } } @@ -4839,11 +4306,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) reorder_info_len = sizeof(reorder_info_buf); if (PKTLEN(osh, pfirst) == 0) { -#ifdef CUSTOMER_HW4 - pkt_free = 1; - caller = 1; - free_ptr = pfirst; -#endif PKTFREE(bus->dhd->osh, pfirst, FALSE); if (plast) { PKTSETNEXT(osh, plast, pnext); @@ -4899,7 +4361,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) else { /* this packet will go up, link back into chain and count it */ plast = pfirst; - if (list_tail[ifidx] == NULL) { list_head[ifidx] = list_tail[ifidx] = pfirst; } @@ -4921,7 +4382,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) #endif /* DHD_DEBUG */ } dhd_os_sdunlock_rxq(bus->dhd); - for (idx = 0; idx < DHD_MAX_IFS; idx++) { if (list_head[idx]) { void *temp; @@ -4964,9 +4424,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) uint rxleft = 0; /* Remaining number of frames allowed */ int sdret; /* Return code from bcmsdh calls */ uint8 txmax; /* Maximum tx sequence offered */ -#ifdef BCMSPI - uint32 dstatus = 0; /* gSPI device status bits of */ -#endif /* BCMSPI */ bool len_consistent; /* Result of comparing readahead len and len from hw-hdr */ uint8 *rxbuf; int ifidx = 0; @@ -4979,13 +4436,9 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) bool sdtest = FALSE; /* To limit message spew from test mode */ #endif -#ifdef CUSTOMER_HW4 - pkt_free = 0; -#endif DHD_TRACE(("%s: Enter\n", __FUNCTION__)); bus->readframes = TRUE; - if (!KSO_ENAB(bus)) { DHD_ERROR(("%s: KSO off\n", __FUNCTION__)); bus->readframes = FALSE; @@ -5005,38 +4458,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) /* Not finished unless we encounter no more frames indication */ *finished = FALSE; -#ifdef BCMSPI - /* Get pktlen from gSPI device F0 reg. */ - if (bus->bus == SPI_BUS) { - /* Peek in dstatus bits and find out size to do rx-read. */ - dstatus = bcmsdh_get_dstatus(bus->sdh); - if (dstatus == 0) - DHD_ERROR(("%s:ZERO spi dstatus, a case observed in PR61352 hit !!!\n", - __FUNCTION__)); - - DHD_TRACE(("Device status from regread = 0x%x\n", dstatus)); - DHD_TRACE(("Device status from bit-reconstruction = 0x%x\n", - bcmsdh_get_dstatus((void *)bus->sdh))); - - if ((dstatus & STATUS_F2_PKT_AVAILABLE) && (((dstatus & STATUS_UNDERFLOW)) == 0)) { - bus->nextlen = ((dstatus & STATUS_F2_PKT_LEN_MASK) >> - STATUS_F2_PKT_LEN_SHIFT); - /* '0' size with pkt-available interrupt is eqvt to 2048 bytes */ - bus->nextlen = (bus->nextlen == 0) ? SPI_MAX_PKT_LEN : bus->nextlen; - if (bus->dwordmode) - bus->nextlen = bus->nextlen << 2; - DHD_TRACE(("Entering %s: length to be read from gSPI = %d\n", - __FUNCTION__, bus->nextlen)); - } else { - if (dstatus & STATUS_F2_PKT_AVAILABLE) - DHD_ERROR(("Underflow during %s.\n", __FUNCTION__)); - else - DHD_ERROR(("False pkt-available intr.\n")); - *finished = TRUE; - return (maxframes - rxleft); - } - } -#endif /* BCMSPI */ for (rxseq = bus->rx_seq, rxleft = maxframes; !bus->rxskip && rxleft && bus->dhd->busstate != DHD_BUS_DOWN; @@ -5113,20 +4534,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) bus->f2rxdata++; ASSERT(sdret != BCME_PENDING); -#ifdef BCMSPI - if (bcmsdh_get_dstatus((void *)bus->sdh) & - STATUS_UNDERFLOW) { - bus->nextlen = 0; - *finished = TRUE; - DHD_ERROR(("%s: read %d control bytes failed " - "due to spi underflow\n", - __FUNCTION__, rdlen)); - /* dhd.rx_ctlerrs is higher level */ - bus->rxc_errors++; - dhd_os_sdunlock_rxq(bus->dhd); - continue; - } -#endif /* BCMSPI */ /* Control frame failures need retransmission */ if (sdret < 0) { @@ -5162,19 +4569,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) pkt, NULL, NULL); bus->f2rxdata++; ASSERT(sdret != BCME_PENDING); -#ifdef BCMSPI - if (bcmsdh_get_dstatus((void *)bus->sdh) & STATUS_UNDERFLOW) { - bus->nextlen = 0; - *finished = TRUE; - DHD_ERROR(("%s (nextlen): read %d bytes failed due " - "to spi underflow\n", - __FUNCTION__, rdlen)); - PKTFREE(bus->dhd->osh, pkt, FALSE); - bus->dhd->rx_errors++; - dhd_os_sdunlock_rxq(bus->dhd); - continue; - } -#endif /* BCMSPI */ if (sdret < 0) { DHD_ERROR(("%s (nextlen): read %d bytes failed: %d\n", @@ -5193,7 +4587,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) dhd_os_sdunlock_rxq(bus->dhd); /* Now check the header */ - bcopy(rxbuf, bus->rxhdr, SDPCM_HDRLEN_RX); + bcopy(rxbuf, bus->rxhdr, SDPCM_HDRLEN); /* Extract hardware header fields */ len = ltoh16_ua(bus->rxhdr); @@ -5225,7 +4619,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) } /* Validate frame length */ - if (len < SDPCM_HDRLEN_RX) { + if (len < SDPCM_HDRLEN) { DHD_ERROR(("%s (nextlen): HW hdr length invalid: %d\n", __FUNCTION__, len)); dhd_os_sdlock_rxq(bus->dhd); @@ -5236,21 +4630,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) } /* Check for consistency with readahead info */ -#ifdef BCMSPI - if (bus->bus == SPI_BUS) { - if (bus->dwordmode) { - uint16 spilen; - if ((bus->sih->chip == BCM4329_CHIP_ID) && - (bus->sih->chiprev == 2)) - spilen = ROUNDUP(len, 16); - else - spilen = ROUNDUP(len, 4); - - len_consistent = (nextlen != spilen); - } else - len_consistent = (nextlen != len); - } else -#endif /* BCMSPI */ len_consistent = (nextlen != (ROUNDUP(len, 16) >> 4)); if (len_consistent) { /* Mismatch, force retry w/normal header (may be >4K) */ @@ -5272,29 +4651,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) doff = SDPCM_DOFFSET_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); txmax = SDPCM_WINDOW_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); -#ifdef BCMSPI - /* Save the readahead length if there is one */ - if (bus->bus == SPI_BUS) { - /* Use reconstructed dstatus bits and find out readahead size */ - dstatus = bcmsdh_get_dstatus((void *)bus->sdh); - DHD_INFO(("Device status from bit-reconstruction = 0x%x\n", - bcmsdh_get_dstatus((void *)bus->sdh))); - if (dstatus & STATUS_F2_PKT_AVAILABLE) { - bus->nextlen = ((dstatus & STATUS_F2_PKT_LEN_MASK) >> - STATUS_F2_PKT_LEN_SHIFT); - bus->nextlen = (bus->nextlen == 0) ? - SPI_MAX_PKT_LEN : bus->nextlen; - if (bus->dwordmode) - bus->nextlen = bus->nextlen << 2; - DHD_INFO(("readahead len from gSPI = %d \n", - bus->nextlen)); - bus->dhd->rx_readahead_cnt ++; - } else { - bus->nextlen = 0; - *finished = TRUE; - } - } else { -#endif /* BCMSPI */ bus->nextlen = bus->rxhdr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; if ((bus->nextlen << 4) > MAX_RX_DATASZ) { @@ -5305,9 +4661,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) } bus->dhd->rx_readahead_cnt ++; -#ifdef BCMSPI - } -#endif /* BCMSPI */ /* Handle Flow Control */ fcbits = SDPCM_FCMASK_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); @@ -5336,19 +4689,9 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) /* Check window for sanity */ if ((uint8)(txmax - bus->tx_seq) > 0x40) { -#ifdef BCMSPI - if ((bus->bus == SPI_BUS) && !(dstatus & STATUS_F2_RX_READY)) { - DHD_ERROR(("%s: got unlikely tx max %d with tx_seq %d\n", - __FUNCTION__, txmax, bus->tx_seq)); - txmax = bus->tx_seq + 2; - } else { -#endif /* BCMSPI */ DHD_ERROR(("%s: got unlikely tx max %d with tx_seq %d\n", __FUNCTION__, txmax, bus->tx_seq)); txmax = bus->tx_max; -#ifdef BCMSPI - } -#endif /* BCMSPI */ } bus->tx_max = txmax; @@ -5356,7 +4699,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) if (DHD_BYTES_ON() && DHD_DATA_ON()) { prhex("Rx Data", rxbuf, len); } else if (DHD_HDRS_ON()) { - prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN_RX); + prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN); } #endif @@ -5389,9 +4732,9 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) } /* Validate data offset */ - if ((doff < SDPCM_HDRLEN_RX) || (doff > len)) { + if ((doff < SDPCM_HDRLEN) || (doff > len)) { DHD_ERROR(("%s (nextlen): bad data offset %d: HW len %d min %d\n", - __FUNCTION__, doff, len, SDPCM_HDRLEN_RX)); + __FUNCTION__, doff, len, SDPCM_HDRLEN)); dhd_os_sdlock_rxq(bus->dhd); PKTFREE2(); dhd_os_sdunlock_rxq(bus->dhd); @@ -5423,7 +4766,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) #ifdef DHD_DEBUG if (DHD_BYTES_ON() || DHD_HDRS_ON()) { - prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN_RX); + prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN); } #endif @@ -5447,7 +4790,7 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) } /* Validate frame length */ - if (len < SDPCM_HDRLEN_RX) { + if (len < SDPCM_HDRLEN) { DHD_ERROR(("%s: HW hdr length invalid: %d\n", __FUNCTION__, len)); continue; } @@ -5459,9 +4802,9 @@ dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) txmax = SDPCM_WINDOW_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); /* Validate data offset */ - if ((doff < SDPCM_HDRLEN_RX) || (doff > len)) { + if ((doff < SDPCM_HDRLEN) || (doff > len)) { DHD_ERROR(("%s: Bad data offset %d: HW len %d, min %d seq %d\n", - __FUNCTION__, doff, len, SDPCM_HDRLEN_RX, seq)); + __FUNCTION__, doff, len, SDPCM_HDRLEN, seq)); bus->rx_badhdr++; ASSERT(0); dhdsdio_rxfail(bus, FALSE, FALSE); @@ -5602,8 +4945,8 @@ deliver: } #endif PKTSETLEN(osh, pkt, len); - ASSERT(doff == SDPCM_HDRLEN_RX); - PKTPULL(osh, pkt, SDPCM_HDRLEN_RX); + ASSERT(doff == SDPCM_HDRLEN); + PKTPULL(osh, pkt, SDPCM_HDRLEN); bus->glomd = pkt; } else { DHD_ERROR(("%s: glom superframe w/o descriptor!\n", __FUNCTION__)); @@ -5626,11 +4969,6 @@ deliver: if (PKTLEN(osh, pkt) == 0) { dhd_os_sdlock_rxq(bus->dhd); -#ifdef CUSTOMER_HW4 - pkt_free = 1; - caller = 0; - free_ptr = pkt; -#endif PKTFREE(bus->dhd->osh, pkt, FALSE); dhd_os_sdunlock_rxq(bus->dhd); continue; @@ -5671,12 +5009,6 @@ deliver: if (bus->rxskip) rxseq--; bus->rx_seq = rxseq; - - if (bus->reqbussleep) - { - dhdsdio_bussleep(bus, TRUE); - bus->reqbussleep = FALSE; - } bus->readframes = FALSE; return rxcount; @@ -5719,7 +5051,6 @@ dhdsdio_hostmail(dhd_bus_t *bus) bus->sdpcm_ver, SDPCM_PROT_VERSION)); else DHD_INFO(("Dongle ready, protocol version %d\n", bus->sdpcm_ver)); -#ifndef BCMSPI /* make sure for the SDIO_DEVICE_RXDATAINT_MODE_1 corecontrol is proper */ if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev >= 4) && (bus->rxint_mode == SDIO_DEVICE_RXDATAINT_MODE_1)) { @@ -5732,10 +5063,11 @@ dhdsdio_hostmail(dhd_bus_t *bus) val = R_REG(bus->dhd->osh, &bus->regs->corecontrol); } -#endif /* BCMSPI */ #ifdef DHD_DEBUG /* Retrieve console state address now that firmware should have updated it */ + // Kent: tempoprary rollback - firmware should be modified for a correct dconpoll operation + // if(dhd_console_ms > 0) { sdpcm_shared_t shared; if (dhdsdio_readshared(bus, &shared) == 0) @@ -5877,12 +5209,10 @@ dhdsdio_dpc(dhd_bus_t *bus) bus->fcstate = !!(newstatus & I_HMB_FC_STATE); if (newstatus) { bus->f1regdata++; -#ifndef BCMSPI if ((bus->rxint_mode == SDIO_DEVICE_RXDATAINT_MODE_0) && (newstatus == I_XMTDATA_AVAIL)) { } else -#endif /* BCMSPI */ W_SDREG(newstatus, ®s->intstatus, retries); } } @@ -5963,17 +5293,31 @@ clkwait: DHD_INTR(("%s: enable SDIO interrupts, rxdone %d framecnt %d\n", __FUNCTION__, rxdone, framecnt)); bus->intdis = FALSE; -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) bcmsdh_oob_intr_set(1); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* (OOB_INTR_ONLY) */ bcmsdh_intr_enable(sdh); } +#if defined(OOB_INTR_ONLY) && !defined(HW_OOB) + /* In case of SW-OOB(using edge trigger), + * Check interrupt status in the dongle again after enable irq on the host. + * and rechedule dpc if interrupt is pended in the dongle. + * There is a chance to miss OOB interrupt while irq is disabled on the host. + * No need to do this with HW-OOB(level trigger) + */ + R_SDREG(newstatus, ®s->intstatus, retries); + if (bcmsdh_regfail(bus->sdh)) + newstatus = 0; + if (newstatus & bus->hostintmask) { + bus->ipend = TRUE; + resched = TRUE; + } +#endif /* defined(OOB_INTR_ONLY) && !defined(HW_OOB) */ + if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) { int ret, i; - uint8* frame_seq = bus->ctrl_frame_buf + SDPCM_FRAMETAG_LEN; - if (*frame_seq != bus->tx_seq) { DHD_INFO(("%s IOCTL frame seq lag detected!" " frm_seq:%d != bus->tx_seq:%d, corrected\n", @@ -6031,7 +5375,7 @@ clkwait: /* Resched if events or tx frames are pending, else await next interrupt */ /* On failed register access, all bets are off: no resched or interrupts */ if ((bus->dhd->busstate == DHD_BUS_DOWN) || bcmsdh_regfail(sdh)) { - if ((bus->sih && bus->sih->buscorerev >= 12) && !(dhdsdio_sleepcsr_get(bus) & + if ((bus->sih->buscorerev >= 12) && !(dhdsdio_sleepcsr_get(bus) & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { /* Bus failed because of KSO */ DHD_ERROR(("%s: Bus failed due to KSO\n", __FUNCTION__)); @@ -6126,11 +5470,9 @@ dhdsdio_isr(void *arg) while (dhdsdio_dpc(bus)); DHD_OS_WAKE_UNLOCK(bus->dhd); #else - bus->dpc_sched = TRUE; dhd_sched_dpc(bus->dhd); - -#endif +#endif } @@ -6150,7 +5492,7 @@ dhdsdio_pktgen_init(dhd_bus_t *bus) /* Default to per-watchdog burst with 10s print time */ bus->pktgen_freq = 1; - bus->pktgen_print = dhd_watchdog_ms ? (10000/dhd_watchdog_ms):0; + bus->pktgen_print = 10000 / dhd_watchdog_ms; bus->pktgen_count = (dhd_pktgen * dhd_watchdog_ms + 999) / 1000; /* Default to echo mode */ @@ -6242,7 +5584,7 @@ dhdsdio_pktgen(dhd_bus_t *bus) #endif /* Send it */ - if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE)) { + if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE)) { bus->pktgen_fail++; if (bus->pktgen_stop && bus->pktgen_stop == bus->pktgen_fail) bus->pktgen_count = 0; @@ -6281,7 +5623,7 @@ dhdsdio_sdtest_set(dhd_bus_t *bus, uint8 count) *data++ = (bus->pktgen_maxlen >> 8); /* Send it */ - if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE)) + if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE)) bus->pktgen_fail++; } @@ -6326,7 +5668,7 @@ dhdsdio_testrcv(dhd_bus_t *bus, void *pkt, uint seq) case SDPCM_TEST_ECHOREQ: /* Rx->Tx turnaround ok (even on NDIS w/current implementation) */ *(uint8 *)(PKTDATA(osh, pkt)) = SDPCM_TEST_ECHORSP; - if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE) == 0) { + if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE) == 0) { bus->pktgen_sent++; } else { bus->pktgen_fail++; @@ -6406,6 +5748,7 @@ dhd_disable_intr(dhd_pub_t *dhdp) bcmsdh_intr_disable(bus->sdh); } + extern bool dhd_bus_watchdog(dhd_pub_t *dhdp) { @@ -6435,21 +5778,12 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) /* Check device if no interrupts */ if (!bus->intr || (bus->intrcount == bus->lastintrs)) { -#ifndef BCMSPI if (!bus->dpc_sched) { uint8 devpend; devpend = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTPEND, NULL); intstatus = devpend & (INTR_STATUS_FUNC1 | INTR_STATUS_FUNC2); } -#else - if (!bus->dpc_sched) { - uint32 devpend; - devpend = bcmsdh_cfg_read_word(bus->sdh, SDIO_FUNC_0, - SPID_STATUS_REG, NULL); - intstatus = devpend & STATUS_F2_PKT_AVAILABLE; - } -#endif /* !BCMSPI */ /* If there is something, make like the ISR and schedule the DPC */ if (intstatus) { @@ -6497,35 +5831,32 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) /* On idle timeout clear activity flag and/or turn off clock */ #ifdef DHD_USE_IDLECOUNT - if (bus->activity) - bus->activity = FALSE; - else { + + if (bus->activity) + bus->activity = FALSE; + else { bus->idlecount++; if (bus->idlecount >= bus->idletime) { - DHD_TIMER(("%s: DHD Idle state!!\n", __FUNCTION__)); + DHD_TIMER(("%s: DHD Idle state!!\n", __FUNCTION__)); - if (SLPAUTO_ENAB(bus)) { - if (dhdsdio_bussleep(bus, TRUE) != BCME_BUSY) - dhd_os_wd_timer(bus->dhd, 0); + if (SLPAUTO_ENAB(bus)) { + if (dhdsdio_bussleep(bus, TRUE) != BCME_BUSY) + dhd_os_wd_timer(bus->dhd, 0); } else - dhdsdio_clkctl(bus, CLK_NONE, FALSE); + dhdsdio_clkctl(bus, CLK_NONE, FALSE); bus->idlecount = 0; - } - } + } + } #else if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) { - if (++bus->idlecount > bus->idletime) { + if (++bus->idlecount >= bus->idletime) { bus->idlecount = 0; if (bus->activity) { bus->activity = FALSE; - if (SLPAUTO_ENAB(bus)) { - if (!bus->readframes) - dhdsdio_bussleep(bus, TRUE); - else - bus->reqbussleep = TRUE; - } + if (SLPAUTO_ENAB(bus)) + dhdsdio_bussleep(bus, TRUE); else dhdsdio_clkctl(bus, CLK_NONE, FALSE); } @@ -6584,7 +5915,7 @@ dhd_bus_console_in(dhd_pub_t *dhdp, uchar *msg, uint msglen) * sdpcm_sendup (RX) checks for virtual console input. */ if ((pkt = PKTGET(bus->dhd->osh, 4 + SDPCM_RESERVE, TRUE)) != NULL) - dhdsdio_txpkt(bus, pkt, SDPCM_EVENT_CHANNEL, TRUE, FALSE); + dhdsdio_txpkt(bus, pkt, SDPCM_EVENT_CHANNEL, TRUE); done: if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { @@ -6655,8 +5986,6 @@ dhdsdio_chipmatch(uint16 chipid) return TRUE; if (chipid == BCM4324_CHIP_ID) return TRUE; - if (chipid == BCM4335_CHIP_ID) - return TRUE; return FALSE; } @@ -6689,11 +6018,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, */ dhd_txbound = DHD_TXBOUND; dhd_rxbound = DHD_RXBOUND; -#ifdef BCMSPI - dhd_alignctl = FALSE; -#else dhd_alignctl = TRUE; -#endif /* BCMSPI */ sd1idle = TRUE; dhd_readahead = TRUE; retrydata = FALSE; @@ -6701,11 +6026,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, dhd_dongle_memsize = 0; dhd_txminmax = DHD_TXMINMAX; -#ifdef BCMSPI - forcealign = FALSE; -#else forcealign = TRUE; -#endif /* !BCMSPI */ DHD_TRACE(("%s: Enter\n", __FUNCTION__)); DHD_INFO(("%s: venid 0x%04x devid 0x%04x\n", __FUNCTION__, venid, devid)); @@ -6797,6 +6118,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, goto fail; } + /* Allocate buffers */ if (!(dhdsdio_probe_malloc(bus, osh, sdh))) { DHD_ERROR(("%s: dhdsdio_probe_malloc failed\n", __FUNCTION__)); @@ -6826,7 +6148,7 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, DHD_INFO(("%s: completed!!\n", __FUNCTION__)); #ifdef GET_CUSTOM_MAC_ENABLE - /* Read MAC address from external customer place */ + /* Read MAC address from external customer place */ memset(&ea_addr, 0, sizeof(ea_addr)); ret = dhd_custom_get_mac_address(ea_addr.octet); if (!ret) { @@ -6846,11 +6168,12 @@ dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, goto fail; } -#if defined(CUSTOMER_HW4) && defined(BCMHOST_XTAL_PU_TIME_MOD) +#ifdef BCMHOST_XTAL_PU_TIME_MOD +#ifdef BCM4334_CHIP bcmsdh_reg_write(bus->sdh, 0x18000620, 2, 11); bcmsdh_reg_write(bus->sdh, 0x18000628, 4, 0x00F80001); #endif - +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) mutex_unlock(&_dhd_sdio_mutex_lock_); DHD_ERROR(("%s : the lock is released.\n", __FUNCTION__)); @@ -6874,10 +6197,13 @@ static bool dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, uint16 devid) { -#ifndef BCMSPI int err = 0; uint8 clkctl = 0; -#endif /* !BCMSPI */ + +#ifdef BCM4334_CHECK_CHIP_REV + uint8 data[4]; + uint32 unique_id; +#endif bus->alp_only = TRUE; bus->sih = NULL; @@ -6893,12 +6219,8 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, #endif /* DHD_DEBUG */ -#ifndef BCMSPI /* wake-wlan in gSPI will bring up the htavail/alpavail clocks. */ /* Force PLL off until si_attach() programs PLL control regs */ - - - bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, DHD_INIT_CLKCTL1, &err); if (!err) clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); @@ -6909,15 +6231,12 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, goto fail; } -#endif /* !BCMSPI */ - #ifdef DHD_DEBUG if (DHD_INFO_ON()) { uint fn, numfn; uint8 *cis[SDIOD_MAX_IOFUNCS]; int err = 0; -#ifndef BCMSPI numfn = bcmsdh_query_iofnum(sdh); ASSERT(numfn <= SDIOD_MAX_IOFUNCS); @@ -6930,9 +6249,6 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, DHD_INIT_CLKCTL2, &err); OSL_DELAY(65); -#else - numfn = 0; /* internally func is hardcoded to 1 as gSPI has cis on F1 only */ -#endif /* !BCMSPI */ for (fn = 0; fn <= numfn; fn++) { if (!(cis[fn] = MALLOC(osh, SBSDIO_CIS_SIZE_LIMIT))) { @@ -6970,6 +6286,20 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, bcmsdh_chipinfo(sdh, bus->sih->chip, bus->sih->chiprev); +#ifdef BCM4334_CHECK_CHIP_REV + if (bus->sih->chip == BCM4334_CHIP_ID) { + g_chipver = bus->sih->chiprev; + if (g_chipver == 0x2) { + dhdsdio_membytes(bus, FALSE, REV_ID_ADDR, data, 4); + unique_id = load32_ua(data); + if (unique_id == 0x30312E36) + g_chipver = 0x1; + } + } else { + g_chipver = 0; + } +#endif + if (!dhdsdio_chipmatch((uint16)bus->sih->chip)) { DHD_ERROR(("%s: unsupported chip: 0x%04x\n", __FUNCTION__, bus->sih->chip)); @@ -6990,28 +6320,17 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, /* Get info on the ARM and SOCRAM cores... */ if (!DHD_NOPMU(bus)) { if ((si_setcore(bus->sih, ARM7S_CORE_ID, 0)) || - (si_setcore(bus->sih, ARMCM3_CORE_ID, 0)) || - (si_setcore(bus->sih, ARMCR4_CORE_ID, 0))) { + (si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { bus->armrev = si_corerev(bus->sih); } else { DHD_ERROR(("%s: failed to find ARM core!\n", __FUNCTION__)); goto fail; } - - if (!si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { if (!(bus->orig_ramsize = si_socram_size(bus->sih))) { DHD_ERROR(("%s: failed to find SOCRAM memory!\n", __FUNCTION__)); goto fail; } - } else { - /* cr4 has a different way to find the RAM size from TCM's */ - if (!(bus->orig_ramsize = si_tcm_size(bus->sih))) { - DHD_ERROR(("%s: failed to find CR4-TCM memory!\n", __FUNCTION__)); - goto fail; - } - /* also populate base address */ - bus->dongle_ram_base = CR4_RAM_BASE; - } + bus->ramsize = bus->orig_ramsize; if (dhd_dongle_memsize) dhd_dongle_setmemsize(bus, dhd_dongle_memsize); @@ -7032,7 +6351,6 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, /* Set core control so an SDIO reset does a backplane reset */ OR_REG(osh, &bus->regs->corecontrol, CC_BPRESEN); -#ifndef BCMSPI bus->rxint_mode = SDIO_DEVICE_HMB_RXINT; if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev >= 4) && @@ -7045,7 +6363,6 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, val |= CC_XMTDATAAVAIL_CTRL; W_REG(osh, &bus->regs->corecontrol, val); } -#endif /* BCMSPI */ pktq_init(&bus->txq, (PRIOMASK + 1), QLEN); @@ -7058,20 +6375,11 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, if ((bus->poll = (bool)dhd_poll)) bus->pollrate = 1; -#ifdef BCMSDIOH_TXGLOM - /* Setting default Glom mode */ - bus->glom_mode = SDPCM_TXGLOM_CPY; - /* Setting default Glom size */ - bus->glomsize = SDPCM_DEFGLOM_SIZE; -#endif - return TRUE; fail: - if (bus->sih != NULL) { + if (bus->sih != NULL) si_detach(bus->sih); - bus->sih = NULL; - } return FALSE; } @@ -7121,20 +6429,16 @@ dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh) dhdsdio_pktgen_init(bus); #endif /* SDTEST */ -#ifndef BCMSPI /* Disable F2 to clear any intermediate frame state on the dongle */ bcmsdh_cfg_write(sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); -#endif /* !BCMSPI */ bus->dhd->busstate = DHD_BUS_DOWN; bus->sleeping = FALSE; bus->rxflow = FALSE; bus->prev_rxlim_hit = 0; -#ifndef BCMSPI /* Done with backplane-dependent accesses, can drop clock... */ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL); -#endif /* !BCMSPI */ /* ...and initialize clock/power states */ bus->clkstate = CLK_SDONLY; @@ -7196,15 +6500,6 @@ dhd_bus_download_firmware(struct dhd_bus *bus, osl_t *osh, ret = dhdsdio_download_firmware(bus, osh, bus->sdh); -#ifdef BCMSPI -#ifdef GSPI_DWORD_MODE - /* Enable the dwordmode in gSPI before first F2 transaction */ - if ((bus->sih->chip == BCM4329_CHIP_ID) && (bus->sih->chiprev > 1)) { - bcmsdh_dwordmode(bus->sdh, TRUE); - bus->dwordmode = TRUE; - } -#endif /* GSPI_DWORD_MODE */ -#endif /* BCMSPI */ return ret; } @@ -7320,7 +6615,6 @@ dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, bool dongle_isolation, bool r dhdsdio_clkctl(bus, CLK_NONE, FALSE); } si_detach(bus->sih); - bus->sih = NULL; if (bus->vars && bus->varsz) MFREE(osh, bus->vars, bus->varsz); bus->vars = NULL; @@ -7352,12 +6646,13 @@ dhdsdio_disconnect(void *ptr) dhdsdio_release(bus, bus->dhd->osh); } + DHD_TRACE(("%s: Disconnected\n", __FUNCTION__)); + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) mutex_unlock(&_dhd_sdio_mutex_lock_); DHD_ERROR(("%s : the lock is released.\n", __FUNCTION__)); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ - DHD_TRACE(("%s: Disconnected\n", __FUNCTION__)); } @@ -7721,20 +7016,6 @@ dhd_bcmsdh_send_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf return (bcmsdh_send_buf(bus->sdh, addr, fn, flags, buf, nbytes, pkt, complete, handle)); } -#ifdef BCMSDIOH_TXGLOM -static void -dhd_bcmsdh_glom_post(dhd_bus_t *bus, uint8 *frame, uint len) -{ - bcmsdh_glom_post(bus->sdh, frame, len); -} - -static void -dhd_bcmsdh_glom_clear(dhd_bus_t *bus) -{ - bcmsdh_glom_clear(bus->sdh); -} -#endif - uint dhd_bus_chip(struct dhd_bus *bus) { @@ -7780,19 +7061,16 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) /* Stop the bus, disable F2 */ dhd_bus_stop(bus, FALSE); -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) /* Clean up any pending IRQ */ bcmsdh_set_irq(FALSE); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ /* Clean tx/rx buffer pointers, detach from the dongle */ dhdsdio_release_dongle(bus, bus->dhd->osh, TRUE, TRUE); bus->dhd->dongle_reset = TRUE; bus->dhd->up = FALSE; -#ifdef BCMSDIOH_TXGLOM - dhd_txglom_enable(dhdp, FALSE); -#endif dhd_os_sdunlock(dhdp); DHD_TRACE(("%s: WLAN OFF DONE\n", __FUNCTION__)); @@ -7823,12 +7101,10 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) /* Re-init bus, enable F2 transfer */ bcmerror = dhd_bus_init((dhd_pub_t *) bus->dhd, FALSE); if (bcmerror == BCME_OK) { -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) bcmsdh_set_irq(TRUE); -#ifndef BCMSPI_ANDROID dhd_enable_oob_intr(bus, TRUE); -#endif /* !BCMSPI_ANDROID */ -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ bus->dhd->dongle_reset = FALSE; bus->dhd->up = TRUE; @@ -7836,14 +7112,9 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) #if !defined(IGNORE_ETH0_DOWN) /* Restore flow control */ dhd_txflowcontrol(bus->dhd, ALL_INTERFACES, OFF); -#endif +#endif dhd_os_wd_timer(dhdp, dhd_watchdog_ms); -#ifdef BCMSDIOH_TXGLOM - if ((dhdp->busstate == DHD_BUS_DATA) && - bcmsdh_glom_enabled()) { - dhd_txglom_enable(dhdp, TRUE); - } -#endif /* BCMSDIOH_TXGLOM */ + DHD_TRACE(("%s: WLAN ON DONE\n", __FUNCTION__)); } else { dhd_bus_stop(bus, FALSE); @@ -7872,30 +7143,6 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) return bcmerror; } -/* Get Chip ID version */ -uint dhd_bus_chip_id(dhd_pub_t *dhdp) -{ - dhd_bus_t *bus = dhdp->bus; - - return bus->sih->chip; -} - -/* Get Chip Rev ID version */ -uint dhd_bus_chiprev_id(dhd_pub_t *dhdp) -{ - dhd_bus_t *bus = dhdp->bus; - - return bus->sih->chiprev; -} - -/* Get Chip Pkg ID version */ -uint dhd_bus_chippkg_id(dhd_pub_t *dhdp) -{ - dhd_bus_t *bus = dhdp->bus; - - return bus->sih->chippkg; -} - int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size) { @@ -7904,65 +7151,3 @@ dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint si bus = dhdp->bus; return dhdsdio_membytes(bus, set, address, data, size); } -#if defined(SUPPORT_MULTIPLE_REVISION) -static int -concate_revision_bcm4334(dhd_bus_t *bus, char *path, int path_len) -{ -#define REV_ID_ADDR 0x1E008F90 -#define BCM4334_B1_UNIQUE 0x30312E36 - - uint chipver; - uint32 unique_id; - uint8 data[4]; - char chipver_tag[4] = "_b0"; - - DHD_TRACE(("%s: BCM4334 Multiple Revision Check\n", __FUNCTION__)); - if (bus->sih->chip != BCM4334_CHIP_ID) { - DHD_ERROR(("%s:Chip is not BCM4334\n", __FUNCTION__)); - return -1; - } - chipver = bus->sih->chiprev; - if (chipver == 0x2) { - dhdsdio_membytes(bus, FALSE, REV_ID_ADDR, data, 4); - unique_id = load32_ua(data); - if (unique_id == BCM4334_B1_UNIQUE) - chipver = 0x01; - } - DHD_ERROR(("CHIP VER = [0x%x]\n", chipver)); - if (chipver == 1) { - DHD_ERROR(("----- CHIP bcm4334_B0 -----\n")); - chipver_tag[2] = '0'; - strcpy(chipver_tag, "_b0"); - } else if (chipver == 2) { - DHD_ERROR(("----- CHIP bcm4334_B1 -----\n")); - chipver_tag[2] = '1'; - } else if (chipver == 3) { - DHD_ERROR(("----- CHIP bcm4334_B2 -----\n")); - chipver_tag[2] = '2'; - strcpy(chipver_tag, "_b2"); - } - else { - DHD_ERROR(("----- Invalid chip version -----\n")); - return -1; - } - strcat(path, chipver_tag); -#undef REV_ID_ADDR -#undef BCM4334_B1_UNIQUE - return 0; -} - -int -concate_revision(dhd_bus_t *bus, char *path, int path_len) -{ - - if (!bus || !bus->sih) { - DHD_ERROR(("%s:Bus is Invalid\n", __FUNCTION__)); - return -1; - } - if (bus->sih->chip == BCM4334_CHIP_ID) { - return concate_revision_bcm4334(bus, path, path_len); - } - DHD_ERROR(("REVISION SPECIFIC feature is not required\n")); - return -1; -} -#endif /* MULTIPLE_REVISION */ diff --git a/drivers/net/wireless/bcmdhd/dhd_sec_feature.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sec_feature.h index 071340e..d6bb7f0 100644 --- a/drivers/net/wireless/bcmdhd/dhd_sec_feature.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_sec_feature.h @@ -27,6 +27,11 @@ * $Id: dhd_sec_feature.h 309548 2012-01-20 01:13:08Z $ */ +#ifdef USE_SECFEATURE +#include <sec_feature/GlobalConfig.h> +#include <sec_feature/CustFeature.h> +#endif + /* PROJECTS */ #if defined(CONFIG_MACH_SAMSUNG_ESPRESSO)\ @@ -58,11 +63,6 @@ #define READ_MACADDR #endif -#ifdef CONFIG_ARCH_MSM8960 -#undef WIFI_TURNOFF_DELAY -#define WIFI_TURNOFF_DELAY 200 -#endif - /* REGION CODE */ #if (WLAN_REGION_CODE >= 100) && (WLAN_REGION_CODE < 200) /*EUR*/ @@ -87,6 +87,13 @@ #define OKC_SUPPORT #endif +/* for debug */ +#ifdef RSSI_OFFSET +#undef RSSI_OFFSET +#define RSSI_OFFSET 8 +#else +#define RSSI_OFFSET 8 +#endif #undef WRITE_MACADDR #undef READ_MACADDR diff --git a/drivers/net/wireless/bcmdhd/dhd_wlfc.h b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_wlfc.h index 4087351..308e318 100755..100644 --- a/drivers/net/wireless/bcmdhd/dhd_wlfc.h +++ b/drivers/net/wireless/bcmdhd/src/dhd/sys/dhd_wlfc.h @@ -1,12 +1,12 @@ /* -* Copyright (C) 1999-2012, Broadcom Corporation -* +* Copyright (C) 1999-2011, Broadcom Corporation +* * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: -* +* * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -14,11 +14,11 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. -* +* * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: dhd_wlfc.h 341930 2012-06-29 04:51:25Z $ +* $Id: dhd_wlfc.h 294267 2011-11-04 23:41:52Z $ * */ #ifndef __wlfc_host_driver_definitions_h__ @@ -30,6 +30,7 @@ #define WLFC_HANGER_ITEM_STATE_FREE 1 #define WLFC_HANGER_ITEM_STATE_INUSE 2 #define WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED 3 + #define WLFC_PKTID_HSLOT_MASK 0xffff /* allow 16 bits only */ #define WLFC_PKTID_HSLOT_SHIFT 8 @@ -94,11 +95,8 @@ typedef struct wlfc_hanger { #define WLFC_STATE_CLOSE 2 #define WLFC_PSQ_PREC_COUNT ((AC_COUNT + 1) * 2) /* 2 for each AC traffic and bc/mc */ - #define WLFC_PSQ_LEN 2048 - -#define WLFC_SENDQ_LEN 256 - +#define WLFC_SENDQ_LEN 256 /* XXX: Match dhd_sdio txq length */ #define WLFC_FLOWCONTROL_HIWATER (2048 - 256) #define WLFC_FLOWCONTROL_LOWATER 256 @@ -232,7 +230,7 @@ typedef struct athost_wl_status_info { athost_wl_stat_counters_t stats; /* the additional ones are for bc/mc and ATIM FIFO */ - int FIFO_credit[AC_COUNT + 2]; + int FIFO_credit[AC_COUNT + 2]; /* Credit borrow counts for each FIFO from each of the other FIFOs */ int credits_borrowed[AC_COUNT + 2][AC_COUNT + 2]; diff --git a/drivers/net/wireless/bcmdhd/dngl_stats.h b/drivers/net/wireless/bcmdhd/src/dongle/dngl_stats.h index 5e5a2e2..3b5606e 100755..100644 --- a/drivers/net/wireless/bcmdhd/dngl_stats.h +++ b/drivers/net/wireless/bcmdhd/src/dongle/dngl_stats.h @@ -2,14 +2,14 @@ * Common stats definitions for clients of dongle * ports * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,7 +17,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/dngl_wlhdr.h b/drivers/net/wireless/bcmdhd/src/dongle/dngl_wlhdr.h index 0e37df6..b89928e 100755..100644 --- a/drivers/net/wireless/bcmdhd/dngl_wlhdr.h +++ b/drivers/net/wireless/bcmdhd/src/dongle/dngl_wlhdr.h @@ -1,14 +1,14 @@ /* * Dongle WL Header definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/aidmp.h b/drivers/net/wireless/bcmdhd/src/include/aidmp.h index 63513e6..ed7401a 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/aidmp.h +++ b/drivers/net/wireless/bcmdhd/src/include/aidmp.h @@ -1,14 +1,14 @@ /* * Broadcom AMBA Interconnect definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -103,7 +103,7 @@ #define AD_SZ_SZD 0x00000030 #define AD_AG32 0x00000008 #define AD_ADDR_ALIGN 0x00000fff -#define AD_SZ_BASE 0x00001000 +#define AD_SZ_BASE 0x00001000 #define SD_SZ_MASK 0xfffff000 @@ -114,124 +114,124 @@ #ifndef _LANGUAGE_ASSEMBLY typedef volatile struct _aidmp { - uint32 oobselina30; - uint32 oobselina74; + uint32 oobselina30; + uint32 oobselina74; uint32 PAD[6]; - uint32 oobselinb30; - uint32 oobselinb74; + uint32 oobselinb30; + uint32 oobselinb74; uint32 PAD[6]; - uint32 oobselinc30; - uint32 oobselinc74; + uint32 oobselinc30; + uint32 oobselinc74; uint32 PAD[6]; - uint32 oobselind30; - uint32 oobselind74; + uint32 oobselind30; + uint32 oobselind74; uint32 PAD[38]; - uint32 oobselouta30; - uint32 oobselouta74; + uint32 oobselouta30; + uint32 oobselouta74; uint32 PAD[6]; - uint32 oobseloutb30; - uint32 oobseloutb74; + uint32 oobseloutb30; + uint32 oobseloutb74; uint32 PAD[6]; - uint32 oobseloutc30; - uint32 oobseloutc74; + uint32 oobseloutc30; + uint32 oobseloutc74; uint32 PAD[6]; - uint32 oobseloutd30; - uint32 oobseloutd74; + uint32 oobseloutd30; + uint32 oobseloutd74; uint32 PAD[38]; - uint32 oobsynca; - uint32 oobseloutaen; + uint32 oobsynca; + uint32 oobseloutaen; uint32 PAD[6]; - uint32 oobsyncb; - uint32 oobseloutben; + uint32 oobsyncb; + uint32 oobseloutben; uint32 PAD[6]; - uint32 oobsyncc; - uint32 oobseloutcen; + uint32 oobsyncc; + uint32 oobseloutcen; uint32 PAD[6]; - uint32 oobsyncd; - uint32 oobseloutden; + uint32 oobsyncd; + uint32 oobseloutden; uint32 PAD[38]; - uint32 oobaextwidth; - uint32 oobainwidth; - uint32 oobaoutwidth; + uint32 oobaextwidth; + uint32 oobainwidth; + uint32 oobaoutwidth; uint32 PAD[5]; - uint32 oobbextwidth; - uint32 oobbinwidth; - uint32 oobboutwidth; + uint32 oobbextwidth; + uint32 oobbinwidth; + uint32 oobboutwidth; uint32 PAD[5]; - uint32 oobcextwidth; - uint32 oobcinwidth; - uint32 oobcoutwidth; + uint32 oobcextwidth; + uint32 oobcinwidth; + uint32 oobcoutwidth; uint32 PAD[5]; - uint32 oobdextwidth; - uint32 oobdinwidth; - uint32 oobdoutwidth; + uint32 oobdextwidth; + uint32 oobdinwidth; + uint32 oobdoutwidth; uint32 PAD[37]; - uint32 ioctrlset; - uint32 ioctrlclear; - uint32 ioctrl; + uint32 ioctrlset; + uint32 ioctrlclear; + uint32 ioctrl; uint32 PAD[61]; - uint32 iostatus; + uint32 iostatus; uint32 PAD[127]; - uint32 ioctrlwidth; - uint32 iostatuswidth; + uint32 ioctrlwidth; + uint32 iostatuswidth; uint32 PAD[62]; - uint32 resetctrl; - uint32 resetstatus; - uint32 resetreadid; - uint32 resetwriteid; + uint32 resetctrl; + uint32 resetstatus; + uint32 resetreadid; + uint32 resetwriteid; uint32 PAD[60]; - uint32 errlogctrl; - uint32 errlogdone; - uint32 errlogstatus; - uint32 errlogaddrlo; - uint32 errlogaddrhi; - uint32 errlogid; - uint32 errloguser; - uint32 errlogflags; + uint32 errlogctrl; + uint32 errlogdone; + uint32 errlogstatus; + uint32 errlogaddrlo; + uint32 errlogaddrhi; + uint32 errlogid; + uint32 errloguser; + uint32 errlogflags; uint32 PAD[56]; - uint32 intstatus; + uint32 intstatus; uint32 PAD[255]; - uint32 config; + uint32 config; uint32 PAD[63]; - uint32 itcr; + uint32 itcr; uint32 PAD[3]; - uint32 itipooba; - uint32 itipoobb; - uint32 itipoobc; - uint32 itipoobd; + uint32 itipooba; + uint32 itipoobb; + uint32 itipoobc; + uint32 itipoobd; uint32 PAD[4]; - uint32 itipoobaout; - uint32 itipoobbout; - uint32 itipoobcout; - uint32 itipoobdout; + uint32 itipoobaout; + uint32 itipoobbout; + uint32 itipoobcout; + uint32 itipoobdout; uint32 PAD[4]; - uint32 itopooba; - uint32 itopoobb; - uint32 itopoobc; - uint32 itopoobd; + uint32 itopooba; + uint32 itopoobb; + uint32 itopoobc; + uint32 itopoobd; uint32 PAD[4]; - uint32 itopoobain; - uint32 itopoobbin; - uint32 itopoobcin; - uint32 itopoobdin; + uint32 itopoobain; + uint32 itopoobbin; + uint32 itopoobcin; + uint32 itopoobdin; uint32 PAD[4]; - uint32 itopreset; + uint32 itopreset; uint32 PAD[15]; - uint32 peripherialid4; - uint32 peripherialid5; - uint32 peripherialid6; - uint32 peripherialid7; - uint32 peripherialid0; - uint32 peripherialid1; - uint32 peripherialid2; - uint32 peripherialid3; - uint32 componentid0; - uint32 componentid1; - uint32 componentid2; - uint32 componentid3; + uint32 peripherialid4; + uint32 peripherialid5; + uint32 peripherialid6; + uint32 peripherialid7; + uint32 peripherialid0; + uint32 peripherialid1; + uint32 peripherialid2; + uint32 peripherialid3; + uint32 componentid0; + uint32 componentid1; + uint32 componentid2; + uint32 componentid3; } aidmp_t; -#endif +#endif #define OOB_BUSCONFIG 0x020 @@ -372,4 +372,4 @@ typedef volatile struct _aidmp { #define OOB_SEL_OUTEN_B_5 15 #define OOB_SEL_OUTEN_B_6 23 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcm_cfg.h b/drivers/net/wireless/bcmdhd/src/include/bcm_cfg.h index 26da752..13c5786 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcm_cfg.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcm_cfg.h @@ -1,14 +1,14 @@ /* * BCM common config options * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -26,4 +26,4 @@ #ifndef _bcm_cfg_h_ #define _bcm_cfg_h_ -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h b/drivers/net/wireless/bcmdhd/src/include/bcm_mpool_pub.h index 8fe3de7..7d1e07a 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcm_mpool_pub.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcm_mpool_pub.h @@ -35,14 +35,14 @@ * and instrumentation on top of the heap, without modifying the heap * allocation implementation. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -50,7 +50,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/bcmcdc.h b/drivers/net/wireless/bcmdhd/src/include/bcmcdc.h index 9bae1c2..f502218 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmcdc.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmcdc.h @@ -4,14 +4,14 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,46 +19,46 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmcdc.h 318308 2012-03-02 02:23:42Z $ + * $Id: bcmcdc.h 291086 2011-10-21 01:17:24Z $ */ #ifndef _bcmcdc_h_ #define _bcmcdc_h_ #include <proto/ethernet.h> typedef struct cdc_ioctl { - uint32 cmd; - uint32 len; - uint32 flags; - uint32 status; + uint32 cmd; + uint32 len; + uint32 flags; + uint32 status; } cdc_ioctl_t; #define CDC_MAX_MSG_SIZE ETHER_MAX_LEN -#define CDCL_IOC_OUTLEN_MASK 0x0000FFFF - +#define CDCL_IOC_OUTLEN_MASK 0x0000FFFF + #define CDCL_IOC_OUTLEN_SHIFT 0 -#define CDCL_IOC_INLEN_MASK 0xFFFF0000 +#define CDCL_IOC_INLEN_MASK 0xFFFF0000 #define CDCL_IOC_INLEN_SHIFT 16 -#define CDCF_IOC_ERROR 0x01 -#define CDCF_IOC_SET 0x02 -#define CDCF_IOC_OVL_IDX_MASK 0x3c -#define CDCF_IOC_OVL_RSV 0x40 -#define CDCF_IOC_OVL 0x80 -#define CDCF_IOC_ACTION_MASK 0xfe -#define CDCF_IOC_ACTION_SHIFT 1 -#define CDCF_IOC_IF_MASK 0xF000 +#define CDCF_IOC_ERROR 0x01 +#define CDCF_IOC_SET 0x02 +#define CDCF_IOC_OVL_IDX_MASK 0x3c +#define CDCF_IOC_OVL_RSV 0x40 +#define CDCF_IOC_OVL 0x80 +#define CDCF_IOC_ACTION_MASK 0xfe +#define CDCF_IOC_ACTION_SHIFT 1 +#define CDCF_IOC_IF_MASK 0xF000 #define CDCF_IOC_IF_SHIFT 12 -#define CDCF_IOC_ID_MASK 0xFFFF0000 -#define CDCF_IOC_ID_SHIFT 16 +#define CDCF_IOC_ID_MASK 0xFFFF0000 +#define CDCF_IOC_ID_SHIFT 16 #define CDC_IOC_IF_IDX(flags) (((flags) & CDCF_IOC_IF_MASK) >> CDCF_IOC_IF_SHIFT) #define CDC_IOC_ID(flags) (((flags) & CDCF_IOC_ID_MASK) >> CDCF_IOC_ID_SHIFT) @@ -71,36 +71,35 @@ typedef struct cdc_ioctl { struct bdc_header { - uint8 flags; - uint8 priority; + uint8 flags; + uint8 priority; uint8 flags2; - uint8 dataOffset; + uint8 dataOffset; }; #define BDC_HEADER_LEN 4 -#define BDC_FLAG_80211_PKT 0x01 -#define BDC_FLAG_SUM_GOOD 0x04 -#define BDC_FLAG_SUM_NEEDED 0x08 -#define BDC_FLAG_EVENT_MSG 0x08 -#define BDC_FLAG_VER_MASK 0xf0 -#define BDC_FLAG_VER_SHIFT 4 +#define BDC_FLAG_80211_PKT 0x01 +#define BDC_FLAG_SUM_GOOD 0x04 +#define BDC_FLAG_SUM_NEEDED 0x08 +#define BDC_FLAG_VER_MASK 0xf0 +#define BDC_FLAG_VER_SHIFT 4 #define BDC_PRIORITY_MASK 0x07 -#define BDC_PRIORITY_FC_MASK 0xf0 -#define BDC_PRIORITY_FC_SHIFT 4 +#define BDC_PRIORITY_FC_MASK 0xf0 +#define BDC_PRIORITY_FC_SHIFT 4 -#define BDC_FLAG2_IF_MASK 0x0f +#define BDC_FLAG2_IF_MASK 0x0f #define BDC_FLAG2_IF_SHIFT 0 -#define BDC_FLAG2_FC_FLAG 0x10 - +#define BDC_FLAG2_FC_FLAG 0x10 + -#define BDC_PROTO_VER_1 1 -#define BDC_PROTO_VER 2 +#define BDC_PROTO_VER_1 1 +#define BDC_PROTO_VER 2 #define BDC_GET_IF_IDX(hdr) \ @@ -123,4 +122,4 @@ struct bdc_header { ((hdr)->flags = (((hdr)->flags & ~BDC_FLAG_PAD_MASK) | \ (((idx) & BDC_FLAG_PAD_IDX) << BDC_FLAG_PAD_SHIFT))) -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcmdefs.h b/drivers/net/wireless/bcmdhd/src/include/bcmdefs.h index a35ed72..cee9a1c 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmdefs.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmdefs.h @@ -1,14 +1,14 @@ /* * Misc system wide definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,20 +16,17 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmdefs.h 316830 2012-02-23 20:29:22Z $ + * $Id: bcmdefs.h 295153 2011-11-09 17:53:12Z $ */ #ifndef _bcmdefs_h_ #define _bcmdefs_h_ - - - #define BCM_REFERENCE(data) ((void)(data)) @@ -40,9 +37,7 @@ typedef char STATIC_ASSERT_FAIL[(expr) ? 1 : -1]; \ } - - -#define bcmreclaimed 0 +#define bcmreclaimed 0 #define _data _data #define _fn _fn #define BCMPREATTACHDATA(_data) _data @@ -55,10 +50,7 @@ #define CONST const #ifndef BCMFASTPATH #define BCMFASTPATH -#define BCMFASTPATH_HOST -#endif - - +#endif #define _data _data #define BCMROMDAT_NAME(_data) _data @@ -71,31 +63,29 @@ #define BCMROMDAT_SPATCH(data) -#define SI_BUS 0 -#define PCI_BUS 1 -#define PCMCIA_BUS 2 -#define SDIO_BUS 3 -#define JTAG_BUS 4 -#define USB_BUS 5 -#define SPI_BUS 6 -#define RPC_BUS 7 +#define SI_BUS 0 +#define PCI_BUS 1 +#define PCMCIA_BUS 2 +#define SDIO_BUS 3 +#define JTAG_BUS 4 +#define USB_BUS 5 +#define SPI_BUS 6 +#define RPC_BUS 7 #ifdef BCMBUSTYPE -#define BUSTYPE(bus) (BCMBUSTYPE) +#define BUSTYPE(bus) (BCMBUSTYPE) #else -#define BUSTYPE(bus) (bus) +#define BUSTYPE(bus) (bus) #endif #ifdef BCMCHIPTYPE -#define CHIPTYPE(bus) (BCMCHIPTYPE) +#define CHIPTYPE(bus) (BCMCHIPTYPE) #else -#define CHIPTYPE(bus) (bus) +#define CHIPTYPE(bus) (bus) #endif - - #if defined(BCMSPROMBUS) #define SPROMBUS (BCMSPROMBUS) #elif defined(SI_PCMCIA_SROM) @@ -118,14 +108,14 @@ #endif -#define DMADDR_MASK_32 0x0 -#define DMADDR_MASK_30 0xc0000000 -#define DMADDR_MASK_0 0xffffffff +#define DMADDR_MASK_32 0x0 +#define DMADDR_MASK_30 0xc0000000 +#define DMADDR_MASK_0 0xffffffff -#define DMADDRWIDTH_30 30 -#define DMADDRWIDTH_32 32 -#define DMADDRWIDTH_63 63 -#define DMADDRWIDTH_64 64 +#define DMADDRWIDTH_30 30 +#define DMADDRWIDTH_32 32 +#define DMADDRWIDTH_63 63 +#define DMADDRWIDTH_64 64 #ifdef BCMDMA64OSL typedef struct { @@ -154,7 +144,7 @@ typedef unsigned long dmaaddr_t; do { \ (_pa) = (_val); \ } while (0) -#endif +#endif /* BCMDMA64OSL */ typedef struct { @@ -166,21 +156,18 @@ typedef struct { typedef struct { - void *oshdmah; - uint origsize; + void *oshdmah; + uint origsize; uint nsegs; hnddma_seg_t segs[MAX_DMA_SEGS]; } hnddma_seg_map_t; - - - #if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY) #define BCMEXTRAHDROOM 220 -#else +#else #define BCMEXTRAHDROOM 172 -#endif +#endif #ifndef SDALIGN @@ -198,10 +185,9 @@ typedef struct { # undef BCMDBG_ASSERT # undef BCMASSERT_LOG #endif - #if defined(BCMASSERT_LOG) #define BCMASSERT_SUPPORT -#endif +#endif #define BITFIELD_MASK(width) \ @@ -215,25 +201,23 @@ typedef struct { #ifdef BCMSMALL #undef BCMSPACE -#define bcmspace FALSE +#define bcmspace FALSE #else #define BCMSPACE -#define bcmspace TRUE +#define bcmspace TRUE #endif #define MAXSZ_NVRAM_VARS 4096 - - #ifdef DL_NVRAM #define NVRAM_ARRAY_MAXSIZE DL_NVRAM #else #define NVRAM_ARRAY_MAXSIZE MAXSZ_NVRAM_VARS -#endif +#endif #ifdef BCMUSBDEV_ENABLED extern uint32 gFWID; #endif -#endif +#endif /* _bcmdefs_h_ */ diff --git a/drivers/net/wireless/bcmdhd/src/include/bcmdevs.h b/drivers/net/wireless/bcmdhd/src/include/bcmdevs.h new file mode 100644 index 0000000..8fe4fc1 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/bcmdevs.h @@ -0,0 +1,481 @@ +/* + * Broadcom device-specific manifest constants. + * + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: bcmdevs.h 306883 2012-01-09 21:47:42Z $ + */ + +#ifndef _BCMDEVS_H +#define _BCMDEVS_H + + +#define VENDOR_EPIGRAM 0xfeda +#define VENDOR_BROADCOM 0x14e4 +#define VENDOR_3COM 0x10b7 +#define VENDOR_NETGEAR 0x1385 +#define VENDOR_DIAMOND 0x1092 +#define VENDOR_INTEL 0x8086 +#define VENDOR_DELL 0x1028 +#define VENDOR_HP 0x103c +#define VENDOR_HP_COMPAQ 0x0e11 +#define VENDOR_APPLE 0x106b +#define VENDOR_SI_IMAGE 0x1095 +#define VENDOR_BUFFALO 0x1154 +#define VENDOR_TI 0x104c +#define VENDOR_RICOH 0x1180 +#define VENDOR_JMICRON 0x197b + + + +#define VENDOR_BROADCOM_PCMCIA 0x02d0 + + +#define VENDOR_BROADCOM_SDIO 0x00BF + + +#define BCM_DNGL_VID 0x0a5c +#define BCM_DNGL_BL_PID_4328 0xbd12 +#define BCM_DNGL_BL_PID_4322 0xbd13 +#define BCM_DNGL_BL_PID_4319 0xbd16 +#define BCM_DNGL_BL_PID_43236 0xbd17 +#define BCM_DNGL_BL_PID_4332 0xbd18 +#define BCM_DNGL_BL_PID_4330 0xbd19 +#define BCM_DNGL_BL_PID_4334 0xbd1a +#define BCM_DNGL_BL_PID_43239 0xbd1b +#define BCM_DNGL_BL_PID_4324 0xbd1c +#define BCM_DNGL_BL_PID_4360 0xbd1d + +#define BCM_DNGL_BDC_PID 0x0bdc +#define BCM_DNGL_JTAG_PID 0x4a44 + + +#define BCM_HWUSB_PID_43239 43239 + + +#define BCM4210_DEVICE_ID 0x1072 +#define BCM4230_DEVICE_ID 0x1086 +#define BCM4401_ENET_ID 0x170c +#define BCM3352_DEVICE_ID 0x3352 +#define BCM3360_DEVICE_ID 0x3360 +#define BCM4211_DEVICE_ID 0x4211 +#define BCM4231_DEVICE_ID 0x4231 +#define BCM4303_D11B_ID 0x4303 +#define BCM4311_D11G_ID 0x4311 +#define BCM4311_D11DUAL_ID 0x4312 +#define BCM4311_D11A_ID 0x4313 +#define BCM4328_D11DUAL_ID 0x4314 +#define BCM4328_D11G_ID 0x4315 +#define BCM4328_D11A_ID 0x4316 +#define BCM4318_D11G_ID 0x4318 +#define BCM4318_D11DUAL_ID 0x4319 +#define BCM4318_D11A_ID 0x431a +#define BCM4325_D11DUAL_ID 0x431b +#define BCM4325_D11G_ID 0x431c +#define BCM4325_D11A_ID 0x431d +#define BCM4306_D11G_ID 0x4320 +#define BCM4306_D11A_ID 0x4321 +#define BCM4306_UART_ID 0x4322 +#define BCM4306_V90_ID 0x4323 +#define BCM4306_D11DUAL_ID 0x4324 +#define BCM4306_D11G_ID2 0x4325 +#define BCM4321_D11N_ID 0x4328 +#define BCM4321_D11N2G_ID 0x4329 +#define BCM4321_D11N5G_ID 0x432a +#define BCM4322_D11N_ID 0x432b +#define BCM4322_D11N2G_ID 0x432c +#define BCM4322_D11N5G_ID 0x432d +#define BCM4329_D11N_ID 0x432e +#define BCM4329_D11N2G_ID 0x432f +#define BCM4329_D11N5G_ID 0x4330 +#define BCM4315_D11DUAL_ID 0x4334 +#define BCM4315_D11G_ID 0x4335 +#define BCM4315_D11A_ID 0x4336 +#define BCM4319_D11N_ID 0x4337 +#define BCM4319_D11N2G_ID 0x4338 +#define BCM4319_D11N5G_ID 0x4339 +#define BCM43231_D11N2G_ID 0x4340 +#define BCM43221_D11N2G_ID 0x4341 +#define BCM43222_D11N_ID 0x4350 +#define BCM43222_D11N2G_ID 0x4351 +#define BCM43222_D11N5G_ID 0x4352 +#define BCM43224_D11N_ID 0x4353 +#define BCM43224_D11N_ID_VEN1 0x0576 +#define BCM43226_D11N_ID 0x4354 +#define BCM43236_D11N_ID 0x4346 +#define BCM43236_D11N2G_ID 0x4347 +#define BCM43236_D11N5G_ID 0x4348 +#define BCM43225_D11N2G_ID 0x4357 +#define BCM43421_D11N_ID 0xA99D +#define BCM4313_D11N2G_ID 0x4727 +#define BCM4330_D11N_ID 0x4360 +#define BCM4330_D11N2G_ID 0x4361 +#define BCM4330_D11N5G_ID 0x4362 +#define BCM4336_D11N_ID 0x4343 +#define BCM6362_D11N_ID 0x435f +#define BCM4331_D11N_ID 0x4331 +#define BCM4331_D11N2G_ID 0x4332 +#define BCM4331_D11N5G_ID 0x4333 +#define BCM43237_D11N_ID 0x4355 +#define BCM43237_D11N5G_ID 0x4356 +#define BCM43227_D11N2G_ID 0x4358 +#define BCM43228_D11N_ID 0x4359 +#define BCM43228_D11N5G_ID 0x435a +#define BCM43362_D11N_ID 0x4363 +#define BCM43239_D11N_ID 0x4370 +#define BCM4324_D11N_ID 0x4374 +#define BCM43217_D11N2G_ID 0x43a9 +#define BCM43131_D11N2G_ID 0x43aa +#define BCM4314_D11N2G_ID 0x4364 +#define BCM43142_D11N2G_ID 0x4365 +#define BCM4334_D11N_ID 0x4380 +#define BCM4334_D11N2G_ID 0x4381 +#define BCM4334_D11N5G_ID 0x4382 +#define BCM4360_D11AC_ID 0x43a0 +#define BCM4360_D11AC2G_ID 0x43a1 +#define BCM4360_D11AC5G_ID 0x43a2 + + +#define BCM943228HMB_SSID_VEN1 0x0607 +#define BCM94313HMGBL_SSID_VEN1 0x0608 +#define BCM94313HMG_SSID_VEN1 0x0609 + + +#define BCM4335_D11AC_ID 0x43a9 +#define BCM4335_D11AC2G_ID 0x43aa +#define BCM4335_D11AC5G_ID 0x43ab + +#define BCMGPRS_UART_ID 0x4333 +#define BCMGPRS2_UART_ID 0x4344 +#define FPGA_JTAGM_ID 0x43f0 +#define BCM_JTAGM_ID 0x43f1 +#define SDIOH_FPGA_ID 0x43f2 +#define BCM_SDIOH_ID 0x43f3 +#define SDIOD_FPGA_ID 0x43f4 +#define SPIH_FPGA_ID 0x43f5 +#define BCM_SPIH_ID 0x43f6 +#define MIMO_FPGA_ID 0x43f8 +#define BCM_JTAGM2_ID 0x43f9 +#define SDHCI_FPGA_ID 0x43fa +#define BCM4402_ENET_ID 0x4402 +#define BCM4402_V90_ID 0x4403 +#define BCM4410_DEVICE_ID 0x4410 +#define BCM4412_DEVICE_ID 0x4412 +#define BCM4430_DEVICE_ID 0x4430 +#define BCM4432_DEVICE_ID 0x4432 +#define BCM4704_ENET_ID 0x4706 +#define BCM4710_DEVICE_ID 0x4710 +#define BCM47XX_AUDIO_ID 0x4711 +#define BCM47XX_V90_ID 0x4712 +#define BCM47XX_ENET_ID 0x4713 +#define BCM47XX_EXT_ID 0x4714 +#define BCM47XX_GMAC_ID 0x4715 +#define BCM47XX_USBH_ID 0x4716 +#define BCM47XX_USBD_ID 0x4717 +#define BCM47XX_IPSEC_ID 0x4718 +#define BCM47XX_ROBO_ID 0x4719 +#define BCM47XX_USB20H_ID 0x471a +#define BCM47XX_USB20D_ID 0x471b +#define BCM47XX_ATA100_ID 0x471d +#define BCM47XX_SATAXOR_ID 0x471e +#define BCM47XX_GIGETH_ID 0x471f +#define BCM4712_MIPS_ID 0x4720 +#define BCM4716_DEVICE_ID 0x4722 +#define BCM47XX_SMBUS_EMU_ID 0x47fe +#define BCM47XX_XOR_EMU_ID 0x47ff +#define EPI41210_DEVICE_ID 0xa0fa +#define EPI41230_DEVICE_ID 0xa10e +#define JINVANI_SDIOH_ID 0x4743 +#define BCM27XX_SDIOH_ID 0x2702 +#define PCIXX21_FLASHMEDIA_ID 0x803b +#define PCIXX21_SDIOH_ID 0x803c +#define R5C822_SDIOH_ID 0x0822 +#define JMICRON_SDIOH_ID 0x2381 + + +#define BCM4306_CHIP_ID 0x4306 +#define BCM4311_CHIP_ID 0x4311 +#define BCM43111_CHIP_ID 43111 +#define BCM43112_CHIP_ID 43112 +#define BCM4312_CHIP_ID 0x4312 +#define BCM4313_CHIP_ID 0x4313 +#define BCM43131_CHIP_ID 43131 +#define BCM4315_CHIP_ID 0x4315 +#define BCM4318_CHIP_ID 0x4318 +#define BCM4319_CHIP_ID 0x4319 +#define BCM4320_CHIP_ID 0x4320 +#define BCM4321_CHIP_ID 0x4321 +#define BCM43217_CHIP_ID 43217 +#define BCM4322_CHIP_ID 0x4322 +#define BCM43221_CHIP_ID 43221 +#define BCM43222_CHIP_ID 43222 +#define BCM43224_CHIP_ID 43224 +#define BCM43225_CHIP_ID 43225 +#define BCM43227_CHIP_ID 43227 +#define BCM43228_CHIP_ID 43228 +#define BCM43226_CHIP_ID 43226 +#define BCM43231_CHIP_ID 43231 +#define BCM43234_CHIP_ID 43234 +#define BCM43235_CHIP_ID 43235 +#define BCM43236_CHIP_ID 43236 +#define BCM43237_CHIP_ID 43237 +#define BCM43238_CHIP_ID 43238 +#define BCM43239_CHIP_ID 43239 +#define BCM43420_CHIP_ID 43420 +#define BCM43421_CHIP_ID 43421 +#define BCM43428_CHIP_ID 43428 +#define BCM43431_CHIP_ID 43431 +#define BCM43460_CHIP_ID 43460 +#define BCM4325_CHIP_ID 0x4325 +#define BCM4328_CHIP_ID 0x4328 +#define BCM4329_CHIP_ID 0x4329 +#define BCM4331_CHIP_ID 0x4331 +#define BCM4336_CHIP_ID 0x4336 +#define BCM43362_CHIP_ID 43362 +#define BCM4330_CHIP_ID 0x4330 +#define BCM6362_CHIP_ID 0x6362 +#define BCM4314_CHIP_ID 0x4314 +#define BCM43142_CHIP_ID 43142 +#define BCM4324_CHIP_ID 0x4324 +#define BCM43242_CHIP_ID 43242 +#define BCM4334_CHIP_ID 0x4334 +#define BCM4360_CHIP_ID 0x4360 + +#define BCM4335_CHIP_ID 0x4335 + +#define BCM4342_CHIP_ID 4342 +#define BCM4402_CHIP_ID 0x4402 +#define BCM4704_CHIP_ID 0x4704 +#define BCM4706_CHIP_ID 0x5300 +#define BCM4710_CHIP_ID 0x4710 +#define BCM4712_CHIP_ID 0x4712 +#define BCM4716_CHIP_ID 0x4716 +#define BCM47162_CHIP_ID 47162 +#define BCM4748_CHIP_ID 0x4748 +#define BCM4749_CHIP_ID 0x4749 +#define BCM4785_CHIP_ID 0x4785 +#define BCM5350_CHIP_ID 0x5350 +#define BCM5352_CHIP_ID 0x5352 +#define BCM5354_CHIP_ID 0x5354 +#define BCM5365_CHIP_ID 0x5365 +#define BCM5356_CHIP_ID 0x5356 +#define BCM5357_CHIP_ID 0x5357 +#define BCM53572_CHIP_ID 53572 + + +#define BCM4303_PKG_ID 2 +#define BCM4309_PKG_ID 1 +#define BCM4712LARGE_PKG_ID 0 +#define BCM4712SMALL_PKG_ID 1 +#define BCM4712MID_PKG_ID 2 +#define BCM4328USBD11G_PKG_ID 2 +#define BCM4328USBDUAL_PKG_ID 3 +#define BCM4328SDIOD11G_PKG_ID 4 +#define BCM4328SDIODUAL_PKG_ID 5 +#define BCM4329_289PIN_PKG_ID 0 +#define BCM4329_182PIN_PKG_ID 1 +#define BCM5354E_PKG_ID 1 +#define BCM4716_PKG_ID 8 +#define BCM4717_PKG_ID 9 +#define BCM4718_PKG_ID 10 +#define BCM5356_PKG_NONMODE 1 +#define BCM5358U_PKG_ID 8 +#define BCM5358_PKG_ID 9 +#define BCM47186_PKG_ID 10 +#define BCM5357_PKG_ID 11 +#define BCM5356U_PKG_ID 12 +#define BCM53572_PKG_ID 8 +#define BCM5357C0_PKG_ID 8 +#define BCM47188_PKG_ID 9 +#define BCM5358C0_PKG_ID 0xa +#define BCM5356C0_PKG_ID 0xb +#define BCM4331TT_PKG_ID 8 +#define BCM4331TN_PKG_ID 9 +#define BCM4331TNA0_PKG_ID 0xb +#define BCM4706L_PKG_ID 1 + +#define HDLSIM5350_PKG_ID 1 +#define HDLSIM_PKG_ID 14 +#define HWSIM_PKG_ID 15 +#define BCM43224_FAB_CSM 0x8 +#define BCM43224_FAB_SMIC 0xa +#define BCM4336_WLBGA_PKG_ID 0x8 +#define BCM4330_WLBGA_PKG_ID 0x0 +#define BCM4314PCIE_ARM_PKG_ID (8 | 0) +#define BCM4314SDIO_PKG_ID (8 | 1) +#define BCM4314PCIE_PKG_ID (8 | 2) +#define BCM4314SDIO_ARM_PKG_ID (8 | 3) +#define BCM4314SDIO_FPBGA_PKG_ID (8 | 4) +#define BCM4314DEV_PKG_ID (8 | 6) + +#define PCIXX21_FLASHMEDIA0_ID 0x8033 +#define PCIXX21_SDIOH0_ID 0x8034 + + +#define BFL_BTC2WIRE 0x00000001 +#define BFL_BTCOEX 0x00000001 +#define BFL_PACTRL 0x00000002 +#define BFL_AIRLINEMODE 0x00000004 +#define BFL_ADCDIV 0x00000008 +#define BFL_ENETROBO 0x00000010 +#define BFL_NOPLLDOWN 0x00000020 +#define BFL_CCKHIPWR 0x00000040 +#define BFL_ENETADM 0x00000080 +#define BFL_ENETVLAN 0x00000100 +#define BFL_UNUSED 0x00000200 +#define BFL_NOPCI 0x00000400 +#define BFL_FEM 0x00000800 +#define BFL_EXTLNA 0x00001000 +#define BFL_HGPA 0x00002000 +#define BFL_BTC2WIRE_ALTGPIO 0x00004000 +#define BFL_ALTIQ 0x00008000 +#define BFL_NOPA 0x00010000 +#define BFL_RSSIINV 0x00020000 +#define BFL_PAREF 0x00040000 +#define BFL_3TSWITCH 0x00080000 +#define BFL_PHASESHIFT 0x00100000 +#define BFL_BUCKBOOST 0x00200000 +#define BFL_FEM_BT 0x00400000 +#define BFL_NOCBUCK 0x00800000 +#define BFL_CCKFAVOREVM 0x01000000 +#define BFL_PALDO 0x02000000 +#define BFL_LNLDO2_2P5 0x04000000 +#define BFL_FASTPWR 0x08000000 +#define BFL_UCPWRCTL_MININDX 0x08000000 +#define BFL_EXTLNA_5GHz 0x10000000 +#define BFL_TRSW_1by2 0x20000000 +#define BFL_LO_TRSW_R_5GHz 0x40000000 +#define BFL_ELNA_GAINDEF 0x80000000 +#define BFL_EXTLNA_TX 0x20000000 + + +#define BFL2_RXBB_INT_REG_DIS 0x00000001 +#define BFL2_APLL_WAR 0x00000002 +#define BFL2_TXPWRCTRL_EN 0x00000004 +#define BFL2_2X4_DIV 0x00000008 +#define BFL2_5G_PWRGAIN 0x00000010 +#define BFL2_PCIEWAR_OVR 0x00000020 +#define BFL2_CAESERS_BRD 0x00000040 +#define BFL2_BTC3WIRE 0x00000080 +#define BFL2_BTCLEGACY 0x00000080 +#define BFL2_SKWRKFEM_BRD 0x00000100 +#define BFL2_SPUR_WAR 0x00000200 +#define BFL2_GPLL_WAR 0x00000400 +#define BFL2_TRISTATE_LED 0x00000800 +#define BFL2_SINGLEANT_CCK 0x00001000 +#define BFL2_2G_SPUR_WAR 0x00002000 +#define BFL2_BPHY_ALL_TXCORES 0x00004000 +#define BFL2_FCC_BANDEDGE_WAR 0x00008000 +#define BFL2_GPLL_WAR2 0x00010000 +#define BFL2_IPALVLSHIFT_3P3 0x00020000 +#define BFL2_INTERNDET_TXIQCAL 0x00040000 +#define BFL2_XTALBUFOUTEN 0x00080000 + + + +#define BFL2_ANAPACTRL_2G 0x00100000 +#define BFL2_ANAPACTRL_5G 0x00200000 +#define BFL2_ELNACTRL_TRSW_2G 0x00400000 +#define BFL2_BT_SHARE_ANT0 0x00800000 +#define BFL2_TEMPSENSE_HIGHER 0x01000000 +#define BFL2_BTC3WIREONLY 0x02000000 +#define BFL2_PWR_NOMINAL 0x04000000 +#define BFL2_EXTLNA_PWRSAVE 0x08000000 + +#define BFL2_4313_RADIOREG 0x10000000 + +#define BFL2_SDR_EN 0x20000000 + + +#define BOARD_GPIO_BTC3W_IN 0x850 +#define BOARD_GPIO_BTC3W_OUT 0x020 +#define BOARD_GPIO_BTCMOD_IN 0x010 +#define BOARD_GPIO_BTCMOD_OUT 0x020 +#define BOARD_GPIO_BTC_IN 0x080 +#define BOARD_GPIO_BTC_OUT 0x100 +#define BOARD_GPIO_PACTRL 0x200 +#define BOARD_GPIO_12 0x1000 +#define BOARD_GPIO_13 0x2000 +#define BOARD_GPIO_BTC4_IN 0x0800 +#define BOARD_GPIO_BTC4_BT 0x2000 +#define BOARD_GPIO_BTC4_STAT 0x4000 +#define BOARD_GPIO_BTC4_WLAN 0x8000 +#define BOARD_GPIO_1_WLAN_PWR 0x02 +#define BOARD_GPIO_3_WLAN_PWR 0x08 +#define BOARD_GPIO_4_WLAN_PWR 0x10 + +#define GPIO_BTC4W_OUT_4312 0x010 +#define GPIO_BTC4W_OUT_43224 0x020 +#define GPIO_BTC4W_OUT_43224_SHARED 0x0e0 +#define GPIO_BTC4W_OUT_43225 0x0e0 +#define GPIO_BTC4W_OUT_43421 0x020 +#define GPIO_BTC4W_OUT_4313 0x060 +#define GPIO_BTC4W_OUT_4331_SHARED 0x010 + +#define PCI_CFG_GPIO_SCS 0x10 +#define PCI_CFG_GPIO_HWRAD 0x20 +#define PCI_CFG_GPIO_XTAL 0x40 +#define PCI_CFG_GPIO_PLL 0x80 + + +#define PLL_DELAY 150 +#define FREF_DELAY 200 +#define MIN_SLOW_CLK 32 +#define XTAL_ON_DELAY 1000 + + + +#define GPIO_NUMPINS 32 + + +#define RDL_RAM_BASE_4319 0x60000000 +#define RDL_RAM_BASE_4329 0x60000000 +#define RDL_RAM_SIZE_4319 0x48000 +#define RDL_RAM_SIZE_4329 0x48000 +#define RDL_RAM_SIZE_43236 0x70000 +#define RDL_RAM_BASE_43236 0x60000000 +#define RDL_RAM_SIZE_4328 0x60000 +#define RDL_RAM_BASE_4328 0x80000000 +#define RDL_RAM_SIZE_4322 0x60000 +#define RDL_RAM_BASE_4322 0x60000000 + + +#define MUXENAB_UART 0x00000001 +#define MUXENAB_GPIO 0x00000002 +#define MUXENAB_ERCX 0x00000004 +#define MUXENAB_JTAG 0x00000008 +#define MUXENAB_HOST_WAKE 0x00000010 +#define MUXENAB_I2S_EN 0x00000020 +#define MUXENAB_I2S_MASTER 0x00000040 +#define MUXENAB_I2S_FULL 0x00000080 +#define MUXENAB_SFLASH 0x00000100 +#define MUXENAB_RFSWCTRL0 0x00000200 +#define MUXENAB_RFSWCTRL1 0x00000400 +#define MUXENAB_RFSWCTRL2 0x00000800 +#define MUXENAB_SECI 0x00001000 +#define MUXENAB_BT_LEGACY 0x00002000 +#define MUXENAB_HOST_WAKE1 0x00004000 + + +#define FLASH_KERNEL_NFLASH 0x00000001 +#define FLASH_BOOT_NFLASH 0x00000002 + +#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcmendian.h b/drivers/net/wireless/bcmdhd/src/include/bcmendian.h index 22eb7db..38d6bb0 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmendian.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmendian.h @@ -1,14 +1,14 @@ /* * Byte order utilities * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -67,7 +67,7 @@ #define htol16(i) (i) #define HTOL32(i) (i) #define htol32(i) (i) -#endif +#endif #define ltoh16_buf(buf, i) #define htol16_buf(buf, i) @@ -175,7 +175,7 @@ _NTOH32_UA(_bytes); \ }) -#else +#else static INLINE uint16 @@ -274,5 +274,5 @@ ntoh32_ua(const void *bytes) return _NTOH32_UA((const uint8 *)bytes); } -#endif -#endif +#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcmnvram.h b/drivers/net/wireless/bcmdhd/src/include/bcmnvram.h index ce0e035..62da907 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmnvram.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmnvram.h @@ -1,14 +1,14 @@ /* * NVRAM variable manipulation * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmnvram.h 320632 2012-03-12 19:22:42Z $ + * $Id: bcmnvram.h 288000 2011-10-05 19:05:16Z $ */ #ifndef _bcmnvram_h_ @@ -35,9 +35,9 @@ struct nvram_header { uint32 magic; uint32 len; - uint32 crc_ver_init; - uint32 config_refresh; - uint32 config_ncdl; + uint32 crc_ver_init; + uint32 config_refresh; + uint32 config_ncdl; }; struct nvram_tuple { @@ -109,12 +109,12 @@ extern int nvram_getall(char *nvram_buf, int count); uint8 nvram_calc_crc(struct nvram_header * nvh); -#endif +#endif #define NVRAM_SOFTWARE_VERSION "1" -#define NVRAM_MAGIC 0x48534C46 +#define NVRAM_MAGIC 0x48534C46 #define NVRAM_CLEAR_MAGIC 0x0 #define NVRAM_INVALID_MAGIC 0xFFFFFFFF #define NVRAM_VERSION 1 @@ -124,8 +124,8 @@ uint8 nvram_calc_crc(struct nvram_header * nvh); #define NVRAM_MAX_VALUE_LEN 255 #define NVRAM_MAX_PARAM_LEN 64 -#define NVRAM_CRC_START_POSITION 9 -#define NVRAM_CRC_VER_MASK 0xffffff00 +#define NVRAM_CRC_START_POSITION 9 +#define NVRAM_CRC_VER_MASK 0xffffff00 #define NVRAM_START_COMPRESSED 0x400 @@ -133,47 +133,4 @@ uint8 nvram_calc_crc(struct nvram_header * nvh); #define BCM_JUMBO_NVRAM_DELIMIT '\n' #define BCM_JUMBO_START "Broadcom Jumbo Nvram file" - -#if (defined(FAILSAFE_UPGRADE) || defined(CONFIG_FAILSAFE_UPGRADE) || \ - defined(__CONFIG_FAILSAFE_UPGRADE_SUPPORT__)) -#define IMAGE_SIZE "image_size" -#define BOOTPARTITION "bootpartition" -#define IMAGE_BOOT BOOTPARTITION -#define PARTIALBOOTS "partialboots" -#define MAXPARTIALBOOTS "maxpartialboots" -#define IMAGE_1ST_FLASH_TRX "flash0.trx" -#define IMAGE_1ST_FLASH_OS "flash0.os" -#define IMAGE_2ND_FLASH_TRX "flash0.trx2" -#define IMAGE_2ND_FLASH_OS "flash0.os2" -#define IMAGE_FIRST_OFFSET "image_first_offset" -#define IMAGE_SECOND_OFFSET "image_second_offset" -#define LINUX_FIRST "linux" -#define LINUX_SECOND "linux2" #endif - -#if (defined(DUAL_IMAGE) || defined(CONFIG_DUAL_IMAGE) || \ - defined(__CONFIG_DUAL_IMAGE_FLASH_SUPPORT__)) - -#define IMAGE_BOOT "image_boot" -#define BOOTPARTITION IMAGE_BOOT - -#define IMAGE_1ST_FLASH_TRX "flash0.trx" -#define IMAGE_1ST_FLASH_OS "flash0.os" -#define IMAGE_2ND_FLASH_TRX "flash0.trx2" -#define IMAGE_2ND_FLASH_OS "flash0.os2" -#define IMAGE_SIZE "image_size" - - -#define IMAGE_FIRST_OFFSET "image_first_offset" -#define IMAGE_SECOND_OFFSET "image_second_offset" - - -#define LINUX_FIRST "linux" -#define LINUX_SECOND "linux2" -#define POLICY_TOGGLE "toggle" -#define LINUX_PART_TO_FLASH "linux_to_flash" -#define LINUX_FLASH_POLICY "linux_flash_policy" - -#endif - -#endif diff --git a/drivers/net/wireless/bcmdhd/include/bcmpcispi.h b/drivers/net/wireless/bcmdhd/src/include/bcmpcispi.h index 44b263c..0c4b393 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmpcispi.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmpcispi.h @@ -1,14 +1,14 @@ /* * Broadcom PCI-SPI Host Controller Register Definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/bcmperf.h b/drivers/net/wireless/bcmdhd/src/include/bcmperf.h index 7438307..5373817 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmperf.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmperf.h @@ -1,14 +1,14 @@ /* * Performance counters software interface. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdbus.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdbus.h index 29657d7..de5cd87 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdbus.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdbus.h @@ -2,14 +2,14 @@ * Definitions for API from sdio common code (bcmsdh) to individual * host controller drivers. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdbus.h 347614 2012-07-27 10:24:51Z $ + * $Id: bcmsdbus.h 299859 2011-12-01 03:53:27Z $ */ #ifndef _sdio_api_h_ @@ -46,15 +46,6 @@ #define SDIOH_DATA_PIO 0 /* PIO mode */ #define SDIOH_DATA_DMA 1 /* DMA mode */ -#ifdef BCMSDIOH_TXGLOM -/* Max number of glommed pkts */ -#define SDPCM_MAXGLOM_SIZE 10 -#define SDPCM_DEFGLOM_SIZE 3 - -#define SDPCM_TXGLOM_CPY 0 /* SDIO 2.0 should use copy mode */ -#define SDPCM_TXGLOM_MDESC 1 /* SDIO 3.0 should use multi-desc mode */ -#endif - typedef int SDIOH_API_RC; @@ -95,18 +86,6 @@ extern SDIOH_API_RC sdioh_request_buffer(sdioh_info_t *si, uint pio_dma, uint fi uint rw, uint fnc_num, uint32 addr, uint regwidth, uint32 buflen, uint8 *buffer, void *pkt); -#ifdef BCMSDIOH_TXGLOM -extern void sdioh_glom_post(sdioh_info_t *sd, uint8 *frame, uint len); -extern void sdioh_glom_clear(sdioh_info_t *sd); -extern uint sdioh_set_mode(sdioh_info_t *sd, uint mode); -extern bool sdioh_glom_enabled(void); -#else -#define sdioh_glom_post(a, b, c) -#define sdioh_glom_clear(a) -#define sdioh_set_mode(a) (0) -#define sdioh_glom_enabled() (FALSE) -#endif - /* get cis data */ extern SDIOH_API_RC sdioh_cis_read(sdioh_info_t *si, uint fuc, uint8 *cis, uint32 length); @@ -137,14 +116,6 @@ extern int sdioh_sdio_reset(sdioh_info_t *si); void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh); -#ifdef BCMSPI -/* Function to pass gSPI specific device-status bits to dhd. */ -extern uint32 sdioh_get_dstatus(sdioh_info_t *si); - -/* chipid and chiprev info for lower layers to control sw WAR's for hw bugs. */ -extern void sdioh_chipinfo(sdioh_info_t *si, uint32 chip, uint32 chiprev); -extern void sdioh_dwordmode(sdioh_info_t *si, bool set); -#endif /* BCMSPI */ #if defined(BCMSDIOH_STD) #define SDIOH_SLEEP_ENABLED diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdh.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdh.h index 3348e84..7dbef59 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdh.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdh.h @@ -3,14 +3,14 @@ * export functions to client drivers * abstract OS and BUS specific details of SDIO * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -18,12 +18,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh.h 347614 2012-07-27 10:24:51Z $ + * $Id: bcmsdh.h 299859 2011-12-01 03:53:27Z $ */ /** @@ -56,7 +56,7 @@ typedef void (*bcmsdh_cb_fn_t)(void *); * most recent one) to enable single-instance implementations to pass NULL. */ -#if 0 && (NDISVER >= 0x0630) && 1 +#if defined(NDIS630) extern bcmsdh_info_t *bcmsdh_attach(osl_t *osh, void *cfghdl, void **regsva, uint irq, shared_info_t *sh); #else @@ -145,10 +145,6 @@ extern int bcmsdh_recv_buf(void *sdh, uint32 addr, uint fn, uint flags, uint8 *buf, uint nbytes, void *pkt, bcmsdh_cmplt_fn_t complete_fn, void *handle); -extern void bcmsdh_glom_post(void *sdh, uint8 *frame, uint len); -extern void bcmsdh_glom_clear(void *sdh); -extern uint bcmsdh_set_mode(void *sdh, uint mode); -extern bool bcmsdh_glom_enabled(void); /* Flags bits */ #define SDIO_REQ_4BYTE 0x1 /* Four-byte target (backplane) width (vs. two-byte) */ #define SDIO_REQ_FIXED 0x2 /* Fixed address (FIFO) (vs. incrementing address) */ @@ -215,11 +211,11 @@ extern void bcmsdh_device_remove(void * sdh); extern int bcmsdh_reg_sdio_notify(void* semaphore); extern void bcmsdh_unreg_sdio_notify(void); -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) extern int bcmsdh_register_oob_intr(void * dhdp); extern void bcmsdh_unregister_oob_intr(void); extern void bcmsdh_oob_intr_set(bool enable); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ /* Function to pass device-status bits to DHD. */ extern uint32 bcmsdh_get_dstatus(void *sdh); @@ -230,9 +226,6 @@ extern uint32 bcmsdh_cur_sbwad(void *sdh); /* Function to pass chipid and rev to lower layers for controlling pr's */ extern void bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev); -#ifdef BCMSPI -extern void bcmsdh_dwordmode(void *sdh, bool set); -#endif /* BCMSPI */ extern int bcmsdh_sleep(void *sdh, bool enab); diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdh_sdmmc.h index 80f3900..1e06472 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdh_sdmmc.h @@ -2,13 +2,13 @@ * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,18 +16,18 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.h 313732 2012-02-08 19:49:00Z $ + * $Id: bcmsdh_sdmmc.h 294363 2011-11-06 23:02:20Z $ */ #ifndef __BCMSDH_SDMMC_H__ #define __BCMSDH_SDMMC_H__ -#define sd_err(x) +#define sd_err(x) do{printf x;}while(0) #define sd_trace(x) #define sd_info(x) #define sd_debug(x) @@ -59,10 +59,10 @@ extern void sdioh_sdmmc_osfree(sdioh_info_t *sd); /* private bus modes */ #define SDIOH_MODE_SD4 2 -#define CLIENT_INTR 0x100 /* Get rid of this! */ +#define CLIENT_INTR 0x100 /* Get rid of this! */ struct sdioh_info { - osl_t *osh; /* osh handler */ + osl_t *osh; /* osh handler */ bool client_intr_enabled; /* interrupt connnected flag */ bool intr_handler_valid; /* client driver interrupt handler valid */ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ @@ -70,18 +70,18 @@ struct sdioh_info { uint16 intmask; /* Current active interrupts */ void *sdos_info; /* Pointer to per-OS private data */ - uint irq; /* Client irq */ - int intrcount; /* Client interrupts */ + uint irq; /* Client irq */ + int intrcount; /* Client interrupts */ bool sd_use_dma; /* DMA on CMD53 */ - bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ + bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ /* Must be on for sd_multiblock to be effective */ - bool use_client_ints; /* If this is false, make sure to restore */ - int sd_mode; /* SD1/SD4/SPI */ - int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ - uint8 num_funcs; /* Supported funcs on client */ - uint32 com_cis_ptr; - uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; + bool use_client_ints; /* If this is false, make sure to restore */ + int sd_mode; /* SD1/SD4/SPI */ + int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ + uint8 num_funcs; /* Supported funcs on client */ + uint32 com_cis_ptr; + uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; #define SDIOH_SDMMC_MAX_SG_ENTRIES 32 struct scatterlist sg_list[SDIOH_SDMMC_MAX_SG_ENTRIES]; diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdpcm.h index 80c0a3d..f3b3623 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdpcm.h @@ -2,14 +2,14 @@ * Broadcom SDIO/PCMCIA * Software-specific definitions shared between device and host side * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,7 +17,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -110,7 +110,7 @@ /* Data Offset from SOF (HW Tag, SW Tag, Pad) */ #define SDPCM_DOFFSET_OFFSET 3 /* Data Offset */ -#define SDPCM_DOFFSET_VALUE(p) (((uint8 *)p)[SDPCM_DOFFSET_OFFSET] & 0xff) +#define SDPCM_DOFFSET_VALUE(p) (((uint8 *)p)[SDPCM_DOFFSET_OFFSET] & 0xff) #define SDPCM_DOFFSET_MASK 0xff000000 #define SDPCM_DOFFSET_SHIFT 24 diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdspi.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdspi.h index 3d444f3..45b2d11 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdspi.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdspi.h @@ -1,14 +1,14 @@ /* * SD-SPI Protocol Conversion - BCMSDH->SPI Translation Layer * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -57,13 +57,13 @@ #define USE_MULTIBLOCK 0x4 struct sdioh_info { - uint cfg_bar; /* pci cfg address for bar */ - uint32 caps; /* cached value of capabilities reg */ + uint cfg_bar; /* pci cfg address for bar */ + uint32 caps; /* cached value of capabilities reg */ uint bar0; /* BAR0 for PCI Device */ - osl_t *osh; /* osh handler */ + osl_t *osh; /* osh handler */ void *controller; /* Pointer to SPI Controller's private data struct */ - uint lockcount; /* nest count of sdspi_lock() calls */ + uint lockcount; /* nest count of sdspi_lock() calls */ bool client_intr_enabled; /* interrupt connnected flag */ bool intr_handler_valid; /* client driver interrupt handler valid */ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ @@ -75,34 +75,34 @@ struct sdioh_info { uint32 controller_type; /* Host controller type */ uint8 version; /* Host Controller Spec Compliance Version */ - uint irq; /* Client irq */ - uint32 intrcount; /* Client interrupts */ - uint32 local_intrcount; /* Controller interrupts */ - bool host_init_done; /* Controller initted */ - bool card_init_done; /* Client SDIO interface initted */ - bool polled_mode; /* polling for command completion */ + uint irq; /* Client irq */ + uint32 intrcount; /* Client interrupts */ + uint32 local_intrcount; /* Controller interrupts */ + bool host_init_done; /* Controller initted */ + bool card_init_done; /* Client SDIO interface initted */ + bool polled_mode; /* polling for command completion */ bool sd_use_dma; /* DMA on CMD53 */ - bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ + bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ /* Must be on for sd_multiblock to be effective */ - bool use_client_ints; /* If this is false, make sure to restore */ + bool use_client_ints; /* If this is false, make sure to restore */ bool got_hcint; /* Host Controller interrupt. */ /* polling hack in wl_linux.c:wl_timer() */ - int adapter_slot; /* Maybe dealing with multiple slots/controllers */ - int sd_mode; /* SD1/SD4/SPI */ - int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ - uint32 data_xfer_count; /* Current register transfer size */ + int adapter_slot; /* Maybe dealing with multiple slots/controllers */ + int sd_mode; /* SD1/SD4/SPI */ + int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ + uint32 data_xfer_count; /* Current register transfer size */ uint32 cmd53_wr_data; /* Used to pass CMD53 write data */ uint32 card_response; /* Used to pass back response status byte */ uint32 card_rsp_data; /* Used to pass back response data word */ - uint16 card_rca; /* Current Address */ - uint8 num_funcs; /* Supported funcs on client */ - uint32 com_cis_ptr; - uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; + uint16 card_rca; /* Current Address */ + uint8 num_funcs; /* Supported funcs on client */ + uint32 com_cis_ptr; + uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; void *dma_buf; ulong dma_phys; - int r_cnt; /* rx count */ - int t_cnt; /* tx_count */ + int r_cnt; /* rx count */ + int t_cnt; /* tx_count */ }; /************************************************************ diff --git a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h b/drivers/net/wireless/bcmdhd/src/include/bcmsdstd.h index 896686c..b732331 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmsdstd.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmsdstd.h @@ -1,14 +1,14 @@ /* * 'Standard' SDIO HOST CONTROLLER driver * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdstd.h 347614 2012-07-27 10:24:51Z $ + * $Id: bcmsdstd.h 294369 2011-11-06 23:22:23Z $ */ #ifndef _BCM_SD_STD_H #define _BCM_SD_STD_H @@ -62,7 +62,7 @@ extern void sdstd_osfree(sdioh_info_t *sd); #define SDIOH_MODE_SD1 1 #define SDIOH_MODE_SD4 2 -#define MAX_SLOTS 6 /* For PCI: Only 6 BAR entries => 6 slots */ +#define MAX_SLOTS 6 /* For PCI: Only 6 BAR entries => 6 slots */ #define SDIOH_REG_WINSZ 0x100 /* Number of registers in Standard Host Controller */ #define SDIOH_TYPE_ARASAN_HDK 1 @@ -87,31 +87,19 @@ extern void sdstd_osfree(sdioh_info_t *sd); #define USE_FIFO 0x8 /* Fifo vs non-fifo */ -#define CLIENT_INTR 0x100 /* Get rid of this! */ +#define CLIENT_INTR 0x100 /* Get rid of this! */ #define HC_INTR_RETUNING 0x1000 -#ifdef BCMSDIOH_TXGLOM -/* Setting the MAX limit to 10 */ -#define SDIOH_MAXGLOM_SIZE 10 - -typedef struct glom_buf { - uint32 count; /* Total number of pkts queued */ - void *dma_buf_arr[SDIOH_MAXGLOM_SIZE]; /* Frame address */ - ulong dma_phys_arr[SDIOH_MAXGLOM_SIZE]; /* DMA_MAPed address of frames */ - uint16 nbytes[SDIOH_MAXGLOM_SIZE]; /* Size of each frame */ -} glom_buf_t; -#endif - struct sdioh_info { - uint cfg_bar; /* pci cfg address for bar */ - uint32 caps; /* cached value of capabilities reg */ - uint32 curr_caps; /* max current capabilities reg */ + uint cfg_bar; /* pci cfg address for bar */ + uint32 caps; /* cached value of capabilities reg */ + uint32 curr_caps; /* max current capabilities reg */ - osl_t *osh; /* osh handler */ - volatile char *mem_space; /* pci device memory va */ - uint lockcount; /* nest count of sdstd_lock() calls */ + osl_t *osh; /* osh handler */ + volatile char *mem_space; /* pci device memory va */ + uint lockcount; /* nest count of sdstd_lock() calls */ bool client_intr_enabled; /* interrupt connnected flag */ bool intr_handler_valid; /* client driver interrupt handler valid */ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ @@ -123,26 +111,26 @@ struct sdioh_info { uint32 controller_type; /* Host controller type */ uint8 version; /* Host Controller Spec Compliance Version */ - uint irq; /* Client irq */ - int intrcount; /* Client interrupts */ - int local_intrcount; /* Controller interrupts */ - bool host_init_done; /* Controller initted */ - bool card_init_done; /* Client SDIO interface initted */ - bool polled_mode; /* polling for command completion */ - - bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ + uint irq; /* Client irq */ + int intrcount; /* Client interrupts */ + int local_intrcount; /* Controller interrupts */ + bool host_init_done; /* Controller initted */ + bool card_init_done; /* Client SDIO interface initted */ + bool polled_mode; /* polling for command completion */ + + bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ /* Must be on for sd_multiblock to be effective */ - bool use_client_ints; /* If this is false, make sure to restore */ + bool use_client_ints; /* If this is false, make sure to restore */ /* polling hack in wl_linux.c:wl_timer() */ - int adapter_slot; /* Maybe dealing with multiple slots/controllers */ - int sd_mode; /* SD1/SD4/SPI */ - int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ - uint32 data_xfer_count; /* Current transfer */ - uint16 card_rca; /* Current Address */ + int adapter_slot; /* Maybe dealing with multiple slots/controllers */ + int sd_mode; /* SD1/SD4/SPI */ + int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ + uint32 data_xfer_count; /* Current transfer */ + uint16 card_rca; /* Current Address */ int8 sd_dma_mode; /* DMA Mode (PIO, SDMA, ... ADMA2) on CMD53 */ - uint8 num_funcs; /* Supported funcs on client */ - uint32 com_cis_ptr; - uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; + uint8 num_funcs; /* Supported funcs on client */ + uint32 com_cis_ptr; + uint32 func_cis_ptr[SDIOD_MAX_FUNCS]; void *dma_buf; /* DMA Buffer virtual address */ ulong dma_phys; /* DMA Buffer physical address */ void *adma2_dscr_buf; /* ADMA2 Descriptor Buffer virtual address */ @@ -156,12 +144,12 @@ struct sdioh_info { ulong adma2_dscr_start_phys; uint alloced_adma2_dscr_size; - int r_cnt; /* rx count */ - int t_cnt; /* tx_count */ + int r_cnt; /* rx count */ + int t_cnt; /* tx_count */ bool got_hcint; /* local interrupt flag */ uint16 last_intrstatus; /* to cache intrstatus */ - int host_UHSISupported; /* whether UHSI is supported for HC. */ - int card_UHSI_voltage_Supported; /* whether UHSI is supported for + int host_UHSISupported; /* whether UHSI is supported for HC. */ + int card_UHSI_voltage_Supported; /* whether UHSI is supported for * Card in terms of Voltage [1.8 or 3.3]. */ int global_UHSI_Supp; /* type of UHSI support in both host and card. @@ -169,14 +157,10 @@ struct sdioh_info { * HOST_SDR_12_25: SDR12 and SDR25 supported * HOST_SDR_50_104_DDR: one of SDR50/SDR104 or DDR50 supptd */ - volatile int sd3_dat_state; /* data transfer state used for retuning check */ - volatile int sd3_tun_state; /* tuning state used for retuning check */ - bool sd3_tuning_reqd; /* tuning requirement parameter */ + int sd3_dat_state; /* data transfer state used for retuning check */ + int sd3_tun_state; /* tuning state used for retuning check */ + bool sd3_tuning_reqd; /* tuning requirement parameter */ uint32 caps3; /* cached value of 32 MSbits capabilities reg (SDIO 3.0) */ -#ifdef BCMSDIOH_TXGLOM - glom_buf_t glom_info; /* pkt information used for glomming */ - uint txglom_mode; /* Txglom mode: 0 - copy, 1 - multi-descriptor */ -#endif }; #define DMA_MODE_NONE 0 @@ -189,17 +173,14 @@ struct sdioh_info { #define USE_DMA(sd) ((bool)((sd->sd_dma_mode > 0) ? TRUE : FALSE)) /* States for Tuning and corr data */ -#define TUNING_IDLE 0 -#define TUNING_START 1 -#define TUNING_START_AFTER_DAT 2 -#define TUNING_ONGOING 3 +#define TUNING_IDLE 0 +#define TUNING_START 1 +#define TUNING_START_AFTER_DAT 2 +#define TUNING_ONGOING 3 -#define DATA_TRANSFER_IDLE 0 +#define DATA_TRANSFER_IDLE 0 #define DATA_TRANSFER_ONGOING 1 -#define CHECK_TUNING_PRE_DATA 1 -#define CHECK_TUNING_POST_DATA 2 - /************************************************************ * Internal interfaces: per-port references into bcmsdstd.c */ @@ -246,12 +227,10 @@ extern int sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield, extern void sdstd_3_enable_retuning_int(sdioh_info_t *sd); extern void sdstd_3_disable_retuning_int(sdioh_info_t *sd); extern bool sdstd_3_is_retuning_int_set(sdioh_info_t *sd); -extern void sdstd_3_check_and_do_tuning(sdioh_info_t *sd, int tuning_param); extern bool sdstd_3_check_and_set_retuning(sdioh_info_t *sd); extern int sdstd_3_get_tune_state(sdioh_info_t *sd); extern int sdstd_3_get_data_state(sdioh_info_t *sd); extern void sdstd_3_set_tune_state(sdioh_info_t *sd, int state); -extern void sdstd_3_set_data_state(sdioh_info_t *sd, int state); extern uint8 sdstd_3_get_tuning_exp(sdioh_info_t *sd); extern uint32 sdstd_3_get_uhsi_clkmode(sdioh_info_t *sd); extern int sdstd_3_clk_tuning(sdioh_info_t *sd, uint32 sd3ClkMode); diff --git a/drivers/net/wireless/bcmdhd/include/bcmspi.h b/drivers/net/wireless/bcmdhd/src/include/bcmspi.h index e226cb1..c5261a0 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmspi.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmspi.h @@ -1,14 +1,14 @@ /* * Broadcom SPI Low-Level Hardware Driver API * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/bcmutils.h b/drivers/net/wireless/bcmdhd/src/include/bcmutils.h index b735090..f1f7426 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/bcmutils.h +++ b/drivers/net/wireless/bcmdhd/src/include/bcmutils.h @@ -1,14 +1,14 @@ /* * Misc useful os-independent macros and functions. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmutils.h 354184 2012-08-30 08:08:08Z $ + * $Id: bcmutils.h 301796 2011-12-08 20:57:02Z $ */ #ifndef _bcmutils_h_ @@ -40,14 +40,14 @@ extern "C" { #endif -#define _BCM_U 0x01 -#define _BCM_L 0x02 -#define _BCM_D 0x04 -#define _BCM_C 0x08 -#define _BCM_P 0x10 -#define _BCM_S 0x20 -#define _BCM_X 0x40 -#define _BCM_SP 0x80 +#define _BCM_U 0x01 +#define _BCM_L 0x02 +#define _BCM_D 0x04 +#define _BCM_C 0x08 +#define _BCM_P 0x10 +#define _BCM_S 0x20 +#define _BCM_X 0x40 +#define _BCM_SP 0x80 extern const unsigned char bcm_ctype[]; #define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)]) @@ -69,17 +69,17 @@ extern const unsigned char bcm_ctype[]; struct bcmstrbuf { - char *buf; - unsigned int size; - char *origbuf; - unsigned int origsize; + char *buf; + unsigned int size; + char *origbuf; + unsigned int origsize; }; #ifdef BCMDRIVER #include <osl.h> -#define GPIO_PIN_NOTDEFINED 0x20 +#define GPIO_PIN_NOTDEFINED 0x20 #define SPINWAIT(exp, us) { \ @@ -92,59 +92,59 @@ struct bcmstrbuf { #ifndef PKTQ_LEN_DEFAULT -#define PKTQ_LEN_DEFAULT 128 +#define PKTQ_LEN_DEFAULT 128 #endif #ifndef PKTQ_MAX_PREC -#define PKTQ_MAX_PREC 16 +#define PKTQ_MAX_PREC 16 #endif typedef struct pktq_prec { - void *head; - void *tail; - uint16 len; - uint16 max; + void *head; + void *tail; + uint16 len; + uint16 max; } pktq_prec_t; #ifdef PKTQ_LOG typedef struct { - uint32 requested; - uint32 stored; - uint32 saved; - uint32 selfsaved; - uint32 full_dropped; - uint32 dropped; - uint32 sacrificed; - uint32 busy; - uint32 retry; - uint32 ps_retry; - uint32 retry_drop; - uint32 max_avail; - uint32 max_used; - uint32 queue_capacity; + uint32 requested; + uint32 stored; + uint32 saved; + uint32 selfsaved; + uint32 full_dropped; + uint32 dropped; + uint32 sacrificed; + uint32 busy; + uint32 retry; + uint32 ps_retry; + uint32 retry_drop; + uint32 max_avail; + uint32 max_used; + uint32 queue_capacity; } pktq_counters_t; -#endif +#endif #define PKTQ_COMMON \ - uint16 num_prec; \ - uint16 hi_prec; \ - uint16 max; \ - uint16 len; + uint16 num_prec; \ + uint16 hi_prec; \ + uint16 max; \ + uint16 len; struct pktq { PKTQ_COMMON - + struct pktq_prec q[PKTQ_MAX_PREC]; #ifdef PKTQ_LOG - pktq_counters_t _prec_cnt[PKTQ_MAX_PREC]; + pktq_counters_t _prec_cnt[PKTQ_MAX_PREC]; #endif }; struct spktq { PKTQ_COMMON - + struct pktq_prec q[1]; }; @@ -159,15 +159,15 @@ typedef bool (*ifpkt_cb_t)(void*, int); #define SHARED_POOL (pktpool_shared_ptr) #else #define SHARED_POOL (pktpool_shared) -#endif -#else +#endif +#else #define POOL_ENAB(bus) 0 #define SHARED_POOL ((struct pktpool *)NULL) -#endif +#endif #ifndef PKTPOOL_LEN_MAX #define PKTPOOL_LEN_MAX 40 -#endif +#endif #define PKTPOOL_CB_MAX 3 struct pktpool; @@ -195,15 +195,15 @@ typedef struct { } pktpool_dbg_t; typedef struct { - uint8 txdh; - uint8 txd11; - uint8 enq; - uint8 rxdh; - uint8 rxd11; - uint8 rxfill; - uint8 idle; + uint8 txdh; + uint8 txd11; + uint8 enq; + uint8 rxdh; + uint8 rxd11; + uint8 rxfill; + uint8 idle; } pktpool_stats_t; -#endif +#endif typedef struct pktpool { bool inited; @@ -235,7 +235,7 @@ typedef struct pktpool { extern pktpool_t *pktpool_shared_ptr; #else extern pktpool_t *pktpool_shared; -#endif +#endif extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx); extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp); @@ -264,7 +264,7 @@ extern int pktpool_start_trigger(pktpool_t *pktp, void *p); extern int pktpool_dbg_dump(pktpool_t *pktp); extern int pktpool_dbg_notify(pktpool_t *pktp); extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats); -#endif +#endif @@ -338,10 +338,10 @@ extern uint pktsegcnt_war(osl_t *osh, void *p); extern uint8 *pktoffset(osl_t *osh, void *p, uint offset); -#define PKTPRIO_VDSCP 0x100 -#define PKTPRIO_VLAN 0x200 -#define PKTPRIO_UPD 0x400 -#define PKTPRIO_DSCP 0x800 +#define PKTPRIO_VDSCP 0x100 +#define PKTPRIO_VLAN 0x200 +#define PKTPRIO_UPD 0x400 +#define PKTPRIO_DSCP 0x800 extern uint pktsetprio(void *pkt, bool update_vtag); @@ -393,18 +393,18 @@ extern int bcm_nvram_cache(void *sih); typedef struct bcm_iovar { - const char *name; - uint16 varid; - uint16 flags; - uint16 type; - uint16 minlen; + const char *name; + uint16 varid; + uint16 flags; + uint16 type; + uint16 minlen; } bcm_iovar_t; -#define IOV_GET 0 -#define IOV_SET 1 +#define IOV_GET 0 +#define IOV_SET 1 #define IOV_GVAL(id) ((id) * 2) @@ -419,19 +419,19 @@ extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \ defined(WLMSG_PRPKT) || defined(WLMSG_WSEC) extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); -#endif -#endif - - -#define IOVT_VOID 0 -#define IOVT_BOOL 1 -#define IOVT_INT8 2 -#define IOVT_UINT8 3 -#define IOVT_INT16 4 -#define IOVT_UINT16 5 -#define IOVT_INT32 6 -#define IOVT_UINT32 7 -#define IOVT_BUFFER 8 +#endif +#endif + + +#define IOVT_VOID 0 +#define IOVT_BOOL 1 +#define IOVT_INT8 2 +#define IOVT_UINT8 3 +#define IOVT_INT16 4 +#define IOVT_UINT16 5 +#define IOVT_INT32 6 +#define IOVT_UINT32 7 +#define IOVT_BUFFER 8 #define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER) @@ -458,55 +458,55 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); -#define BCME_STRLEN 64 +#define BCME_STRLEN 64 #define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST)) -#define BCME_OK 0 -#define BCME_ERROR -1 -#define BCME_BADARG -2 -#define BCME_BADOPTION -3 -#define BCME_NOTUP -4 -#define BCME_NOTDOWN -5 -#define BCME_NOTAP -6 -#define BCME_NOTSTA -7 -#define BCME_BADKEYIDX -8 -#define BCME_RADIOOFF -9 -#define BCME_NOTBANDLOCKED -10 -#define BCME_NOCLK -11 -#define BCME_BADRATESET -12 -#define BCME_BADBAND -13 -#define BCME_BUFTOOSHORT -14 -#define BCME_BUFTOOLONG -15 -#define BCME_BUSY -16 -#define BCME_NOTASSOCIATED -17 -#define BCME_BADSSIDLEN -18 -#define BCME_OUTOFRANGECHAN -19 -#define BCME_BADCHAN -20 -#define BCME_BADADDR -21 -#define BCME_NORESOURCE -22 -#define BCME_UNSUPPORTED -23 -#define BCME_BADLEN -24 -#define BCME_NOTREADY -25 -#define BCME_EPERM -26 -#define BCME_NOMEM -27 -#define BCME_ASSOCIATED -28 -#define BCME_RANGE -29 -#define BCME_NOTFOUND -30 -#define BCME_WME_NOT_ENABLED -31 -#define BCME_TSPEC_NOTFOUND -32 -#define BCME_ACM_NOTSUPPORTED -33 -#define BCME_NOT_WME_ASSOCIATION -34 -#define BCME_SDIO_ERROR -35 -#define BCME_DONGLE_DOWN -36 -#define BCME_VERSION -37 -#define BCME_TXFAIL -38 -#define BCME_RXFAIL -39 -#define BCME_NODEVICE -40 -#define BCME_NMODE_DISABLED -41 -#define BCME_NONRESIDENT -42 +#define BCME_OK 0 +#define BCME_ERROR -1 +#define BCME_BADARG -2 +#define BCME_BADOPTION -3 +#define BCME_NOTUP -4 +#define BCME_NOTDOWN -5 +#define BCME_NOTAP -6 +#define BCME_NOTSTA -7 +#define BCME_BADKEYIDX -8 +#define BCME_RADIOOFF -9 +#define BCME_NOTBANDLOCKED -10 +#define BCME_NOCLK -11 +#define BCME_BADRATESET -12 +#define BCME_BADBAND -13 +#define BCME_BUFTOOSHORT -14 +#define BCME_BUFTOOLONG -15 +#define BCME_BUSY -16 +#define BCME_NOTASSOCIATED -17 +#define BCME_BADSSIDLEN -18 +#define BCME_OUTOFRANGECHAN -19 +#define BCME_BADCHAN -20 +#define BCME_BADADDR -21 +#define BCME_NORESOURCE -22 +#define BCME_UNSUPPORTED -23 +#define BCME_BADLEN -24 +#define BCME_NOTREADY -25 +#define BCME_EPERM -26 +#define BCME_NOMEM -27 +#define BCME_ASSOCIATED -28 +#define BCME_RANGE -29 +#define BCME_NOTFOUND -30 +#define BCME_WME_NOT_ENABLED -31 +#define BCME_TSPEC_NOTFOUND -32 +#define BCME_ACM_NOTSUPPORTED -33 +#define BCME_NOT_WME_ASSOCIATION -34 +#define BCME_SDIO_ERROR -35 +#define BCME_DONGLE_DOWN -36 +#define BCME_VERSION -37 +#define BCME_TXFAIL -38 +#define BCME_RXFAIL -39 +#define BCME_NODEVICE -40 +#define BCME_NMODE_DISABLED -41 +#define BCME_NONRESIDENT -42 #define BCME_LAST BCME_NONRESIDENT @@ -558,15 +558,15 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #ifndef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) -#endif +#endif #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif +#endif #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif +#endif #define CEIL(x, y) (((x) + ((y) - 1)) / (y)) #define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) @@ -585,8 +585,8 @@ extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); #define OFFSETOF(type, member) offsetof(type, member) #else #define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member) -#endif -#endif +#endif +#endif #ifndef ARRAYSIZE #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) @@ -598,14 +598,14 @@ extern void *_bcmutils_dummy_fn; #ifndef setbit -#ifndef NBBY -#define NBBY 8 -#endif +#ifndef NBBY +#define NBBY 8 +#endif #define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY)) #define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY))) #define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) #define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0) -#endif +#endif #define NBITS(type) (sizeof(type) * 8) #define NBITVAL(nbits) (1 << (nbits)) @@ -635,35 +635,12 @@ extern void *_bcmutils_dummy_fn; #define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1)) -#define CRC8_INIT_VALUE 0xff -#define CRC8_GOOD_VALUE 0x9f -#define CRC16_INIT_VALUE 0xffff -#define CRC16_GOOD_VALUE 0xf0b8 -#define CRC32_INIT_VALUE 0xffffffff -#define CRC32_GOOD_VALUE 0xdebb20e3 - - -#define MACF "%02x:%02x:%02x:%02x:%02x:%02x" -#define ETHERP_TO_MACF(ea) ((struct ether_addr *) (ea))->octet[0], \ - ((struct ether_addr *) (ea))->octet[1], \ - ((struct ether_addr *) (ea))->octet[2], \ - ((struct ether_addr *) (ea))->octet[3], \ - ((struct ether_addr *) (ea))->octet[4], \ - ((struct ether_addr *) (ea))->octet[5] - -#define ETHER_TO_MACF(ea) (ea).octet[0], \ - (ea).octet[1], \ - (ea).octet[2], \ - (ea).octet[3], \ - (ea).octet[4], \ - (ea).octet[5] -#if !defined(SIMPLE_MAC_PRINT) -#define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x" -#define STR_TO_MACD(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] -#else -#define MACDBG "%02x:%02x:%02x" -#define STR_TO_MACD(ea) (ea)[0], (ea)[4], (ea)[5] -#endif +#define CRC8_INIT_VALUE 0xff +#define CRC8_GOOD_VALUE 0x9f +#define CRC16_INIT_VALUE 0xffff +#define CRC16_GOOD_VALUE 0xf0b8 +#define CRC32_INIT_VALUE 0xffffffff +#define CRC32_GOOD_VALUE 0xdebb20e3 typedef struct bcm_bit_desc { @@ -682,7 +659,7 @@ typedef struct bcm_tlv { #define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len)) -#define ETHER_ADDR_STR_LEN 18 +#define ETHER_ADDR_STR_LEN 18 @@ -694,14 +671,14 @@ xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst) 1 || #endif (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) { - - + + ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0]; ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1]; ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2]; ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3]; } else { - + int k; for (k = 0; k < 16; k++) dst[k] = src1[k] ^ src2[k]; @@ -742,16 +719,16 @@ extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); typedef uint32 mbool; -#define mboolset(mb, bit) ((mb) |= (bit)) -#define mboolclr(mb, bit) ((mb) &= ~(bit)) -#define mboolisset(mb, bit) (((mb) & (bit)) != 0) +#define mboolset(mb, bit) ((mb) |= (bit)) +#define mboolclr(mb, bit) ((mb) &= ~(bit)) +#define mboolisset(mb, bit) (((mb) & (bit)) != 0) #define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val))) struct fielddesc { const char *nameandfmt; - uint32 offset; - uint32 len; + uint32 offset; + uint32 len; }; extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size); @@ -779,4 +756,4 @@ unsigned int process_nvram_vars(char *varbuf, unsigned int len); } #endif -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/dhdioctl.h b/drivers/net/wireless/bcmdhd/src/include/dhdioctl.h index f2fc244..c645563 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/dhdioctl.h +++ b/drivers/net/wireless/bcmdhd/src/include/dhdioctl.h @@ -5,14 +5,14 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -20,12 +20,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhdioctl.h 353180 2012-08-24 22:37:10Z $ + * $Id: dhdioctl.h 303826 2011-12-20 06:02:09Z $ */ #ifndef _dhdioctl_h_ @@ -85,14 +85,13 @@ enum { #define DHD_GLOM_VAL 0x0400 #define DHD_EVENT_VAL 0x0800 #define DHD_BTA_VAL 0x1000 -#if 0 && (NDISVER >= 0x0630) && 1 +#if defined(NDIS630) #define DHD_SCAN_VAL 0x2000 #else #define DHD_ISCAN_VAL 0x2000 #endif #define DHD_ARPOE_VAL 0x4000 #define DHD_REORDER_VAL 0x8000 -#define DHD_WL_VAL 0x10000 #ifdef SDTEST /* For pktgen iovar */ @@ -116,7 +115,7 @@ typedef struct dhd_pktgen { /* Type of test packets to use */ #define DHD_PKTGEN_ECHO 1 /* Send echo requests */ -#define DHD_PKTGEN_SEND 2 /* Send discard packets */ +#define DHD_PKTGEN_SEND 2 /* Send discard packets */ #define DHD_PKTGEN_RXBURST 3 /* Request dongle send N packets */ #define DHD_PKTGEN_RECV 4 /* Continuous rx from continuous tx dongle */ #endif /* SDTEST */ diff --git a/drivers/net/wireless/bcmdhd/src/include/epivers.h b/drivers/net/wireless/bcmdhd/src/include/epivers.h new file mode 100644 index 0000000..4e873bb --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/epivers.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: epivers.h.in,v 13.33 2010-09-08 22:08:53 $ + * +*/ + +#ifndef _epivers_h_ +#define _epivers_h_ + +#define EPI_MAJOR_VERSION 1 + +#define EPI_MINOR_VERSION 15 + +#define EPI_RC_NUMBER 15 + +#define EPI_INCREMENTAL_NUMBER 0 + +#define EPI_BUILD_NUMBER 0 + +#define EPI_VERSION 1, 15, 15, 0 + +#define EPI_VERSION_NUM 0x010f0f00 + +#define EPI_VERSION_DEV 1.15.15 + + +#define EPI_VERSION_STR "1.15.15" + +#endif /* _epivers_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/hndpmu.h b/drivers/net/wireless/bcmdhd/src/include/hndpmu.h index c41def6..b2911fd 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/hndpmu.h +++ b/drivers/net/wireless/bcmdhd/src/include/hndpmu.h @@ -1,14 +1,14 @@ /* * HND SiliconBackplane PMU support. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h b/drivers/net/wireless/bcmdhd/src/include/hndrte_armtrap.h index 90d9799..a3eae2d 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/hndrte_armtrap.h +++ b/drivers/net/wireless/bcmdhd/src/include/hndrte_armtrap.h @@ -1,14 +1,14 @@ /* * HNDRTE arm trap handling. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/hndrte_cons.h b/drivers/net/wireless/bcmdhd/src/include/hndrte_cons.h index 57abbbd..5006556 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/hndrte_cons.h +++ b/drivers/net/wireless/bcmdhd/src/include/hndrte_cons.h @@ -1,14 +1,14 @@ /* * Console support for hndrte. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/hndsoc.h b/drivers/net/wireless/bcmdhd/src/include/hndsoc.h index 66640c3..1f11aef 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/hndsoc.h +++ b/drivers/net/wireless/bcmdhd/src/include/hndsoc.h @@ -1,14 +1,14 @@ /* * Broadcom HND chip & on-chip-interconnect-related definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndsoc.h 309193 2012-01-19 00:03:57Z $ + * $Id: hndsoc.h 283666 2011-09-15 00:27:45Z $ */ #ifndef _HNDSOC_H @@ -42,10 +42,10 @@ #define SI_SDRAM_SWAPPED 0x10000000 /* Byteswapped Physical SDRAM */ #define SI_SDRAM_R2 0x80000000 /* Region 2 for sdram (512 MB) */ -#define SI_ENUM_BASE 0x18000000 /* Enumeration space base */ +#define SI_ENUM_BASE 0x18000000 /* Enumeration space base */ -#define SI_WRAP_BASE 0x18100000 /* Wrapper space base */ -#define SI_CORE_SIZE 0x1000 /* each core gets 4Kbytes for registers */ +#define SI_WRAP_BASE 0x18100000 /* Wrapper space base */ +#define SI_CORE_SIZE 0x1000 /* each core gets 4Kbytes for registers */ #define SI_MAXCORES 16 /* Max cores (this is arbitrary, for software * convenience and could be changed if we * make any larger chips @@ -136,13 +136,13 @@ #define ACPHY_CORE_ID 0x83b /* Dot11 ACPHY */ #define PCIE2_CORE_ID 0x83c /* pci express Gen2 core */ -#define USB30D_CORE_ID 0x83d /* usb 3.0 device core */ +#define USB30D_CORE_ID 0x83d /* usb 3.0 device core */ #define ARMCR4_CORE_ID 0x83e /* ARM CR4 CPU */ -#define APB_BRIDGE_CORE_ID 0x135 /* APB bridge core ID */ -#define AXI_CORE_ID 0x301 /* AXI/GPV core ID */ -#define EROM_CORE_ID 0x366 /* EROM core ID */ +#define APB_BRIDGE_CORE_ID 0x135 /* APB bridge core ID */ +#define AXI_CORE_ID 0x301 /* AXI/GPV core ID */ +#define EROM_CORE_ID 0x366 /* EROM core ID */ #define OOB_ROUTER_CORE_ID 0x367 /* OOB router core ID */ -#define DEF_AI_COMP 0xfff /* Default component, in ai chips it maps all +#define DEF_AI_COMP 0xfff /* Default component, in ai chips it maps all * unused address ranges */ diff --git a/drivers/net/wireless/bcmdhd/include/linux_osl.h b/drivers/net/wireless/bcmdhd/src/include/linux_osl.h index 5fd1dbd..fbe3d86 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/linux_osl.h +++ b/drivers/net/wireless/bcmdhd/src/include/linux_osl.h @@ -2,13 +2,13 @@ * Linux OS Independent Layer * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.h 352246 2012-08-22 05:42:04Z $ + * $Id: linux_osl.h 309193 2012-01-19 00:03:57Z $ */ #ifndef _linux_osl_h_ @@ -57,12 +57,10 @@ extern void osl_assert(const char *exp, const char *file, int line); #if GCC_VERSION > 30100 #define ASSERT(exp) do {} while (0) #else - #define ASSERT(exp) - #endif - #endif -#endif - + #endif + #endif /* __GNUC__ */ +#endif /* BCMASSERT_LOG */ #define OSL_DELAY(usec) osl_delay(usec) extern void osl_delay(uint usec); @@ -92,10 +90,10 @@ extern struct pci_dev *osl_pci_device(osl_t *osh); typedef struct { bool pkttag; - uint pktalloced; - bool mmbus; - pktfree_cb_fn_t tx_fn; - void *tx_ctx; + uint pktalloced; + bool mmbus; + pktfree_cb_fn_t tx_fn; + void *tx_ctx; void *unused[3]; } osl_pubinfo_t; @@ -105,8 +103,6 @@ typedef struct { ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \ } while (0) - - #define BUS_SWAP32(v) (v) #define MALLOC(osh, size) osl_malloc((osh), (size)) @@ -132,9 +128,8 @@ extern uint osl_dma_consistent_align(void); extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align, uint *tot, ulong *pap); extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa); - -#define DMA_TX 1 -#define DMA_RX 2 +#define DMA_TX 1 +#define DMA_RX 2 #define DMA_UNMAP(osh, pa, size, direction, p, dmah) \ @@ -159,24 +154,21 @@ extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction); extern int osl_error(int bcmerror); -#define PKTBUFSZ 2048 - +#define PKTBUFSZ 2048 -#include <linuxver.h> -#include <linux/kernel.h> -#include <linux/string.h> +#include <linuxver.h> +#include <linux/kernel.h> +#include <linux/string.h> -#define OSL_SYSUPTIME() ((uint32)jiffies_to_msecs(jiffies)) +#define OSL_SYSUPTIME() ((uint32)jiffies * (1000 / HZ)) #define printf(fmt, args...) printk(fmt , ## args) -#include <linux/kernel.h> -#include <linux/string.h> +#include <linux/kernel.h> +#include <linux/string.h> #define bcopy(src, dst, len) memcpy((dst), (src), (len)) #define bcmp(b1, b2, len) memcmp((b1), (b2), (len)) #define bzero(b, len) memset((b), '\0', (len)) - - #define R_REG(osh, r) (\ SELECT_BUS_READ(osh, \ ({ \ @@ -226,7 +218,7 @@ extern int osl_error(int bcmerror); #define OSL_GETCYCLES(x) rdtscl((x)) #else #define OSL_GETCYCLES(x) ((x) = 0) -#endif +#endif #define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; }) @@ -236,7 +228,7 @@ extern int osl_error(int bcmerror); #define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size)) #else #define REG_MAP(pa, size) (void *)(0) -#endif +#endif #define REG_UNMAP(va) iounmap((va)) @@ -245,7 +237,7 @@ extern int osl_error(int bcmerror); #define BZERO_SM(r, len) memset((r), '\0', (len)) -#include <linuxver.h> +#include <linuxver.h> #define PKTGET(osh, len, send) osl_pktget((osh), (len)) @@ -256,7 +248,7 @@ extern int osl_error(int bcmerror); #ifdef CONFIG_DHD_USE_STATIC_BUF #define PKTGET_STATIC(osh, len, send) osl_pktget_static((osh), (len)) #define PKTFREE_STATIC(osh, skb, send) osl_pktfree_static((osh), (skb), (send)) -#endif +#endif #define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data) #define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len) #define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head)) @@ -282,12 +274,12 @@ typedef struct ctfpool { uint obj_size; uint refills; uint fast_allocs; - uint fast_frees; - uint slow_allocs; + uint fast_frees; + uint slow_allocs; } ctfpool_t; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) -#define FASTBUF (1 << 16) -#define CTFBUF (1 << 17) +#define FASTBUF (1 << 4) +#define CTFBUF (1 << 5) #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= FASTBUF) #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~FASTBUF)) #define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= CTFBUF) @@ -305,7 +297,7 @@ typedef struct ctfpool { #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) & FASTBUF) #define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) & CTFBUF) #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->__unused) -#endif +#endif /* LINUX_VERSION_CODE */ #define CTFPOOLPTR(osh, skb) (((struct sk_buff*)(skb))->sk) #define CTFPOOLHEAD(osh, skb) (((ctfpool_t *)((struct sk_buff*)(skb))->sk)->head) @@ -315,26 +307,26 @@ extern void osl_ctfpool_replenish(osl_t *osh, uint thresh); extern int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size); extern void osl_ctfpool_cleanup(osl_t *osh); extern void osl_ctfpool_stats(osl_t *osh, void *b); -#endif +#endif /* CTFPOOL */ #ifdef HNDCTF #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) -#define SKIPCT (1 << 18) +#define SKIPCT (1 << 6) #define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len |= SKIPCT) #define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len &= (~SKIPCT)) #define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len & SKIPCT) -#else +#else #define SKIPCT (1 << 2) #define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused |= SKIPCT) #define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused &= (~SKIPCT)) #define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused & SKIPCT) -#endif -#else +#endif +#else #define PKTSETSKIPCT(osh, skb) #define PKTCLRSKIPCT(osh, skb) #define PKTSKIPCT(osh, skb) -#endif +#endif /* HNDCTF */ extern void osl_pktfree(osl_t *osh, void *skb, bool send); extern void *osl_pktget_static(osl_t *osh, uint len); @@ -360,49 +352,10 @@ extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt); #define DMA_MAP(osh, va, size, direction, p, dmah) \ osl_dma_map((osh), (va), (size), (direction)) -#ifdef PKTC - -struct chain_node { - struct sk_buff *link; - unsigned int flags:3, pkts:9, bytes:20; -}; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) -#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->tstamp)) #else -#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->stamp)) -#endif - -#define PKTCCNT(skb) (CHAIN_NODE(skb)->pkts) -#define PKTCLEN(skb) (CHAIN_NODE(skb)->bytes) -#define PKTCFLAGS(skb) (CHAIN_NODE(skb)->flags) -#define PKTCSETCNT(skb, c) (CHAIN_NODE(skb)->pkts = (c) & ((1 << 9) - 1)) -#define PKTCSETLEN(skb, l) (CHAIN_NODE(skb)->bytes = (l) & ((1 << 20) - 1)) -#define PKTCSETFLAG(skb, fb) (CHAIN_NODE(skb)->flags |= (fb)) -#define PKTCCLRFLAG(skb, fb) (CHAIN_NODE(skb)->flags &= ~(fb)) -#define PKTCLINK(skb) (CHAIN_NODE(skb)->link) -#define PKTSETCLINK(skb, x) (CHAIN_NODE(skb)->link = (struct sk_buff*)(x)) -#define PKTISCHAINED(skb) (PKTCLINK(skb) != NULL) -#define FOREACH_CHAINED_PKT(skb, nskb) \ - for (; (skb) != NULL; (skb) = (nskb)) \ - if ((nskb) = PKTCLINK(skb), PKTSETCLINK((skb), NULL), 1) -#define PKTCFREE(osh, skb, send) \ -do { \ - void *nskb; \ - ASSERT((skb) != NULL); \ - FOREACH_CHAINED_PKT((skb), nskb) { \ - PKTFREE((osh), (skb), (send)); \ - } \ -} while (0) -#endif - -#else - - #define ASSERT(exp) do {} while (0) - #define MALLOC(o, l) malloc(l) #define MFREE(o, p, l) free(p) #include <stdlib.h> @@ -417,6 +370,6 @@ do { \ extern void bcopy(const void *src, void *dst, size_t len); extern int bcmp(const void *b1, const void *b2, size_t len); extern void bzero(void *b, size_t len); -#endif +#endif /* BCMDRIVER */ -#endif +#endif /* _linux_osl_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/linuxver.h b/drivers/net/wireless/bcmdhd/src/include/linuxver.h index 3c2a168..40830d9 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/linuxver.h +++ b/drivers/net/wireless/bcmdhd/src/include/linuxver.h @@ -2,14 +2,14 @@ * Linux-specific abstractions to gain some independence from linux kernel versions. * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linuxver.h 353905 2012-08-29 07:33:08Z $ + * $Id: linuxver.h 291086 2011-10-21 01:17:24Z $ */ #ifndef _linuxver_h_ @@ -37,7 +37,7 @@ #else #include <linux/autoconf.h> #endif -#endif +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) */ #include <linux/module.h> #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)) @@ -47,7 +47,7 @@ #else #define __NO_VERSION__ #endif -#endif +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)) */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) #define module_param(_name_, _type_, _perm_) MODULE_PARM(_name_, "i") @@ -73,10 +73,10 @@ #include <linux/semaphore.h> #else #include <asm/semaphore.h> -#endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) #undef IP_TOS -#endif +#endif #include <asm/io.h> #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41)) @@ -95,20 +95,7 @@ #ifndef flush_scheduled_work #define flush_scheduled_work() flush_scheduled_tasks() #endif -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) -#define DAEMONIZE(a) daemonize(a); \ - allow_signal(SIGKILL); \ - allow_signal(SIGTERM); -#else -#define RAISE_RX_SOFTIRQ() \ - cpu_raise_softirq(smp_processor_id(), NET_RX_SOFTIRQ) -#define DAEMONIZE(a) daemonize(); \ - do { if (a) \ - strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a)))); \ - } while (0); -#endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) #define MY_INIT_WORK(_work, _func) INIT_WORK(_work, _func) @@ -116,10 +103,9 @@ #define MY_INIT_WORK(_work, _func) INIT_WORK(_work, _func, _work) #if !(LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18) && defined(RHEL_MAJOR) && \ (RHEL_MAJOR == 5)) - typedef void (*work_func_t)(void *work); #endif -#endif +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) @@ -131,22 +117,22 @@ typedef void irqreturn_t; #endif #else typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); -#endif +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) #define IRQF_SHARED SA_SHIRQ -#endif +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 17) #ifdef CONFIG_NET_RADIO #define CONFIG_WIRELESS_EXT #endif -#endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) #define MOD_INC_USE_COUNT #define MOD_DEC_USE_COUNT -#endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) #include <linux/sched.h> @@ -161,13 +147,9 @@ typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) #include <net/ieee80211.h> #endif -#endif - - -#ifdef CUSTOMER_HW4 -#include <linux/kthread.h> #endif + #ifndef __exit #define __exit #endif @@ -192,21 +174,21 @@ typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); struct pci_device_id { - unsigned int vendor, device; - unsigned int subvendor, subdevice; - unsigned int class, class_mask; - unsigned long driver_data; + unsigned int vendor, device; + unsigned int subvendor, subdevice; + unsigned int class, class_mask; + unsigned long driver_data; }; struct pci_driver { struct list_head node; char *name; - const struct pci_device_id *id_table; + const struct pci_device_id *id_table; int (*probe)(struct pci_dev *dev, - const struct pci_device_id *id); - void (*remove)(struct pci_dev *dev); - void (*suspend)(struct pci_dev *dev); - void (*resume)(struct pci_dev *dev); + const struct pci_device_id *id); + void (*remove)(struct pci_dev *dev); + void (*suspend)(struct pci_dev *dev); + void (*resume)(struct pci_dev *dev); }; #define MODULE_DEVICE_TABLE(type, name) @@ -217,7 +199,7 @@ struct pci_driver { extern int pci_register_driver(struct pci_driver *drv); extern void pci_unregister_driver(struct pci_driver *drv); -#endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)) #define pci_module_init pci_register_driver @@ -231,7 +213,7 @@ extern void pci_unregister_driver(struct pci_driver *drv); #define module_init(x) __initcall(x); #define module_exit(x) __exitcall(x); #endif -#endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) #define WL_USE_NETDEV_OPS @@ -311,7 +293,7 @@ static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size, #define pci_map_single(cookie, address, size, dir) virt_to_bus(address) #define pci_unmap_single(cookie, address, size, dir) -#endif +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 43)) @@ -338,7 +320,7 @@ static inline void netif_start_queue(struct net_device *dev) #define netif_queue_stopped(dev) (dev)->tbusy #define netif_running(dev) (dev)->start -#endif +#endif #define netif_device_attach(dev) netif_start_queue(dev) #define netif_device_detach(dev) netif_stop_queue(dev) @@ -369,7 +351,7 @@ static inline void tasklet_init(struct tasklet_struct *tasklet, #define netif_down(dev) -#endif +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3)) @@ -388,7 +370,7 @@ static inline void tasklet_init(struct tasklet_struct *tasklet, PREPARE_TQUEUE((_tq), (_routine), (_data)); \ } while (0) -#endif +#endif #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 9) @@ -420,7 +402,7 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) for (i = 0; i < 16; i++) pci_write_config_dword(dev, i * 4, buffer[i]); } - + else { for (i = 0; i < 6; i ++) pci_write_config_dword(dev, @@ -430,7 +412,7 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) } return 0; } -#endif +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 19)) @@ -447,7 +429,7 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) #define OLD_MOD_INC_USE_COUNT do {} while (0) #define OLD_MOD_DEC_USE_COUNT do {} while (0) #endif -#else +#else #ifndef SET_MODULE_OWNER #define SET_MODULE_OWNER(dev) do {} while (0) #endif @@ -459,7 +441,7 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) #endif #define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT #define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT -#endif +#endif #ifndef SET_NETDEV_DEV #define SET_NETDEV_DEV(net, pdev) do {} while (0) @@ -486,10 +468,10 @@ pci_restore_state(struct pci_dev *dev, u32 *buffer) #endif typedef struct { - void *parent; + void *parent; struct task_struct *p_task; - long thr_pid; - int prio; + long thr_pid; + int prio; struct semaphore sema; int terminated; struct completion completed; @@ -524,19 +506,6 @@ typedef struct { DBG_THR(("%s thr:%lx started\n", __FUNCTION__, (tsk_ctl)->thr_pid)); \ } -#ifdef USE_KTHREAD_API -#define PROC_START2(thread_func, owner, tsk_ctl, flags, name) \ -{ \ - sema_init(&((tsk_ctl)->sema), 0); \ - init_completion(&((tsk_ctl)->completed)); \ - (tsk_ctl)->parent = owner; \ - (tsk_ctl)->terminated = FALSE; \ - (tsk_ctl)->p_task = kthread_run(thread_func, tsk_ctl, (char*)name); \ - (tsk_ctl)->thr_pid = (tsk_ctl)->p_task->pid; \ - DBG_THR(("%s thr:%lx created\n", __FUNCTION__, (tsk_ctl)->thr_pid)); \ -} -#endif - #define PROC_STOP(tsk_ctl) \ { \ (tsk_ctl)->terminated = TRUE; \ @@ -573,7 +542,7 @@ if (tsk) send_sig(sig, tsk, 1); \ kill_proc(pid, sig, 1); \ } #endif -#endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #include <linux/time.h> @@ -612,8 +581,7 @@ do { \ __ret; \ }) -#endif - +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) #define DEV_PRIV(dev) (dev->priv) @@ -625,10 +593,10 @@ do { \ #define WL_ISR(i, d, p) wl_isr((i), (d)) #else #define WL_ISR(i, d, p) wl_isr((i), (d), (p)) -#endif +#endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) #define netdev_priv(dev) dev->priv -#endif +#endif -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/miniopt.h b/drivers/net/wireless/bcmdhd/src/include/miniopt.h index c1eca68..055ba92 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/miniopt.h +++ b/drivers/net/wireless/bcmdhd/src/include/miniopt.h @@ -1,14 +1,14 @@ /* * Command line options parser. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/msgtrace.h b/drivers/net/wireless/bcmdhd/src/include/msgtrace.h index 7c5fd81..348f62d 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/msgtrace.h +++ b/drivers/net/wireless/bcmdhd/src/include/msgtrace.h @@ -1,14 +1,14 @@ /* * Trace messages sent over HBUS * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -49,7 +49,7 @@ typedef BWL_PRE_PACKED_STRUCT struct msgtrace_hdr { uint32 discarded_printf; /* Number of discarded printf because of trace overflow */ } BWL_POST_PACKED_STRUCT msgtrace_hdr_t; -#define MSGTRACE_HDRLEN sizeof(msgtrace_hdr_t) +#define MSGTRACE_HDRLEN sizeof(msgtrace_hdr_t) /* The hbus driver generates traces when sending a trace message. This causes endless traces. * This flag must be set to TRUE in any hbus traces. The flag is reset in the function msgtrace_put. diff --git a/drivers/net/wireless/bcmdhd/include/osl.h b/drivers/net/wireless/bcmdhd/src/include/osl.h index ca171d8..85bd25b 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/osl.h +++ b/drivers/net/wireless/bcmdhd/src/include/osl.h @@ -1,14 +1,14 @@ /* * OS Abstraction Layer * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: osl.h 320905 2012-03-13 15:33:25Z $ + * $Id: osl.h 301926 2011-12-09 02:00:46Z $ */ #ifndef _osl_h_ @@ -31,7 +31,7 @@ typedef struct osl_info osl_t; typedef struct osl_dmainfo osldma_t; -#define OSL_PKTTAG_SZ 32 +#define OSL_PKTTAG_SZ 32 typedef void (*pktfree_cb_fn_t)(void *ctx, void *pkt, unsigned int status); @@ -55,34 +55,17 @@ typedef void (*osl_wreg_fn_t)(void *ctx, volatile void *reg, unsigned int val, #ifndef AND_REG #define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v)) -#endif +#endif #ifndef OR_REG #define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v)) -#endif +#endif #if !defined(OSL_SYSUPTIME) #define OSL_SYSUPTIME() (0) #define OSL_SYSUPTIME_SUPPORT FALSE #else #define OSL_SYSUPTIME_SUPPORT TRUE -#endif - -#if !defined(PKTC) -#define PKTCCNT(skb) (0) -#define PKTCLEN(skb) (0) -#define PKTCFLAGS(skb) (0) -#define PKTCSETCNT(skb, c) -#define PKTCSETLEN(skb, l) -#define PKTCSETFLAG(skb, fb) -#define PKTCCLRFLAG(skb, fb) -#define PKTCLINK(skb) PKTLINK(skb) -#define PKTSETCLINK(skb, x) PKTSETLINK((skb), (x)) -#define PKTISCHAINED(skb) FALSE -#define FOREACH_CHAINED_PKT(skb, nskb) \ - for ((nskb) = NULL; (skb) != NULL; (skb) = (nskb)) -#define PKTCFREE PKTFREE #endif - -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/packed_section_end.h b/drivers/net/wireless/bcmdhd/src/include/packed_section_end.h index 24ff467..9b7ff57 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/packed_section_end.h +++ b/drivers/net/wireless/bcmdhd/src/include/packed_section_end.h @@ -15,14 +15,14 @@ * #include <packed_section_end.h> * * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -30,7 +30,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/packed_section_start.h b/drivers/net/wireless/bcmdhd/src/include/packed_section_start.h index 7fce0dd..7aea56f 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/packed_section_start.h +++ b/drivers/net/wireless/bcmdhd/src/include/packed_section_start.h @@ -15,14 +15,14 @@ * #include <packed_section_end.h> * * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -30,7 +30,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/pcicfg.h b/drivers/net/wireless/bcmdhd/src/include/pcicfg.h index 5f7df6a..8a5d996 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/pcicfg.h +++ b/drivers/net/wireless/bcmdhd/src/include/pcicfg.h @@ -1,14 +1,14 @@ /* * pcicfg.h: PCI configuration constants and structures. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: pcicfg.h 309193 2012-01-19 00:03:57Z $ + * $Id: pcicfg.h 296577 2011-11-16 03:09:51Z $ */ #ifndef _h_pcicfg_ @@ -55,36 +55,36 @@ #define PCI_CFG_PIN 0x3d #define PCI_CFG_MINGNT 0x3e #define PCI_CFG_MAXLAT 0x3f -#define PCI_BAR0_WIN 0x80 -#define PCI_BAR1_WIN 0x84 -#define PCI_SPROM_CONTROL 0x88 -#define PCI_BAR1_CONTROL 0x8c -#define PCI_INT_STATUS 0x90 -#define PCI_INT_MASK 0x94 -#define PCI_TO_SB_MB 0x98 -#define PCI_BACKPLANE_ADDR 0xa0 -#define PCI_BACKPLANE_DATA 0xa4 -#define PCI_CLK_CTL_ST 0xa8 -#define PCI_BAR0_WIN2 0xac -#define PCI_GPIO_IN 0xb0 -#define PCI_GPIO_OUT 0xb4 -#define PCI_GPIO_OUTEN 0xb8 +#define PCI_BAR0_WIN 0x80 +#define PCI_BAR1_WIN 0x84 +#define PCI_SPROM_CONTROL 0x88 +#define PCI_BAR1_CONTROL 0x8c +#define PCI_INT_STATUS 0x90 +#define PCI_INT_MASK 0x94 +#define PCI_TO_SB_MB 0x98 +#define PCI_BACKPLANE_ADDR 0xa0 +#define PCI_BACKPLANE_DATA 0xa4 +#define PCI_CLK_CTL_ST 0xa8 +#define PCI_BAR0_WIN2 0xac +#define PCI_GPIO_IN 0xb0 +#define PCI_GPIO_OUT 0xb4 +#define PCI_GPIO_OUTEN 0xb8 -#define PCI_BAR0_SHADOW_OFFSET (2 * 1024) -#define PCI_BAR0_SPROM_OFFSET (4 * 1024) -#define PCI_BAR0_PCIREGS_OFFSET (6 * 1024) -#define PCI_BAR0_PCISBR_OFFSET (4 * 1024) +#define PCI_BAR0_SHADOW_OFFSET (2 * 1024) +#define PCI_BAR0_SPROM_OFFSET (4 * 1024) +#define PCI_BAR0_PCIREGS_OFFSET (6 * 1024) +#define PCI_BAR0_PCISBR_OFFSET (4 * 1024) -#define PCIE2_BAR0_WIN2 0x70 -#define PCIE2_BAR0_CORE2_WIN 0x74 -#define PCIE2_BAR0_CORE2_WIN2 0x78 +#define PCIE2_BAR0_WIN2 0x70 +#define PCIE2_BAR0_CORE2_WIN 0x74 +#define PCIE2_BAR0_CORE2_WIN2 0x78 -#define PCI_BAR0_WINSZ (16 * 1024) +#define PCI_BAR0_WINSZ (16 * 1024) -#define PCI_16KB0_PCIREGS_OFFSET (8 * 1024) -#define PCI_16KB0_CCREGS_OFFSET (12 * 1024) -#define PCI_16KBB0_WINSZ (16 * 1024) +#define PCI_16KB0_PCIREGS_OFFSET (8 * 1024) +#define PCI_16KB0_CCREGS_OFFSET (12 * 1024) +#define PCI_16KBB0_WINSZ (16 * 1024) #define PCI_CONFIG_SPACE_SIZE 256 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/src/include/proto/802.11.h b/drivers/net/wireless/bcmdhd/src/include/proto/802.11.h new file mode 100755 index 0000000..23d55d8 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/proto/802.11.h @@ -0,0 +1,2240 @@ +/* + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * Fundamental types and constants relating to 802.11 + * + * $Id: 802.11.h 297130 2011-11-18 01:41:36Z $ + */ + +#ifndef _802_11_H_ +#define _802_11_H_ + +#ifndef _TYPEDEFS_H_ +#include <typedefs.h> +#endif + +#ifndef _NET_ETHERNET_H_ +#include <proto/ethernet.h> +#endif + +#include <proto/wpa.h> + + +#include <packed_section_start.h> + + +#define DOT11_TU_TO_US 1024 + + +#define DOT11_A3_HDR_LEN 24 +#define DOT11_A4_HDR_LEN 30 +#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN +#define DOT11_FCS_LEN 4 +#define DOT11_ICV_LEN 4 +#define DOT11_ICV_AES_LEN 8 +#define DOT11_QOS_LEN 2 +#define DOT11_HTC_LEN 4 + +#define DOT11_KEY_INDEX_SHIFT 6 +#define DOT11_IV_LEN 4 +#define DOT11_IV_TKIP_LEN 8 +#define DOT11_IV_AES_OCB_LEN 4 +#define DOT11_IV_AES_CCM_LEN 8 +#define DOT11_IV_MAX_LEN 8 + + +#define DOT11_MAX_MPDU_BODY_LEN 2304 + +#define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \ + DOT11_QOS_LEN + \ + DOT11_IV_AES_CCM_LEN + \ + DOT11_MAX_MPDU_BODY_LEN + \ + DOT11_ICV_LEN + \ + DOT11_FCS_LEN) + +#define DOT11_MAX_SSID_LEN 32 + + +#define DOT11_DEFAULT_RTS_LEN 2347 +#define DOT11_MAX_RTS_LEN 2347 + + +#define DOT11_MIN_FRAG_LEN 256 +#define DOT11_MAX_FRAG_LEN 2346 +#define DOT11_DEFAULT_FRAG_LEN 2346 + + +#define DOT11_MIN_BEACON_PERIOD 1 +#define DOT11_MAX_BEACON_PERIOD 0xFFFF + + +#define DOT11_MIN_DTIM_PERIOD 1 +#define DOT11_MAX_DTIM_PERIOD 0xFF + + +#define DOT11_LLC_SNAP_HDR_LEN 8 +#define DOT11_OUI_LEN 3 +BWL_PRE_PACKED_STRUCT struct dot11_llc_snap_header { + uint8 dsap; + uint8 ssap; + uint8 ctl; + uint8 oui[DOT11_OUI_LEN]; + uint16 type; +} BWL_POST_PACKED_STRUCT; + + +#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) + + + +BWL_PRE_PACKED_STRUCT struct dot11_header { + uint16 fc; + uint16 durid; + struct ether_addr a1; + struct ether_addr a2; + struct ether_addr a3; + uint16 seq; + struct ether_addr a4; +} BWL_POST_PACKED_STRUCT; + + + +BWL_PRE_PACKED_STRUCT struct dot11_rts_frame { + uint16 fc; + uint16 durid; + struct ether_addr ra; + struct ether_addr ta; +} BWL_POST_PACKED_STRUCT; +#define DOT11_RTS_LEN 16 + +BWL_PRE_PACKED_STRUCT struct dot11_cts_frame { + uint16 fc; + uint16 durid; + struct ether_addr ra; +} BWL_POST_PACKED_STRUCT; +#define DOT11_CTS_LEN 10 + +BWL_PRE_PACKED_STRUCT struct dot11_ack_frame { + uint16 fc; + uint16 durid; + struct ether_addr ra; +} BWL_POST_PACKED_STRUCT; +#define DOT11_ACK_LEN 10 + +BWL_PRE_PACKED_STRUCT struct dot11_ps_poll_frame { + uint16 fc; + uint16 durid; + struct ether_addr bssid; + struct ether_addr ta; +} BWL_POST_PACKED_STRUCT; +#define DOT11_PS_POLL_LEN 16 + +BWL_PRE_PACKED_STRUCT struct dot11_cf_end_frame { + uint16 fc; + uint16 durid; + struct ether_addr ra; + struct ether_addr bssid; +} BWL_POST_PACKED_STRUCT; +#define DOT11_CS_END_LEN 16 + + +BWL_PRE_PACKED_STRUCT struct dot11_action_wifi_vendor_specific { + uint8 category; + uint8 OUI[3]; + uint8 type; + uint8 subtype; + uint8 data[1040]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_action_wifi_vendor_specific dot11_action_wifi_vendor_specific_t; + + +BWL_PRE_PACKED_STRUCT struct dot11_action_vs_frmhdr { + uint8 category; + uint8 OUI[3]; + uint8 type; + uint8 subtype; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_action_vs_frmhdr dot11_action_vs_frmhdr_t; +#define DOT11_ACTION_VS_HDR_LEN 6 + +#define BCM_ACTION_OUI_BYTE0 0x00 +#define BCM_ACTION_OUI_BYTE1 0x90 +#define BCM_ACTION_OUI_BYTE2 0x4c + + +#define DOT11_BA_CTL_POLICY_NORMAL 0x0000 +#define DOT11_BA_CTL_POLICY_NOACK 0x0001 +#define DOT11_BA_CTL_POLICY_MASK 0x0001 + +#define DOT11_BA_CTL_MTID 0x0002 +#define DOT11_BA_CTL_COMPRESSED 0x0004 + +#define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 +#define DOT11_BA_CTL_NUMMSDU_SHIFT 6 + +#define DOT11_BA_CTL_TID_MASK 0xF000 +#define DOT11_BA_CTL_TID_SHIFT 12 + + +BWL_PRE_PACKED_STRUCT struct dot11_ctl_header { + uint16 fc; + uint16 durid; + struct ether_addr ra; + struct ether_addr ta; +} BWL_POST_PACKED_STRUCT; +#define DOT11_CTL_HDR_LEN 16 + + +BWL_PRE_PACKED_STRUCT struct dot11_bar { + uint16 bar_control; + uint16 seqnum; +} BWL_POST_PACKED_STRUCT; +#define DOT11_BAR_LEN 4 + +#define DOT11_BA_BITMAP_LEN 128 +#define DOT11_BA_CMP_BITMAP_LEN 8 + +BWL_PRE_PACKED_STRUCT struct dot11_ba { + uint16 ba_control; + uint16 seqnum; + uint8 bitmap[DOT11_BA_BITMAP_LEN]; +} BWL_POST_PACKED_STRUCT; +#define DOT11_BA_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct dot11_management_header { + uint16 fc; + uint16 durid; + struct ether_addr da; + struct ether_addr sa; + struct ether_addr bssid; + uint16 seq; +} BWL_POST_PACKED_STRUCT; +#define DOT11_MGMT_HDR_LEN 24 + + + +BWL_PRE_PACKED_STRUCT struct dot11_bcn_prb { + uint32 timestamp[2]; + uint16 beacon_interval; + uint16 capability; +} BWL_POST_PACKED_STRUCT; +#define DOT11_BCN_PRB_LEN 12 +#define DOT11_BCN_PRB_FIXED_LEN 12 + +BWL_PRE_PACKED_STRUCT struct dot11_auth { + uint16 alg; + uint16 seq; + uint16 status; +} BWL_POST_PACKED_STRUCT; +#define DOT11_AUTH_FIXED_LEN 6 + +BWL_PRE_PACKED_STRUCT struct dot11_assoc_req { + uint16 capability; + uint16 listen; +} BWL_POST_PACKED_STRUCT; +#define DOT11_ASSOC_REQ_FIXED_LEN 4 + +BWL_PRE_PACKED_STRUCT struct dot11_reassoc_req { + uint16 capability; + uint16 listen; + struct ether_addr ap; +} BWL_POST_PACKED_STRUCT; +#define DOT11_REASSOC_REQ_FIXED_LEN 10 + +BWL_PRE_PACKED_STRUCT struct dot11_assoc_resp { + uint16 capability; + uint16 status; + uint16 aid; +} BWL_POST_PACKED_STRUCT; +#define DOT11_ASSOC_RESP_FIXED_LEN 6 + +BWL_PRE_PACKED_STRUCT struct dot11_action_measure { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +#define DOT11_ACTION_MEASURE_LEN 3 + +BWL_PRE_PACKED_STRUCT struct dot11_action_ht_ch_width { + uint8 category; + uint8 action; + uint8 ch_width; +} BWL_POST_PACKED_STRUCT; + +BWL_PRE_PACKED_STRUCT struct dot11_action_ht_mimops { + uint8 category; + uint8 action; + uint8 control; +} BWL_POST_PACKED_STRUCT; + +BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query { + uint8 category; + uint8 action; + uint16 id; +} BWL_POST_PACKED_STRUCT; + +#define SM_PWRSAVE_ENABLE 1 +#define SM_PWRSAVE_MODE 2 + + +BWL_PRE_PACKED_STRUCT struct dot11_power_cnst { + uint8 id; + uint8 len; + uint8 power; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_power_cnst dot11_power_cnst_t; + +BWL_PRE_PACKED_STRUCT struct dot11_power_cap { + uint8 min; + uint8 max; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_power_cap dot11_power_cap_t; + +BWL_PRE_PACKED_STRUCT struct dot11_tpc_rep { + uint8 id; + uint8 len; + uint8 tx_pwr; + uint8 margin; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_tpc_rep dot11_tpc_rep_t; +#define DOT11_MNG_IE_TPC_REPORT_LEN 2 + +BWL_PRE_PACKED_STRUCT struct dot11_supp_channels { + uint8 id; + uint8 len; + uint8 first_channel; + uint8 num_channels; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_supp_channels dot11_supp_channels_t; + + +BWL_PRE_PACKED_STRUCT struct dot11_extch { + uint8 id; + uint8 len; + uint8 extch; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_extch dot11_extch_ie_t; + +BWL_PRE_PACKED_STRUCT struct dot11_brcm_extch { + uint8 id; + uint8 len; + uint8 oui[3]; + uint8 type; + uint8 extch; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t; + +#define BRCM_EXTCH_IE_LEN 5 +#define BRCM_EXTCH_IE_TYPE 53 +#define DOT11_EXTCH_IE_LEN 1 +#define DOT11_EXT_CH_MASK 0x03 +#define DOT11_EXT_CH_UPPER 0x01 +#define DOT11_EXT_CH_LOWER 0x03 +#define DOT11_EXT_CH_NONE 0x00 + +BWL_PRE_PACKED_STRUCT struct dot11_action_frmhdr { + uint8 category; + uint8 action; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +#define DOT11_ACTION_FRMHDR_LEN 2 + + +BWL_PRE_PACKED_STRUCT struct dot11_channel_switch { + uint8 id; + uint8 len; + uint8 mode; + uint8 channel; + uint8 count; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_channel_switch dot11_chan_switch_ie_t; + +#define DOT11_SWITCH_IE_LEN 3 + +#define DOT11_CSA_MODE_ADVISORY 0 +#define DOT11_CSA_MODE_NO_TX 1 + +BWL_PRE_PACKED_STRUCT struct dot11_action_switch_channel { + uint8 category; + uint8 action; + dot11_chan_switch_ie_t chan_switch_ie; + dot11_brcm_extch_ie_t extch_ie; +} BWL_POST_PACKED_STRUCT; + +BWL_PRE_PACKED_STRUCT struct dot11_csa_body { + uint8 mode; + uint8 reg; + uint8 channel; + uint8 count; +} BWL_POST_PACKED_STRUCT; + + +BWL_PRE_PACKED_STRUCT struct dot11_ext_csa { + uint8 id; + uint8 len; + struct dot11_csa_body b; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ext_csa dot11_ext_csa_ie_t; +#define DOT11_EXT_CSA_IE_LEN 4 + +BWL_PRE_PACKED_STRUCT struct dot11_action_ext_csa { + uint8 category; + uint8 action; + dot11_ext_csa_ie_t chan_switch_ie; +} BWL_POST_PACKED_STRUCT; + +BWL_PRE_PACKED_STRUCT struct dot11y_action_ext_csa { + uint8 category; + uint8 action; + struct dot11_csa_body b; +} BWL_POST_PACKED_STRUCT; + +BWL_PRE_PACKED_STRUCT struct dot11_obss_coex { + uint8 id; + uint8 len; + uint8 info; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_obss_coex dot11_obss_coex_t; +#define DOT11_OBSS_COEXINFO_LEN 1 + +#define DOT11_OBSS_COEX_INFO_REQ 0x01 +#define DOT11_OBSS_COEX_40MHZ_INTOLERANT 0x02 +#define DOT11_OBSS_COEX_20MHZ_WIDTH_REQ 0x04 + +BWL_PRE_PACKED_STRUCT struct dot11_obss_chanlist { + uint8 id; + uint8 len; + uint8 regclass; + uint8 chanlist[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_obss_chanlist dot11_obss_chanlist_t; +#define DOT11_OBSS_CHANLIST_FIXED_LEN 1 + +BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie { + uint8 id; + uint8 len; + uint8 cap[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_extcap_ie dot11_extcap_ie_t; + +#define DOT11_EXTCAP_LEN_MAX 7 +#define DOT11_EXTCAP_LEN_COEX 1 +#define DOT11_EXTCAP_LEN_BT 3 +#define DOT11_EXTCAP_LEN_IW 4 +#define DOT11_EXTCAP_LEN_SI 6 + +#define DOT11_EXTCAP_LEN_TDLS 5 +BWL_PRE_PACKED_STRUCT struct dot11_extcap { + uint8 extcap[DOT11_EXTCAP_LEN_TDLS]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_extcap dot11_extcap_t; + + +#define TDLS_CAP_TDLS 37 +#define TDLS_CAP_PU_BUFFER_STA 28 +#define TDLS_CAP_PEER_PSM 20 +#define TDLS_CAP_CH_SW 30 +#define TDLS_CAP_PROH 38 +#define TDLS_CAP_CH_SW_PROH 39 + +#define TDLS_CAP_MAX_BIT 39 + + + +#define DOT11_MEASURE_TYPE_BASIC 0 +#define DOT11_MEASURE_TYPE_CCA 1 +#define DOT11_MEASURE_TYPE_RPI 2 +#define DOT11_MEASURE_TYPE_CHLOAD 3 +#define DOT11_MEASURE_TYPE_NOISE 4 +#define DOT11_MEASURE_TYPE_BEACON 5 +#define DOT11_MEASURE_TYPE_FRAME 6 +#define DOT11_MEASURE_TYPE_STATS 7 +#define DOT11_MEASURE_TYPE_LCI 8 +#define DOT11_MEASURE_TYPE_TXSTREAM 9 +#define DOT11_MEASURE_TYPE_PAUSE 255 + + +#define DOT11_MEASURE_MODE_PARALLEL (1<<0) +#define DOT11_MEASURE_MODE_ENABLE (1<<1) +#define DOT11_MEASURE_MODE_REQUEST (1<<2) +#define DOT11_MEASURE_MODE_REPORT (1<<3) +#define DOT11_MEASURE_MODE_DUR (1<<4) + +#define DOT11_MEASURE_MODE_LATE (1<<0) +#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) +#define DOT11_MEASURE_MODE_REFUSED (1<<2) + +#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) +#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) +#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) +#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) +#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) + +BWL_PRE_PACKED_STRUCT struct dot11_meas_req { + uint8 id; + uint8 len; + uint8 token; + uint8 mode; + uint8 type; + uint8 channel; + uint8 start_time[8]; + uint16 duration; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_meas_req dot11_meas_req_t; +#define DOT11_MNG_IE_MREQ_LEN 14 + +#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 + +BWL_PRE_PACKED_STRUCT struct dot11_meas_rep { + uint8 id; + uint8 len; + uint8 token; + uint8 mode; + uint8 type; + BWL_PRE_PACKED_STRUCT union + { + BWL_PRE_PACKED_STRUCT struct { + uint8 channel; + uint8 start_time[8]; + uint16 duration; + uint8 map; + } BWL_POST_PACKED_STRUCT basic; + uint8 data[1]; + } BWL_POST_PACKED_STRUCT rep; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_meas_rep dot11_meas_rep_t; + + +#define DOT11_MNG_IE_MREP_FIXED_LEN 3 + +BWL_PRE_PACKED_STRUCT struct dot11_meas_rep_basic { + uint8 channel; + uint8 start_time[8]; + uint16 duration; + uint8 map; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t; +#define DOT11_MEASURE_BASIC_REP_LEN 12 + +BWL_PRE_PACKED_STRUCT struct dot11_quiet { + uint8 id; + uint8 len; + uint8 count; + uint8 period; + uint16 duration; + uint16 offset; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_quiet dot11_quiet_t; + +BWL_PRE_PACKED_STRUCT struct chan_map_tuple { + uint8 channel; + uint8 map; +} BWL_POST_PACKED_STRUCT; +typedef struct chan_map_tuple chan_map_tuple_t; + +BWL_PRE_PACKED_STRUCT struct dot11_ibss_dfs { + uint8 id; + uint8 len; + uint8 eaddr[ETHER_ADDR_LEN]; + uint8 interval; + chan_map_tuple_t map[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ibss_dfs dot11_ibss_dfs_t; + + +#define WME_OUI "\x00\x50\xf2" +#define WME_OUI_LEN 3 +#define WME_OUI_TYPE 2 +#define WME_TYPE 2 +#define WME_SUBTYPE_IE 0 +#define WME_SUBTYPE_PARAM_IE 1 +#define WME_SUBTYPE_TSPEC 2 +#define WME_VER 1 + + +#define AC_BE 0 +#define AC_BK 1 +#define AC_VI 2 +#define AC_VO 3 +#define AC_COUNT 4 + +typedef uint8 ac_bitmap_t; + +#define AC_BITMAP_NONE 0x0 +#define AC_BITMAP_ALL 0xf +#define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0) +#define AC_BITMAP_SET(ab, ac) (((ab) |= (1 << (ac)))) +#define AC_BITMAP_RESET(ab, ac) (((ab) &= ~(1 << (ac)))) + + +BWL_PRE_PACKED_STRUCT struct wme_ie { + uint8 oui[3]; + uint8 type; + uint8 subtype; + uint8 version; + uint8 qosinfo; +} BWL_POST_PACKED_STRUCT; +typedef struct wme_ie wme_ie_t; +#define WME_IE_LEN 7 + +BWL_PRE_PACKED_STRUCT struct edcf_acparam { + uint8 ACI; + uint8 ECW; + uint16 TXOP; +} BWL_POST_PACKED_STRUCT; +typedef struct edcf_acparam edcf_acparam_t; + + +BWL_PRE_PACKED_STRUCT struct wme_param_ie { + uint8 oui[3]; + uint8 type; + uint8 subtype; + uint8 version; + uint8 qosinfo; + uint8 rsvd; + edcf_acparam_t acparam[AC_COUNT]; +} BWL_POST_PACKED_STRUCT; +typedef struct wme_param_ie wme_param_ie_t; +#define WME_PARAM_IE_LEN 24 + + +#define WME_QI_AP_APSD_MASK 0x80 +#define WME_QI_AP_APSD_SHIFT 7 +#define WME_QI_AP_COUNT_MASK 0x0f +#define WME_QI_AP_COUNT_SHIFT 0 + + +#define WME_QI_STA_MAXSPLEN_MASK 0x60 +#define WME_QI_STA_MAXSPLEN_SHIFT 5 +#define WME_QI_STA_APSD_ALL_MASK 0xf +#define WME_QI_STA_APSD_ALL_SHIFT 0 +#define WME_QI_STA_APSD_BE_MASK 0x8 +#define WME_QI_STA_APSD_BE_SHIFT 3 +#define WME_QI_STA_APSD_BK_MASK 0x4 +#define WME_QI_STA_APSD_BK_SHIFT 2 +#define WME_QI_STA_APSD_VI_MASK 0x2 +#define WME_QI_STA_APSD_VI_SHIFT 1 +#define WME_QI_STA_APSD_VO_MASK 0x1 +#define WME_QI_STA_APSD_VO_SHIFT 0 + + +#define EDCF_AIFSN_MIN 1 +#define EDCF_AIFSN_MAX 15 +#define EDCF_AIFSN_MASK 0x0f +#define EDCF_ACM_MASK 0x10 +#define EDCF_ACI_MASK 0x60 +#define EDCF_ACI_SHIFT 5 +#define EDCF_AIFSN_SHIFT 12 + + +#define EDCF_ECW_MIN 0 +#define EDCF_ECW_MAX 15 +#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) +#define EDCF_ECWMIN_MASK 0x0f +#define EDCF_ECWMAX_MASK 0xf0 +#define EDCF_ECWMAX_SHIFT 4 + + +#define EDCF_TXOP_MIN 0 +#define EDCF_TXOP_MAX 65535 +#define EDCF_TXOP2USEC(txop) ((txop) << 5) + + +#define NON_EDCF_AC_BE_ACI_STA 0x02 + + +#define EDCF_AC_BE_ACI_STA 0x03 +#define EDCF_AC_BE_ECW_STA 0xA4 +#define EDCF_AC_BE_TXOP_STA 0x0000 +#define EDCF_AC_BK_ACI_STA 0x27 +#define EDCF_AC_BK_ECW_STA 0xA4 +#define EDCF_AC_BK_TXOP_STA 0x0000 +#define EDCF_AC_VI_ACI_STA 0x42 +#define EDCF_AC_VI_ECW_STA 0x43 +#define EDCF_AC_VI_TXOP_STA 0x005e +#define EDCF_AC_VO_ACI_STA 0x62 +#define EDCF_AC_VO_ECW_STA 0x32 +#define EDCF_AC_VO_TXOP_STA 0x002f + + +#define EDCF_AC_BE_ACI_AP 0x03 +#define EDCF_AC_BE_ECW_AP 0x64 +#define EDCF_AC_BE_TXOP_AP 0x0000 +#define EDCF_AC_BK_ACI_AP 0x27 +#define EDCF_AC_BK_ECW_AP 0xA4 +#define EDCF_AC_BK_TXOP_AP 0x0000 +#define EDCF_AC_VI_ACI_AP 0x41 +#define EDCF_AC_VI_ECW_AP 0x43 +#define EDCF_AC_VI_TXOP_AP 0x005e +#define EDCF_AC_VO_ACI_AP 0x61 +#define EDCF_AC_VO_ECW_AP 0x32 +#define EDCF_AC_VO_TXOP_AP 0x002f + + +BWL_PRE_PACKED_STRUCT struct edca_param_ie { + uint8 qosinfo; + uint8 rsvd; + edcf_acparam_t acparam[AC_COUNT]; +} BWL_POST_PACKED_STRUCT; +typedef struct edca_param_ie edca_param_ie_t; +#define EDCA_PARAM_IE_LEN 18 + + +BWL_PRE_PACKED_STRUCT struct qos_cap_ie { + uint8 qosinfo; +} BWL_POST_PACKED_STRUCT; +typedef struct qos_cap_ie qos_cap_ie_t; + +BWL_PRE_PACKED_STRUCT struct dot11_qbss_load_ie { + uint8 id; + uint8 length; + uint16 station_count; + uint8 channel_utilization; + uint16 aac; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t; +#define BSS_LOAD_IE_SIZE 7 + + +#define FIXED_MSDU_SIZE 0x8000 +#define MSDU_SIZE_MASK 0x7fff + + + +#define INTEGER_SHIFT 13 +#define FRACTION_MASK 0x1FFF + + +BWL_PRE_PACKED_STRUCT struct dot11_management_notification { + uint8 category; + uint8 action; + uint8 token; + uint8 status; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +#define DOT11_MGMT_NOTIFICATION_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct ti_ie { + uint8 ti_type; + uint32 ti_val; +} BWL_POST_PACKED_STRUCT; +typedef struct ti_ie ti_ie_t; +#define TI_TYPE_REASSOC_DEADLINE 1 +#define TI_TYPE_KEY_LIFETIME 2 + + +#define WME_ADDTS_REQUEST 0 +#define WME_ADDTS_RESPONSE 1 +#define WME_DELTS_REQUEST 2 + + +#define WME_ADMISSION_ACCEPTED 0 +#define WME_INVALID_PARAMETERS 1 +#define WME_ADMISSION_REFUSED 3 + + +#define BCN_PRB_SSID(body) ((char*)(body) + DOT11_BCN_PRB_LEN) + + +#define DOT11_OPEN_SYSTEM 0 +#define DOT11_SHARED_KEY 1 +#define DOT11_FAST_BSS 2 +#define DOT11_CHALLENGE_LEN 128 + + +#define FC_PVER_MASK 0x3 +#define FC_PVER_SHIFT 0 +#define FC_TYPE_MASK 0xC +#define FC_TYPE_SHIFT 2 +#define FC_SUBTYPE_MASK 0xF0 +#define FC_SUBTYPE_SHIFT 4 +#define FC_TODS 0x100 +#define FC_TODS_SHIFT 8 +#define FC_FROMDS 0x200 +#define FC_FROMDS_SHIFT 9 +#define FC_MOREFRAG 0x400 +#define FC_MOREFRAG_SHIFT 10 +#define FC_RETRY 0x800 +#define FC_RETRY_SHIFT 11 +#define FC_PM 0x1000 +#define FC_PM_SHIFT 12 +#define FC_MOREDATA 0x2000 +#define FC_MOREDATA_SHIFT 13 +#define FC_WEP 0x4000 +#define FC_WEP_SHIFT 14 +#define FC_ORDER 0x8000 +#define FC_ORDER_SHIFT 15 + + +#define SEQNUM_SHIFT 4 +#define SEQNUM_MAX 0x1000 +#define FRAGNUM_MASK 0xF + + + + +#define FC_TYPE_MNG 0 +#define FC_TYPE_CTL 1 +#define FC_TYPE_DATA 2 + + +#define FC_SUBTYPE_ASSOC_REQ 0 +#define FC_SUBTYPE_ASSOC_RESP 1 +#define FC_SUBTYPE_REASSOC_REQ 2 +#define FC_SUBTYPE_REASSOC_RESP 3 +#define FC_SUBTYPE_PROBE_REQ 4 +#define FC_SUBTYPE_PROBE_RESP 5 +#define FC_SUBTYPE_BEACON 8 +#define FC_SUBTYPE_ATIM 9 +#define FC_SUBTYPE_DISASSOC 10 +#define FC_SUBTYPE_AUTH 11 +#define FC_SUBTYPE_DEAUTH 12 +#define FC_SUBTYPE_ACTION 13 +#define FC_SUBTYPE_ACTION_NOACK 14 + + +#define FC_SUBTYPE_CTL_WRAPPER 7 +#define FC_SUBTYPE_BLOCKACK_REQ 8 +#define FC_SUBTYPE_BLOCKACK 9 +#define FC_SUBTYPE_PS_POLL 10 +#define FC_SUBTYPE_RTS 11 +#define FC_SUBTYPE_CTS 12 +#define FC_SUBTYPE_ACK 13 +#define FC_SUBTYPE_CF_END 14 +#define FC_SUBTYPE_CF_END_ACK 15 + + +#define FC_SUBTYPE_DATA 0 +#define FC_SUBTYPE_DATA_CF_ACK 1 +#define FC_SUBTYPE_DATA_CF_POLL 2 +#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 +#define FC_SUBTYPE_NULL 4 +#define FC_SUBTYPE_CF_ACK 5 +#define FC_SUBTYPE_CF_POLL 6 +#define FC_SUBTYPE_CF_ACK_POLL 7 +#define FC_SUBTYPE_QOS_DATA 8 +#define FC_SUBTYPE_QOS_DATA_CF_ACK 9 +#define FC_SUBTYPE_QOS_DATA_CF_POLL 10 +#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 +#define FC_SUBTYPE_QOS_NULL 12 +#define FC_SUBTYPE_QOS_CF_POLL 14 +#define FC_SUBTYPE_QOS_CF_ACK_POLL 15 + + +#define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0) +#define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) +#define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) +#define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) + + +#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) + +#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) + +#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) +#define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) + +#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) +#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) +#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) +#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) +#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) +#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) +#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) +#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) +#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) +#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) +#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) +#define FC_ACTION_NOACK FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION_NOACK) + +#define FC_CTL_WRAPPER FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTL_WRAPPER) +#define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) +#define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) +#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) +#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) +#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) +#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) +#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) +#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) + +#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) +#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) +#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) +#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) +#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) + + + + +#define QOS_PRIO_SHIFT 0 +#define QOS_PRIO_MASK 0x0007 +#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) + + +#define QOS_TID_SHIFT 0 +#define QOS_TID_MASK 0x000f +#define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) + + +#define QOS_EOSP_SHIFT 4 +#define QOS_EOSP_MASK 0x0010 +#define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) + + +#define QOS_ACK_NORMAL_ACK 0 +#define QOS_ACK_NO_ACK 1 +#define QOS_ACK_NO_EXP_ACK 2 +#define QOS_ACK_BLOCK_ACK 3 +#define QOS_ACK_SHIFT 5 +#define QOS_ACK_MASK 0x0060 +#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) + + +#define QOS_AMSDU_SHIFT 7 +#define QOS_AMSDU_MASK 0x0080 + + + + + + +#define DOT11_MNG_AUTH_ALGO_LEN 2 +#define DOT11_MNG_AUTH_SEQ_LEN 2 +#define DOT11_MNG_BEACON_INT_LEN 2 +#define DOT11_MNG_CAP_LEN 2 +#define DOT11_MNG_AP_ADDR_LEN 6 +#define DOT11_MNG_LISTEN_INT_LEN 2 +#define DOT11_MNG_REASON_LEN 2 +#define DOT11_MNG_AID_LEN 2 +#define DOT11_MNG_STATUS_LEN 2 +#define DOT11_MNG_TIMESTAMP_LEN 8 + + +#define DOT11_AID_MASK 0x3fff + + +#define DOT11_RC_RESERVED 0 +#define DOT11_RC_UNSPECIFIED 1 +#define DOT11_RC_AUTH_INVAL 2 +#define DOT11_RC_DEAUTH_LEAVING 3 +#define DOT11_RC_INACTIVITY 4 +#define DOT11_RC_BUSY 5 +#define DOT11_RC_INVAL_CLASS_2 6 +#define DOT11_RC_INVAL_CLASS_3 7 +#define DOT11_RC_DISASSOC_LEAVING 8 +#define DOT11_RC_NOT_AUTH 9 +#define DOT11_RC_BAD_PC 10 +#define DOT11_RC_BAD_CHANNELS 11 + + + +#define DOT11_RC_UNSPECIFIED_QOS 32 +#define DOT11_RC_INSUFFCIENT_BW 33 +#define DOT11_RC_EXCESSIVE_FRAMES 34 +#define DOT11_RC_TX_OUTSIDE_TXOP 35 +#define DOT11_RC_LEAVING_QBSS 36 +#define DOT11_RC_BAD_MECHANISM 37 +#define DOT11_RC_SETUP_NEEDED 38 +#define DOT11_RC_TIMEOUT 39 + +#define DOT11_RC_MAX 23 + +#define DOT11_RC_TDLS_PEER_UNREACH 25 +#define DOT11_RC_TDLS_DOWN_UNSPECIFIED 26 + + +#define DOT11_SC_SUCCESS 0 +#define DOT11_SC_FAILURE 1 +#define DOT11_SC_TDLS_WAKEUP_SCH_ALT 2 + +#define DOT11_SC_TDLS_WAKEUP_SCH_REJ 3 +#define DOT11_SC_TDLS_SEC_DISABLED 5 +#define DOT11_SC_LIFETIME_REJ 6 +#define DOT11_SC_NOT_SAME_BSS 7 +#define DOT11_SC_CAP_MISMATCH 10 +#define DOT11_SC_REASSOC_FAIL 11 +#define DOT11_SC_ASSOC_FAIL 12 +#define DOT11_SC_AUTH_MISMATCH 13 +#define DOT11_SC_AUTH_SEQ 14 +#define DOT11_SC_AUTH_CHALLENGE_FAIL 15 +#define DOT11_SC_AUTH_TIMEOUT 16 +#define DOT11_SC_ASSOC_BUSY_FAIL 17 +#define DOT11_SC_ASSOC_RATE_MISMATCH 18 +#define DOT11_SC_ASSOC_SHORT_REQUIRED 19 +#define DOT11_SC_ASSOC_PBCC_REQUIRED 20 +#define DOT11_SC_ASSOC_AGILITY_REQUIRED 21 +#define DOT11_SC_ASSOC_SPECTRUM_REQUIRED 22 +#define DOT11_SC_ASSOC_BAD_POWER_CAP 23 +#define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24 +#define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED 25 +#define DOT11_SC_ASSOC_ERPBCC_REQUIRED 26 +#define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27 +#define DOT11_SC_ASSOC_R0KH_UNREACHABLE 28 +#define DOT11_SC_ASSOC_TRY_LATER 30 +#define DOT11_SC_ASSOC_MFP_VIOLATION 31 + +#define DOT11_SC_DECLINED 37 +#define DOT11_SC_INVALID_PARAMS 38 +#define DOT11_SC_INVALID_PAIRWISE_CIPHER 42 +#define DOT11_SC_INVALID_AKMP 43 +#define DOT11_SC_INVALID_RSNIE_CAP 45 +#define DOT11_SC_DLS_NOT_ALLOWED 48 +#define DOT11_SC_INVALID_PMKID 53 +#define DOT11_SC_INVALID_MDID 54 +#define DOT11_SC_INVALID_FTIE 55 + +#define DOT11_SC_UNEXP_MSG 70 +#define DOT11_SC_INVALID_SNONCE 71 +#define DOT11_SC_INVALID_RSNIE 72 + + +#define DOT11_MNG_DS_PARAM_LEN 1 +#define DOT11_MNG_IBSS_PARAM_LEN 2 + + +#define DOT11_MNG_TIM_FIXED_LEN 3 +#define DOT11_MNG_TIM_DTIM_COUNT 0 +#define DOT11_MNG_TIM_DTIM_PERIOD 1 +#define DOT11_MNG_TIM_BITMAP_CTL 2 +#define DOT11_MNG_TIM_PVB 3 + + +#define TLV_TAG_OFF 0 +#define TLV_LEN_OFF 1 +#define TLV_HDR_LEN 2 +#define TLV_BODY_OFF 2 + + +#define DOT11_MNG_SSID_ID 0 +#define DOT11_MNG_RATES_ID 1 +#define DOT11_MNG_FH_PARMS_ID 2 +#define DOT11_MNG_DS_PARMS_ID 3 +#define DOT11_MNG_CF_PARMS_ID 4 +#define DOT11_MNG_TIM_ID 5 +#define DOT11_MNG_IBSS_PARMS_ID 6 +#define DOT11_MNG_COUNTRY_ID 7 +#define DOT11_MNG_HOPPING_PARMS_ID 8 +#define DOT11_MNG_HOPPING_TABLE_ID 9 +#define DOT11_MNG_REQUEST_ID 10 +#define DOT11_MNG_QBSS_LOAD_ID 11 +#define DOT11_MNG_EDCA_PARAM_ID 12 +#define DOT11_MNG_CHALLENGE_ID 16 +#define DOT11_MNG_PWR_CONSTRAINT_ID 32 +#define DOT11_MNG_PWR_CAP_ID 33 +#define DOT11_MNG_TPC_REQUEST_ID 34 +#define DOT11_MNG_TPC_REPORT_ID 35 +#define DOT11_MNG_SUPP_CHANNELS_ID 36 +#define DOT11_MNG_CHANNEL_SWITCH_ID 37 +#define DOT11_MNG_MEASURE_REQUEST_ID 38 +#define DOT11_MNG_MEASURE_REPORT_ID 39 +#define DOT11_MNG_QUIET_ID 40 +#define DOT11_MNG_IBSS_DFS_ID 41 +#define DOT11_MNG_ERP_ID 42 +#define DOT11_MNG_TS_DELAY_ID 43 +#define DOT11_MNG_HT_CAP 45 +#define DOT11_MNG_QOS_CAP_ID 46 +#define DOT11_MNG_NONERP_ID 47 +#define DOT11_MNG_RSN_ID 48 +#define DOT11_MNG_EXT_RATES_ID 50 +#define DOT11_MNG_AP_CHREP_ID 51 +#define DOT11_MNG_NBR_REP_ID 52 +#define DOT11_MNG_MDIE_ID 54 +#define DOT11_MNG_FTIE_ID 55 +#define DOT11_MNG_FT_TI_ID 56 +#define DOT11_MNG_REGCLASS_ID 59 +#define DOT11_MNG_EXT_CSA_ID 60 +#define DOT11_MNG_HT_ADD 61 +#define DOT11_MNG_EXT_CHANNEL_OFFSET 62 +#define DOT11_MNG_WAPI_ID 68 +#define DOT11_MNG_TIME_ADVERTISE_ID 69 +#define DOT11_MNG_RRM_CAP_ID 70 +#define DOT11_MNG_HT_BSS_COEXINFO_ID 72 +#define DOT11_MNG_HT_BSS_CHANNEL_REPORT_ID 73 +#define DOT11_MNG_HT_OBSS_ID 74 +#define DOT11_MNG_CHANNEL_USAGE 97 +#define DOT11_MNG_TIME_ZONE_ID 98 +#define DOT11_MNG_LINK_IDENTIFIER_ID 101 +#define DOT11_MNG_WAKEUP_SCHEDULE_ID 102 +#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID 104 +#define DOT11_MNG_PTI_CONTROL_ID 105 +#define DOT11_MNG_PU_BUFFER_STATUS_ID 106 +#define DOT11_MNG_INTERWORKING_ID 107 +#define DOT11_MNG_ADVERTISEMENT_ID 108 +#define DOT11_MNG_EXP_BW_REQ_ID 109 +#define DOT11_MNG_QOS_MAP_ID 110 +#define DOT11_MNG_ROAM_CONSORT_ID 111 +#define DOT11_MNG_EMERGCY_ALERT_ID 112 +#define DOT11_MNG_EXT_CAP_ID 127 +#define DOT11_MNG_VHT_CAP_ID 191 +#define DOT11_MNG_VHT_OPERATION_ID 192 + +#define DOT11_MNG_WPA_ID 221 +#define DOT11_MNG_PROPR_ID 221 + +#define DOT11_MNG_VS_ID 221 + + +#define DOT11_RATE_BASIC 0x80 +#define DOT11_RATE_MASK 0x7F + + +#define DOT11_MNG_ERP_LEN 1 +#define DOT11_MNG_NONERP_PRESENT 0x01 +#define DOT11_MNG_USE_PROTECTION 0x02 +#define DOT11_MNG_BARKER_PREAMBLE 0x04 + +#define DOT11_MGN_TS_DELAY_LEN 4 +#define TS_DELAY_FIELD_SIZE 4 + + +#define DOT11_CAP_ESS 0x0001 +#define DOT11_CAP_IBSS 0x0002 +#define DOT11_CAP_POLLABLE 0x0004 +#define DOT11_CAP_POLL_RQ 0x0008 +#define DOT11_CAP_PRIVACY 0x0010 +#define DOT11_CAP_SHORT 0x0020 +#define DOT11_CAP_PBCC 0x0040 +#define DOT11_CAP_AGILITY 0x0080 +#define DOT11_CAP_SPECTRUM 0x0100 +#define DOT11_CAP_SHORTSLOT 0x0400 +#define DOT11_CAP_RRM 0x1000 +#define DOT11_CAP_CCK_OFDM 0x2000 + + + +#define DOT11_EXT_CAP_OBSS_COEX_MGMT 0 + +#define DOT11_EXT_CAP_SPSMP 6 + +#define DOT11_EXT_CAP_BSS_TRANSITION_MGMT 19 + +#define DOT11_EXT_CAP_IW 31 + +#define DOT11_EXT_CAP_SI 41 +#define DOT11_EXT_CAP_SI_MASK 0x0E + + +#define DOT11_ACTION_HDR_LEN 2 +#define DOT11_ACTION_CAT_OFF 0 +#define DOT11_ACTION_ACT_OFF 1 + + +#define DOT11_ACTION_CAT_ERR_MASK 0x80 +#define DOT11_ACTION_CAT_MASK 0x7F +#define DOT11_ACTION_CAT_SPECT_MNG 0 +#define DOT11_ACTION_CAT_QOS 1 +#define DOT11_ACTION_CAT_DLS 2 +#define DOT11_ACTION_CAT_BLOCKACK 3 +#define DOT11_ACTION_CAT_PUBLIC 4 +#define DOT11_ACTION_CAT_RRM 5 +#define DOT11_ACTION_CAT_FBT 6 +#define DOT11_ACTION_CAT_HT 7 +#define DOT11_ACTION_CAT_SA_QUERY 8 +#define DOT11_ACTION_CAT_PDPA 9 +#define DOT11_ACTION_CAT_BSSMGMT 10 +#define DOT11_ACTION_NOTIFICATION 17 +#define DOT11_ACTION_CAT_VSP 126 +#define DOT11_ACTION_CAT_VS 127 + + +#define DOT11_SM_ACTION_M_REQ 0 +#define DOT11_SM_ACTION_M_REP 1 +#define DOT11_SM_ACTION_TPC_REQ 2 +#define DOT11_SM_ACTION_TPC_REP 3 +#define DOT11_SM_ACTION_CHANNEL_SWITCH 4 +#define DOT11_SM_ACTION_EXT_CSA 5 + + +#define DOT11_ACTION_ID_HT_CH_WIDTH 0 +#define DOT11_ACTION_ID_HT_MIMO_PS 1 + + +#define DOT11_PUB_ACTION_BSS_COEX_MNG 0 +#define DOT11_PUB_ACTION_CHANNEL_SWITCH 4 + + +#define DOT11_BA_ACTION_ADDBA_REQ 0 +#define DOT11_BA_ACTION_ADDBA_RESP 1 +#define DOT11_BA_ACTION_DELBA 2 + + +#define DOT11_ADDBA_PARAM_AMSDU_SUP 0x0001 +#define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 +#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 +#define DOT11_ADDBA_PARAM_TID_MASK 0x003c +#define DOT11_ADDBA_PARAM_TID_SHIFT 2 +#define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 +#define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 + +#define DOT11_ADDBA_POLICY_DELAYED 0 +#define DOT11_ADDBA_POLICY_IMMEDIATE 1 + + +#define DOT11_FT_ACTION_FT_RESERVED 0 +#define DOT11_FT_ACTION_FT_REQ 1 +#define DOT11_FT_ACTION_FT_RES 2 +#define DOT11_FT_ACTION_FT_CON 3 +#define DOT11_FT_ACTION_FT_ACK 4 + + +#define DOT11_DLS_ACTION_REQ 0 +#define DOT11_DLS_ACTION_RESP 1 +#define DOT11_DLS_ACTION_TD 2 + + +#define DOT11_WNM_ACTION_EVENT_REQ 0 +#define DOT11_WNM_ACTION_EVENT_REP 1 +#define DOT11_WNM_ACTION_DIAG_REQ 2 +#define DOT11_WNM_ACTION_DIAG_REP 3 +#define DOT11_WNM_ACTION_LOC_CFG_REQ 4 +#define DOT11_WNM_ACTION_LOC_RFG_RESP 5 +#define DOT11_WNM_ACTION_BSS_TRANS_QURY 6 +#define DOT11_WNM_ACTION_BSS_TRANS_REQ 7 +#define DOT11_WNM_ACTION_BSS_TRANS_RESP 8 +#define DOT11_WNM_ACTION_FMS_REQ 9 +#define DOT11_WNM_ACTION_FMS_RESP 10 +#define DOT11_WNM_ACTION_COL_INTRFRNCE_REQ 11 +#define DOT11_WNM_ACTION_COL_INTRFRNCE_REP 12 +#define DOT11_WNM_ACTION_TFS_REQ 13 +#define DOT11_WNM_ACTION_TFS_RESP 14 +#define DOT11_WNM_ACTION_TFS_NOTIFY 15 +#define DOT11_WNM_ACTION_WNM_SLEEP_REQ 16 +#define DOT11_WNM_ACTION_WNM_SLEEP_RESP 17 +#define DOT11_WNM_ACTION_TIM_BCAST_REQ 18 +#define DOT11_WNM_ACTION_TIM_BCAST_RESP 19 +#define DOT11_WNM_ACTION_QOS_TRFC_CAP_UPD 20 +#define DOT11_WNM_ACTION_CHAN_USAGE_REQ 21 +#define DOT11_WNM_ACTION_CHAN_USAGE_RESP 22 +#define DOT11_WNM_ACTION_DMS_REQ 23 +#define DOT11_WNM_ACTION_DMS_RESP 24 +#define DOT11_WNM_ACTION_TMNG_MEASUR_REQ 25 +#define DOT11_WNM_ACTION_NOTFCTN_REQ 26 +#define DOT11_WNM_ACTION_NOTFCTN_RES 27 + +#define DOT11_MNG_COUNTRY_ID_LEN 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_dls_req { + uint8 category; + uint8 action; + struct ether_addr da; + struct ether_addr sa; + uint16 cap; + uint16 timeout; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dls_req dot11_dls_req_t; +#define DOT11_DLS_REQ_LEN 18 + + +BWL_PRE_PACKED_STRUCT struct dot11_dls_resp { + uint8 category; + uint8 action; + uint16 status; + struct ether_addr da; + struct ether_addr sa; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_dls_resp dot11_dls_resp_t; +#define DOT11_DLS_RESP_LEN 16 + + + +BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_query { + uint8 category; + uint8 action; + uint8 token; + uint8 reason; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bss_trans_query dot11_bss_trans_query_t; +#define DOT11_BSS_TRANS_QUERY_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_req { + uint8 category; + uint8 action; + uint8 token; + uint8 reqmode; + uint16 disassoc_tmr; + uint8 validity_intrvl; + uint8 data[1]; + +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bss_trans_req dot11_bss_trans_req_t; +#define DOT11_BSS_TRANS_REQ_LEN 7 + +#define DOT11_BSS_TERM_DUR_LEN 12 + + + +#define DOT11_BSS_TRNS_REQMODE_PREF_LIST_INCL 0x01 +#define DOT11_BSS_TRNS_REQMODE_ABRIDGED 0x02 +#define DOT11_BSS_TRNS_REQMODE_DISASSOC_IMMINENT 0x04 +#define DOT11_BSS_TRNS_REQMODE_BSS_TERM_INCL 0x08 +#define DOT11_BSS_TRNS_REQMODE_ESS_DISASSOC_IMNT 0x10 + + + +BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_res { + uint8 category; + uint8 action; + uint8 token; + uint8 status; + uint8 term_delay; + uint8 data[1]; + +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_bss_trans_res dot11_bss_trans_res_t; +#define DOT11_BSS_TRANS_RES_LEN 5 + + +#define DOT11_BSS_TRNS_RES_STATUS_ACCEPT 0 +#define DOT11_BSS_TRNS_RES_STATUS_REJECT 1 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_BCN 2 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_CAP 3 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_UNDESIRED 4 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_DELAY_REQ 5 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_BSS_LIST_PROVIDED 6 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_NO_SUITABLE_BSS 7 +#define DOT11_BSS_TRNS_RES_STATUS_REJ_LEAVING_ESS 8 + + + +#define DOT11_NBR_RPRT_BSSID_INFO_REACHABILTY 0x0003 +#define DOT11_NBR_RPRT_BSSID_INFO_SEC 0x0004 +#define DOT11_NBR_RPRT_BSSID_INFO_KEY_SCOPE 0x0008 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP 0x03f0 + +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_SPEC_MGMT 0x0010 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_QOS 0x0020 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_APSD 0x0040 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_RDIO_MSMT 0x0080 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_DEL_BA 0x0100 +#define DOT11_NBR_RPRT_BSSID_INFO_CAP_IMM_BA 0x0200 + + +#define DOT11_NBR_RPRT_SUBELEM_BSS_CANDDT_PREF_ID 3 + + +BWL_PRE_PACKED_STRUCT struct dot11_addba_req { + uint8 category; + uint8 action; + uint8 token; + uint16 addba_param_set; + uint16 timeout; + uint16 start_seqnum; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_addba_req dot11_addba_req_t; +#define DOT11_ADDBA_REQ_LEN 9 + +BWL_PRE_PACKED_STRUCT struct dot11_addba_resp { + uint8 category; + uint8 action; + uint8 token; + uint16 status; + uint16 addba_param_set; + uint16 timeout; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_addba_resp dot11_addba_resp_t; +#define DOT11_ADDBA_RESP_LEN 9 + + +#define DOT11_DELBA_PARAM_INIT_MASK 0x0800 +#define DOT11_DELBA_PARAM_INIT_SHIFT 11 +#define DOT11_DELBA_PARAM_TID_MASK 0xf000 +#define DOT11_DELBA_PARAM_TID_SHIFT 12 + +BWL_PRE_PACKED_STRUCT struct dot11_delba { + uint8 category; + uint8 action; + uint16 delba_param_set; + uint16 reason; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_delba dot11_delba_t; +#define DOT11_DELBA_LEN 6 + + +#define SA_QUERY_REQUEST 0 +#define SA_QUERY_RESPONSE 1 + + + + +BWL_PRE_PACKED_STRUCT struct dot11_ft_req { + uint8 category; + uint8 action; + uint8 sta_addr[ETHER_ADDR_LEN]; + uint8 tgt_ap_addr[ETHER_ADDR_LEN]; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ft_req dot11_ft_req_t; +#define DOT11_FT_REQ_FIXED_LEN 14 + + +BWL_PRE_PACKED_STRUCT struct dot11_ft_res { + uint8 category; + uint8 action; + uint8 sta_addr[ETHER_ADDR_LEN]; + uint8 tgt_ap_addr[ETHER_ADDR_LEN]; + uint16 status; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ft_res dot11_ft_res_t; +#define DOT11_FT_RES_FIXED_LEN 16 + + + + + + +#define DOT11_RRM_CAP_LEN 5 +BWL_PRE_PACKED_STRUCT struct dot11_rrm_cap_ie { + uint8 cap[DOT11_RRM_CAP_LEN]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rrm_cap_ie dot11_rrm_cap_ie_t; + + +#define DOT11_RRM_CAP_LINK 0 +#define DOT11_RRM_CAP_NEIGHBOR_REPORT 1 +#define DOT11_RRM_CAP_PARALLEL 2 +#define DOT11_RRM_CAP_REPEATED 3 +#define DOT11_RRM_CAP_BCN_PASSIVE 4 +#define DOT11_RRM_CAP_BCN_ACTIVE 5 +#define DOT11_RRM_CAP_BCN_TABLE 6 +#define DOT11_RRM_CAP_BCN_REP_COND 7 +#define DOT11_RRM_CAP_AP_CHANREP 16 + + + +#define DOT11_OP_CLASS_NONE 255 + + + +#define DOT11_RM_ACTION_RM_REQ 0 +#define DOT11_RM_ACTION_RM_REP 1 +#define DOT11_RM_ACTION_LM_REQ 2 +#define DOT11_RM_ACTION_LM_REP 3 +#define DOT11_RM_ACTION_NR_REQ 4 +#define DOT11_RM_ACTION_NR_REP 5 + + +BWL_PRE_PACKED_STRUCT struct dot11_rm_action { + uint8 category; + uint8 action; + uint8 token; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rm_action dot11_rm_action_t; +#define DOT11_RM_ACTION_LEN 3 + +BWL_PRE_PACKED_STRUCT struct dot11_rmreq { + uint8 category; + uint8 action; + uint8 token; + uint16 reps; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rmreq dot11_rmreq_t; +#define DOT11_RMREQ_LEN 5 + +BWL_PRE_PACKED_STRUCT struct dot11_rm_ie { + uint8 id; + uint8 len; + uint8 token; + uint8 mode; + uint8 type; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rm_ie dot11_rm_ie_t; +#define DOT11_RM_IE_LEN 5 + + +#define DOT11_RMREQ_MODE_PARALLEL 1 +#define DOT11_RMREQ_MODE_ENABLE 2 +#define DOT11_RMREQ_MODE_REQUEST 4 +#define DOT11_RMREQ_MODE_REPORT 8 +#define DOT11_RMREQ_MODE_DURMAND 0x10 + + +#define DOT11_RMREP_MODE_LATE 1 +#define DOT11_RMREP_MODE_INCAPABLE 2 +#define DOT11_RMREP_MODE_REFUSED 4 + +BWL_PRE_PACKED_STRUCT struct dot11_rmreq_bcn { + uint8 id; + uint8 len; + uint8 token; + uint8 mode; + uint8 type; + uint8 reg; + uint8 channel; + uint16 interval; + uint16 duration; + uint8 bcn_mode; + struct ether_addr bssid; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rmreq_bcn dot11_rmreq_bcn_t; +#define DOT11_RMREQ_BCN_LEN 18 + +BWL_PRE_PACKED_STRUCT struct dot11_rmrep_bcn { + uint8 reg; + uint8 channel; + uint32 starttime[2]; + uint16 duration; + uint8 frame_info; + uint8 rcpi; + uint8 rsni; + struct ether_addr bssid; + uint8 antenna_id; + uint32 parent_tsf; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rmrep_bcn dot11_rmrep_bcn_t; +#define DOT11_RMREP_BCN_LEN 26 + + +#define DOT11_RMREQ_BCN_PASSIVE 0 +#define DOT11_RMREQ_BCN_ACTIVE 1 +#define DOT11_RMREQ_BCN_TABLE 2 + + +#define DOT11_RMREQ_BCN_SSID_ID 0 +#define DOT11_RMREQ_BCN_REPINFO_ID 1 +#define DOT11_RMREQ_BCN_REPDET_ID 2 +#define DOT11_RMREQ_BCN_REQUEST_ID 10 +#define DOT11_RMREQ_BCN_APCHREP_ID 51 + + +#define DOT11_RMREQ_BCN_REPDET_FIXED 0 +#define DOT11_RMREQ_BCN_REPDET_REQUEST 1 +#define DOT11_RMREQ_BCN_REPDET_ALL 2 + + +#define DOT11_RMREP_BCN_FRM_BODY 1 + + +BWL_PRE_PACKED_STRUCT struct dot11_rmrep_nbr { + struct ether_addr bssid; + uint32 bssid_info; + uint8 reg; + uint8 channel; + uint8 phytype; + uchar sub_elements[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rmrep_nbr dot11_rmrep_nbr_t; +#define DOT11_RMREP_NBR_LEN 13 + + +#define DOT11_BSSTYPE_INFRASTRUCTURE 0 +#define DOT11_BSSTYPE_INDEPENDENT 1 +#define DOT11_BSSTYPE_ANY 2 +#define DOT11_SCANTYPE_ACTIVE 0 +#define DOT11_SCANTYPE_PASSIVE 1 + + +BWL_PRE_PACKED_STRUCT struct dot11_lmreq { + uint8 category; + uint8 action; + uint8 token; + uint8 txpwr; + uint8 maxtxpwr; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_lmreq dot11_lmreq_t; +#define DOT11_LMREQ_LEN 5 + +BWL_PRE_PACKED_STRUCT struct dot11_lmrep { + uint8 category; + uint8 action; + uint8 token; + dot11_tpc_rep_t tpc; + uint8 rxant; + uint8 txant; + uint8 rcpi; + uint8 rsni; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_lmrep dot11_lmrep_t; +#define DOT11_LMREP_LEN 11 + + +#define PREN_PREAMBLE 24 +#define PREN_MM_EXT 12 +#define PREN_PREAMBLE_EXT 4 + + +#define RIFS_11N_TIME 2 + + + +#define HT_SIG1_MCS_MASK 0x00007F +#define HT_SIG1_CBW 0x000080 +#define HT_SIG1_HT_LENGTH 0xFFFF00 + + +#define HT_SIG2_SMOOTHING 0x000001 +#define HT_SIG2_NOT_SOUNDING 0x000002 +#define HT_SIG2_RESERVED 0x000004 +#define HT_SIG2_AGGREGATION 0x000008 +#define HT_SIG2_STBC_MASK 0x000030 +#define HT_SIG2_STBC_SHIFT 4 +#define HT_SIG2_FEC_CODING 0x000040 +#define HT_SIG2_SHORT_GI 0x000080 +#define HT_SIG2_ESS_MASK 0x000300 +#define HT_SIG2_ESS_SHIFT 8 +#define HT_SIG2_CRC 0x03FC00 +#define HT_SIG2_TAIL 0x1C0000 + + +#define APHY_SLOT_TIME 9 +#define APHY_SIFS_TIME 16 +#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) +#define APHY_PREAMBLE_TIME 16 +#define APHY_SIGNAL_TIME 4 +#define APHY_SYMBOL_TIME 4 +#define APHY_SERVICE_NBITS 16 +#define APHY_TAIL_NBITS 6 +#define APHY_CWMIN 15 + + +#define BPHY_SLOT_TIME 20 +#define BPHY_SIFS_TIME 10 +#define BPHY_DIFS_TIME 50 +#define BPHY_PLCP_TIME 192 +#define BPHY_PLCP_SHORT_TIME 96 +#define BPHY_CWMIN 31 + + +#define DOT11_OFDM_SIGNAL_EXTENSION 6 + +#define PHY_CWMAX 1023 + +#define DOT11_MAXNUMFRAGS 16 + + + +typedef int vht_group_id_t; + + + +#define VHT_SIGA1_CONST_MASK 0x800004 + +#define VHT_SIGA1_20MHZ_VAL 0x000000 +#define VHT_SIGA1_40MHZ_VAL 0x000001 +#define VHT_SIGA1_80MHZ_VAL 0x000002 +#define VHT_SIGA1_160MHZ_VAL 0x000003 + +#define VHT_SIGA1_STBC 0x000008 + +#define VHT_SIGA1_GID_MAX_GID 0x3f +#define VHT_SIGA1_GID_SHIFT 4 +#define VHT_SIGA1_GID_TO_AP 0x00 +#define VHT_SIGA1_GID_NOT_TO_AP 0x3f + +#define VHT_SIGA1_NSTS_SHIFT 10 +#define VHT_SIGA1_NSTS_SHIFT_MASK_USER0 0x001C00 + +#define VHT_SIGA1_PARTIAL_AID_SHIFT 13 + + +#define VHT_SIGA2_GI_NONE 0x000000 +#define VHT_SIGA2_GI_SHORT 0x000001 +#define VHT_SIGA2_GI_W_MOD10 0x000002 +#define VHT_SIGA2_CODING_LDPC 0x000004 +#define VHT_SIGA2_BEAMFORM_ENABLE 0x000100 +#define VHT_SIGA2_MCS_SHIFT 4 + +#define VHT_SIGA2_B9_RESERVED 0x000200 +#define VHT_SIGA2_TAIL_MASK 0xfc0000 +#define VHT_SIGA2_TAIL_VALUE 0x000000 + +#define VHT_SIGA2_SVC_BITS 16 +#define VHT_SIGA2_TAIL_BITS 6 + + + +typedef struct d11cnt { + uint32 txfrag; + uint32 txmulti; + uint32 txfail; + uint32 txretry; + uint32 txretrie; + uint32 rxdup; + uint32 txrts; + uint32 txnocts; + uint32 txnoack; + uint32 rxfrag; + uint32 rxmulti; + uint32 rxcrc; + uint32 txfrmsnt; + uint32 rxundec; +} d11cnt_t; + + +#define BRCM_PROP_OUI "\x00\x90\x4C" + + + +#define BRCM_OUI "\x00\x10\x18" + + +BWL_PRE_PACKED_STRUCT struct brcm_ie { + uint8 id; + uint8 len; + uint8 oui[3]; + uint8 ver; + uint8 assoc; + uint8 flags; + uint8 flags1; + uint16 amsdu_mtu_pref; +} BWL_POST_PACKED_STRUCT; +typedef struct brcm_ie brcm_ie_t; +#define BRCM_IE_LEN 11 +#define BRCM_IE_VER 2 +#define BRCM_IE_LEGACY_AES_VER 1 + + +#define BRF_LZWDS 0x4 +#define BRF_BLOCKACK 0x8 + + +#define BRF1_AMSDU 0x1 +#define BRF1_WMEPS 0x4 +#define BRF1_PSOFIX 0x8 +#define BRF1_RX_LARGE_AGG 0x10 +#define BRF1_RFAWARE_DCS 0x20 +#define BRF1_SOFTAP 0x40 + + +BWL_PRE_PACKED_STRUCT struct vndr_ie { + uchar id; + uchar len; + uchar oui [3]; + uchar data [1]; +} BWL_POST_PACKED_STRUCT; +typedef struct vndr_ie vndr_ie_t; + +#define VNDR_IE_HDR_LEN 2 +#define VNDR_IE_MIN_LEN 3 +#define VNDR_IE_MAX_LEN 256 + + +#define MCSSET_LEN 16 +#define MAX_MCS_NUM (128) + +BWL_PRE_PACKED_STRUCT struct ht_cap_ie { + uint16 cap; + uint8 params; + uint8 supp_mcs[MCSSET_LEN]; + uint16 ext_htcap; + uint32 txbf_cap; + uint8 as_cap; +} BWL_POST_PACKED_STRUCT; +typedef struct ht_cap_ie ht_cap_ie_t; + + + +BWL_PRE_PACKED_STRUCT struct ht_prop_cap_ie { + uint8 id; + uint8 len; + uint8 oui[3]; + uint8 type; + ht_cap_ie_t cap_ie; +} BWL_POST_PACKED_STRUCT; +typedef struct ht_prop_cap_ie ht_prop_cap_ie_t; + +#define HT_PROP_IE_OVERHEAD 4 +#define HT_CAP_IE_LEN 26 +#define HT_CAP_IE_TYPE 51 + +#define HT_CAP_LDPC_CODING 0x0001 +#define HT_CAP_40MHZ 0x0002 +#define HT_CAP_MIMO_PS_MASK 0x000C +#define HT_CAP_MIMO_PS_SHIFT 0x0002 +#define HT_CAP_MIMO_PS_OFF 0x0003 +#define HT_CAP_MIMO_PS_RTS 0x0001 +#define HT_CAP_MIMO_PS_ON 0x0000 +#define HT_CAP_GF 0x0010 +#define HT_CAP_SHORT_GI_20 0x0020 +#define HT_CAP_SHORT_GI_40 0x0040 +#define HT_CAP_TX_STBC 0x0080 +#define HT_CAP_RX_STBC_MASK 0x0300 +#define HT_CAP_RX_STBC_SHIFT 8 +#define HT_CAP_DELAYED_BA 0x0400 +#define HT_CAP_MAX_AMSDU 0x0800 + +#define HT_CAP_DSSS_CCK 0x1000 +#define HT_CAP_PSMP 0x2000 +#define HT_CAP_40MHZ_INTOLERANT 0x4000 +#define HT_CAP_LSIG_TXOP 0x8000 + +#define HT_CAP_RX_STBC_NO 0x0 +#define HT_CAP_RX_STBC_ONE_STREAM 0x1 +#define HT_CAP_RX_STBC_TWO_STREAM 0x2 +#define HT_CAP_RX_STBC_THREE_STREAM 0x3 + +#define VHT_MAX_MPDU 11454 +#define VHT_MPDU_MSDU_DELTA 56 + +#define VHT_MAX_AMSDU (VHT_MAX_MPDU - VHT_MPDU_MSDU_DELTA) + +#define HT_MAX_AMSDU 7935 +#define HT_MIN_AMSDU 3835 + +#define HT_PARAMS_RX_FACTOR_MASK 0x03 +#define HT_PARAMS_DENSITY_MASK 0x1C +#define HT_PARAMS_DENSITY_SHIFT 2 + + +#define AMPDU_MAX_MPDU_DENSITY 7 +#define AMPDU_RX_FACTOR_8K 0 +#define AMPDU_RX_FACTOR_16K 1 +#define AMPDU_RX_FACTOR_32K 2 +#define AMPDU_RX_FACTOR_64K 3 +#define AMPDU_RX_FACTOR_BASE 8*1024 + +#define AMPDU_DELIMITER_LEN 4 +#define AMPDU_DELIMITER_LEN_MAX 63 + +#define HT_CAP_EXT_PCO 0x0001 +#define HT_CAP_EXT_PCO_TTIME_MASK 0x0006 +#define HT_CAP_EXT_PCO_TTIME_SHIFT 1 +#define HT_CAP_EXT_MCS_FEEDBACK_MASK 0x0300 +#define HT_CAP_EXT_MCS_FEEDBACK_SHIFT 8 +#define HT_CAP_EXT_HTC 0x0400 +#define HT_CAP_EXT_RD_RESP 0x0800 + +BWL_PRE_PACKED_STRUCT struct ht_add_ie { + uint8 ctl_ch; + uint8 byte1; + uint16 opmode; + uint16 misc_bits; + uint8 basic_mcs[MCSSET_LEN]; +} BWL_POST_PACKED_STRUCT; +typedef struct ht_add_ie ht_add_ie_t; + + + +BWL_PRE_PACKED_STRUCT struct ht_prop_add_ie { + uint8 id; + uint8 len; + uint8 oui[3]; + uint8 type; + ht_add_ie_t add_ie; +} BWL_POST_PACKED_STRUCT; +typedef struct ht_prop_add_ie ht_prop_add_ie_t; + +#define HT_ADD_IE_LEN 22 +#define HT_ADD_IE_TYPE 52 + + +#define HT_BW_ANY 0x04 +#define HT_RIFS_PERMITTED 0x08 + + +#define HT_OPMODE_MASK 0x0003 +#define HT_OPMODE_SHIFT 0 +#define HT_OPMODE_PURE 0x0000 +#define HT_OPMODE_OPTIONAL 0x0001 +#define HT_OPMODE_HT20IN40 0x0002 +#define HT_OPMODE_MIXED 0x0003 +#define HT_OPMODE_NONGF 0x0004 +#define DOT11N_TXBURST 0x0008 +#define DOT11N_OBSS_NONHT 0x0010 + + +#define HT_BASIC_STBC_MCS 0x007f +#define HT_DUAL_STBC_PROT 0x0080 +#define HT_SECOND_BCN 0x0100 +#define HT_LSIG_TXOP 0x0200 +#define HT_PCO_ACTIVE 0x0400 +#define HT_PCO_PHASE 0x0800 +#define HT_DUALCTS_PROTECTION 0x0080 + + +#define DOT11N_2G_TXBURST_LIMIT 6160 +#define DOT11N_5G_TXBURST_LIMIT 3080 + + +#define GET_HT_OPMODE(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ + >> HT_OPMODE_SHIFT) +#define HT_MIXEDMODE_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ + == HT_OPMODE_MIXED) +#define HT_HT20_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ + == HT_OPMODE_HT20IN40) +#define HT_OPTIONAL_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ + == HT_OPMODE_OPTIONAL) +#define HT_USE_PROTECTION(add_ie) (HT_HT20_PRESENT((add_ie)) || \ + HT_MIXEDMODE_PRESENT((add_ie))) +#define HT_NONGF_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_NONGF) \ + == HT_OPMODE_NONGF) +#define DOT11N_TXBURST_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_TXBURST) \ + == DOT11N_TXBURST) +#define DOT11N_OBSS_NONHT_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_OBSS_NONHT) \ + == DOT11N_OBSS_NONHT) + +BWL_PRE_PACKED_STRUCT struct obss_params { + uint16 passive_dwell; + uint16 active_dwell; + uint16 bss_widthscan_interval; + uint16 passive_total; + uint16 active_total; + uint16 chanwidth_transition_dly; + uint16 activity_threshold; +} BWL_POST_PACKED_STRUCT; +typedef struct obss_params obss_params_t; + +BWL_PRE_PACKED_STRUCT struct dot11_obss_ie { + uint8 id; + uint8 len; + obss_params_t obss_params; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_obss_ie dot11_obss_ie_t; +#define DOT11_OBSS_SCAN_IE_LEN sizeof(obss_params_t) + + +#define HT_CTRL_LA_TRQ 0x00000002 +#define HT_CTRL_LA_MAI 0x0000003C +#define HT_CTRL_LA_MAI_SHIFT 2 +#define HT_CTRL_LA_MAI_MRQ 0x00000004 +#define HT_CTRL_LA_MAI_MSI 0x00000038 +#define HT_CTRL_LA_MFSI 0x000001C0 +#define HT_CTRL_LA_MFSI_SHIFT 6 +#define HT_CTRL_LA_MFB_ASELC 0x0000FE00 +#define HT_CTRL_LA_MFB_ASELC_SH 9 +#define HT_CTRL_LA_ASELC_CMD 0x00000C00 +#define HT_CTRL_LA_ASELC_DATA 0x0000F000 +#define HT_CTRL_CAL_POS 0x00030000 +#define HT_CTRL_CAL_SEQ 0x000C0000 +#define HT_CTRL_CSI_STEERING 0x00C00000 +#define HT_CTRL_CSI_STEER_SHIFT 22 +#define HT_CTRL_CSI_STEER_NFB 0 +#define HT_CTRL_CSI_STEER_CSI 1 +#define HT_CTRL_CSI_STEER_NCOM 2 +#define HT_CTRL_CSI_STEER_COM 3 +#define HT_CTRL_NDP_ANNOUNCE 0x01000000 +#define HT_CTRL_AC_CONSTRAINT 0x40000000 +#define HT_CTRL_RDG_MOREPPDU 0x80000000 + +#define HT_OPMODE_OPTIONAL 0x0001 +#define HT_OPMODE_HT20IN40 0x0002 +#define HT_OPMODE_MIXED 0x0003 +#define HT_OPMODE_NONGF 0x0004 +#define DOT11N_TXBURST 0x0008 +#define DOT11N_OBSS_NONHT 0x0010 + + + +BWL_PRE_PACKED_STRUCT struct vht_cap_ie { + uint32 vht_cap_info; + + uint16 rx_mcs_map; + uint16 rx_max_rate; + uint16 tx_mcs_map; + uint16 tx_max_rate; +} BWL_POST_PACKED_STRUCT; +typedef struct vht_cap_ie vht_cap_ie_t; + +#define VHT_CAP_IE_LEN 12 + +#define VHT_CAP_INFO_MAX_MPDU_LEN_MASK 0x00000003 +#define VHT_CAP_INFO_SUPP_CHAN_WIDTH_MASK 0x0000000c +#define VHT_CAP_INFO_LDPC 0x00000010 +#define VHT_CAP_INFO_SGI_80MHZ 0x00000020 +#define VHT_CAP_INFO_SGI_160MHZ 0x00000040 +#define VHT_CAP_INFO_TX_STBC 0x00000080 + +#define VHT_CAP_INFO_RX_STBC_MASK 0x00000700 +#define VHT_CAP_INFO_RX_STBC_SHIFT 8 +#define VHT_CAP_INFO_SU_BEAMFMR 0x00000800 +#define VHT_CAP_INFO_SU_BEAMFMEE 0x00001000 +#define VHT_CAP_INFO_NUM_BMFMR_ANT_MASK 0x0000e000 +#define VHT_CAP_INFO_NUM_BMFMR_ANT_SHIFT 13 + +#define VHT_CAP_INFO_NUM_SOUNDING_DIM_MASK 0x00070000 +#define VHT_CAP_INFO_NUM_SOUNDING_DIM_SHIFT 16 +#define VHT_CAP_INFO_MU_BEAMFMR 0x00080000 +#define VHT_CAP_INFO_MU_BEAMFMEE 0x00100000 +#define VHT_CAP_INFO_TXOPPS 0x00200000 +#define VHT_CAP_INFO_HTCVHT 0x00400000 +#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_MASK 0x03800000 +#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_SHIFT 23 + +#define VHT_CAP_INFO_LINK_ADAPT_CAP_MASK 0x0c000000 +#define VHT_CAP_INFO_LINK_ADAPT_CAP_SHIFT 26 + + +#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_MASK 0x1fff +#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_SHIFT 0 + +#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_MASK 0x1fff +#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_SHIFT 0 + +#define VHT_CAP_MCS_MAP_0_7 0 +#define VHT_CAP_MCS_MAP_0_8 1 +#define VHT_CAP_MCS_MAP_0_9 2 +#define VHT_CAP_MCS_MAP_NONE 3 + +#define VHT_CAP_MCS_MAP_NSS_MAX 8 + + +typedef enum vht_cap_chan_width { + VHT_CAP_CHAN_WIDTH_20_40 = 0x00, + VHT_CAP_CHAN_WIDTH_80 = 0x04, + VHT_CAP_CHAN_WIDTH_160 = 0x08 +} vht_cap_chan_width_t; + + +typedef enum vht_cap_max_mpdu_len { + VHT_CAP_MPDU_MAX_4K = 0x00, + VHT_CAP_MPDU_MAX_8K = 0x01, + VHT_CAP_MPDU_MAX_11K = 0x02 +} vht_cap_max_mpdu_len_t; + + +BWL_PRE_PACKED_STRUCT struct vht_op_ie { + uint8 chan_width; + uint8 chan1; + uint8 chan2; + uint16 supp_mcs; +} BWL_POST_PACKED_STRUCT; +typedef struct vht_op_ie vht_op_ie_t; + +#define VHT_OP_IE_LEN 5 + +typedef enum vht_op_chan_width { + VHT_OP_CHAN_WIDTH_20_40 = 0, + VHT_OP_CHAN_WIDTH_80 = 1, + VHT_OP_CHAN_WIDTH_160 = 2, + VHT_OP_CHAN_WIDTH_80_80 = 3 +} vht_op_chan_width_t; + + +#define VHT_MCS_MAP_GET_SS_IDX(numSpatialStreams) ((numSpatialStreams-1)*2) +#define VHT_MCS_MAP_GET_MCS_PER_SS(numSpatialStreams, mcsMap) \ + ((mcsMap >> VHT_MCS_MAP_GET_SS_IDX(numSpatialStreams)) & 0x3) +#define VHT_MCS_MAP_SET_MCS_PER_SS(numSpatialStreams, numMcs, mcsMap) \ + (mcsMap |= ((numMcs & 0x3) << VHT_MCS_MAP_GET_SS_IDX(numSpatialStreams))) + + +#define WPA_OUI "\x00\x50\xF2" +#define WPA_OUI_LEN 3 +#define WPA_OUI_TYPE 1 +#define WPA_VERSION 1 +#define WPA2_OUI "\x00\x0F\xAC" +#define WPA2_OUI_LEN 3 +#define WPA2_VERSION 1 +#define WPA2_VERSION_LEN 2 + + +#define WPS_OUI "\x00\x50\xF2" +#define WPS_OUI_LEN 3 +#define WPS_OUI_TYPE 4 + + + +#ifdef P2P_IE_OVRD +#define WFA_OUI MAC_OUI +#else +#define WFA_OUI "\x50\x6F\x9A" +#endif +#define WFA_OUI_LEN 3 +#ifdef P2P_IE_OVRD +#define WFA_OUI_TYPE_P2P MAC_OUI_TYPE_P2P +#else +#define WFA_OUI_TYPE_P2P 9 +#endif + +#define WFA_OUI_TYPE_TPC 8 + + +#define RSN_AKM_NONE 0 +#define RSN_AKM_UNSPECIFIED 1 +#define RSN_AKM_PSK 2 +#define RSN_AKM_FBT_1X 3 +#define RSN_AKM_FBT_PSK 4 +#define RSN_AKM_MFP_1X 5 +#define RSN_AKM_MFP_PSK 6 +#define RSN_AKM_TPK 7 + + +#define DOT11_MAX_DEFAULT_KEYS 4 +#define DOT11_MAX_KEY_SIZE 32 +#define DOT11_MAX_IV_SIZE 16 +#define DOT11_EXT_IV_FLAG (1<<5) +#define DOT11_WPA_KEY_RSC_LEN 8 + +#define WEP1_KEY_SIZE 5 +#define WEP1_KEY_HEX_SIZE 10 +#define WEP128_KEY_SIZE 13 +#define WEP128_KEY_HEX_SIZE 26 +#define TKIP_MIC_SIZE 8 +#define TKIP_EOM_SIZE 7 +#define TKIP_EOM_FLAG 0x5a +#define TKIP_KEY_SIZE 32 +#define TKIP_MIC_AUTH_TX 16 +#define TKIP_MIC_AUTH_RX 24 +#define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX +#define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX +#define AES_KEY_SIZE 16 +#define AES_MIC_SIZE 8 +#define BIP_KEY_SIZE 16 + + +#define WCN_OUI "\x00\x50\xf2" +#define WCN_TYPE 4 + +#ifdef BCMWAPI_WPI +#define SMS4_KEY_LEN 16 +#define SMS4_WPI_CBC_MAC_LEN 16 +#endif + + + + +BWL_PRE_PACKED_STRUCT struct dot11_mdid_ie { + uint8 id; + uint8 len; + uint16 mdid; + uint8 cap; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_mdid_ie dot11_mdid_ie_t; + +#define FBT_MDID_CAP_OVERDS 0x01 +#define FBT_MDID_CAP_RRP 0x02 + + +BWL_PRE_PACKED_STRUCT struct dot11_ft_ie { + uint8 id; + uint8 len; + uint16 mic_control; + uint8 mic[16]; + uint8 anonce[32]; + uint8 snonce[32]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_ft_ie dot11_ft_ie_t; + +#define TIE_TYPE_RESERVED 0 +#define TIE_TYPE_REASSOC_DEADLINE 1 +#define TIE_TYPE_KEY_LIEFTIME 2 +#define TIE_TYPE_ASSOC_COMEBACK 3 +BWL_PRE_PACKED_STRUCT struct dot11_timeout_ie { + uint8 id; + uint8 len; + uint8 type; + uint32 value; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_timeout_ie dot11_timeout_ie_t; + + +BWL_PRE_PACKED_STRUCT struct dot11_gtk_ie { + uint8 id; + uint8 len; + uint16 key_info; + uint8 key_len; + uint8 rsc[8]; + uint8 data[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_gtk_ie dot11_gtk_ie_t; + +#define BSSID_INVALID "\x00\x00\x00\x00\x00\x00" +#define BSSID_BROADCAST "\xFF\xFF\xFF\xFF\xFF\xFF" + +#ifdef BCMWAPI_WAI +#define WAPI_IE_MIN_LEN 20 +#define WAPI_VERSION 1 +#define WAPI_VERSION_LEN 2 +#define WAPI_OUI "\x00\x14\x72" +#define WAPI_OUI_LEN DOT11_OUI_LEN +#endif + + +#define WMM_OUI "\x00\x50\xF2" +#define WMM_OUI_LEN 3 +#define WMM_OUI_TYPE 2 +#define WMM_VERSION 1 +#define WMM_VERSION_LEN 1 + + +#define WMM_OUI_SUBTYPE_PARAMETER 1 +#define WMM_PARAMETER_IE_LEN 24 + + +BWL_PRE_PACKED_STRUCT struct link_id_ie { + uint8 id; + uint8 len; + struct ether_addr bssid; + struct ether_addr tdls_init_mac; + struct ether_addr tdls_resp_mac; +} BWL_POST_PACKED_STRUCT; +typedef struct link_id_ie link_id_ie_t; +#define TDLS_LINK_ID_IE_LEN 18 + + +BWL_PRE_PACKED_STRUCT struct wakeup_sch_ie { + uint8 id; + uint8 len; + uint32 offset; + uint32 interval; + uint32 awake_win_slots; + uint32 max_wake_win; + uint16 idle_cnt; +} BWL_POST_PACKED_STRUCT; +typedef struct wakeup_sch_ie wakeup_sch_ie_t; +#define TDLS_WAKEUP_SCH_IE_LEN 18 + + +BWL_PRE_PACKED_STRUCT struct channel_switch_timing_ie { + uint8 id; + uint8 len; + uint16 switch_time; + uint16 switch_timeout; +} BWL_POST_PACKED_STRUCT; +typedef struct channel_switch_timing_ie channel_switch_timing_ie_t; +#define TDLS_CHANNEL_SWITCH_TIMING_IE_LEN 4 + + +BWL_PRE_PACKED_STRUCT struct pti_control_ie { + uint8 id; + uint8 len; + uint8 tid; + uint16 seq_control; +} BWL_POST_PACKED_STRUCT; +typedef struct pti_control_ie pti_control_ie_t; +#define TDLS_PTI_CONTROL_IE_LEN 3 + + +BWL_PRE_PACKED_STRUCT struct pu_buffer_status_ie { + uint8 id; + uint8 len; + uint8 status; +} BWL_POST_PACKED_STRUCT; +typedef struct pu_buffer_status_ie pu_buffer_status_ie_t; +#define TDLS_PU_BUFFER_STATUS_IE_LEN 1 +#define TDLS_PU_BUFFER_STATUS_AC_BK 1 +#define TDLS_PU_BUFFER_STATUS_AC_BE 2 +#define TDLS_PU_BUFFER_STATUS_AC_VI 4 +#define TDLS_PU_BUFFER_STATUS_AC_VO 8 + + +#include <packed_section_end.h> + +#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h b/drivers/net/wireless/bcmdhd/src/include/proto/802.11_bta.h index 3ee5a74..ba790b8 100755 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11_bta.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/802.11_bta.h @@ -1,14 +1,14 @@ /* * BT-AMP (BlueTooth Alternate Mac and Phy) 802.11 PAL (Protocol Adaptation Layer) * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.11e.h b/drivers/net/wireless/bcmdhd/src/include/proto/802.11e.h index c837f57..a053d61 100755 --- a/drivers/net/wireless/bcmdhd/include/proto/802.11e.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/802.11e.h @@ -1,14 +1,14 @@ /* * 802.11e protocol header file * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -117,12 +117,6 @@ typedef BWL_PRE_PACKED_STRUCT struct tspec { #define DOT11E_STATUS_ADDTS_INVALID_PARAM 1 /* TSPEC invalid parameter status */ #define DOT11E_STATUS_ADDTS_REFUSED_NSBW 3 /* ADDTS refused (non-sufficient BW) */ #define DOT11E_STATUS_ADDTS_REFUSED_AWHILE 47 /* ADDTS refused but could retry later */ -#ifdef BCMCCX -#define CCX_STATUS_ASSOC_DENIED_UNKNOWN 0xc8 /* unspecified QoS related failure */ -#define CCX_STATUS_ASSOC_DENIED_AP_POLICY 0xc9 /* TSPEC refused due to AP policy */ -#define CCX_STATUS_ASSOC_DENIED_NO_BW 0xca /* Assoc denied due to AP insufficient BW */ -#define CCX_STATUS_ASSOC_DENIED_BAD_PARAM 0xcb /* one or more TSPEC with invalid parameter */ -#endif /* BCMCCX */ /* 802.11e DELTS status code */ #define DOT11E_STATUS_QSTA_LEAVE_QBSS 36 /* STA leave QBSS */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/802.1d.h b/drivers/net/wireless/bcmdhd/src/include/proto/802.1d.h index 116a226..94b5627 100755 --- a/drivers/net/wireless/bcmdhd/include/proto/802.1d.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/802.1d.h @@ -1,12 +1,12 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -14,7 +14,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -28,21 +28,21 @@ #define _802_1_D_ -#define PRIO_8021D_NONE 2 -#define PRIO_8021D_BK 1 -#define PRIO_8021D_BE 0 -#define PRIO_8021D_EE 3 -#define PRIO_8021D_CL 4 -#define PRIO_8021D_VI 5 -#define PRIO_8021D_VO 6 -#define PRIO_8021D_NC 7 -#define MAXPRIO 7 +#define PRIO_8021D_NONE 2 +#define PRIO_8021D_BK 1 +#define PRIO_8021D_BE 0 +#define PRIO_8021D_EE 3 +#define PRIO_8021D_CL 4 +#define PRIO_8021D_VI 5 +#define PRIO_8021D_VO 6 +#define PRIO_8021D_NC 7 +#define MAXPRIO 7 #define NUMPRIO (MAXPRIO + 1) -#define ALLPRIO -1 +#define ALLPRIO -1 #define PRIO2PREC(prio) \ (((prio) == PRIO_8021D_NONE || (prio) == PRIO_8021D_BE) ? ((prio^2)) : (prio)) -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h b/drivers/net/wireless/bcmdhd/src/include/proto/bcmeth.h index e54b2e3..5207d30 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmeth.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/bcmeth.h @@ -1,14 +1,14 @@ /* * Broadcom Ethernettype protocol definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -67,11 +67,11 @@ typedef BWL_PRE_PACKED_STRUCT struct bcmeth_hdr { - uint16 subtype; + uint16 subtype; uint16 length; - uint8 version; - uint8 oui[3]; - + uint8 version; + uint8 oui[3]; + uint16 usr_subtype; } BWL_POST_PACKED_STRUCT bcmeth_hdr_t; @@ -79,4 +79,4 @@ typedef BWL_PRE_PACKED_STRUCT struct bcmeth_hdr #include <packed_section_end.h> -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/src/include/proto/bcmevent.h b/drivers/net/wireless/bcmdhd/src/include/proto/bcmevent.h new file mode 100644 index 0000000..a9680a4 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/proto/bcmevent.h @@ -0,0 +1,311 @@ +/* + * Broadcom Event protocol definitions + * + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * Dependencies: proto/bcmeth.h + * + * $Id: bcmevent.h 294352 2011-11-06 19:23:00Z $ + * + */ + +#ifndef _BCMEVENT_H_ +#define _BCMEVENT_H_ + +#ifndef _TYPEDEFS_H_ +#include <typedefs.h> +#endif + +#include <packed_section_start.h> + +#define BCM_EVENT_MSG_VERSION 2 +#define BCM_MSG_IFNAME_MAX 16 + + +#define WLC_EVENT_MSG_LINK 0x01 +#define WLC_EVENT_MSG_FLUSHTXQ 0x02 +#define WLC_EVENT_MSG_GROUP 0x04 +#define WLC_EVENT_MSG_UNKBSS 0x08 +#define WLC_EVENT_MSG_UNKIF 0x10 + +typedef BWL_PRE_PACKED_STRUCT struct +{ + uint16 version; + uint16 flags; + uint32 event_type; + uint32 status; + uint32 reason; + uint32 auth_type; + uint32 datalen; + struct ether_addr addr; + char ifname[BCM_MSG_IFNAME_MAX]; +} BWL_POST_PACKED_STRUCT wl_event_msg_v1_t; + + +typedef BWL_PRE_PACKED_STRUCT struct +{ + uint16 version; + uint16 flags; + uint32 event_type; + uint32 status; + uint32 reason; + uint32 auth_type; + uint32 datalen; + struct ether_addr addr; + char ifname[BCM_MSG_IFNAME_MAX]; + uint8 ifidx; + uint8 bsscfgidx; +} BWL_POST_PACKED_STRUCT wl_event_msg_t; + + +typedef BWL_PRE_PACKED_STRUCT struct bcm_event { + struct ether_header eth; + bcmeth_hdr_t bcm_hdr; + wl_event_msg_t event; +} BWL_POST_PACKED_STRUCT bcm_event_t; + +#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header)) + + +#define WLC_E_SET_SSID 0 +#define WLC_E_JOIN 1 +#define WLC_E_START 2 +#define WLC_E_AUTH 3 +#define WLC_E_AUTH_IND 4 +#define WLC_E_DEAUTH 5 +#define WLC_E_DEAUTH_IND 6 +#define WLC_E_ASSOC 7 +#define WLC_E_ASSOC_IND 8 +#define WLC_E_REASSOC 9 +#define WLC_E_REASSOC_IND 10 +#define WLC_E_DISASSOC 11 +#define WLC_E_DISASSOC_IND 12 +#define WLC_E_QUIET_START 13 +#define WLC_E_QUIET_END 14 +#define WLC_E_BEACON_RX 15 +#define WLC_E_LINK 16 +#define WLC_E_MIC_ERROR 17 +#define WLC_E_NDIS_LINK 18 +#define WLC_E_ROAM 19 +#define WLC_E_TXFAIL 20 +#define WLC_E_PMKID_CACHE 21 +#define WLC_E_RETROGRADE_TSF 22 +#define WLC_E_PRUNE 23 +#define WLC_E_AUTOAUTH 24 +#define WLC_E_EAPOL_MSG 25 +#define WLC_E_SCAN_COMPLETE 26 +#define WLC_E_ADDTS_IND 27 +#define WLC_E_DELTS_IND 28 +#define WLC_E_BCNSENT_IND 29 +#define WLC_E_BCNRX_MSG 30 +#define WLC_E_BCNLOST_MSG 31 +#define WLC_E_ROAM_PREP 32 +#define WLC_E_PFN_NET_FOUND 33 +#define WLC_E_PFN_NET_LOST 34 +#define WLC_E_RESET_COMPLETE 35 +#define WLC_E_JOIN_START 36 +#define WLC_E_ROAM_START 37 +#define WLC_E_ASSOC_START 38 +#define WLC_E_IBSS_ASSOC 39 +#define WLC_E_RADIO 40 +#define WLC_E_PSM_WATCHDOG 41 +#define WLC_E_PROBREQ_MSG 44 +#define WLC_E_SCAN_CONFIRM_IND 45 +#define WLC_E_PSK_SUP 46 +#define WLC_E_COUNTRY_CODE_CHANGED 47 +#define WLC_E_EXCEEDED_MEDIUM_TIME 48 +#define WLC_E_ICV_ERROR 49 +#define WLC_E_UNICAST_DECODE_ERROR 50 +#define WLC_E_MULTICAST_DECODE_ERROR 51 +#define WLC_E_TRACE 52 +#ifdef WLBTAMP +#define WLC_E_BTA_HCI_EVENT 53 +#endif +#define WLC_E_IF 54 +#define WLC_E_P2P_DISC_LISTEN_COMPLETE 55 +#define WLC_E_RSSI 56 +#define WLC_E_PFN_SCAN_COMPLETE 57 +#define WLC_E_EXTLOG_MSG 58 +#define WLC_E_ACTION_FRAME 59 +#define WLC_E_ACTION_FRAME_COMPLETE 60 +#define WLC_E_PRE_ASSOC_IND 61 +#define WLC_E_PRE_REASSOC_IND 62 +#define WLC_E_CHANNEL_ADOPTED 63 +#define WLC_E_AP_STARTED 64 +#define WLC_E_DFS_AP_STOP 65 +#define WLC_E_DFS_AP_RESUME 66 +#define WLC_E_WAI_STA_EVENT 67 +#define WLC_E_WAI_MSG 68 +#define WLC_E_ESCAN_RESULT 69 +#define WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE 70 +#define WLC_E_PROBRESP_MSG 71 +#define WLC_E_P2P_PROBREQ_MSG 72 +#define WLC_E_DCS_REQUEST 73 + +#define WLC_E_FIFO_CREDIT_MAP 74 + +#define WLC_E_ACTION_FRAME_RX 75 +#define WLC_E_WAKE_EVENT 76 +#define WLC_E_RM_COMPLETE 77 +#define WLC_E_HTSFSYNC 78 +#define WLC_E_OVERLAY_REQ 79 +#define WLC_E_CSA_COMPLETE_IND 80 +#define WLC_E_EXCESS_PM_WAKE_EVENT 81 +#define WLC_E_PFN_SCAN_NONE 82 +#define WLC_E_PFN_SCAN_ALLGONE 83 +#define WLC_E_GTK_PLUMBED 84 +#define WLC_E_ASSOC_IND_NDIS 85 +#define WLC_E_REASSOC_IND_NDIS 86 +#define WLC_E_ASSOC_REQ_IE 87 +#define WLC_E_ASSOC_RESP_IE 88 +#define WLC_E_ASSOC_RECREATED 89 +#define WLC_E_ACTION_FRAME_RX_NDIS 90 +#define WLC_E_AUTH_REQ 91 +#define WLC_E_LAST 92 + + +typedef struct { + uint event; + const char *name; +} bcmevent_name_t; + +extern const bcmevent_name_t bcmevent_names[]; +extern const int bcmevent_names_size; + + +#define WLC_E_STATUS_SUCCESS 0 +#define WLC_E_STATUS_FAIL 1 +#define WLC_E_STATUS_TIMEOUT 2 +#define WLC_E_STATUS_NO_NETWORKS 3 +#define WLC_E_STATUS_ABORT 4 +#define WLC_E_STATUS_NO_ACK 5 +#define WLC_E_STATUS_UNSOLICITED 6 +#define WLC_E_STATUS_ATTEMPT 7 +#define WLC_E_STATUS_PARTIAL 8 +#define WLC_E_STATUS_NEWSCAN 9 +#define WLC_E_STATUS_NEWASSOC 10 +#define WLC_E_STATUS_11HQUIET 11 +#define WLC_E_STATUS_SUPPRESS 12 +#define WLC_E_STATUS_NOCHANS 13 +#define WLC_E_STATUS_CS_ABORT 15 +#define WLC_E_STATUS_ERROR 16 + + +#define WLC_E_REASON_INITIAL_ASSOC 0 +#define WLC_E_REASON_LOW_RSSI 1 +#define WLC_E_REASON_DEAUTH 2 +#define WLC_E_REASON_DISASSOC 3 +#define WLC_E_REASON_BCNS_LOST 4 +#define WLC_E_REASON_MINTXRATE 9 +#define WLC_E_REASON_TXFAIL 10 + + +#define WLC_E_REASON_FAST_ROAM_FAILED 5 +#define WLC_E_REASON_DIRECTED_ROAM 6 +#define WLC_E_REASON_TSPEC_REJECTED 7 +#define WLC_E_REASON_BETTER_AP 8 + +#define WLC_E_REASON_REQUESTED_ROAM 11 + + +#define WLC_E_PRUNE_ENCR_MISMATCH 1 +#define WLC_E_PRUNE_BCAST_BSSID 2 +#define WLC_E_PRUNE_MAC_DENY 3 +#define WLC_E_PRUNE_MAC_NA 4 +#define WLC_E_PRUNE_REG_PASSV 5 +#define WLC_E_PRUNE_SPCT_MGMT 6 +#define WLC_E_PRUNE_RADAR 7 +#define WLC_E_RSN_MISMATCH 8 +#define WLC_E_PRUNE_NO_COMMON_RATES 9 +#define WLC_E_PRUNE_BASIC_RATES 10 +#define WLC_E_PRUNE_CIPHER_NA 12 +#define WLC_E_PRUNE_KNOWN_STA 13 +#define WLC_E_PRUNE_WDS_PEER 15 +#define WLC_E_PRUNE_QBSS_LOAD 16 +#define WLC_E_PRUNE_HOME_AP 17 + + +#define WLC_E_SUP_OTHER 0 +#define WLC_E_SUP_DECRYPT_KEY_DATA 1 +#define WLC_E_SUP_BAD_UCAST_WEP128 2 +#define WLC_E_SUP_BAD_UCAST_WEP40 3 +#define WLC_E_SUP_UNSUP_KEY_LEN 4 +#define WLC_E_SUP_PW_KEY_CIPHER 5 +#define WLC_E_SUP_MSG3_TOO_MANY_IE 6 +#define WLC_E_SUP_MSG3_IE_MISMATCH 7 +#define WLC_E_SUP_NO_INSTALL_FLAG 8 +#define WLC_E_SUP_MSG3_NO_GTK 9 +#define WLC_E_SUP_GRP_KEY_CIPHER 10 +#define WLC_E_SUP_GRP_MSG1_NO_GTK 11 +#define WLC_E_SUP_GTK_DECRYPT_FAIL 12 +#define WLC_E_SUP_SEND_FAIL 13 +#define WLC_E_SUP_DEAUTH 14 +#define WLC_E_SUP_WPA_PSK_TMO 15 + +typedef BWL_PRE_PACKED_STRUCT struct wl_event_rx_frame_data { + uint16 version; + uint16 channel; + int32 rssi; + uint32 mactime; + uint32 rate; +} BWL_POST_PACKED_STRUCT wl_event_rx_frame_data_t; + +#define BCM_RX_FRAME_DATA_VERSION 1 + + +typedef struct wl_event_data_if { + uint8 ifidx; + uint8 opcode; + uint8 reserved; + uint8 bssidx; + uint8 role; +} wl_event_data_if_t; + + +#define WLC_E_IF_ADD 1 +#define WLC_E_IF_DEL 2 +#define WLC_E_IF_CHANGE 3 + + +#define WLC_E_IF_ROLE_STA 0 +#define WLC_E_IF_ROLE_AP 1 +#define WLC_E_IF_ROLE_WDS 2 +#define WLC_E_IF_ROLE_P2P_GO 3 +#define WLC_E_IF_ROLE_P2P_CLIENT 4 +#ifdef WLBTAMP +#define WLC_E_IF_ROLE_BTA_CREATOR 5 +#define WLC_E_IF_ROLE_BTA_ACCEPTOR 6 +#endif + + +#define WLC_E_LINK_BCN_LOSS 1 +#define WLC_E_LINK_DISASSOC 2 +#define WLC_E_LINK_ASSOC_REC 3 +#define WLC_E_LINK_BSSCFG_DIS 4 + + +#define WLC_E_OVL_DOWNLOAD 0 +#define WLC_E_OVL_UPDATE_IND 1 + + +#include <packed_section_end.h> + +#endif /* _BCMEVENT_H_ */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/bcmip.h b/drivers/net/wireless/bcmdhd/src/include/proto/bcmip.h index d5c3b76..bdc902b 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bcmip.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/bcmip.h @@ -1,12 +1,12 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -14,7 +14,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -36,40 +36,40 @@ -#define IP_VER_OFFSET 0x0 -#define IP_VER_MASK 0xf0 -#define IP_VER_SHIFT 4 -#define IP_VER_4 4 -#define IP_VER_6 6 +#define IP_VER_OFFSET 0x0 +#define IP_VER_MASK 0xf0 +#define IP_VER_SHIFT 4 +#define IP_VER_4 4 +#define IP_VER_6 6 #define IP_VER(ip_body) \ ((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT) -#define IP_PROT_ICMP 0x1 -#define IP_PROT_IGMP 0x2 -#define IP_PROT_TCP 0x6 -#define IP_PROT_UDP 0x11 -#define IP_PROT_ICMP6 0x3a +#define IP_PROT_ICMP 0x1 +#define IP_PROT_IGMP 0x2 +#define IP_PROT_TCP 0x6 +#define IP_PROT_UDP 0x11 +#define IP_PROT_ICMP6 0x3a -#define IPV4_VER_HL_OFFSET 0 -#define IPV4_TOS_OFFSET 1 -#define IPV4_PKTLEN_OFFSET 2 -#define IPV4_PKTFLAG_OFFSET 6 -#define IPV4_PROT_OFFSET 9 -#define IPV4_CHKSUM_OFFSET 10 -#define IPV4_SRC_IP_OFFSET 12 -#define IPV4_DEST_IP_OFFSET 16 -#define IPV4_OPTIONS_OFFSET 20 +#define IPV4_VER_HL_OFFSET 0 +#define IPV4_TOS_OFFSET 1 +#define IPV4_PKTLEN_OFFSET 2 +#define IPV4_PKTFLAG_OFFSET 6 +#define IPV4_PROT_OFFSET 9 +#define IPV4_CHKSUM_OFFSET 10 +#define IPV4_SRC_IP_OFFSET 12 +#define IPV4_DEST_IP_OFFSET 16 +#define IPV4_OPTIONS_OFFSET 20 -#define IPV4_VER_MASK 0xf0 -#define IPV4_VER_SHIFT 4 +#define IPV4_VER_MASK 0xf0 +#define IPV4_VER_SHIFT 4 -#define IPV4_HLEN_MASK 0x0f +#define IPV4_HLEN_MASK 0x0f #define IPV4_HLEN(ipv4_body) (4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK)) -#define IPV4_ADDR_LEN 4 +#define IPV4_ADDR_LEN 4 #define IPV4_ADDR_NULL(a) ((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \ ((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0) @@ -77,26 +77,26 @@ #define IPV4_ADDR_BCAST(a) ((((uint8 *)(a))[0] & ((uint8 *)(a))[1] & \ ((uint8 *)(a))[2] & ((uint8 *)(a))[3]) == 0xff) -#define IPV4_TOS_DSCP_MASK 0xfc -#define IPV4_TOS_DSCP_SHIFT 2 +#define IPV4_TOS_DSCP_MASK 0xfc +#define IPV4_TOS_DSCP_SHIFT 2 #define IPV4_TOS(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET]) -#define IPV4_TOS_PREC_MASK 0xe0 -#define IPV4_TOS_PREC_SHIFT 5 +#define IPV4_TOS_PREC_MASK 0xe0 +#define IPV4_TOS_PREC_SHIFT 5 -#define IPV4_TOS_LOWDELAY 0x10 -#define IPV4_TOS_THROUGHPUT 0x8 -#define IPV4_TOS_RELIABILITY 0x4 +#define IPV4_TOS_LOWDELAY 0x10 +#define IPV4_TOS_THROUGHPUT 0x8 +#define IPV4_TOS_RELIABILITY 0x4 #define IPV4_PROT(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET]) -#define IPV4_FRAG_RESV 0x8000 -#define IPV4_FRAG_DONT 0x4000 -#define IPV4_FRAG_MORE 0x2000 -#define IPV4_FRAG_OFFSET_MASK 0x1fff +#define IPV4_FRAG_RESV 0x8000 +#define IPV4_FRAG_DONT 0x4000 +#define IPV4_FRAG_MORE 0x2000 +#define IPV4_FRAG_OFFSET_MASK 0x1fff -#define IPV4_ADDR_STR_LEN 16 +#define IPV4_ADDR_STR_LEN 16 BWL_PRE_PACKED_STRUCT struct ipv4_addr { @@ -104,24 +104,24 @@ BWL_PRE_PACKED_STRUCT struct ipv4_addr { } BWL_POST_PACKED_STRUCT; BWL_PRE_PACKED_STRUCT struct ipv4_hdr { - uint8 version_ihl; - uint8 tos; - uint16 tot_len; + uint8 version_ihl; + uint8 tos; + uint16 tot_len; uint16 id; - uint16 frag; - uint8 ttl; - uint8 prot; - uint16 hdr_chksum; - uint8 src_ip[IPV4_ADDR_LEN]; - uint8 dst_ip[IPV4_ADDR_LEN]; + uint16 frag; + uint8 ttl; + uint8 prot; + uint16 hdr_chksum; + uint8 src_ip[IPV4_ADDR_LEN]; + uint8 dst_ip[IPV4_ADDR_LEN]; } BWL_POST_PACKED_STRUCT; -#define IPV6_PAYLOAD_LEN_OFFSET 4 -#define IPV6_NEXT_HDR_OFFSET 6 -#define IPV6_HOP_LIMIT_OFFSET 7 -#define IPV6_SRC_IP_OFFSET 8 -#define IPV6_DEST_IP_OFFSET 24 +#define IPV6_PAYLOAD_LEN_OFFSET 4 +#define IPV6_NEXT_HDR_OFFSET 6 +#define IPV6_HOP_LIMIT_OFFSET 7 +#define IPV6_SRC_IP_OFFSET 8 +#define IPV6_DEST_IP_OFFSET 24 #define IPV6_TRAFFIC_CLASS(ipv6_body) \ @@ -142,7 +142,7 @@ BWL_PRE_PACKED_STRUCT struct ipv4_hdr { #define IPV6_PROT(ipv6_body) IPV6_NEXT_HDR(ipv6_body) -#define IPV6_ADDR_LEN 16 +#define IPV6_ADDR_LEN 16 #define IP_TOS46(ip_body) \ @@ -164,7 +164,7 @@ BWL_PRE_PACKED_STRUCT struct ipv4_hdr { ((prot) == IPV6_EXTHDR_NONE) || \ ((prot) == IPV6_EXTHDR_DEST)) -#define IPV6_MIN_HLEN 40 +#define IPV6_MIN_HLEN 40 #define IPV6_EXTHDR_LEN(eh) ((((struct ipv6_exthdr *)(eh))->hdrlen + 1) << 3) @@ -207,4 +207,4 @@ ipv6_exthdr_len(uint8 *h, uint8 *proto) #include <packed_section_end.h> -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h b/drivers/net/wireless/bcmdhd/src/include/proto/bt_amp_hci.h index 8617985..49f3949 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/bt_amp_hci.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/bt_amp_hci.h @@ -1,14 +1,14 @@ /* * BT-AMP (BlueTooth Alternate Mac and Phy) HCI (Host/Controller Interface) * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/proto/eapol.h b/drivers/net/wireless/bcmdhd/src/include/proto/eapol.h index 8936d16..f19dc55 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/eapol.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/eapol.h @@ -75,7 +75,7 @@ typedef BWL_PRE_PACKED_STRUCT struct { unsigned char key[1]; /* Key (optional) */ } BWL_POST_PACKED_STRUCT eapol_key_header_t; -#define EAPOL_KEY_HEADER_LEN 44 +#define EAPOL_KEY_HEADER_LEN 44 /* RC4 EAPOL-Key flags */ #define EAPOL_KEY_FLAGS_MASK 0x80 @@ -110,7 +110,7 @@ typedef BWL_PRE_PACKED_STRUCT struct { unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */ } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t; -#define EAPOL_WPA_KEY_LEN 95 +#define EAPOL_WPA_KEY_LEN 95 /* WPA/802.11i/WPA2 KEY KEY_INFO bits */ #define WPA_KEY_DESC_V1 0x01 @@ -146,7 +146,7 @@ typedef BWL_PRE_PACKED_STRUCT struct { uint8 data[1]; } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t; -#define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 +#define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 #define WPA2_KEY_DATA_SUBTYPE_GTK 1 #define WPA2_KEY_DATA_SUBTYPE_STAKEY 2 @@ -161,7 +161,7 @@ typedef BWL_PRE_PACKED_STRUCT struct { uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE]; } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t; -#define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 +#define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 #define WPA2_GTK_INDEX_MASK 0x03 #define WPA2_GTK_INDEX_SHIFT 0x00 @@ -175,7 +175,7 @@ typedef BWL_PRE_PACKED_STRUCT struct { uint8 key[EAPOL_WPA_MAX_KEY_SIZE]; } BWL_POST_PACKED_STRUCT eapol_wpa2_key_igtk_encap_t; -#define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 8 +#define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 8 /* STAKey encapsulation */ typedef BWL_PRE_PACKED_STRUCT struct { diff --git a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h b/drivers/net/wireless/bcmdhd/src/include/proto/ethernet.h index e455185..f9fc116 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/ethernet.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/ethernet.h @@ -1,14 +1,14 @@ /* * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,15 +16,15 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: ethernet.h 309193 2012-01-19 00:03:57Z $ + * $Id: ethernet.h 300516 2011-12-04 17:39:44Z $ */ -#ifndef _NET_ETHERNET_H_ +#ifndef _NET_ETHERNET_H_ #define _NET_ETHERNET_H_ #ifndef _TYPEDEFS_H_ @@ -60,26 +60,26 @@ #define ETHER_MAX_DATA 1500 -#define ETHER_TYPE_MIN 0x0600 -#define ETHER_TYPE_IP 0x0800 -#define ETHER_TYPE_ARP 0x0806 -#define ETHER_TYPE_8021Q 0x8100 -#define ETHER_TYPE_IPV6 0x86dd -#define ETHER_TYPE_BRCM 0x886c -#define ETHER_TYPE_802_1X 0x888e -#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 -#define ETHER_TYPE_WAI 0x88b4 -#define ETHER_TYPE_89_0D 0x890d +#define ETHER_TYPE_MIN 0x0600 +#define ETHER_TYPE_IP 0x0800 +#define ETHER_TYPE_ARP 0x0806 +#define ETHER_TYPE_8021Q 0x8100 +#define ETHER_TYPE_IPV6 0x86dd +#define ETHER_TYPE_BRCM 0x886c +#define ETHER_TYPE_802_1X 0x888e +#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 +#define ETHER_TYPE_WAI 0x88b4 +#define ETHER_TYPE_89_0D 0x890d -#define ETHER_TYPE_IPV6 0x86dd +#define ETHER_TYPE_IPV6 0x86dd -#define ETHER_BRCM_SUBTYPE_LEN 4 +#define ETHER_BRCM_SUBTYPE_LEN 4 -#define ETHER_DEST_OFFSET (0 * ETHER_ADDR_LEN) -#define ETHER_SRC_OFFSET (1 * ETHER_ADDR_LEN) -#define ETHER_TYPE_OFFSET (2 * ETHER_ADDR_LEN) +#define ETHER_DEST_OFFSET (0 * ETHER_ADDR_LEN) +#define ETHER_SRC_OFFSET (1 * ETHER_ADDR_LEN) +#define ETHER_TYPE_OFFSET (2 * ETHER_ADDR_LEN) #define ETHER_IS_VALID_LEN(foo) \ @@ -94,7 +94,7 @@ ((uint8 *)ea)[5] = ((mgrp_ip) >> 0) & 0xff; \ } -#ifndef __INCif_etherh +#ifndef __INCif_etherh BWL_PRE_PACKED_STRUCT struct ether_header { uint8 ether_dhost[ETHER_ADDR_LEN]; @@ -106,11 +106,11 @@ BWL_PRE_PACKED_STRUCT struct ether_header { BWL_PRE_PACKED_STRUCT struct ether_addr { uint8 octet[ETHER_ADDR_LEN]; } BWL_POST_PACKED_STRUCT; -#endif +#endif #define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2)) -#define ETHER_IS_LOCALADDR(ea) (((uint8 *)(ea))[0] & 2) +#define ETHER_IS_LOCALADDR(ea) (((uint8 *)(ea))[0] & 2) #define ETHER_CLR_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & 0xfd)) #define ETHER_TOGGLE_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] ^ 2)) @@ -159,4 +159,4 @@ do { \ #include <packed_section_end.h> -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/src/include/proto/p2p.h b/drivers/net/wireless/bcmdhd/src/include/proto/p2p.h new file mode 100644 index 0000000..0c974c7 --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/proto/p2p.h @@ -0,0 +1,564 @@ +/* + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) + * + * $Id: p2p.h,v 9.17.2.4 2010-12-15 21:41:21 $ + */ + +#ifndef _P2P_H_ +#define _P2P_H_ + +#ifndef _TYPEDEFS_H_ +#include <typedefs.h> +#endif +#include <wlioctl.h> +#include <proto/802.11.h> + +/* This marks the start of a packed structure section. */ +#include <packed_section_start.h> + + +/* WiFi P2P OUI values */ +#define P2P_OUI WFA_OUI /* WiFi P2P OUI */ +#define P2P_VER WFA_OUI_TYPE_P2P /* P2P version: 9=WiFi P2P v1.0 */ + +#define P2P_IE_ID 0xdd /* P2P IE element ID */ + +/* WiFi P2P IE */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_ie { + uint8 id; /* IE ID: 0xDD */ + uint8 len; /* IE length */ + uint8 OUI[3]; /* WiFi P2P specific OUI: P2P_OUI */ + uint8 oui_type; /* Identifies P2P version: P2P_VER */ + uint8 subelts[1]; /* variable length subelements */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_ie wifi_p2p_ie_t; + +#define P2P_IE_FIXED_LEN 6 + +#define P2P_ATTR_ID_OFF 0 +#define P2P_ATTR_LEN_OFF 1 +#define P2P_ATTR_DATA_OFF 3 + +#define P2P_ATTR_ID_LEN 1 +#define P2P_ATTR_LEN_LEN 2 +#define P2P_ATTR_HDR_LEN 3 /* ID + 2-byte length field spec 1.02 */ + +/* P2P IE Subelement IDs from WiFi P2P Technical Spec 1.00 */ +#define P2P_SEID_STATUS 0 /* Status */ +#define P2P_SEID_MINOR_RC 1 /* Minor Reason Code */ +#define P2P_SEID_P2P_INFO 2 /* P2P Capability (capabilities info) */ +#define P2P_SEID_DEV_ID 3 /* P2P Device ID */ +#define P2P_SEID_INTENT 4 /* Group Owner Intent */ +#define P2P_SEID_CFG_TIMEOUT 5 /* Configuration Timeout */ +#define P2P_SEID_CHANNEL 6 /* Channel */ +#define P2P_SEID_GRP_BSSID 7 /* P2P Group BSSID */ +#define P2P_SEID_XT_TIMING 8 /* Extended Listen Timing */ +#define P2P_SEID_INTINTADDR 9 /* Intended P2P Interface Address */ +#define P2P_SEID_P2P_MGBTY 10 /* P2P Manageability */ +#define P2P_SEID_CHAN_LIST 11 /* Channel List */ +#define P2P_SEID_ABSENCE 12 /* Notice of Absence */ +#define P2P_SEID_DEV_INFO 13 /* Device Info */ +#define P2P_SEID_GROUP_INFO 14 /* Group Info */ +#define P2P_SEID_GROUP_ID 15 /* Group ID */ +#define P2P_SEID_P2P_IF 16 /* P2P Interface */ +#define P2P_SEID_OP_CHANNEL 17 +#define P2P_SEID_INVITE_FLAGS 18 +#define P2P_SEID_VNDR 221 /* Vendor-specific subelement */ + +#define P2P_SE_VS_ID_SERVICES 0x1b /* BRCM subel: L2 Services */ + + +/* WiFi P2P IE subelement: P2P Capability (capabilities info) */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_info_se_s { + uint8 eltId; /* SE ID: P2P_SEID_P2P_INFO */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 dev; /* Device Capability Bitmap */ + uint8 group; /* Group Capability Bitmap */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_info_se_s wifi_p2p_info_se_t; + +/* P2P Capability subelement's Device Capability Bitmap bit values */ +#define P2P_CAPSE_DEV_SERVICE_DIS 0x1 /* Service Discovery */ +#define P2P_CAPSE_DEV_CLIENT_DIS 0x2 /* Client Discoverability */ +#define P2P_CAPSE_DEV_CONCURRENT 0x4 /* Concurrent Operation */ +#define P2P_CAPSE_DEV_INFRA_MAN 0x8 /* P2P Infrastructure Managed */ +#define P2P_CAPSE_DEV_LIMIT 0x10 /* P2P Device Limit */ +#define P2P_CAPSE_INVITE_PROC 0x20 /* P2P Invitation Procedure */ + +/* P2P Capability subelement's Group Capability Bitmap bit values */ +#define P2P_CAPSE_GRP_OWNER 0x1 /* P2P Group Owner */ +#define P2P_CAPSE_PERSIST_GRP 0x2 /* Persistent P2P Group */ +#define P2P_CAPSE_GRP_LIMIT 0x4 /* P2P Group Limit */ +#define P2P_CAPSE_GRP_INTRA_BSS 0x8 /* Intra-BSS Distribution */ +#define P2P_CAPSE_GRP_X_CONNECT 0x10 /* Cross Connection */ +#define P2P_CAPSE_GRP_PERSISTENT 0x20 /* Persistent Reconnect */ +#define P2P_CAPSE_GRP_FORMATION 0x40 /* Group Formation */ + + +/* WiFi P2P IE subelement: Group Owner Intent */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_intent_se_s { + uint8 eltId; /* SE ID: P2P_SEID_INTENT */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 intent; /* Intent Value 0...15 (0=legacy 15=master only) */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_intent_se_s wifi_p2p_intent_se_t; + +/* WiFi P2P IE subelement: Configuration Timeout */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_cfg_tmo_se_s { + uint8 eltId; /* SE ID: P2P_SEID_CFG_TIMEOUT */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 go_tmo; /* GO config timeout in units of 10 ms */ + uint8 client_tmo; /* Client config timeout in units of 10 ms */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_cfg_tmo_se_s wifi_p2p_cfg_tmo_se_t; + + +BWL_PRE_PACKED_STRUCT struct wifi_p2p_listen_channel_se_s { + uint8 eltId; + uint8 len[2]; + uint8 country[3]; + uint8 op_class; + uint8 channel; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_listen_channel_se_s wifi_p2p_listen_channel_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_bssid_se_s { + uint8 eltId; + uint8 len[2]; + uint8 mac[6]; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_grp_bssid_se_s wifi_p2p_grp_bssid_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_id_se_s { + uint8 eltId; + uint8 len[2]; + uint8 mac[6]; + uint8 ssid[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_grp_id_se_s wifi_p2p_grp_id_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_intf_se_s { + uint8 eltId; + uint8 len[2]; + uint8 mac[6]; + uint8 ifaddrs; + uint8 ifaddr[1][6]; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_intf_se_s wifi_p2p_intf_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_status_se_s { + uint8 eltId; /* SE ID: P2P_SEID_STATUS */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 status; /* Status Code: P2P_STATSE_* */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_status_se_s wifi_p2p_status_se_t; + +/* Status subelement Status Code definitions */ +#define P2P_STATSE_SUCCESS 0 + /* Success */ +#define P2P_STATSE_FAIL_INFO_CURR_UNAVAIL 1 + /* Failed, information currently unavailable */ +#define P2P_STATSE_PASSED_UP P2P_STATSE_FAIL_INFO_CURR_UNAVAIL + /* Old name for above in P2P spec 1.08 and older */ +#define P2P_STATSE_FAIL_INCOMPAT_PARAMS 2 + /* Failed, incompatible parameters */ +#define P2P_STATSE_FAIL_LIMIT_REACHED 3 + /* Failed, limit reached */ +#define P2P_STATSE_FAIL_INVALID_PARAMS 4 + /* Failed, invalid parameters */ +#define P2P_STATSE_FAIL_UNABLE_TO_ACCOM 5 + /* Failed, unable to accomodate request */ +#define P2P_STATSE_FAIL_PROTO_ERROR 6 + /* Failed, previous protocol error or disruptive behaviour */ +#define P2P_STATSE_FAIL_NO_COMMON_CHAN 7 + /* Failed, no common channels */ +#define P2P_STATSE_FAIL_UNKNOWN_GROUP 8 + /* Failed, unknown P2P Group */ +#define P2P_STATSE_FAIL_INTENT 9 + /* Failed, both peers indicated Intent 15 in GO Negotiation */ +#define P2P_STATSE_FAIL_INCOMPAT_PROVIS 10 + /* Failed, incompatible provisioning method */ +#define P2P_STATSE_FAIL_USER_REJECT 11 + /* Failed, rejected by user */ + +/* WiFi P2P IE attribute: Extended Listen Timing */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_ext_se_s { + uint8 eltId; /* ID: P2P_SEID_EXT_TIMING */ + uint8 len[2]; /* length not including eltId, len fields */ + uint8 avail[2]; /* availibility period */ + uint8 interval[2]; /* availibility interval */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_ext_se_s wifi_p2p_ext_se_t; + +#define P2P_EXT_MIN 10 /* minimum 10ms */ + +/* WiFi P2P IE subelement: Intended P2P Interface Address */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_intintad_se_s { + uint8 eltId; /* SE ID: P2P_SEID_INTINTADDR */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 mac[6]; /* intended P2P interface MAC address */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_intintad_se_s wifi_p2p_intintad_se_t; + +/* WiFi P2P IE subelement: Channel */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_channel_se_s { + uint8 eltId; /* SE ID: P2P_SEID_STATUS */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 band; /* Regulatory Class (band) */ + uint8 channel; /* Channel */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_channel_se_s wifi_p2p_channel_se_t; + + +/* Channel Entry structure within the Channel List SE */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_entry_s { + uint8 band; /* Regulatory Class (band) */ + uint8 num_channels; /* # of channels in the channel list */ + uint8 channels[WL_NUMCHANNELS]; /* Channel List */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_chanlist_entry_s wifi_p2p_chanlist_entry_t; +#define WIFI_P2P_CHANLIST_SE_MAX_ENTRIES 2 + +/* WiFi P2P IE subelement: Channel List */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_se_s { + uint8 eltId; /* SE ID: P2P_SEID_STATUS */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 country[3]; /* Country String */ + uint8 num_entries; /* # of channel entries */ + wifi_p2p_chanlist_entry_t entries[WIFI_P2P_CHANLIST_SE_MAX_ENTRIES]; + /* Channel Entry List */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_chanlist_se_s wifi_p2p_chanlist_se_t; + +/* WiFi P2P IE's Device Info subelement */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_pri_devtype_s { + uint16 cat_id; + uint8 OUI[3]; + uint8 oui_type; + uint16 sub_cat_id; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_pri_devtype_s wifi_p2p_pri_devtype_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_devinfo_se_s { + uint8 eltId; /* SE ID: P2P_SEID_DEVINFO */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 mac[6]; /* P2P Device MAC address */ + uint16 wps_cfg_meths; /* Config Methods: reg_prototlv.h WPS_CONFMET_* */ + uint8 pri_devtype[8]; /* Primary Device Type */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_devinfo_se_s wifi_p2p_devinfo_se_t; + +#define P2P_DEV_TYPE_LEN 8 + +/* WiFi P2P IE's Group Info subelement Client Info Descriptor */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_cid_fixed_s { + uint8 len; + uint8 devaddr[ETHER_ADDR_LEN]; /* P2P Device Address */ + uint8 ifaddr[ETHER_ADDR_LEN]; /* P2P Interface Address */ + uint8 devcap; /* Device Capability */ + uint8 cfg_meths[2]; /* Config Methods: reg_prototlv.h WPS_CONFMET_* */ + uint8 pridt[P2P_DEV_TYPE_LEN]; /* Primary Device Type */ + uint8 secdts; /* Number of Secondary Device Types */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_cid_fixed_s wifi_p2p_cid_fixed_t; + +/* WiFi P2P IE's Device ID subelement */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_devid_se_s { + uint8 eltId; + uint8 len[2]; + struct ether_addr addr; /* P2P Device MAC address */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_devid_se_s wifi_p2p_devid_se_t; + +/* WiFi P2P IE subelement: P2P Manageability */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_mgbt_se_s { + uint8 eltId; /* SE ID: P2P_SEID_P2P_MGBTY */ + uint8 len[2]; /* SE length not including eltId, len fields */ + uint8 mg_bitmap; /* manageability bitmap */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_mgbt_se_s wifi_p2p_mgbt_se_t; +/* mg_bitmap field bit values */ +#define P2P_MGBTSE_P2PDEVMGMT_FLAG 0x1 /* AP supports Managed P2P Device */ + +/* WiFi P2P IE subelement: Group Info */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_grpinfo_se_s { + uint8 eltId; /* SE ID: P2P_SEID_GROUP_INFO */ + uint8 len[2]; /* SE length not including eltId, len fields */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_grpinfo_se_s wifi_p2p_grpinfo_se_t; + + +BWL_PRE_PACKED_STRUCT struct wifi_p2p_op_channel_se_s { + uint8 eltId; + uint8 len[2]; + uint8 country[3]; + uint8 op_class; + uint8 channel; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_op_channel_se_s wifi_p2p_op_channel_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_invite_flags_se_s { + uint8 eltId; + uint8 len[2]; + uint8 flags; +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_invite_flags_se_s wifi_p2p_invite_flags_se_t; +BWL_PRE_PACKED_STRUCT struct wifi_p2p_action_frame { + uint8 category; /* P2P_AF_CATEGORY */ + uint8 OUI[3]; /* OUI - P2P_OUI */ + uint8 type; /* OUI Type - P2P_VER */ + uint8 subtype; /* OUI Subtype - P2P_AF_* */ + uint8 dialog_token; /* nonzero, identifies req/resp tranaction */ + uint8 elts[1]; /* Variable length information elements. Max size = + * ACTION_FRAME_SIZE - sizeof(this structure) - 1 + */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_action_frame wifi_p2p_action_frame_t; +#define P2P_AF_CATEGORY 0x7f + +#define P2P_AF_FIXED_LEN 7 + +/* WiFi P2P Action Frame OUI Subtypes */ +#define P2P_AF_NOTICE_OF_ABSENCE 0 /* Notice of Absence */ +#define P2P_AF_PRESENCE_REQ 1 /* P2P Presence Request */ +#define P2P_AF_PRESENCE_RSP 2 /* P2P Presence Response */ +#define P2P_AF_GO_DISC_REQ 3 /* GO Discoverability Request */ + + +/* WiFi P2P Public Action Frame */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_pub_act_frame { + uint8 category; /* P2P_PUB_AF_CATEGORY */ + uint8 action; /* P2P_PUB_AF_ACTION */ + uint8 oui[3]; /* P2P_OUI */ + uint8 oui_type; /* OUI type - P2P_VER */ + uint8 subtype; /* OUI subtype - P2P_TYPE_* */ + uint8 dialog_token; /* nonzero, identifies req/rsp transaction */ + uint8 elts[1]; /* Variable length information elements. Max size = + * ACTION_FRAME_SIZE - sizeof(this structure) - 1 + */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t; +#define P2P_PUB_AF_FIXED_LEN 8 +#define P2P_PUB_AF_CATEGORY 0x04 +#define P2P_PUB_AF_ACTION 0x09 + +/* WiFi P2P Public Action Frame OUI Subtypes */ +#define P2P_PAF_GON_REQ 0 /* Group Owner Negotiation Req */ +#define P2P_PAF_GON_RSP 1 /* Group Owner Negotiation Rsp */ +#define P2P_PAF_GON_CONF 2 /* Group Owner Negotiation Confirm */ +#define P2P_PAF_INVITE_REQ 3 /* P2P Invitation Request */ +#define P2P_PAF_INVITE_RSP 4 /* P2P Invitation Response */ +#define P2P_PAF_DEVDIS_REQ 5 /* Device Discoverability Request */ +#define P2P_PAF_DEVDIS_RSP 6 /* Device Discoverability Response */ +#define P2P_PAF_PROVDIS_REQ 7 /* Provision Discovery Request */ +#define P2P_PAF_PROVDIS_RSP 8 /* Provision Discovery Request */ + +/* TODO: Stop using these obsolete aliases for P2P_PAF_GON_* */ +#define P2P_TYPE_MNREQ P2P_PAF_GON_REQ +#define P2P_TYPE_MNRSP P2P_PAF_GON_RSP +#define P2P_TYPE_MNCONF P2P_PAF_GON_CONF + +/* WiFi P2P IE subelement: Notice of Absence */ +BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_desc { + uint8 cnt_type; /* Count/Type */ + uint32 duration; /* Duration */ + uint32 interval; /* Interval */ + uint32 start; /* Start Time */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_noa_desc wifi_p2p_noa_desc_t; + +BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_se { + uint8 eltId; /* Subelement ID */ + uint8 len[2]; /* Length */ + uint8 index; /* Index */ + uint8 ops_ctw_parms; /* CTWindow and OppPS Parameters */ + wifi_p2p_noa_desc_t desc[1]; /* Notice of Absence Descriptor(s) */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t; + +#define P2P_NOA_SE_FIXED_LEN 5 + +/* cnt_type field values */ +#define P2P_NOA_DESC_CNT_RESERVED 0 /* reserved and should not be used */ +#define P2P_NOA_DESC_CNT_REPEAT 255 /* continuous schedule */ +#define P2P_NOA_DESC_TYPE_PREFERRED 1 /* preferred values */ +#define P2P_NOA_DESC_TYPE_ACCEPTABLE 2 /* acceptable limits */ + +/* ctw_ops_parms field values */ +#define P2P_NOA_CTW_MASK 0x7f +#define P2P_NOA_OPS_MASK 0x80 +#define P2P_NOA_OPS_SHIFT 7 + +#define P2P_CTW_MIN 10 /* minimum 10TU */ + +/* + * P2P Service Discovery related + */ +#define P2PSD_ACTION_CATEGORY 0x04 + /* Public action frame */ +#define P2PSD_ACTION_ID_GAS_IREQ 0x0a + /* Action value for GAS Initial Request AF */ +#define P2PSD_ACTION_ID_GAS_IRESP 0x0b + /* Action value for GAS Initial Response AF */ +#define P2PSD_ACTION_ID_GAS_CREQ 0x0c + /* Action value for GAS Comback Request AF */ +#define P2PSD_ACTION_ID_GAS_CRESP 0x0d + /* Action value for GAS Comback Response AF */ +#define P2PSD_AD_EID 0x6c + /* Advertisement Protocol IE ID */ +#define P2PSD_ADP_TUPLE_QLMT_PAMEBI 0x00 + /* Query Response Length Limit 7 bits plus PAME-BI 1 bit */ +#define P2PSD_ADP_PROTO_ID 0x00 + /* Advertisement Protocol ID. Always 0 for P2P SD */ +#define P2PSD_GAS_OUI P2P_OUI + /* WFA OUI */ +#define P2PSD_GAS_OUI_SUBTYPE P2P_VER + /* OUI Subtype for GAS IE */ +#define P2PSD_GAS_NQP_INFOID 0xDDDD + /* NQP Query Info ID: 56797 */ +#define P2PSD_GAS_COMEBACKDEALY 0x00 + /* Not used in the Native GAS protocol */ + +/* Service Protocol Type */ +typedef enum p2psd_svc_protype { + SVC_RPOTYPE_ALL = 0, + SVC_RPOTYPE_BONJOUR = 1, + SVC_RPOTYPE_UPNP = 2, + SVC_RPOTYPE_WSD = 3, + SVC_RPOTYPE_VENDOR = 255 +} p2psd_svc_protype_t; + +/* Service Discovery response status code */ +typedef enum { + P2PSD_RESP_STATUS_SUCCESS = 0, + P2PSD_RESP_STATUS_PROTYPE_NA = 1, + P2PSD_RESP_STATUS_DATA_NA = 2, + P2PSD_RESP_STATUS_BAD_REQUEST = 3 +} p2psd_resp_status_t; + +/* Advertisement Protocol IE tuple field */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_tpl { + uint8 llm_pamebi; /* Query Response Length Limit bit 0-6, set to 0 plus + * Pre-Associated Message Exchange BSSID Independent bit 7, set to 0 + */ + uint8 adp_id; /* Advertisement Protocol ID: 0 for NQP Native Query Protocol */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_adp_tpl wifi_p2psd_adp_tpl_t; + +/* Advertisement Protocol IE */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_ie { + uint8 id; /* IE ID: 0x6c - 108 */ + uint8 len; /* IE length */ + wifi_p2psd_adp_tpl_t adp_tpl; /* Advertisement Protocol Tuple field. Only one + * tuple is defined for P2P Service Discovery + */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_adp_ie wifi_p2psd_adp_ie_t; + +/* NQP Vendor-specific Content */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_nqp_query_vsc { + uint8 oui_subtype; /* OUI Subtype: 0x09 */ + uint16 svc_updi; /* Service Update Indicator */ + uint8 svc_tlvs[1]; /* wifi_p2psd_qreq_tlv_t type for service request, + * wifi_p2psd_qresp_tlv_t type for service response + */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_nqp_query_vsc wifi_p2psd_nqp_query_vsc_t; + +/* Service Request TLV */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_tlv { + uint16 len; /* Length: 5 plus size of Query Data */ + uint8 svc_prot; /* Service Protocol Type */ + uint8 svc_tscid; /* Service Transaction ID */ + uint8 query_data[1]; /* Query Data, passed in from above Layer 2 */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_qreq_tlv wifi_p2psd_qreq_tlv_t; + +/* Query Request Frame, defined in generic format, instead of NQP specific */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_frame { + uint16 info_id; /* Info ID: 0xDDDD */ + uint16 len; /* Length of service request TLV, 5 plus the size of request data */ + uint8 oui[3]; /* WFA OUI: 0x0050F2 */ + uint8 qreq_vsc[1]; /* Vendor-specific Content: wifi_p2psd_nqp_query_vsc_t type for NQP */ + +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_qreq_frame wifi_p2psd_qreq_frame_t; + +/* GAS Initial Request AF body, "elts" in wifi_p2p_pub_act_frame */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_ireq_frame { + wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ + uint16 qreq_len; /* Query Request Length */ + uint8 qreq_frm[1]; /* Query Request Frame wifi_p2psd_qreq_frame_t */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_gas_ireq_frame wifi_p2psd_gas_ireq_frame_t; + +/* Service Response TLV */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_tlv { + uint16 len; /* Length: 5 plus size of Query Data */ + uint8 svc_prot; /* Service Protocol Type */ + uint8 svc_tscid; /* Service Transaction ID */ + uint8 status; /* Value defined in Table 57 of P2P spec. */ + uint8 query_data[1]; /* Response Data, passed in from above Layer 2 */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_qresp_tlv wifi_p2psd_qresp_tlv_t; + +/* Query Response Frame, defined in generic format, instead of NQP specific */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_frame { + uint16 info_id; /* Info ID: 0xDDDD */ + uint16 len; /* Lenth of service response TLV, 6 plus the size of resp data */ + uint8 oui[3]; /* WFA OUI: 0x0050F2 */ + uint8 qresp_vsc[1]; /* Vendor-specific Content: wifi_p2psd_qresp_tlv_t type for NQP */ + +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_qresp_frame wifi_p2psd_qresp_frame_t; + +/* GAS Initial Response AF body, "elts" in wifi_p2p_pub_act_frame */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_iresp_frame { + uint16 status; /* Value defined in Table 7-23 of IEEE P802.11u */ + uint16 cb_delay; /* GAS Comeback Delay */ + wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ + uint16 qresp_len; /* Query Response Length */ + uint8 qresp_frm[1]; /* Query Response Frame wifi_p2psd_qresp_frame_t */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_gas_iresp_frame wifi_p2psd_gas_iresp_frame_t; + +/* GAS Comeback Response AF body, "elts" in wifi_p2p_pub_act_frame */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_cresp_frame { + uint16 status; /* Value defined in Table 7-23 of IEEE P802.11u */ + uint8 fragment_id; /* Fragmentation ID */ + uint16 cb_delay; /* GAS Comeback Delay */ + wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ + uint16 qresp_len; /* Query Response Length */ + uint8 qresp_frm[1]; /* Query Response Frame wifi_p2psd_qresp_frame_t */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_gas_cresp_frame wifi_p2psd_gas_cresp_frame_t; + +/* Wi-Fi GAS Public Action Frame */ +BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_pub_act_frame { + uint8 category; /* 0x04 Public Action Frame */ + uint8 action; /* 0x6c Advertisement Protocol */ + uint8 dialog_token; /* nonzero, identifies req/rsp transaction */ + uint8 query_data[1]; /* Query Data. wifi_p2psd_gas_ireq_frame_t + * or wifi_p2psd_gas_iresp_frame_t format + */ +} BWL_POST_PACKED_STRUCT; +typedef struct wifi_p2psd_gas_pub_act_frame wifi_p2psd_gas_pub_act_frame_t; + +/* This marks the end of a packed structure section. */ +#include <packed_section_end.h> + +#endif /* _P2P_H_ */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/sdspi.h b/drivers/net/wireless/bcmdhd/src/include/proto/sdspi.h index a4900ed..94a2d3c 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/sdspi.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/sdspi.h @@ -1,14 +1,14 @@ /* * SD-SPI Protocol Standard * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -26,44 +26,44 @@ #ifndef _SD_SPI_H #define _SD_SPI_H -#define SPI_START_M BITFIELD_MASK(1) /* Bit [31] - Start Bit */ +#define SPI_START_M BITFIELD_MASK(1) /* Bit [31] - Start Bit */ #define SPI_START_S 31 -#define SPI_DIR_M BITFIELD_MASK(1) /* Bit [30] - Direction */ +#define SPI_DIR_M BITFIELD_MASK(1) /* Bit [30] - Direction */ #define SPI_DIR_S 30 #define SPI_CMD_INDEX_M BITFIELD_MASK(6) /* Bits [29:24] - Command number */ #define SPI_CMD_INDEX_S 24 -#define SPI_RW_M BITFIELD_MASK(1) /* Bit [23] - Read=0, Write=1 */ +#define SPI_RW_M BITFIELD_MASK(1) /* Bit [23] - Read=0, Write=1 */ #define SPI_RW_S 23 #define SPI_FUNC_M BITFIELD_MASK(3) /* Bits [22:20] - Function Number */ #define SPI_FUNC_S 20 -#define SPI_RAW_M BITFIELD_MASK(1) /* Bit [19] - Read After Wr */ +#define SPI_RAW_M BITFIELD_MASK(1) /* Bit [19] - Read After Wr */ #define SPI_RAW_S 19 -#define SPI_STUFF_M BITFIELD_MASK(1) /* Bit [18] - Stuff bit */ +#define SPI_STUFF_M BITFIELD_MASK(1) /* Bit [18] - Stuff bit */ #define SPI_STUFF_S 18 -#define SPI_BLKMODE_M BITFIELD_MASK(1) /* Bit [19] - Blockmode 1=blk */ +#define SPI_BLKMODE_M BITFIELD_MASK(1) /* Bit [19] - Blockmode 1=blk */ #define SPI_BLKMODE_S 19 -#define SPI_OPCODE_M BITFIELD_MASK(1) /* Bit [18] - OP Code */ +#define SPI_OPCODE_M BITFIELD_MASK(1) /* Bit [18] - OP Code */ #define SPI_OPCODE_S 18 -#define SPI_ADDR_M BITFIELD_MASK(17) /* Bits [17:1] - Address */ +#define SPI_ADDR_M BITFIELD_MASK(17) /* Bits [17:1] - Address */ #define SPI_ADDR_S 1 -#define SPI_STUFF0_M BITFIELD_MASK(1) /* Bit [0] - Stuff bit */ +#define SPI_STUFF0_M BITFIELD_MASK(1) /* Bit [0] - Stuff bit */ #define SPI_STUFF0_S 0 -#define SPI_RSP_START_M BITFIELD_MASK(1) /* Bit [7] - Start Bit (always 0) */ +#define SPI_RSP_START_M BITFIELD_MASK(1) /* Bit [7] - Start Bit (always 0) */ #define SPI_RSP_START_S 7 -#define SPI_RSP_PARAM_ERR_M BITFIELD_MASK(1) /* Bit [6] - Parameter Error */ +#define SPI_RSP_PARAM_ERR_M BITFIELD_MASK(1) /* Bit [6] - Parameter Error */ #define SPI_RSP_PARAM_ERR_S 6 -#define SPI_RSP_RFU5_M BITFIELD_MASK(1) /* Bit [5] - RFU (Always 0) */ +#define SPI_RSP_RFU5_M BITFIELD_MASK(1) /* Bit [5] - RFU (Always 0) */ #define SPI_RSP_RFU5_S 5 -#define SPI_RSP_FUNC_ERR_M BITFIELD_MASK(1) /* Bit [4] - Function number error */ +#define SPI_RSP_FUNC_ERR_M BITFIELD_MASK(1) /* Bit [4] - Function number error */ #define SPI_RSP_FUNC_ERR_S 4 -#define SPI_RSP_CRC_ERR_M BITFIELD_MASK(1) /* Bit [3] - COM CRC Error */ +#define SPI_RSP_CRC_ERR_M BITFIELD_MASK(1) /* Bit [3] - COM CRC Error */ #define SPI_RSP_CRC_ERR_S 3 -#define SPI_RSP_ILL_CMD_M BITFIELD_MASK(1) /* Bit [2] - Illegal Command error */ +#define SPI_RSP_ILL_CMD_M BITFIELD_MASK(1) /* Bit [2] - Illegal Command error */ #define SPI_RSP_ILL_CMD_S 2 -#define SPI_RSP_RFU1_M BITFIELD_MASK(1) /* Bit [1] - RFU (Always 0) */ +#define SPI_RSP_RFU1_M BITFIELD_MASK(1) /* Bit [1] - RFU (Always 0) */ #define SPI_RSP_RFU1_S 1 -#define SPI_RSP_IDLE_M BITFIELD_MASK(1) /* Bit [0] - In idle state */ +#define SPI_RSP_IDLE_M BITFIELD_MASK(1) /* Bit [0] - In idle state */ #define SPI_RSP_IDLE_S 0 /* SD-SPI Protocol Definitions */ diff --git a/drivers/net/wireless/bcmdhd/include/proto/vlan.h b/drivers/net/wireless/bcmdhd/src/include/proto/vlan.h index 9c94985..168be85 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/vlan.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/vlan.h @@ -1,14 +1,14 @@ /* * 802.1Q VLAN protocol definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -34,22 +34,22 @@ #include <packed_section_start.h> -#define VLAN_VID_MASK 0xfff -#define VLAN_CFI_SHIFT 12 -#define VLAN_PRI_SHIFT 13 +#define VLAN_VID_MASK 0xfff +#define VLAN_CFI_SHIFT 12 +#define VLAN_PRI_SHIFT 13 -#define VLAN_PRI_MASK 7 +#define VLAN_PRI_MASK 7 #define VLAN_TAG_LEN 4 -#define VLAN_TAG_OFFSET (2 * ETHER_ADDR_LEN) +#define VLAN_TAG_OFFSET (2 * ETHER_ADDR_LEN) -#define VLAN_TPID 0x8100 +#define VLAN_TPID 0x8100 struct ethervlan_header { uint8 ether_dhost[ETHER_ADDR_LEN]; uint8 ether_shost[ETHER_ADDR_LEN]; - uint16 vlan_type; - uint16 vlan_tag; + uint16 vlan_type; + uint16 vlan_tag; uint16 ether_type; }; @@ -66,4 +66,4 @@ do { \ *(struct ethervlan_header *)(d) = t; \ } while (0) -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/wpa.h b/drivers/net/wireless/bcmdhd/src/include/proto/wpa.h index 47bc354..b8a10e0 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/wpa.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/wpa.h @@ -1,14 +1,14 @@ /* * Fundamental types and constants relating to WPA * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -37,43 +37,43 @@ #include <dhd_sec_feature.h> -#define DOT11_RC_INVALID_WPA_IE 13 -#define DOT11_RC_MIC_FAILURE 14 -#define DOT11_RC_4WH_TIMEOUT 15 -#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 -#define DOT11_RC_WPA_IE_MISMATCH 17 -#define DOT11_RC_INVALID_MC_CIPHER 18 -#define DOT11_RC_INVALID_UC_CIPHER 19 -#define DOT11_RC_INVALID_AKMP 20 -#define DOT11_RC_BAD_WPA_VERSION 21 -#define DOT11_RC_INVALID_WPA_CAP 22 -#define DOT11_RC_8021X_AUTH_FAIL 23 +#define DOT11_RC_INVALID_WPA_IE 13 +#define DOT11_RC_MIC_FAILURE 14 +#define DOT11_RC_4WH_TIMEOUT 15 +#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 +#define DOT11_RC_WPA_IE_MISMATCH 17 +#define DOT11_RC_INVALID_MC_CIPHER 18 +#define DOT11_RC_INVALID_UC_CIPHER 19 +#define DOT11_RC_INVALID_AKMP 20 +#define DOT11_RC_BAD_WPA_VERSION 21 +#define DOT11_RC_INVALID_WPA_CAP 22 +#define DOT11_RC_8021X_AUTH_FAIL 23 #define WPA2_PMKID_LEN 16 typedef BWL_PRE_PACKED_STRUCT struct { - uint8 tag; - uint8 length; - uint8 oui[3]; - uint8 oui_type; + uint8 tag; + uint8 length; + uint8 oui[3]; + uint8 oui_type; BWL_PRE_PACKED_STRUCT struct { uint8 low; uint8 high; - } BWL_POST_PACKED_STRUCT version; + } BWL_POST_PACKED_STRUCT version; } BWL_POST_PACKED_STRUCT wpa_ie_fixed_t; #define WPA_IE_OUITYPE_LEN 4 #define WPA_IE_FIXED_LEN 8 #define WPA_IE_TAG_FIXED_LEN 6 typedef BWL_PRE_PACKED_STRUCT struct { - uint8 tag; - uint8 length; + uint8 tag; + uint8 length; BWL_PRE_PACKED_STRUCT struct { uint8 low; uint8 high; - } BWL_POST_PACKED_STRUCT version; + } BWL_POST_PACKED_STRUCT version; } BWL_POST_PACKED_STRUCT wpa_rsn_ie_fixed_t; #define WPA_RSN_IE_FIXED_LEN 4 #define WPA_RSN_IE_TAG_FIXED_LEN 2 @@ -107,30 +107,22 @@ typedef BWL_PRE_PACKED_STRUCT struct } BWL_POST_PACKED_STRUCT wpa_pmkid_list_t; -#define WPA_CIPHER_NONE 0 -#define WPA_CIPHER_WEP_40 1 -#define WPA_CIPHER_TKIP 2 -#define WPA_CIPHER_AES_OCB 3 -#define WPA_CIPHER_AES_CCM 4 -#define WPA_CIPHER_WEP_104 5 -#define WPA_CIPHER_BIP 6 -#define WPA_CIPHER_TPK 7 -#ifdef BCMCCX -#define WPA_CIPHER_CKIP 8 -#define WPA_CIPHER_CKIP_MMH 9 -#define WPA_CIPHER_WEP_MMH 10 - -#define IS_CCX_CIPHER(cipher) ((cipher) == WPA_CIPHER_CKIP || \ - (cipher) == WPA_CIPHER_CKIP_MMH || \ - (cipher) == WPA_CIPHER_WEP_MMH) -#endif +#define WPA_CIPHER_NONE 0 +#define WPA_CIPHER_WEP_40 1 +#define WPA_CIPHER_TKIP 2 +#define WPA_CIPHER_AES_OCB 3 +#define WPA_CIPHER_AES_CCM 4 +#define WPA_CIPHER_WEP_104 5 +#define WPA_CIPHER_BIP 6 +#define WPA_CIPHER_TPK 7 + #ifdef BCMWAPI_WAI #define WAPI_CIPHER_NONE WPA_CIPHER_NONE #define WAPI_CIPHER_SMS4 11 #define WAPI_CSE_WPI_SMS4 1 -#endif +#endif /* BCMWAPI_WAI */ #define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \ (cipher) == WPA_CIPHER_WEP_40 || \ @@ -144,20 +136,20 @@ typedef BWL_PRE_PACKED_STRUCT struct #define IS_WAPI_CIPHER(cipher) ((cipher) == WAPI_CIPHER_NONE || \ (cipher) == WAPI_CSE_WPI_SMS4) - +/* convert WAPI_CSE_WPI_XXX to WAPI_CIPHER_XXX */ #define WAPI_CSE_WPI_2_CIPHER(cse) ((cse) == WAPI_CSE_WPI_SMS4 ? \ WAPI_CIPHER_SMS4 : WAPI_CIPHER_NONE) #define WAPI_CIPHER_2_CSE_WPI(cipher) ((cipher) == WAPI_CIPHER_SMS4 ? \ WAPI_CSE_WPI_SMS4 : WAPI_CIPHER_NONE) -#endif - +#endif /* BCMWAPI_WAI */ -#define WPA_TKIP_CM_DETECT 60 -#define WPA_TKIP_CM_BLOCK 60 +/* WPA TKIP countermeasures parameters */ +#define WPA_TKIP_CM_DETECT 60 /* multiple MIC failure window (seconds) */ +#define WPA_TKIP_CM_BLOCK 60 /* countermeasures active window (seconds) */ -#define RSN_CAP_LEN 2 +#define RSN_CAP_LEN 2 #define RSN_CAP_PREAUTH 0x0001 @@ -182,11 +174,11 @@ typedef BWL_PRE_PACKED_STRUCT struct #define WPA_CAP_REPLAY_CNTR_MASK RSN_CAP_PTK_REPLAY_CNTR_MASK -#define WPA_CAP_PEER_KEY_ENABLE (0x1 << 1) +#define WPA_CAP_PEER_KEY_ENABLE (0x1 << 1) -#define WPA_CAP_LEN RSN_CAP_LEN -#define WPA_PMKID_CNT_LEN 2 +#define WPA_CAP_LEN RSN_CAP_LEN +#define WPA_PMKID_CNT_LEN 2 #define WPA_CAP_WPA2_PREAUTH RSN_CAP_PREAUTH @@ -195,18 +187,18 @@ typedef BWL_PRE_PACKED_STRUCT struct #ifdef BCMWAPI_WAI #define WAPI_CAP_PREAUTH RSN_CAP_PREAUTH - +/* Other WAI definition */ #define WAPI_WAI_REQUEST 0x00F1 #define WAPI_UNICAST_REKEY 0x00F2 #define WAPI_STA_AGING 0x00F3 #define WAPI_MUTIL_REKEY 0x00F4 #define WAPI_STA_STATS 0x00F5 -#define WAPI_USK_REKEY_COUNT 0x4000000 -#define WAPI_MSK_REKEY_COUNT 0x4000000 -#endif - +#define WAPI_USK_REKEY_COUNT 0x4000000 /* 0xA00000 */ +#define WAPI_MSK_REKEY_COUNT 0x4000000 /* 0xA00000 */ +#endif /* BCMWAPI_WAI */ +/* This marks the end of a packed structure section. */ #include <packed_section_end.h> -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/proto/wps.h b/drivers/net/wireless/bcmdhd/src/include/proto/wps.h index cccbfff..9d98a37 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/proto/wps.h +++ b/drivers/net/wireless/bcmdhd/src/include/proto/wps.h @@ -1,14 +1,14 @@ /* * WPS IE definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/sbchipc.h b/drivers/net/wireless/bcmdhd/src/include/sbchipc.h index 5feb743..03039a6 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbchipc.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbchipc.h @@ -5,16 +5,16 @@ * JTAG, 0/1/2 UARTs, clock frequency control, a watchdog interrupt timer, * GPIO interface, extbus, and support for serial and parallel flashes. * - * $Id: sbchipc.h 347614 2012-07-27 10:24:51Z $ + * $Id: sbchipc.h 307724 2012-01-12 10:41:05Z $ + * + * Copyright (C) 1999-2011, Broadcom Corporation * - * Copyright (C) 1999-2012, Broadcom Corporation - * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -22,7 +22,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -38,7 +38,7 @@ #define _PADLINE(line) pad ## line #define _XSTR(line) _PADLINE(line) #define PAD _XSTR(__LINE__) -#endif +#endif typedef struct eci_prerev35 { uint32 eci_output; @@ -86,113 +86,113 @@ typedef struct eci_rev35 { typedef struct flash_config { uint32 PAD[19]; - + uint32 flashstrconfig; } flash_config_t; typedef volatile struct { - uint32 chipid; + uint32 chipid; uint32 capabilities; - uint32 corecontrol; + uint32 corecontrol; uint32 bist; - - uint32 otpstatus; + + uint32 otpstatus; uint32 otpcontrol; uint32 otpprog; - uint32 otplayout; + uint32 otplayout; + - - uint32 intstatus; + uint32 intstatus; uint32 intmask; - - uint32 chipcontrol; - uint32 chipstatus; - - uint32 jtagcmd; + uint32 chipcontrol; + uint32 chipstatus; + + + uint32 jtagcmd; uint32 jtagir; uint32 jtagdr; uint32 jtagctrl; - - uint32 flashcontrol; + + uint32 flashcontrol; uint32 flashaddress; uint32 flashdata; - uint32 otplayoutextension; + uint32 otplayoutextension; - - uint32 broadcastaddress; + + uint32 broadcastaddress; uint32 broadcastdata; - - uint32 gpiopullup; - uint32 gpiopulldown; - uint32 gpioin; - uint32 gpioout; - uint32 gpioouten; - uint32 gpiocontrol; - uint32 gpiointpolarity; - uint32 gpiointmask; - - + + uint32 gpiopullup; + uint32 gpiopulldown; + uint32 gpioin; + uint32 gpioout; + uint32 gpioouten; + uint32 gpiocontrol; + uint32 gpiointpolarity; + uint32 gpiointmask; + + uint32 gpioevent; uint32 gpioeventintmask; - - uint32 watchdog; - + uint32 watchdog; + + uint32 gpioeventintpolarity; - - uint32 gpiotimerval; + + uint32 gpiotimerval; uint32 gpiotimeroutmask; - - uint32 clockcontrol_n; - uint32 clockcontrol_sb; - uint32 clockcontrol_pci; - uint32 clockcontrol_m2; - uint32 clockcontrol_m3; - uint32 clkdiv; - uint32 gpiodebugsel; - uint32 capabilities_ext; - - - uint32 pll_on_delay; + + uint32 clockcontrol_n; + uint32 clockcontrol_sb; + uint32 clockcontrol_pci; + uint32 clockcontrol_m2; + uint32 clockcontrol_m3; + uint32 clkdiv; + uint32 gpiodebugsel; + uint32 capabilities_ext; + + + uint32 pll_on_delay; uint32 fref_sel_delay; - uint32 slow_clk_ctl; + uint32 slow_clk_ctl; uint32 PAD; - - uint32 system_clk_ctl; + + uint32 system_clk_ctl; uint32 clkstatestretch; uint32 PAD[2]; - - uint32 bp_addrlow; + + uint32 bp_addrlow; uint32 bp_addrhigh; uint32 bp_data; uint32 PAD; uint32 bp_indaccess; - + uint32 gsioctrl; uint32 gsioaddress; uint32 gsiodata; - + uint32 clkdiv2; - - uint32 otpcontrol1; - uint32 fabid; + uint32 PAD; - - uint32 eromptr; + uint32 fabid; - - uint32 pcmcia_config; + + uint32 eromptr; + + + uint32 pcmcia_config; uint32 pcmcia_memwait; uint32 pcmcia_attrwait; uint32 pcmcia_iowait; @@ -204,28 +204,28 @@ typedef volatile struct { uint32 prog_waitcount; uint32 flash_config; uint32 flash_waitcount; - uint32 SECI_config; + uint32 SECI_config; uint32 SECI_status; uint32 SECI_statusmask; uint32 SECI_rxnibchanged; uint32 PAD[20]; - - uint32 sromcontrol; + + uint32 sromcontrol; uint32 sromaddress; uint32 sromdata; - uint32 PAD[1]; - - uint32 nflashctrl; + uint32 PAD[1]; + + uint32 nflashctrl; uint32 nflashconf; uint32 nflashcoladdr; uint32 nflashrowaddr; uint32 nflashdata; - uint32 nflashwaitcnt0; + uint32 nflashwaitcnt0; uint32 PAD[2]; - uint32 seci_uart_data; + uint32 seci_uart_data; uint32 seci_uart_bauddiv; uint32 seci_uart_fcr; uint32 seci_uart_lcr; @@ -233,13 +233,13 @@ typedef volatile struct { uint32 seci_uart_lsr; uint32 seci_uart_msr; uint32 seci_uart_baudadj; - - uint32 clk_ctl_st; + + uint32 clk_ctl_st; uint32 hw_war; uint32 PAD[70]; - - uint8 uart0data; + + uint8 uart0data; uint8 uart0imr; uint8 uart0fcr; uint8 uart0lcr; @@ -247,9 +247,9 @@ typedef volatile struct { uint8 uart0lsr; uint8 uart0msr; uint8 uart0scratch; - uint8 PAD[248]; + uint8 PAD[248]; - uint8 uart1data; + uint8 uart1data; uint8 uart1imr; uint8 uart1fcr; uint8 uart1lcr; @@ -259,9 +259,9 @@ typedef volatile struct { uint8 uart1scratch; uint32 PAD[126]; - - - uint32 pmucontrol; + + + uint32 pmucontrol; uint32 pmucapabilities; uint32 pmustatus; uint32 res_state; @@ -275,29 +275,28 @@ typedef volatile struct { uint32 res_timer; uint32 clkstretch; uint32 pmuwatchdog; - uint32 gpiosel; - uint32 gpioenable; + uint32 gpiosel; + uint32 gpioenable; uint32 res_req_timer_sel; uint32 res_req_timer; uint32 res_req_mask; uint32 PAD; - uint32 chipcontrol_addr; - uint32 chipcontrol_data; + uint32 chipcontrol_addr; + uint32 chipcontrol_data; uint32 regcontrol_addr; uint32 regcontrol_data; uint32 pllcontrol_addr; uint32 pllcontrol_data; - uint32 pmustrapopt; - uint32 pmu_xtalfreq; - uint32 retention_ctl; - uint32 PAD[3]; - uint32 retention_grpidx; - uint32 retention_grpctl; + uint32 pmustrapopt; + uint32 pmu_xtalfreq; + uint32 retention_ctl; + uint32 PAD[3]; + uint32 retention_grpidx; + uint32 retention_grpctl; uint32 PAD[94]; - uint16 sromotp[512]; -#ifdef NFLASH_SUPPORT - - uint32 nand_revision; + uint16 sromotp[512]; + + uint32 nand_revision; uint32 nand_cmd_start; uint32 nand_cmd_addr_x; uint32 nand_cmd_addr; @@ -358,19 +357,9 @@ typedef volatile struct { uint32 nand_cache_data; uint32 nand_ctrl_config; uint32 nand_ctrl_status; -#endif - uint32 gci_corecaps0; - uint32 gci_corecaps1; - uint32 gci_corecaps2; - uint32 gci_corectrl; - uint32 gci_corestat; - uint32 PAD[11]; - uint32 gci_indirect_addr; - uint32 PAD[111]; - uint32 gci_chipctrl; } chipcregs_t; -#endif +#endif #define CC_CHIPID 0 @@ -411,13 +400,9 @@ typedef volatile struct { #define CC_CHIPCTL_DATA 0x654 #define PMU_REG_CONTROL_ADDR 0x658 #define PMU_REG_CONTROL_DATA 0x65C -#define PMU_PLL_CONTROL_ADDR 0x660 -#define PMU_PLL_CONTROL_DATA 0x664 -#define CC_SROM_OTP 0x800 -#define CC_GCI_INDIRECT_ADDR_REG 0xC40 -#define CC_GCI_CHIP_CTRL_REG 0xE00 -#define CC_GCI_CC_OFFSET_2 2 -#define CC_GCI_CC_OFFSET_5 5 +#define PMU_PLL_CONTROL_ADDR 0x660 +#define PMU_PLL_CONTROL_DATA 0x664 +#define CC_SROM_OTP 0x800 #ifdef NFLASH_SUPPORT @@ -432,58 +417,58 @@ typedef volatile struct { #define CC_NAND_DEVID 0xC60 #define CC_NAND_DEVID_EXT 0xC64 #define CC_NAND_INTFC_STATUS 0xC6C -#endif +#endif -#define CID_ID_MASK 0x0000ffff -#define CID_REV_MASK 0x000f0000 -#define CID_REV_SHIFT 16 -#define CID_PKG_MASK 0x00f00000 -#define CID_PKG_SHIFT 20 -#define CID_CC_MASK 0x0f000000 +#define CID_ID_MASK 0x0000ffff +#define CID_REV_MASK 0x000f0000 +#define CID_REV_SHIFT 16 +#define CID_PKG_MASK 0x00f00000 +#define CID_PKG_SHIFT 20 +#define CID_CC_MASK 0x0f000000 #define CID_CC_SHIFT 24 -#define CID_TYPE_MASK 0xf0000000 +#define CID_TYPE_MASK 0xf0000000 #define CID_TYPE_SHIFT 28 -#define CC_CAP_UARTS_MASK 0x00000003 -#define CC_CAP_MIPSEB 0x00000004 -#define CC_CAP_UCLKSEL 0x00000018 -#define CC_CAP_UINTCLK 0x00000008 -#define CC_CAP_UARTGPIO 0x00000020 -#define CC_CAP_EXTBUS_MASK 0x000000c0 -#define CC_CAP_EXTBUS_NONE 0x00000000 -#define CC_CAP_EXTBUS_FULL 0x00000040 -#define CC_CAP_EXTBUS_PROG 0x00000080 -#define CC_CAP_FLASH_MASK 0x00000700 -#define CC_CAP_PLL_MASK 0x00038000 -#define CC_CAP_PWR_CTL 0x00040000 -#define CC_CAP_OTPSIZE 0x00380000 -#define CC_CAP_OTPSIZE_SHIFT 19 -#define CC_CAP_OTPSIZE_BASE 5 -#define CC_CAP_JTAGP 0x00400000 -#define CC_CAP_ROM 0x00800000 -#define CC_CAP_BKPLN64 0x08000000 -#define CC_CAP_PMU 0x10000000 -#define CC_CAP_ECI 0x20000000 -#define CC_CAP_SROM 0x40000000 -#define CC_CAP_NFLASH 0x80000000 - -#define CC_CAP2_SECI 0x00000001 -#define CC_CAP2_GSIO 0x00000002 - - -#define CC_CAP_EXT_SECI_PRESENT 0x00000001 +#define CC_CAP_UARTS_MASK 0x00000003 +#define CC_CAP_MIPSEB 0x00000004 +#define CC_CAP_UCLKSEL 0x00000018 +#define CC_CAP_UINTCLK 0x00000008 +#define CC_CAP_UARTGPIO 0x00000020 +#define CC_CAP_EXTBUS_MASK 0x000000c0 +#define CC_CAP_EXTBUS_NONE 0x00000000 +#define CC_CAP_EXTBUS_FULL 0x00000040 +#define CC_CAP_EXTBUS_PROG 0x00000080 +#define CC_CAP_FLASH_MASK 0x00000700 +#define CC_CAP_PLL_MASK 0x00038000 +#define CC_CAP_PWR_CTL 0x00040000 +#define CC_CAP_OTPSIZE 0x00380000 +#define CC_CAP_OTPSIZE_SHIFT 19 +#define CC_CAP_OTPSIZE_BASE 5 +#define CC_CAP_JTAGP 0x00400000 +#define CC_CAP_ROM 0x00800000 +#define CC_CAP_BKPLN64 0x08000000 +#define CC_CAP_PMU 0x10000000 +#define CC_CAP_ECI 0x20000000 +#define CC_CAP_SROM 0x40000000 +#define CC_CAP_NFLASH 0x80000000 + +#define CC_CAP2_SECI 0x00000001 +#define CC_CAP2_GSIO 0x00000002 + + +#define CC_CAP_EXT_SECI_PRESENT 0x00000001 #define PLL_NONE 0x00000000 -#define PLL_TYPE1 0x00010000 -#define PLL_TYPE2 0x00020000 -#define PLL_TYPE3 0x00030000 -#define PLL_TYPE4 0x00008000 -#define PLL_TYPE5 0x00018000 -#define PLL_TYPE6 0x00028000 -#define PLL_TYPE7 0x00038000 +#define PLL_TYPE1 0x00010000 +#define PLL_TYPE2 0x00020000 +#define PLL_TYPE3 0x00030000 +#define PLL_TYPE4 0x00008000 +#define PLL_TYPE5 0x00018000 +#define PLL_TYPE6 0x00028000 +#define PLL_TYPE7 0x00038000 #define ILP_CLOCK 32000 @@ -495,30 +480,30 @@ typedef volatile struct { #define HT_CLOCK 80000000 -#define CC_UARTCLKO 0x00000001 -#define CC_SE 0x00000002 -#define CC_ASYNCGPIO 0x00000004 -#define CC_UARTCLKEN 0x00000008 +#define CC_UARTCLKO 0x00000001 +#define CC_SE 0x00000002 +#define CC_ASYNCGPIO 0x00000004 +#define CC_UARTCLKEN 0x00000008 #define CHIPCTRL_4321A0_DEFAULT 0x3a4 #define CHIPCTRL_4321A1_DEFAULT 0x0a4 -#define CHIPCTRL_4321_PLL_DOWN 0x800000 +#define CHIPCTRL_4321_PLL_DOWN 0x800000 #define OTPS_OL_MASK 0x000000ff -#define OTPS_OL_MFG 0x00000001 -#define OTPS_OL_OR1 0x00000002 -#define OTPS_OL_OR2 0x00000004 -#define OTPS_OL_GU 0x00000008 +#define OTPS_OL_MFG 0x00000001 +#define OTPS_OL_OR1 0x00000002 +#define OTPS_OL_OR2 0x00000004 +#define OTPS_OL_GU 0x00000008 #define OTPS_GUP_MASK 0x00000f00 #define OTPS_GUP_SHIFT 8 -#define OTPS_GUP_HW 0x00000100 -#define OTPS_GUP_SW 0x00000200 -#define OTPS_GUP_CI 0x00000400 -#define OTPS_GUP_FUSE 0x00000800 +#define OTPS_GUP_HW 0x00000100 +#define OTPS_GUP_SW 0x00000200 +#define OTPS_GUP_CI 0x00000400 +#define OTPS_GUP_FUSE 0x00000800 #define OTPS_READY 0x00001000 -#define OTPS_RV(x) (1 << (16 + (x))) +#define OTPS_RV(x) (1 << (16 + (x))) #define OTPS_RV_MASK 0x0fff0000 #define OTPS_PROGOK 0x40000000 @@ -534,30 +519,6 @@ typedef volatile struct { #define OTPC_PROGEN 0x80000000 -#define OTPC_40NM_PROGSEL_SHIFT 0 -#define OTPC_40NM_PCOUNT_SHIFT 1 -#define OTPC_40NM_PCOUNT_WR 0xA -#define OTPC_40NM_PCOUNT_V1X 0xB -#define OTPC_40NM_REGCSEL_SHIFT 5 -#define OTPC_40NM_REGCSEL_DEF 0x4 -#define OTPC_40NM_PROGIN_SHIFT 8 -#define OTPC_40NM_R2X_SHIFT 10 -#define OTPC_40NM_ODM_SHIFT 11 -#define OTPC_40NM_DF_SHIFT 15 -#define OTPC_40NM_VSEL_SHIFT 16 -#define OTPC_40NM_VSEL_WR 0xA -#define OTPC_40NM_VSEL_V1X 0xA -#define OTPC_40NM_VSEL_R1X 0x5 -#define OTPC_40NM_COFAIL_SHIFT 30 - -#define OTPC1_CPCSEL_SHIFT 0 -#define OTPC1_CPCSEL_DEF 6 -#define OTPC1_TM_SHIFT 8 -#define OTPC1_TM_WR 0x84 -#define OTPC1_TM_V1X 0x84 -#define OTPC1_TM_R1X 0x4 - - #define OTPP_COL_MASK 0x000000ff #define OTPP_COL_SHIFT 0 #define OTPP_ROW_MASK 0x0000ff00 @@ -568,7 +529,7 @@ typedef volatile struct { #define OTPP_VALUE_MASK 0x20000000 #define OTPP_VALUE_SHIFT 29 #define OTPP_START_BUSY 0x80000000 -#define OTPP_READ 0x40000000 +#define OTPP_READ 0x40000000 #define OTPL_HWRGN_OFF_MASK 0x00000FFF @@ -617,18 +578,18 @@ typedef volatile struct { -#define JTAGM_CREV_OLD 10 -#define JTAGM_CREV_IRP 22 -#define JTAGM_CREV_RTI 28 +#define JTAGM_CREV_OLD 10 +#define JTAGM_CREV_IRP 22 +#define JTAGM_CREV_RTI 28 #define JCMD_START 0x80000000 #define JCMD_BUSY 0x80000000 #define JCMD_STATE_MASK 0x60000000 -#define JCMD_STATE_TLR 0x00000000 -#define JCMD_STATE_PIR 0x20000000 -#define JCMD_STATE_PDR 0x40000000 -#define JCMD_STATE_RTI 0x60000000 +#define JCMD_STATE_TLR 0x00000000 +#define JCMD_STATE_PIR 0x20000000 +#define JCMD_STATE_PDR 0x40000000 +#define JCMD_STATE_RTI 0x60000000 #define JCMD0_ACC_MASK 0x0000f000 #define JCMD0_ACC_IRDR 0x00000000 #define JCMD0_ACC_DR 0x00001000 @@ -637,7 +598,7 @@ typedef volatile struct { #define JCMD0_ACC_IRPDR 0x00004000 #define JCMD0_ACC_PDR 0x00005000 #define JCMD0_IRW_MASK 0x00000f00 -#define JCMD_ACC_MASK 0x000f0000 +#define JCMD_ACC_MASK 0x000f0000 #define JCMD_ACC_IRDR 0x00000000 #define JCMD_ACC_DR 0x00010000 #define JCMD_ACC_IR 0x00020000 @@ -645,16 +606,16 @@ typedef volatile struct { #define JCMD_ACC_IRPDR 0x00040000 #define JCMD_ACC_PDR 0x00050000 #define JCMD_ACC_PIR 0x00060000 -#define JCMD_ACC_IRDR_I 0x00070000 -#define JCMD_ACC_DR_I 0x00080000 +#define JCMD_ACC_IRDR_I 0x00070000 +#define JCMD_ACC_DR_I 0x00080000 #define JCMD_IRW_MASK 0x00001f00 #define JCMD_IRW_SHIFT 8 #define JCMD_DRW_MASK 0x0000003f -#define JCTRL_FORCE_CLK 4 -#define JCTRL_EXT_EN 2 -#define JCTRL_EN 1 +#define JCTRL_FORCE_CLK 4 +#define JCTRL_EXT_EN 2 +#define JCTRL_EN 1 #define CLKD_SFLASH 0x0f000000 @@ -668,36 +629,36 @@ typedef volatile struct { #define CLKD2_SROM 0x00000003 -#define CI_GPIO 0x00000001 -#define CI_EI 0x00000002 -#define CI_TEMP 0x00000004 -#define CI_SIRQ 0x00000008 -#define CI_ECI 0x00000010 -#define CI_PMU 0x00000020 -#define CI_UART 0x00000040 -#define CI_WDRESET 0x80000000 - - -#define SCC_SS_MASK 0x00000007 -#define SCC_SS_LPO 0x00000000 -#define SCC_SS_XTAL 0x00000001 -#define SCC_SS_PCI 0x00000002 -#define SCC_LF 0x00000200 -#define SCC_LP 0x00000400 -#define SCC_FS 0x00000800 -#define SCC_IP 0x00001000 -#define SCC_XC 0x00002000 -#define SCC_XP 0x00004000 -#define SCC_CD_MASK 0xffff0000 +#define CI_GPIO 0x00000001 +#define CI_EI 0x00000002 +#define CI_TEMP 0x00000004 +#define CI_SIRQ 0x00000008 +#define CI_ECI 0x00000010 +#define CI_PMU 0x00000020 +#define CI_UART 0x00000040 +#define CI_WDRESET 0x80000000 + + +#define SCC_SS_MASK 0x00000007 +#define SCC_SS_LPO 0x00000000 +#define SCC_SS_XTAL 0x00000001 +#define SCC_SS_PCI 0x00000002 +#define SCC_LF 0x00000200 +#define SCC_LP 0x00000400 +#define SCC_FS 0x00000800 +#define SCC_IP 0x00001000 +#define SCC_XC 0x00002000 +#define SCC_XP 0x00004000 +#define SCC_CD_MASK 0xffff0000 #define SCC_CD_SHIFT 16 -#define SYCC_IE 0x00000001 -#define SYCC_AE 0x00000002 -#define SYCC_FP 0x00000004 -#define SYCC_AR 0x00000008 -#define SYCC_HR 0x00000010 -#define SYCC_CD_MASK 0xffff0000 +#define SYCC_IE 0x00000001 +#define SYCC_AE 0x00000002 +#define SYCC_FP 0x00000004 +#define SYCC_AR 0x00000008 +#define SYCC_HR 0x00000010 +#define SYCC_CD_MASK 0xffff0000 #define SYCC_CD_SHIFT 16 @@ -712,70 +673,70 @@ typedef volatile struct { #define BPIA_ERROR 0x00000400 -#define CF_EN 0x00000001 -#define CF_EM_MASK 0x0000000e +#define CF_EN 0x00000001 +#define CF_EM_MASK 0x0000000e #define CF_EM_SHIFT 1 -#define CF_EM_FLASH 0 -#define CF_EM_SYNC 2 -#define CF_EM_PCMCIA 4 -#define CF_DS 0x00000010 -#define CF_BS 0x00000020 -#define CF_CD_MASK 0x000000c0 +#define CF_EM_FLASH 0 +#define CF_EM_SYNC 2 +#define CF_EM_PCMCIA 4 +#define CF_DS 0x00000010 +#define CF_BS 0x00000020 +#define CF_CD_MASK 0x000000c0 #define CF_CD_SHIFT 6 -#define CF_CD_DIV2 0x00000000 -#define CF_CD_DIV3 0x00000040 -#define CF_CD_DIV4 0x00000080 -#define CF_CE 0x00000100 -#define CF_SB 0x00000200 +#define CF_CD_DIV2 0x00000000 +#define CF_CD_DIV3 0x00000040 +#define CF_CD_DIV4 0x00000080 +#define CF_CE 0x00000100 +#define CF_SB 0x00000200 -#define PM_W0_MASK 0x0000003f -#define PM_W1_MASK 0x00001f00 +#define PM_W0_MASK 0x0000003f +#define PM_W1_MASK 0x00001f00 #define PM_W1_SHIFT 8 -#define PM_W2_MASK 0x001f0000 +#define PM_W2_MASK 0x001f0000 #define PM_W2_SHIFT 16 -#define PM_W3_MASK 0x1f000000 +#define PM_W3_MASK 0x1f000000 #define PM_W3_SHIFT 24 -#define PA_W0_MASK 0x0000003f -#define PA_W1_MASK 0x00001f00 +#define PA_W0_MASK 0x0000003f +#define PA_W1_MASK 0x00001f00 #define PA_W1_SHIFT 8 -#define PA_W2_MASK 0x001f0000 +#define PA_W2_MASK 0x001f0000 #define PA_W2_SHIFT 16 -#define PA_W3_MASK 0x1f000000 +#define PA_W3_MASK 0x1f000000 #define PA_W3_SHIFT 24 -#define PI_W0_MASK 0x0000003f -#define PI_W1_MASK 0x00001f00 +#define PI_W0_MASK 0x0000003f +#define PI_W1_MASK 0x00001f00 #define PI_W1_SHIFT 8 -#define PI_W2_MASK 0x001f0000 +#define PI_W2_MASK 0x001f0000 #define PI_W2_SHIFT 16 -#define PI_W3_MASK 0x1f000000 +#define PI_W3_MASK 0x1f000000 #define PI_W3_SHIFT 24 -#define PW_W0_MASK 0x0000001f -#define PW_W1_MASK 0x00001f00 +#define PW_W0_MASK 0x0000001f +#define PW_W1_MASK 0x00001f00 #define PW_W1_SHIFT 8 -#define PW_W2_MASK 0x001f0000 +#define PW_W2_MASK 0x001f0000 #define PW_W2_SHIFT 16 -#define PW_W3_MASK 0x1f000000 +#define PW_W3_MASK 0x1f000000 #define PW_W3_SHIFT 24 -#define PW_W0 0x0000000c -#define PW_W1 0x00000a00 -#define PW_W2 0x00020000 -#define PW_W3 0x01000000 +#define PW_W0 0x0000000c +#define PW_W1 0x00000a00 +#define PW_W2 0x00020000 +#define PW_W3 0x01000000 -#define FW_W0_MASK 0x0000003f -#define FW_W1_MASK 0x00001f00 +#define FW_W0_MASK 0x0000003f +#define FW_W1_MASK 0x00001f00 #define FW_W1_SHIFT 8 -#define FW_W2_MASK 0x001f0000 +#define FW_W2_MASK 0x001f0000 #define FW_W2_SHIFT 16 -#define FW_W3_MASK 0x1f000000 +#define FW_W3_MASK 0x1f000000 #define FW_W3_SHIFT 24 @@ -798,8 +759,8 @@ typedef volatile struct { #define PCTL_ILP_DIV_MASK 0xffff0000 #define PCTL_ILP_DIV_SHIFT 16 -#define PCTL_PLL_PLLCTL_UPD 0x00000400 -#define PCTL_NOILP_ON_WAIT 0x00000200 +#define PCTL_PLL_PLLCTL_UPD 0x00000400 +#define PCTL_NOILP_ON_WAIT 0x00000200 #define PCTL_HT_REQ_EN 0x00000100 #define PCTL_ALP_REQ_EN 0x00000080 #define PCTL_XTALFREQ_MASK 0x0000007c @@ -815,30 +776,30 @@ typedef volatile struct { #define GPIO_ONTIME_SHIFT 16 -#define CN_N1_MASK 0x3f -#define CN_N2_MASK 0x3f00 +#define CN_N1_MASK 0x3f +#define CN_N2_MASK 0x3f00 #define CN_N2_SHIFT 8 -#define CN_PLLC_MASK 0xf0000 +#define CN_PLLC_MASK 0xf0000 #define CN_PLLC_SHIFT 16 -#define CC_M1_MASK 0x3f -#define CC_M2_MASK 0x3f00 +#define CC_M1_MASK 0x3f +#define CC_M2_MASK 0x3f00 #define CC_M2_SHIFT 8 -#define CC_M3_MASK 0x3f0000 +#define CC_M3_MASK 0x3f0000 #define CC_M3_SHIFT 16 -#define CC_MC_MASK 0x1f000000 +#define CC_MC_MASK 0x1f000000 #define CC_MC_SHIFT 24 -#define CC_F6_2 0x02 -#define CC_F6_3 0x03 -#define CC_F6_4 0x05 +#define CC_F6_2 0x02 +#define CC_F6_3 0x03 +#define CC_F6_4 0x05 #define CC_F6_5 0x09 #define CC_F6_6 0x11 #define CC_F6_7 0x21 -#define CC_F5_BIAS 5 +#define CC_F5_BIAS 5 #define CC_MC_BYPASS 0x08 #define CC_MC_M1 0x04 @@ -847,98 +808,98 @@ typedef volatile struct { #define CC_MC_M1M3 0x11 -#define CC_T2_BIAS 2 -#define CC_T2M2_BIAS 3 +#define CC_T2_BIAS 2 +#define CC_T2M2_BIAS 3 #define CC_T2MC_M1BYP 1 #define CC_T2MC_M2BYP 2 #define CC_T2MC_M3BYP 4 -#define CC_T6_MMASK 1 -#define CC_T6_M0 120000000 -#define CC_T6_M1 100000000 +#define CC_T6_MMASK 1 +#define CC_T6_M0 120000000 +#define CC_T6_M1 100000000 #define SB2MIPS_T6(sb) (2 * (sb)) -#define CC_CLOCK_BASE1 24000000 -#define CC_CLOCK_BASE2 12500000 +#define CC_CLOCK_BASE1 24000000 +#define CC_CLOCK_BASE2 12500000 #define CLKC_5350_N 0x0311 #define CLKC_5350_M 0x04020009 -#define FLASH_NONE 0x000 -#define SFLASH_ST 0x100 -#define SFLASH_AT 0x200 +#define FLASH_NONE 0x000 +#define SFLASH_ST 0x100 +#define SFLASH_AT 0x200 #define NFLASH 0x300 -#define PFLASH 0x700 +#define PFLASH 0x700 -#define CC_CFG_EN 0x0001 -#define CC_CFG_EM_MASK 0x000e -#define CC_CFG_EM_ASYNC 0x0000 -#define CC_CFG_EM_SYNC 0x0002 -#define CC_CFG_EM_PCMCIA 0x0004 -#define CC_CFG_EM_IDE 0x0006 -#define CC_CFG_DS 0x0010 -#define CC_CFG_CD_MASK 0x00e0 -#define CC_CFG_CE 0x0100 -#define CC_CFG_SB 0x0200 -#define CC_CFG_IS 0x0400 +#define CC_CFG_EN 0x0001 +#define CC_CFG_EM_MASK 0x000e +#define CC_CFG_EM_ASYNC 0x0000 +#define CC_CFG_EM_SYNC 0x0002 +#define CC_CFG_EM_PCMCIA 0x0004 +#define CC_CFG_EM_IDE 0x0006 +#define CC_CFG_DS 0x0010 +#define CC_CFG_CD_MASK 0x00e0 +#define CC_CFG_CE 0x0100 +#define CC_CFG_SB 0x0200 +#define CC_CFG_IS 0x0400 -#define CC_EB_BASE 0x1a000000 -#define CC_EB_PCMCIA_MEM 0x1a000000 -#define CC_EB_PCMCIA_IO 0x1a200000 -#define CC_EB_PCMCIA_CFG 0x1a400000 -#define CC_EB_IDE 0x1a800000 -#define CC_EB_PCMCIA1_MEM 0x1a800000 -#define CC_EB_PCMCIA1_IO 0x1aa00000 -#define CC_EB_PCMCIA1_CFG 0x1ac00000 -#define CC_EB_PROGIF 0x1b000000 +#define CC_EB_BASE 0x1a000000 +#define CC_EB_PCMCIA_MEM 0x1a000000 +#define CC_EB_PCMCIA_IO 0x1a200000 +#define CC_EB_PCMCIA_CFG 0x1a400000 +#define CC_EB_IDE 0x1a800000 +#define CC_EB_PCMCIA1_MEM 0x1a800000 +#define CC_EB_PCMCIA1_IO 0x1aa00000 +#define CC_EB_PCMCIA1_CFG 0x1ac00000 +#define CC_EB_PROGIF 0x1b000000 #define SFLASH_OPCODE 0x000000ff #define SFLASH_ACTION 0x00000700 -#define SFLASH_CS_ACTIVE 0x00001000 +#define SFLASH_CS_ACTIVE 0x00001000 #define SFLASH_START 0x80000000 #define SFLASH_BUSY SFLASH_START -#define SFLASH_ACT_OPONLY 0x0000 -#define SFLASH_ACT_OP1D 0x0100 -#define SFLASH_ACT_OP3A 0x0200 -#define SFLASH_ACT_OP3A1D 0x0300 -#define SFLASH_ACT_OP3A4D 0x0400 -#define SFLASH_ACT_OP3A4X4D 0x0500 -#define SFLASH_ACT_OP3A1X4D 0x0700 +#define SFLASH_ACT_OPONLY 0x0000 +#define SFLASH_ACT_OP1D 0x0100 +#define SFLASH_ACT_OP3A 0x0200 +#define SFLASH_ACT_OP3A1D 0x0300 +#define SFLASH_ACT_OP3A4D 0x0400 +#define SFLASH_ACT_OP3A4X4D 0x0500 +#define SFLASH_ACT_OP3A1X4D 0x0700 -#define SFLASH_ST_WREN 0x0006 -#define SFLASH_ST_WRDIS 0x0004 -#define SFLASH_ST_RDSR 0x0105 -#define SFLASH_ST_WRSR 0x0101 -#define SFLASH_ST_READ 0x0303 -#define SFLASH_ST_PP 0x0302 -#define SFLASH_ST_SE 0x02d8 -#define SFLASH_ST_BE 0x00c7 -#define SFLASH_ST_DP 0x00b9 -#define SFLASH_ST_RES 0x03ab -#define SFLASH_ST_CSA 0x1000 -#define SFLASH_ST_SSE 0x0220 +#define SFLASH_ST_WREN 0x0006 +#define SFLASH_ST_WRDIS 0x0004 +#define SFLASH_ST_RDSR 0x0105 +#define SFLASH_ST_WRSR 0x0101 +#define SFLASH_ST_READ 0x0303 +#define SFLASH_ST_PP 0x0302 +#define SFLASH_ST_SE 0x02d8 +#define SFLASH_ST_BE 0x00c7 +#define SFLASH_ST_DP 0x00b9 +#define SFLASH_ST_RES 0x03ab +#define SFLASH_ST_CSA 0x1000 +#define SFLASH_ST_SSE 0x0220 -#define SFLASH_MXIC_RDID 0x0390 -#define SFLASH_MXIC_MFID 0xc2 +#define SFLASH_MXIC_RDID 0x0390 +#define SFLASH_MXIC_MFID 0xc2 -#define SFLASH_ST_WIP 0x01 -#define SFLASH_ST_WEL 0x02 -#define SFLASH_ST_BP_MASK 0x1c +#define SFLASH_ST_WIP 0x01 +#define SFLASH_ST_WEL 0x02 +#define SFLASH_ST_BP_MASK 0x1c #define SFLASH_ST_BP_SHIFT 2 -#define SFLASH_ST_SRWD 0x80 +#define SFLASH_ST_SRWD 0x80 #define SFLASH_AT_READ 0x07e8 @@ -975,47 +936,47 @@ typedef volatile struct { -#define UART_RX 0 -#define UART_TX 0 -#define UART_DLL 0 -#define UART_IER 1 -#define UART_DLM 1 -#define UART_IIR 2 -#define UART_FCR 2 -#define UART_LCR 3 -#define UART_MCR 4 -#define UART_LSR 5 -#define UART_MSR 6 -#define UART_SCR 7 -#define UART_LCR_DLAB 0x80 -#define UART_LCR_WLEN8 0x03 -#define UART_MCR_OUT2 0x08 -#define UART_MCR_LOOP 0x10 -#define UART_LSR_RX_FIFO 0x80 -#define UART_LSR_TDHR 0x40 -#define UART_LSR_THRE 0x20 -#define UART_LSR_BREAK 0x10 -#define UART_LSR_FRAMING 0x08 -#define UART_LSR_PARITY 0x04 -#define UART_LSR_OVERRUN 0x02 -#define UART_LSR_RXRDY 0x01 -#define UART_FCR_FIFO_ENABLE 1 - - -#define UART_IIR_FIFO_MASK 0xc0 -#define UART_IIR_INT_MASK 0xf -#define UART_IIR_MDM_CHG 0x0 -#define UART_IIR_NOINT 0x1 -#define UART_IIR_THRE 0x2 -#define UART_IIR_RCVD_DATA 0x4 -#define UART_IIR_RCVR_STATUS 0x6 -#define UART_IIR_CHAR_TIME 0xc - - -#define UART_IER_EDSSI 8 -#define UART_IER_ELSI 4 -#define UART_IER_ETBEI 2 -#define UART_IER_ERBFI 1 +#define UART_RX 0 +#define UART_TX 0 +#define UART_DLL 0 +#define UART_IER 1 +#define UART_DLM 1 +#define UART_IIR 2 +#define UART_FCR 2 +#define UART_LCR 3 +#define UART_MCR 4 +#define UART_LSR 5 +#define UART_MSR 6 +#define UART_SCR 7 +#define UART_LCR_DLAB 0x80 +#define UART_LCR_WLEN8 0x03 +#define UART_MCR_OUT2 0x08 +#define UART_MCR_LOOP 0x10 +#define UART_LSR_RX_FIFO 0x80 +#define UART_LSR_TDHR 0x40 +#define UART_LSR_THRE 0x20 +#define UART_LSR_BREAK 0x10 +#define UART_LSR_FRAMING 0x08 +#define UART_LSR_PARITY 0x04 +#define UART_LSR_OVERRUN 0x02 +#define UART_LSR_RXRDY 0x01 +#define UART_FCR_FIFO_ENABLE 1 + + +#define UART_IIR_FIFO_MASK 0xc0 +#define UART_IIR_INT_MASK 0xf +#define UART_IIR_MDM_CHG 0x0 +#define UART_IIR_NOINT 0x1 +#define UART_IIR_THRE 0x2 +#define UART_IIR_RCVD_DATA 0x4 +#define UART_IIR_RCVR_STATUS 0x6 +#define UART_IIR_CHAR_TIME 0xc + + +#define UART_IER_EDSSI 8 +#define UART_IER_ELSI 4 +#define UART_IER_ETBEI 2 +#define UART_IER_ERBFI 1 #define PST_EXTLPOAVAIL 0x0100 @@ -1041,7 +1002,7 @@ typedef volatile struct { #define PCAP_VC_SHIFT 21 #define PCAP_CC_MASK 0x1e000000 #define PCAP_CC_SHIFT 25 -#define PCAP5_PC_MASK 0x003e0000 +#define PCAP5_PC_MASK 0x003e0000 #define PCAP5_PC_SHIFT 17 #define PCAP5_VC_MASK 0x07c00000 #define PCAP5_VC_SHIFT 22 @@ -1077,16 +1038,16 @@ typedef volatile struct { #define PMU_CHIPCTL1 1 #define PMU_CC1_RXC_DLL_BYPASS 0x00010000 -#define PMU_CC1_IF_TYPE_MASK 0x00000030 -#define PMU_CC1_IF_TYPE_RMII 0x00000000 -#define PMU_CC1_IF_TYPE_MII 0x00000010 -#define PMU_CC1_IF_TYPE_RGMII 0x00000020 +#define PMU_CC1_IF_TYPE_MASK 0x00000030 +#define PMU_CC1_IF_TYPE_RMII 0x00000000 +#define PMU_CC1_IF_TYPE_MII 0x00000010 +#define PMU_CC1_IF_TYPE_RGMII 0x00000020 -#define PMU_CC1_SW_TYPE_MASK 0x000000c0 -#define PMU_CC1_SW_TYPE_EPHY 0x00000000 -#define PMU_CC1_SW_TYPE_EPHYMII 0x00000040 +#define PMU_CC1_SW_TYPE_MASK 0x000000c0 +#define PMU_CC1_SW_TYPE_EPHY 0x00000000 +#define PMU_CC1_SW_TYPE_EPHYMII 0x00000040 #define PMU_CC1_SW_TYPE_EPHYRMII 0x00000080 -#define PMU_CC1_SW_TYPE_RGMII 0x000000c0 +#define PMU_CC1_SW_TYPE_RGMII 0x000000c0 #define PMU_CHIPCTL2 2 @@ -1113,7 +1074,7 @@ typedef volatile struct { #define PMU0_PLL0_PC0_DIV_ARM_110MHZ 0 #define PMU0_PLL0_PC0_DIV_ARM_97_7MHZ 1 #define PMU0_PLL0_PC0_DIV_ARM_88MHZ 2 -#define PMU0_PLL0_PC0_DIV_ARM_80MHZ 3 +#define PMU0_PLL0_PC0_DIV_ARM_80MHZ 3 #define PMU0_PLL0_PC0_DIV_ARM_73_3MHZ 4 #define PMU0_PLL0_PC0_DIV_ARM_67_7MHZ 5 #define PMU0_PLL0_PC0_DIV_ARM_62_9MHZ 6 @@ -1172,7 +1133,7 @@ typedef volatile struct { #define PMU1_PLL0_PC2_NDIV_MODE_MASK 0x000e0000 #define PMU1_PLL0_PC2_NDIV_MODE_SHIFT 17 #define PMU1_PLL0_PC2_NDIV_MODE_MASH 1 -#define PMU1_PLL0_PC2_NDIV_MODE_MFB 2 +#define PMU1_PLL0_PC2_NDIV_MODE_MFB 2 #define PMU1_PLL0_PC2_NDIV_INT_MASK 0x1ff00000 #define PMU1_PLL0_PC2_NDIV_INT_SHIFT 20 @@ -1197,27 +1158,27 @@ typedef volatile struct { #define PMU2_PLL_PLLCTL0 0 -#define PMU2_PLL_PC0_P1DIV_MASK 0x00f00000 +#define PMU2_PLL_PC0_P1DIV_MASK 0x00f00000 #define PMU2_PLL_PC0_P1DIV_SHIFT 20 -#define PMU2_PLL_PC0_P2DIV_MASK 0x0f000000 +#define PMU2_PLL_PC0_P2DIV_MASK 0x0f000000 #define PMU2_PLL_PC0_P2DIV_SHIFT 24 #define PMU2_PLL_PLLCTL1 1 -#define PMU2_PLL_PC1_M1DIV_MASK 0x000000ff +#define PMU2_PLL_PC1_M1DIV_MASK 0x000000ff #define PMU2_PLL_PC1_M1DIV_SHIFT 0 -#define PMU2_PLL_PC1_M2DIV_MASK 0x0000ff00 +#define PMU2_PLL_PC1_M2DIV_MASK 0x0000ff00 #define PMU2_PLL_PC1_M2DIV_SHIFT 8 -#define PMU2_PLL_PC1_M3DIV_MASK 0x00ff0000 +#define PMU2_PLL_PC1_M3DIV_MASK 0x00ff0000 #define PMU2_PLL_PC1_M3DIV_SHIFT 16 -#define PMU2_PLL_PC1_M4DIV_MASK 0xff000000 +#define PMU2_PLL_PC1_M4DIV_MASK 0xff000000 #define PMU2_PLL_PC1_M4DIV_SHIFT 24 #define PMU2_PLL_PLLCTL2 2 -#define PMU2_PLL_PC2_M5DIV_MASK 0x000000ff +#define PMU2_PLL_PC2_M5DIV_MASK 0x000000ff #define PMU2_PLL_PC2_M5DIV_SHIFT 0 -#define PMU2_PLL_PC2_M6DIV_MASK 0x0000ff00 +#define PMU2_PLL_PC2_M6DIV_MASK 0x0000ff00 #define PMU2_PLL_PC2_M6DIV_SHIFT 8 #define PMU2_PLL_PC2_NDIV_MODE_MASK 0x000e0000 #define PMU2_PLL_PC2_NDIV_MODE_SHIFT 17 @@ -1283,7 +1244,7 @@ typedef volatile struct { #define PMU4706_MAINPLL_PLL0 0 -#define PMU6_4706_PROCPLL_OFF 4 +#define PMU6_4706_PROCPLL_OFF 4 #define PMU6_4706_PROC_P2DIV_MASK 0x000f0000 #define PMU6_4706_PROC_P2DIV_SHIFT 16 #define PMU6_4706_PROC_P1DIV_MASK 0x0000f000 @@ -1295,7 +1256,7 @@ typedef volatile struct { #define PMU7_PLL_PLLCTL7 7 #define PMU7_PLL_CTL7_M4DIV_MASK 0xff000000 -#define PMU7_PLL_CTL7_M4DIV_SHIFT 24 +#define PMU7_PLL_CTL7_M4DIV_SHIFT 24 #define PMU7_PLL_CTL7_M4DIV_BY_6 6 #define PMU7_PLL_CTL7_M4DIV_BY_12 0xc #define PMU7_PLL_CTL7_M4DIV_BY_24 0x18 @@ -1416,9 +1377,9 @@ typedef volatile struct { #define PMU15_FREQTGT_480_DEFAULT 0x19AB1 #define PMU15_FREQTGT_492_DEFAULT 0x1A4F5 -#define PMU15_ARM_96MHZ 96000000 -#define PMU15_ARM_98MHZ 98400000 -#define PMU15_ARM_97MHZ 97000000 +#define PMU15_ARM_96MHZ 96000000 +#define PMU15_ARM_98MHZ 98400000 +#define PMU15_ARM_97MHZ 97000000 #define PMU17_PLLCTL2_NDIVTYPE_MASK 0x00000070 @@ -1445,168 +1406,164 @@ typedef volatile struct { #define RES4716_PROC_HT_AVAIL 0x00000080 -#define CCTRL_471X_I2S_PINS_ENABLE 0x0080 - - - -#define CCTRL_5357_I2S_PINS_ENABLE 0x00040000 -#define CCTRL_5357_I2CSPI_PINS_ENABLE 0x00080000 - - -#define RES5354_EXT_SWITCHER_PWM 0 -#define RES5354_BB_SWITCHER_PWM 1 -#define RES5354_BB_SWITCHER_BURST 2 -#define RES5354_BB_EXT_SWITCHER_BURST 3 -#define RES5354_ILP_REQUEST 4 -#define RES5354_RADIO_SWITCHER_PWM 5 -#define RES5354_RADIO_SWITCHER_BURST 6 -#define RES5354_ROM_SWITCH 7 -#define RES5354_PA_REF_LDO 8 -#define RES5354_RADIO_LDO 9 -#define RES5354_AFE_LDO 10 -#define RES5354_PLL_LDO 11 -#define RES5354_BG_FILTBYP 12 -#define RES5354_TX_FILTBYP 13 -#define RES5354_RX_FILTBYP 14 -#define RES5354_XTAL_PU 15 -#define RES5354_XTAL_EN 16 -#define RES5354_BB_PLL_FILTBYP 17 -#define RES5354_RF_PLL_FILTBYP 18 -#define RES5354_BB_PLL_PU 19 - - -#define CCTRL5357_EXTPA (1<<14) -#define CCTRL5357_ANT_MUX_2o3 (1<<15) -#define CCTRL5357_NFLASH (1<<16) - - -#define CCTRL43217_EXTPA_C0 (1<<13) -#define CCTRL43217_EXTPA_C1 (1<<8) - - -#define RES4328_EXT_SWITCHER_PWM 0 -#define RES4328_BB_SWITCHER_PWM 1 -#define RES4328_BB_SWITCHER_BURST 2 -#define RES4328_BB_EXT_SWITCHER_BURST 3 -#define RES4328_ILP_REQUEST 4 -#define RES4328_RADIO_SWITCHER_PWM 5 -#define RES4328_RADIO_SWITCHER_BURST 6 -#define RES4328_ROM_SWITCH 7 -#define RES4328_PA_REF_LDO 8 -#define RES4328_RADIO_LDO 9 -#define RES4328_AFE_LDO 10 -#define RES4328_PLL_LDO 11 -#define RES4328_BG_FILTBYP 12 -#define RES4328_TX_FILTBYP 13 -#define RES4328_RX_FILTBYP 14 -#define RES4328_XTAL_PU 15 -#define RES4328_XTAL_EN 16 -#define RES4328_BB_PLL_FILTBYP 17 -#define RES4328_RF_PLL_FILTBYP 18 -#define RES4328_BB_PLL_PU 19 - - -#define RES4325_BUCK_BOOST_BURST 0 -#define RES4325_CBUCK_BURST 1 -#define RES4325_CBUCK_PWM 2 -#define RES4325_CLDO_CBUCK_BURST 3 -#define RES4325_CLDO_CBUCK_PWM 4 -#define RES4325_BUCK_BOOST_PWM 5 -#define RES4325_ILP_REQUEST 6 -#define RES4325_ABUCK_BURST 7 -#define RES4325_ABUCK_PWM 8 -#define RES4325_LNLDO1_PU 9 -#define RES4325_OTP_PU 10 -#define RES4325_LNLDO3_PU 11 -#define RES4325_LNLDO4_PU 12 -#define RES4325_XTAL_PU 13 -#define RES4325_ALP_AVAIL 14 -#define RES4325_RX_PWRSW_PU 15 -#define RES4325_TX_PWRSW_PU 16 -#define RES4325_RFPLL_PWRSW_PU 17 -#define RES4325_LOGEN_PWRSW_PU 18 -#define RES4325_AFE_PWRSW_PU 19 -#define RES4325_BBPLL_PWRSW_PU 20 -#define RES4325_HT_AVAIL 21 - - -#define RES4325B0_CBUCK_LPOM 1 -#define RES4325B0_CBUCK_BURST 2 -#define RES4325B0_CBUCK_PWM 3 -#define RES4325B0_CLDO_PU 4 - - -#define RES4325C1_LNLDO2_PU 12 +#define CCTRL_471X_I2S_PINS_ENABLE 0x0080 + + + +#define CCTRL_5357_I2S_PINS_ENABLE 0x00040000 +#define CCTRL_5357_I2CSPI_PINS_ENABLE 0x00080000 + + +#define RES5354_EXT_SWITCHER_PWM 0 +#define RES5354_BB_SWITCHER_PWM 1 +#define RES5354_BB_SWITCHER_BURST 2 +#define RES5354_BB_EXT_SWITCHER_BURST 3 +#define RES5354_ILP_REQUEST 4 +#define RES5354_RADIO_SWITCHER_PWM 5 +#define RES5354_RADIO_SWITCHER_BURST 6 +#define RES5354_ROM_SWITCH 7 +#define RES5354_PA_REF_LDO 8 +#define RES5354_RADIO_LDO 9 +#define RES5354_AFE_LDO 10 +#define RES5354_PLL_LDO 11 +#define RES5354_BG_FILTBYP 12 +#define RES5354_TX_FILTBYP 13 +#define RES5354_RX_FILTBYP 14 +#define RES5354_XTAL_PU 15 +#define RES5354_XTAL_EN 16 +#define RES5354_BB_PLL_FILTBYP 17 +#define RES5354_RF_PLL_FILTBYP 18 +#define RES5354_BB_PLL_PU 19 + + +#define CCTRL5357_EXTPA (1<<14) +#define CCTRL5357_ANT_MUX_2o3 (1<<15) +#define CCTRL5357_NFLASH (1<<16) + + +#define RES4328_EXT_SWITCHER_PWM 0 +#define RES4328_BB_SWITCHER_PWM 1 +#define RES4328_BB_SWITCHER_BURST 2 +#define RES4328_BB_EXT_SWITCHER_BURST 3 +#define RES4328_ILP_REQUEST 4 +#define RES4328_RADIO_SWITCHER_PWM 5 +#define RES4328_RADIO_SWITCHER_BURST 6 +#define RES4328_ROM_SWITCH 7 +#define RES4328_PA_REF_LDO 8 +#define RES4328_RADIO_LDO 9 +#define RES4328_AFE_LDO 10 +#define RES4328_PLL_LDO 11 +#define RES4328_BG_FILTBYP 12 +#define RES4328_TX_FILTBYP 13 +#define RES4328_RX_FILTBYP 14 +#define RES4328_XTAL_PU 15 +#define RES4328_XTAL_EN 16 +#define RES4328_BB_PLL_FILTBYP 17 +#define RES4328_RF_PLL_FILTBYP 18 +#define RES4328_BB_PLL_PU 19 + + +#define RES4325_BUCK_BOOST_BURST 0 +#define RES4325_CBUCK_BURST 1 +#define RES4325_CBUCK_PWM 2 +#define RES4325_CLDO_CBUCK_BURST 3 +#define RES4325_CLDO_CBUCK_PWM 4 +#define RES4325_BUCK_BOOST_PWM 5 +#define RES4325_ILP_REQUEST 6 +#define RES4325_ABUCK_BURST 7 +#define RES4325_ABUCK_PWM 8 +#define RES4325_LNLDO1_PU 9 +#define RES4325_OTP_PU 10 +#define RES4325_LNLDO3_PU 11 +#define RES4325_LNLDO4_PU 12 +#define RES4325_XTAL_PU 13 +#define RES4325_ALP_AVAIL 14 +#define RES4325_RX_PWRSW_PU 15 +#define RES4325_TX_PWRSW_PU 16 +#define RES4325_RFPLL_PWRSW_PU 17 +#define RES4325_LOGEN_PWRSW_PU 18 +#define RES4325_AFE_PWRSW_PU 19 +#define RES4325_BBPLL_PWRSW_PU 20 +#define RES4325_HT_AVAIL 21 + + +#define RES4325B0_CBUCK_LPOM 1 +#define RES4325B0_CBUCK_BURST 2 +#define RES4325B0_CBUCK_PWM 3 +#define RES4325B0_CLDO_PU 4 + + +#define RES4325C1_LNLDO2_PU 12 #define CST4325_SPROM_OTP_SEL_MASK 0x00000003 -#define CST4325_DEFCIS_SEL 0 -#define CST4325_SPROM_SEL 1 -#define CST4325_OTP_SEL 2 -#define CST4325_OTP_PWRDN 3 +#define CST4325_DEFCIS_SEL 0 +#define CST4325_SPROM_SEL 1 +#define CST4325_OTP_SEL 2 +#define CST4325_OTP_PWRDN 3 #define CST4325_SDIO_USB_MODE_MASK 0x00000004 #define CST4325_SDIO_USB_MODE_SHIFT 2 #define CST4325_RCAL_VALID_MASK 0x00000008 #define CST4325_RCAL_VALID_SHIFT 3 #define CST4325_RCAL_VALUE_MASK 0x000001f0 #define CST4325_RCAL_VALUE_SHIFT 4 -#define CST4325_PMUTOP_2B_MASK 0x00000200 -#define CST4325_PMUTOP_2B_SHIFT 9 - -#define RES4329_RESERVED0 0 -#define RES4329_CBUCK_LPOM 1 -#define RES4329_CBUCK_BURST 2 -#define RES4329_CBUCK_PWM 3 -#define RES4329_CLDO_PU 4 -#define RES4329_PALDO_PU 5 -#define RES4329_ILP_REQUEST 6 -#define RES4329_RESERVED7 7 -#define RES4329_RESERVED8 8 -#define RES4329_LNLDO1_PU 9 -#define RES4329_OTP_PU 10 -#define RES4329_RESERVED11 11 -#define RES4329_LNLDO2_PU 12 -#define RES4329_XTAL_PU 13 -#define RES4329_ALP_AVAIL 14 -#define RES4329_RX_PWRSW_PU 15 -#define RES4329_TX_PWRSW_PU 16 -#define RES4329_RFPLL_PWRSW_PU 17 -#define RES4329_LOGEN_PWRSW_PU 18 -#define RES4329_AFE_PWRSW_PU 19 -#define RES4329_BBPLL_PWRSW_PU 20 -#define RES4329_HT_AVAIL 21 +#define CST4325_PMUTOP_2B_MASK 0x00000200 +#define CST4325_PMUTOP_2B_SHIFT 9 + +#define RES4329_RESERVED0 0 +#define RES4329_CBUCK_LPOM 1 +#define RES4329_CBUCK_BURST 2 +#define RES4329_CBUCK_PWM 3 +#define RES4329_CLDO_PU 4 +#define RES4329_PALDO_PU 5 +#define RES4329_ILP_REQUEST 6 +#define RES4329_RESERVED7 7 +#define RES4329_RESERVED8 8 +#define RES4329_LNLDO1_PU 9 +#define RES4329_OTP_PU 10 +#define RES4329_RESERVED11 11 +#define RES4329_LNLDO2_PU 12 +#define RES4329_XTAL_PU 13 +#define RES4329_ALP_AVAIL 14 +#define RES4329_RX_PWRSW_PU 15 +#define RES4329_TX_PWRSW_PU 16 +#define RES4329_RFPLL_PWRSW_PU 17 +#define RES4329_LOGEN_PWRSW_PU 18 +#define RES4329_AFE_PWRSW_PU 19 +#define RES4329_BBPLL_PWRSW_PU 20 +#define RES4329_HT_AVAIL 21 #define CST4329_SPROM_OTP_SEL_MASK 0x00000003 -#define CST4329_DEFCIS_SEL 0 -#define CST4329_SPROM_SEL 1 -#define CST4329_OTP_SEL 2 -#define CST4329_OTP_PWRDN 3 +#define CST4329_DEFCIS_SEL 0 +#define CST4329_SPROM_SEL 1 +#define CST4329_OTP_SEL 2 +#define CST4329_OTP_PWRDN 3 #define CST4329_SPI_SDIO_MODE_MASK 0x00000004 #define CST4329_SPI_SDIO_MODE_SHIFT 2 #define CST4312_SPROM_OTP_SEL_MASK 0x00000003 -#define CST4312_DEFCIS_SEL 0 -#define CST4312_SPROM_SEL 1 -#define CST4312_OTP_SEL 2 -#define CST4312_OTP_BAD 3 - - -#define RES4312_SWITCHER_BURST 0 -#define RES4312_SWITCHER_PWM 1 -#define RES4312_PA_REF_LDO 2 -#define RES4312_CORE_LDO_BURST 3 -#define RES4312_CORE_LDO_PWM 4 -#define RES4312_RADIO_LDO 5 -#define RES4312_ILP_REQUEST 6 -#define RES4312_BG_FILTBYP 7 -#define RES4312_TX_FILTBYP 8 -#define RES4312_RX_FILTBYP 9 -#define RES4312_XTAL_PU 10 -#define RES4312_ALP_AVAIL 11 -#define RES4312_BB_PLL_FILTBYP 12 -#define RES4312_RF_PLL_FILTBYP 13 -#define RES4312_HT_AVAIL 14 +#define CST4312_DEFCIS_SEL 0 +#define CST4312_SPROM_SEL 1 +#define CST4312_OTP_SEL 2 +#define CST4312_OTP_BAD 3 + + +#define RES4312_SWITCHER_BURST 0 +#define RES4312_SWITCHER_PWM 1 +#define RES4312_PA_REF_LDO 2 +#define RES4312_CORE_LDO_BURST 3 +#define RES4312_CORE_LDO_PWM 4 +#define RES4312_RADIO_LDO 5 +#define RES4312_ILP_REQUEST 6 +#define RES4312_BG_FILTBYP 7 +#define RES4312_TX_FILTBYP 8 +#define RES4312_RX_FILTBYP 9 +#define RES4312_XTAL_PU 10 +#define RES4312_ALP_AVAIL 11 +#define RES4312_BB_PLL_FILTBYP 12 +#define RES4312_RF_PLL_FILTBYP 13 +#define RES4312_HT_AVAIL 14 #define RES4322_RF_LDO 0 @@ -1623,36 +1580,36 @@ typedef volatile struct { #define CST4322_XTAL_FREQ_20_40MHZ 0x00000020 #define CST4322_SPROM_OTP_SEL_MASK 0x000000c0 #define CST4322_SPROM_OTP_SEL_SHIFT 6 -#define CST4322_NO_SPROM_OTP 0 -#define CST4322_SPROM_PRESENT 1 -#define CST4322_OTP_PRESENT 2 +#define CST4322_NO_SPROM_OTP 0 +#define CST4322_SPROM_PRESENT 1 +#define CST4322_OTP_PRESENT 2 #define CST4322_PCI_OR_USB 0x00000100 #define CST4322_BOOT_MASK 0x00000600 #define CST4322_BOOT_SHIFT 9 -#define CST4322_BOOT_FROM_SRAM 0 -#define CST4322_BOOT_FROM_ROM 1 -#define CST4322_BOOT_FROM_FLASH 2 +#define CST4322_BOOT_FROM_SRAM 0 +#define CST4322_BOOT_FROM_ROM 1 +#define CST4322_BOOT_FROM_FLASH 2 #define CST4322_BOOT_FROM_INVALID 3 #define CST4322_ILP_DIV_EN 0x00000800 #define CST4322_FLASH_TYPE_MASK 0x00001000 #define CST4322_FLASH_TYPE_SHIFT 12 -#define CST4322_FLASH_TYPE_SHIFT_ST 0 -#define CST4322_FLASH_TYPE_SHIFT_ATMEL 1 +#define CST4322_FLASH_TYPE_SHIFT_ST 0 +#define CST4322_FLASH_TYPE_SHIFT_ATMEL 1 #define CST4322_ARM_TAP_SEL 0x00002000 #define CST4322_RES_INIT_MODE_MASK 0x0000c000 #define CST4322_RES_INIT_MODE_SHIFT 14 -#define CST4322_RES_INIT_MODE_ILPAVAIL 0 -#define CST4322_RES_INIT_MODE_ILPREQ 1 -#define CST4322_RES_INIT_MODE_ALPAVAIL 2 -#define CST4322_RES_INIT_MODE_HTAVAIL 3 +#define CST4322_RES_INIT_MODE_ILPAVAIL 0 +#define CST4322_RES_INIT_MODE_ILPREQ 1 +#define CST4322_RES_INIT_MODE_ALPAVAIL 2 +#define CST4322_RES_INIT_MODE_HTAVAIL 3 #define CST4322_PCIPLLCLK_GATING 0x00010000 #define CST4322_CLK_SWITCH_PCI_TO_ALP 0x00020000 #define CST4322_PCI_CARDBUS_MODE 0x00040000 -#define CCTRL43224_GPIO_TOGGLE 0x8000 -#define CCTRL_43224A0_12MA_LED_DRIVE 0x00F000F0 -#define CCTRL_43224B0_12MA_LED_DRIVE 0xF0 +#define CCTRL43224_GPIO_TOGGLE 0x8000 +#define CCTRL_43224A0_12MA_LED_DRIVE 0x00F000F0 +#define CCTRL_43224B0_12MA_LED_DRIVE 0xF0 #define RES43236_REGULATOR 0 @@ -1663,23 +1620,23 @@ typedef volatile struct { #define RES43236_HT_SI_AVAIL 5 -#define CCTRL43236_BT_COEXIST (1<<0) -#define CCTRL43236_SECI (1<<1) -#define CCTRL43236_EXT_LNA (1<<2) -#define CCTRL43236_ANT_MUX_2o3 (1<<3) -#define CCTRL43236_GSIO (1<<4) +#define CCTRL43236_BT_COEXIST (1<<0) +#define CCTRL43236_SECI (1<<1) +#define CCTRL43236_EXT_LNA (1<<2) +#define CCTRL43236_ANT_MUX_2o3 (1<<3) +#define CCTRL43236_GSIO (1<<4) #define CST43236_SFLASH_MASK 0x00000040 #define CST43236_OTP_SEL_MASK 0x00000080 #define CST43236_OTP_SEL_SHIFT 7 -#define CST43236_HSIC_MASK 0x00000100 -#define CST43236_BP_CLK 0x00000200 +#define CST43236_HSIC_MASK 0x00000100 +#define CST43236_BP_CLK 0x00000200 #define CST43236_BOOT_MASK 0x00001800 #define CST43236_BOOT_SHIFT 11 -#define CST43236_BOOT_FROM_SRAM 0 -#define CST43236_BOOT_FROM_ROM 1 -#define CST43236_BOOT_FROM_FLASH 2 +#define CST43236_BOOT_FROM_SRAM 0 +#define CST43236_BOOT_FROM_ROM 1 +#define CST43236_BOOT_FROM_FLASH 2 #define CST43236_BOOT_FROM_INVALID 3 @@ -1691,23 +1648,23 @@ typedef volatile struct { #define RES43237_HT_SI_AVAIL 5 -#define CCTRL43237_BT_COEXIST (1<<0) -#define CCTRL43237_SECI (1<<1) -#define CCTRL43237_EXT_LNA (1<<2) -#define CCTRL43237_ANT_MUX_2o3 (1<<3) -#define CCTRL43237_GSIO (1<<4) +#define CCTRL43237_BT_COEXIST (1<<0) +#define CCTRL43237_SECI (1<<1) +#define CCTRL43237_EXT_LNA (1<<2) +#define CCTRL43237_ANT_MUX_2o3 (1<<3) +#define CCTRL43237_GSIO (1<<4) #define CST43237_SFLASH_MASK 0x00000040 #define CST43237_OTP_SEL_MASK 0x00000080 #define CST43237_OTP_SEL_SHIFT 7 -#define CST43237_HSIC_MASK 0x00000100 -#define CST43237_BP_CLK 0x00000200 +#define CST43237_HSIC_MASK 0x00000100 +#define CST43237_BP_CLK 0x00000200 #define CST43237_BOOT_MASK 0x00001800 #define CST43237_BOOT_SHIFT 11 -#define CST43237_BOOT_FROM_SRAM 0 -#define CST43237_BOOT_FROM_ROM 1 -#define CST43237_BOOT_FROM_FLASH 2 +#define CST43237_BOOT_FROM_SRAM 0 +#define CST43237_BOOT_FROM_ROM 1 +#define CST43237_BOOT_FROM_FLASH 2 #define CST43237_BOOT_FROM_INVALID 3 @@ -1720,10 +1677,10 @@ typedef volatile struct { #define CST43239_SFLASH_MASK 0x00000004 #define CST43239_RES_INIT_MODE_SHIFT 7 #define CST43239_RES_INIT_MODE_MASK 0x000001f0 -#define CST43239_CHIPMODE_SDIOD(cs) ((cs) & (1 << 15)) -#define CST43239_CHIPMODE_USB20D(cs) (~(cs) & (1 << 15)) -#define CST43239_CHIPMODE_SDIO(cs) (((cs) & (1 << 0)) == 0) -#define CST43239_CHIPMODE_GSPI(cs) (((cs) & (1 << 0)) == (1 << 0)) +#define CST43239_CHIPMODE_SDIOD(cs) ((cs) & (1 << 15)) +#define CST43239_CHIPMODE_USB20D(cs) (~(cs) & (1 << 15)) +#define CST43239_CHIPMODE_SDIO(cs) (((cs) & (1 << 0)) == 0) +#define CST43239_CHIPMODE_GSPI(cs) (((cs) & (1 << 0)) == (1 << 0)) #define RES4324_OTP_PU 10 @@ -1736,8 +1693,8 @@ typedef volatile struct { #define CST4324_RES_INIT_MODE_SHIFT 10 #define CST4324_RES_INIT_MODE_MASK 0x00000c00 #define CST4324_CHIPMODE_MASK 0x7 -#define CST4324_CHIPMODE_SDIOD(cs) ((~(cs)) & (1 << 2)) -#define CST4324_CHIPMODE_USB20D(cs) (((cs) & CST4324_CHIPMODE_MASK) == 0x6) +#define CST4324_CHIPMODE_SDIOD(cs) ((~(cs)) & (1 << 2)) +#define CST4324_CHIPMODE_USB20D(cs) (((cs) & CST4324_CHIPMODE_MASK) == 0x6) #define RES4331_REGULATOR 0 @@ -1748,26 +1705,26 @@ typedef volatile struct { #define RES4331_HT_SI_AVAIL 5 -#define CCTRL4331_BT_COEXIST (1<<0) -#define CCTRL4331_SECI (1<<1) -#define CCTRL4331_EXT_LNA_G (1<<2) -#define CCTRL4331_SPROM_GPIO13_15 (1<<3) -#define CCTRL4331_EXTPA_EN (1<<4) -#define CCTRL4331_GPIOCLK_ON_SPROMCS (1<<5) -#define CCTRL4331_PCIE_MDIO_ON_SPROMCS (1<<6) -#define CCTRL4331_EXTPA_ON_GPIO2_5 (1<<7) -#define CCTRL4331_OVR_PIPEAUXCLKEN (1<<8) -#define CCTRL4331_OVR_PIPEAUXPWRDOWN (1<<9) -#define CCTRL4331_PCIE_AUXCLKEN (1<<10) -#define CCTRL4331_PCIE_PIPE_PLLDOWN (1<<11) -#define CCTRL4331_EXTPA_EN2 (1<<12) -#define CCTRL4331_EXT_LNA_A (1<<13) -#define CCTRL4331_BT_SHD0_ON_GPIO4 (1<<16) -#define CCTRL4331_BT_SHD1_ON_GPIO5 (1<<17) -#define CCTRL4331_EXTPA_ANA_EN (1<<24) - - -#define CST4331_XTAL_FREQ 0x00000001 +#define CCTRL4331_BT_COEXIST (1<<0) +#define CCTRL4331_SECI (1<<1) +#define CCTRL4331_EXT_LNA_G (1<<2) +#define CCTRL4331_SPROM_GPIO13_15 (1<<3) +#define CCTRL4331_EXTPA_EN (1<<4) +#define CCTRL4331_GPIOCLK_ON_SPROMCS (1<<5) +#define CCTRL4331_PCIE_MDIO_ON_SPROMCS (1<<6) +#define CCTRL4331_EXTPA_ON_GPIO2_5 (1<<7) +#define CCTRL4331_OVR_PIPEAUXCLKEN (1<<8) +#define CCTRL4331_OVR_PIPEAUXPWRDOWN (1<<9) +#define CCTRL4331_PCIE_AUXCLKEN (1<<10) +#define CCTRL4331_PCIE_PIPE_PLLDOWN (1<<11) +#define CCTRL4331_EXTPA_EN2 (1<<12) +#define CCTRL4331_EXT_LNA_A (1<<13) +#define CCTRL4331_BT_SHD0_ON_GPIO4 (1<<16) +#define CCTRL4331_BT_SHD1_ON_GPIO5 (1<<17) +#define CCTRL4331_EXTPA_ANA_EN (1<<24) + + +#define CST4331_XTAL_FREQ 0x00000001 #define CST4331_SPROM_OTP_SEL_MASK 0x00000006 #define CST4331_SPROM_OTP_SEL_SHIFT 1 #define CST4331_SPROM_PRESENT 0x00000002 @@ -1776,77 +1733,77 @@ typedef volatile struct { #define CST4331_LDO_PAR 0x00000010 -#define RES4315_CBUCK_LPOM 1 -#define RES4315_CBUCK_BURST 2 -#define RES4315_CBUCK_PWM 3 -#define RES4315_CLDO_PU 4 -#define RES4315_PALDO_PU 5 -#define RES4315_ILP_REQUEST 6 -#define RES4315_LNLDO1_PU 9 -#define RES4315_OTP_PU 10 -#define RES4315_LNLDO2_PU 12 -#define RES4315_XTAL_PU 13 -#define RES4315_ALP_AVAIL 14 -#define RES4315_RX_PWRSW_PU 15 -#define RES4315_TX_PWRSW_PU 16 -#define RES4315_RFPLL_PWRSW_PU 17 -#define RES4315_LOGEN_PWRSW_PU 18 -#define RES4315_AFE_PWRSW_PU 19 -#define RES4315_BBPLL_PWRSW_PU 20 -#define RES4315_HT_AVAIL 21 - - -#define CST4315_SPROM_OTP_SEL_MASK 0x00000003 -#define CST4315_DEFCIS_SEL 0x00000000 -#define CST4315_SPROM_SEL 0x00000001 -#define CST4315_OTP_SEL 0x00000002 -#define CST4315_OTP_PWRDN 0x00000003 -#define CST4315_SDIO_MODE 0x00000004 +#define RES4315_CBUCK_LPOM 1 +#define RES4315_CBUCK_BURST 2 +#define RES4315_CBUCK_PWM 3 +#define RES4315_CLDO_PU 4 +#define RES4315_PALDO_PU 5 +#define RES4315_ILP_REQUEST 6 +#define RES4315_LNLDO1_PU 9 +#define RES4315_OTP_PU 10 +#define RES4315_LNLDO2_PU 12 +#define RES4315_XTAL_PU 13 +#define RES4315_ALP_AVAIL 14 +#define RES4315_RX_PWRSW_PU 15 +#define RES4315_TX_PWRSW_PU 16 +#define RES4315_RFPLL_PWRSW_PU 17 +#define RES4315_LOGEN_PWRSW_PU 18 +#define RES4315_AFE_PWRSW_PU 19 +#define RES4315_BBPLL_PWRSW_PU 20 +#define RES4315_HT_AVAIL 21 + + +#define CST4315_SPROM_OTP_SEL_MASK 0x00000003 +#define CST4315_DEFCIS_SEL 0x00000000 +#define CST4315_SPROM_SEL 0x00000001 +#define CST4315_OTP_SEL 0x00000002 +#define CST4315_OTP_PWRDN 0x00000003 +#define CST4315_SDIO_MODE 0x00000004 #define CST4315_RCAL_VALID 0x00000008 #define CST4315_RCAL_VALUE_MASK 0x000001f0 #define CST4315_RCAL_VALUE_SHIFT 4 -#define CST4315_PALDO_EXTPNP 0x00000200 +#define CST4315_PALDO_EXTPNP 0x00000200 #define CST4315_CBUCK_MODE_MASK 0x00000c00 #define CST4315_CBUCK_MODE_BURST 0x00000400 #define CST4315_CBUCK_MODE_LPBURST 0x00000c00 -#define RES4319_CBUCK_LPOM 1 -#define RES4319_CBUCK_BURST 2 -#define RES4319_CBUCK_PWM 3 -#define RES4319_CLDO_PU 4 -#define RES4319_PALDO_PU 5 -#define RES4319_ILP_REQUEST 6 -#define RES4319_LNLDO1_PU 9 -#define RES4319_OTP_PU 10 -#define RES4319_LNLDO2_PU 12 -#define RES4319_XTAL_PU 13 -#define RES4319_ALP_AVAIL 14 -#define RES4319_RX_PWRSW_PU 15 -#define RES4319_TX_PWRSW_PU 16 -#define RES4319_RFPLL_PWRSW_PU 17 -#define RES4319_LOGEN_PWRSW_PU 18 -#define RES4319_AFE_PWRSW_PU 19 -#define RES4319_BBPLL_PWRSW_PU 20 -#define RES4319_HT_AVAIL 21 +#define RES4319_CBUCK_LPOM 1 +#define RES4319_CBUCK_BURST 2 +#define RES4319_CBUCK_PWM 3 +#define RES4319_CLDO_PU 4 +#define RES4319_PALDO_PU 5 +#define RES4319_ILP_REQUEST 6 +#define RES4319_LNLDO1_PU 9 +#define RES4319_OTP_PU 10 +#define RES4319_LNLDO2_PU 12 +#define RES4319_XTAL_PU 13 +#define RES4319_ALP_AVAIL 14 +#define RES4319_RX_PWRSW_PU 15 +#define RES4319_TX_PWRSW_PU 16 +#define RES4319_RFPLL_PWRSW_PU 17 +#define RES4319_LOGEN_PWRSW_PU 18 +#define RES4319_AFE_PWRSW_PU 19 +#define RES4319_BBPLL_PWRSW_PU 20 +#define RES4319_HT_AVAIL 21 #define CST4319_SPI_CPULESSUSB 0x00000001 #define CST4319_SPI_CLK_POL 0x00000002 #define CST4319_SPI_CLK_PH 0x00000008 -#define CST4319_SPROM_OTP_SEL_MASK 0x000000c0 +#define CST4319_SPROM_OTP_SEL_MASK 0x000000c0 #define CST4319_SPROM_OTP_SEL_SHIFT 6 -#define CST4319_DEFCIS_SEL 0x00000000 -#define CST4319_SPROM_SEL 0x00000040 -#define CST4319_OTP_SEL 0x00000080 -#define CST4319_OTP_PWRDN 0x000000c0 -#define CST4319_SDIO_USB_MODE 0x00000100 +#define CST4319_DEFCIS_SEL 0x00000000 +#define CST4319_SPROM_SEL 0x00000040 +#define CST4319_OTP_SEL 0x00000080 +#define CST4319_OTP_PWRDN 0x000000c0 +#define CST4319_SDIO_USB_MODE 0x00000100 #define CST4319_REMAP_SEL_MASK 0x00000600 #define CST4319_ILPDIV_EN 0x00000800 #define CST4319_XTAL_PD_POL 0x00001000 #define CST4319_LPO_SEL 0x00002000 #define CST4319_RES_INIT_MODE 0x0000c000 -#define CST4319_PALDO_EXTPNP 0x00010000 +#define CST4319_PALDO_EXTPNP 0x00010000 #define CST4319_CBUCK_MODE_MASK 0x00060000 #define CST4319_CBUCK_MODE_BURST 0x00020000 #define CST4319_CBUCK_MODE_LPBURST 0x00060000 @@ -1940,16 +1897,16 @@ typedef volatile struct { #define RES4330_5g_LOGEN_PWRSW_PU 27 -#define CST4330_CHIPMODE_SDIOD(cs) (((cs) & 0x7) < 6) -#define CST4330_CHIPMODE_USB20D(cs) (((cs) & 0x7) >= 6) -#define CST4330_CHIPMODE_SDIO(cs) (((cs) & 0x4) == 0) -#define CST4330_CHIPMODE_GSPI(cs) (((cs) & 0x6) == 4) -#define CST4330_CHIPMODE_USB(cs) (((cs) & 0x7) == 6) -#define CST4330_CHIPMODE_USBDA(cs) (((cs) & 0x7) == 7) +#define CST4330_CHIPMODE_SDIOD(cs) (((cs) & 0x7) < 6) +#define CST4330_CHIPMODE_USB20D(cs) (((cs) & 0x7) >= 6) +#define CST4330_CHIPMODE_SDIO(cs) (((cs) & 0x4) == 0) +#define CST4330_CHIPMODE_GSPI(cs) (((cs) & 0x6) == 4) +#define CST4330_CHIPMODE_USB(cs) (((cs) & 0x7) == 6) +#define CST4330_CHIPMODE_USBDA(cs) (((cs) & 0x7) == 7) #define CST4330_OTP_PRESENT 0x00000010 #define CST4330_LPO_AUTODET_EN 0x00000020 #define CST4330_ARMREMAP_0 0x00000040 -#define CST4330_SPROM_PRESENT 0x00000080 +#define CST4330_SPROM_PRESENT 0x00000080 #define CST4330_ILPDIV_EN 0x00000100 #define CST4330_LPO_SEL 0x00000200 #define CST4330_RES_INIT_MODE_SHIFT 10 @@ -1965,14 +1922,10 @@ typedef volatile struct { #define PCTL_4330_SERIAL_ENAB (1 << 24) -#define CCTRL_4330_GPIO_SEL 0x00000001 -#define CCTRL_4330_ERCX_SEL 0x00000002 -#define CCTRL_4330_SDIO_HOST_WAKE 0x00000004 -#define CCTRL_4330_JTAG_DISABLE 0x00000008 - -#define PMU_VREG0_ADDR 0 -#define PMU_VREG0_DISABLE_PULLD_BT_SHIFT 2 -#define PMU_VREG0_DISABLE_PULLD_WL_SHIFT 3 +#define CCTRL_4330_GPIO_SEL 0x00000001 +#define CCTRL_4330_ERCX_SEL 0x00000002 +#define CCTRL_4330_SDIO_HOST_WAKE 0x00000004 +#define CCTRL_4330_JTAG_DISABLE 0x00000008 #define RES4334_LPLDO_PU 0 @@ -2032,10 +1985,8 @@ typedef volatile struct { #define CCTRL4334_HSIC_LDO_PU (1 << 23) -#define CCTRL1_4324_GPIO_SEL (1 << 0) -#define CCTRL1_4324_SDIO_HOST_WAKE (1 << 2) - - +#define CCTRL1_4324_GPIO_SEL (1 << 0) +#define CCTRL1_4324_SDIO_HOST_WAKE (1 << 2) #define RES4313_BB_PU_RSRC 0 #define RES4313_ILP_REQ_RSRC 1 @@ -2061,7 +2012,7 @@ typedef volatile struct { #define CST4313_SPROM_OTP_SEL_SHIFT 0 -#define CCTRL_4313_12MA_LED_DRIVE 0x00000007 +#define CCTRL_4313_12MA_LED_DRIVE 0x00000007 #define RES4314_LPLDO_PU 0 @@ -2115,26 +2066,26 @@ typedef volatile struct { #define CST43228_SDIO_RESET 0x20 -#define CST4706_PKG_OPTION (1<<0) -#define CST4706_SFLASH_PRESENT (1<<1) -#define CST4706_SFLASH_TYPE (1<<2) -#define CST4706_MIPS_BENDIAN (1<<3) -#define CST4706_PCIE1_DISABLE (1<<5) +#define CST4706_PKG_OPTION (1<<0) +#define CST4706_SFLASH_PRESENT (1<<1) +#define CST4706_SFLASH_TYPE (1<<2) +#define CST4706_MIPS_BENDIAN (1<<3) +#define CST4706_PCIE1_DISABLE (1<<5) #define FLSTRCF4706_MASK 0x000000ff -#define FLSTRCF4706_SF1 0x00000001 -#define FLSTRCF4706_PF1 0x00000002 -#define FLSTRCF4706_SF1_TYPE 0x00000004 -#define FLSTRCF4706_NF1 0x00000008 -#define FLSTRCF4706_1ST_MADDR_SEG_MASK 0x000000f0 -#define FLSTRCF4706_1ST_MADDR_SEG_4MB 0x00000010 -#define FLSTRCF4706_1ST_MADDR_SEG_8MB 0x00000020 -#define FLSTRCF4706_1ST_MADDR_SEG_16MB 0x00000030 -#define FLSTRCF4706_1ST_MADDR_SEG_32MB 0x00000040 -#define FLSTRCF4706_1ST_MADDR_SEG_64MB 0x00000050 -#define FLSTRCF4706_1ST_MADDR_SEG_128MB 0x00000060 -#define FLSTRCF4706_1ST_MADDR_SEG_256MB 0x00000070 +#define FLSTRCF4706_SF1 0x00000001 +#define FLSTRCF4706_PF1 0x00000002 +#define FLSTRCF4706_SF1_TYPE 0x00000004 +#define FLSTRCF4706_NF1 0x00000008 +#define FLSTRCF4706_1ST_MADDR_SEG_MASK 0x000000f0 +#define FLSTRCF4706_1ST_MADDR_SEG_4MB 0x00000010 +#define FLSTRCF4706_1ST_MADDR_SEG_8MB 0x00000020 +#define FLSTRCF4706_1ST_MADDR_SEG_16MB 0x00000030 +#define FLSTRCF4706_1ST_MADDR_SEG_32MB 0x00000040 +#define FLSTRCF4706_1ST_MADDR_SEG_64MB 0x00000050 +#define FLSTRCF4706_1ST_MADDR_SEG_128MB 0x00000060 +#define FLSTRCF4706_1ST_MADDR_SEG_256MB 0x00000070 #define CCTRL4360_SECI_MODE (1 << 2) @@ -2147,12 +2098,14 @@ typedef volatile struct { #define RES4360_REGULATOR 0 #define RES4360_ILP_AVAIL 1 #define RES4360_ILP_REQ 2 -#define RES4360_XTAL_LDO_PU 3 -#define RES4360_XTAL_PU 4 -#define RES4360_ALP_AVAIL 5 -#define RES4360_BBPLLPWRSW_PU 6 -#define RES4360_HT_AVAIL 7 -#define RES4360_OTP_PU 8 +#define RES4360_XTAL_PU 3 +#define RES4360_ALP_AVAIL 4 +#define RES4360_BBPLLPWRSW_PU 5 +#define RES4360_HT_AVAIL 6 +#define RES4360_OTP_PU 7 +#define RES4360_USBLDO_PU 8 +#define RES4360_USBPLL_PWRSW_PU 9 +#define RES4360_LQ_AVAIL 10 #define CST4360_XTAL_40MZ 0x00000001 #define CST4360_SFLASH 0x00000002 @@ -2173,134 +2126,6 @@ typedef volatile struct { #define CCTRL_4360_UART_SEL 0x2 -#define RES4335_LPLDO_PO 0 -#define RES4335_PMU_BG_PU 1 -#define RES4335_PMU_SLEEP 2 -#define RES4335_RSVD_3 3 -#define RES4335_CBUCK_LPOM_PU 4 -#define RES4335_CBUCK_PFM_PU 5 -#define RES4335_RSVD_6 6 -#define RES4335_RSVD_7 7 -#define RES4335_LNLDO_PU 8 -#define RES4335_XTALLDO_PU 9 -#define RES4335_LDO3P3_PU 10 -#define RES4335_OTP_PU 11 -#define RES4335_XTAL_PU 12 -#define RES4335_SR_CLK_START 13 -#define RES4335_LQ_AVAIL 14 -#define RES4335_LQ_START 15 -#define RES4335_RSVD_16 16 -#define RES4335_WL_CORE_RDY 17 -#define RES4335_ILP_REQ 18 -#define RES4335_ALP_AVAIL 19 -#define RES4335_MINI_PMU 20 -#define RES4335_RADIO_PU 21 -#define RES4335_SR_CLK_STABLE 22 -#define RES4335_SR_SAVE_RESTORE 23 -#define RES4335_SR_PHY_PWRSW 24 -#define RES4335_SR_VDDM_PWRSW 25 -#define RES4335_SR_SUBCORE_PWRSW 26 -#define RES4335_SR_SLEEP 27 -#define RES4335_HT_START 28 -#define RES4335_HT_AVAIL 29 -#define RES4335_MACPHY_CLKAVAIL 30 - - -#define CST4335_SPROM_MASK 0x00000020 -#define CST4335_SFLASH_MASK 0x00000040 -#define CST4335_RES_INIT_MODE_SHIFT 7 -#define CST4335_RES_INIT_MODE_MASK 0x00000180 -#define CST4335_CHIPMODE_MASK 0xF -#define CST4335_CHIPMODE_SDIOD(cs) (((cs) & (1 << 0)) != 0) -#define CST4335_CHIPMODE_GSPI(cs) (((cs) & (1 << 1)) != 0) -#define CST4335_CHIPMODE_USB20D(cs) (((cs) & (1 << 2)) != 0) -#define CST4335_CHIPMODE_PCIE(cs) (((cs) & (1 << 3)) != 0) - - -#define CCTRL1_4335_GPIO_SEL (1 << 0) -#define CCTRL1_4335_SDIO_HOST_WAKE (1 << 2) - - -#define CR4_RAM_BASE (0x180000) - - - - -#define CC_GCI_CHIPCTRL_00 (0) -#define CC_GCI_CHIPCTRL_01 (1) -#define CC_GCI_CHIPCTRL_02 (2) -#define CC_GCI_CHIPCTRL_03 (3) -#define CC_GCI_CHIPCTRL_04 (4) -#define CC_GCI_CHIPCTRL_05 (5) -#define CC_GCI_CHIPCTRL_06 (6) -#define CC_GCI_CHIPCTRL_07 (7) -#define CC_GCI_CHIPCTRL_08 (8) - -#define CC_GCI_NUMCHIPCTRLREGS(cap1) ((cap1 & 0xF00) >> 8) - - -#define CC4335_PIN_GPIO_00 (0) -#define CC4335_PIN_GPIO_01 (1) -#define CC4335_PIN_GPIO_02 (2) -#define CC4335_PIN_GPIO_03 (3) -#define CC4335_PIN_GPIO_04 (4) -#define CC4335_PIN_GPIO_05 (5) -#define CC4335_PIN_GPIO_06 (6) -#define CC4335_PIN_GPIO_07 (7) -#define CC4335_PIN_GPIO_08 (8) -#define CC4335_PIN_GPIO_09 (9) -#define CC4335_PIN_GPIO_10 (10) -#define CC4335_PIN_GPIO_11 (11) -#define CC4335_PIN_GPIO_12 (12) -#define CC4335_PIN_GPIO_13 (13) -#define CC4335_PIN_GPIO_14 (14) -#define CC4335_PIN_GPIO_15 (15) -#define CC4335_PIN_SDIO_CLK (16) -#define CC4335_PIN_SDIO_CMD (17) -#define CC4335_PIN_SDIO_DATA0 (18) -#define CC4335_PIN_SDIO_DATA1 (19) -#define CC4335_PIN_SDIO_DATA2 (20) -#define CC4335_PIN_SDIO_DATA3 (21) -#define CC4335_PIN_RF_SW_CTRL_0 (22) -#define CC4335_PIN_RF_SW_CTRL_1 (23) -#define CC4335_PIN_RF_SW_CTRL_2 (24) -#define CC4335_PIN_RF_SW_CTRL_3 (25) -#define CC4335_PIN_RF_SW_CTRL_4 (26) -#define CC4335_PIN_RF_SW_CTRL_5 (27) -#define CC4335_PIN_RF_SW_CTRL_6 (28) -#define CC4335_PIN_RF_SW_CTRL_7 (29) -#define CC4335_PIN_RF_SW_CTRL_8 (30) -#define CC4335_PIN_RF_SW_CTRL_9 (31) - - -#define CC4335_FNSEL_HWDEF (0) -#define CC4335_FNSEL_SAMEASPIN (1) -#define CC4335_FNSEL_GPIO0 (2) -#define CC4335_FNSEL_GPIO1 (3) -#define CC4335_FNSEL_GCI0 (4) -#define CC4335_FNSEL_GCI1 (5) -#define CC4335_FNSEL_UART (6) -#define CC4335_FNSEL_SFLASH (7) -#define CC4335_FNSEL_SPROM (8) -#define CC4335_FNSEL_MISC0 (9) -#define CC4335_FNSEL_MISC1 (10) -#define CC4335_FNSEL_MISC2 (11) -#define CC4335_FNSEL_IND (12) -#define CC4335_FNSEL_PDN (13) -#define CC4335_FNSEL_PUP (14) -#define CC4335_FNSEL_TRI (15) - - -#define GCIMASK(pos) (((uint32)0xF) << pos) - - -#define GCIPOSVAL(val, pos) ((((uint32)val) << pos) & GCIMASK(pos)) - - -#define MUXENAB4335_UART_MASK (0x0000000f) - - - #define CHIP_HOSTIF_USB(sih) (si_chip_hostif(sih) & CST4360_MODE_USB) @@ -2322,7 +2147,7 @@ typedef volatile struct { #define SECI_ENAB_SECI_ECI (1 << 2) #define SECI_ENAB_SECIOUT_DIS (1 << 3) #define SECI_MODE_MASK 0x7 -#define SECI_MODE_SHIFT 4 +#define SECI_MODE_SHIFT 4 #define SECI_UPD_SECI (1 << 7) #define SECI_SIGNOFF_0 0xDB @@ -2338,11 +2163,11 @@ typedef volatile struct { #define SECI_UART_SECI_IN2_STATE (1 << 3) -#define SECI_UART_LCR_STOP_BITS (1 << 0) +#define SECI_UART_LCR_STOP_BITS (1 << 0) #define SECI_UART_LCR_PARITY_EN (1 << 1) -#define SECI_UART_LCR_PARITY (1 << 2) +#define SECI_UART_LCR_PARITY (1 << 2) #define SECI_UART_LCR_RX_EN (1 << 3) -#define SECI_UART_LCR_LBRK_CTRL (1 << 4) +#define SECI_UART_LCR_LBRK_CTRL (1 << 4) #define SECI_UART_LCR_TXO_EN (1 << 5) #define SECI_UART_LCR_RTSO_EN (1 << 6) #define SECI_UART_LCR_SLIPMODE_EN (1 << 7) @@ -2377,4 +2202,4 @@ typedef volatile struct { #define WLAN_NUM_ANT1 TXANT_0 #define WLAN_NUM_ANT2 TXANT_1 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/sbconfig.h b/drivers/net/wireless/bcmdhd/src/include/sbconfig.h index 44d6832..96038c3 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbconfig.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbconfig.h @@ -1,14 +1,14 @@ /* * Broadcom SiliconBackplane hardware register definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -35,18 +35,18 @@ #endif -#define SB_BUS_SIZE 0x10000 +#define SB_BUS_SIZE 0x10000 #define SB_BUS_BASE(b) (SI_ENUM_BASE + (b) * SB_BUS_SIZE) -#define SB_BUS_MAXCORES (SB_BUS_SIZE / SI_CORE_SIZE) +#define SB_BUS_MAXCORES (SB_BUS_SIZE / SI_CORE_SIZE) -#define SBCONFIGOFF 0xf00 -#define SBCONFIGSIZE 256 +#define SBCONFIGOFF 0xf00 +#define SBCONFIGSIZE 256 #define SBIPSFLAG 0x08 #define SBTPSFLAG 0x18 -#define SBTMERRLOGA 0x48 -#define SBTMERRLOG 0x50 +#define SBTMERRLOGA 0x48 +#define SBTMERRLOG 0x50 #define SBADMATCH3 0x60 #define SBADMATCH2 0x68 #define SBADMATCH1 0x70 @@ -78,198 +78,198 @@ typedef volatile struct _sbconfig { uint32 PAD[2]; - uint32 sbipsflag; + uint32 sbipsflag; uint32 PAD[3]; - uint32 sbtpsflag; + uint32 sbtpsflag; uint32 PAD[11]; - uint32 sbtmerrloga; + uint32 sbtmerrloga; uint32 PAD; - uint32 sbtmerrlog; + uint32 sbtmerrlog; uint32 PAD[3]; - uint32 sbadmatch3; + uint32 sbadmatch3; uint32 PAD; - uint32 sbadmatch2; + uint32 sbadmatch2; uint32 PAD; - uint32 sbadmatch1; + uint32 sbadmatch1; uint32 PAD[7]; - uint32 sbimstate; - uint32 sbintvec; - uint32 sbtmstatelow; - uint32 sbtmstatehigh; - uint32 sbbwa0; + uint32 sbimstate; + uint32 sbintvec; + uint32 sbtmstatelow; + uint32 sbtmstatehigh; + uint32 sbbwa0; uint32 PAD; - uint32 sbimconfiglow; - uint32 sbimconfighigh; - uint32 sbadmatch0; + uint32 sbimconfiglow; + uint32 sbimconfighigh; + uint32 sbadmatch0; uint32 PAD; - uint32 sbtmconfiglow; - uint32 sbtmconfighigh; - uint32 sbbconfig; + uint32 sbtmconfiglow; + uint32 sbtmconfighigh; + uint32 sbbconfig; uint32 PAD; - uint32 sbbstate; + uint32 sbbstate; uint32 PAD[3]; - uint32 sbactcnfg; + uint32 sbactcnfg; uint32 PAD[3]; - uint32 sbflagst; + uint32 sbflagst; uint32 PAD[3]; - uint32 sbidlow; - uint32 sbidhigh; + uint32 sbidlow; + uint32 sbidhigh; } sbconfig_t; -#endif +#endif -#define SBIPS_INT1_MASK 0x3f +#define SBIPS_INT1_MASK 0x3f #define SBIPS_INT1_SHIFT 0 -#define SBIPS_INT2_MASK 0x3f00 +#define SBIPS_INT2_MASK 0x3f00 #define SBIPS_INT2_SHIFT 8 -#define SBIPS_INT3_MASK 0x3f0000 +#define SBIPS_INT3_MASK 0x3f0000 #define SBIPS_INT3_SHIFT 16 -#define SBIPS_INT4_MASK 0x3f000000 +#define SBIPS_INT4_MASK 0x3f000000 #define SBIPS_INT4_SHIFT 24 -#define SBTPS_NUM0_MASK 0x3f -#define SBTPS_F0EN0 0x40 +#define SBTPS_NUM0_MASK 0x3f +#define SBTPS_F0EN0 0x40 -#define SBTMEL_CM 0x00000007 -#define SBTMEL_CI 0x0000ff00 -#define SBTMEL_EC 0x0f000000 -#define SBTMEL_ME 0x80000000 +#define SBTMEL_CM 0x00000007 +#define SBTMEL_CI 0x0000ff00 +#define SBTMEL_EC 0x0f000000 +#define SBTMEL_ME 0x80000000 -#define SBIM_PC 0xf -#define SBIM_AP_MASK 0x30 -#define SBIM_AP_BOTH 0x00 -#define SBIM_AP_TS 0x10 -#define SBIM_AP_TK 0x20 -#define SBIM_AP_RSV 0x30 -#define SBIM_IBE 0x20000 -#define SBIM_TO 0x40000 -#define SBIM_BY 0x01800000 -#define SBIM_RJ 0x02000000 +#define SBIM_PC 0xf +#define SBIM_AP_MASK 0x30 +#define SBIM_AP_BOTH 0x00 +#define SBIM_AP_TS 0x10 +#define SBIM_AP_TK 0x20 +#define SBIM_AP_RSV 0x30 +#define SBIM_IBE 0x20000 +#define SBIM_TO 0x40000 +#define SBIM_BY 0x01800000 +#define SBIM_RJ 0x02000000 -#define SBTML_RESET 0x0001 -#define SBTML_REJ_MASK 0x0006 -#define SBTML_REJ 0x0002 -#define SBTML_TMPREJ 0x0004 +#define SBTML_RESET 0x0001 +#define SBTML_REJ_MASK 0x0006 +#define SBTML_REJ 0x0002 +#define SBTML_TMPREJ 0x0004 -#define SBTML_SICF_SHIFT 16 +#define SBTML_SICF_SHIFT 16 -#define SBTMH_SERR 0x0001 -#define SBTMH_INT 0x0002 -#define SBTMH_BUSY 0x0004 -#define SBTMH_TO 0x0020 +#define SBTMH_SERR 0x0001 +#define SBTMH_INT 0x0002 +#define SBTMH_BUSY 0x0004 +#define SBTMH_TO 0x0020 -#define SBTMH_SISF_SHIFT 16 +#define SBTMH_SISF_SHIFT 16 -#define SBBWA_TAB0_MASK 0xffff -#define SBBWA_TAB1_MASK 0xffff +#define SBBWA_TAB0_MASK 0xffff +#define SBBWA_TAB1_MASK 0xffff #define SBBWA_TAB1_SHIFT 16 -#define SBIMCL_STO_MASK 0x7 -#define SBIMCL_RTO_MASK 0x70 +#define SBIMCL_STO_MASK 0x7 +#define SBIMCL_RTO_MASK 0x70 #define SBIMCL_RTO_SHIFT 4 -#define SBIMCL_CID_MASK 0xff0000 +#define SBIMCL_CID_MASK 0xff0000 #define SBIMCL_CID_SHIFT 16 -#define SBIMCH_IEM_MASK 0xc -#define SBIMCH_TEM_MASK 0x30 +#define SBIMCH_IEM_MASK 0xc +#define SBIMCH_TEM_MASK 0x30 #define SBIMCH_TEM_SHIFT 4 -#define SBIMCH_BEM_MASK 0xc0 +#define SBIMCH_BEM_MASK 0xc0 #define SBIMCH_BEM_SHIFT 6 -#define SBAM_TYPE_MASK 0x3 -#define SBAM_AD64 0x4 -#define SBAM_ADINT0_MASK 0xf8 +#define SBAM_TYPE_MASK 0x3 +#define SBAM_AD64 0x4 +#define SBAM_ADINT0_MASK 0xf8 #define SBAM_ADINT0_SHIFT 3 -#define SBAM_ADINT1_MASK 0x1f8 +#define SBAM_ADINT1_MASK 0x1f8 #define SBAM_ADINT1_SHIFT 3 -#define SBAM_ADINT2_MASK 0x1f8 +#define SBAM_ADINT2_MASK 0x1f8 #define SBAM_ADINT2_SHIFT 3 -#define SBAM_ADEN 0x400 -#define SBAM_ADNEG 0x800 -#define SBAM_BASE0_MASK 0xffffff00 +#define SBAM_ADEN 0x400 +#define SBAM_ADNEG 0x800 +#define SBAM_BASE0_MASK 0xffffff00 #define SBAM_BASE0_SHIFT 8 -#define SBAM_BASE1_MASK 0xfffff000 +#define SBAM_BASE1_MASK 0xfffff000 #define SBAM_BASE1_SHIFT 12 -#define SBAM_BASE2_MASK 0xffff0000 +#define SBAM_BASE2_MASK 0xffff0000 #define SBAM_BASE2_SHIFT 16 -#define SBTMCL_CD_MASK 0xff -#define SBTMCL_CO_MASK 0xf800 +#define SBTMCL_CD_MASK 0xff +#define SBTMCL_CO_MASK 0xf800 #define SBTMCL_CO_SHIFT 11 -#define SBTMCL_IF_MASK 0xfc0000 +#define SBTMCL_IF_MASK 0xfc0000 #define SBTMCL_IF_SHIFT 18 -#define SBTMCL_IM_MASK 0x3000000 +#define SBTMCL_IM_MASK 0x3000000 #define SBTMCL_IM_SHIFT 24 -#define SBTMCH_BM_MASK 0x3 -#define SBTMCH_RM_MASK 0x3 +#define SBTMCH_BM_MASK 0x3 +#define SBTMCH_RM_MASK 0x3 #define SBTMCH_RM_SHIFT 2 -#define SBTMCH_SM_MASK 0x30 +#define SBTMCH_SM_MASK 0x30 #define SBTMCH_SM_SHIFT 4 -#define SBTMCH_EM_MASK 0x300 +#define SBTMCH_EM_MASK 0x300 #define SBTMCH_EM_SHIFT 8 -#define SBTMCH_IM_MASK 0xc00 +#define SBTMCH_IM_MASK 0xc00 #define SBTMCH_IM_SHIFT 10 -#define SBBC_LAT_MASK 0x3 -#define SBBC_MAX0_MASK 0xf0000 +#define SBBC_LAT_MASK 0x3 +#define SBBC_MAX0_MASK 0xf0000 #define SBBC_MAX0_SHIFT 16 -#define SBBC_MAX1_MASK 0xf00000 +#define SBBC_MAX1_MASK 0xf00000 #define SBBC_MAX1_SHIFT 20 -#define SBBS_SRD 0x1 -#define SBBS_HRD 0x2 +#define SBBS_SRD 0x1 +#define SBBS_HRD 0x2 -#define SBIDL_CS_MASK 0x3 -#define SBIDL_AR_MASK 0x38 +#define SBIDL_CS_MASK 0x3 +#define SBIDL_AR_MASK 0x38 #define SBIDL_AR_SHIFT 3 -#define SBIDL_SYNCH 0x40 -#define SBIDL_INIT 0x80 -#define SBIDL_MINLAT_MASK 0xf00 +#define SBIDL_SYNCH 0x40 +#define SBIDL_INIT 0x80 +#define SBIDL_MINLAT_MASK 0xf00 #define SBIDL_MINLAT_SHIFT 8 -#define SBIDL_MAXLAT 0xf000 +#define SBIDL_MAXLAT 0xf000 #define SBIDL_MAXLAT_SHIFT 12 -#define SBIDL_FIRST 0x10000 -#define SBIDL_CW_MASK 0xc0000 +#define SBIDL_FIRST 0x10000 +#define SBIDL_CW_MASK 0xc0000 #define SBIDL_CW_SHIFT 18 -#define SBIDL_TP_MASK 0xf00000 +#define SBIDL_TP_MASK 0xf00000 #define SBIDL_TP_SHIFT 20 -#define SBIDL_IP_MASK 0xf000000 +#define SBIDL_IP_MASK 0xf000000 #define SBIDL_IP_SHIFT 24 -#define SBIDL_RV_MASK 0xf0000000 +#define SBIDL_RV_MASK 0xf0000000 #define SBIDL_RV_SHIFT 28 -#define SBIDL_RV_2_2 0x00000000 -#define SBIDL_RV_2_3 0x10000000 +#define SBIDL_RV_2_2 0x00000000 +#define SBIDL_RV_2_3 0x10000000 -#define SBIDH_RC_MASK 0x000f -#define SBIDH_RCE_MASK 0x7000 +#define SBIDH_RC_MASK 0x000f +#define SBIDH_RCE_MASK 0x7000 #define SBIDH_RCE_SHIFT 8 #define SBCOREREV(sbidh) \ ((((sbidh) & SBIDH_RCE_MASK) >> SBIDH_RCE_SHIFT) | ((sbidh) & SBIDH_RC_MASK)) -#define SBIDH_CC_MASK 0x8ff0 +#define SBIDH_CC_MASK 0x8ff0 #define SBIDH_CC_SHIFT 4 -#define SBIDH_VC_MASK 0xffff0000 +#define SBIDH_VC_MASK 0xffff0000 #define SBIDH_VC_SHIFT 16 -#define SB_COMMIT 0xfd8 +#define SB_COMMIT 0xfd8 -#define SB_VEND_BCM 0x4243 +#define SB_VEND_BCM 0x4243 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/src/include/sbhnddma.h b/drivers/net/wireless/bcmdhd/src/include/sbhnddma.h new file mode 100644 index 0000000..81e94df --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/include/sbhnddma.h @@ -0,0 +1,370 @@ +/* + * Generic Broadcom Home Networking Division (HND) DMA engine HW interface + * This supports the following chips: BCM42xx, 44xx, 47xx . + * + * Copyright (C) 1999-2011, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: sbhnddma.h 305346 2011-12-28 04:27:46Z $ + */ + +#ifndef _sbhnddma_h_ +#define _sbhnddma_h_ + + + + + + + +typedef volatile struct { + uint32 control; + uint32 addr; + uint32 ptr; + uint32 status; +} dma32regs_t; + +typedef volatile struct { + dma32regs_t xmt; + dma32regs_t rcv; +} dma32regp_t; + +typedef volatile struct { + uint32 fifoaddr; + uint32 fifodatalow; + uint32 fifodatahigh; + uint32 pad; +} dma32diag_t; + + +typedef volatile struct { + uint32 ctrl; + uint32 addr; +} dma32dd_t; + + +#define D32RINGALIGN_BITS 12 +#define D32MAXRINGSZ (1 << D32RINGALIGN_BITS) +#define D32RINGALIGN (1 << D32RINGALIGN_BITS) + +#define D32MAXDD (D32MAXRINGSZ / sizeof (dma32dd_t)) + + +#define XC_XE ((uint32)1 << 0) +#define XC_SE ((uint32)1 << 1) +#define XC_LE ((uint32)1 << 2) +#define XC_FL ((uint32)1 << 4) +#define XC_MR_MASK 0x000000C0 +#define XC_MR_SHIFT 6 +#define XC_PD ((uint32)1 << 11) +#define XC_AE ((uint32)3 << 16) +#define XC_AE_SHIFT 16 +#define XC_BL_MASK 0x001C0000 +#define XC_BL_SHIFT 18 +#define XC_PC_MASK 0x00E00000 +#define XC_PC_SHIFT 21 +#define XC_PT_MASK 0x03000000 +#define XC_PT_SHIFT 24 + + +#define DMA_MR_1 0 +#define DMA_MR_2 1 + + + +#define DMA_BL_16 0 +#define DMA_BL_32 1 +#define DMA_BL_64 2 +#define DMA_BL_128 3 +#define DMA_BL_256 4 +#define DMA_BL_512 5 +#define DMA_BL_1024 6 + + +#define DMA_PC_0 0 +#define DMA_PC_4 1 +#define DMA_PC_8 2 +#define DMA_PC_16 3 + + + +#define DMA_PT_1 0 +#define DMA_PT_2 1 +#define DMA_PT_4 2 +#define DMA_PT_8 3 + + +#define XP_LD_MASK 0xfff + + +#define XS_CD_MASK 0x0fff +#define XS_XS_MASK 0xf000 +#define XS_XS_SHIFT 12 +#define XS_XS_DISABLED 0x0000 +#define XS_XS_ACTIVE 0x1000 +#define XS_XS_IDLE 0x2000 +#define XS_XS_STOPPED 0x3000 +#define XS_XS_SUSP 0x4000 +#define XS_XE_MASK 0xf0000 +#define XS_XE_SHIFT 16 +#define XS_XE_NOERR 0x00000 +#define XS_XE_DPE 0x10000 +#define XS_XE_DFU 0x20000 +#define XS_XE_BEBR 0x30000 +#define XS_XE_BEDA 0x40000 +#define XS_AD_MASK 0xfff00000 +#define XS_AD_SHIFT 20 + + +#define RC_RE ((uint32)1 << 0) +#define RC_RO_MASK 0xfe +#define RC_RO_SHIFT 1 +#define RC_FM ((uint32)1 << 8) +#define RC_SH ((uint32)1 << 9) +#define RC_OC ((uint32)1 << 10) +#define RC_PD ((uint32)1 << 11) +#define RC_AE ((uint32)3 << 16) +#define RC_AE_SHIFT 16 +#define RC_BL_MASK 0x001C0000 +#define RC_BL_SHIFT 18 +#define RC_PC_MASK 0x00E00000 +#define RC_PC_SHIFT 21 +#define RC_PT_MASK 0x03000000 +#define RC_PT_SHIFT 24 + + +#define RP_LD_MASK 0xfff + + +#define RS_CD_MASK 0x0fff +#define RS_RS_MASK 0xf000 +#define RS_RS_SHIFT 12 +#define RS_RS_DISABLED 0x0000 +#define RS_RS_ACTIVE 0x1000 +#define RS_RS_IDLE 0x2000 +#define RS_RS_STOPPED 0x3000 +#define RS_RE_MASK 0xf0000 +#define RS_RE_SHIFT 16 +#define RS_RE_NOERR 0x00000 +#define RS_RE_DPE 0x10000 +#define RS_RE_DFO 0x20000 +#define RS_RE_BEBW 0x30000 +#define RS_RE_BEDA 0x40000 +#define RS_AD_MASK 0xfff00000 +#define RS_AD_SHIFT 20 + + +#define FA_OFF_MASK 0xffff +#define FA_SEL_MASK 0xf0000 +#define FA_SEL_SHIFT 16 +#define FA_SEL_XDD 0x00000 +#define FA_SEL_XDP 0x10000 +#define FA_SEL_RDD 0x40000 +#define FA_SEL_RDP 0x50000 +#define FA_SEL_XFD 0x80000 +#define FA_SEL_XFP 0x90000 +#define FA_SEL_RFD 0xc0000 +#define FA_SEL_RFP 0xd0000 +#define FA_SEL_RSD 0xe0000 +#define FA_SEL_RSP 0xf0000 + + +#define CTRL_BC_MASK 0x00001fff +#define CTRL_AE ((uint32)3 << 16) +#define CTRL_AE_SHIFT 16 +#define CTRL_PARITY ((uint32)3 << 18) +#define CTRL_EOT ((uint32)1 << 28) +#define CTRL_IOC ((uint32)1 << 29) +#define CTRL_EOF ((uint32)1 << 30) +#define CTRL_SOF ((uint32)1 << 31) + + +#define CTRL_CORE_MASK 0x0ff00000 + + + + +typedef volatile struct { + uint32 control; + uint32 ptr; + uint32 addrlow; + uint32 addrhigh; + uint32 status0; + uint32 status1; +} dma64regs_t; + +typedef volatile struct { + dma64regs_t tx; + dma64regs_t rx; +} dma64regp_t; + +typedef volatile struct { + uint32 fifoaddr; + uint32 fifodatalow; + uint32 fifodatahigh; + uint32 pad; +} dma64diag_t; + + +typedef volatile struct { + uint32 ctrl1; + uint32 ctrl2; + uint32 addrlow; + uint32 addrhigh; +} dma64dd_t; + + +#define D64RINGALIGN_BITS 13 +#define D64MAXRINGSZ (1 << D64RINGALIGN_BITS) +#define D64RINGALIGN (1 << D64RINGALIGN_BITS) + +#define D64MAXDD (D64MAXRINGSZ / sizeof (dma64dd_t)) + + +#define D64_XC_XE 0x00000001 +#define D64_XC_SE 0x00000002 +#define D64_XC_LE 0x00000004 +#define D64_XC_FL 0x00000010 +#define D64_XC_MR_MASK 0x000000C0 +#define D64_XC_MR_SHIFT 6 +#define D64_XC_PD 0x00000800 +#define D64_XC_AE 0x00030000 +#define D64_XC_AE_SHIFT 16 +#define D64_XC_BL_MASK 0x001C0000 +#define D64_XC_BL_SHIFT 18 +#define D64_XC_PC_MASK 0x00E00000 +#define D64_XC_PC_SHIFT 21 +#define D64_XC_PT_MASK 0x03000000 +#define D64_XC_PT_SHIFT 24 + + +#define D64_XP_LD_MASK 0x00001fff + + +#define D64_XS0_CD_MASK 0x00001fff +#define D64_XS0_XS_MASK 0xf0000000 +#define D64_XS0_XS_SHIFT 28 +#define D64_XS0_XS_DISABLED 0x00000000 +#define D64_XS0_XS_ACTIVE 0x10000000 +#define D64_XS0_XS_IDLE 0x20000000 +#define D64_XS0_XS_STOPPED 0x30000000 +#define D64_XS0_XS_SUSP 0x40000000 + +#define D64_XS1_AD_MASK 0x00001fff +#define D64_XS1_XE_MASK 0xf0000000 +#define D64_XS1_XE_SHIFT 28 +#define D64_XS1_XE_NOERR 0x00000000 +#define D64_XS1_XE_DPE 0x10000000 +#define D64_XS1_XE_DFU 0x20000000 +#define D64_XS1_XE_DTE 0x30000000 +#define D64_XS1_XE_DESRE 0x40000000 +#define D64_XS1_XE_COREE 0x50000000 + + +#define D64_RC_RE 0x00000001 +#define D64_RC_RO_MASK 0x000000fe +#define D64_RC_RO_SHIFT 1 +#define D64_RC_FM 0x00000100 +#define D64_RC_SH 0x00000200 +#define D64_RC_OC 0x00000400 +#define D64_RC_PD 0x00000800 +#define D64_RC_AE 0x00030000 +#define D64_RC_AE_SHIFT 16 +#define D64_RC_BL_MASK 0x001C0000 +#define D64_RC_BL_SHIFT 18 +#define D64_RC_PC_MASK 0x00E00000 +#define D64_RC_PC_SHIFT 21 +#define D64_RC_PT_MASK 0x03000000 +#define D64_RC_PT_SHIFT 24 + + +#define DMA_CTRL_PEN (1 << 0) +#define DMA_CTRL_ROC (1 << 1) +#define DMA_CTRL_RXMULTI (1 << 2) +#define DMA_CTRL_UNFRAMED (1 << 3) +#define DMA_CTRL_USB_BOUNDRY4KB_WAR (1 << 4) +#define DMA_CTRL_DMA_AVOIDANCE_WAR (1 << 5) + + +#define D64_RP_LD_MASK 0x00001fff + + +#define D64_RS0_CD_MASK 0x00001fff +#define D64_RS0_RS_MASK 0xf0000000 +#define D64_RS0_RS_SHIFT 28 +#define D64_RS0_RS_DISABLED 0x00000000 +#define D64_RS0_RS_ACTIVE 0x10000000 +#define D64_RS0_RS_IDLE 0x20000000 +#define D64_RS0_RS_STOPPED 0x30000000 +#define D64_RS0_RS_SUSP 0x40000000 + +#define D64_RS1_AD_MASK 0x0001ffff +#define D64_RS1_RE_MASK 0xf0000000 +#define D64_RS1_RE_SHIFT 28 +#define D64_RS1_RE_NOERR 0x00000000 +#define D64_RS1_RE_DPO 0x10000000 +#define D64_RS1_RE_DFU 0x20000000 +#define D64_RS1_RE_DTE 0x30000000 +#define D64_RS1_RE_DESRE 0x40000000 +#define D64_RS1_RE_COREE 0x50000000 + + +#define D64_FA_OFF_MASK 0xffff +#define D64_FA_SEL_MASK 0xf0000 +#define D64_FA_SEL_SHIFT 16 +#define D64_FA_SEL_XDD 0x00000 +#define D64_FA_SEL_XDP 0x10000 +#define D64_FA_SEL_RDD 0x40000 +#define D64_FA_SEL_RDP 0x50000 +#define D64_FA_SEL_XFD 0x80000 +#define D64_FA_SEL_XFP 0x90000 +#define D64_FA_SEL_RFD 0xc0000 +#define D64_FA_SEL_RFP 0xd0000 +#define D64_FA_SEL_RSD 0xe0000 +#define D64_FA_SEL_RSP 0xf0000 + + +#define D64_CTRL_COREFLAGS 0x0ff00000 +#define D64_CTRL1_EOT ((uint32)1 << 28) +#define D64_CTRL1_IOC ((uint32)1 << 29) +#define D64_CTRL1_EOF ((uint32)1 << 30) +#define D64_CTRL1_SOF ((uint32)1 << 31) + + +#define D64_CTRL2_BC_MASK 0x00007fff +#define D64_CTRL2_AE 0x00030000 +#define D64_CTRL2_AE_SHIFT 16 +#define D64_CTRL2_PARITY 0x00040000 + + +#define D64_CTRL_CORE_MASK 0x0ff00000 + +#define D64_RX_FRM_STS_LEN 0x0000ffff +#define D64_RX_FRM_STS_OVFL 0x00800000 +#define D64_RX_FRM_STS_DSCRCNT 0x0f000000 +#define D64_RX_FRM_STS_DATATYPE 0xf0000000 + + +typedef volatile struct { + uint16 len; + uint16 flags; +} dma_rxh_t; + +#endif diff --git a/drivers/net/wireless/bcmdhd/include/sbpcmcia.h b/drivers/net/wireless/bcmdhd/src/include/sbpcmcia.h index 6ad98b5..35d7b65 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbpcmcia.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbpcmcia.h @@ -1,14 +1,14 @@ /* * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbpcmcia.h 326494 2012-04-09 13:29:57Z $ + * $Id: sbpcmcia.h 307736 2012-01-12 10:57:05Z $ */ #ifndef _SBPCMCIA_H @@ -81,8 +81,8 @@ #define SROM_DATAH (0x073a / 2) #define SROM_ADDRL (0x073c / 2) #define SROM_ADDRH (0x073e / 2) -#define SROM_INFO2 (0x0772 / 2) -#define SROM_INFO (0x07be / 2) +#define SROM_INFO2 (0x0772 / 2) +#define SROM_INFO (0x07be / 2) #define SROM_IDLE 0 @@ -99,10 +99,10 @@ -#define SBTML_INT_ACK 0x40000 -#define SBTML_INT_EN 0x20000 +#define SBTML_INT_ACK 0x40000 +#define SBTML_INT_EN 0x20000 -#define SBTMH_INT_STATUS 0x40000 +#define SBTMH_INT_STATUS 0x40000 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/sbsdio.h b/drivers/net/wireless/bcmdhd/src/include/sbsdio.h index 00e44d2..334c44e 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbsdio.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbsdio.h @@ -4,14 +4,14 @@ * * SDIO core support 1bit, 4 bit SDIO mode as well as SPI mode. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,12 +19,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbsdio.h 308945 2012-01-18 02:15:27Z $ + * $Id: sbsdio.h 303863 2011-12-20 07:14:09Z $ */ #ifndef _SBSDIO_H @@ -36,7 +36,7 @@ #define SBSDIO_SPROM_CS 0x10000 /* sprom command and status */ #define SBSDIO_SPROM_INFO 0x10001 /* sprom info register */ #define SBSDIO_SPROM_DATA_LOW 0x10002 /* sprom indirect access data byte 0 */ -#define SBSDIO_SPROM_DATA_HIGH 0x10003 /* sprom indirect access data byte 1 */ +#define SBSDIO_SPROM_DATA_HIGH 0x10003 /* sprom indirect access data byte 1 */ #define SBSDIO_SPROM_ADDR_LOW 0x10004 /* sprom indirect access addr byte 0 */ #define SBSDIO_SPROM_ADDR_HIGH 0x10005 /* sprom indirect access addr byte 0 */ #define SBSDIO_CHIP_CTRL_DATA 0x10006 /* xtal_pu (gpio) output */ @@ -50,15 +50,15 @@ #define SBSDIO_FUNC1_SBADDRHIGH 0x1000C /* SB Address Window High (b31:b24) */ #define SBSDIO_FUNC1_FRAMECTRL 0x1000D /* Frame Control (frame term/abort) */ #define SBSDIO_FUNC1_CHIPCLKCSR 0x1000E /* ChipClockCSR (ALP/HT ctl/status) */ -#define SBSDIO_FUNC1_SDIOPULLUP 0x1000F /* SdioPullUp (on cmd, d0-d2) */ +#define SBSDIO_FUNC1_SDIOPULLUP 0x1000F /* SdioPullUp (on cmd, d0-d2) */ #define SBSDIO_FUNC1_WFRAMEBCLO 0x10019 /* Write Frame Byte Count Low */ #define SBSDIO_FUNC1_WFRAMEBCHI 0x1001A /* Write Frame Byte Count High */ #define SBSDIO_FUNC1_RFRAMEBCLO 0x1001B /* Read Frame Byte Count Low */ #define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C /* Read Frame Byte Count High */ #define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D /* MesBusyCtl at 0x1001D (rev 11) */ -#define SBSDIO_FUNC1_MISC_REG_START 0x10000 /* f1 misc register start */ -#define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001C /* f1 misc register end */ +#define SBSDIO_FUNC1_MISC_REG_START 0x10000 /* f1 misc register start */ +#define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001C /* f1 misc register end */ /* Sdio Core Rev 12 */ #define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E @@ -164,11 +164,7 @@ /* direct(mapped) cis space */ #define SBSDIO_CIS_BASE_COMMON 0x1000 /* MAPPED common CIS address */ -#ifdef BCMSPI -#define SBSDIO_CIS_SIZE_LIMIT 0x100 /* maximum bytes in one spi CIS */ -#else #define SBSDIO_CIS_SIZE_LIMIT 0x200 /* maximum bytes in one CIS */ -#endif /* !BCMSPI */ #define SBSDIO_OTP_CIS_SIZE_LIMIT 0x078 /* maximum bytes OTP CIS */ #define SBSDIO_CIS_OFT_ADDR_MASK 0x1FFFF /* cis offset addr is < 17 bits */ diff --git a/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h b/drivers/net/wireless/bcmdhd/src/include/sbsdpcmdev.h index 10c7401..3bc071a 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbsdpcmdev.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbsdpcmdev.h @@ -2,14 +2,14 @@ * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific * device core support * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbsdpcmdev.h 347614 2012-07-27 10:24:51Z $ + * $Id: sbsdpcmdev.h 241182 2011-02-17 21:50:03Z $ */ #ifndef _sbsdpcmdev_h_ @@ -290,6 +290,4 @@ typedef volatile struct { /* HW frame tag */ #define SDPCM_FRAMETAG_LEN 4 /* HW frametag: 2 bytes len, 2 bytes check val */ -#define SDPCM_HWEXT_LEN 8 - #endif /* _sbsdpcmdev_h_ */ diff --git a/drivers/net/wireless/bcmdhd/include/sbsocram.h b/drivers/net/wireless/bcmdhd/src/include/sbsocram.h index 852d115..5a03d4b 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sbsocram.h +++ b/drivers/net/wireless/bcmdhd/src/include/sbsocram.h @@ -1,14 +1,14 @@ /* * BCM47XX Sonics SiliconBackplane embedded ram core * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -34,7 +34,7 @@ #define _PADLINE(line) pad ## line #define _XSTR(line) _PADLINE(line) #define PAD _XSTR(__LINE__) -#endif +#endif typedef volatile struct sbsocramregs { @@ -45,9 +45,9 @@ typedef volatile struct sbsocramregs { uint32 bankidx; uint32 standbyctrl; - uint32 errlogstatus; - uint32 errlogaddr; - + uint32 errlogstatus; + uint32 errlogaddr; + uint32 cambankidx; uint32 cambankstandbyctrl; uint32 cambankpatchctrl; @@ -56,7 +56,7 @@ typedef volatile struct sbsocramregs { uint32 cambankdatareg; uint32 cambankmaskreg; uint32 PAD[1]; - uint32 bankinfo; + uint32 bankinfo; uint32 PAD[15]; uint32 extmemconfig; uint32 extmemparitycsr; @@ -65,15 +65,15 @@ typedef volatile struct sbsocramregs { uint32 extmemwrctrlandsize; uint32 PAD[84]; uint32 workaround; - uint32 pwrctl; + uint32 pwrctl; uint32 PAD[133]; - uint32 sr_control; - uint32 sr_status; - uint32 sr_address; - uint32 sr_data; + uint32 sr_control; + uint32 sr_status; + uint32 sr_address; + uint32 sr_data; } sbsocramregs_t; -#endif +#endif #define SR_COREINFO 0x00 @@ -84,7 +84,7 @@ typedef volatile struct sbsocramregs { #define SR_PWRCTL 0x1e8 -#define SRCI_PT_MASK 0x00070000 +#define SRCI_PT_MASK 0x00070000 #define SRCI_PT_SHIFT 16 #define SRCI_PT_OCP_OCP 0 @@ -120,11 +120,11 @@ typedef volatile struct sbsocramregs { #define SRSC_SBYOVR_SHIFT 31 #define SRSC_SBYOVRVAL_MASK 0x60000000 #define SRSC_SBYOVRVAL_SHIFT 29 -#define SRSC_SBYEN_MASK 0x01000000 +#define SRSC_SBYEN_MASK 0x01000000 #define SRSC_SBYEN_SHIFT 24 -#define SRPC_PMU_STBYDIS_MASK 0x00000010 +#define SRPC_PMU_STBYDIS_MASK 0x00000010 #define SRPC_PMU_STBYDIS_SHIFT 4 #define SRPC_STBYOVRVAL_MASK 0x00000008 #define SRPC_STBYOVRVAL_SHIFT 3 @@ -187,7 +187,7 @@ typedef volatile struct sbsocramregs { #define SOCRAM_BANKINFO_SZBASE 8192 -#define SOCRAM_BANKSIZE_SHIFT 13 +#define SOCRAM_BANKSIZE_SHIFT 13 -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/sdio.h b/drivers/net/wireless/bcmdhd/src/include/sdio.h index b8eee1f..aafd1ea 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sdio.h +++ b/drivers/net/wireless/bcmdhd/src/include/sdio.h @@ -2,14 +2,14 @@ * SDIO spec header file * Protocol and standard (common) device definitions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sdio.h 308973 2012-01-18 04:19:34Z $ + * $Id: sdio.h 288543 2011-10-07 12:15:31Z $ */ #ifndef _SDIO_H @@ -89,7 +89,7 @@ typedef volatile struct { #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 #define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 #define SDIOD_CCCR_BRCM_CARDCTL 0xf1 -#define SDIOD_CCCR_BRCM_SEPINT 0xf2 +#define SDIOD_CCCR_BRCM_SEPINT 0xf2 /* cccr_sdio_rev */ #define SDIO_REV_SDIOID_MASK 0xf0 /* SDIO spec revision number */ @@ -406,7 +406,7 @@ typedef volatile struct { /* ------------------------------------------------ * SDIO Command structures. I/O only commands are: * - * CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53 + * CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53 * ------------------------------------------------ */ diff --git a/drivers/net/wireless/bcmdhd/include/sdioh.h b/drivers/net/wireless/bcmdhd/src/include/sdioh.h index 5517a71..a4bb275 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sdioh.h +++ b/drivers/net/wireless/bcmdhd/src/include/sdioh.h @@ -2,14 +2,14 @@ * SDIO Host Controller Spec header file * Register map and definitions for the Standard Host Controller * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sdioh.h 347633 2012-07-27 11:02:02Z $ + * $Id: sdioh.h 299859 2011-12-01 03:53:27Z $ */ #ifndef _SDIOH_H @@ -30,35 +30,35 @@ #define SD_SysAddr 0x000 #define SD_BlockSize 0x004 -#define SD_BlockCount 0x006 +#define SD_BlockCount 0x006 #define SD_Arg0 0x008 -#define SD_Arg1 0x00A +#define SD_Arg1 0x00A #define SD_TransferMode 0x00C -#define SD_Command 0x00E +#define SD_Command 0x00E #define SD_Response0 0x010 -#define SD_Response1 0x012 +#define SD_Response1 0x012 #define SD_Response2 0x014 -#define SD_Response3 0x016 +#define SD_Response3 0x016 #define SD_Response4 0x018 -#define SD_Response5 0x01A +#define SD_Response5 0x01A #define SD_Response6 0x01C -#define SD_Response7 0x01E +#define SD_Response7 0x01E #define SD_BufferDataPort0 0x020 -#define SD_BufferDataPort1 0x022 +#define SD_BufferDataPort1 0x022 #define SD_PresentState 0x024 #define SD_HostCntrl 0x028 #define SD_PwrCntrl 0x029 -#define SD_BlockGapCntrl 0x02A -#define SD_WakeupCntrl 0x02B +#define SD_BlockGapCntrl 0x02A +#define SD_WakeupCntrl 0x02B #define SD_ClockCntrl 0x02C -#define SD_TimeoutCntrl 0x02E +#define SD_TimeoutCntrl 0x02E #define SD_SoftwareReset 0x02F #define SD_IntrStatus 0x030 -#define SD_ErrorIntrStatus 0x032 +#define SD_ErrorIntrStatus 0x032 #define SD_IntrStatusEnable 0x034 -#define SD_ErrorIntrStatusEnable 0x036 +#define SD_ErrorIntrStatusEnable 0x036 #define SD_IntrSignalEnable 0x038 -#define SD_ErrorIntrSignalEnable 0x03A +#define SD_ErrorIntrSignalEnable 0x03A #define SD_CMD12ErrorStatus 0x03C #define SD_Capabilities 0x040 #define SD_Capabilities3 0x044 @@ -67,7 +67,7 @@ #define SD_ADMA_ErrStatus 0x054 #define SD_ADMA_SysAddr 0x58 #define SD_SlotInterruptStatus 0x0FC -#define SD_HostControllerVersion 0x0FE +#define SD_HostControllerVersion 0x0FE #define SD_GPIO_Reg 0x100 #define SD_GPIO_OE 0x104 #define SD_GPIO_Enable 0x108 @@ -89,10 +89,6 @@ #define SD3_PresetVal_SDR50 0x06a #define SD3_PresetVal_SDR104 0x06c #define SD3_PresetVal_DDR50 0x06e -/* SDIO3.0 Revx specific Registers */ -#define SD3_Tuning_Info_Register 0x0EC -#define SD3_WL_BT_reset_register 0x0F0 - /* preset value indices */ #define SD3_PRESETVAL_INITIAL_IX 0 @@ -105,16 +101,16 @@ #define SD3_PRESETVAL_DDR50_IX 7 /* SD_Capabilities reg (0x040) */ -#define CAP_TO_CLKFREQ_M BITFIELD_MASK(6) -#define CAP_TO_CLKFREQ_S 0 -#define CAP_TO_CLKUNIT_M BITFIELD_MASK(1) -#define CAP_TO_CLKUNIT_S 7 +#define CAP_TO_CLKFREQ_M BITFIELD_MASK(6) +#define CAP_TO_CLKFREQ_S 0 +#define CAP_TO_CLKUNIT_M BITFIELD_MASK(1) +#define CAP_TO_CLKUNIT_S 7 /* Note: for sdio-2.0 case, this mask has to be 6 bits, but msb 2 bits are reserved. going ahead with 8 bits, as it is req for 3.0 */ -#define CAP_BASECLK_M BITFIELD_MASK(8) -#define CAP_BASECLK_S 8 -#define CAP_MAXBLOCK_M BITFIELD_MASK(2) +#define CAP_BASECLK_M BITFIELD_MASK(8) +#define CAP_BASECLK_S 8 +#define CAP_MAXBLOCK_M BITFIELD_MASK(2) #define CAP_MAXBLOCK_S 16 #define CAP_ADMA2_M BITFIELD_MASK(1) #define CAP_ADMA2_S 19 @@ -209,12 +205,12 @@ /* SD_Arg0: Offset 0x008, size = 4 bytes */ /* SD_TransferMode Offset 0x00C, size = 2 bytes */ -#define XFER_DMA_ENABLE_M BITFIELD_MASK(1) +#define XFER_DMA_ENABLE_M BITFIELD_MASK(1) #define XFER_DMA_ENABLE_S 0 -#define XFER_BLK_COUNT_EN_M BITFIELD_MASK(1) +#define XFER_BLK_COUNT_EN_M BITFIELD_MASK(1) #define XFER_BLK_COUNT_EN_S 1 -#define XFER_CMD_12_EN_M BITFIELD_MASK(1) -#define XFER_CMD_12_EN_S 2 +#define XFER_CMD_12_EN_M BITFIELD_MASK(1) +#define XFER_CMD_12_EN_S 2 #define XFER_DATA_DIRECTION_M BITFIELD_MASK(1) #define XFER_DATA_DIRECTION_S 4 #define XFER_MULTI_BLOCK_M BITFIELD_MASK(1) @@ -222,9 +218,9 @@ /* SD_Command: Offset 0x00E, size = 2 bytes */ /* resp_type field */ -#define RESP_TYPE_NONE 0 -#define RESP_TYPE_136 1 -#define RESP_TYPE_48 2 +#define RESP_TYPE_NONE 0 +#define RESP_TYPE_136 1 +#define RESP_TYPE_48 2 #define RESP_TYPE_48_BUSY 3 /* type field */ #define CMD_TYPE_NORMAL 0 @@ -232,22 +228,22 @@ #define CMD_TYPE_RESUME 2 #define CMD_TYPE_ABORT 3 -#define CMD_RESP_TYPE_M BITFIELD_MASK(2) /* Bits [0-1] - Response type */ +#define CMD_RESP_TYPE_M BITFIELD_MASK(2) /* Bits [0-1] - Response type */ #define CMD_RESP_TYPE_S 0 -#define CMD_CRC_EN_M BITFIELD_MASK(1) /* Bit 3 - CRC enable */ +#define CMD_CRC_EN_M BITFIELD_MASK(1) /* Bit 3 - CRC enable */ #define CMD_CRC_EN_S 3 -#define CMD_INDEX_EN_M BITFIELD_MASK(1) /* Bit 4 - Enable index checking */ +#define CMD_INDEX_EN_M BITFIELD_MASK(1) /* Bit 4 - Enable index checking */ #define CMD_INDEX_EN_S 4 -#define CMD_DATA_EN_M BITFIELD_MASK(1) /* Bit 5 - Using DAT line */ +#define CMD_DATA_EN_M BITFIELD_MASK(1) /* Bit 5 - Using DAT line */ #define CMD_DATA_EN_S 5 -#define CMD_TYPE_M BITFIELD_MASK(2) /* Bit [6-7] - Normal, abort, resume, etc +#define CMD_TYPE_M BITFIELD_MASK(2) /* Bit [6-7] - Normal, abort, resume, etc */ #define CMD_TYPE_S 6 -#define CMD_INDEX_M BITFIELD_MASK(6) /* Bits [8-13] - Command number */ +#define CMD_INDEX_M BITFIELD_MASK(6) /* Bits [8-13] - Command number */ #define CMD_INDEX_S 8 /* SD_BufferDataPort0 : Offset 0x020, size = 2 or 4 bytes */ -/* SD_BufferDataPort1 : Offset 0x022, size = 2 bytes */ +/* SD_BufferDataPort1 : Offset 0x022, size = 2 bytes */ /* SD_PresentState : Offset 0x024, size = 4 bytes */ #define PRES_CMD_INHIBIT_M BITFIELD_MASK(1) /* Bit 0 May use CMD */ #define PRES_CMD_INHIBIT_S 0 @@ -314,8 +310,8 @@ #define HOST_CONTR_VER_3 (2) /* misc defines */ -#define SD1_MODE 0x1 /* SD Host Cntrlr Spec */ -#define SD4_MODE 0x2 /* SD Host Cntrlr Spec */ +#define SD1_MODE 0x1 /* SD Host Cntrlr Spec */ +#define SD4_MODE 0x2 /* SD Host Cntrlr Spec */ /* SD_PwrCntrl: Offset 0x029, size = 1 bytes */ #define PWR_BUS_EN_M BITFIELD_MASK(1) /* Bit 0 Power the bus */ @@ -402,9 +398,9 @@ /* SD_WakeupCntr_BlockGapCntrl : Offset 0x02A , size = bytes */ /* SD_ClockCntrl : Offset 0x02C , size = bytes */ -/* SD_SoftwareReset_TimeoutCntrl : Offset 0x02E , size = bytes */ +/* SD_SoftwareReset_TimeoutCntrl : Offset 0x02E , size = bytes */ /* SD_IntrStatus : Offset 0x030 , size = bytes */ -/* SD_ErrorIntrStatus : Offset 0x032 , size = bytes */ +/* SD_ErrorIntrStatus : Offset 0x032 , size = bytes */ /* SD_IntrStatusEnable : Offset 0x034 , size = bytes */ /* SD_ErrorIntrStatusEnable : Offset 0x036 , size = bytes */ /* SD_IntrSignalEnable : Offset 0x038 , size = bytes */ diff --git a/drivers/net/wireless/bcmdhd/include/sdiovar.h b/drivers/net/wireless/bcmdhd/src/include/sdiovar.h index 16a1c19..a00b41e 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/sdiovar.h +++ b/drivers/net/wireless/bcmdhd/src/include/sdiovar.h @@ -2,14 +2,14 @@ * Structure used by apps whose drivers access SDIO drivers. * Pulled out separately so dhdu and wlu can both use it. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,7 +17,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -52,29 +52,6 @@ typedef struct sdreg { #define NUM_PREV_TRANSACTIONS 16 -#ifdef BCMSPI -/* Error statistics for gSPI */ -struct spierrstats_t { - uint32 dna; /* The requested data is not available. */ - uint32 rdunderflow; /* FIFO underflow happened due to current (F2, F3) rd command */ - uint32 wroverflow; /* FIFO underflow happened due to current (F1, F2, F3) wr command */ - - uint32 f2interrupt; /* OR of all F2 related intr status bits. */ - uint32 f3interrupt; /* OR of all F3 related intr status bits. */ - - uint32 f2rxnotready; /* F2 FIFO is not ready to receive data (FIFO empty) */ - uint32 f3rxnotready; /* F3 FIFO is not ready to receive data (FIFO empty) */ - - uint32 hostcmddataerr; /* Error in command or host data, detected by CRC/checksum - * (optional) - */ - uint32 f2pktavailable; /* Packet is available in F2 TX FIFO */ - uint32 f3pktavailable; /* Packet is available in F2 TX FIFO */ - - uint32 dstatus[NUM_PREV_TRANSACTIONS]; /* dstatus bits of last 16 gSPI transactions */ - uint32 spicmd[NUM_PREV_TRANSACTIONS]; -}; -#endif /* BCMSPI */ #include <packed_section_end.h> diff --git a/drivers/net/wireless/bcmdhd/include/siutils.h b/drivers/net/wireless/bcmdhd/src/include/siutils.h index a797b3d..85915c3 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/siutils.h +++ b/drivers/net/wireless/bcmdhd/src/include/siutils.h @@ -2,14 +2,14 @@ * Misc utility routines for accessing the SOC Interconnects * of Broadcom HNBU chips. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils.h 347614 2012-07-27 10:24:51Z $ + * $Id: siutils.h 300516 2011-12-04 17:39:44Z $ */ #ifndef _siutils_h_ @@ -30,28 +30,28 @@ struct si_pub { - uint socitype; - - uint bustype; - uint buscoretype; - uint buscorerev; - uint buscoreidx; - int ccrev; - uint32 cccaps; - uint32 cccaps_ext; - int pmurev; - uint32 pmucaps; - uint boardtype; - uint boardrev; - uint boardvendor; - uint boardflags; - uint boardflags2; - uint chip; - uint chiprev; - uint chippkg; - uint32 chipst; - bool issim; - uint socirev; + uint socitype; + + uint bustype; + uint buscoretype; + uint buscorerev; + uint buscoreidx; + int ccrev; + uint32 cccaps; + uint32 cccaps_ext; + int pmurev; + uint32 pmucaps; + uint boardtype; + uint boardrev; + uint boardvendor; + uint boardflags; + uint boardflags2; + uint chip; + uint chiprev; + uint chippkg; + uint32 chipst; + bool issim; + uint socirev; bool pci_pr32414; }; @@ -61,34 +61,34 @@ typedef const struct si_pub si_t; -#define SI_OSH NULL +#define SI_OSH NULL #define BADIDX (SI_MAXCORES + 1) -#define XTAL 0x1 -#define PLL 0x2 +#define XTAL 0x1 +#define PLL 0x2 -#define CLK_FAST 0 -#define CLK_DYNAMIC 2 +#define CLK_FAST 0 +#define CLK_DYNAMIC 2 -#define GPIO_DRV_PRIORITY 0 -#define GPIO_APP_PRIORITY 1 -#define GPIO_HI_PRIORITY 2 +#define GPIO_DRV_PRIORITY 0 +#define GPIO_APP_PRIORITY 1 +#define GPIO_HI_PRIORITY 2 #define GPIO_PULLUP 0 #define GPIO_PULLDN 1 -#define GPIO_REGEVT 0 -#define GPIO_REGEVT_INTMSK 1 -#define GPIO_REGEVT_INTPOL 2 +#define GPIO_REGEVT 0 +#define GPIO_REGEVT_INTMSK 1 +#define GPIO_REGEVT_INTPOL 2 -#define SI_DEVPATH_BUFSZ 16 +#define SI_DEVPATH_BUFSZ 16 #define SI_DOATTACH 1 @@ -125,21 +125,6 @@ typedef void (*gpio_handler_t)(uint32 stat, void *arg); -#define SI_CR4_CAP (0x04) -#define SI_CR4_BANKIDX (0x40) -#define SI_CR4_BANKINFO (0x44) - -#define ARMCR4_TCBBNB_MASK 0xf0 -#define ARMCR4_TCBBNB_SHIFT 4 -#define ARMCR4_TCBANB_MASK 0xf -#define ARMCR4_TCBANB_SHIFT 0 - -#define SICF_CPUHALT (0x0020) -#define ARMCR4_BSZ_MASK 0x3f -#define ARMCR4_BSZ_MULT 8192 - - - extern si_t *si_attach(uint pcidev, osl_t *osh, void *regs, uint bustype, void *sdh, char **vars, uint *varsz); extern si_t *si_kattach(osl_t *osh); @@ -204,7 +189,6 @@ extern uint32 si_socdevram_remap_size(si_t *sih); extern void si_watchdog(si_t *sih, uint ticks); extern void si_watchdog_ms(si_t *sih, uint32 ms); -extern uint32 si_watchdog_msticks(void); extern void *si_gpiosetcore(si_t *sih); extern uint32 si_gpiocontrol(si_t *sih, uint32 mask, uint32 val, uint8 priority); extern uint32 si_gpioouten(si_t *sih, uint32 mask, uint32 val, uint8 priority); @@ -265,10 +249,10 @@ extern int si_cis_source(si_t *sih); #define CIS_OTP 2 -#define DEFAULT_FAB 0x0 -#define CSM_FAB7 0x1 -#define TSMC_FAB12 0x2 -#define SMIC_FAB4 0x3 +#define DEFAULT_FAB 0x0 +#define CSM_FAB7 0x1 +#define TSMC_FAB12 0x2 +#define SMIC_FAB4 0x3 extern int si_otp_fabid(si_t *sih, uint16 *fabid, bool rw); extern uint16 si_fabid(si_t *sih); @@ -325,8 +309,4 @@ extern int si_pcie_configspace_get(si_t *sih, uint8 *buf, uint size); char *si_getnvramflvar(si_t *sih, const char *name); -extern uint32 si_tcm_size(si_t *sih); - -extern int si_set_sromctl(si_t *sih, uint32 value); -extern uint32 si_get_sromctl(si_t *sih); -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/trxhdr.h b/drivers/net/wireless/bcmdhd/src/include/trxhdr.h index bf92a56..7afb4dc 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/trxhdr.h +++ b/drivers/net/wireless/bcmdhd/src/include/trxhdr.h @@ -1,14 +1,14 @@ /* * TRX image file header format. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/include/typedefs.h b/drivers/net/wireless/bcmdhd/src/include/typedefs.h index 4eee5ba..546651b 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/typedefs.h +++ b/drivers/net/wireless/bcmdhd/src/include/typedefs.h @@ -1,12 +1,12 @@ /* - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -14,7 +14,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -44,10 +44,10 @@ #define TRUE true #endif -#else +#else -#endif +#endif #if defined(__x86_64__) #define TYPEDEF_UINTPTR @@ -76,21 +76,21 @@ typedef long unsigned int size_t; #ifndef TARGETENV_android #define TYPEDEF_USHORT #define TYPEDEF_ULONG -#endif +#endif #ifdef __KERNEL__ #include <linux/version.h> #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) #define TYPEDEF_BOOL -#endif +#endif #if (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18)) #include <linux/compiler.h> #ifdef noinline_for_stack #define TYPEDEF_BOOL #endif -#endif -#endif -#endif +#endif +#endif +#endif @@ -110,7 +110,7 @@ typedef long unsigned int size_t; #define TYPEDEF_UINT64 #endif -#endif +#endif #if !defined(__DJGPP__) @@ -119,24 +119,24 @@ typedef long unsigned int size_t; #if !defined(LINUX_HYBRID) || defined(LINUX_PORT) -#include <linux/types.h> -#endif +#include <linux/types.h> +#endif #else #include <sys/types.h> -#endif +#endif -#endif +#endif #define USE_TYPEDEF_DEFAULTS -#endif +#endif @@ -220,11 +220,11 @@ typedef double float64; #if defined(FLOAT32) typedef float32 float_t; -#else +#else typedef float64 float_t; #endif -#endif +#endif @@ -233,7 +233,7 @@ typedef float64 float_t; #endif #ifndef TRUE -#define TRUE 1 +#define TRUE 1 #endif #ifndef NULL @@ -245,10 +245,10 @@ typedef float64 float_t; #endif #ifndef ON -#define ON 1 +#define ON 1 #endif -#define AUTO (-1) +#define AUTO (-1) @@ -264,7 +264,7 @@ typedef float64 float_t; #define BWL_COMPILER_ARMCC #else #error "Unknown compiler!" -#endif +#endif #ifndef INLINE @@ -276,8 +276,8 @@ typedef float64 float_t; #define INLINE __inline #else #define INLINE - #endif -#endif + #endif +#endif #undef TYPEDEF_BOOL #undef TYPEDEF_UCHAR @@ -297,7 +297,7 @@ typedef float64 float_t; #undef TYPEDEF_FLOAT64 #undef TYPEDEF_FLOAT_T -#endif +#endif #define UNUSED_PARAMETER(x) (void)(x) @@ -307,4 +307,4 @@ typedef float64 float_t; #include <bcmdefs.h> -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/include/wlfc_proto.h b/drivers/net/wireless/bcmdhd/src/include/wlfc_proto.h index 1c8cc01..22e08f6 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/wlfc_proto.h +++ b/drivers/net/wireless/bcmdhd/src/include/wlfc_proto.h @@ -1,12 +1,12 @@ /* -* Copyright (C) 1999-2012, Broadcom Corporation -* +* Copyright (C) 1999-2011, Broadcom Corporation +* * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: -* +* * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -14,11 +14,11 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. -* +* * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: wlfc_proto.h 347585 2012-07-27 09:02:53Z $ +* $Id: wlfc_proto.h 303826 2011-12-20 06:02:09Z $ * */ #ifndef __wlfc_proto_definitions_h__ @@ -62,12 +62,6 @@ | 13 | 3 | (count, handle, prec_bmp)| One time request for packet to a specific | | | | MAC destination. --------------------------------------------------------------------------- - | 15 | 1 | interface ID | NIC period start - --------------------------------------------------------------------------- - | 16 | 1 | interface ID | NIC period end - --------------------------------------------------------------------------- - | 17 | 3 | (ifid, txs) | Action frame tx status - --------------------------------------------------------------------------- | 255 | N/A | N/A | FILLER - This is a special type | | | | that has no length or value. | | | | Typically used for padding. @@ -76,13 +70,13 @@ #define WLFC_CTL_TYPE_MAC_OPEN 1 #define WLFC_CTL_TYPE_MAC_CLOSE 2 -#define WLFC_CTL_TYPE_MAC_REQUEST_CREDIT 3 +#define WLFC_CTL_TYPE_MAC_REQUEST_CREDIT 3 #define WLFC_CTL_TYPE_TXSTATUS 4 #define WLFC_CTL_TYPE_PKTTAG 5 #define WLFC_CTL_TYPE_MACDESC_ADD 6 #define WLFC_CTL_TYPE_MACDESC_DEL 7 -#define WLFC_CTL_TYPE_RSSI 8 +#define WLFC_CTL_TYPE_RSSI 8 #define WLFC_CTL_TYPE_INTERFACE_OPEN 9 #define WLFC_CTL_TYPE_INTERFACE_CLOSE 10 @@ -93,33 +87,25 @@ #define WLFC_CTL_TYPE_MAC_REQUEST_PACKET 13 #define WLFC_CTL_TYPE_HOST_REORDER_RXPKTS 14 -#define WLFC_CTL_TYPE_NIC_PRD_START 15 -#define WLFC_CTL_TYPE_NIC_PRD_END 16 -#define WLFC_CTL_TYPE_AF_TXS 17 -#define WLFC_CTL_TYPE_TRANS_ID 18 - -#define WLFC_CTL_TYPE_FILLER 255 +#define WLFC_CTL_TYPE_FILLER 255 -#define WLFC_CTL_VALUE_LEN_MACDESC 8 /* handle, interface, MAC */ +#define WLFC_CTL_VALUE_LEN_MACDESC 8 /* handle, interface, MAC */ -#define WLFC_CTL_VALUE_LEN_MAC 1 /* MAC-handle */ -#define WLFC_CTL_VALUE_LEN_RSSI 1 +#define WLFC_CTL_VALUE_LEN_MAC 1 /* MAC-handle */ +#define WLFC_CTL_VALUE_LEN_RSSI 1 -#define WLFC_CTL_VALUE_LEN_INTERFACE 1 +#define WLFC_CTL_VALUE_LEN_INTERFACE 1 #define WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP 2 -#define WLFC_CTL_VALUE_LEN_TXSTATUS 4 -#define WLFC_CTL_VALUE_LEN_PKTTAG 4 +#define WLFC_CTL_VALUE_LEN_TXSTATUS 4 +#define WLFC_CTL_VALUE_LEN_PKTTAG 4 /* enough space to host all 4 ACs, bc/mc and atim fifo credit */ #define WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK 6 -#define WLFC_CTL_VALUE_LEN_REQUEST_CREDIT 3 /* credit, MAC-handle, prec_bitmap */ -#define WLFC_CTL_VALUE_LEN_REQUEST_PACKET 3 /* credit, MAC-handle, prec_bitmap */ +#define WLFC_CTL_VALUE_LEN_REQUEST_CREDIT 3 /* credit, MAC-handle, prec_bitmap */ +#define WLFC_CTL_VALUE_LEN_REQUEST_PACKET 3 /* credit, MAC-handle, prec_bitmap */ -#define WLFC_CTL_VALUE_LEN_NIC_PRD_START 1 -#define WLFC_CTL_VALUE_LEN_NIC_PRD_END 1 -#define WLFC_CTL_VALUE_LEN_AF_TXS 3 #define WLFC_PKTID_GEN_MASK 0x80000000 @@ -201,7 +187,7 @@ {printf("WLFC: %s():%d:caller:%p\n", \ __FUNCTION__, __LINE__, __builtin_return_address(0));}} while (0) #define WLFC_PRINTMAC(banner, ea) do {printf("%s MAC: [%02x:%02x:%02x:%02x:%02x:%02x]\n", \ - banner, ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); } while (0) + banner, ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); } while (0) #define WLFC_WHEREIS(s) printf("WLFC: at %s():%d, %s\n", __FUNCTION__, __LINE__, (s)) #else #define WLFC_DBGMESG(x) @@ -226,7 +212,5 @@ #define WLHOST_REORDERDATA_CURIDX_VALID 0x04 #define WLHOST_REORDERDATA_EXPIDX_VALID 0x08 #define WLHOST_REORDERDATA_NEW_HOLE 0x10 -/* transaction id data len byte 0: rsvd, byte 1: seqnumber, byte 2-5 will be used for timestampe */ -#define WLFC_CTL_TRANS_ID_LEN 6 #endif /* __wlfc_proto_definitions_h__ */ diff --git a/drivers/net/wireless/bcmdhd/include/wlioctl.h b/drivers/net/wireless/bcmdhd/src/include/wlioctl.h index e3fe227..d6bdb8f 100755..100644 --- a/drivers/net/wireless/bcmdhd/include/wlioctl.h +++ b/drivers/net/wireless/bcmdhd/src/include/wlioctl.h @@ -5,13 +5,13 @@ * Definitions subject to change without notice. * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -19,12 +19,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wlioctl.h 354524 2012-08-31 12:10:27Z $ + * $Id: wlioctl.h 310294 2012-01-24 06:17:47Z $ */ #ifndef _wlioctl_h_ @@ -36,22 +36,9 @@ #include <proto/bcmevent.h> #include <proto/802.11.h> #include <bcmwifi_channels.h> -#include <bcmwifi_rates.h> -#ifndef LINUX_POSTMOGRIFY_REMOVAL #include <bcm_mpool_pub.h> #include <bcmcdc.h> -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - -#include <dhd_sec_feature.h> - -/* LINUX_POSTMOGRIFY_REMOVAL: undefined during compile phase, so its - * a no-op for most cases. For hybrid and other open source releases, - * its defined during a second pass and mogrified out for distribution. - */ - - -#ifndef LINUX_POSTMOGRIFY_REMOVAL #ifndef INTF_NAME_SIZ #define INTF_NAME_SIZ 16 @@ -59,7 +46,7 @@ /* Used to send ioctls over the transport pipe */ typedef struct remote_ioctl { - cdc_ioctl_t msg; + cdc_ioctl_t msg; uint data_len; char intf_name[INTF_NAME_SIZ]; } rem_ioctl_t; @@ -68,9 +55,9 @@ typedef struct remote_ioctl { #define ACTION_FRAME_SIZE 1800 typedef struct wl_action_frame { - struct ether_addr da; - uint16 len; - uint32 packetId; + struct ether_addr da; + uint16 len; + uint32 packetId; uint8 data[ACTION_FRAME_SIZE]; } wl_action_frame_t; @@ -83,9 +70,9 @@ typedef struct ssid_info } ssid_info_t; typedef struct wl_af_params { - uint32 channel; - int32 dwell_time; - struct ether_addr BSSID; + uint32 channel; + int32 dwell_time; + struct ether_addr BSSID; wl_action_frame_t action_frame; } wl_af_params_t; @@ -95,12 +82,11 @@ typedef struct wl_af_params { #define MFP_TEST_FLAG_ANY_KEY 1 typedef struct wl_sa_query { uint32 flag; - uint8 action; - uint16 id; - struct ether_addr da; + uint8 action; + uint16 id; + struct ether_addr da; } wl_sa_query_t; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* require default structure packing */ #define BWL_DEFAULT_PACKING @@ -134,6 +120,7 @@ typedef struct wl_bss_info_107 { uint32 ie_length; /* byte length of Information Elements */ /* variable length Information Elements */ } wl_bss_info_107_t; +#endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* * Per-BSS information structure. @@ -179,8 +166,6 @@ typedef struct wl_bss_info_108 { /* variable length Information Elements */ } wl_bss_info_108_t; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - #define WL_BSS_INFO_VERSION 109 /* current version of wl_bss_info struct */ /* BSS info structure @@ -208,7 +193,7 @@ typedef struct wl_bss_info { int8 phy_noise; /* noise (in dBm) */ uint8 n_cap; /* BSS is 802.11N Capable */ - uint32 nbss_cap; /* 802.11N+AC BSS Capabilities */ + uint32 nbss_cap; /* 802.11N BSS Capabilities (based on HT_CAP_*) */ uint8 ctl_ch; /* 802.11N BSS control channel number */ uint8 padding1[3]; /* explicit struct alignment padding */ uint16 vht_rxmcsmap; /* VHT rx mcs map */ @@ -225,16 +210,6 @@ typedef struct wl_bss_info { /* variable length Information Elements */ } wl_bss_info_t; -/* bss_info_cap_t flags */ -#define WL_BSS_FLAGS_FROM_BEACON 0x01 /* bss_info derived from beacon */ -#define WL_BSS_FLAGS_FROM_CACHE 0x02 /* bss_info collected from cache */ -#define WL_BSS_FLAGS_RSSI_ONCHANNEL 0x04 /* rssi info was received on channel (vs offchannel) */ - -/* bssinfo flag for nbss_cap */ -#define VHT_BI_SGI_80MHZ 0x00000100 - -#ifndef LINUX_POSTMOGRIFY_REMOVAL - typedef struct wl_bsscfg { uint32 wsec; uint32 WPA_auth; @@ -259,7 +234,7 @@ typedef struct wl_bss_config { #define DLOAD_FLAG_VER_MASK 0xf000 /* Downloader version mask */ #define DLOAD_FLAG_VER_SHIFT 12 /* Downloader version shift */ -#define DL_CRC_NOT_INUSE 0x0001 +#define DL_CRC_NOT_INUSE 0x0001 /* generic download types & flags */ enum { @@ -302,15 +277,11 @@ struct wl_clm_dload_info { }; typedef struct wl_clm_dload_info wl_clm_dload_info_t; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - typedef struct wlc_ssid { uint32 SSID_len; uchar SSID[32]; } wlc_ssid_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL - #define MAX_PREFERRED_AP_NUM 5 typedef struct wlc_fastssidinfo { uint32 SSID_channel[MAX_PREFERRED_AP_NUM]; @@ -318,10 +289,11 @@ typedef struct wlc_fastssidinfo { } wlc_fastssidinfo_t; typedef BWL_PRE_PACKED_STRUCT struct wnm_url { - uint8 len; - uint8 data[1]; + uint8 len; + uint8 data[1]; } BWL_POST_PACKED_STRUCT wnm_url_t; +#ifndef LINUX_POSTMOGRIFY_REMOVAL typedef struct chan_scandata { uint8 txpower; uint8 pad; @@ -338,19 +310,24 @@ typedef enum wl_scan_type { #define WLC_EXTDSCAN_MAX_SSID 5 +#define WL_BSS_FLAGS_FROM_BEACON 0x01 /* bss_info derived from beacon */ +#define WL_BSS_FLAGS_FROM_CACHE 0x02 /* bss_info collected from cache */ +#define WL_BSS_FLAGS_RSSI_ONCHANNEL 0x04 /* rssi info was received on channel (vs offchannel) */ + typedef struct wl_extdscan_params { - int8 nprobes; /* 0, passive, otherwise active */ - int8 split_scan; /* split scan */ + int8 nprobes; /* 0, passive, otherwise active */ + int8 split_scan; /* split scan */ int8 band; /* band */ int8 pad; - wlc_ssid_t ssid[WLC_EXTDSCAN_MAX_SSID]; /* ssid list */ + wlc_ssid_t ssid[WLC_EXTDSCAN_MAX_SSID]; /* ssid list */ uint32 tx_rate; /* in 500ksec units */ wl_scan_type_t scan_type; /* enum */ - int32 channel_num; + int32 channel_num; chan_scandata_t channel_list[1]; /* list of chandata structs */ } wl_extdscan_params_t; -#define WL_EXTDSCAN_PARAMS_FIXED_SIZE (sizeof(wl_extdscan_params_t) - sizeof(chan_scandata_t)) +#define WL_EXTDSCAN_PARAMS_FIXED_SIZE (sizeof(wl_extdscan_params_t) - sizeof(chan_scandata_t)) +#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WL_BSSTYPE_INFRA 1 #define WL_BSSTYPE_INDEP 0 @@ -361,7 +338,7 @@ typedef struct wl_extdscan_params { #define WL_SCANFLAGS_RESERVED 0x02 /* Reserved */ #define WL_SCANFLAGS_PROHIBITED 0x04 /* allow scanning prohibited channels */ -#define WL_SCAN_PARAMS_SSID_MAX 10 +#define WL_SCAN_PARAMS_SSID_MAX 10 typedef struct wl_scan_params { wlc_ssid_t ssid; /* default: {0, ""} */ @@ -420,7 +397,6 @@ typedef struct wl_iscan_params { /* 3 fields + size of wl_scan_params, not including variable length array */ #define WL_ISCAN_PARAMS_FIXED_SIZE (OFFSETOF(wl_iscan_params_t, params) + sizeof(wlc_ssid_t)) -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ typedef struct wl_scan_results { uint32 buflen; @@ -429,7 +405,6 @@ typedef struct wl_scan_results { wl_bss_info_t bss_info[1]; } wl_scan_results_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL /* size of wl_scan_results not including variable length array */ #define WL_SCAN_RESULTS_FIXED_SIZE (sizeof(wl_scan_results_t) - sizeof(wl_bss_info_t)) @@ -493,17 +468,16 @@ typedef struct wl_probe_params { struct ether_addr bssid; struct ether_addr mac; } wl_probe_params_t; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ -#define WL_MAXRATES_IN_SET 16 /* max # of rates in a rateset */ +#define WL_NUMRATES 16 /* max # of rates in a rateset */ typedef struct wl_rateset { uint32 count; /* # rates in this set */ - uint8 rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ + uint8 rates[WL_NUMRATES]; /* rates in 500kbps units w/hi bit set if basic */ } wl_rateset_t; typedef struct wl_rateset_args { uint32 count; /* # rates in this set */ - uint8 rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ + uint8 rates[WL_NUMRATES]; /* rates in 500kbps units w/hi bit set if basic */ uint8 mcs[MCSSET_LEN]; /* supported mcs index bit map */ } wl_rateset_args_t; @@ -523,7 +497,7 @@ typedef struct wl_assoc_params { */ chanspec_t chanspec_list[1]; /* list of chanspecs */ } wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE OFFSETOF(wl_assoc_params_t, chanspec_list) +#define WL_ASSOC_PARAMS_FIXED_SIZE OFFSETOF(wl_assoc_params_t, chanspec_list) /* used for reassociation/roam to a specific BSSID and channel */ typedef wl_assoc_params_t wl_reassoc_params_t; @@ -540,9 +514,7 @@ typedef struct wl_join_params { * of the wl_assoc_params_t struct when it does present. */ } wl_join_params_t; - -#ifndef LINUX_POSTMOGRIFY_REMOVAL -#define WL_JOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_join_params_t, params) + \ +#define WL_JOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_join_params_t, params) + \ WL_ASSOC_PARAMS_FIXED_SIZE) /* scan params for extended join */ typedef struct wl_join_scan_params { @@ -568,13 +540,9 @@ typedef struct wl_extjoin_params { * present. */ } wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_extjoin_params_t, assoc) + \ +#define WL_EXTJOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_extjoin_params_t, assoc) + \ WL_JOIN_ASSOC_PARAMS_FIXED_SIZE) -/* All builds use the new 11ac ratespec/chanspec */ -#undef D11AC_IOTYPES -#define D11AC_IOTYPES - #ifndef D11AC_IOTYPES /* defines used by the nrate iovar */ @@ -677,9 +645,9 @@ typedef struct { #define CCA_FLAG_5G_ONLY 0x02 /* Return a channel from 2.4 Ghz band */ #define CCA_FLAG_IGNORE_DURATION 0x04 /* Ignore dwell time for each channel */ #define CCA_FLAGS_PREFER_1_6_11 0x10 -#define CCA_FLAG_IGNORE_INTERFER 0x20 /* do not exlude channel based on interfer level */ +#define CCA_FLAG_IGNORE_INTERFER 0x20 /* do not exlude channel based on interfer level */ -#define CCA_ERRNO_BAND 1 /* After filtering for band pref, no choices left */ +#define CCA_ERRNO_BAND 1 /* After filtering for band pref, no choices left */ #define CCA_ERRNO_DURATION 2 /* After filtering for duration, no choices left */ #define CCA_ERRNO_PREF_CHAN 3 /* After filtering for chan pref, no choices left */ #define CCA_ERRNO_INTERFER 4 /* After filtering for interference, no choices left */ @@ -731,12 +699,8 @@ typedef struct { #define ITFR_HOME_CHANNEL 2 /* home channel has interference */ #define ITFR_NOISY_ENVIRONMENT 4 /* noisy environemnt so feature stopped */ -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - #define WLC_CNTRY_BUF_SZ 4 /* Country string is 3 bytes + NUL */ -#ifndef LINUX_POSTMOGRIFY_REMOVAL - typedef struct wl_country { char country_abbrev[WLC_CNTRY_BUF_SZ]; /* nul-terminated country code used in * the Country IE @@ -824,29 +788,6 @@ typedef struct wl_rm_rep { } wl_rm_rep_t; #define WL_RM_REP_FIXED_LEN 8 -#ifdef BCMCCX - -#define LEAP_USER_MAX 32 -#define LEAP_DOMAIN_MAX 32 -#define LEAP_PASSWORD_MAX 32 - -typedef struct wl_leap_info { - wlc_ssid_t ssid; - uint8 user_len; - uchar user[LEAP_USER_MAX]; - uint8 password_len; - uchar password[LEAP_PASSWORD_MAX]; - uint8 domain_len; - uchar domain[LEAP_DOMAIN_MAX]; -} wl_leap_info_t; - -typedef struct wl_leap_list { - uint32 buflen; - uint32 version; - uint32 count; - wl_leap_info_t leap_info[1]; -} wl_leap_list_t; -#endif /* BCMCCX */ typedef enum sup_auth_status { /* Basic supplicant authentication states */ @@ -871,7 +812,6 @@ typedef enum sup_auth_status { WLC_SUP_KEYXCHANGE_WAIT_G1, /* Waiting to receive handshake msg G1 */ WLC_SUP_KEYXCHANGE_PREP_G2 /* Preparing to send handshake msg G2 */ } sup_auth_status_t; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* Enumerate crypto algorithms */ #define CRYPTO_ALGO_OFF 0 @@ -881,16 +821,9 @@ typedef enum sup_auth_status { #define CRYPTO_ALGO_AES_CCM 4 #define CRYPTO_ALGO_AES_OCB_MSDU 5 #define CRYPTO_ALGO_AES_OCB_MPDU 6 -#if !defined(BCMCCX) #define CRYPTO_ALGO_NALG 7 -#else -#define CRYPTO_ALGO_CKIP 7 -#define CRYPTO_ALGO_CKIP_MMH 8 -#define CRYPTO_ALGO_WEP_MMH 9 -#define CRYPTO_ALGO_NALG 10 -#endif #ifdef BCMWAPI_WPI -#define CRYPTO_ALGO_SMS4 11 +#define CRYPTO_ALGO_SMS4 11 #endif /* BCMWAPI_WPI */ #define CRYPTO_ALGO_PMK 12 /* for 802.1x supp to set PMK before 4-way */ @@ -903,13 +836,8 @@ typedef enum sup_auth_status { #define WL_SOFT_KEY (1 << 0) /* Indicates this key is using soft encrypt */ #define WL_PRIMARY_KEY (1 << 1) /* Indicates this key is the primary (ie tx) key */ -#if defined(BCMCCX) -#define WL_CKIP_KP (1 << 4) /* CMIC */ -#define WL_CKIP_MMH (1 << 5) /* CKIP */ -#else #define WL_KF_RES_4 (1 << 4) /* Reserved for backward compat */ #define WL_KF_RES_5 (1 << 5) /* Reserved for backward compat */ -#endif #define WL_IBSS_PEER_GROUP_KEY (1 << 6) /* Indicates a group key for a IBSS PEER */ typedef struct wl_wsec_key { @@ -950,13 +878,9 @@ typedef struct { #define TKIP_ENABLED 0x0002 #define AES_ENABLED 0x0004 #define WSEC_SWFLAG 0x0008 -#ifdef BCMCCX -#define CKIP_KP_ENABLED 0x0010 -#define CKIP_MIC_ENABLED 0x0020 -#endif /* BCMCCX */ #define SES_OW_ENABLED 0x0040 /* to go into transition mode without setting wep */ #ifdef BCMWAPI_WPI -#define SMS4_ENABLED 0x0100 +#define SMS4_ENABLED 0x0100 #endif /* BCMWAPI_WPI */ /* wsec macros for operating on the above definitions */ @@ -964,27 +888,11 @@ typedef struct { #define WSEC_TKIP_ENABLED(wsec) ((wsec) & TKIP_ENABLED) #define WSEC_AES_ENABLED(wsec) ((wsec) & AES_ENABLED) -#ifdef BCMCCX -#define WSEC_CKIP_KP_ENABLED(wsec) ((wsec) & CKIP_KP_ENABLED) -#define WSEC_CKIP_MIC_ENABLED(wsec) ((wsec) & CKIP_MIC_ENABLED) -#define WSEC_CKIP_ENABLED(wsec) ((wsec) & (CKIP_KP_ENABLED|CKIP_MIC_ENABLED)) - -#ifdef BCMWAPI_WPI -#define WSEC_ENABLED(wsec) \ - ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED | CKIP_KP_ENABLED | \ - CKIP_MIC_ENABLED | SMS4_ENABLED)) -#else /* BCMWAPI_WPI */ -#define WSEC_ENABLED(wsec) \ - ((wsec) & \ - (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED | CKIP_KP_ENABLED | CKIP_MIC_ENABLED)) -#endif /* BCMWAPI_WPI */ -#else /* defined BCMCCX */ #ifdef BCMWAPI_WPI #define WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED | SMS4_ENABLED)) #else /* BCMWAPI_WPI */ #define WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) #endif /* BCMWAPI_WPI */ -#endif /* BCMCCX */ #define WSEC_SES_OW_ENABLED(wsec) ((wsec) & SES_OW_ENABLED) #ifdef BCMWAPI_WAI #define WSEC_SMS4_ENABLED(wsec) ((wsec) & SMS4_ENABLED) @@ -996,15 +904,22 @@ typedef struct { #define MFP_SHA256 0x0800 /* a special configuration for STA for WIFI test tool */ #endif /* MFP */ +#ifdef MFP +#define MFP_CAPABLE 0x0200 +#define MFP_REQUIRED 0x0400 +#define MFP_SHA256 0x0800 /* a special configuration for STA for WIFI test tool */ +#endif /* MFP */ /* WPA authentication mode bitvec */ #define WPA_AUTH_DISABLED 0x0000 /* Legacy (i.e., non-WPA) */ #define WPA_AUTH_NONE 0x0001 /* none (IBSS) */ #define WPA_AUTH_UNSPECIFIED 0x0002 /* over 802.1x */ #define WPA_AUTH_PSK 0x0004 /* Pre-shared key */ -#if defined(BCMCCX) -#define WPA_AUTH_CCKM 0x0008 /* CCKM */ -#define WPA2_AUTH_CCKM 0x0010 /* CCKM2 */ -#endif + +#if defined(BCMCCX) || defined(BCMEXTCCX) +#define WPA_AUTH_CCKM 0x0008 /* CCKM */ +#define WPA2_AUTH_CCKM 0x0010 /* CCKM2 */ +#endif /* BCMCCX || BCMEXTCCX */ + /* #define WPA_AUTH_8021X 0x0020 */ /* 802.1x, reserved */ #define WPA2_AUTH_UNSPECIFIED 0x0040 /* over 802.1x */ #define WPA2_AUTH_PSK 0x0080 /* Pre-shared key */ @@ -1017,8 +932,8 @@ typedef struct { #define WAPI_AUTH_PSK 0x0800 /* Pre-shared key */ #endif /* BCMWAPI_WAI || BCMWAPI_WPI */ #define WPA2_AUTH_MFP 0x1000 /* MFP (11w) in contrast to CCX */ -#define WPA2_AUTH_TPK 0x2000 /* TDLS Peer Key */ -#define WPA2_AUTH_FT 0x4000 /* Fast Transition. */ +#define WPA2_AUTH_TPK 0x2000 /* TDLS Peer Key */ +#define WPA2_AUTH_FT 0x4000 /* Fast Transition. */ #define WPA_AUTH_PFN_ANY 0xffffffff /* for PFN, match only ssid */ /* pmkid */ @@ -1044,7 +959,6 @@ typedef struct _pmkid_cand_list { pmkid_cand_t pmkid_cand[1]; } pmkid_cand_list_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL typedef struct wl_assoc_info { uint32 req_len; uint32 resp_len; @@ -1057,6 +971,7 @@ typedef struct wl_assoc_info { /* flags */ #define WLC_ASSOC_REQ_IS_REASSOC 0x01 /* assoc req was actually a reassoc */ +#ifndef LINUX_POSTMOGRIFY_REMOVAL typedef struct wl_led_info { uint32 index; /* led index */ uint32 behavior; @@ -1138,6 +1053,7 @@ typedef struct { } link_val_t; #define BCM_MAC_STATUS_INDICATION (0x40010200L) +#endif /* LINUX_POSTMOGRIFY_REMOVAL */ typedef struct { uint16 ver; /* version of this struct */ @@ -1186,8 +1102,6 @@ typedef struct { #define WLC_TXFILTER_OVERRIDE_DISABLED 0 #define WLC_TXFILTER_OVERRIDE_ENABLED 1 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - /* Used to get specific STA parameters */ typedef struct { uint32 val; @@ -1213,7 +1127,6 @@ struct maclist { struct ether_addr ea[1]; /* variable length array of MAC addresses */ }; -#ifndef LINUX_POSTMOGRIFY_REMOVAL /* get pkt count struct passed through ioctl */ typedef struct get_pktcnt { uint rx_good_pkt; @@ -1239,6 +1152,9 @@ typedef struct { int isvalid; /* Flag indicating whether above data is valid */ } wl_lq_t; /* Link Quality */ +/* NINTENDO2 */ +#define MCS_INDEX_SIZE 33 + typedef enum wl_wakeup_reason_type { LCD_ON = 1, LCD_OFF, @@ -1265,8 +1181,7 @@ typedef struct { /* Get MAC rate histogram response */ typedef struct { uint32 rate[WLC_MAXRATE + 1]; /* Rates */ - uint32 mcs[WL_RATESET_SZ_HT_MCS * WL_TX_CHAINS_MAX]; /* MCS counts */ - uint32 vht[WL_RATESET_SZ_VHT_MCS][WL_TX_CHAINS_MAX]; /* VHT counts */ + uint32 mcs_index[MCS_INDEX_SIZE]; /* MCS index */ uint32 tsf_timer[2][2]; /* Start and End time for 8bytes value */ } wl_mac_ratehisto_res_t; /* MAC Specific Rate Histogram Response */ @@ -1282,8 +1197,6 @@ typedef struct { #define WL_IOCTL_ACTION_MASK 0x7e #define WL_IOCTL_ACTION_OVL_SHIFT 1 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - /* Linux network driver ioctl encoding */ typedef struct wl_ioctl { uint cmd; /* common ioctl definition */ @@ -1294,8 +1207,6 @@ typedef struct wl_ioctl { uint needed; /* bytes needed (optional) */ } wl_ioctl_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL - /* reference to wl_ioctl_t struct used by usermode driver */ #define ioctl_subtype set /* subtype param */ #define ioctl_pid used /* pid param */ @@ -1360,7 +1271,6 @@ typedef struct wlc_iov_trx_s { #else #define WLC_IOCTL_VERSION 1 #endif /* D11AC_IOTYPES */ -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WLC_IOCTL_MAXLEN 8192 /* max length ioctl buffer required */ #define WLC_IOCTL_SMLEN 256 /* "small" length ioctl buffer required */ @@ -1400,7 +1310,7 @@ typedef struct wlc_iov_trx_s { #define WLC_GET_SSID 25 #define WLC_SET_SSID 26 #define WLC_RESTART 27 -#define WLC_TERMINATED 28 +#define WLC_TERMINATED 28 /* #define WLC_DUMP_SCB 28 */ /* no longer supported */ #define WLC_GET_CHANNEL 29 #define WLC_SET_CHANNEL 30 @@ -1516,8 +1426,6 @@ typedef struct wlc_iov_trx_s { #define WLC_GET_LAZYWDS 138 #define WLC_SET_LAZYWDS 139 #define WLC_GET_BANDLIST 140 - -#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WLC_GET_BAND 141 #define WLC_SET_BAND 142 #define WLC_SCB_DEAUTHENTICATE 143 @@ -1557,9 +1465,7 @@ typedef struct wlc_iov_trx_s { /* #define WLC_DUMP_PHYREGS 177 */ /* no longer supported */ #define WLC_GET_PROTECTION_CONTROL 178 #define WLC_SET_PROTECTION_CONTROL 179 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WLC_GET_PHYLIST 180 -#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WLC_ENCRYPT_STRENGTH 181 /* ndis only */ #define WLC_DECRYPT_STATUS 182 /* ndis only */ #define WLC_GET_KEY_SEQ 183 @@ -1580,9 +1486,7 @@ typedef struct wlc_iov_trx_s { /* #define WLC_GET_GMODE_PROTECTION_CTS 198 */ /* no longer supported */ /* #define WLC_SET_GMODE_PROTECTION_CTS 199 */ /* no longer supported */ #define WLC_SET_WSEC_TEST 200 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WLC_SCB_DEAUTHENTICATE_FOR_REASON 201 -#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WLC_TKIP_COUNTERMEASURES 202 #define WLC_GET_PIOMODE 203 #define WLC_SET_PIOMODE 204 @@ -1598,7 +1502,6 @@ typedef struct wlc_iov_trx_s { #define WLC_START_CHANNEL_QA 214 #define WLC_GET_CHANNEL_SEL 215 #define WLC_START_CHANNEL_SEL 216 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WLC_GET_VALID_CHANNELS 217 #define WLC_GET_FAKEFRAG 218 #define WLC_SET_FAKEFRAG 219 @@ -1619,9 +1522,6 @@ typedef struct wlc_iov_trx_s { /* #define WLC_GET_GLACIAL_TIMER 234 */ /* no longer supported */ #define WLC_GET_KEY_PRIMARY 235 #define WLC_SET_KEY_PRIMARY 236 - -#ifndef LINUX_POSTMOGRIFY_REMOVAL - /* #define WLC_DUMP_RADIOREGS 237 */ /* no longer supported */ #define WLC_GET_ACI_ARGS 238 #define WLC_SET_ACI_ARGS 239 @@ -1647,10 +1547,8 @@ typedef struct wlc_iov_trx_s { #define WLC_LEGACY_LINK_BEHAVIOR 259 #define WLC_GET_CHANNELS_IN_COUNTRY 260 #define WLC_GET_COUNTRY_LIST 261 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define WLC_GET_VAR 262 /* get value of named variable */ #define WLC_SET_VAR 263 /* set named variable to value */ -#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WLC_NVRAM_GET 264 /* deprecated */ #define WLC_NVRAM_SET 265 #define WLC_NVRAM_DUMP 266 @@ -1782,7 +1680,6 @@ typedef struct { /* BCM4334(Phoenex branch) value changed to 3 */ #define WL_AUTH_OPEN_SHARED 3 /* try open, then shared if open failed w/rc 13 */ #endif -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* Bit masks for radio disabled status - returned by WL_GET_RADIO */ #define WL_RADIO_SW_DISABLE (1<<0) @@ -1798,7 +1695,6 @@ typedef struct { #define WL_TXPWR_OVERRIDE (1U<<31) #define WL_TXPWR_NEG (1U<<30) -#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WL_PHY_PAVARS_LEN 32 /* Phy type, Band range, chain, a1[0], b0[0], b1[0] ... */ #define WL_PHY_PAVAR_VER 1 /* pavars version */ @@ -1858,8 +1754,7 @@ typedef struct wl_po { #define WL_CHAN_FREQ_RANGE_5G_BAND2 3 #define WL_CHAN_FREQ_RANGE_5G_BAND3 4 -#define WL_CHAN_FREQ_RANGE_5G_4BAND 5 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ +#define WL_CHAN_FREQ_RANGE_5G_4BAND 5 /* phy types (returned by WLC_GET_PHYTPE) */ #define WLC_PHY_TYPE_A 0 @@ -1871,16 +1766,8 @@ typedef struct wl_po { #define WLC_PHY_TYPE_HT 7 #define WLC_PHY_TYPE_LCN 8 #define WLC_PHY_TYPE_LCN40 10 -#define WLC_PHY_TYPE_AC 11 #define WLC_PHY_TYPE_NULL 0xf -/* Values for PM */ -#define PM_OFF 0 -#define PM_MAX 1 -#define PM_FAST 2 -#define PM_FORCE_OFF 3 /* use this bit to force PM off even bt is active */ - -#ifndef LINUX_POSTMOGRIFY_REMOVAL /* MAC list modes */ #define WLC_MACMODE_DISABLED 0 /* MAC list disabled */ #define WLC_MACMODE_DENY 1 /* Deny specified (i.e. allow unspecified) */ @@ -1948,25 +1835,11 @@ typedef struct wl_po { #define WLC_N_PREAMBLE_GF 1 #define WLC_N_PREAMBLE_GF_BRCM 2 -/* values for band specific 40MHz capabilities (deprecated) */ +/* values for band specific 40MHz capabilities */ #define WLC_N_BW_20ALL 0 #define WLC_N_BW_40ALL 1 #define WLC_N_BW_20IN2G_40IN5G 2 -#define WLC_BW_20MHZ_BIT (1<<0) -#define WLC_BW_40MHZ_BIT (1<<1) -#define WLC_BW_80MHZ_BIT (1<<2) - -/* Bandwidth capabilities */ -#define WLC_BW_CAP_20MHZ (WLC_BW_20MHZ_BIT) -#define WLC_BW_CAP_40MHZ (WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT) -#define WLC_BW_CAP_80MHZ (WLC_BW_80MHZ_BIT|WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT) -#define WLC_BW_CAP_UNRESTRICTED 0xFF - -#define WL_BW_CAP_20MHZ(bw_cap) (((bw_cap) & WLC_BW_20MHZ_BIT) ? TRUE : FALSE) -#define WL_BW_CAP_40MHZ(bw_cap) (((bw_cap) & WLC_BW_40MHZ_BIT) ? TRUE : FALSE) -#define WL_BW_CAP_80MHZ(bw_cap) (((bw_cap) & WLC_BW_80MHZ_BIT) ? TRUE : FALSE) - /* values to force tx/rx chain */ #define WLC_N_TXRX_CHAIN0 0 #define WLC_N_TXRX_CHAIN1 1 @@ -1974,14 +1847,15 @@ typedef struct wl_po { /* bitflags for SGI support (sgi_rx iovar) */ #define WLC_N_SGI_20 0x01 #define WLC_N_SGI_40 0x02 -#define WLC_VHT_SGI_80 0x04 /* when sgi_tx==WLC_SGI_ALL, bypass rate selection, enable sgi for all mcs */ #define WLC_SGI_ALL 0x02 -#define DHD_SCAN_ACTIVE_TIME 40 /* ms : Embedded default Active setting from DHD */ -#define DHD_SCAN_UNASSOC_ACTIVE_TIME 80 /* ms : def. Unassoc Active setting from DHD */ -#define DHD_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD */ +/* Values for PM */ +#define PM_OFF 0 +#define PM_MAX 1 +#define PM_FAST 2 +#define PM_FORCE_OFF 3 /* use this bit to force PM off even bt is active */ #define LISTEN_INTERVAL 10 /* interference mitigation options */ @@ -1993,6 +1867,12 @@ typedef struct wl_po { #define WLAN_AUTO_W_NOISE 4 /* ACI: auto - detect and non 802.11 interference */ #define AUTO_ACTIVE (1 << 7) /* Auto is currently active */ +/* AP environment */ +#define AP_ENV_DETECT_NOT_USED 0 /* We aren't using AP environment detection */ +#define AP_ENV_DENSE 1 /* "Corporate" or other AP dense environment */ +#define AP_ENV_SPARSE 2 /* "Home" or other sparse environment */ +#define AP_ENV_INDETERMINATE 3 /* AP environment hasn't been identified */ + typedef struct wl_aci_args { int enter_aci_thresh; /* Trigger level to start detecting ACI */ int exit_aci_thresh; /* Trigger level to exit ACI mode */ @@ -2070,12 +1950,13 @@ typedef struct wl_sampledata { uint32 flag; /* bit def */ } wl_sampledata_t; +#ifndef LINUX_POSTMOGRIFY_REMOVAL /* wl_radar_args_t */ typedef struct { - int npulses; /* required number of pulses at n * t_int */ - int ncontig; /* required number of pulses at t_int */ - int min_pw; /* minimum pulse width (20 MHz clocks) */ - int max_pw; /* maximum pulse width (20 MHz clocks) */ + int npulses; /* required number of pulses at n * t_int */ + int ncontig; /* required number of pulses at t_int */ + int min_pw; /* minimum pulse width (20 MHz clocks) */ + int max_pw; /* maximum pulse width (20 MHz clocks) */ uint16 thresh0; /* Radar detection, thresh 0 */ uint16 thresh1; /* Radar detection, thresh 1 */ uint16 blank; /* Radar detection, blank control */ @@ -2112,21 +1993,13 @@ typedef struct { uint16 thresh1_20_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 20MHz */ uint16 thresh0_40_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 40MHz */ uint16 thresh1_40_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 40MHz */ - uint16 thresh0_80_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 80MHz */ - uint16 thresh1_80_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 80MHz */ - uint16 thresh0_160_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 160MHz */ - uint16 thresh1_160_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 160MHz */ uint16 thresh0_20_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 20MHz */ uint16 thresh1_20_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 20MHz */ uint16 thresh0_40_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 40MHz */ uint16 thresh1_40_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 40MHz */ - uint16 thresh0_80_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 80MHz */ - uint16 thresh1_80_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 80MHz */ - uint16 thresh0_160_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 160MHz */ - uint16 thresh1_160_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 160MHz */ } wl_radar_thr_t; -#define WL_RADAR_THR_VERSION 2 +#define WL_RADAR_THR_VERSION 1 #define WL_THRESHOLD_LO_BAND 70 /* range from 5250MHz - 5350MHz */ /* radar iovar SET defines */ @@ -2226,12 +2099,12 @@ typedef struct { } tx_power_legacy2_t; /* TX Power index defines */ -#define WL_NUM_RATES_CCK 4 /* 1, 2, 5.5, 11 Mbps */ -#define WL_NUM_RATES_OFDM 8 /* 6, 9, 12, 18, 24, 36, 48, 54 Mbps SISO/CDD */ -#define WL_NUM_RATES_MCS_1STREAM 8 /* MCS 0-7 1-stream rates - SISO/CDD/STBC/MCS */ +#define WL_NUM_RATES_CCK 4 /* 1, 2, 5.5, 11 Mbps */ +#define WL_NUM_RATES_OFDM 8 /* 6, 9, 12, 18, 24, 36, 48, 54 Mbps SISO/CDD */ +#define WL_NUM_RATES_MCS_1STREAM 8 /* MCS 0-7 1-stream rates - SISO/CDD/STBC/MCS */ #define WL_NUM_RATES_EXTRA_VHT 2 /* Additional VHT 11AC rates */ #define WL_NUM_RATES_VHT 10 -#define WL_NUM_RATES_MCS32 1 +#define WL_NUM_RATES_MCS32 1 #define WLC_NUM_RATES_CCK WL_NUM_RATES_CCK #define WLC_NUM_RATES_OFDM WL_NUM_RATES_OFDM @@ -2474,9 +2347,9 @@ typedef struct txppr { #define WL_TX_POWER_40_S3X3_VHT OFFSETOF(txppr_t, b40_3x3sdm_vht) /* 20 in 40MHz */ -#define WL_TX_POWER_20UL_CCK_FIRST OFFSETOF(txppr_t, b20in40_1x1dsss) -#define WL_TX_POWER_20UL_OFDM_FIRST OFFSETOF(txppr_t, b20in40_1x1ofdm) -#define WL_TX_POWER_20UL_S1x1_FIRST OFFSETOF(txppr_t, b20in40_1x1mcs0) +#define WL_TX_POWER_20UL_CCK_FIRST OFFSETOF(txppr_t, b20in40_1x1dsss) +#define WL_TX_POWER_20UL_OFDM_FIRST OFFSETOF(txppr_t, b20in40_1x1ofdm) +#define WL_TX_POWER_20UL_S1x1_FIRST OFFSETOF(txppr_t, b20in40_1x1mcs0) #define WL_TX_POWER_CCK_20U_CDD_S1x2_FIRST OFFSETOF(txppr_t, b20in40_1x2dsss) #define WL_TX_POWER_20UL_OFDM_CDD_FIRST OFFSETOF(txppr_t, b20in40_1x2cdd_ofdm) @@ -2485,7 +2358,7 @@ typedef struct txppr { #define WL_TX_POWER_20UL_S2x2_FIRST OFFSETOF(txppr_t, b20in40_2x2sdm_mcs8) #define WL_TX_POWER_CCK_20U_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3dsss) -#define WL_TX_POWER_20UL_OFDM_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3cdd_ofdm) +#define WL_TX_POWER_20UL_OFDM_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3cdd_ofdm) #define WL_TX_POWER_20UL_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3cdd_mcs0) #define WL_TX_POWER_20UL_STBC_S2x3_FIRST OFFSETOF(txppr_t, b20in40_2x3stbc_mcs0) #define WL_TX_POWER_20UL_S2x3_FIRST OFFSETOF(txppr_t, b20in40_2x3sdm_mcs8) @@ -2586,7 +2459,7 @@ typedef struct txppr { #define WL_TX_POWER_MCS_32 OFFSETOF(txppr_t, mcs32) /* C_CHECK remove later */ -#define WL_TX_POWER_RATES sizeof(struct txppr) +#define WL_TX_POWER_RATES sizeof(struct txppr) /* sslpnphy specifics */ #define WL_TX_POWER_MCS20_SISO_FIRST_SSN WL_TX_POWER_MCS20_SISO_FIRST @@ -2610,27 +2483,14 @@ typedef struct { #define WL_TXPPR_VERSION 0 #define WL_TXPPR_LENGTH (sizeof(wl_txppr_t)) +#define WL_CLM_NUM_RATES 116 /* must be the same as CLM_NUMRATES */ #define TX_POWER_T_VERSION 43 /* Defines used with channel_bandwidth for curpower */ -#define WL_BW_20MHZ 0 -#define WL_BW_40MHZ 1 -#define WL_BW_80MHZ 2 +#define WL_BW_20MHZ 0 +#define WL_BW_40MHZ 1 +#define WL_BW_80MHZ 2 -/* tx_power_t.flags bits */ -#ifdef PPR_API -#define WL_TX_POWER2_F_ENABLED 1 -#define WL_TX_POWER2_F_HW 2 -#define WL_TX_POWER2_F_MIMO 4 -#define WL_TX_POWER2_F_SISO 8 -#define WL_TX_POWER2_F_HT 0x10 -#else -#define WL_TX_POWER_F_ENABLED 1 -#define WL_TX_POWER_F_HW 2 -#define WL_TX_POWER_F_MIMO 4 -#define WL_TX_POWER_F_SISO 8 -#define WL_TX_POWER_F_HT 0x10 -#endif typedef struct { uint32 flags; chanspec_t chanspec; /* txpwr report for this channel */ @@ -2640,27 +2500,22 @@ typedef struct { int8 antgain[2]; /* Ant gain for each band - from SROM */ uint8 rf_cores; /* count of RF Cores being reported */ uint8 est_Pout[4]; /* Latest tx power out estimate per RF chain */ - uint8 est_Pout_act[4]; /* Latest tx power out estimate per RF chain - * without adjustment - */ + uint8 est_Pout_act[4]; /* Latest tx power out estimate per RF chain + * without adjustment + */ uint8 est_Pout_cck; /* Latest CCK tx power out estimate */ - uint8 tx_power_max[4]; /* Maximum target power among all rates */ - uint tx_power_max_rate_ind[4]; /* Index of the rate with the max target power */ + uint8 tx_power_max[4]; /* Maximum target power among all rates */ + uint tx_power_max_rate_ind[4]; /* Index of the rate with the max target power */ uint8 user_limit[WL_TX_POWER_RATES]; /* User limit */ int8 board_limit[WL_TX_POWER_RATES]; /* Max power board can support (SROM) */ int8 target[WL_TX_POWER_RATES]; /* Latest target power */ - int8 clm_limits[WL_NUMRATES]; /* regulatory limits - 20, 40 or 80MHz */ - int8 clm_limits_subchan1[WL_NUMRATES]; /* regulatory limits - 20in40 or 40in80 */ - int8 clm_limits_subchan2[WL_NUMRATES]; /* regulatory limits - 20in80MHz */ - int8 sar; /* SAR limit for display by wl executable */ - int8 channel_bandwidth; /* 20, 40 or 80 MHz bandwidth? */ + int8 clm_limits[WL_CLM_NUM_RATES]; /* regulatory limits - 20, 40 or 80MHz */ + int8 clm_limits_subchan1[WL_CLM_NUM_RATES]; /* regulatory limits - 20in40 or 40in80 */ + int8 clm_limits_subchan2[WL_CLM_NUM_RATES]; /* regulatory limits - 20in80MHz */ + int8 sar; /* SAR limit for display by wl executable */ + int8 channel_bandwidth; /* 20, 40 or 80 MHz bandwidth? */ uint8 version; /* Version of the data format wlu <--> driver */ - uint8 display_core; /* Displayed curpower core */ -#ifdef PPR_API -} tx_power_new_t; -#else } tx_power_t; -#endif typedef struct tx_inst_power { uint8 txpwr_est_Pout[2]; /* Latest estimate for 2.4 and 5 Ghz */ @@ -2747,6 +2602,7 @@ typedef struct wl_txchain_pwr_offsets { #define WL_BTC_FLAG_ECI (1 << 6) #define WL_BTC_FLAG_LIGHT (1 << 7) #define WL_BTC_FLAG_PARALLEL (1 << 8) +#endif /* !defined(LINUX_POSTMOGRIFY_REMOVAL) */ /* Message levels */ #define WL_ERROR_VAL 0x00000001 @@ -2785,7 +2641,7 @@ typedef struct wl_txchain_pwr_offsets { /* wl_msg_level is full. For new bits take the next one and AND with * wl_msg_level2 in wl_dbg.h */ -#define WL_DPT_VAL 0x00000001 +#define WL_DPT_VAL 0x00000001 #define WL_SCAN_VAL 0x00000002 #define WL_WOWL_VAL 0x00000004 #define WL_COEX_VAL 0x00000008 @@ -2801,9 +2657,6 @@ typedef struct wl_txchain_pwr_offsets { #define WL_MCNX_VAL 0x00002000 #define WL_PROT_VAL 0x00004000 #define WL_PSTA_VAL 0x00008000 -#define WL_TBTT_VAL 0x00010000 -#define WL_NIC_VAL 0x00020000 -#define WL_PWRSEL_VAL 0x00040000 /* use top-bit for WL_TIME_STAMP_VAL because this is a modifier * rather than a message-type of its own */ @@ -2833,9 +2686,9 @@ typedef struct wl_txchain_pwr_offsets { #define WL_LED_BLINKFAST 17 /* blink fast */ #define WL_LED_BLINKCUSTOM 18 /* blink custom */ #define WL_LED_BLINKPERIODIC 19 /* blink periodic (custom 1000ms / off 400ms) */ -#define WL_LED_ASSOC_WITH_SEC 20 /* when connected with security */ +#define WL_LED_ASSOC_WITH_SEC 20 /* when connected with security */ /* keep on for 300 sec */ -#define WL_LED_START_OFF 21 /* off upon boot, could be turned on later */ +#define WL_LED_START_OFF 21 /* off upon boot, could be turned on later */ #define WL_LED_NUMBEHAVIOR 22 /* led behavior numeric value format */ @@ -2844,9 +2697,7 @@ typedef struct wl_txchain_pwr_offsets { /* maximum channels returned by the get valid channels iovar */ #define WL_NUMCHANNELS 64 - -/* max number of chanspecs (used by the iovar to calc. buf space) */ -#define WL_NUMCHANSPECS 110 +#define WL_NUMCHANSPECS 100 /* WDS link local endpoint WPA role */ #define WL_WDS_WPA_ROLE_AUTH 0 /* authenticator */ @@ -2913,7 +2764,6 @@ typedef struct wl_txchain_pwr_offsets { struct tsinfo_arg { uint8 octets[3]; }; -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #define NFIFO 6 /* # tx/rx fifopairs */ @@ -3108,7 +2958,7 @@ typedef struct { uint32 rx36mbps; /* packets rx at 36Mbps */ uint32 rx48mbps; /* packets rx at 48Mbps */ uint32 rx54mbps; /* packets rx at 54Mbps */ - uint32 rx108mbps; /* packets rx at 108mbps */ + uint32 rx108mbps; /* packets rx at 108mbps */ uint32 rx162mbps; /* packets rx at 162mbps */ uint32 rx216mbps; /* packets rx at 216 mbps */ uint32 rx270mbps; /* packets rx at 270 mbps */ @@ -3160,7 +3010,6 @@ typedef struct { uint32 cso_passthrough; /* hw cso required but passthrough */ } wl_cnt_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL typedef struct { uint16 version; /* see definition of WL_CNT_T_VERSION */ uint16 length; /* length of entire structure */ @@ -3390,6 +3239,8 @@ typedef struct { uint32 rxmpdu_stbc; /* count for stbc received */ } wl_cnt_ver_six_t; + +#ifndef LINUX_POSTMOGRIFY_REMOVAL #define WL_DELTA_STATS_T_VERSION 1 /* current version of wl_delta_stats_t struct */ typedef struct { @@ -3419,7 +3270,7 @@ typedef struct { uint32 rx36mbps; /* packets rx at 36Mbps */ uint32 rx48mbps; /* packets rx at 48Mbps */ uint32 rx54mbps; /* packets rx at 54Mbps */ - uint32 rx108mbps; /* packets rx at 108mbps */ + uint32 rx108mbps; /* packets rx at 108mbps */ uint32 rx162mbps; /* packets rx at 162mbps */ uint32 rx216mbps; /* packets rx at 216 mbps */ uint32 rx270mbps; /* packets rx at 270 mbps */ @@ -3453,7 +3304,6 @@ typedef struct { } wl_wme_cnt_t; -#ifndef LINUX_POSTMOGRIFY_REMOVAL struct wl_msglevel2 { uint32 low; uint32 high; @@ -3472,6 +3322,7 @@ typedef struct wl_mkeep_alive_pkt { #define WL_MKEEP_ALIVE_FIXED_LEN OFFSETOF(wl_mkeep_alive_pkt_t, data) #define WL_MKEEP_ALIVE_PRECISION 500 +#ifndef LINUX_POSTMOGRIFY_REMOVAL #ifdef WLBA #define WLC_BA_CNT_VERSION 1 /* current version of wlc_ba_cnt_t */ @@ -3541,8 +3392,8 @@ struct ampdu_retry_tid { #define DPT_PATHSEL_APPATH 2 /* always use AP path */ /* different ops for deny list */ -#define DPT_DENY_LIST_ADD 1 /* add to dpt deny list */ -#define DPT_DENY_LIST_REMOVE 2 /* remove from dpt deny list */ +#define DPT_DENY_LIST_ADD 1 /* add to dpt deny list */ +#define DPT_DENY_LIST_REMOVE 2 /* remove from dpt deny list */ /* different ops for manual end point */ #define DPT_MANUAL_EP_CREATE 1 /* create manual dpt endpoint */ @@ -3613,18 +3464,6 @@ typedef struct tdls_iovar { chanspec_t chanspec; uint32 pad; /* future */ } tdls_iovar_t; - -/* modes */ -#define TDLS_WFD_IE_TX 0 -#define TDLS_WFD_IE_RX 1 -#define TDLS_WFD_IE_SIZE 255 -/* structure for tdls wfd ie */ -typedef struct tdls_wfd_ie_iovar { - struct ether_addr ea; /* Station address */ - uint8 mode; - uint8 length; - uint8 data[TDLS_WFD_IE_SIZE]; -} tdls_wfd_ie_iovar_t; #endif /* WLTDLS */ /* structure for addts/delts arguments */ @@ -3674,7 +3513,6 @@ typedef struct wme_max_bandwidth { #define WL_WOWL_KEEPALIVE_MAX_PACKET_SIZE 80 #define WLC_WOWL_MAX_KEEPALIVE 2 - /* define for flag */ #define TSPEC_PENDING 0 /* TSPEC pending */ #define TSPEC_ACCEPTED 1 /* TSPEC accepted */ @@ -3682,13 +3520,6 @@ typedef struct wme_max_bandwidth { #define TSPEC_UNKNOWN 3 /* TSPEC unknown */ #define TSPEC_STATUS_MASK 7 /* TSPEC status mask */ -#ifdef BCMCCX -/* "wlan_reason" iovar interface */ -#define WL_WLAN_ASSOC_REASON_NORMAL_NETWORK 0 /* normal WLAN network setup */ -#define WL_WLAN_ASSOC_REASON_ROAM_FROM_CELLULAR_NETWORK 1 /* roam from Cellular network */ -#define WL_WLAN_ASSOC_REASON_ROAM_FROM_LAN 2 /* roam from LAN */ -#define WL_WLAN_ASSOC_REASON_MAX 2 /* largest value allowed */ -#endif /* BCMCCX */ /* Software feature flag defines used by wlfeatureflag */ #ifdef WLAFTERBURNER @@ -3714,6 +3545,7 @@ typedef struct wl_chan_switch { chanspec_t chspec; /* chanspec */ uint8 reg; /* regulatory class */ } wl_chan_switch_t; +#endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* Roaming trigger definitions for WLC_SET_ROAM_TRIGGER. * @@ -3730,8 +3562,6 @@ typedef struct wl_chan_switch { #define WLC_ROAM_TRIGGER_AUTO 3 /* auto-detect environment */ #define WLC_ROAM_TRIGGER_MAX_VALUE 3 /* max. valid value */ -#define WLC_ROAM_NEVER_ROAM_TRIGGER (-100) /* Avoid Roaming by setting a large value */ - /* Preferred Network Offload (PNO, formerly PFN) defines */ #define WPA_AUTH_PFN_ANY 0xffffffff /* for PFN, match only ssid */ @@ -3760,8 +3590,6 @@ enum { #define ENABLE_BD_SCAN_BIT 5 #define ENABLE_ADAPTSCAN_BIT 6 #define IMMEDIATE_EVENT_BIT 8 -#define SUPPRESS_SSID_BIT 9 -#define ENABLE_NET_OFFLOAD_BIT 10 #define SORT_CRITERIA_MASK 0x0001 #define AUTO_NET_SWITCH_MASK 0x0002 @@ -3772,8 +3600,6 @@ enum { #define ENABLE_BD_SCAN_MASK 0x0020 #define ENABLE_ADAPTSCAN_MASK 0x00c0 #define IMMEDIATE_EVENT_MASK 0x0100 -#define SUPPRESS_SSID_MASK 0x0200 -#define ENABLE_NET_OFFLOAD_MASK 0x0400 #define PFN_VERSION 2 #define PFN_SCANRESULT_VERSION 1 @@ -3832,7 +3658,7 @@ typedef struct wl_pfn_param { } wl_pfn_param_t; typedef struct wl_pfn_bssid { - struct ether_addr macaddr; + struct ether_addr macaddr; /* Bit4: suppress_lost, Bit3: suppress_found */ uint16 flags; } wl_pfn_bssid_t; @@ -3844,13 +3670,13 @@ typedef struct wl_pfn_cfg { int32 channel_num; uint16 channel_list[WL_NUMCHANNELS]; } wl_pfn_cfg_t; -#define WL_PFN_REPORT_ALLNET 0 -#define WL_PFN_REPORT_SSIDNET 1 -#define WL_PFN_REPORT_BSSIDNET 2 +#define WL_PFN_REPORT_ALLNET 0 +#define WL_PFN_REPORT_SSIDNET 1 +#define WL_PFN_REPORT_BSSIDNET 2 typedef struct wl_pfn { wlc_ssid_t ssid; /* ssid name and its length */ - int32 flags; /* bit2: hidden */ + int32 bss_type; /* IBSS or infrastructure */ int32 infra; /* BSS Vs IBSS */ int32 auth; /* Open Vs Closed */ int32 wpa_auth; /* WPA type */ @@ -3862,13 +3688,10 @@ typedef struct wl_pfn { #define PNO_SCAN_MIN_FW_SEC 10 /* min time scan time in SEC */ #define WL_PFN_HIDDEN_MASK 0x4 -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - /* TCP Checksum Offload defines */ #define TOE_TX_CSUM_OL 0x00000001 #define TOE_RX_CSUM_OL 0x00000002 -#ifndef LINUX_POSTMOGRIFY_REMOVAL /* TCP Checksum Offload error injection for testing */ #define TOE_ERRTEST_TX_CSUM 0x00000001 #define TOE_ERRTEST_RX_CSUM 0x00000002 @@ -4049,8 +3872,8 @@ typedef struct wl_seq_cmd_ioctl { #define WL_PKTENG_PER_TX_START 0x01 #define WL_PKTENG_PER_TX_STOP 0x02 #define WL_PKTENG_PER_RX_START 0x04 -#define WL_PKTENG_PER_RX_WITH_ACK_START 0x05 -#define WL_PKTENG_PER_TX_WITH_ACK_START 0x06 +#define WL_PKTENG_PER_RX_WITH_ACK_START 0x05 +#define WL_PKTENG_PER_TX_WITH_ACK_START 0x06 #define WL_PKTENG_PER_RX_STOP 0x08 #define WL_PKTENG_PER_MASK 0xff @@ -4077,29 +3900,27 @@ typedef struct wl_pkteng_stats { uint16 rxpktcnt[NUM_80211_RATES+1]; } wl_pkteng_stats_t; - -#define WL_WOWL_MAGIC (1 << 0) /* Wakeup on Magic packet */ -#define WL_WOWL_NET (1 << 1) /* Wakeup on Netpattern */ -#define WL_WOWL_DIS (1 << 2) /* Wakeup on loss-of-link due to Disassoc/Deauth */ -#define WL_WOWL_RETR (1 << 3) /* Wakeup on retrograde TSF */ -#define WL_WOWL_BCN (1 << 4) /* Wakeup on loss of beacon */ -#define WL_WOWL_TST (1 << 5) /* Wakeup after test */ -#define WL_WOWL_M1 (1 << 6) /* Wakeup after PTK refresh */ -#define WL_WOWL_EAPID (1 << 7) /* Wakeup after receipt of EAP-Identity Req */ -#define WL_WOWL_PME_GPIO (1 << 8) /* Wakeind via PME(0) or GPIO(1) */ +#define WL_WOWL_MAGIC (1 << 0) /* Wakeup on Magic packet */ +#define WL_WOWL_NET (1 << 1) /* Wakeup on Netpattern */ +#define WL_WOWL_DIS (1 << 2) /* Wakeup on loss-of-link due to Disassoc/Deauth */ +#define WL_WOWL_RETR (1 << 3) /* Wakeup on retrograde TSF */ +#define WL_WOWL_BCN (1 << 4) /* Wakeup on loss of beacon */ +#define WL_WOWL_TST (1 << 5) /* Wakeup after test */ +#define WL_WOWL_M1 (1 << 6) /* Wakeup after PTK refresh */ +#define WL_WOWL_EAPID (1 << 7) /* Wakeup after receipt of EAP-Identity Req */ +#define WL_WOWL_PME_GPIO (1 << 8) /* Wakeind via PME(0) or GPIO(1) */ #define WL_WOWL_NEEDTKIP1 (1 << 9) /* need tkip phase 1 key to be updated by the driver */ #define WL_WOWL_GTK_FAILURE (1 << 10) /* enable wakeup if GTK fails */ #define WL_WOWL_EXTMAGPAT (1 << 11) /* support extended magic packets */ #define WL_WOWL_ARPOFFLOAD (1 << 12) /* support ARP/NS/keepalive offloading */ #define WL_WOWL_WPA2 (1 << 13) /* read protocol version for EAPOL frames */ -#define WL_WOWL_KEYROT (1 << 14) /* If the bit is set, use key rotaton */ -#define WL_WOWL_BCAST (1 << 15) /* If the bit is set, frm received was bcast frame */ +#define WL_WOWL_KEYROT (1 << 14) /* If the bit is set, use key rotaton */ +#define WL_WOWL_BCAST (1 << 15) /* If the bit is set, frm received was bcast frame */ -#define MAGIC_PKT_MINLEN 102 /* Magic pkt min length is 6 * 0xFF + 16 * ETHER_ADDR_LEN */ +#define MAGIC_PKT_MINLEN 102 /* Magic pkt min length is 6 * 0xFF + 16 * ETHER_ADDR_LEN */ #define WOWL_PATTEN_TYPE_ARP (1 << 0) /* ARP offload Pattern */ #define WOWL_PATTEN_TYPE_NA (1 << 1) /* NA offload Pattern */ - typedef struct { uint32 masksize; /* Size of the mask in #of bytes */ uint32 offset; /* Offset to start looking for the packet in # of bytes */ @@ -4122,7 +3943,6 @@ typedef struct { uint16 ucode_wakeind; /* What wakeup-event indication was set by ucode */ } wl_wowl_wakeind_t; - /* per AC rate control related data structure */ typedef struct wl_txrate_class { uint8 init_rate; @@ -4130,8 +3950,6 @@ typedef struct wl_txrate_class { uint8 max_rate; } wl_txrate_class_t; - - /* Overlap BSS Scan parameters default, minimum, maximum */ #define WLC_OBSS_SCAN_PASSIVE_DWELL_DEFAULT 20 /* unit TU */ #define WLC_OBSS_SCAN_PASSIVE_DWELL_MIN 5 /* unit TU */ @@ -4385,16 +4203,11 @@ typedef struct { #define OVERLAY_DOWNLOAD_CHUNKSIZE 1024 #endif /* DONGLEOVERLAYS */ -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - /* no default structure packing */ #include <packed_section_end.h> /* require strict packing */ #include <packed_section_start.h> - -#ifndef LINUX_POSTMOGRIFY_REMOVAL - /* Structures and constants used for "vndr_ie" IOVar interface */ #define VNDR_IE_CMD_LEN 4 /* length of the set command string: * "add", "del" (+ NUL) @@ -4484,12 +4297,9 @@ typedef BWL_PRE_PACKED_STRUCT struct { } BWL_POST_PACKED_STRUCT txfailinfo_t; #endif /* WLMEDIA_TXFAILEVENT */ -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ - /* no strict structure packing */ #include <packed_section_end.h> -#ifndef LINUX_POSTMOGRIFY_REMOVAL /* Global ASSERT Logging */ #define ASSERTLOG_CUR_VER 0x0100 #define MAX_ASSRTSTR_LEN 64 @@ -4514,14 +4324,14 @@ typedef struct assertlog_results { #define IV_LEN 16 struct wapi_sta_msg_t { - uint16 msg_type; - uint16 datalen; - uint8 vap_mac[6]; - uint8 reserve_data1[2]; - uint8 sta_mac[6]; - uint8 reserve_data2[2]; - uint8 gsn[IV_LEN]; - uint8 wie[256]; + uint16 msg_type; + uint16 datalen; + uint8 vap_mac[6]; + uint8 reserve_data1[2]; + uint8 sta_mac[6]; + uint8 reserve_data2[2]; + uint8 gsn[IV_LEN]; + uint8 wie[256]; }; #endif /* BCMWAPI_WAI */ @@ -4530,14 +4340,14 @@ struct wapi_sta_msg_t /* chanim mode */ #define CHANIM_DISABLE 0 /* disabled */ #define CHANIM_DETECT 1 /* detection only */ -#define CHANIM_EXT 2 /* external state machine */ +#define CHANIM_EXT 2 /* external state machine */ #define CHANIM_ACT 3 /* full internal state machine, detect + act */ #define CHANIM_MODE_MAX 4 /* define for apcs reason code */ #define APCS_INIT 0 -#define APCS_IOCTL 1 -#define APCS_CHANIM 2 +#define APCS_IOCTL 1 +#define APCS_CHANIM 2 #define APCS_CSTIMER 3 #define APCS_BTA 4 @@ -4576,7 +4386,7 @@ typedef struct { typedef struct chanim_stats { uint32 glitchcnt; /* normalized as per second count */ uint32 badplcp; /* normalized as per second count */ - uint8 ccastats[CCASTATS_MAX]; /* normalized as 0-255 */ + uint8 ccastats[CCASTATS_MAX]; /* normalized as 0-255 */ int8 bgnoise; /* background noise level (in dBm) */ chanspec_t chanspec; uint32 timestamp; @@ -4612,13 +4422,11 @@ typedef struct { #define AP_TPC_AP_BSS_PWR 3 /* Both AP and BSS power control */ #define AP_TPC_MAX_LINK_MARGIN 127 -/* ap tpc modes */ #define AP_TPC_OFF 0 #define AP_TPC_BSS_PWR 1 /* BSS power control */ #define AP_TPC_AP_PWR 2 /* AP power control */ #define AP_TPC_AP_BSS_PWR 3 /* Both AP and BSS power control */ #define AP_TPC_MAX_LINK_MARGIN 127 - /* structure/defines for selective mgmt frame (smf) stats support */ #define SMFS_VERSION 1 @@ -4648,7 +4456,7 @@ enum { /* reuse two number in the sc/rc space */ #define SMFS_CODE_MALFORMED 0xFFFE -#define SMFS_CODE_IGNORED 0xFFFD +#define SMFS_CODE_IGNORED 0xFFFD typedef enum smfs_type { SMFS_TYPE_AUTH, @@ -4864,13 +4672,6 @@ typedef struct wl_nic_ifq { uint bsscfgidx; char ifname[BCM_MSG_IFNAME_MAX]; } wl_nic_ifq_t; - -/* data mode */ -/* nic_dm iovar */ -typedef struct wl_nic_dm { - uint8 enab; - chanspec_t chspec; -} wl_nic_dm_t; #endif /* WLNIC */ /* RFAWARE def */ @@ -5022,7 +4823,6 @@ typedef struct wl_mempool_stats { } wl_mempool_stats_t; -/* D0 Coalescing */ #define IPV4_ARP_FILTER 0x0001 #define IPV4_NETBT_FILTER 0x0002 #define IPV4_LLMNR_FILTER 0x0004 @@ -5032,7 +4832,6 @@ typedef struct wl_mempool_stats { #define IPV6_LLMNR_FILTER 0x0400 #define IPV6_SSDP_FILTER 0x0800 #define IPV6_WSD_FILTER 0x1000 - /* Network Offload Engine */ #define NWOE_OL_ENABLE 0x00000001 @@ -5042,103 +4841,4 @@ typedef struct { uint32 ipaddr_gateway; } nwoe_ifconfig_t; -/* - * Traffic management structures/defines. - */ - -/* Traffic management bandwidth parameters */ -#define TRF_MGMT_MAX_PRIORITIES 3 - -#define TRF_MGMT_FLAG_ADD_DSCP 0x0001 /* Add DSCP to IP TOS field */ -#define TRF_MGMT_FLAG_DISABLE_SHAPING 0x0002 /* Only support traffic clasification */ -#define TRF_MGMT_FLAG_DISABLE_PRIORITY_TAGGING 0x0004 /* Don't override packet's priority */ - -/* Traffic management priority classes */ -typedef enum trf_mgmt_priority_class { - trf_mgmt_priority_low = 0, /* Maps to 802.1p BO */ - trf_mgmt_priority_medium = 1, /* Maps to 802.1p BE */ - trf_mgmt_priority_high = 2, /* Maps to 802.1p VI */ - trf_mgmt_priority_invalid = (trf_mgmt_priority_high + 1) -} trf_mgmt_priority_class_t; - -/* Traffic management configuration parameters */ -typedef struct trf_mgmt_config { - uint32 trf_mgmt_enabled; /* 0 - disabled, 1 - enabled */ - uint32 flags; /* See TRF_MGMT_FLAG_xxx defines */ - uint32 host_ip_addr; /* My IP address to determine subnet */ - uint32 host_subnet_mask; /* My subnet mask */ - uint32 downlink_bandwidth; /* In units of kbps */ - uint32 uplink_bandwidth; /* In units of kbps */ - uint32 min_tx_bandwidth[TRF_MGMT_MAX_PRIORITIES]; /* Minimum guaranteed tx bandwidth */ - uint32 min_rx_bandwidth[TRF_MGMT_MAX_PRIORITIES]; /* Minimum guaranteed rx bandwidth */ -} trf_mgmt_config_t; - -/* Traffic management filter */ -typedef struct trf_mgmt_filter { - struct ether_addr dst_ether_addr; /* His L2 address */ - uint32 dst_ip_addr; /* His IP address */ - uint16 dst_port; /* His L4 port */ - uint16 src_port; /* My L4 port */ - uint16 prot; /* L4 protocol (only TCP or UDP) */ - uint16 flags; /* TBD. For now, this must be zero. */ - trf_mgmt_priority_class_t priority; /* Priority for filtered packets */ -} trf_mgmt_filter_t; - -/* Traffic management filter list (variable length) */ -typedef struct trf_mgmt_filter_list { - uint32 num_filters; - trf_mgmt_filter_t filter[1]; -} trf_mgmt_filter_list_t; - -/* Traffic management global info used for all queues */ -typedef struct trf_mgmt_global_info { - uint32 maximum_bytes_per_second; - uint32 maximum_bytes_per_sampling_period; - uint32 total_bytes_consumed_per_second; - uint32 total_bytes_consumed_per_sampling_period; - uint32 total_unused_bytes_per_sampling_period; -} trf_mgmt_global_info_t; - -/* Traffic management shaping info per priority queue */ -typedef struct trf_mgmt_shaping_info { - uint32 gauranteed_bandwidth_percentage; - uint32 guaranteed_bytes_per_second; - uint32 guaranteed_bytes_per_sampling_period; - uint32 num_bytes_produced_per_second; - uint32 num_bytes_consumed_per_second; - uint32 num_queued_packets; /* Number of packets in queue */ - uint32 num_queued_bytes; /* Number of bytes in queue */ -} trf_mgmt_shaping_info_t; - -/* Traffic management shaping info array */ -typedef struct trf_mgmt_shaping_info_array { - trf_mgmt_global_info_t tx_global_shaping_info; - trf_mgmt_shaping_info_t tx_queue_shaping_info[TRF_MGMT_MAX_PRIORITIES]; - trf_mgmt_global_info_t rx_global_shaping_info; - trf_mgmt_shaping_info_t rx_queue_shaping_info[TRF_MGMT_MAX_PRIORITIES]; -} trf_mgmt_shaping_info_array_t; - - -/* Traffic management statistical counters */ -typedef struct trf_mgmt_stats { - uint32 num_processed_packets; /* Number of packets processed */ - uint32 num_processed_bytes; /* Number of bytes processed */ - uint32 num_discarded_packets; /* Number of packets discarded from queue */ -} trf_mgmt_stats_t; - -/* Traffic management statisics array */ -typedef struct trf_mgmt_stats_array { - trf_mgmt_stats_t tx_queue_stats[TRF_MGMT_MAX_PRIORITIES]; - trf_mgmt_stats_t rx_queue_stats[TRF_MGMT_MAX_PRIORITIES]; -} trf_mgmt_stats_array_t; - -typedef struct powersel_params { - /* LPC Params exposed via IOVAR */ - int32 tp_ratio_thresh; /* Throughput ratio threshold */ - uint8 rate_stab_thresh; /* Thresh for rate stability based on nupd */ - uint8 pwr_stab_thresh; /* Number of successes before power step down */ - uint8 pwr_sel_exp_time; /* Time lapse for expiry of database */ -} powersel_params_t; - -#endif /* LINUX_POSTMOGRIFY_REMOVAL */ #endif /* _wlioctl_h_ */ diff --git a/drivers/net/wireless/bcmdhd/aiutils.c b/drivers/net/wireless/bcmdhd/src/shared/aiutils.c index 3ca1725..69faeac 100755..100644 --- a/drivers/net/wireless/bcmdhd/aiutils.c +++ b/drivers/net/wireless/bcmdhd/src/shared/aiutils.c @@ -2,14 +2,14 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: aiutils.c 347614 2012-07-27 10:24:51Z $ + * $Id: aiutils.c 300516 2011-12-04 17:39:44Z $ */ #include <bcm_cfg.h> #include <typedefs.h> @@ -87,7 +87,7 @@ get_asd(si_t *sih, uint32 **eromptr, uint sp, uint ad, uint st, uint32 *addrl, u if (((asd & ER_TAG1) != ER_ADD) || (((asd & AD_SP_MASK) >> AD_SP_SHIFT) != sp) || ((asd & AD_ST_MASK) != st)) { - + (*eromptr)--; return 0; } @@ -134,10 +134,10 @@ ai_scan(si_t *sih, void *regs, uint devid) break; case PCI_BUS: - + sii->curwrap = (void *)((uintptr)regs + SI_CORE_SIZE); - + OSL_PCI_WRITE_CONFIG(sii->osh, PCI_BAR0_WIN, 4, erombase); eromptr = regs; break; @@ -165,7 +165,7 @@ ai_scan(si_t *sih, void *regs, uint devid) br = FALSE; - + cia = get_erom_ent(sih, &eromptr, ER_TAG, ER_CI); if (cia == (ER_END | ER_VALID)) { SI_VMSG(("Found END of erom after %d cores\n", sii->numcores)); @@ -199,7 +199,7 @@ ai_scan(si_t *sih, void *regs, uint devid) if (((mfg == MFGID_ARM) && (cid == DEF_AI_COMP)) || (nsp == 0)) continue; if ((nmw + nsw == 0)) { - + if (cid == OOB_ROUTER_CORE_ID) { asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); @@ -228,34 +228,24 @@ ai_scan(si_t *sih, void *regs, uint devid) (mpd & MPD_MUI_MASK) >> MPD_MUI_SHIFT)); } - + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); if (asd == 0) { - do { - + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, &sizel, &sizeh); if (asd != 0) br = TRUE; - else { - if (br == TRUE) { - break; - } - else if ((addrh != 0) || (sizeh != 0) || - (sizel != SI_CORE_SIZE)) { - SI_ERROR(("addrh = 0x%x\t sizeh = 0x%x\t size1 =" - "0x%x\n", addrh, sizeh, sizel)); - SI_ERROR(("First Slave ASD for" - "core 0x%04x malformed " + else + if ((addrh != 0) || (sizeh != 0) || (sizel != SI_CORE_SIZE)) { + SI_ERROR(("First Slave ASD for core 0x%04x malformed " "(0x%08x)\n", cid, asd)); goto error; } } - } while (1); - } sii->coresba[idx] = addrl; sii->coresba_size[idx] = sizel; - + j = 1; do { asd = get_asd(sih, &eromptr, 0, j, AD_ST_SLAVE, &addrl, &addrh, @@ -267,7 +257,7 @@ ai_scan(si_t *sih, void *regs, uint devid) j++; } while (asd != 0); - + for (i = 1; i < nsp; i++) { j = 0; do { @@ -284,7 +274,7 @@ ai_scan(si_t *sih, void *regs, uint devid) } } - + for (i = 0; i < nmw; i++) { asd = get_asd(sih, &eromptr, i, 0, AD_ST_MWRAP, &addrl, &addrh, &sizel, &sizeh); @@ -300,7 +290,7 @@ ai_scan(si_t *sih, void *regs, uint devid) sii->wrapba[idx] = addrl; } - + for (i = 0; i < nsw; i++) { uint fwp = (nsp == 1) ? 0 : 1; asd = get_asd(sih, &eromptr, fwp + i, 0, AD_ST_SWRAP, &addrl, &addrh, @@ -318,11 +308,11 @@ ai_scan(si_t *sih, void *regs, uint devid) } - + if (br) continue; - + sii->numcores++; } @@ -347,12 +337,12 @@ ai_setcoreidx(si_t *sih, uint coreidx) addr = sii->coresba[coreidx]; wrap = sii->wrapba[coreidx]; - + ASSERT((sii->intrsenabled_fn == NULL) || !(*(sii)->intrsenabled_fn)((sii)->intr_arg)); switch (BUSTYPE(sih->bustype)) { case SI_BUS: - + if (!sii->regs[coreidx]) { sii->regs[coreidx] = REG_MAP(addr, SI_CORE_SIZE); ASSERT(GOODREGS(sii->regs[coreidx])); @@ -415,7 +405,7 @@ ai_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size) nmp = (cib & CIB_NMP_MASK) >> CIB_NMP_SHIFT; nsp = (cib & CIB_NSP_MASK) >> CIB_NSP_SHIFT; - + while (eromptr < eromlim) { if ((get_erom_ent(sih, &eromptr, ER_TAG, ER_CI) == cia) && (get_erom_ent(sih, &eromptr, 0, 0) == cib)) { @@ -423,14 +413,14 @@ ai_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size) } } - + for (i = 0; i < nmp; i++) get_erom_ent(sih, &eromptr, ER_VALID, ER_VALID); - + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); if (asd == 0) { - + asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, &sizel, &sizeh); } @@ -442,7 +432,7 @@ ai_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size) j++; } while (asd != 0); - + for (i = 1; i < nsp; i++) { j = 0; do { @@ -616,9 +606,9 @@ ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) return 0; if (BUSTYPE(sih->bustype) == SI_BUS) { - + fast = TRUE; - + if (!sii->regs[coreidx]) { sii->regs[coreidx] = REG_MAP(sii->coresba[coreidx], SI_CORE_SIZE); @@ -626,15 +616,15 @@ ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) } r = (uint32 *)((uchar *)sii->regs[coreidx] + regoff); } else if (BUSTYPE(sih->bustype) == PCI_BUS) { - + if ((sii->coreid[coreidx] == CC_CORE_ID) && SI_FAST(sii)) { - + fast = TRUE; r = (uint32 *)((char *)sii->curmap + PCI_16KB0_CCREGS_OFFSET + regoff); } else if (sii->pub.buscoreidx == coreidx) { - + fast = TRUE; if (SI_FAST(sii)) r = (uint32 *)((char *)sii->curmap + @@ -650,25 +640,25 @@ ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) if (!fast) { INTR_OFF(sii, intr_val); - + origidx = si_coreidx(&sii->pub); - + r = (uint32*) ((uchar*) ai_setcoreidx(&sii->pub, coreidx) + regoff); } ASSERT(r != NULL); - + if (mask || val) { w = (R_REG(sii->osh, r) & ~mask) | val; W_REG(sii->osh, r, w); } - + w = R_REG(sii->osh, r); if (!fast) { - + if (origidx != coreidx) ai_setcoreidx(&sii->pub, origidx); @@ -683,7 +673,6 @@ ai_core_disable(si_t *sih, uint32 bits) { si_info_t *sii; volatile uint32 dummy; - uint32 status; aidmp_t *ai; sii = SI_INFO(sih); @@ -691,22 +680,10 @@ ai_core_disable(si_t *sih, uint32 bits) ASSERT(GOODREGS(sii->curwrap)); ai = sii->curwrap; - + if (R_REG(sii->osh, &ai->resetctrl) & AIRC_RESET) return; - - SPINWAIT(((status = R_REG(sii->osh, &ai->resetstatus)) != 0), 300); - - - if (status != 0) { - - - SPINWAIT(((status = R_REG(sii->osh, &ai->resetstatus)) != 0), 10000); - - - } - W_REG(sii->osh, &ai->ioctrl, bits); dummy = R_REG(sii->osh, &ai->ioctrl); BCM_REFERENCE(dummy); @@ -730,10 +707,10 @@ ai_core_reset(si_t *sih, uint32 bits, uint32 resetbits) ASSERT(GOODREGS(sii->curwrap)); ai = sii->curwrap; - + ai_core_disable(sih, (bits | resetbits)); - + W_REG(sii->osh, &ai->ioctrl, (bits | SICF_FGC | SICF_CLOCK_EN)); dummy = R_REG(sii->osh, &ai->ioctrl); BCM_REFERENCE(dummy); diff --git a/drivers/net/wireless/bcmdhd/bcmevent.c b/drivers/net/wireless/bcmdhd/src/shared/bcmevent.c index e41c738..cc7ad16 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmevent.c +++ b/drivers/net/wireless/bcmdhd/src/shared/bcmevent.c @@ -1,14 +1,14 @@ /* * bcmevent read-only data shared by kernel or app layers * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,11 +16,11 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmevent.c 327460 2012-04-13 18:38:41Z $ + * $Id: bcmevent.c 300516 2011-12-04 17:39:44Z $ */ #include <typedefs.h> @@ -29,7 +29,7 @@ #include <proto/bcmeth.h> #include <proto/bcmevent.h> -#if WLC_E_LAST != 94 +#if WLC_E_LAST != 92 #error "You need to add an entry to bcmevent_names[] for the new event" #endif @@ -98,18 +98,6 @@ const bcmevent_name_t bcmevent_names[] = { { WLC_E_ACTION_FRAME_RX, "ACTION_FRAME_RX" }, { WLC_E_ACTION_FRAME_COMPLETE, "ACTION_FRAME_COMPLETE" }, #endif -#if 0 && (NDISVER >= 0x0620) - { WLC_E_PRE_ASSOC_IND, "ASSOC_RECV" }, - { WLC_E_PRE_REASSOC_IND, "REASSOC_RECV" }, - { WLC_E_CHANNEL_ADOPTED, "CHANNEL_ADOPTED" }, - { WLC_E_AP_STARTED, "AP_STARTED" }, - { WLC_E_DFS_AP_STOP, "DFS_AP_STOP" }, - { WLC_E_DFS_AP_RESUME, "DFS_AP_RESUME" }, - { WLC_E_ASSOC_IND_NDIS, "ASSOC_IND_NDIS"}, - { WLC_E_REASSOC_IND_NDIS, "REASSOC_IND_NDIS"}, - { WLC_E_ACTION_FRAME_RX_NDIS, "WLC_E_ACTION_FRAME_RX_NDIS" }, - { WLC_E_AUTH_REQ, "WLC_E_AUTH_REQ" }, -#endif #ifdef BCMWAPI_WAI { WLC_E_WAI_STA_EVENT, "WAI_STA_EVENT" }, { WLC_E_WAI_MSG, "WAI_MSG" }, @@ -139,10 +127,7 @@ const bcmevent_name_t bcmevent_names[] = { #endif { WLC_E_ASSOC_REQ_IE, "ASSOC_REQ_IE" }, { WLC_E_ASSOC_RESP_IE, "ASSOC_RESP_IE" }, - { WLC_E_ACTION_FRAME_RX_NDIS, "WLC_E_ACTION_FRAME_RX_NDIS" }, -#ifdef WLTDLS - { WLC_E_TDLS_PEER_EVENT, "TDLS_PEER_EVENT" }, -#endif /* WLTDLS */ + { WLC_E_ACTION_FRAME_RX_NDIS, "WLC_E_ACTION_FRAME_RX_NDIS" } }; const int bcmevent_names_size = ARRAYSIZE(bcmevent_names); diff --git a/drivers/net/wireless/bcmdhd/bcmutils.c b/drivers/net/wireless/bcmdhd/src/shared/bcmutils.c index 0646195..b709efd 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmutils.c +++ b/drivers/net/wireless/bcmdhd/src/shared/bcmutils.c @@ -1,14 +1,14 @@ /* * Driver O/S-independent utility routines * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,11 +16,11 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmutils.c 312855 2012-02-04 02:01:18Z $ + * $Id: bcmutils.c 306580 2012-01-06 14:28:35Z $ */ #include <bcm_cfg.h> @@ -56,9 +56,6 @@ void *_bcmutils_dummy_fn = NULL; #ifdef BCMDRIVER - - - /* copy a pkt buffer chain into a buffer */ uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf) @@ -120,8 +117,6 @@ pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf) return ret; } - - /* return total length of buffer chain */ uint BCMFASTPATH pkttotlen(osl_t *osh, void *p) @@ -1041,10 +1036,6 @@ bcm_mdelay(uint ms) } } - - - - #if defined(DHD_DEBUG) /* pretty hex print a pkt buffer chain */ void @@ -1058,7 +1049,7 @@ prpkt(const char *msg, osl_t *osh, void *p0) for (p = p0; p; p = PKTNEXT(osh, p)) prhex(NULL, PKTDATA(osh, p), PKTLEN(osh, p)); } -#endif +#endif /* Takes an Ethernet frame and sets out-of-bound PKTPRIO. * Also updates the inplace vlan tag if requested. @@ -1147,8 +1138,6 @@ bcmerrorstr(int bcmerror) return bcmerrorstrtable[-bcmerror]; } - - /* iovar table lookup */ const bcm_iovar_t* bcm_iovar_lookup(const bcm_iovar_t *table, const char *name) @@ -1451,8 +1440,8 @@ hndcrc32(uint8 *pdata, uint nbytes, uint32 crc) } #ifdef notdef -#define CLEN 1499 /* CRC Length */ -#define CBUFSIZ (CLEN+4) +#define CLEN 1499 /* CRC Length */ +#define CBUFSIZ (CLEN+4) #define CNBUFS 5 /* # of bufs */ void @@ -1648,7 +1637,7 @@ bcm_format_hex(char *str, const void *bytes, int len) } return (int)(p - str); } -#endif +#endif /* defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || ... */ /* pretty hex print a contiguous buffer */ void @@ -1695,17 +1684,10 @@ static const char *crypto_algo_names[] = { "AES_CCM", "AES_OCB_MSDU", "AES_OCB_MPDU", -#ifdef BCMCCX - "CKIP", - "CKIP_MMH", - "WEP_MMH", - "NALG" -#else "NALG" "UNDEF", "UNDEF", "UNDEF", -#endif /* BCMCCX */ #ifdef BCMWAPI_WPI "WAPI", #endif /* BCMWAPI_WPI */ @@ -1836,7 +1818,7 @@ bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint buflen) #define QDBM_TABLE_HIGH_BOUND 64938 /* High bound */ static const uint16 nqdBm_to_mW_map[QDBM_TABLE_LEN] = { -/* qdBm: +0 +1 +2 +3 +4 +5 +6 +7 */ +/* qdBm: +0 +1 +2 +3 +4 +5 +6 +7 */ /* 153: */ 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000, /* 161: */ 10593, 11220, 11885, 12589, 13335, 14125, 14962, 15849, /* 169: */ 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119, @@ -2040,7 +2022,7 @@ bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len) return (int)(p - buf); } -#endif +#endif /* defined(WLTINYDUMP) || defined(WLMSG_INFORM) || ... */ #endif /* BCMDRIVER */ diff --git a/drivers/net/wireless/bcmdhd/hndpmu.c b/drivers/net/wireless/bcmdhd/src/shared/hndpmu.c index eeee5ea..b33f1eb 100755..100644 --- a/drivers/net/wireless/bcmdhd/hndpmu.c +++ b/drivers/net/wireless/bcmdhd/src/shared/hndpmu.c @@ -2,14 +2,14 @@ * Misc utility routines for accessing PMU corerev specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndpmu.c 324060 2012-03-27 23:26:47Z $ + * $Id: hndpmu.c 306766 2012-01-09 00:57:57Z $ */ #include <bcm_cfg.h> diff --git a/drivers/net/wireless/bcmdhd/linux_osl.c b/drivers/net/wireless/bcmdhd/src/shared/linux_osl.c index ddb8372..9c9d9a1 100755..100644 --- a/drivers/net/wireless/bcmdhd/linux_osl.c +++ b/drivers/net/wireless/bcmdhd/src/shared/linux_osl.c @@ -2,13 +2,13 @@ * Linux OS Independent Layer * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.c 350283 2012-08-12 07:47:25Z $ + * $Id: linux_osl.c 309193 2012-01-19 00:03:57Z $ */ #define LINUX_PORT @@ -42,16 +42,18 @@ #include <linux/fs.h> -#define PCI_CFG_RETRY 10 +#define PCI_CFG_RETRY 10 -#define OS_HANDLE_MAGIC 0x1234abcd -#define BCM_MEM_FILENAME_LEN 24 +#define OS_HANDLE_MAGIC 0x1234abcd +#define BCM_MEM_FILENAME_LEN 24 #ifdef CONFIG_DHD_USE_STATIC_BUF +#ifdef CUSTOMER_HW_SAMSUNG #define DHD_SKB_HDRSIZE 336 #define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) #define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) #define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) +#endif /* CUSTOMER_HW_SAMSUNG */ #define STATIC_BUF_MAX_NUM 16 #define STATIC_BUF_SIZE (PAGE_SIZE*2) @@ -66,33 +68,30 @@ typedef struct bcm_static_buf { static bcm_static_buf_t *bcm_static_buf = 0; #define STATIC_PKT_MAX_NUM 8 -#if defined(ENHANCED_STATIC_BUF) -#define STATIC_PKT_4PAGE_NUM 1 -#define DHD_SKB_MAX_BUFSIZE DHD_SKB_4PAGE_BUFSIZE -#else -#define STATIC_PKT_4PAGE_NUM 0 -#define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE -#endif typedef struct bcm_static_pkt { struct sk_buff *skb_4k[STATIC_PKT_MAX_NUM]; struct sk_buff *skb_8k[STATIC_PKT_MAX_NUM]; -#ifdef ENHANCED_STATIC_BUF +#ifdef CUSTOMER_HW_SAMSUNG struct sk_buff *skb_16k; #endif struct semaphore osl_pkt_sem; - unsigned char pkt_use[STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM]; +#ifdef CUSTOMER_HW_SAMSUNG + unsigned char pkt_use[STATIC_PKT_MAX_NUM * 2 + 1]; +#else + unsigned char pkt_use[STATIC_PKT_MAX_NUM * 2]; +#endif } bcm_static_pkt_t; static bcm_static_pkt_t *bcm_static_skb = 0; -#endif +#endif /* CONFIG_DHD_USE_STATIC_BUF */ typedef struct bcm_mem_link { struct bcm_mem_link *prev; struct bcm_mem_link *next; uint size; int line; - void *osh; + void *osh; char file[BCM_MEM_FILENAME_LEN]; } bcm_mem_link_t; @@ -100,7 +99,7 @@ struct osl_info { osl_pubinfo_t pub; #ifdef CTFPOOL ctfpool_t *ctfpool; -#endif +#endif uint magic; void *pdev; atomic_t malloced; @@ -111,57 +110,52 @@ struct osl_info { spinlock_t pktalloc_lock; }; - - - uint32 g_assert_type = FALSE; static int16 linuxbcmerrormap[] = -{ 0, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -E2BIG, - -E2BIG, - -EBUSY, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EFAULT, - -ENOMEM, - -EOPNOTSUPP, - -EMSGSIZE, - -EINVAL, - -EPERM, - -ENOMEM, - -EINVAL, - -ERANGE, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EINVAL, - -EIO, - -ENODEV, - -EINVAL, - -EIO, - -EIO, - -ENODEV, - -EINVAL, - -ENODATA, - - +{ 0, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -E2BIG, + -E2BIG, + -EBUSY, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EFAULT, + -ENOMEM, + -EOPNOTSUPP, + -EMSGSIZE, + -EINVAL, + -EPERM, + -ENOMEM, + -EINVAL, + -ERANGE, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EINVAL, + -EIO, + -ENODEV, + -EINVAL, + -EIO, + -EIO, + -ENODEV, + -EINVAL, + -ENODATA, #if BCME_LAST != -42 #error "You need to add a OS error translation in the linuxbcmerrormap \ @@ -178,7 +172,6 @@ osl_error(int bcmerror) else if (bcmerror < BCME_LAST) bcmerror = BCME_ERROR; - return linuxbcmerrormap[-bcmerror]; } @@ -188,20 +181,12 @@ osl_t * osl_attach(void *pdev, uint bustype, bool pkttag) { osl_t *osh; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - osh = kmalloc(sizeof(osl_t), flags); -#else osh = kmalloc(sizeof(osl_t), GFP_ATOMIC); -#endif - ASSERT(osh); bzero(osh, sizeof(osl_t)); - ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(linuxbcmerrormap) - 1)); osh->magic = OS_HANDLE_MAGIC; @@ -252,14 +237,21 @@ osl_attach(void *pdev, uint bustype, bool pkttag) bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048); skb_buff_ptr = dhd_os_prealloc(osh, 4, 0); - bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *)* - (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM)); - for (i = 0; i < (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM); i++) +#ifdef CUSTOMER_HW_SAMSUNG + bcopy(skb_buff_ptr, bcm_static_skb, + sizeof(struct sk_buff *)*(STATIC_PKT_MAX_NUM * 2 + 1)); + for (i = 0; i < (STATIC_PKT_MAX_NUM * 2 + 1); i++) bcm_static_skb->pkt_use[i] = 0; +#else + bcopy(skb_buff_ptr, bcm_static_skb, + sizeof(struct sk_buff *)*16); + for (i = 0; i < STATIC_PKT_MAX_NUM * 2; i++) + bcm_static_skb->pkt_use[i] = 0; +#endif /* CUSTOMER_HW_SAMSUNG */ sema_init(&bcm_static_skb->osl_pkt_sem, 1); } -#endif +#endif /* CONFIG_DHD_USE_STATIC_BUF */ spin_lock_init(&(osh->pktalloc_lock)); @@ -288,7 +280,7 @@ osl_detach(osl_t *osh) static struct sk_buff *osl_alloc_skb(unsigned int len) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) - gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; + gfp_t flags = GFP_ATOMIC; return __dev_alloc_skb(len, flags); #else @@ -304,7 +296,7 @@ static struct sk_buff *osl_alloc_skb(unsigned int len) #else #define CTFPOOL_LOCK(ctfpool, flags) spin_lock_bh(&(ctfpool)->lock) #define CTFPOOL_UNLOCK(ctfpool, flags) spin_unlock_bh(&(ctfpool)->lock) -#endif +#endif void * osl_ctfpool_add(osl_t *osh) @@ -312,7 +304,7 @@ osl_ctfpool_add(osl_t *osh) struct sk_buff *skb; #ifdef CTFPOOL_SPINLOCK unsigned long flags; -#endif +#endif if ((osh == NULL) || (osh->ctfpool == NULL)) return NULL; @@ -320,13 +312,11 @@ osl_ctfpool_add(osl_t *osh) CTFPOOL_LOCK(osh->ctfpool, flags); ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj); - if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) { CTFPOOL_UNLOCK(osh->ctfpool, flags); return NULL; } - skb = osl_alloc_skb(osh->ctfpool->obj_size); if (skb == NULL) { printf("%s: skb alloc of len %d failed\n", __FUNCTION__, @@ -335,16 +325,13 @@ osl_ctfpool_add(osl_t *osh) return NULL; } - skb->next = (struct sk_buff *)osh->ctfpool->head; osh->ctfpool->head = skb; osh->ctfpool->fast_frees++; osh->ctfpool->curr_obj++; - CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool; - PKTFAST(osh, skb) = FASTBUF; CTFPOOL_UNLOCK(osh->ctfpool, flags); @@ -352,14 +339,12 @@ osl_ctfpool_add(osl_t *osh) return skb; } - void osl_ctfpool_replenish(osl_t *osh, uint thresh) { if ((osh == NULL) || (osh->ctfpool == NULL)) return; - while ((osh->ctfpool->refills > 0) && (thresh--)) { osl_ctfpool_add(osh); osh->ctfpool->refills--; @@ -370,14 +355,7 @@ osl_ctfpool_replenish(osl_t *osh, uint thresh) int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; - - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - osh->ctfpool = kmalloc(sizeof(ctfpool_t), flags); -#else osh->ctfpool = kmalloc(sizeof(ctfpool_t), GFP_ATOMIC); -#endif ASSERT(osh->ctfpool); bzero(osh->ctfpool, sizeof(ctfpool_t)); @@ -402,7 +380,7 @@ osl_ctfpool_cleanup(osl_t *osh) struct sk_buff *skb, *nskb; #ifdef CTFPOOL_SPINLOCK unsigned long flags; -#endif +#endif if ((osh == NULL) || (osh->ctfpool == NULL)) return; @@ -441,7 +419,7 @@ osl_ctfpool_stats(osl_t *osh, void *b) if (bcm_static_skb) { bcm_static_skb = 0; } -#endif +#endif bb = b; @@ -461,9 +439,8 @@ osl_pktfastget(osl_t *osh, uint len) struct sk_buff *skb; #ifdef CTFPOOL_SPINLOCK unsigned long flags; -#endif +#endif - if (osh->ctfpool == NULL) return NULL; @@ -477,7 +454,6 @@ osl_pktfastget(osl_t *osh, uint len) ASSERT(len <= osh->ctfpool->obj_size); - skb = (struct sk_buff *)osh->ctfpool->head; osh->ctfpool->head = (void *)skb->next; @@ -486,7 +462,6 @@ osl_pktfastget(osl_t *osh, uint len) ASSERT(CTFPOOLHEAD(osh, skb) == (struct sock *)osh->ctfpool->head); CTFPOOL_UNLOCK(osh->ctfpool, flags); - skb->next = skb->prev = NULL; skb->data = skb->head + 16; skb->tail = skb->head + 16; @@ -500,7 +475,7 @@ osl_pktfastget(osl_t *osh, uint len) return skb; } -#endif +#endif /* CTFPOOL */ struct sk_buff * BCMFASTPATH osl_pkt_tonative(osl_t *osh, void *pkt) @@ -514,13 +489,13 @@ osl_pkt_tonative(osl_t *osh, void *pkt) bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); #ifndef WL_UMK - for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { spin_lock_irqsave(&osh->pktalloc_lock, flags); osh->pub.pktalloced--; spin_unlock_irqrestore(&osh->pktalloc_lock, flags); } -#endif +#endif + return (struct sk_buff *)pkt; } @@ -537,13 +512,13 @@ osl_pkt_frmnative(osl_t *osh, void *pkt) bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); #ifndef WL_UMK - for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { spin_lock_irqsave(&osh->pktalloc_lock, flags); osh->pub.pktalloced++; spin_unlock_irqrestore(&osh->pktalloc_lock, flags); } -#endif +#endif + return (void *)pkt; } @@ -555,16 +530,14 @@ osl_pktget(osl_t *osh, uint len) unsigned long flags; #ifdef CTFPOOL - skb = osl_pktfastget(osh, len); if ((skb != NULL) || ((skb = osl_alloc_skb(len)) != NULL)) { -#else +#else if ((skb = osl_alloc_skb(len))) { -#endif +#endif skb_put(skb, len); skb->priority = 0; - spin_lock_irqsave(&osh->pktalloc_lock, flags); osh->pub.pktalloced++; spin_unlock_irqrestore(&osh->pktalloc_lock, flags); @@ -580,7 +553,7 @@ osl_pktfastfree(osl_t *osh, struct sk_buff *skb) ctfpool_t *ctfpool; #ifdef CTFPOOL_SPINLOCK unsigned long flags; -#endif +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) skb->tstamp.tv.sec = 0; @@ -588,7 +561,6 @@ osl_pktfastfree(osl_t *osh, struct sk_buff *skb) skb->stamp.tv_sec = 0; #endif - skb->dev = NULL; skb->dst = NULL; memset(skb->cb, 0, sizeof(skb->cb)); @@ -598,7 +570,6 @@ osl_pktfastfree(osl_t *osh, struct sk_buff *skb) ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); ASSERT(ctfpool != NULL); - CTFPOOL_LOCK(ctfpool, flags); skb->next = (struct sk_buff *)ctfpool->head; ctfpool->head = (void *)skb; @@ -609,8 +580,7 @@ osl_pktfastfree(osl_t *osh, struct sk_buff *skb) ASSERT(ctfpool->curr_obj <= ctfpool->max_obj); CTFPOOL_UNLOCK(ctfpool, flags); } -#endif - +#endif /* CTFPOOL */ void BCMFASTPATH osl_pktfree(osl_t *osh, void *p, bool send) @@ -625,26 +595,21 @@ osl_pktfree(osl_t *osh, void *p, bool send) PKTDBG_TRACE(osh, (void *) skb, PKTLIST_PKTFREE); - while (skb) { nskb = skb->next; skb->next = NULL; - - #ifdef CTFPOOL if ((PKTISFAST(osh, skb)) && (atomic_read(&skb->users) == 1)) osl_pktfastfree(osh, skb); else { -#else +#else { -#endif +#endif if (skb->destructor) - dev_kfree_skb_any(skb); else - dev_kfree_skb(skb); } spin_lock_irqsave(&osh->pktalloc_lock, flags); @@ -655,6 +620,7 @@ osl_pktfree(osl_t *osh, void *p, bool send) } #ifdef CONFIG_DHD_USE_STATIC_BUF +#ifdef CUSTOMER_HW_SAMSUNG void* osl_pktget_static(osl_t *osh, uint len) { @@ -662,7 +628,7 @@ osl_pktget_static(osl_t *osh, uint len) struct sk_buff *skb; - if (len > DHD_SKB_MAX_BUFSIZE) { + if (len > DHD_SKB_4PAGE_BUFSIZE) { printk("osl_pktget_static: Do we really need this big skb??" " len=%d\n", len); return osl_pktget(osh, len); @@ -678,12 +644,12 @@ osl_pktget_static(osl_t *osh, uint len) if (i != STATIC_PKT_MAX_NUM) { bcm_static_skb->pkt_use[i] = 1; + up(&bcm_static_skb->osl_pkt_sem); skb = bcm_static_skb->skb_4k[i]; skb->tail = skb->data + len; skb->len = len; - up(&bcm_static_skb->osl_pkt_sem); return skb; } } @@ -698,45 +664,91 @@ osl_pktget_static(osl_t *osh, uint len) if (i != STATIC_PKT_MAX_NUM) { bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 1; + up(&bcm_static_skb->osl_pkt_sem); skb = bcm_static_skb->skb_8k[i]; skb->tail = skb->data + len; skb->len = len; - up(&bcm_static_skb->osl_pkt_sem); return skb; } } -#if defined(ENHANCED_STATIC_BUF) if (bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] == 0) { bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] = 1; + up(&bcm_static_skb->osl_pkt_sem); skb = bcm_static_skb->skb_16k; skb->tail = skb->data + len; skb->len = len; - up(&bcm_static_skb->osl_pkt_sem); return skb; } -#endif up(&bcm_static_skb->osl_pkt_sem); printk("osl_pktget_static: all static pkt in use!\n"); return osl_pktget(osh, len); } +#else /* !CUSTOMER_HW_SAMSUNG */ + +void* +osl_pktget_static(osl_t *osh, uint len) +{ + int i = 0; + struct sk_buff *skb; + + if (len > (PAGE_SIZE*2)) { + printk("%s: attempt to allocate huge packet (0x%x)\n", __FUNCTION__, len); + return osl_pktget(osh, len); + } + + down(&bcm_static_skb->osl_pkt_sem); + + if (len <= PAGE_SIZE) { + for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { + if (bcm_static_skb->pkt_use[i] == 0) + break; + } + + if (i != STATIC_PKT_MAX_NUM) { + bcm_static_skb->pkt_use[i] = 1; + up(&bcm_static_skb->osl_pkt_sem); + skb = bcm_static_skb->skb_4k[i]; + skb->tail = skb->data + len; + skb->len = len; + return skb; + } + } + + + for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { + if (bcm_static_skb->pkt_use[i+STATIC_PKT_MAX_NUM] == 0) + break; + } + + if (i != STATIC_PKT_MAX_NUM) { + bcm_static_skb->pkt_use[i+STATIC_PKT_MAX_NUM] = 1; + up(&bcm_static_skb->osl_pkt_sem); + skb = bcm_static_skb->skb_8k[i]; + skb->tail = skb->data + len; + skb->len = len; + return skb; + } + + up(&bcm_static_skb->osl_pkt_sem); + printk("%s: all static pkt in use!\n", __FUNCTION__); + return osl_pktget(osh, len); +} +#endif /* CUSTOMER_HW_SAMSUNG */ + void osl_pktfree_static(osl_t *osh, void *p, bool send) { int i; - if (!bcm_static_skb) { - osl_pktfree(osh, p, send); - return; - } - down(&bcm_static_skb->osl_pkt_sem); for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { if (p == bcm_static_skb->skb_4k[i]) { + down(&bcm_static_skb->osl_pkt_sem); bcm_static_skb->pkt_use[i] = 0; up(&bcm_static_skb->osl_pkt_sem); return; @@ -745,24 +757,24 @@ osl_pktfree_static(osl_t *osh, void *p, bool send) for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { if (p == bcm_static_skb->skb_8k[i]) { + down(&bcm_static_skb->osl_pkt_sem); bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 0; up(&bcm_static_skb->osl_pkt_sem); return; } } -#ifdef ENHANCED_STATIC_BUF +#ifdef CUSTOMER_HW_SAMSUNG if (p == bcm_static_skb->skb_16k) { - bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM*2] = 0; + down(&bcm_static_skb->osl_pkt_sem); + bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] = 0; up(&bcm_static_skb->osl_pkt_sem); return; } #endif - up(&bcm_static_skb->osl_pkt_sem); - osl_pktfree(osh, p, send); - return; + return osl_pktfree(osh, p, send); } -#endif +#endif /* CONFIG_DHD_USE_STATIC_BUF */ uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size) @@ -771,8 +783,6 @@ osl_pci_read_config(osl_t *osh, uint offset, uint size) uint retry = PCI_CFG_RETRY; ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - ASSERT(size == 4); do { @@ -781,7 +791,6 @@ osl_pci_read_config(osl_t *osh, uint offset, uint size) break; } while (retry--); - return (val); } @@ -792,7 +801,6 @@ osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val) ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - ASSERT(size == 4); do { @@ -853,11 +861,7 @@ void * osl_malloc(osl_t *osh, uint size) { void *addr; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; -#endif - if (osh) ASSERT(osh->magic == OS_HANDLE_MAGIC); @@ -893,14 +897,9 @@ osl_malloc(osl_t *osh, uint size) } } original: -#endif +#endif /* CONFIG_DHD_USE_STATIC_BUF */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - if ((addr = kmalloc(size, flags)) == NULL) { -#else if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { -#endif if (osh) osh->failed++; return (NULL); @@ -935,7 +934,8 @@ osl_mfree(osl_t *osh, void *addr, uint size) return; } } -#endif +#endif /* CONFIG_DHD_USE_STATIC_BUF */ + if (osh) { ASSERT(osh->magic == OS_HANDLE_MAGIC); atomic_sub(size, &osh->malloced); @@ -1013,7 +1013,7 @@ osl_assert(const char *exp, const char *file, int line) const char *basename; basename = strrchr(file, '/'); - + if (basename) basename++; @@ -1025,11 +1025,11 @@ osl_assert(const char *exp, const char *file, int line) exp, basename, line); bcm_assert_log(tempbuf); -#endif +#endif } -#endif +#endif /* BCMASSERT_LOG */ void osl_delay(uint usec) @@ -1043,65 +1043,45 @@ osl_delay(uint usec) } } - - void * osl_pktdup(osl_t *osh, void *skb) { void * p; unsigned long irqflags; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; -#endif - PKTCTFMAP(osh, skb); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - if ((p = skb_clone((struct sk_buff *)skb, flags)) == NULL) -#else - if ((p = skb_clone((struct sk_buff*)skb, GFP_ATOMIC)) == NULL) -#endif + if ((p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) return NULL; #ifdef CTFPOOL if (PKTISFAST(osh, skb)) { ctfpool_t *ctfpool; - ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); ASSERT(ctfpool != NULL); PKTCLRFAST(osh, p); PKTCLRFAST(osh, skb); ctfpool->refills++; } -#endif +#endif - if (osh->pub.pkttag) bzero((void*)((struct sk_buff *)p)->cb, OSL_PKTTAG_SZ); - spin_lock_irqsave(&osh->pktalloc_lock, irqflags); osh->pub.pktalloced++; spin_unlock_irqrestore(&osh->pktalloc_lock, irqflags); return (p); } - - - - - - void * osl_os_open_image(char *filename) { struct file *fp; fp = filp_open(filename, O_RDONLY, 0); - + if (IS_ERR(fp)) fp = NULL; diff --git a/drivers/net/wireless/bcmdhd/sbutils.c b/drivers/net/wireless/bcmdhd/src/shared/sbutils.c index 68cfcb2..85c65f2 100755..100644 --- a/drivers/net/wireless/bcmdhd/sbutils.c +++ b/drivers/net/wireless/bcmdhd/src/shared/sbutils.c @@ -2,14 +2,14 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbutils.c 310902 2012-01-26 19:45:33Z $ + * $Id: sbutils.c 300516 2011-12-04 17:39:44Z $ */ #include <bcm_cfg.h> diff --git a/drivers/net/wireless/bcmdhd/siutils.c b/drivers/net/wireless/bcmdhd/src/shared/siutils.c index db108b8..0c8a9fe 100755..100644 --- a/drivers/net/wireless/bcmdhd/siutils.c +++ b/drivers/net/wireless/bcmdhd/src/shared/siutils.c @@ -2,14 +2,14 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils.c 347632 2012-07-27 11:00:35Z $ + * $Id: siutils.c 307724 2012-01-12 10:41:05Z $ */ #include <bcm_cfg.h> @@ -44,9 +44,6 @@ #include <sbsdpcmdev.h> #include <bcmsdpcm.h> #include <hndpmu.h> -#ifdef BCMSPI -#include <spid.h> -#endif /* BCMSPI */ #include "siutils_priv.h" @@ -58,7 +55,6 @@ static bool si_buscore_setup(si_info_t *sii, chipcregs_t *cc, uint bustype, uint uint *origidx, void *regs); - /* global variable to indicate reservation/release of gpio's */ static uint32 si_gpioreservation = 0; @@ -109,7 +105,7 @@ si_kattach(osl_t *osh) static bool ksii_attached = FALSE; if (!ksii_attached) { - void *regs = NULL; + void *regs; regs = REG_MAP(SI_ENUM_BASE, SI_CORE_SIZE); if (si_doattach(&ksii, BCM4710_DEVICE_ID, osh, regs, @@ -179,24 +175,6 @@ si_buscore_prep(si_info_t *sii, uint bustype, uint devid, void *sdh) bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL); } -#ifdef BCMSPI - /* Avoid backplane accesses before wake-wlan (i.e. htavail) for spi. - * F1 read accesses may return correct data but with data-not-available dstatus bit set. - */ - if (BUSTYPE(bustype) == SPI_BUS) { - - int err; - uint32 regdata; - /* wake up wlan function :WAKE_UP goes as HT_AVAIL request in hardware */ - regdata = bcmsdh_cfg_read_word(sdh, SDIO_FUNC_0, SPID_CONFIG, NULL); - SI_MSG(("F0 REG0 rd = 0x%x\n", regdata)); - regdata |= WAKE_UP; - - bcmsdh_cfg_write_word(sdh, SDIO_FUNC_0, SPID_CONFIG, regdata, &err); - - OSL_DELAY(100000); - } -#endif /* BCMSPI */ return TRUE; } @@ -297,7 +275,7 @@ si_buscore_setup(si_info_t *sii, chipcregs_t *cc, uint bustype, uint32 savewin, if (pcie_gen2) sii->pub.buscoretype = PCIE2_CORE_ID; else - sii->pub.buscoretype = PCIE_CORE_ID; + sii->pub.buscoretype = PCIE_CORE_ID; sii->pub.buscorerev = pcierev; sii->pub.buscoreidx = pcieidx; } @@ -1152,11 +1130,6 @@ si_watchdog_ms(si_t *sih, uint32 ms) si_watchdog(sih, wd_msticks * ms); } -uint32 si_watchdog_msticks(void) -{ - return wd_msticks; -} - bool si_taclear(si_t *sih, bool details) { @@ -1948,70 +1921,6 @@ done: return memsize; } - -/* Return the TCM-RAM size of the ARMCR4 core. */ -uint32 -si_tcm_size(si_t *sih) -{ - si_info_t *sii; - uint origidx; - uint intr_val = 0; - uint8 *regs; - bool wasup; - uint32 corecap; - uint memsize = 0; - uint32 nab = 0; - uint32 nbb = 0; - uint32 totb = 0; - uint32 bxinfo = 0; - uint32 idx = 0; - uint32 *arm_cap_reg; - uint32 *arm_bidx; - uint32 *arm_binfo; - - sii = SI_INFO(sih); - - /* Block ints and save current core */ - INTR_OFF(sii, intr_val); - origidx = si_coreidx(sih); - - /* Switch to CR4 core */ - if (!(regs = si_setcore(sih, ARMCR4_CORE_ID, 0))) - goto done; - - /* Get info for determining size. If in reset, come out of reset, - * but remain in halt - */ - if (!(wasup = si_iscoreup(sih))) - si_core_reset(sih, SICF_CPUHALT, SICF_CPUHALT); - - arm_cap_reg = (uint32 *)(regs + SI_CR4_CAP); - corecap = R_REG(sii->osh, arm_cap_reg); - - nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT; - nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT; - totb = nab + nbb; - - arm_bidx = (uint32 *)(regs + SI_CR4_BANKIDX); - arm_binfo = (uint32 *)(regs + SI_CR4_BANKINFO); - for (idx = 0; idx < totb; idx++) { - W_REG(sii->osh, arm_bidx, idx); - - bxinfo = R_REG(sii->osh, arm_binfo); - memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT; - } - - /* Return to previous state and core */ - if (!wasup) - si_core_disable(sih, 0); - si_setcoreidx(sih, origidx); - -done: - INTR_RESTORE(sii, intr_val); - - return memsize; -} - uint32 si_socram_srmem_size(si_t *sih) { @@ -2029,6 +1938,7 @@ si_socram_srmem_size(si_t *sih) return (32 * 1024); } + sii = SI_INFO(sih); /* Block ints and save current core */ @@ -2429,9 +2339,6 @@ si_is_sprom_available(si_t *sih) case BCM4324_CHIP_ID: return ((sih->chipst & CST4324_SPROM_MASK) && !(sih->chipst & CST4324_SFLASH_MASK)); - case BCM4335_CHIP_ID: - return ((sih->chipst & CST4335_SPROM_MASK) && - !(sih->chipst & CST4335_SFLASH_MASK)); case BCM43131_CHIP_ID: case BCM43217_CHIP_ID: case BCM43227_CHIP_ID: @@ -2442,46 +2349,3 @@ si_is_sprom_available(si_t *sih) return TRUE; } } - - -uint32 si_get_sromctl(si_t *sih) -{ - chipcregs_t *cc; - uint origidx; - uint32 sromctl; - osl_t *osh; - - osh = si_osh(sih); - origidx = si_coreidx(sih); - cc = si_setcoreidx(sih, SI_CC_IDX); - ASSERT((uintptr)cc); - - sromctl = R_REG(osh, &cc->sromcontrol); - - /* return to the original core */ - si_setcoreidx(sih, origidx); - return sromctl; -} - -int si_set_sromctl(si_t *sih, uint32 value) -{ - chipcregs_t *cc; - uint origidx; - osl_t *osh; - - osh = si_osh(sih); - origidx = si_coreidx(sih); - cc = si_setcoreidx(sih, SI_CC_IDX); - ASSERT((uintptr)cc); - - /* get chipcommon rev */ - if (si_corerev(sih) < 32) - return BCME_UNSUPPORTED; - - W_REG(osh, &cc->sromcontrol, value); - - /* return to the original core */ - si_setcoreidx(sih, origidx); - return BCME_OK; - -} diff --git a/drivers/net/wireless/bcmdhd/siutils_priv.h b/drivers/net/wireless/bcmdhd/src/shared/siutils_priv.h index 9a3270f..94b8eee 100755..100644 --- a/drivers/net/wireless/bcmdhd/siutils_priv.h +++ b/drivers/net/wireless/bcmdhd/src/shared/siutils_priv.h @@ -1,14 +1,14 @@ /* * Include file private to the SOC Interconnect support files. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils_priv.h 309193 2012-01-19 00:03:57Z $ + * $Id: siutils_priv.h 300516 2011-12-04 17:39:44Z $ */ #ifndef _siutils_priv_h_ @@ -66,7 +66,7 @@ typedef struct si_info { void *pch; /* PCI/E core handle */ - gpioh_item_t *gpioh_head; /* GPIO event handlers list */ + gpioh_item_t *gpioh_head; /* GPIO event handlers list */ bool memseg; /* flag to toggle MEM_SEG register */ diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_channels.h b/drivers/net/wireless/bcmdhd/src/wl/bcmwifi/include/bcmwifi_channels.h index c797047..b3384ef 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmwifi_channels.h +++ b/drivers/net/wireless/bcmdhd/src/wl/bcmwifi/include/bcmwifi_channels.h @@ -3,14 +3,14 @@ * This header file housing the define and function prototype use by * both the wl driver, tools & Apps. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -18,19 +18,17 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmwifi_channels.h 309193 2012-01-19 00:03:57Z $ + * $Id: bcmwifi.h 300516 2011-12-04 17:39:44Z $ */ #ifndef _bcmwifi_channels_h_ #define _bcmwifi_channels_h_ - - typedef uint16 chanspec_t; @@ -41,15 +39,11 @@ typedef uint16 chanspec_t; #define CH_40MHZ_APART 8 #define CH_20MHZ_APART 4 #define CH_10MHZ_APART 2 -#define CH_5MHZ_APART 1 -#define CH_MAX_2G_CHANNEL 14 -#define MAXCHANNEL 224 +#define CH_5MHZ_APART 1 +#define CH_MAX_2G_CHANNEL 14 +#define MAXCHANNEL 224 #define CHSPEC_CTLOVLP(sp1, sp2, sep) ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < (sep) - -#undef D11AC_IOTYPES -#define D11AC_IOTYPES - #ifndef D11AC_IOTYPES #define WL_CHANSPEC_CHAN_MASK 0x00ff @@ -71,8 +65,7 @@ typedef uint16 chanspec_t; #define WL_CHANSPEC_BAND_SHIFT 12 #define WL_CHANSPEC_BAND_5G 0x1000 #define WL_CHANSPEC_BAND_2G 0x2000 -#define INVCHANSPEC 255 - +#define INVCHANSPEC 255 #define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0) #define UPPER_20_SB(channel) (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \ @@ -102,7 +95,7 @@ typedef uint16 chanspec_t; #define CHSPEC_IS40(chspec) 0 #endif -#else +#else #define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) #define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) @@ -110,7 +103,7 @@ typedef uint16 chanspec_t; #define CHSPEC_IS40(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40) #endif -#endif +#endif /* WL11N_20MHZONLY */ #define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) #define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) @@ -124,7 +117,7 @@ typedef uint16 chanspec_t; #define CHANSPEC_STR_LEN 8 -#else +#else #define WL_CHANSPEC_CHAN_MASK 0x00ff #define WL_CHANSPEC_CHAN_SHIFT 0 @@ -149,7 +142,7 @@ typedef uint16 chanspec_t; #define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU #define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL #define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL +#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL #define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU #define WL_CHANSPEC_BW_MASK 0x3800 @@ -168,8 +161,7 @@ typedef uint16 chanspec_t; #define WL_CHANSPEC_BAND_3G 0x4000 #define WL_CHANSPEC_BAND_4G 0x8000 #define WL_CHANSPEC_BAND_5G 0xc000 -#define INVCHANSPEC 255 - +#define INVCHANSPEC 255 #define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? \ ((channel) - CH_10MHZ_APART) : 0) @@ -219,7 +211,7 @@ typedef uint16 chanspec_t; #define CHSPEC_IS8080(chspec) 0 #endif -#else +#else #define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) #define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) @@ -236,7 +228,7 @@ typedef uint16 chanspec_t; #define CHSPEC_IS8080(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_8080) #endif -#endif +#endif /* WL11N_20MHZONLY */ #define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) #define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) @@ -251,8 +243,6 @@ typedef uint16 chanspec_t; #define CHANSPEC_STR_LEN 20 - - #define WL_LCHANSPEC_CHAN_MASK 0x00ff #define WL_LCHANSPEC_CHAN_SHIFT 0 @@ -285,35 +275,28 @@ typedef uint16 chanspec_t; #define LCHSPEC_CREATE(chan, band, bw, sb) ((uint16)((chan) | (sb) | (bw) | (band))) -#endif - - - - -#define WF_CHAN_FACTOR_2_4_G 4814 - - -#define WF_CHAN_FACTOR_5_G 10000 - +#endif /* D11AC_IOTYPES */ -#define WF_CHAN_FACTOR_4_G 8000 +#define WF_CHAN_FACTOR_2_4_G 4814 +#define WF_CHAN_FACTOR_5_G 10000 +#define WF_CHAN_FACTOR_4_G 8000 -#define WLC_MAXRATE 108 -#define WLC_RATE_1M 2 -#define WLC_RATE_2M 4 -#define WLC_RATE_5M5 11 -#define WLC_RATE_11M 22 -#define WLC_RATE_6M 12 -#define WLC_RATE_9M 18 -#define WLC_RATE_12M 24 -#define WLC_RATE_18M 36 -#define WLC_RATE_24M 48 -#define WLC_RATE_36M 72 -#define WLC_RATE_48M 96 -#define WLC_RATE_54M 108 +#define WLC_MAXRATE 108 +#define WLC_RATE_1M 2 +#define WLC_RATE_2M 4 +#define WLC_RATE_5M5 11 +#define WLC_RATE_11M 22 +#define WLC_RATE_6M 12 +#define WLC_RATE_9M 18 +#define WLC_RATE_12M 24 +#define WLC_RATE_18M 36 +#define WLC_RATE_24M 48 +#define WLC_RATE_36M 72 +#define WLC_RATE_48M 96 +#define WLC_RATE_54M 108 -#define WLC_2G_25MHZ_OFFSET 5 +#define WLC_2G_25MHZ_OFFSET 5 extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf); @@ -342,4 +325,4 @@ extern int wf_mhz2channel(uint freq, uint start_factor); extern int wf_channel2mhz(uint channel, uint start_factor); -#endif +#endif /* _bcmwifi_h_ */ diff --git a/drivers/net/wireless/bcmdhd/bcmwifi_channels.c b/drivers/net/wireless/bcmdhd/src/wl/bcmwifi/src/bcmwifi_channels.c index 0a570f6..629f0c9 100755..100644 --- a/drivers/net/wireless/bcmdhd/bcmwifi_channels.c +++ b/drivers/net/wireless/bcmdhd/src/wl/bcmwifi/src/bcmwifi_channels.c @@ -3,14 +3,14 @@ * Contents are wifi-specific, used by any kernel or app-level * software that might want wifi things as it grows. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -18,11 +18,11 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmwifi_channels.c 309193 2012-01-19 00:03:57Z $ + * $Id: bcmwifi.c 300516 2011-12-04 17:39:44Z $ */ #include <bcm_cfg.h> @@ -40,27 +40,18 @@ #ifndef ASSERT #define ASSERT(exp) #endif -#endif - +#endif /* BCMDRIVER */ #ifdef _bcmwifi_c_ - #include <bcmwifi.h> #else #include <bcmwifi_channels.h> #endif #if defined(WIN32) && (defined(BCMDLL) || defined(WLMDLL)) -#include <bcmstdlib.h> +#include <bcmstdlib.h> #endif #ifndef D11AC_IOTYPES - - - - - - - char * wf_chspec_ntoa(chanspec_t chspec, char *buf) { @@ -71,7 +62,7 @@ wf_chspec_ntoa(chanspec_t chspec, char *buf) bw = ""; sb = ""; channel = CHSPEC_CHANNEL(chspec); - + if ((CHSPEC_IS2G(chspec) && channel > CH_MAX_2G_CHANNEL) || (CHSPEC_IS5G(chspec) && channel <= CH_MAX_2G_CHANNEL)) band = (CHSPEC_IS2G(chspec)) ? "b" : "a"; @@ -87,7 +78,7 @@ wf_chspec_ntoa(chanspec_t chspec, char *buf) bw = "n"; } - + snprintf(buf, 6, "%d%s%s%s", channel, band, bw, sb); return (buf); } @@ -102,7 +93,7 @@ wf_chspec_aton(const char *a) channel = strtoul(a, &endp, 10); - + if (endp == a) return 0; @@ -119,7 +110,7 @@ wf_chspec_aton(const char *a) if (c == '\0') goto done; - + if (c == 'a' || c == 'b') { band = (c == 'a') ? WL_CHANSPEC_BAND_5G : WL_CHANSPEC_BAND_2G; a++; @@ -128,13 +119,13 @@ wf_chspec_aton(const char *a) goto done; } - + if (c == 'n') { bw = WL_CHANSPEC_BW_10; } else if (c == 'l') { bw = WL_CHANSPEC_BW_40; ctl_sb = WL_CHANSPEC_CTL_SB_LOWER; - + if (channel <= (MAXCHANNEL - CH_20MHZ_APART)) channel += CH_10MHZ_APART; else @@ -142,7 +133,7 @@ wf_chspec_aton(const char *a) } else if (c == 'u') { bw = WL_CHANSPEC_BW_40; ctl_sb = WL_CHANSPEC_CTL_SB_UPPER; - + if (channel > CH_20MHZ_APART) channel -= CH_10MHZ_APART; else @@ -159,14 +150,14 @@ done: bool wf_chspec_malformed(chanspec_t chanspec) { - + if (!CHSPEC_IS5G(chanspec) && !CHSPEC_IS2G(chanspec)) return TRUE; - + if (!CHSPEC_IS40(chanspec) && !CHSPEC_IS20(chanspec)) return TRUE; - + if (CHSPEC_IS20(chanspec)) { if (!CHSPEC_SB_NONE(chanspec)) return TRUE; @@ -184,19 +175,19 @@ wf_chspec_ctlchan(chanspec_t chspec) { uint8 ctl_chan; - + if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) { return CHSPEC_CHANNEL(chspec); } else { - + ASSERT(CHSPEC_BW(chspec) == WL_CHANSPEC_BW_40); - + if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_UPPER) { - + ctl_chan = UPPER_20_SB(CHSPEC_CHANNEL(chspec)); } else { ASSERT(CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_LOWER); - + ctl_chan = LOWER_20_SB(CHSPEC_CHANNEL(chspec)); } } @@ -212,7 +203,7 @@ wf_chspec_ctlchspec(chanspec_t chspec) ASSERT(!wf_chspec_malformed(chspec)); - + if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) { return chspec; } else { @@ -227,12 +218,7 @@ wf_chspec_ctlchspec(chanspec_t chspec) return ctl_chspec; } -#else - - - - - +#else static const char *wf_chspec_bw_str[] = { @@ -270,8 +256,6 @@ static const uint8 wf_5g_160m_chans[] = #define WF_NUM_5G_160M_CHANS \ (sizeof(wf_5g_160m_chans)/sizeof(uint8)) - - static uint bw_chspec_to_mhz(chanspec_t chspec) { @@ -285,7 +269,7 @@ bw_chspec_to_mhz(chanspec_t chspec) static uint8 center_chan_to_edge(uint bw) { - + return (uint8)(((bw - 20) / 2) / 5); } @@ -304,15 +288,15 @@ channel_to_sb(uint center_ch, uint ctl_ch, uint bw) uint sb; if ((ctl_ch - lowest) % 4) { - + return -1; } sb = ((ctl_ch - lowest) / 4); - + if (sb >= (bw / 20)) { - + return -1; } @@ -351,15 +335,15 @@ wf_chspec_ntoa(chanspec_t chspec, char *buf) band = ""; - + if ((CHSPEC_IS2G(chspec) && CHSPEC_CHANNEL(chspec) > CH_MAX_2G_CHANNEL) || (CHSPEC_IS5G(chspec) && CHSPEC_CHANNEL(chspec) <= CH_MAX_2G_CHANNEL)) band = (CHSPEC_IS2G(chspec)) ? "2g" : "5g"; - + ctl_chan = wf_chspec_ctlchan(chspec); - + if (CHSPEC_IS20(chspec)) { snprintf(buf, CHANSPEC_STR_LEN, "%s%d", band, ctl_chan); } else if (!CHSPEC_IS8080(chspec)) { @@ -369,32 +353,32 @@ wf_chspec_ntoa(chanspec_t chspec, char *buf) bw = wf_chspec_bw_str[(chspec & WL_CHANSPEC_BW_MASK) >> WL_CHANSPEC_BW_SHIFT]; #ifdef CHANSPEC_NEW_40MHZ_FORMAT - + if (CHSPEC_IS40(chspec) && CHSPEC_IS2G(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; } snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s%s", band, ctl_chan, bw, sb); #else - + if (CHSPEC_IS40(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; snprintf(buf, CHANSPEC_STR_LEN, "%s%d%s", band, ctl_chan, sb); } else { snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s", band, ctl_chan, bw); } -#endif +#endif } else { - + uint chan1 = (chspec & WL_CHANSPEC_CHAN1_MASK) >> WL_CHANSPEC_CHAN1_SHIFT; uint chan2 = (chspec & WL_CHANSPEC_CHAN2_MASK) >> WL_CHANSPEC_CHAN2_SHIFT; - + chan1 = (chan1 < WF_NUM_5G_80M_CHANS) ? wf_5g_80m_chans[chan1] : 0; chan2 = (chan2 < WF_NUM_5G_80M_CHANS) ? wf_5g_80m_chans[chan2] : 0; - + snprintf(buf, CHANSPEC_STR_LEN, "%d/80+80/%d-%d", ctl_chan, chan1, chan2); } @@ -408,13 +392,13 @@ read_uint(const char **p, unsigned int *num) char *endp = NULL; val = strtoul(*p, &endp, 10); - + if (endp == *p) return 0; - + *p = endp; - + *num = (unsigned int)val; return 1; @@ -435,16 +419,16 @@ wf_chspec_aton(const char *a) chspec_sb = 0; chspec_ch = ch1 = ch2 = 0; - + if (!read_uint(&a, &num)) return 0; - + c = tolower(a[0]); if (c == 'g') { - a ++; + a ++; + - if (num == 2) chspec_band = WL_CHANSPEC_BAND_2G; else if (num == 5) @@ -452,43 +436,43 @@ wf_chspec_aton(const char *a) else return 0; - + if (!read_uint(&a, &ctl_ch)) return 0; c = tolower(a[0]); } else { - + ctl_ch = num; chspec_band = ((ctl_ch <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); } if (c == '\0') { - + chspec_bw = WL_CHANSPEC_BW_20; goto done_read; } - a ++; + a ++; + - if (c == 'u' || c == 'l') { sb_ul = c; chspec_bw = WL_CHANSPEC_BW_40; goto done_read; } - + if (c != '/') return 0; - + if (!read_uint(&a, &bw)) return 0; - + if (bw == 20) { chspec_bw = WL_CHANSPEC_BW_20; } else if (bw == 40) { @@ -501,63 +485,51 @@ wf_chspec_aton(const char *a) return 0; } - - c = tolower(a[0]); - if (chspec_band == WL_CHANSPEC_BAND_2G && bw == 40) { if (c == 'u' || c == 'l') { - a ++; + a ++; sb_ul = c; goto done_read; } } - if (c == '+') { - static const char *plus80 = "80/"; - + chspec_bw = WL_CHANSPEC_BW_8080; - a ++; + a ++; + - for (i = 0; i < 3; i++) { if (*a++ != *plus80++) { return 0; } } - if (!read_uint(&a, &ch1)) return 0; - if (a[0] != '-') return 0; - a ++; + a ++; - if (!read_uint(&a, &ch2)) return 0; } done_read: - + while (a[0] == ' ') { a ++; } - if (a[0] != '\0') return 0; - - - if (sb_ul != '\0') { if (sb_ul == 'l') { chspec_ch = UPPER_20_SB(ctl_ch); @@ -567,14 +539,14 @@ done_read: chspec_sb = WL_CHANSPEC_CTL_SB_LLU; } } - + else if (chspec_bw == WL_CHANSPEC_BW_20) { chspec_ch = ctl_ch; chspec_sb = 0; } - + else if (chspec_bw != WL_CHANSPEC_BW_8080) { - + const uint8 *center_ch = NULL; int num_ch = 0; int sb = -1; @@ -601,12 +573,12 @@ done_read: } } - + if (sb < 0) { return 0; } } - + else { int ch1_id = 0, ch2_id = 0; int sb; @@ -614,26 +586,22 @@ done_read: ch1_id = channel_80mhz_to_id(ch1); ch2_id = channel_80mhz_to_id(ch2); - + if (ch1 >= ch2 || ch1_id < 0 || ch2_id < 0) return 0; - chspec_ch = (((uint16)ch1_id << WL_CHANSPEC_CHAN1_SHIFT) | ((uint16)ch2_id << WL_CHANSPEC_CHAN2_SHIFT)); - - - sb = channel_to_sb(ch1, ctl_ch, bw); if (sb < 0) { - + sb = channel_to_sb(ch2, ctl_ch, bw); if (sb < 0) { - + return 0; } - + sb += 4; } @@ -655,9 +623,9 @@ wf_chspec_malformed(chanspec_t chanspec) uint chspec_bw = CHSPEC_BW(chanspec); uint chspec_ch = CHSPEC_CHANNEL(chanspec); - + if (CHSPEC_IS2G(chanspec)) { - + if (chspec_bw != WL_CHANSPEC_BW_20 && chspec_bw != WL_CHANSPEC_BW_40) { return TRUE; @@ -666,13 +634,13 @@ wf_chspec_malformed(chanspec_t chanspec) if (chspec_bw == WL_CHANSPEC_BW_8080) { uint ch1_id, ch2_id; - + ch1_id = CHSPEC_CHAN1(chanspec); ch2_id = CHSPEC_CHAN2(chanspec); if (ch1_id >= WF_NUM_5G_80M_CHANS || ch2_id >= WF_NUM_5G_80M_CHANS) return TRUE; - + if (ch2_id <= ch1_id) return TRUE; } else if (chspec_bw == WL_CHANSPEC_BW_20 || chspec_bw == WL_CHANSPEC_BW_40 || @@ -682,15 +650,15 @@ wf_chspec_malformed(chanspec_t chanspec) return TRUE; } } else { - + return TRUE; } } else { - + return TRUE; } - + if (chspec_bw == WL_CHANSPEC_BW_20) { if (CHSPEC_CTL_SB(chanspec) != WL_CHANSPEC_CTL_SB_LLL) return TRUE; @@ -716,7 +684,7 @@ wf_chspec_valid(chanspec_t chanspec) return FALSE; if (CHSPEC_IS2G(chanspec)) { - + if (chspec_bw == WL_CHANSPEC_BW_20) { if (chspec_ch >= 1 && chspec_ch <= 14) return TRUE; @@ -731,7 +699,7 @@ wf_chspec_valid(chanspec_t chanspec) ch1 = wf_5g_80m_chans[CHSPEC_CHAN1(chanspec)]; ch2 = wf_5g_80m_chans[CHSPEC_CHAN2(chanspec)]; - + if (ch2 > ch1 + CH_80MHZ_APART) return TRUE; } else { @@ -748,35 +716,34 @@ wf_chspec_valid(chanspec_t chanspec) center_ch = wf_5g_160m_chans; num_ch = WF_NUM_5G_160M_CHANS; } else { - + return FALSE; } - + if (chspec_bw == WL_CHANSPEC_BW_20) { - + for (i = 0; i < num_ch; i ++) { if (chspec_ch == (uint)LOWER_20_SB(center_ch[i]) || chspec_ch == (uint)UPPER_20_SB(center_ch[i])) - break; + break; } if (i == num_ch) { - + if (chspec_ch == 34 || chspec_ch == 38 || chspec_ch == 42 || chspec_ch == 46) i = 0; } } else { - + for (i = 0; i < num_ch; i ++) { if (chspec_ch == center_ch[i]) - break; + break; } } if (i < num_ch) { - return TRUE; } } @@ -795,7 +762,7 @@ wf_chspec_ctlchan(chanspec_t chspec) ASSERT(!wf_chspec_malformed(chspec)); - + if (CHSPEC_IS20(chspec)) { return CHSPEC_CHANNEL(chspec); } else { @@ -812,7 +779,7 @@ wf_chspec_ctlchan(chanspec_t chspec) sb -= 4; } - + center_chan = wf_5g_80m_chans[center_chan]; } else { @@ -833,7 +800,7 @@ wf_chspec_ctlchspec(chanspec_t chspec) ASSERT(!wf_chspec_malformed(chspec)); - + if (!CHSPEC_IS20(chspec)) { ctl_chan = wf_chspec_ctlchan(chspec); ctl_chspec = ctl_chan | WL_CHANSPEC_BW_20; @@ -842,9 +809,9 @@ wf_chspec_ctlchspec(chanspec_t chspec) return ctl_chspec; } -#endif - +#endif /* D11AC_IOTYPES */ +#ifdef D11AC_IOTYPES extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec) { chanspec_t chspec40 = chspec; @@ -858,27 +825,25 @@ extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec) sb = CHSPEC_CTL_SB(chspec); if (sb == WL_CHANSPEC_CTL_SB_UL) { - + sb = WL_CHANSPEC_CTL_SB_L; center_chan += CH_20MHZ_APART; } else if (sb == WL_CHANSPEC_CTL_SB_UU) { - + sb = WL_CHANSPEC_CTL_SB_U; center_chan += CH_20MHZ_APART; } else { - - center_chan -= CH_20MHZ_APART; } - + chspec40 = (WL_CHANSPEC_BAND_5G | WL_CHANSPEC_BW_40 | sb | center_chan); } return chspec40; } - +#endif /* D11AC_IOTYPES */ int wf_mhz2channel(uint freq, uint start_factor) @@ -887,7 +852,7 @@ wf_mhz2channel(uint freq, uint start_factor) uint base; int offset; - + if (start_factor == 0) { if (freq >= 2400 && freq <= 2500) start_factor = WF_CHAN_FACTOR_2_4_G; @@ -900,18 +865,18 @@ wf_mhz2channel(uint freq, uint start_factor) base = start_factor / 2; - + if ((freq < base) || (freq > base + 1000)) return -1; offset = freq - base; ch = offset / 5; - + if (offset != (ch * 5)) return -1; - + if (start_factor == WF_CHAN_FACTOR_2_4_G && (ch < 1 || ch > 13)) return -1; diff --git a/drivers/net/wireless/bcmdhd/uamp_api.h b/drivers/net/wireless/bcmdhd/src/wl/sys/uamp_api.h index 673dce0..ff4da83 100755..100644 --- a/drivers/net/wireless/bcmdhd/uamp_api.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/uamp_api.h @@ -3,14 +3,14 @@ * * Description: Universal AMP API * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -18,7 +18,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.c index c0c5c35..7f1b86c 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.c @@ -2,13 +2,13 @@ * Linux cfg80211 driver - Android related functions * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_android.c 354184 2012-08-30 08:08:08Z $ + * $Id: wl_android.c 309571 2012-01-20 01:45:10Z $ */ #include <linux/module.h> @@ -67,33 +67,23 @@ #define CMD_BTCOEXSCAN_STOP "BTCOEXSCAN-STOP" #define CMD_BTCOEXMODE "BTCOEXMODE" #define CMD_SETSUSPENDOPT "SETSUSPENDOPT" -#define CMD_SETSUSPENDMODE "SETSUSPENDMODE" #define CMD_P2P_DEV_ADDR "P2P_DEV_ADDR" #define CMD_SETFWPATH "SETFWPATH" #define CMD_SETBAND "SETBAND" #define CMD_GETBAND "GETBAND" #define CMD_COUNTRY "COUNTRY" #define CMD_P2P_SET_NOA "P2P_SET_NOA" -#if !defined WL_ENABLE_P2P_IF #define CMD_P2P_GET_NOA "P2P_GET_NOA" -#endif #define CMD_P2P_SET_PS "P2P_SET_PS" -#define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" +#define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" + -#if defined(SUPPORT_HIDDEN_AP) /* Hostapd private command */ +#define CMD_SET_HAPD_AUTO_CHANNEL "HAPD_AUTO_CHANNEL" #define CMD_SET_HAPD_MAX_NUM_STA "HAPD_MAX_NUM_STA" #define CMD_SET_HAPD_SSID "HAPD_SSID" #define CMD_SET_HAPD_HIDE_SSID "HAPD_HIDE_SSID" -#endif -#if defined(SUPPORT_AUTO_CHANNEL) -#define CMD_SET_HAPD_AUTO_CHANNEL "HAPD_AUTO_CHANNEL" -#endif -#if defined(SUPPORT_SOFTAP_SINGL_DISASSOC) #define CMD_HAPD_STA_DISASSOC "HAPD_STA_DISASSOC" -#endif - -/* CCX Private Commands */ #ifdef BCMCCX #define CMD_GETCCKM_RN "get cckm_rn" #define CMD_SETCCKM_KRK "set cckm_krk" @@ -108,7 +98,7 @@ #define PNO_TLV_PREFIX 'S' #define PNO_TLV_VERSION '1' -#define PNO_TLV_SUBVERSION '2' +#define PNO_TLV_SUBVERSION '2' #define PNO_TLV_RESERVED '0' #define PNO_TLV_TYPE_SSID_IE 'S' #define PNO_TLV_TYPE_TIME 'T' @@ -123,76 +113,30 @@ typedef struct cmd_tlv { } cmd_tlv_t; #endif /* PNO_SUPPORT */ +#ifdef ROAM_API +#define CMD_ROAMTRIGGER_SET "SETROAMTRIGGER" +#define CMD_ROAMTRIGGER_GET "GETROAMTRIGGER" +#define CMD_ROAMDELTA_SET "SETROAMDELTA" +#define CMD_ROAMDELTA_GET "GETROAMDELTA" +#define CMD_ROAMSCANPERIOD_SET "SETROAMSCANPERIOD" +#define CMD_ROAMSCANPERIOD_GET "GETROAMSCANPERIOD" +#define CMD_COUNTRYREV_SET "SETCOUNTRYREV" +#define CMD_COUNTRYREV_GET "GETCOUNTRYREV" +#endif /* ROAM_API */ + #ifdef OKC_SUPPORT #define CMD_OKC_SET_PMK "SET_PMK" #define CMD_OKC_ENABLE "OKC_ENABLE" #endif -#ifdef ROAM_API -#define CMD_ROAMTRIGGER_SET "SETROAMTRIGGER" -#define CMD_ROAMTRIGGER_GET "GETROAMTRIGGER" -#define CMD_ROAMDELTA_SET "SETROAMDELTA" -#define CMD_ROAMDELTA_GET "GETROAMDELTA" -#define CMD_ROAMSCANPERIOD_SET "SETROAMSCANPERIOD" -#define CMD_ROAMSCANPERIOD_GET "GETROAMSCANPERIOD" -#define CMD_FULLROAMSCANPERIOD_SET "SETFULLROAMSCANPERIOD" -#define CMD_FULLROAMSCANPERIOD_GET "GETFULLROAMSCANPERIOD" -#define CMD_COUNTRYREV_SET "SETCOUNTRYREV" -#define CMD_COUNTRYREV_GET "GETCOUNTRYREV" -#endif /* ROAM_API */ - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -#define CMD_GETROAMSCANCONTROL "GETROAMSCANCONTROL" -#define CMD_SETROAMSCANCONTROL "SETROAMSCANCONTROL" -#define CMD_GETROAMSCANCHANNELS "GETROAMSCANCHANNELS" -#define CMD_SETROAMSCANCHANNELS "SETROAMSCANCHANNELS" - -#define CMD_GETSCANCHANNELTIME "GETSCANCHANNELTIME" -#define CMD_SETSCANCHANNELTIME "SETSCANCHANNELTIME" -#define CMD_GETSCANHOMETIME "GETSCANHOMETIME" -#define CMD_SETSCANHOMETIME "SETSCANHOMETIME" -#define CMD_GETSCANHOMEAWAYTIME "GETSCANHOMEAWAYTIME" -#define CMD_SETSCANHOMEAWAYTIME "SETSCANHOMEAWAYTIME" -#define CMD_GETSCANNPROBES "GETSCANNPROBES" -#define CMD_SETSCANNPROBES "SETSCANNPROBES" - -#define CMD_SENDACTIONFRAME "SENDACTIONFRAME" -#define CMD_REASSOC "REASSOC" - -#define CMD_GETWESMODE "GETWESMODE" -#define CMD_SETWESMODE "SETWESMODE" - -#define CMD_GETOKCMODE "GETOKCMODE" -#define CMD_SETOKCMODE "SETOKCMODE" - -#define ANDROID_WIFI_MAX_ROAM_SCAN_CHANNELS 100 - -typedef struct android_wifi_reassoc_params { - unsigned char bssid[18]; - int channel; -} android_wifi_reassoc_params_t; - -#define ANDROID_WIFI_REASSOC_PARAMS_SIZE sizeof(struct android_wifi_reassoc_params) - -#define ANDROID_WIFI_ACTION_FRAME_SIZE 1040 - -typedef struct android_wifi_af_params { - unsigned char bssid[18]; - int channel; - int dwell_time; - int len; - unsigned char data[ANDROID_WIFI_ACTION_FRAME_SIZE]; -} android_wifi_af_params_t; - -#define ANDROID_WIFI_AF_PARAMS_SIZE sizeof(struct android_wifi_af_params) -#endif /* WES_SUPPORT */ #ifdef SUPPORT_AMPDU_MPDU_CMD -#define CMD_AMPDU_MPDU "AMPDU_MPDU" -#endif /* SUPPORT_AMPDU_MPDU_CMD */ -#ifdef CUSTOMER_HW4 +#define CMD_AMPDU_MPDU "AMPDU_MPDU" +#endif + +#ifdef VSDB #define CMD_CHANGE_RL "CHANGE_RL" #define CMD_RESTORE_RL "RESTORE_RL" -#endif /* CUSTOMER_HW4 */ +#endif typedef struct android_wifi_priv_cmd { char *buf; int used_len; @@ -203,16 +147,11 @@ typedef struct android_wifi_priv_cmd { * Extern function declarations (TODO: move them to dhd_linux.h) */ void dhd_customer_gpio_wlan_ctrl(int onoff); -int dhd_dev_reset(struct net_device *dev, uint8 flag); -int dhd_dev_init_ioctl(struct net_device *dev); +uint dhd_dev_reset(struct net_device *dev, uint8 flag); +void dhd_dev_init_ioctl(struct net_device *dev); #ifdef WL_CFG80211 int wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr); int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command); -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -int wl_cfg80211_set_wes_mode(int mode); -int wl_cfg80211_get_wes_mode(void); -int wl_cfg80211_get_ioctl_version(void); -#endif #else int wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr) { return 0; } @@ -222,27 +161,15 @@ int wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len) { return 0; } int wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len) { return 0; } -#endif /* WL_CFG80211 */ +#endif extern int dhd_os_check_if_up(void *dhdp); extern void *bcmsdh_get_drvdata(void); -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -/* wl_roam.c */ -extern int get_roamscan_mode(struct net_device *dev, int *mode); -extern int set_roamscan_mode(struct net_device *dev, int mode); -extern int get_roamscan_channel_list(struct net_device *dev, unsigned char channels[]); -extern int set_roamscan_channel_list(struct net_device *dev, unsigned char n, - unsigned char channels[], int ioctl_ver); -#endif - extern bool ap_fw_loaded; -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) extern char iface_name[IFNAMSIZ]; #endif -#ifndef WIFI_TURNOFF_DELAY -#define WIFI_TURNOFF_DELAY 0 -#endif /** * Local (static) functions and variables */ @@ -304,9 +231,9 @@ static int wl_android_set_suspendopt(struct net_device *dev, char *command, int int ret_now; int ret = 0; -#ifdef CUSTOMER_HW4 +#ifdef CUSTOMER_HW_SAMSUNG if (!dhd_download_fw_on_driverload) { -#endif /* CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW_SAMSUNG */ suspend_flag = *(command + strlen(CMD_SETSUSPENDOPT) + 1) - '0'; if (suspend_flag != 0) @@ -314,35 +241,15 @@ static int wl_android_set_suspendopt(struct net_device *dev, char *command, int ret_now = net_os_set_suspend_disable(dev, suspend_flag); if (ret_now != suspend_flag) { - if (!(ret = net_os_set_suspend(dev, ret_now, 1))) + if (!(ret = net_os_set_suspend(dev, ret_now))) DHD_INFO(("%s: Suspend Flag %d -> %d\n", __FUNCTION__, ret_now, suspend_flag)); else DHD_ERROR(("%s: failed %d\n", __FUNCTION__, ret)); } -#ifdef CUSTOMER_HW4 +#ifdef CUSTOMER_HW_SAMSUNG } -#endif /* CUSTOMER_HW4 */ - return ret; -} - -static int wl_android_set_suspendmode(struct net_device *dev, char *command, int total_len) -{ - int ret = 0; - -#if !defined(CONFIG_HAS_EARLYSUSPEND) || !defined(DHD_USE_EARLYSUSPEND) - int suspend_flag; - - suspend_flag = *(command + strlen(CMD_SETSUSPENDMODE) + 1) - '0'; - - if (suspend_flag != 0) - suspend_flag = 1; - - if (!(ret = net_os_set_suspend(dev, suspend_flag, 0))) - DHD_INFO(("%s: Suspend Mode %d\n", __FUNCTION__, suspend_flag)); - else - DHD_ERROR(("%s: failed %d\n", __FUNCTION__, ret)); -#endif +#endif /* CUSTOMER_HW_SAMSUNG */ return ret; } @@ -365,7 +272,7 @@ int wl_android_set_roam_trigger( { int roam_trigger[2]; - sscanf(command, "%*s %10d", &roam_trigger[0]); + sscanf(command, "%*s %d", &roam_trigger[0]); roam_trigger[1] = WLC_BAND_ALL; return wldev_ioctl(dev, WLC_SET_ROAM_TRIGGER, roam_trigger, @@ -398,7 +305,7 @@ int wl_android_set_roam_delta( { int roam_delta[2]; - sscanf(command, "%*s %10d", &roam_delta[0]); + sscanf(command, "%*s %d", &roam_delta[0]); roam_delta[1] = WLC_BAND_ALL; return wldev_ioctl(dev, WLC_SET_ROAM_DELTA, roam_delta, @@ -431,7 +338,7 @@ int wl_android_set_roam_scan_period( { int roam_scan_period = 0; - sscanf(command, "%*s %10d", &roam_scan_period); + sscanf(command, "%*s %d", &roam_scan_period); return wldev_ioctl(dev, WLC_SET_ROAM_SCAN_PERIOD, &roam_scan_period, sizeof(roam_scan_period), 1); } @@ -452,48 +359,6 @@ static int wl_android_get_roam_scan_period( return bytes_written; } -int wl_android_set_full_roam_scan_period( - struct net_device *dev, char* command, int total_len) -{ - int error = 0; - int full_roam_scan_period = 0; - char smbuf[WLC_IOCTL_SMLEN]; - - sscanf(command+sizeof("SETFULLROAMSCANPERIOD"), "%d", &full_roam_scan_period); - WL_TRACE(("%s: fullroamperiod = %d\n", __func__, full_roam_scan_period)); - - error = wldev_iovar_setbuf(dev, "fullroamperiod", &full_roam_scan_period, - sizeof(full_roam_scan_period), smbuf, sizeof(smbuf), NULL); - if (error) { - DHD_ERROR(("Failed to set full roam scan period, error = %d\n", error)); - } - - return error; -} - -static int wl_android_get_full_roam_scan_period( - struct net_device *dev, char *command, int total_len) -{ - int error; - int bytes_written; - int full_roam_scan_period = 0; - - error = wldev_iovar_getint(dev, "fullroamperiod", &full_roam_scan_period); - - if (error) { - DHD_ERROR(("%s: get full roam scan period failed code %d\n", - __func__, error)); - return -1; - } else { - DHD_INFO(("%s: get full roam scan period %d\n", __func__, full_roam_scan_period)); - } - - bytes_written = snprintf(command, total_len, "%s %d", - CMD_FULLROAMSCANPERIOD_GET, full_roam_scan_period); - - return bytes_written; -} - int wl_android_set_country_rev( struct net_device *dev, char* command, int total_len) { @@ -504,8 +369,8 @@ int wl_android_set_country_rev( int rev = 0; memset(country_code, 0, sizeof(country_code)); - sscanf(command+sizeof("SETCOUNTRYREV"), "%10s %10d", country_code, &rev); - WL_TRACE(("%s: country_code = %s, rev = %d\n", __FUNCTION__, + sscanf(command+sizeof("SETCOUNTRYREV"), "%s %d", country_code, &rev); + WL_TRACE(("%s: country_code = %s, rev = %d\n", __func__, country_code, rev)); memcpy(cspec.country_abbrev, country_code, sizeof(country_code)); @@ -517,487 +382,39 @@ int wl_android_set_country_rev( if (error) { DHD_ERROR(("%s: set country '%s/%d' failed code %d\n", - __FUNCTION__, cspec.ccode, cspec.rev, error)); + __func__, cspec.ccode, cspec.rev, error)); } else { dhd_bus_country_set(dev, &cspec); DHD_INFO(("%s: set country '%s/%d'\n", - __FUNCTION__, cspec.ccode, cspec.rev)); + __func__, cspec.ccode, cspec.rev)); } return error; } static int wl_android_get_country_rev( - struct net_device *dev, char *command, int total_len) + struct net_device *dev, char *command, int total_len) { int error; int bytes_written; char smbuf[WLC_IOCTL_SMLEN]; wl_country_t cspec; - error = wldev_iovar_getbuf(dev, "country", NULL, 0, smbuf, + error = wldev_iovar_getbuf(dev, "country", &cspec, sizeof(cspec), smbuf, sizeof(smbuf), NULL); if (error) { DHD_ERROR(("%s: get country failed code %d\n", - __FUNCTION__, error)); + __func__, error)); return -1; } else { - memcpy(&cspec, smbuf, sizeof(cspec)); - DHD_INFO(("%s: get country '%c%c %d'\n", - __FUNCTION__, cspec.ccode[0], cspec.ccode[1], cspec.rev)); + DHD_INFO(("%s: get country '%s %d'\n", __func__, smbuf, smbuf[WLC_CNTRY_BUF_SZ])); } - - bytes_written = snprintf(command, total_len, "%s %c%c %d", - CMD_COUNTRYREV_GET, cspec.ccode[0], cspec.ccode[1], cspec.rev); - + bytes_written = snprintf(command, total_len, "%s %s %d", CMD_COUNTRYREV_GET, smbuf, smbuf[WLC_CNTRY_BUF_SZ]); return bytes_written; } #endif /* ROAM_API */ -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -int wl_android_get_roam_scan_control(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int mode = 0; - - error = get_roamscan_mode(dev, &mode); - if (error) { - DHD_ERROR(("%s: Failed to get Scan Control, error = %d\n", __FUNCTION__, error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETROAMSCANCONTROL, mode); - - return bytes_written; -} - -int wl_android_set_roam_scan_control(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int mode = 0; - - if (sscanf(command, "%*s %d", &mode) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = set_roamscan_mode(dev, mode); - if (error) { - DHD_ERROR(("%s: Failed to set Scan Control %d, error = %d\n", - __FUNCTION__, mode, error)); - return -1; - } - - return 0; -} - -int wl_android_get_roam_scan_channels(struct net_device *dev, char *command, int total_len) -{ - int bytes_written = 0; - unsigned char channels[ANDROID_WIFI_MAX_ROAM_SCAN_CHANNELS] = {0}; - int channel_cnt = 0; - char channel_info[10 + (ANDROID_WIFI_MAX_ROAM_SCAN_CHANNELS * 3)] = {0}; - int channel_info_len = 0; - int i = 0; - - channel_cnt = get_roamscan_channel_list(dev, channels); - - channel_info_len += sprintf(&channel_info[channel_info_len], "%d ", channel_cnt); - for (i = 0; i < channel_cnt; i++) { - channel_info_len += sprintf(&channel_info[channel_info_len], "%d ", channels[i]); - - if (channel_info_len > (sizeof(channel_info) - 10)) - break; - } - channel_info_len += sprintf(&channel_info[channel_info_len], "%s", "\0"); - - bytes_written = snprintf(command, total_len, "%s %s", - CMD_GETROAMSCANCHANNELS, channel_info); - return bytes_written; -} - -int wl_android_set_roam_scan_channels(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - unsigned char *p = (unsigned char *)(command + strlen(CMD_SETROAMSCANCHANNELS) + 1); - int ioctl_version = wl_cfg80211_get_ioctl_version(); - error = set_roamscan_channel_list(dev, p[0], &p[1], ioctl_version); - if (error) { - DHD_ERROR(("%s: Failed to set Scan Channels %d, error = %d\n", - __FUNCTION__, p[0], error)); - return -1; - } - - return 0; -} - -int wl_android_get_scan_channel_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int time = 0; - - error = wldev_ioctl(dev, WLC_GET_SCAN_CHANNEL_TIME, &time, sizeof(time), 0); - if (error) { - DHD_ERROR(("%s: Failed to get Scan Channel Time, error = %d\n", - __FUNCTION__, error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETSCANCHANNELTIME, time); - - return bytes_written; -} - -int wl_android_set_scan_channel_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int time = 0; - - if (sscanf(command, "%*s %d", &time) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wldev_ioctl(dev, WLC_SET_SCAN_CHANNEL_TIME, &time, sizeof(time), 1); - if (error) { - DHD_ERROR(("%s: Failed to set Scan Channel Time %d, error = %d\n", - __FUNCTION__, time, error)); - return -1; - } - - return 0; -} - -int wl_android_get_scan_home_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int time = 0; - - error = wldev_ioctl(dev, WLC_GET_SCAN_HOME_TIME, &time, sizeof(time), 0); - if (error) { - DHD_ERROR(("Failed to get Scan Home Time, error = %d\n", error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETSCANHOMETIME, time); - - return bytes_written; -} - -int wl_android_set_scan_home_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int time = 0; - - if (sscanf(command, "%*s %d", &time) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wldev_ioctl(dev, WLC_SET_SCAN_HOME_TIME, &time, sizeof(time), 1); - if (error) { - DHD_ERROR(("%s: Failed to set Scan Home Time %d, error = %d\n", - __FUNCTION__, time, error)); - return -1; - } - - return 0; -} - -int wl_android_get_scan_home_away_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int time = 0; - - error = wldev_iovar_getint(dev, "scan_home_away_time", &time); - if (error) { - DHD_ERROR(("%s: Failed to get Scan Home Away Time, error = %d\n", - __FUNCTION__, error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETSCANHOMEAWAYTIME, time); - - return bytes_written; -} - -int wl_android_set_scan_home_away_time(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int time = 0; - - if (sscanf(command, "%*s %d", &time) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wldev_iovar_setint(dev, "scan_home_away_time", time); - if (error) { - DHD_ERROR(("%s: Failed to set Scan Home Away Time %d, error = %d\n", - __FUNCTION__, time, error)); - return -1; - } - - return 0; -} - -int wl_android_get_scan_nprobes(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int num = 0; - - error = wldev_ioctl(dev, WLC_GET_SCAN_NPROBES, &num, sizeof(num), 0); - if (error) { - DHD_ERROR(("%s: Failed to get Scan NProbes, error = %d\n", __FUNCTION__, error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETSCANNPROBES, num); - - return bytes_written; -} - -int wl_android_set_scan_nprobes(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int num = 0; - - if (sscanf(command, "%*s %d", &num) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wldev_ioctl(dev, WLC_SET_SCAN_NPROBES, &num, sizeof(num), 1); - if (error) { - DHD_ERROR(("%s: Failed to set Scan NProbes %d, error = %d\n", - __FUNCTION__, num, error)); - return -1; - } - - return 0; -} - -int wl_android_send_action_frame(struct net_device *dev, char *command, int total_len) -{ - int error = -1; - android_wifi_af_params_t *params = NULL; - wl_action_frame_t *action_frame = NULL; - wl_af_params_t *af_params = NULL; - char *smbuf = NULL; - struct ether_addr tmp_bssid; - int tmp_channel = 0; - - params = (android_wifi_af_params_t *)(command + strlen(CMD_SENDACTIONFRAME) + 1); - if (params == NULL) { - DHD_ERROR(("%s: Invalid params \n", __FUNCTION__)); - goto send_action_frame_out; - } - - smbuf = kmalloc(WLC_IOCTL_MAXLEN, GFP_KERNEL); - if (smbuf == NULL) { - DHD_ERROR(("%s: failed to allocated memory %d bytes\n", - __FUNCTION__, WLC_IOCTL_MAXLEN)); - goto send_action_frame_out; - } - - af_params = (wl_af_params_t *) kzalloc(WL_WIFI_AF_PARAMS_SIZE, GFP_KERNEL); - if (af_params == NULL) - { - DHD_ERROR(("%s: unable to allocate frame\n", __FUNCTION__)); - goto send_action_frame_out; - } - - memset(&tmp_bssid, 0, ETHER_ADDR_LEN); - if (bcm_ether_atoe((const char *)params->bssid, (struct ether_addr *)&tmp_bssid) == 0) { - memset(&tmp_bssid, 0, ETHER_ADDR_LEN); - - error = wldev_ioctl(dev, WLC_GET_BSSID, &tmp_bssid, ETHER_ADDR_LEN, false); - if (error) { - memset(&tmp_bssid, 0, ETHER_ADDR_LEN); - DHD_ERROR(("%s: failed to get bssid, error=%d\n", __FUNCTION__, error)); - goto send_action_frame_out; - } - } - - if (params->channel < 0) { - struct channel_info ci; - error = wldev_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci), false); - if (error) { - DHD_ERROR(("%s: failed to get channel, error=%d\n", __FUNCTION__, error)); - goto send_action_frame_out; - } - - tmp_channel = ci.hw_channel; - } - else { - tmp_channel = params->channel; - } - - af_params->channel = tmp_channel; - af_params->dwell_time = params->dwell_time; - memcpy(&af_params->BSSID, &tmp_bssid, ETHER_ADDR_LEN); - action_frame = &af_params->action_frame; - - action_frame->packetId = 0; - memcpy(&action_frame->da, &tmp_bssid, ETHER_ADDR_LEN); - action_frame->len = params->len; - memcpy(action_frame->data, params->data, action_frame->len); - - error = wldev_iovar_setbuf(dev, "actframe", af_params, - sizeof(wl_af_params_t), smbuf, WLC_IOCTL_MAXLEN, NULL); - if (error) { - DHD_ERROR(("%s: failed to set action frame, error=%d\n", __FUNCTION__, error)); - } - -send_action_frame_out: - if (af_params) - kfree(af_params); - - if (smbuf) - kfree(smbuf); - - if (error) - return -1; - else - return 0; -} - -int wl_android_reassoc(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - android_wifi_reassoc_params_t *params = NULL; - uint band; - chanspec_t channel; - u32 params_size; - wl_reassoc_params_t reassoc_params; - - params = (android_wifi_reassoc_params_t *)(command + strlen(CMD_REASSOC) + 1); - if (params == NULL) { - DHD_ERROR(("%s: Invalid params \n", __FUNCTION__)); - return -1; - } - - memset(&reassoc_params, 0, WL_REASSOC_PARAMS_FIXED_SIZE); - - if (bcm_ether_atoe((const char *)params->bssid, - (struct ether_addr *)&reassoc_params.bssid) == 0) { - DHD_ERROR(("%s: Invalid bssid \n", __FUNCTION__)); - return -1; - } - - if (params->channel < 0) { - DHD_ERROR(("%s: Invalid Channel \n", __FUNCTION__)); - return -1; - } - - reassoc_params.chanspec_num = 1; - - channel = params->channel; -#ifdef D11AC_IOTYPES - if (wl_cfg80211_get_ioctl_version() == 1) { - band = ((channel <= CH_MAX_2G_CHANNEL) ? - WL_LCHANSPEC_BAND_2G : WL_LCHANSPEC_BAND_5G); - reassoc_params.chanspec_list[0] = channel | - band | WL_LCHANSPEC_BW_20 | WL_LCHANSPEC_CTL_SB_NONE; - } - else { - band = ((channel <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); - reassoc_params.chanspec_list[0] = channel | band | WL_LCHANSPEC_BW_20; - } -#else - band = ((channel <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); - reassoc_params.chanspec_list[0] = channel | - band | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; -#endif /* D11AC_IOTYPES */ - params_size = WL_REASSOC_PARAMS_FIXED_SIZE + sizeof(chanspec_t); - - error = wldev_ioctl(dev, WLC_REASSOC, &reassoc_params, params_size, true); - if (error) { - DHD_ERROR(("%s: failed to reassoc, error=%d\n", __FUNCTION__, error)); - } - - if (error) - return -1; - else - return 0; -} - -int wl_android_get_wes_mode(struct net_device *dev, char *command, int total_len) -{ - int bytes_written = 0; - int mode = 0; - - mode = wl_cfg80211_get_wes_mode(); - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETWESMODE, mode); - - return bytes_written; -} - -int wl_android_set_wes_mode(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int mode = 0; - - if (sscanf(command, "%*s %d", &mode) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wl_cfg80211_set_wes_mode(mode); - if (error) { - DHD_ERROR(("%s: Failed to set WES Mode %d, error = %d\n", - __FUNCTION__, mode, error)); - return -1; - } - - return 0; -} - -int wl_android_get_okc_mode(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int bytes_written = 0; - int mode = 0; - - error = wldev_iovar_getint(dev, "okc_enable", &mode); - if (error) { - DHD_ERROR(("%s: Failed to get OKC Mode, error = %d\n", __FUNCTION__, error)); - return -1; - } - - bytes_written = snprintf(command, total_len, "%s %d", CMD_GETOKCMODE, mode); - - return bytes_written; -} - -int wl_android_set_okc_mode(struct net_device *dev, char *command, int total_len) -{ - int error = 0; - int mode = 0; - - if (sscanf(command, "%*s %d", &mode) != 1) { - DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); - return -1; - } - - error = wldev_iovar_setint(dev, "okc_enable", mode); - if (error) { - DHD_ERROR(("%s: Failed to set OKC Mode %d, error = %d\n", - __FUNCTION__, mode, error)); - return -1; - } - - return error; -} -#endif /* WES_SUPPORT */ - #ifdef PNO_SUPPORT static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len) { @@ -1118,87 +535,85 @@ static int wl_android_get_p2p_dev_addr(struct net_device *ndev, char *command, i bytes_written = sizeof(struct ether_addr); return bytes_written; } - #ifdef BCMCCX static int wl_android_get_cckm_rn(struct net_device *dev, char *command) { - int error, rn; + int error, rn; - WL_TRACE(("%s:wl_android_get_cckm_rn\n", dev->name)); + WL_TRACE(("%s:wl_android_get_cckm_rn\n", dev->name)); - error = wldev_iovar_getint(dev, "cckm_rn", &rn); - if (unlikely(error)) { - WL_ERR(("wl_android_get_cckm_rn error (%d)\n", error)); - return -1; - } - memcpy(command, &rn, sizeof(int)); + error = wldev_iovar_getint(dev, "cckm_rn", &rn); + if (unlikely(error)) { + WL_ERR(("wl_android_get_cckm_rn error (%d)\n", error)); + return -1; + } + //WL_ERR(("wl_android_get_cckm_rn = %d\n", rn)); + memcpy(command, &rn, sizeof(int)); - return sizeof(int); + return sizeof(int); } static int wl_android_set_cckm_krk(struct net_device *dev, char *command) { - int error; - unsigned char key[16]; - static char iovar_buf[WLC_IOCTL_MEDLEN]; + int error; + unsigned char key[16]; - WL_TRACE(("%s: wl_iw_set_cckm_krk\n", dev->name)); + static char iovar_buf[WLC_IOCTL_MEDLEN]; - memset(iovar_buf, 0, sizeof(iovar_buf)); - memcpy(key, command+strlen("set cckm_krk")+1, 16); + WL_TRACE(("%s: wl_iw_set_cckm_krk\n", dev->name)); - error = wldev_iovar_setbuf(dev, "cckm_krk", key, sizeof(key), - iovar_buf, WLC_IOCTL_MEDLEN, NULL); - if (unlikely(error)) - { - WL_ERR((" cckm_krk set error (%d)\n", error)); - return -1; - } - return 0; -} + memset(iovar_buf, 0, sizeof(iovar_buf)); + memcpy(key, command+strlen("set cckm_krk")+1, 16); + error = wldev_iovar_setbuf(dev,"cckm_krk", key, sizeof(key), iovar_buf, WLC_IOCTL_MEDLEN, NULL); + if (unlikely(error)) + { + WL_ERR((" cckm_krk set error (%d)\n", error)); + return -1; + } + return 0; +} static int wl_android_get_assoc_res_ies(struct net_device *dev, char *command) { - int error; - u8 buf[WL_ASSOC_INFO_MAX]; - wl_assoc_info_t assoc_info; - u32 resp_ies_len = 0; - int bytes_written = 0; + int error; + u8 buf[WL_ASSOC_INFO_MAX]; + wl_assoc_info_t assoc_info; + u32 resp_ies_len = 0; + int bytes_written = 0; - WL_TRACE(("%s: wl_iw_get_assoc_res_ies\n", dev->name)); + WL_TRACE(("%s: wl_iw_get_assoc_res_ies\n", dev->name)); - error = wldev_iovar_getbuf(dev, "assoc_info", NULL, 0, buf, WL_ASSOC_INFO_MAX, NULL); - if (unlikely(error)) { - WL_ERR(("could not get assoc info (%d)\n", error)); - return -1; - } + error = wldev_iovar_getbuf(dev, "assoc_info", NULL, 0, buf, WL_ASSOC_INFO_MAX, NULL); + if (unlikely(error)) { + WL_ERR(("could not get assoc info (%d)\n", error)); + return -1; + } - memcpy(&assoc_info, buf, sizeof(wl_assoc_info_t)); - assoc_info.req_len = htod32(assoc_info.req_len); - assoc_info.resp_len = htod32(assoc_info.resp_len); - assoc_info.flags = htod32(assoc_info.flags); + memcpy(&assoc_info, buf, sizeof(wl_assoc_info_t)); + assoc_info.req_len = htod32(assoc_info.req_len); + assoc_info.resp_len = htod32(assoc_info.resp_len); + assoc_info.flags = htod32(assoc_info.flags); - if (assoc_info.resp_len) { - resp_ies_len = assoc_info.resp_len - sizeof(struct dot11_assoc_resp); - } + if (assoc_info.resp_len) { + resp_ies_len = assoc_info.resp_len - sizeof(struct dot11_assoc_resp); + } - /* first 4 bytes are ie len */ - memcpy(command, &resp_ies_len, sizeof(u32)); - bytes_written = sizeof(u32); + /* first 4 bytes are ie len */ + memcpy(command, &resp_ies_len, sizeof(u32)); + bytes_written= sizeof(u32); - /* get the association resp IE's if there are any */ - if (resp_ies_len) { - error = wldev_iovar_getbuf(dev, "assoc_resp_ies", NULL, 0, - buf, WL_ASSOC_INFO_MAX, NULL); - if (unlikely(error)) { - WL_ERR(("could not get assoc resp_ies (%d)\n", error)); - return -1; - } + /* get the association resp IE's if there are any */ + if (resp_ies_len) { + error = wldev_iovar_getbuf(dev, "assoc_resp_ies", NULL, 0, buf, WL_ASSOC_INFO_MAX, NULL); + if (unlikely(error)) { + WL_ERR(("could not get assoc resp_ies (%d)\n", error)); + return -1; + } - memcpy(command+sizeof(u32), buf, resp_ies_len); - bytes_written += resp_ies_len; - } - return bytes_written; + memcpy(command+sizeof(u32), buf, resp_ies_len); + bytes_written += resp_ies_len; + } + return bytes_written; } #endif /* BCMCCX */ @@ -1212,7 +627,7 @@ int wl_android_wifi_on(struct net_device *dev) int ret = 0; int retry = POWERUP_MAX_RETRY; - printk("%s in\n", __FUNCTION__); + DHD_ERROR(("%s in\n", __FUNCTION__)); if (!dev) { DHD_ERROR(("%s: dev is null\n", __FUNCTION__)); return -EINVAL; @@ -1221,7 +636,10 @@ int wl_android_wifi_on(struct net_device *dev) dhd_net_if_lock(dev); if (!g_wifi_on) { do { - dhd_customer_gpio_wlan_ctrl(WLAN_RESET_ON); + dhd_customer_gpio_wlan_ctrl(WLAN_RESET_ON); + if (dhd_download_fw_on_driverload) + msleep(300); + ret = sdioh_start(NULL, 0); if (ret == 0) break; @@ -1235,10 +653,7 @@ int wl_android_wifi_on(struct net_device *dev) } ret = dhd_dev_reset(dev, FALSE); sdioh_start(NULL, 1); - if (!ret) { - if (dhd_dev_init_ioctl(dev) < 0) - ret = -EFAULT; - } + dhd_dev_init_ioctl(dev); g_wifi_on = TRUE; } @@ -1252,7 +667,7 @@ int wl_android_wifi_off(struct net_device *dev) { int ret = 0; - printk("%s in\n", __FUNCTION__); + DHD_ERROR(("%s in\n", __FUNCTION__)); if (!dev) { DHD_TRACE(("%s: dev is null\n", __FUNCTION__)); return -EINVAL; @@ -1260,7 +675,9 @@ int wl_android_wifi_off(struct net_device *dev) dhd_net_if_lock(dev); if (g_wifi_on) { - ret = dhd_dev_reset(dev, TRUE); + dhd_dev_reset(dev, 1); + if (dhd_download_fw_on_driverload) + msleep(100); sdioh_stop(NULL); dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); g_wifi_on = FALSE; @@ -1286,54 +703,10 @@ static int wl_android_set_fwpath(struct net_device *net, char *command, int tota return 0; } -#if defined(SUPPORT_HIDDEN_AP) -static int -wl_android_set_max_num_sta(struct net_device *dev, const char* string_num) -{ - int max_assoc; - max_assoc = bcm_atoi(string_num); - DHD_INFO(("%s : HAPD_MAX_NUM_STA = %d\n", __FUNCTION__, max_assoc)); - wldev_iovar_setint(dev, "maxassoc", max_assoc); - return 1; -} - -static int -wl_android_set_ssid(struct net_device *dev, const char* hapd_ssid) -{ - wlc_ssid_t ssid; - s32 ret; - - ssid.SSID_len = strlen(hapd_ssid); - bcm_strncpy_s(ssid.SSID, sizeof(ssid.SSID), hapd_ssid, ssid.SSID_len); - DHD_INFO(("%s: HAPD_SSID = %s\n", __FUNCTION__, ssid.SSID)); - ret = wldev_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(wlc_ssid_t), true); - if (ret < 0) { - DHD_ERROR(("%s : WLC_SET_SSID Error:%d\n", __FUNCTION__, ret)); - } - return 1; - -} - -static int -wl_android_set_hide_ssid(struct net_device *dev, const char* string_num) -{ - int hide_ssid; - int enable = 0; - - hide_ssid = bcm_atoi(string_num); - DHD_INFO(("%s: HAPD_HIDE_SSID = %d\n", __FUNCTION__, hide_ssid)); - if (hide_ssid) - enable = 1; - wldev_iovar_setint(dev, "closednet", enable); - return 1; -} -#endif /* SUPPORT_HIDDEN_AP */ - -#if defined(SUPPORT_AUTO_CHANNEL) static int wl_android_set_auto_channel(struct net_device *dev, const char* string_num, - char* command, int total_len) + char* command, int total_len) { int channel; int chosen = 0; @@ -1342,7 +715,7 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, /* Restrict channel to 1 - 7: 2GHz, 20MHz BW, No SB */ u32 req_buf[8] = {7, 0x2B01, 0x2B02, 0x2B03, 0x2B04, 0x2B05, 0x2B06, - 0x2B07}; + 0x2B07}; /* Auto channel select */ wl_uint32_list_t request; @@ -1352,16 +725,16 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, if (channel == 20) ret = wldev_ioctl(dev, WLC_START_CHANNEL_SEL, (void *)&req_buf, - sizeof(req_buf), true); + sizeof(req_buf), true); else { /* channel == 0 */ request.count = htod32(0); ret = wldev_ioctl(dev, WLC_START_CHANNEL_SEL, (void *)&request, - sizeof(request), true); + sizeof(request), true); } if (ret < 0) { DHD_ERROR(("%s: can't start auto channel scan, err = %d\n", - __FUNCTION__, ret)); + __FUNCTION__, ret)); channel = 0; goto done; } @@ -1370,12 +743,12 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, bcm_mdelay(500); retry = 10; - while (retry--) { + while(retry--) { ret = wldev_ioctl(dev, WLC_GET_CHANNEL_SEL, &chosen, sizeof(chosen), - false); + false); if (ret < 0 || dtoh32(chosen) == 0) { DHD_INFO(("%s: %d tried, ret = %d, chosen = %d\n", - __FUNCTION__, (10 - retry), ret, chosen)); + __FUNCTION__, (10 - retry), ret, chosen)); bcm_mdelay(200); } else { @@ -1391,18 +764,61 @@ wl_android_set_auto_channel(struct net_device *dev, const char* string_num, } done: +// snprintf(command, total_len, "%d", channel); snprintf(command, 4, "%d", channel); DHD_INFO(("%s: command result is %s\n", __FUNCTION__, command)); +// return 1; return 4; } -#endif /* SUPPORT_AUTO_CHANNEL */ -#if defined(SUPPORT_SOFTAP_SINGL_DISASSOC) +static int +wl_android_set_max_num_sta(struct net_device *dev, const char* string_num) +{ + int max_assoc; + + max_assoc = bcm_atoi(string_num); + DHD_INFO(("%s : HAPD_MAX_NUM_STA = %d\n", __FUNCTION__, max_assoc)); + wldev_iovar_setint(dev, "maxassoc", max_assoc); + return 1; +} + +static int +wl_android_set_ssid (struct net_device *dev, const char* hapd_ssid) +{ + wlc_ssid_t ssid; + s32 ret; + + ssid.SSID_len = strlen(hapd_ssid); + bcm_strncpy_s(ssid.SSID, sizeof(ssid.SSID), hapd_ssid, ssid.SSID_len); + DHD_INFO(("%s: HAPD_SSID = %s\n", __FUNCTION__, ssid.SSID)); + ret = wldev_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(wlc_ssid_t), true); + if (ret < 0) { + DHD_ERROR(("%s : WLC_SET_SSID Error:%d\n", __FUNCTION__, ret)); + } + return 1; + +} + +static int +wl_android_set_hide_ssid(struct net_device *dev, const char* string_num) +{ + int hide_ssid; + int enable = 0; + + hide_ssid = bcm_atoi(string_num); + DHD_INFO(("%s: HAPD_HIDE_SSID = %d\n", __FUNCTION__, hide_ssid)); + if (hide_ssid) + enable = 1; + wldev_iovar_setint(dev, "closednet", enable); + return 1; +} + static int wl_android_sta_diassoc(struct net_device *dev, const char* straddr) { scb_val_t scbval; + s32 ret; DHD_INFO(("%s: deauth STA %s\n", __FUNCTION__, straddr)); @@ -1410,15 +826,17 @@ wl_android_sta_diassoc(struct net_device *dev, const char* straddr) scbval.val = htod32(1); bcm_ether_atoe(straddr, &scbval.ea); - DHD_INFO(("%s: deauth STA: "MACDBG "\n", __FUNCTION__, - STR_TO_MACD(scbval.ea.octet))); + DHD_INFO(("%s: deauth STA: %02X:%02X:%02X:%02X:%02X:%02X\n", __FUNCTION__, + scbval.ea.octet[0], scbval.ea.octet[1], scbval.ea.octet[2], + scbval.ea.octet[3], scbval.ea.octet[4], scbval.ea.octet[5])); - wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scbval, - sizeof(scb_val_t), true); + if ((ret = wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scbval, + sizeof(scb_val_t), true)) < 0) { + DHD_ERROR(("%s : WLC_SCB_DEAUTHENTICATE_FOR_REASON error:%d\n", __FUNCTION__ , ret)); + } return 1; } -#endif /* SUPPORT_SOFTAP_SINGL_DISASSOC */ #ifdef OKC_SUPPORT @@ -1465,7 +883,7 @@ wl_android_okc_enable(struct net_device *dev, char *command, int total_len) } #endif /* OKC_ SUPPORT */ -#ifdef CUSTOMER_HW4 +#ifdef VSDB static int wl_android_ch_res_rl(struct net_device *dev, bool change) { @@ -1476,18 +894,20 @@ wl_android_ch_res_rl(struct net_device *dev, bool change) if (change) { srl = 4; lrl = 2; - } - error = wldev_ioctl(dev, WLC_SET_SRL, &srl, sizeof(s32), true); + } + error = wldev_ioctl(dev, WLC_SET_SRL, &srl, + sizeof(s32), true); if (error) { DHD_ERROR(("Failed to set SRL, error = %d\n", error)); } - error = wldev_ioctl(dev, WLC_SET_LRL, &lrl, sizeof(s32), true); + error = wldev_ioctl(dev, WLC_SET_LRL, &lrl, + sizeof(s32), true); if (error) { DHD_ERROR(("Failed to set LRL, error = %d\n", error)); } return error; } -#endif /* CUSTOMER_HW4 */ +#endif #ifdef SUPPORT_AMPDU_MPDU_CMD /* CMD_AMPDU_MPDU */ @@ -1497,13 +917,13 @@ wl_android_set_ampdu_mpdu(struct net_device *dev, const char* string_num) int err = 0; int ampdu_mpdu; + //ampdu_mpdu = my_atoi(string_num); ampdu_mpdu = bcm_atoi(string_num); if (ampdu_mpdu > 32) { DHD_ERROR(("%s : ampdu_mpdu MAX value is 32.\n", __FUNCTION__)); return -1; } - DHD_ERROR(("%s : ampdu_mpdu = %d\n", __FUNCTION__, ampdu_mpdu)); err = wldev_iovar_setint(dev, "ampdu_mpdu", ampdu_mpdu); if (err < 0) { @@ -1513,11 +933,10 @@ wl_android_set_ampdu_mpdu(struct net_device *dev, const char* string_num) return 0; } -#endif /* SUPPORT_AMPDU_MPDU_CMD */ +#endif int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) { -#define PRIVATE_COMMAND_MAX_LEN 8192 int ret = 0; char *command = NULL; int bytes_written = 0; @@ -1533,11 +952,6 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) ret = -EFAULT; goto exit; } - if (priv_cmd.total_len > PRIVATE_COMMAND_MAX_LEN) - { - DHD_ERROR(("%s: too long priavte command\n", __FUNCTION__)); - ret = -EINVAL; - } command = kmalloc(priv_cmd.total_len, GFP_KERNEL); if (!command) { @@ -1549,15 +963,16 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) ret = -EFAULT; goto exit; } + DHD_INFO(("%s: Android private cmd \"%s\" on %s\n", __FUNCTION__, command, ifr->ifr_name)); if (strnicmp(command, CMD_START, strlen(CMD_START)) == 0) { - DHD_INFO(("%s, Received regular START command\n", __FUNCTION__)); -#ifdef SUPPORT_DEEP_SLEEP + DHD_ERROR(("%s, Received regular START command\n", __FUNCTION__)); +#ifdef CUSTOMER_HW_SAMSUNG sleep_never = 1; #else bytes_written = wl_android_wifi_on(net); -#endif /* SUPPORT_DEEP_SLEEP */ +#endif /* CUSTOMER_HW_SAMSUNG */ } else if (strnicmp(command, CMD_SETFWPATH, strlen(CMD_SETFWPATH)) == 0) { bytes_written = wl_android_set_fwpath(net, command, priv_cmd.total_len); @@ -1571,11 +986,12 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) } if (strnicmp(command, CMD_STOP, strlen(CMD_STOP)) == 0) { -#ifdef SUPPORT_DEEP_SLEEP + DHD_ERROR(("%s, Received regular STOP command\n", __FUNCTION__)); +#ifdef CUSTOMER_HW_SAMSUNG sleep_never = 1; #else bytes_written = wl_android_wifi_off(net); -#endif /* SUPPORT_DEEP_SLEEP */ +#endif /* CUSTOMER_HW_SAMSUNG */ } else if (strnicmp(command, CMD_SCAN_ACTIVE, strlen(CMD_SCAN_ACTIVE)) == 0) { /* TBD: SCAN-ACTIVE */ @@ -1589,12 +1005,11 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) else if (strnicmp(command, CMD_LINKSPEED, strlen(CMD_LINKSPEED)) == 0) { bytes_written = wl_android_get_link_speed(net, command, priv_cmd.total_len); } -#ifdef PKT_FILTER_SUPPORT else if (strnicmp(command, CMD_RXFILTER_START, strlen(CMD_RXFILTER_START)) == 0) { - bytes_written = net_os_enable_packet_filter(net, 1); + bytes_written = net_os_set_packet_filter(net, 1); } else if (strnicmp(command, CMD_RXFILTER_STOP, strlen(CMD_RXFILTER_STOP)) == 0) { - bytes_written = net_os_enable_packet_filter(net, 0); + bytes_written = net_os_set_packet_filter(net, 0); } else if (strnicmp(command, CMD_RXFILTER_ADD, strlen(CMD_RXFILTER_ADD)) == 0) { int filter_num = *(command + strlen(CMD_RXFILTER_ADD) + 1) - '0'; @@ -1604,7 +1019,6 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) int filter_num = *(command + strlen(CMD_RXFILTER_REMOVE) + 1) - '0'; bytes_written = net_os_rxfilter_add_remove(net, FALSE, filter_num); } -#endif /* PKT_FILTER_SUPPORT */ else if (strnicmp(command, CMD_BTCOEXSCAN_START, strlen(CMD_BTCOEXSCAN_START)) == 0) { /* TBD: BTCOEXSCAN-START */ } @@ -1612,143 +1026,73 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) /* TBD: BTCOEXSCAN-STOP */ } else if (strnicmp(command, CMD_BTCOEXMODE, strlen(CMD_BTCOEXMODE)) == 0) { -#ifdef WL_CFG80211 - bytes_written = wl_cfg80211_set_btcoex_dhcp(net, command); -#else -#ifdef PKT_FILTER_SUPPORT +#if !defined(CUSTOMER_HW_SAMSUNG) uint mode = *(command + strlen(CMD_BTCOEXMODE) + 1) - '0'; if (mode == 1) - net_os_enable_packet_filter(net, 0); /* DHCP starts */ + net_os_set_packet_filter(net, 0); /* DHCP starts */ else - net_os_enable_packet_filter(net, 1); /* DHCP ends */ -#endif /* PKT_FILTER_SUPPORT */ -#endif /* WL_CFG80211 */ + net_os_set_packet_filter(net, 1); /* DHCP ends */ +#endif +#ifdef WL_CFG80211 + bytes_written = wl_cfg80211_set_btcoex_dhcp(net, command); +#endif } else if (strnicmp(command, CMD_SETSUSPENDOPT, strlen(CMD_SETSUSPENDOPT)) == 0) { bytes_written = wl_android_set_suspendopt(net, command, priv_cmd.total_len); } - else if (strnicmp(command, CMD_SETSUSPENDMODE, strlen(CMD_SETSUSPENDMODE)) == 0) { - bytes_written = wl_android_set_suspendmode(net, command, priv_cmd.total_len); - } else if (strnicmp(command, CMD_SETBAND, strlen(CMD_SETBAND)) == 0) { uint band = *(command + strlen(CMD_SETBAND) + 1) - '0'; bytes_written = wldev_set_band(net, band); + wl_update_wiphybands(NULL); } else if (strnicmp(command, CMD_GETBAND, strlen(CMD_GETBAND)) == 0) { bytes_written = wl_android_get_band(net, command, priv_cmd.total_len); } -#ifdef WL_CFG80211 -#ifndef CUSTOMER_SET_COUNTRY - /* CUSTOMER_SET_COUNTRY feature is define for only GGSM model */ +#ifndef GLOBALCONFIG_WLAN_COUNTRY_CODE + else if (strnicmp(command, CMD_COUNTRY, strlen(CMD_COUNTRY)) == 0) { char *country_code = command + strlen(CMD_COUNTRY) + 1; bytes_written = wldev_set_country(net, country_code); + wl_update_wiphybands(NULL); } #endif -#endif /* WL_CFG80211 */ #ifdef ROAM_API else if (strnicmp(command, CMD_ROAMTRIGGER_SET, - strlen(CMD_ROAMTRIGGER_SET)) == 0) { + strlen(CMD_ROAMTRIGGER_SET)) == 0) { bytes_written = wl_android_set_roam_trigger(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_ROAMTRIGGER_GET, - strlen(CMD_ROAMTRIGGER_GET)) == 0) { + strlen(CMD_ROAMTRIGGER_GET)) == 0) { bytes_written = wl_android_get_roam_trigger(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_ROAMDELTA_SET, - strlen(CMD_ROAMDELTA_SET)) == 0) { + strlen(CMD_ROAMDELTA_SET)) == 0) { bytes_written = wl_android_set_roam_delta(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_ROAMDELTA_GET, - strlen(CMD_ROAMDELTA_GET)) == 0) { + strlen(CMD_ROAMDELTA_GET)) == 0) { bytes_written = wl_android_get_roam_delta(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_ROAMSCANPERIOD_SET, - strlen(CMD_ROAMSCANPERIOD_SET)) == 0) { + strlen(CMD_ROAMSCANPERIOD_SET)) == 0) { bytes_written = wl_android_set_roam_scan_period(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_ROAMSCANPERIOD_GET, - strlen(CMD_ROAMSCANPERIOD_GET)) == 0) { + strlen(CMD_ROAMSCANPERIOD_GET)) == 0) { bytes_written = wl_android_get_roam_scan_period(net, command, - priv_cmd.total_len); - } else if (strnicmp(command, CMD_FULLROAMSCANPERIOD_SET, - strlen(CMD_FULLROAMSCANPERIOD_SET)) == 0) { - bytes_written = wl_android_set_full_roam_scan_period(net, command, - priv_cmd.total_len); - } else if (strnicmp(command, CMD_FULLROAMSCANPERIOD_GET, - strlen(CMD_FULLROAMSCANPERIOD_GET)) == 0) { - bytes_written = wl_android_get_full_roam_scan_period(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } else if (strnicmp(command, CMD_COUNTRYREV_SET, - strlen(CMD_COUNTRYREV_SET)) == 0) { + strlen(CMD_COUNTRYREV_SET)) == 0) { bytes_written = wl_android_set_country_rev(net, command, - priv_cmd.total_len); + priv_cmd.total_len); wl_update_wiphybands(NULL); } else if (strnicmp(command, CMD_COUNTRYREV_GET, - strlen(CMD_COUNTRYREV_GET)) == 0) { + strlen(CMD_COUNTRYREV_GET)) == 0) { bytes_written = wl_android_get_country_rev(net, command, - priv_cmd.total_len); + priv_cmd.total_len); } #endif /* ROAM_API */ -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - else if (strnicmp(command, CMD_GETROAMSCANCONTROL, strlen(CMD_GETROAMSCANCONTROL)) == 0) { - bytes_written = wl_android_get_roam_scan_control(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETROAMSCANCONTROL, strlen(CMD_SETROAMSCANCONTROL)) == 0) { - bytes_written = wl_android_set_roam_scan_control(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETROAMSCANCHANNELS, strlen(CMD_GETROAMSCANCHANNELS)) == 0) { - bytes_written = wl_android_get_roam_scan_channels(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETROAMSCANCHANNELS, strlen(CMD_SETROAMSCANCHANNELS)) == 0) { - bytes_written = wl_android_set_roam_scan_channels(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SENDACTIONFRAME, strlen(CMD_SENDACTIONFRAME)) == 0) { - bytes_written = wl_android_send_action_frame(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_REASSOC, strlen(CMD_REASSOC)) == 0) { - bytes_written = wl_android_reassoc(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETSCANCHANNELTIME, strlen(CMD_GETSCANCHANNELTIME)) == 0) { - bytes_written = wl_android_get_scan_channel_time(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETSCANCHANNELTIME, strlen(CMD_SETSCANCHANNELTIME)) == 0) { - bytes_written = wl_android_set_scan_channel_time(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETSCANHOMETIME, strlen(CMD_GETSCANHOMETIME)) == 0) { - bytes_written = wl_android_get_scan_home_time(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETSCANHOMETIME, strlen(CMD_SETSCANHOMETIME)) == 0) { - bytes_written = wl_android_set_scan_home_time(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETSCANHOMEAWAYTIME, strlen(CMD_GETSCANHOMEAWAYTIME)) == 0) { - bytes_written = wl_android_get_scan_home_away_time(net, command, - priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETSCANHOMEAWAYTIME, strlen(CMD_SETSCANHOMEAWAYTIME)) == 0) { - bytes_written = wl_android_set_scan_home_away_time(net, command, - priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETSCANNPROBES, strlen(CMD_GETSCANNPROBES)) == 0) { - bytes_written = wl_android_get_scan_nprobes(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETSCANNPROBES, strlen(CMD_SETSCANNPROBES)) == 0) { - bytes_written = wl_android_set_scan_nprobes(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETWESMODE, strlen(CMD_GETWESMODE)) == 0) { - bytes_written = wl_android_get_wes_mode(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETWESMODE, strlen(CMD_SETWESMODE)) == 0) { - bytes_written = wl_android_set_wes_mode(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_GETOKCMODE, strlen(CMD_GETOKCMODE)) == 0) { - bytes_written = wl_android_get_okc_mode(net, command, priv_cmd.total_len); - } - else if (strnicmp(command, CMD_SETOKCMODE, strlen(CMD_SETOKCMODE)) == 0) { - bytes_written = wl_android_set_okc_mode(net, command, priv_cmd.total_len); - } -#endif /* WES_SUPPORT */ #ifdef PNO_SUPPORT else if (strnicmp(command, CMD_PNOSSIDCLR_SET, strlen(CMD_PNOSSIDCLR_SET)) == 0) { bytes_written = dhd_dev_pno_reset(net); @@ -1769,11 +1113,9 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) bytes_written = wl_cfg80211_set_p2p_noa(net, command + skip, priv_cmd.total_len - skip); } -#if !defined WL_ENABLE_P2P_IF else if (strnicmp(command, CMD_P2P_GET_NOA, strlen(CMD_P2P_GET_NOA)) == 0) { bytes_written = wl_cfg80211_get_p2p_noa(net, command, priv_cmd.total_len); } -#endif /* WL_ENABLE_P2P_IF */ else if (strnicmp(command, CMD_P2P_SET_PS, strlen(CMD_P2P_SET_PS)) == 0) { int skip = strlen(CMD_P2P_SET_PS) + 1; bytes_written = wl_cfg80211_set_p2p_ps(net, command + skip, @@ -1787,38 +1129,34 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) priv_cmd.total_len - skip, *(command + skip - 2) - '0'); } #endif /* WL_CFG80211 */ -#if defined(SUPPORT_AUTO_CHANNEL) else if (strnicmp(command, CMD_SET_HAPD_AUTO_CHANNEL, - strlen(CMD_SET_HAPD_AUTO_CHANNEL)) == 0) { + strlen(CMD_SET_HAPD_AUTO_CHANNEL)) == 0) { int skip = strlen(CMD_SET_HAPD_AUTO_CHANNEL) + 3; +// wl_android_set_auto_channel(net, (const char*)command+skip, command, +// priv_cmd.total_len); bytes_written = wl_android_set_auto_channel(net, (const char*)command+skip, command, - priv_cmd.total_len); + priv_cmd.total_len); } -#endif -#if defined(SUPPORT_HIDDEN_AP) else if (strnicmp(command, CMD_SET_HAPD_MAX_NUM_STA, - strlen(CMD_SET_HAPD_MAX_NUM_STA)) == 0) { + strlen(CMD_SET_HAPD_MAX_NUM_STA)) == 0) { int skip = strlen(CMD_SET_HAPD_MAX_NUM_STA) + 3; wl_android_set_max_num_sta(net, (const char*)command+skip); } else if (strnicmp(command, CMD_SET_HAPD_SSID, - strlen(CMD_SET_HAPD_SSID)) == 0) { + strlen(CMD_SET_HAPD_SSID)) == 0) { int skip = strlen(CMD_SET_HAPD_SSID) + 3; wl_android_set_ssid(net, (const char*)command+skip); } else if (strnicmp(command, CMD_SET_HAPD_HIDE_SSID, - strlen(CMD_SET_HAPD_HIDE_SSID)) == 0) { + strlen(CMD_SET_HAPD_HIDE_SSID)) == 0) { int skip = strlen(CMD_SET_HAPD_HIDE_SSID) + 3; wl_android_set_hide_ssid(net, (const char*)command+skip); } -#endif /* SUPPORT_HIDDEN_AP */ -#if defined(SUPPORT_SOFTAP_SINGL_DISASSOC) else if (strnicmp(command, CMD_HAPD_STA_DISASSOC, - strlen(CMD_HAPD_STA_DISASSOC)) == 0) { + strlen(CMD_HAPD_STA_DISASSOC)) == 0) { int skip = strlen(CMD_HAPD_STA_DISASSOC) + 1; wl_android_sta_diassoc(net, (const char*)command+skip); } -#endif /* SUPPORT_SOFTAP_SINGL_DISASSOC */ #ifdef OKC_SUPPORT else if (strnicmp(command, CMD_OKC_SET_PMK, strlen(CMD_OKC_SET_PMK)) == 0) bytes_written = wl_android_set_pmk(net, command, priv_cmd.total_len); @@ -1838,19 +1176,21 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) #endif /* BCMCCX */ #ifdef SUPPORT_AMPDU_MPDU_CMD /* CMD_AMPDU_MPDU */ - else if (strnicmp(command, CMD_AMPDU_MPDU, strlen(CMD_AMPDU_MPDU)) == 0) { + else if (strnicmp(command, CMD_AMPDU_MPDU,strlen(CMD_AMPDU_MPDU)) == 0) { int skip = strlen(CMD_AMPDU_MPDU) + 1; bytes_written = wl_android_set_ampdu_mpdu(net, (const char*)command+skip); } -#endif /* SUPPORT_AMPDU_MPDU_CMD */ -#ifdef CUSTOMER_HW4 +#endif +#ifdef VSDB else if (strnicmp(command, CMD_CHANGE_RL, strlen(CMD_CHANGE_RL)) == 0) bytes_written = wl_android_ch_res_rl(net, true); else if (strnicmp(command, CMD_RESTORE_RL, strlen(CMD_RESTORE_RL)) == 0) bytes_written = wl_android_ch_res_rl(net, false); -#endif /* CUSTOMER_HW4 */ +#endif else { - DHD_ERROR(("Unknown PRIVATE command %s - ignored\n", command)); + if ((strnicmp(command, CMD_START, strlen(CMD_START)) != 0) && + (strnicmp(command, CMD_SETFWPATH, strlen(CMD_SETFWPATH)) != 0)) + DHD_ERROR(("Unknown PRIVATE command %s - ignored\n", command)); snprintf(command, 3, "OK"); bytes_written = strlen("OK"); } @@ -1887,16 +1227,16 @@ int wl_android_init(void) { int ret = 0; - dhd_msg_level |= DHD_ERROR_VAL; + dhd_msg_level = DHD_ERROR_VAL; #ifdef ENABLE_INSMOD_NO_FW_LOAD dhd_download_fw_on_driverload = FALSE; #endif /* ENABLE_INSMOD_NO_FW_LOAD */ -#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) +#if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW_SAMSUNG) if (!iface_name[0]) { memset(iface_name, 0, IFNAMSIZ); bcm_strncpy_s(iface_name, IFNAMSIZ, "wlan", IFNAMSIZ); } -#endif /* CUSTOMER_HW2 || CUSTOMER_HW4 */ +#endif /* CUSTOMER_HW2 || CUSTOMER_HW_SAMSUNG */ return ret; } @@ -1966,7 +1306,7 @@ void* wl_android_prealloc(int section, unsigned long size) if (alloc_ptr) { DHD_INFO(("success alloc section %d\n", section)); if (size != 0L) - bzero(alloc_ptr, size); + bzero(alloc_ptr, size); return alloc_ptr; } } @@ -2039,12 +1379,14 @@ static int wifi_probe(struct platform_device *pdev) struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data); + DHD_ERROR(("## %s\n", __FUNCTION__)); wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (wifi_irqres == NULL) wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); wifi_control_data = wifi_ctrl; - wifi_set_power(1, 0); /* Power On */ + + wifi_set_power(1, 200); /* Power On */ wifi_set_carddetect(1); /* CardDetect (0->1) */ up(&wifi_control_sem); @@ -2059,16 +1401,21 @@ static int wifi_remove(struct platform_device *pdev) DHD_ERROR(("## %s\n", __FUNCTION__)); wifi_control_data = wifi_ctrl; - wifi_set_power(0, WIFI_TURNOFF_DELAY); /* Power Off */ + wifi_set_power(0, 100); /* Power Off */ wifi_set_carddetect(0); /* CardDetect (1->0) */ up(&wifi_control_sem); return 0; } +int dhd_os_check_wakelock(void *dhdp); static int wifi_suspend(struct platform_device *pdev, pm_message_t state) { DHD_TRACE(("##> %s\n", __FUNCTION__)); +#if defined(BCMHOST) + if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) + return -EBUSY; +#endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY) && 1 bcmsdh_oob_intr_set(0); #endif /* (OOB_INTR_ONLY) */ diff --git a/drivers/net/wireless/bcmdhd/wl_android.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.h index 583a167..5b36049 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_android.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_android.h @@ -1,14 +1,14 @@ /* * Linux cfg80211 driver - Android related functions * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.c index fdc525a..e3bb3e4 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.c @@ -2,13 +2,13 @@ * Linux cfg80211 driver * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.c 354524 2012-08-31 12:10:27Z $ + * $Id: wl_cfg80211.c 310409 2012-01-24 18:47:09Z $ */ #include <typedefs.h> @@ -54,16 +54,22 @@ #include <linux/wait.h> #include <net/cfg80211.h> #include <net/rtnetlink.h> + #include <wlioctl.h> #include <wldev_common.h> #include <wl_cfg80211.h> #include <wl_cfgp2p.h> -#ifdef WL11U -#ifndef WL_ENABLE_P2P_IF -#error "You should enable WL_ENABLE_P2P_IF and Only supported in JB" -#endif -#endif /* WL11U */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#define DAEMONIZE(a) daemonize(a); \ + allow_signal(SIGKILL); \ +allow_signal(SIGTERM); +#else /* Linux 2.4 (w/o preemption patch) */ +#define DAEMONIZE(a) daemonize(); \ + do { if (a) \ + strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a) + 1))); \ + } while (0); +#endif /* LINUX_VERSION_CODE */ #ifdef BCMWAPI_WPI /* these items should evetually go into wireless.h of the linux system headfile dir */ @@ -98,21 +104,25 @@ #define IW_WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) #endif /* BCMWAPI_WPI */ + static struct device *cfg80211_parent_dev = NULL; +static int vsdb_supported = 0; struct wl_priv *wlcfg_drv_priv = NULL; -#ifdef CUSTOMER_HW4 -u32 wl_dbg_level = WL_DBG_ERR | WL_DBG_P2P_ACTION; -#else + u32 wl_dbg_level = WL_DBG_ERR; -#endif +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" #define MAX_WAIT_TIME 1500 +#define WL_SCAN_ACTIVE_TIME 40 /* ms : Embedded default Active setting from DHD Driver */ +#define WL_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD Driver */ #ifdef VSDB -/* sleep time to keep STA's connecting or connection for continuous af tx or finding a peer */ +/* ms : default wait time to keep STA's connecting or connection during continuous af tx */ #define DEFAULT_SLEEP_TIME_VSDB 200 +#define WL_CHANNEL_SYNC_RETRY_VSDB 3 -/* if sta is connected or connecting, sleep for a while before retry af tx or finding a peer */ +/* if sta is connected or connecting, sleep for a while before retry for VSDB */ #define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl) \ do { \ if (wl_get_drv_status(wl, CONNECTED, wl_to_prmry_ndev(wl)) || \ @@ -120,25 +130,27 @@ u32 wl_dbg_level = WL_DBG_ERR; msleep(DEFAULT_SLEEP_TIME_VSDB); \ } \ } while (0) +#define WL_AF_TX_REDUCE_RETRY_VSDB(wl, max_retry) #else /* VSDB */ /* if not VSDB, do nothing */ #define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl) +#define WL_AF_TX_REDUCE_RETRY_VSDB(wl, max_retry) #endif /* VSDB */ -#ifdef WL_CFG80211_SYNC_GON -#define WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl) \ - (wl_get_drv_status_all(wl, SENDING_ACT_FRM) || \ - wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) -#else -#define WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl) wl_get_drv_status_all(wl, SENDING_ACT_FRM) -#endif /* WL_CFG80211_SYNC_GON */ - +#ifdef D11AC_IOTYPES #define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL - +#endif /* D11AC_IOTYPES */ #define DNGL_FUNC(func, parameters) func parameters; #define COEX_DHCP +#define WLAN_EID_SSID 0 + +/* Set this to 1 to use a seperate interface (p2p0) + * for p2p operations. + */ +#define ENABLE_P2P_INTERFACE 0 + /* This is to override regulatory domains defined in cfg80211 module (reg.c) * By default world regulatory domain defined in reg.c puts the flags NL80211_RRF_PASSIVE_SCAN * and NL80211_RRF_NO_IBSS for 5GHz channels (for 36..48 and 149..165). @@ -146,16 +158,20 @@ u32 wl_dbg_level = WL_DBG_ERR; * All the chnages in world regulatory domain are to be done here. */ static const struct ieee80211_regdomain brcm_regdom = { - .n_reg_rules = 4, + .n_reg_rules = 5, .alpha2 = "99", .reg_rules = { /* IEEE 802.11b/g, channels 1..11 */ - REG_RULE(2412-10, 2472+10, 40, 6, 20, 0), - /* If any */ + REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), + /* IEEE 802.11b/g, channels 12..13. No HT40 + * channel fits here. + */ + REG_RULE(2467-10, 2472+10, 20, 6, 20, 0), /* IEEE 802.11 channel 14 - Only JP enables * this and for 802.11b only */ REG_RULE(2484-10, 2484+10, 20, 6, 20, 0), + /* IEEE 802.11a, channel 36..64 */ REG_RULE(5150-10, 5350+10, 40, 6, 20, 0), /* IEEE 802.11a, channel 100..165 */ @@ -198,7 +214,6 @@ static const struct ieee80211_regdomain brcm_regdom = { #define PM_BLOCK 1 #define PM_ENABLE 0 - #ifdef BCMCCX #ifndef WLAN_AKM_SUITE_CCKM #define WLAN_AKM_SUITE_CCKM 0x000FAC04 @@ -206,9 +221,6 @@ static const struct ieee80211_regdomain brcm_regdom = { #define DOT11_LEAP_AUTH 0x80 /* LEAP auth frame paylod constants */ #endif /* BCMCCX */ -#ifndef RSSI_OFFSET -#define RSSI_OFFSET 0 -#endif /* * cfg80211_ops api/callback list */ @@ -265,8 +277,7 @@ static s32 wl_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_pmksa *pmksa); static s32 wl_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *dev); -static s32 wl_notify_escan_complete(struct wl_priv *wl, - struct net_device *ndev, bool aborted, bool fw_abort); +static void wl_notify_escan_complete(struct wl_priv *wl, struct net_device *ndev, bool aborted); /* * event & event Q handlers for cfg80211 interfaces */ @@ -341,7 +352,7 @@ static s32 wl_set_set_sharedkey(struct net_device *dev, struct cfg80211_connect_params *sme); #ifdef BCMWAPI_WPI static s32 wl_set_set_wapi_ie(struct net_device *dev, - struct cfg80211_connect_params *sme); + struct cfg80211_connect_params *sme); #endif static s32 wl_get_assoc_ies(struct wl_priv *wl, struct net_device *ndev); static void wl_ch_to_chanspec(int ch, @@ -356,20 +367,13 @@ static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size); static s32 wl_cp_ie(struct wl_priv *wl, u8 *dst, u16 dst_size); static u32 wl_get_ielen(struct wl_priv *wl); -#ifdef WL11U -bcm_tlv_t * -wl_cfg80211_find_interworking_ie(u8 *parse, u32 len); -static s32 -wl_cfg80211_add_iw_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s32 pktflag, - uint8 ie_id, uint8 *data, uint8 data_len); -#endif /* WL11U */ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *dev); static void wl_free_wdev(struct wl_priv *wl); static s32 wl_inform_bss(struct wl_priv *wl); -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi); -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev); +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done); +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done); static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy); static s32 wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, @@ -408,6 +412,7 @@ static void wl_link_down(struct wl_priv *wl); static s32 wl_config_ifmode(struct wl_priv *wl, struct net_device *ndev, s32 iftype); static void wl_init_conf(struct wl_conf *conf); + /* * iscan handler */ @@ -452,29 +457,25 @@ int dhd_del_monitor(struct net_device *ndev); int dhd_monitor_init(void *dhd_pub); int dhd_monitor_uninit(void); int dhd_start_xmit(struct sk_buff *skb, struct net_device *net); - #ifdef ROAM_CHANNEL_CACHE void reset_roam_cache(void); void add_roam_cache(wl_bss_info_t *bi); -int get_roam_channel_list(int target_chan, - chanspec_t *channels, const wlc_ssid_t *ssid, int ioctl_ver); +int get_roam_channel_list(int target_chan, chanspec_t *channels, const wlc_ssid_t *ssid); void print_roam_cache(void); void set_roam_band(int band); #endif - - -#define CHECK_SYS_UP(wlpriv) \ +#define CHECK_SYS_UP(wlpriv) \ do { \ - struct net_device *ndev = wl_to_prmry_ndev(wlpriv); \ + struct net_device *ndev = wl_to_prmry_ndev(wlpriv); \ if (unlikely(!wl_get_drv_status(wlpriv, READY, ndev))) { \ - WL_INFO(("device is not ready\n")); \ + WL_INFO(("device is not ready\n")); \ return -EIO; \ } \ } while (0) -#define IS_WPA_AKM(akm) ((akm) == RSN_AKM_NONE || \ - (akm) == RSN_AKM_UNSPECIFIED || \ +#define IS_WPA_AKM(akm) ((akm) == RSN_AKM_NONE || \ + (akm) == RSN_AKM_UNSPECIFIED || \ (akm) == RSN_AKM_PSK) @@ -483,7 +484,7 @@ extern int dhd_wait_pend8021x(struct net_device *dev); extern int disable_proptx; extern int dhd_wlfc_init(dhd_pub_t *dhd); extern void dhd_wlfc_deinit(dhd_pub_t *dhd); -#endif /* PROP_TXSTATUS */ +#endif #if (WL_DBG_LEVEL > 0) #define WL_DBG_ESTR_MAX 50 @@ -599,7 +600,22 @@ static struct ieee80211_supported_band __wl_band_2ghz = { .channels = __wl_2ghz_channels, .n_channels = ARRAY_SIZE(__wl_2ghz_channels), .bitrates = wl_g_rates, - .n_bitrates = wl_g_rates_size + .n_bitrates = wl_g_rates_size, +#if (ENABLE_P2P_INTERFACE) + /* wpa_supplicant sets wmm_enabled based on whether ht_cap + * is present or not. The wmm_enabled is inturn used to + * set the replay counters in the RSN IE. Without this + * the 4way handshake will fail complaining that IE in beacon + * doesn't match with the IE present in the 3/4 EAPOL msg. + */ + .ht_cap = { + IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU, + .ht_supported = TRUE, + .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, + .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 + } +#endif }; static struct ieee80211_supported_band __wl_band_5ghz_a = { @@ -607,7 +623,22 @@ static struct ieee80211_supported_band __wl_band_5ghz_a = { .channels = __wl_5ghz_a_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_a_channels), .bitrates = wl_a_rates, - .n_bitrates = wl_a_rates_size + .n_bitrates = wl_a_rates_size, +#if (ENABLE_P2P_INTERFACE) + /* wpa_supplicant sets wmm_enabled based on whether ht_cap + * is present or not. The wmm_enabled is inturn used to + * set the replay counters in the RSN IE. Without this + * the 4way handshake will fail complaining that IE in beacon + * doesn't match with the IE present in the 3/4 EAPOL msg. + */ + .ht_cap = { + IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU, + .ht_supported = TRUE, + .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, + .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 + } +#endif }; static const u32 __wl_cipher_suites[] = { @@ -628,6 +659,8 @@ static const u32 __wl_cipher_suites[] = { /* IOCtl version read from targeted driver */ static int ioctl_version; +#ifdef D11AC_IOTYPES + /* Return a new chanspec given a legacy chanspec * Returns INVCHANSPEC on error */ @@ -733,29 +766,6 @@ wl_chspec_host_to_driver(chanspec_t chanspec) return chanspec; } -/* given a channel value, do the endian and chanspec version conversion to - * a chanspec_t value - * Returns INVCHANSPEC on error - */ -chanspec_t -wl_ch_host_to_driver(u16 channel) -{ - - chanspec_t chanspec; - - chanspec = channel & WL_CHANSPEC_CHAN_MASK; - - if (channel <= CH_MAX_2G_CHANNEL) - chanspec |= WL_CHANSPEC_BAND_2G; - else - chanspec |= WL_CHANSPEC_BAND_5G; - - chanspec |= WL_CHANSPEC_BW_20; - chanspec |= WL_CHANSPEC_CTL_SB_NONE; - - return wl_chspec_host_to_driver(chanspec); -} - /* given a chanspec value from the driver, do the endian and chanspec version conversion to * a chanspec_t value * Returns INVCHANSPEC on error @@ -771,6 +781,22 @@ wl_chspec_driver_to_host(chanspec_t chanspec) return chanspec; } +#else /* not D11AC_IOTYPES */ +#ifndef ROAM_CHANNEL_CACHE +static chanspec_t +wl_chspec_host_to_driver(chanspec_t chanspec) +{ + return htodchanspec(chanspec); +} +#endif +static chanspec_t +wl_chspec_driver_to_host(chanspec_t chanspec) +{ + return dtohchanspec(chanspec); +} + +#endif /* D11AC_IOTYPES */ + /* There isn't a lot of sense in it, but you can transmit anything you like */ static const struct ieee80211_txrx_stypes wl_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { @@ -843,31 +869,22 @@ static void swap_key_to_BE(struct wl_wsec_key *key) key->iv_initialized = dtoh32(key->iv_initialized); } -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) /* For debug: Dump the contents of the encoded wps ie buffe */ static void -wl_validate_wps_ie(char *wps_ie, s32 wps_ie_len, bool *pbc) +wl_validate_wps_ie(char *wps_ie, bool *pbc) { #define WPS_IE_FIXED_LEN 6 - u16 len; - u8 *subel = NULL; + u16 len = (u16) wps_ie[TLV_LEN_OFF]; + u8 *subel = wps_ie+ WPS_IE_FIXED_LEN; u16 subelt_id; u16 subelt_len; u16 val; u8 *valptr = (uint8*) &val; - if (wps_ie == NULL || wps_ie_len < WPS_IE_FIXED_LEN) { - WL_ERR(("invalid argument : NULL\n")); - return; - } - len = (u16)wps_ie[TLV_LEN_OFF]; - if (len > wps_ie_len) { - WL_ERR(("invalid length len %d, wps ie len %d\n", len, wps_ie_len)); - return; - } WL_DBG(("wps_ie len=%d\n", len)); + len -= 4; /* for the WPS IE's OUI, oui_type fields */ - subel = wps_ie + WPS_IE_FIXED_LEN; + while (len >= 4) { /* must have attr id, attr len fields */ valptr[0] = *subel++; valptr[1] = *subel++; @@ -927,10 +944,13 @@ wl_validate_wps_ie(char *wps_ie, s32 wps_ie_len, bool *pbc) subel += subelt_len; } } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) { + if (vsdb_supported) { + return wf_chspec_aton(WL_P2P_TEMP_CHAN); + } + else { chanspec_t chspec; int err = 0; struct wl_priv *wl = wiphy_priv(wiphy); @@ -944,7 +964,7 @@ static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) * via set_channel (cfg80211 API). */ WL_DBG(("Not associated. Return a temp channel. \n")); - return wl_ch_host_to_driver(WL_P2P_TEMP_CHAN); + return wf_chspec_aton(WL_P2P_TEMP_CHAN); } @@ -952,28 +972,25 @@ static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) if ((err = wldev_ioctl(dev, WLC_GET_BSS_INFO, wl->extra_buf, WL_EXTRA_BUF_MAX, false))) { WL_ERR(("Failed to get associated bss info, use temp channel \n")); - chspec = wl_ch_host_to_driver(WL_P2P_TEMP_CHAN); + chspec = wf_chspec_aton(WL_P2P_TEMP_CHAN); } else { bss = (struct wl_bss_info *) (wl->extra_buf + 4); chspec = bss->chanspec; - WL_DBG(("Valid BSS Found. chanspec:%d \n", bss->chanspec)); + WL_DBG(("Valid BSS Found. chanspec:%d \n", bss->chanspec)); } + return chspec; + } } static struct net_device* wl_cfg80211_add_monitor_if(char *name) { -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) - WL_INFO(("wl_cfg80211_add_monitor_if: No more support monitor interface\n")); - return ERR_PTR(-EOPNOTSUPP); -#else struct net_device* ndev = NULL; dhd_add_monitor(name, &ndev); WL_INFO(("wl_cfg80211_add_monitor_if net device returned: 0x%p\n", ndev)); return ndev; -#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ } static struct net_device * @@ -986,9 +1003,6 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, s32 wlif_type = -1; s32 mode = 0; s32 val = 0; -#if defined(WL_ENABLE_P2P_IF) - s32 dhd_mode = 0; -#endif /* (WL_ENABLE_P2P_IF) */ chanspec_t chspec; struct wl_priv *wl = wiphy_priv(wiphy); struct net_device *_ndev; @@ -999,16 +1013,13 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, s32 up = 1; dhd_pub_t *dhd; #endif /* PROP_TXSTATUS */ - if (!wl) return ERR_PTR(-EINVAL); - #ifdef PROP_TXSTATUS dhd = (dhd_pub_t *)(wl->pub); #endif /* PROP_TXSTATUS */ - - /* Use primary I/F for sending cmds down to firmware */ + /* Use primary I/F for to send commands down */ _ndev = wl_to_prmry_ndev(wl); WL_DBG(("if name: %s, type: %d\n", name, type)); @@ -1042,6 +1053,8 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, WL_ERR(("name is NULL\n")); return NULL; } + if (wl->iface_cnt == IFACE_MAX_CNT) + return ERR_PTR(-ENOMEM); if (wl->p2p_supported && (wlif_type != -1)) { if (wl_get_p2p_status(wl, IF_DELETING)) { /* wait till IF_DEL is complete @@ -1069,21 +1082,14 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, WL_ERR(("timeount < 0, return -EAGAIN\n")); return ERR_PTR(-EAGAIN); } - /* It should be now be safe to put this check here since we are sure - * by now netdev_notifier (unregister) would have been called - */ - if (wl->iface_cnt == IFACE_MAX_CNT) - return ERR_PTR(-ENOMEM); } - #ifdef PROP_TXSTATUS if (!dhd) return ERR_PTR(-ENODEV); -#endif /* PROP_TXSTATUS */ +#endif if (!wl->p2p || !wl->p2p->vir_ifname) return ERR_PTR(-ENODEV); - - if (wl->p2p && !wl->p2p->on && strstr(name, WL_P2P_INTERFACE_PREFIX)) { + if (!wl->p2p->on && strstr(name, WL_P2P_INTERFACE_PREFIX)) { p2p_on(wl) = true; wl_cfgp2p_set_firm_p2p(wl); wl_cfgp2p_init_discovery(wl); @@ -1094,8 +1100,8 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, memset(wl->p2p->vir_ifname, 0, IFNAMSIZ); strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1); - - wl_notify_escan_complete(wl, _ndev, true, true); + WL_SCAN2((" Scan Abort %p(id %d)\n", _ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, _ndev); #ifdef PROP_TXSTATUS if (!wl->wlfc_on && !disable_proptx) { dhd->wlfc_enabled = true; @@ -1105,7 +1111,7 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, WL_ERR(("WLC_UP return err:%d\n", err)); wl->wlfc_on = true; } -#endif /* PROP_TXSTATUS */ +#endif /* In concurrency case, STA may be already associated in a particular channel. * so retrieve the current channel of primary interface and then start the virtual @@ -1139,7 +1145,7 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, } vwdev->wiphy = wl->wdev->wiphy; WL_INFO((" virtual interface(%s) is created memalloc done \n", - wl->p2p->vir_ifname)); + wl->p2p->vir_ifname)); vwdev->iftype = type; _ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); _ndev->ieee80211_ptr = vwdev; @@ -1154,25 +1160,14 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, rollback_lock = true; } if (net_attach && !net_attach(wl->pub, _ndev->ifindex)) { -#ifdef CUSTOMER_HW4 wl_alloc_netinfo(wl, _ndev, vwdev, mode, PM_BLOCK); -#else - wl_alloc_netinfo(wl, _ndev, vwdev, mode, PM_ENABLE); -#endif /* CUSTOMER_HW4 */ + WL_DBG((" virtual interface(%s) is " + "created net attach done\n", wl->p2p->vir_ifname)); val = 1; /* Disable firmware roaming for P2P interface */ wldev_iovar_setint(_ndev, "roam_off", val); - WL_ERR((" virtual interface(%s) is " - "created net attach done\n", wl->p2p->vir_ifname)); if (mode == WL_MODE_AP) wl_set_drv_status(wl, CONNECTED, _ndev); -#if defined(WL_ENABLE_P2P_IF) - if (type == NL80211_IFTYPE_P2P_CLIENT) - dhd_mode = P2P_GC_ENABLED; - else if (type == NL80211_IFTYPE_P2P_GO) - dhd_mode = P2P_GO_ENABLED; - DNGL_FUNC(dhd_cfg80211_set_p2p_info, (wl, dhd_mode)); -#endif /* (WL_ENABLE_P2P_IF) */ } else { /* put back the rtnl_lock again */ if (rollback_lock) @@ -1190,12 +1185,12 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); wl->p2p->vif_created = false; #ifdef PROP_TXSTATUS - if (dhd->wlfc_enabled && wl->wlfc_on) { - dhd->wlfc_enabled = false; - dhd_wlfc_deinit(dhd); - wl->wlfc_on = false; - } -#endif /* PROP_TXSTATUS */ + if (dhd->wlfc_enabled && wl->wlfc_on) { + dhd->wlfc_enabled = false; + dhd_wlfc_deinit(dhd); + wl->wlfc_on = false; + } +#endif } } fail: @@ -1212,24 +1207,19 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) s32 timeout = -1; s32 ret = 0; WL_DBG(("Enter\n")); - + WL_SCAN2(("Enter\n")); if (wl->p2p_net == dev) { - /* Since there is no ifidx corresponding to p2p0, cmds to - * firmware should be routed through primary I/F + /* Since there is no ifidx corresponding to p2p0, + * all commands should be routed through primary I/F */ dev = wl_to_prmry_ndev(wl); } if (wl->p2p_supported) { memcpy(p2p_mac.octet, wl->p2p->int_addr.octet, ETHER_ADDR_LEN); - - /* Clear GO_NEG_PHASE bit to take care of GO-NEG-FAIL cases - */ - WL_DBG(("P2P: GO_NEG_PHASE status cleared ")); - wl_clr_p2p_status(wl, GO_NEG_PHASE); if (wl->p2p->vif_created) { if (wl_get_drv_status(wl, SCANNING, dev)) { - wl_notify_escan_complete(wl, dev, true, true); + wl_cfg80211_scan_abort(wl, dev); } wldev_iovar_setint(dev, "mpc", 1); @@ -1237,25 +1227,18 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) if (wl_get_drv_status(wl, DISCONNECTING, dev) && (wl_get_mode_by_netdev(wl, dev) != WL_MODE_AP)) { WL_ERR(("Wait for Link Down event for GC !\n")); - wait_for_completion_timeout - (&wl->iface_disable, msecs_to_jiffies(500)); + wait_for_completion_timeout(&wl->iface_disable, msecs_to_jiffies(500)); } wl_set_p2p_status(wl, IF_DELETING); -#if defined(WL_ENABLE_P2P_IF) - DNGL_FUNC(dhd_cfg80211_clean_p2p_info, (wl)); -#endif /* (WL_ENABLE_P2P_IF)) */ /* for GO */ if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { /* disable interface before bsscfg free */ ret = wl_cfgp2p_ifdisable(wl, &p2p_mac); - /* if fw doesn't support "ifdis", - do not wait for link down of ap mode - */ + /* if fw doesn't support "ifdis", do not wait for link down of ap mode */ if (ret == 0) { WL_ERR(("Wait for Link Down event for GO !!!\n")); - wait_for_completion_timeout(&wl->iface_disable, - msecs_to_jiffies(500)); + wait_for_completion_timeout(&wl->iface_disable, msecs_to_jiffies(500)); } else { msleep(300); } @@ -1275,11 +1258,12 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) "HANG Notification sent to %s\n", ret, ndev->name)); wl_cfg80211_hang(ndev, WLAN_REASON_UNSPECIFIED); } - /* Wait for IF_DEL operation to be finished in firmware */ + + /* Wait for any pending scan req to get aborted from the sysioc context */ timeout = wait_event_interruptible_timeout(wl->netif_change_event, - (wl->p2p->vif_created == false), + (wl_get_p2p_status(wl, IF_DELETING) == false), msecs_to_jiffies(MAX_WAIT_TIME)); - if (timeout > 0 && (wl->p2p->vif_created == false)) { + if (timeout > 0 && !wl_get_p2p_status(wl, IF_DELETING)) { WL_DBG(("IFDEL operation done\n")); } else { WL_ERR(("IFDEL didn't complete properly\n")); @@ -1287,6 +1271,7 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) ret = dhd_del_monitor(dev); } } + WL_SCAN2(("Exit\n")); return ret; } @@ -1302,7 +1287,7 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, chanspec_t chspec; struct wl_priv *wl = wiphy_priv(wiphy); - WL_DBG(("Enter type %d\n", type)); + WL_DBG(("Enter \n")); switch (type) { case NL80211_IFTYPE_MONITOR: case NL80211_IFTYPE_WDS: @@ -1335,17 +1320,17 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, WL_DBG(("p2p_vif_created (%d) p2p_on (%d)\n", wl->p2p->vif_created, p2p_on(wl))); wldev_iovar_setint(ndev, "mpc", 0); - wl_notify_escan_complete(wl, ndev, true, true); - /* In concurrency case, STA may be already associated in a particular * channel. so retrieve the current channel of primary interface and * then start the virtual interface on that. */ + WL_SCAN2(("Scan Abort %p(id %d)\n", ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, ndev); chspec = wl_cfg80211_get_shared_freq(wiphy); wlif_type = WL_P2P_IF_GO; - WL_ERR(("%s : ap (%d), infra (%d), iftype: (%d)\n", - ndev->name, ap, infra, type)); + WL_ERR(("%s : ap (%d), infra (%d), iftype: (%d), chspec: (0x%04x)\n", + ndev->name, ap, infra, type, chspec)); wl_set_p2p_status(wl, IF_CHANGING); wl_clr_p2p_status(wl, IF_CHANGED); wl_cfgp2p_ifchange(wl, &wl->p2p->int_addr, htod32(wlif_type), chspec); @@ -1369,8 +1354,6 @@ wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, WL_ERR(("Cannot change the interface for GO or SOFTAP\n")); return -EINVAL; } - } else { - WL_DBG(("Change_virtual_iface for transition from GO/AP to client/STA")); } ndev->ieee80211_ptr->iftype = type; @@ -1383,7 +1366,6 @@ wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, { struct wl_priv *wl = wlcfg_drv_priv; s32 ret = BCME_OK; - WL_DBG(("Enter")); if (!ndev) { WL_ERR(("net is NULL\n")); return 0; @@ -1407,18 +1389,7 @@ wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, } s32 -wl_cfg80211_notify_ifdel(void) -{ - struct wl_priv *wl = wlcfg_drv_priv; - - WL_DBG(("Enter \n")); - wl_clr_p2p_status(wl, IF_DELETING); - wake_up_interruptible(&wl->netif_change_event); - return 0; -} - -s32 -wl_cfg80211_ifdel_ops(struct net_device *ndev) +wl_cfg80211_notify_ifdel(struct net_device *ndev) { struct wl_priv *wl = wlcfg_drv_priv; bool rollback_lock = false; @@ -1426,6 +1397,7 @@ wl_cfg80211_ifdel_ops(struct net_device *ndev) #ifdef PROP_TXSTATUS dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); #endif /* PROP_TXSTATUS */ + if (!ndev || (strlen(ndev->name) == 0)) { WL_ERR(("net is NULL\n")); return 0; @@ -1442,13 +1414,16 @@ wl_cfg80211_ifdel_ops(struct net_device *ndev) rollback_lock = true; } WL_DBG(("ESCAN COMPLETED\n")); - wl_notify_escan_complete(wl, ndev, true, false); + WL_SCAN2(("Send Notify Complete %p(id %d)\n", + ndev, wl->escan_info.cur_sync_id)); + wl_notify_escan_complete(wl, ndev, true); if (rollback_lock) rtnl_unlock(); } WL_ERR(("IF_DEL event called from dongle, net %x, vif name: %s\n", (unsigned int)ndev, wl->p2p->vir_ifname)); + wl->first_remain = true; memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); index = wl_cfgp2p_find_idx(wl, ndev); wl_to_p2p_bss_ndev(wl, index) = NULL; @@ -1456,6 +1431,7 @@ wl_cfg80211_ifdel_ops(struct net_device *ndev) wl->p2p->vif_created = false; wl_cfgp2p_clear_management_ie(wl, index); + wl_clr_p2p_status(wl, IF_DELETING); WL_DBG(("index : %d\n", index)); #ifdef PROP_TXSTATUS if (dhd->wlfc_enabled && wl->wlfc_on) { @@ -1463,7 +1439,7 @@ wl_cfg80211_ifdel_ops(struct net_device *ndev) dhd_wlfc_deinit(dhd); wl->wlfc_on = false; } -#endif /* PROP_TXSTATUS */ +#endif wl_clr_drv_status(wl, CONNECTED, ndev); } /* Wake up any waiting thread */ @@ -1504,13 +1480,16 @@ wl_cfg80211_notify_ifchange(void) return 0; } -/* Find listen channel */ -static s32 wl_find_listen_channel(struct wl_priv *wl, + +/* Find my listen channel value in my GON Req frame, + * Save my listen channel for channel sync + */ +static s32 wl_find_my_listen_channel(struct wl_priv *wl, u8 *ie, u32 ie_len) { wifi_p2p_ie_t *p2p_ie; u8 *end, *pos; - s32 listen_channel; + s32 my_listen_channel; p2p_ie = wl_cfgp2p_find_p2pie(ie, ie_len); @@ -1538,20 +1517,18 @@ static s32 wl_find_listen_channel(struct wl_priv *wl, return 0; } - /* if Listen Channel att id is 6 and the vailue is valid, - * return the listen channel - */ + /* if Listen Channel att id is 6, save my listen channel */ if (pos[0] == 6) { /* listen channel subel length format * 1(id) + 2(len) + 3(country) + 1(op. class) + 1(chan num) */ - listen_channel = pos[1 + 2 + 3 + 1]; + my_listen_channel = pos[1 + 2 + 3 + 1]; - if (listen_channel == SOCIAL_CHAN_1 || - listen_channel == SOCIAL_CHAN_2 || - listen_channel == SOCIAL_CHAN_3) { - CFGP2P_DBG((" Found my Listen Channel %d \n", listen_channel)); - return listen_channel; + if (my_listen_channel == SOCIAL_CHAN_1 || + my_listen_channel == SOCIAL_CHAN_2 || + my_listen_channel == SOCIAL_CHAN_3) { + CFGP2P_DBG((" Found my Listen Channel %d \n", my_listen_channel)); + return my_listen_channel; } } pos += 3 + attr_len; @@ -1559,22 +1536,23 @@ static s32 wl_find_listen_channel(struct wl_priv *wl, return 0; } -static void wl_scan_prep(struct wl_scan_params *params, struct cfg80211_scan_request *request) +static void wl_scan_prep(struct wl_scan_params *params, + struct cfg80211_scan_request *request, int32 active_time) { u32 n_ssids; u32 n_channels; u16 channel; chanspec_t chanspec; - s32 i = 0, offset; + s32 i = 0; + s32 offset; char *ptr; wlc_ssid_t ssid; struct wl_priv *wl = wlcfg_drv_priv; - memcpy(¶ms->bssid, ðer_bcast, ETHER_ADDR_LEN); params->bss_type = DOT11_BSSTYPE_ANY; params->scan_type = 0; params->nprobes = -1; - params->active_time = -1; + params->active_time = active_time; params->passive_time = -1; params->home_time = -1; params->channel_num = 0; @@ -1591,7 +1569,6 @@ static void wl_scan_prep(struct wl_scan_params *params, struct cfg80211_scan_req params->active_time = htod32(params->active_time); params->passive_time = htod32(params->passive_time); params->home_time = htod32(params->home_time); - /* if request is null just exit so it will be all channel broadcast scan */ if (!request) return; @@ -1607,8 +1584,7 @@ static void wl_scan_prep(struct wl_scan_params *params, struct cfg80211_scan_req channel = ieee80211_frequency_to_channel(request->channels[i]->center_freq); /* SKIP DFS channels for Secondary interface */ if ((wl->escan_info.ndev != wl_to_prmry_ndev(wl)) && - (request->channels[i]->flags & - (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_PASSIVE_SCAN))) + (request->channels[i]->flags & (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_PASSIVE_SCAN))) continue; if (request->channels[i]->band == IEEE80211_BAND_2GHZ) @@ -1624,7 +1600,7 @@ static void wl_scan_prep(struct wl_scan_params *params, struct cfg80211_scan_req params->channel_list[i] |= chanspec; WL_SCAN(("Chan : %d, Channel spec: %x \n", channel, params->channel_list[i])); - params->channel_list[i] = wl_chspec_host_to_driver(params->channel_list[i]); + params->channel_list[i] = htod16(params->channel_list[i]); } } else { WL_SCAN(("Scanning all channels\n")); @@ -1671,27 +1647,29 @@ wl_run_iscan(struct wl_iscan_ctrl *iscan, struct cfg80211_scan_request *request, struct wl_iscan_params *params = NULL; s32 err = 0; - if (request == NULL) { + if (!request) { err = -EINVAL; goto done; - } - n_channels = request->n_channels; - n_ssids = request->n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - if (n_channels % 2) - /* If n_channels is odd, add a padd of u16 */ - params_size += sizeof(u16) * (n_channels + 1); - else - params_size += sizeof(u16) * n_channels; + }else { + n_channels = request->n_channels; + n_ssids = request->n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + if (n_channels % 2) + /* If n_channels is odd, add a padd of u16 */ + params_size += sizeof(u16) * (n_channels + 1); + else + params_size += sizeof(u16) * n_channels; - /* Allocate space for populating ssids in wl_iscan_params struct */ - params_size += sizeof(struct wlc_ssid) * n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + params_size += sizeof(struct wlc_ssid) * n_ssids; + } params = (struct wl_iscan_params *)kzalloc(params_size, GFP_KERNEL); if (!params) { err = -ENOMEM; goto done; } - wl_scan_prep(¶ms->params, request); + + wl_scan_prep(¶ms->params, request, -1); params->version = htod32(ISCAN_REQ_VERSION); params->action = htod16(action); @@ -1711,7 +1689,6 @@ wl_run_iscan(struct wl_iscan_ctrl *iscan, struct cfg80211_scan_request *request, WL_ERR(("error (%d)\n", err)); } } - done: if (params) kfree(params); @@ -1736,7 +1713,7 @@ static s32 wl_do_iscan(struct wl_priv *wl, struct cfg80211_scan_request *request } wl->iscan_kickstart = true; wl_run_iscan(iscan, request, WL_SCAN_ACTION_START); - mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); + mod_timer(&iscan->timer, jiffies + iscan->timer_ms * HZ / 1000); iscan->timer_on = 1; return err; @@ -1760,10 +1737,10 @@ wl_get_valid_channels(struct net_device *ndev, u8 *valid_chan_list, s32 size) return err; } -#ifdef USE_INITIAL_2G_SCAN +#ifdef USE_INITIAL_2G_SCAN_ORG #define FIRST_SCAN_ACTIVE_DWELL_TIME_MS 40 static bool g_first_broadcast_scan = TRUE; -#endif /* USE_INITIAL_2G_SCAN */ +#endif /* USE_INITIAL_2G_SCAN_ORG */ static s32 wl_run_escan(struct wl_priv *wl, struct net_device *ndev, @@ -1774,6 +1751,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, u32 n_ssids; s32 params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_escan_params_t, params)); wl_escan_params_t *params = NULL; + u8 chan_buf[sizeof(u32)*(WL_NUMCHANNELS + 1)]; u32 num_chans = 0; s32 channel; @@ -1783,82 +1761,76 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, u16 *default_chan_list = NULL; wl_uint32_list_t *list; struct net_device *dev = NULL; -#ifdef USE_INITIAL_2G_SCAN - bool is_first_init_2g_scan = false; -#endif /* USE_INITIAL_2G_SCAN */ WL_DBG(("Enter \n")); if (!request || !wl) { err = -EINVAL; goto exit; } + if (!wl->p2p_supported) + WL_SCAN2(("P2P is not supported\n")); + else + WL_SCAN2(("P2P is supported, ndev is %s, " + "p2p_scan ? %s, p2p_is_on ? %s\n", + (ndev == wl_to_prmry_ndev(wl)) ? "Primary" : "P2P", + p2p_scan(wl) ? "YES" : "NO", + p2p_is_on(wl) ? "YES" : "NO")); + if (!wl->p2p_supported || !p2p_scan(wl)) { + s32 active_time = -1; + /* LEGACY SCAN TRIGGER */ WL_SCAN((" LEGACY E-SCAN START\n")); -#ifdef USE_INITIAL_2G_SCAN - if (ndev == wl_to_prmry_ndev(wl) && g_first_broadcast_scan == true) { - j = 0; - if (!wl_get_valid_channels(ndev, chan_buf, sizeof(chan_buf))) { - list = (wl_uint32_list_t *) chan_buf; - n_valid_chan = dtoh32(list->count); - for (i = 0; i < n_valid_chan && request->n_channels > j; - i++) { -#if defined(BCM4334_CHIP) - request->channels[i]->flags |= - IEEE80211_CHAN_NO_HT40; -#endif - - WL_SCAN(("list->element[%d]=%d\n", - i, list->element[i])); - if (list->element[i] > CH_MAX_2G_CHANNEL) - break; - j++; - } - request->n_channels = j; +#ifdef USE_INITIAL_2G_SCAN_ORG + if (ndev == wl_to_prmry_ndev(wl) && g_first_broadcast_scan == true) { + j = 0; + if (!wl_get_valid_channels(ndev, chan_buf, sizeof(chan_buf))) { + list = (wl_uint32_list_t *) chan_buf; + n_valid_chan = dtoh32(list->count); + for (i = 0; i < n_valid_chan; i++) { - WL_SCAN(("request->n_channels=%d\n", request->n_channels)); - g_first_broadcast_scan = false; - is_first_init_2g_scan = true; + WL_SCAN(("list->element[%d]=%d\n", + i, list->element[i])); + if (list->element[i] > CH_MAX_2G_CHANNEL) + break; + j++; } + request->n_channels = j; + + active_time = FIRST_SCAN_ACTIVE_DWELL_TIME_MS; + WL_SCAN(("request->n_channels=%d\n", request->n_channels)); + g_first_broadcast_scan = false; } + } +#endif /* USE_INITIAL_2G_SCAN_ORG */ -#endif /* USE_INITIAL_2G_SCAN */ + n_channels = request->n_channels; + n_ssids = request->n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + if (n_channels % 2) + /* If n_channels is odd, add a padd of u16 */ + params_size += sizeof(u16) * (n_channels + 1); + else + params_size += sizeof(u16) * n_channels; - n_channels = request->n_channels; - n_ssids = request->n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - if (n_channels % 2) - /* If n_channels is odd, add a padd of u16 */ - params_size += sizeof(u16) * (n_channels + 1); - else - params_size += sizeof(u16) * n_channels; + /* Allocate space for populating ssids in wl_iscan_params struct */ + params_size += sizeof(struct wlc_ssid) * n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - params_size += sizeof(struct wlc_ssid) * n_ssids; params = (wl_escan_params_t *) kzalloc(params_size, GFP_KERNEL); if (params == NULL) { err = -ENOMEM; goto exit; } - wl_scan_prep(¶ms->params, request); - -#ifdef USE_INITIAL_2G_SCAN - /* Override active_time to reduce scan time if it's first bradcast scan. */ - if (is_first_init_2g_scan) - params->params.active_time = FIRST_SCAN_ACTIVE_DWELL_TIME_MS; -#endif /* USE_INITIAL_2G_SCAN */ + wl_scan_prep(¶ms->params, request, active_time); params->version = htod32(ESCAN_REQ_VERSION); params->action = htod16(action); -#if defined(DUAL_ESCAN_RESULT_BUFFER) params->sync_id = wl->escan_info.cur_sync_id; -#else - params->sync_id = htod16(0x1234); -#endif if (params_size + sizeof("escan") >= WLC_IOCTL_MEDLEN) { WL_ERR(("ioctl buffer length not sufficient\n")); kfree(params); + params = NULL; err = -ENOMEM; goto exit; } @@ -1867,12 +1839,16 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, if (unlikely(err)) WL_ERR((" Escan set error (%d)\n", err)); kfree(params); + params = NULL; } else if (p2p_is_on(wl) && p2p_scan(wl)) { /* P2P SCAN TRIGGER */ s32 _freq = 0; n_nodfs = 0; - if (request && request->n_channels) { + + WL_DBG((" P2P E-SCAN START\n")); + + if (request->n_channels) { num_chans = request->n_channels; WL_SCAN((" chann number : %d\n", num_chans)); default_chan_list = kzalloc(num_chans * sizeof(*default_chan_list), @@ -1891,8 +1867,7 @@ wl_run_escan(struct wl_priv *wl, struct net_device *ndev, channel = ieee80211_frequency_to_channel(_freq); /* remove DFS channels */ if (!(request->channels[i]->flags & - (IEEE80211_CHAN_RADAR - | IEEE80211_CHAN_PASSIVE_SCAN))) { + (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_PASSIVE_SCAN))) { for (j = 0; j < n_valid_chan; j++) { /* allows only supported channel on * current reguatory @@ -1946,16 +1921,11 @@ wl_do_escan(struct wl_priv *wl, struct wiphy *wiphy, struct net_device *ndev, s32 passive_scan; wl_scan_results_t *results; WL_SCAN(("Enter \n")); - mutex_lock(&wl->usr_sync); -#if defined(DUAL_ESCAN_RESULT_BUFFER) + WL_SCAN2(("scan result set to sync id :%d\n", wl->escan_info.cur_sync_id%2)); results = (wl_scan_results_t *) wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2]; -#else - results = (wl_scan_results_t *) wl->escan_info.escan_buf; -#endif results->version = 0; results->count = 0; results->buflen = WL_SCAN_RESULTS_FIXED_SIZE; - wl->escan_info.ndev = ndev; wl->escan_info.wiphy = wiphy; wl->escan_info.escan_state = WL_ESCAN_STATE_SCANING; @@ -1964,12 +1934,10 @@ wl_do_escan(struct wl_priv *wl, struct wiphy *wiphy, struct net_device *ndev, &passive_scan, sizeof(passive_scan), false); if (unlikely(err)) { WL_ERR(("error (%d)\n", err)); - goto exit; + return err; } err = wl_run_escan(wl, ndev, request, WL_SCAN_ACTION_START); -exit: - mutex_unlock(&wl->usr_sync); return err; } @@ -1982,18 +1950,18 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_ssid *ssids; struct wl_scan_req *sr = wl_to_sr(wl); struct ether_addr primary_mac; + wpa_ie_fixed_t *wps_ie; + wifi_p2p_ie_t *p2p_ie; s32 passive_scan; bool iscan_req; bool escan_req = false; bool p2p_ssid; -#ifdef WL11U - bcm_tlv_t *interworking_ie; - u32 ie_len; -#endif s32 err = 0; s32 bssidx = -1; s32 i; - + u32 wpsie_len = 0; + u32 p2pie_len = 0; + u8 wpsie[IE_MAX_LEN]; unsigned long flags; static s32 busy_count = 0; @@ -2004,21 +1972,26 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ndev = wl_to_prmry_ndev(wl); } - if (WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl)) { + if (wl_get_drv_status_all(wl, SENDING_ACT_FRM) +#ifdef WL_CFG80211_SYNC_GON_TIME + || wl_get_drv_status_all(wl, WAITING_MORE_TIME_NEXT_ACT_FRM) +#endif /* WL_CFG80211_SYNC_GON_TIME */ + ) { WL_ERR(("Sending Action Frames. Try it again.\n")); return -EAGAIN; } WL_DBG(("Enter wiphy (%p)\n", wiphy)); if (wl_get_drv_status_all(wl, SCANNING)) { - if (wl->scan_request == NULL) { + if(wl->scan_request == NULL) { wl_clr_drv_status_all(wl, SCANNING); - WL_DBG(("<<<<<<<<<<<Force Clear Scanning Status>>>>>>>>>>>\n")); + WL_DBG(( "<<<<<<<<<<<Force Clear Scanning Status>>>>>>>>>>>\n")); } else { WL_ERR(("Scanning already\n")); return -EAGAIN; } } + if (wl_get_drv_status(wl, SCAN_ABORTING, ndev)) { WL_ERR(("Scanning being aborted\n")); return -EAGAIN; @@ -2027,15 +2000,18 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, WL_ERR(("request null or n_ssids > WL_SCAN_PARAMS_SSID_MAX\n")); return -EOPNOTSUPP; } + + WL_DBG(("scan start\n")); + #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL)) { - WL_DBG(("Remain_on_channel bit is set, somehow it didn't get cleared\n")); - wl_notify_escan_complete(wl, ndev, true, true); + WL_SCAN2(("request scan abort: %p(%d)\n", ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, ndev); } #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ /* Arm scan timeout timer */ - mod_timer(&wl->scan_timeout, jiffies + msecs_to_jiffies(WL_SCAN_TIMER_INTERVAL_MS)); + mod_timer(&wl->scan_timeout, jiffies + WL_SCAN_TIMER_INTERVAL_MS * HZ / 1000); iscan_req = false; if (request) { /* scan bss */ ssids = request->ssids; @@ -2045,8 +2021,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, escan_req = true; p2p_ssid = false; for (i = 0; i < request->n_ssids; i++) { - if (ssids[i].ssid_len && - IS_P2P_SSID(ssids[i].ssid, ssids[i].ssid_len)) { + if (ssids[i].ssid_len && IS_P2P_SSID(ssids[i].ssid, ssids[i].ssid_len)) { p2p_ssid = true; break; } @@ -2062,8 +2037,6 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); } - wl_clr_p2p_status(wl, GO_NEG_PHASE); - WL_DBG(("P2P: GO_NEG_PHASE status cleared \n")); p2p_scan(wl) = true; } } else { @@ -2088,36 +2061,27 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, } } if (!wl->p2p_supported || !p2p_scan(wl)) { - bssidx = wl_cfgp2p_find_idx(wl, ndev); - -#ifdef WL11U - if ((interworking_ie = wl_cfg80211_find_interworking_ie( - (u8 *)request->ie, request->ie_len)) != NULL) { - ie_len = interworking_ie->len; - - err = wl_cfg80211_add_iw_ie(wl, ndev, bssidx, - VNDR_IE_CUSTOM_FLAG, interworking_ie->id, - interworking_ie->data, interworking_ie->len); - - if (unlikely(err)) { - goto scan_out; - } - } else if (wl->iw_ie_len != 0) { - /* we have to clear IW IE and disable gratuitous APR */ - wl_cfg80211_add_iw_ie(wl, ndev, bssidx, - VNDR_IE_CUSTOM_FLAG, - DOT11_MNG_INTERWORKING_ID, - 0, 0); - - wldev_iovar_setint_bsscfg(ndev, "grat_arp", 0, - bssidx); - /* we don't care about error */ + /* find the WPSIE */ + memset(wpsie, 0, sizeof(wpsie)); + if ((wps_ie = wl_cfgp2p_find_wpsie( + (u8 *)request->ie, + request->ie_len)) != NULL) { + wpsie_len = + wps_ie->length + WPA_RSN_IE_TAG_FIXED_LEN; + memcpy(wpsie, wps_ie, wpsie_len); + } else { + wpsie_len = 0; + } + if ((p2p_ie = wl_cfgp2p_find_p2pie( + (u8 *)request->ie, + request->ie_len)) != NULL && (ndev != wl_to_prmry_ndev(wl))) { + p2pie_len = p2p_ie->len + sizeof(p2p_ie->len) + sizeof(p2p_ie->id); + memcpy(wpsie + wpsie_len, p2p_ie, p2pie_len); + wpsie_len += p2pie_len; + bssidx = wl_cfgp2p_find_idx(wl, ndev); } -#endif /* WL11U */ err = wl_cfgp2p_set_management_ie(wl, ndev, bssidx, - VNDR_IE_PRBREQ_FLAG, (u8 *)request->ie, - request->ie_len); - + VNDR_IE_PRBREQ_FLAG, wpsie, wpsie_len); if (unlikely(err)) { goto scan_out; } @@ -2143,10 +2107,9 @@ __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, /* find my listen channel */ wl->afx_hdl->my_listen_chan = - wl_find_listen_channel(wl, (u8 *)request->ie, - request->ie_len); + wl_find_my_listen_channel(wl, (u8 *)request->ie, request->ie_len); err = wl_cfgp2p_enable_discovery(wl, ndev, - request->ie, request->ie_len); + request->ie, request->ie_len); if (unlikely(err)) { goto scan_out; @@ -2202,7 +2165,7 @@ scan_success: scan_out: if (err == BCME_BUSY || err == BCME_NOTREADY) { - WL_ERR(("Scan err = (%d), busy?%d", err, -EBUSY)); + WL_ERR(("---> Error occurred err = (%d), busy?%d", err, -EBUSY)); err = -EBUSY; } @@ -2226,8 +2189,8 @@ scan_out: bzero(&bssid, sizeof(bssid)); if ((ret = wldev_ioctl(ndev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false)) == 0) - WL_ERR(("FW is connected with " MACDBG "/n", - STR_TO_MACD(bssid.octet))); + WL_ERR(("FW is connected with " MACSTR "/n", + MAC2STR(bssid.octet))); else WL_ERR(("GET BSSID failed with %d\n", ret)); @@ -2236,12 +2199,12 @@ scan_out: } else { busy_count = 0; } + wl_clr_drv_status(wl, SCANNING, ndev); - if (timer_pending(&wl->scan_timeout)) - del_timer_sync(&wl->scan_timeout); spin_lock_irqsave(&wl->cfgdrv_lock, flags); wl->scan_request = NULL; spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + WL_SCAN2(("remove scan request:%p %d \n", ndev, wl->escan_info.cur_sync_id)); return err; } @@ -2253,6 +2216,7 @@ wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, struct wl_priv *wl = wiphy_priv(wiphy); WL_DBG(("Enter \n")); + WL_SCAN2(("start %p\n", ndev)); CHECK_SYS_UP(wl); err = __wl_cfg80211_scan(wiphy, ndev, request, NULL); @@ -2309,7 +2273,6 @@ static s32 wl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) s32 err = 0; CHECK_SYS_UP(wl); - WL_DBG(("Enter\n")); if (changed & WIPHY_PARAM_RTS_THRESHOLD && (wl->conf->rts_threshold != wiphy->rts_threshold)) { wl->conf->rts_threshold = wiphy->rts_threshold; @@ -2382,7 +2345,7 @@ wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, } /* wait 4 secons till scan done.... */ - schedule_timeout_interruptible(msecs_to_jiffies(4000)); + schedule_timeout_interruptible(4 * HZ); if (rollback_lock) rtnl_lock(); bss = cfg80211_get_ibss(wiphy, NULL, @@ -2443,15 +2406,15 @@ wl_set_wpa_version(struct net_device *dev, struct cfg80211_connect_params *sme) if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) val = WPA_AUTH_PSK | #ifdef BCMCCX - WPA_AUTH_CCKM | + WPA_AUTH_CCKM | #endif - WPA_AUTH_UNSPECIFIED; + WPA_AUTH_UNSPECIFIED; else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) val = WPA2_AUTH_PSK| #ifdef BCMCCX - WPA2_AUTH_CCKM | + WPA2_AUTH_CCKM | #endif - WPA2_AUTH_UNSPECIFIED; + WPA2_AUTH_UNSPECIFIED; else val = WPA_AUTH_DISABLED; @@ -2614,10 +2577,9 @@ wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme) WL_DBG(("pval (%d) gval (%d)\n", pval, gval)); if (is_wps_conn(sme)) { - if (sme->privacy) + if(sme->privacy) err = wldev_iovar_setint_bsscfg(dev, "wsec", 4, bssidx); else - /* WPS-2.0 allows no security */ err = wldev_iovar_setint_bsscfg(dev, "wsec", 0, bssidx); } else { #ifdef BCMWAPI_WPI @@ -2684,9 +2646,9 @@ wl_set_key_mgmt(struct net_device *dev, struct cfg80211_connect_params *sme) } } else if (val & (WPA2_AUTH_PSK | #ifdef BCMCCX - WPA2_AUTH_CCKM | + WPA2_AUTH_CCKM | #endif - WPA2_AUTH_UNSPECIFIED)) { + WPA2_AUTH_UNSPECIFIED)) { switch (sme->crypto.akm_suites[0]) { case WLAN_AKM_SUITE_8021X: val = WPA2_AUTH_UNSPECIFIED; @@ -2801,9 +2763,9 @@ wl_set_set_sharedkey(struct net_device *dev, WL_ERR(("WLC_SET_KEY error (%d)\n", err)); return err; } - if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { + if (sec->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) { WL_DBG(("set auth_type to shared key\n")); - val = WL_AUTH_SHARED_KEY; /* shared key */ + val = 1; /* shared key */ err = wldev_iovar_setint_bsscfg(dev, "auth", val, bssidx); if (unlikely(err)) { WL_ERR(("set auth failed (%d)\n", err)); @@ -2815,15 +2777,14 @@ wl_set_set_sharedkey(struct net_device *dev, return err; } +#ifdef ROAM_CHANNEL_CACHE +#define MAX_ROAM_CACHE_NUM 100 +#endif #ifdef ESCAN_RESULT_PATCH static u8 connect_req_bssid[6]; static u8 broad_bssid[6]; #endif -#ifdef ROAM_CHANNEL_CACHE -#define MAX_ROAM_CACHE_NUM 100 -#endif - static s32 wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_connect_params *sme) @@ -2833,12 +2794,16 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl_extjoin_params_t *ext_join_params; struct wl_join_params join_params; size_t join_params_size; + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); s32 err = 0; wpa_ie_fixed_t *wpa_ie; + wpa_ie_fixed_t *wps_ie; bcm_tlv_t *wpa2_ie; u8* wpaie = 0; u32 wpaie_len = 0; + u32 wpsie_len = 0; u32 chan_cnt = 0; + u8 wpsie[IE_MAX_LEN]; struct ether_addr bssid; #ifdef ROAM_CHANNEL_CACHE chanspec_t chanspec_list[MAX_ROAM_CACHE_NUM]; @@ -2857,40 +2822,46 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, /* * Cancel ongoing scan to sync up with sme state machine of cfg80211. */ -#if (defined(BCM4334_CHIP) || !defined(ESCAN_RESULT_PATCH)) +#if (defined (BCM4334_CHIP) || !defined(ESCAN_RESULT_PATCH)) if (wl->scan_request) { - wl_notify_escan_complete(wl, dev, true, true); + WL_SCAN2(("Abort Scan %p(%d)\n", dev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, dev); } #endif + #ifdef WL_CFG80211_GON_COLLISION /* init block gon req count */ wl->block_gon_req_tx_count = 0; wl->block_gon_req_rx_count = 0; #endif /* WL_CFG80211_GON_COLLISION */ -#ifdef ESCAN_RESULT_PATCH + if (sme->bssid) { + WL_SCAN2(("Connect Request: \"%s\" \n", + sme->ssid)); +#ifdef ESCAN_RESULT_PATCH memcpy(connect_req_bssid, sme->bssid, ETHER_ADDR_LEN); - } - else { + }else { bzero(connect_req_bssid, ETHER_ADDR_LEN); } bzero(broad_bssid, ETHER_ADDR_LEN); +#else + } #endif bzero(&bssid, sizeof(bssid)); if (!wl_get_drv_status(wl, CONNECTED, dev)&& (ret = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false)) == 0) { - if (!ETHER_ISNULLADDR(&bssid)) { + if(!ETHER_ISNULLADDR(&bssid)) { scb_val_t scbval; wl_set_drv_status(wl, DISCONNECTING, dev); scbval.val = DOT11_RC_DISASSOC_LEAVING; memcpy(&scbval.ea, &bssid, ETHER_ADDR_LEN); scbval.val = htod32(scbval.val); - WL_DBG(("drv status CONNECTED is not set, but connected in FW!" MACDBG "/n", - STR_TO_MACD(bssid.octet))); + WL_DBG(("drv status CONNECTED is not set, but connected in FW!" MACSTR "/n" + , MAC2STR(bssid.octet))); err = wldev_ioctl(dev, WLC_DISASSOC, &scbval, - sizeof(scb_val_t), true); + sizeof(scb_val_t), true); if (unlikely(err)) { wl_clr_drv_status(wl, DISCONNECTING, dev); WL_ERR(("error (%d)\n", err)); @@ -2909,39 +2880,79 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, if (!wl_get_drv_status(wl, DISCONNECTING, dev)) wl_update_prof(wl, dev, NULL, (void *)&bssid, WL_PROF_BSSID); - if (p2p_is_on(wl) && (dev != wl_to_prmry_ndev(wl))) { + if (!memcmp(sme->ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && + (dev != wl_to_prmry_ndev(wl))) { /* we only allow to connect using virtual interface in case of P2P */ + if (p2p_is_on(wl) && is_wps_conn(sme)) { + WL_DBG(("ASSOC1 p2p index : %d sme->ie_len %d\n", + wl_cfgp2p_find_idx(wl, dev), sme->ie_len)); + /* Have to apply WPS IE + P2P IE in assoc req frame */ + wl_cfgp2p_set_management_ie(wl, dev, + wl_cfgp2p_find_idx(wl, dev), VNDR_IE_PRBREQ_FLAG, + wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie, + wl_to_p2p_bss_saved_ie(wl, + P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len); + wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev), + VNDR_IE_ASSOCREQ_FLAG, sme->ie, sme->ie_len); + } else if (p2p_is_on(wl) && (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)) { + /* This is the connect req after WPS is done [credentials exchanged] + * currently identified with WPA_VERSION_2 . + * Update the previously set IEs with + * the newly received IEs from Supplicant. This will remove the WPS IE from + * the Assoc Req. + */ + WL_DBG(("ASSOC2 p2p index : %d sme->ie_len %d\n", + wl_cfgp2p_find_idx(wl, dev), sme->ie_len)); wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev), VNDR_IE_ASSOCREQ_FLAG, sme->ie, sme->ie_len); - } else if (dev == wl_to_prmry_ndev(wl)) { - /* find the RSN_IE */ - if ((wpa2_ie = bcm_parse_tlvs((u8 *)sme->ie, sme->ie_len, - DOT11_MNG_RSN_ID)) != NULL) { - WL_DBG((" WPA2 IE is found\n")); - } - /* find the WPA_IE */ - if ((wpa_ie = wl_cfgp2p_find_wpaie((u8 *)sme->ie, - sme->ie_len)) != NULL) { - WL_DBG((" WPA IE is found\n")); - } - if (wpa_ie != NULL || wpa2_ie != NULL) { - wpaie = (wpa_ie != NULL) ? (u8 *)wpa_ie : (u8 *)wpa2_ie; - wpaie_len = (wpa_ie != NULL) ? wpa_ie->length : wpa2_ie->len; - wpaie_len += WPA_RSN_IE_TAG_FIXED_LEN; - wldev_iovar_setbuf(dev, "wpaie", wpaie, wpaie_len, - wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); - } else { - wldev_iovar_setbuf(dev, "wpaie", NULL, 0, - wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); } - err = wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev), - VNDR_IE_ASSOCREQ_FLAG, (u8 *)sme->ie, sme->ie_len); + } else if (dev == wl_to_prmry_ndev(wl)) { + /* find the RSN_IE */ + if ((wpa2_ie = bcm_parse_tlvs((u8 *)sme->ie, sme->ie_len, + DOT11_MNG_RSN_ID)) != NULL) { + WL_DBG((" WPA2 IE is found\n")); + } + /* find the WPA_IE */ + if ((wpa_ie = wl_cfgp2p_find_wpaie((u8 *)sme->ie, + sme->ie_len)) != NULL) { + WL_DBG((" WPA IE is found\n")); + } + if (wpa_ie != NULL || wpa2_ie != NULL) { + wpaie = (wpa_ie != NULL) ? (u8 *)wpa_ie : (u8 *)wpa2_ie; + wpaie_len = (wpa_ie != NULL) ? wpa_ie->length : wpa2_ie->len; + wpaie_len += WPA_RSN_IE_TAG_FIXED_LEN; + wldev_iovar_setbuf(dev, "wpaie", wpaie, wpaie_len, + wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); + } else { + wldev_iovar_setbuf(dev, "wpaie", NULL, 0, + wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); + } + + /* find the WPSIE */ + memset(wpsie, 0, sizeof(wpsie)); + if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)sme->ie, + sme->ie_len)) != NULL) { + wpsie_len = wps_ie->length +WPA_RSN_IE_TAG_FIXED_LEN; + memcpy(wpsie, wps_ie, wpsie_len); + } else { + wpsie_len = 0; + } + err = wl_cfgp2p_set_management_ie(wl, dev, -1, + VNDR_IE_ASSOCREQ_FLAG, wpsie, wpsie_len); + if (unlikely(err)) { + return err; + } + } + if (dhd->roam_env_detection && (wldev_iovar_setint(dev, "roam_env_detection", + AP_ENV_DETECT_NOT_USED) == BCME_OK)) { + s32 roam_trigger[2] = {WL_AUTO_ROAM_TRIGGER, WLC_BAND_ALL}; + err = wldev_ioctl(dev, WLC_SET_ROAM_TRIGGER, roam_trigger, + sizeof(roam_trigger), true); if (unlikely(err)) { - return err; + WL_ERR((" failed to restore roam_trigger for auto env detection\n")); } } - if (chan) { #ifdef ROAM_CHANNEL_CACHE wlc_ssid_t ssid; @@ -2955,11 +2966,11 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, wl->channel = ieee80211_frequency_to_channel(chan->center_freq); memcpy(ssid.SSID, sme->ssid, sme->ssid_len); ssid.SSID_len = sme->ssid_len; - chan_cnt = get_roam_channel_list(wl->channel, chanspec_list, &ssid, ioctl_version); + chan_cnt = get_roam_channel_list(wl->channel, chanspec_list, &ssid); #else wl->channel = ieee80211_frequency_to_channel(chan->center_freq); chan_cnt = 1; -#endif /* ROAM_CHANNEL_CACHE */ +#endif WL_DBG(("channel (%d), center_req (%d), %d channels\n", wl->channel, chan->center_freq, chan_cnt)); } else @@ -3032,12 +3043,11 @@ wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, /* increate dwell time to receive probe response or detect Beacon * from target AP at a noisy air only during connect command */ - ext_join_params->scan.active_time = DHD_SCAN_ACTIVE_TIME*8; - ext_join_params->scan.passive_time = DHD_SCAN_PASSIVE_TIME*3; + ext_join_params->scan.active_time = WL_SCAN_ACTIVE_TIME*8; + ext_join_params->scan.passive_time = WL_SCAN_PASSIVE_TIME*3; /* Set up join scan parameters */ ext_join_params->scan.scan_type = -1; - ext_join_params->scan.nprobes - = (ext_join_params->scan.active_time/WL_SCAN_JOIN_PROBE_INTERVAL_MS); + ext_join_params->scan.nprobes = (ext_join_params->scan.active_time/(WL_SCAN_ACTIVE_TIME *2)); ext_join_params->scan.home_time = -1; if (sme->bssid) @@ -3126,14 +3136,18 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, CHECK_SYS_UP(wl); act = *(bool *) wl_read_prof(wl, dev, WL_PROF_ACT); curbssid = wl_read_prof(wl, dev, WL_PROF_BSSID); + WL_DBG(("request(%d) %02x:%02x:%02x:%02x:%02x:%02x\n", + act, curbssid[0], curbssid[1], curbssid[2], + curbssid[3],curbssid[4],curbssid[5])); if (act) { /* * Cancel ongoing scan to sync up with sme state machine of cfg80211. */ -#if (defined(BCM4334_CHIP) || !defined(ESCAN_RESULT_PATCH)) +#if (defined (BCM4334_CHIP) || !defined (ESCAN_RESULT_PATCH)) /* Let scan aborted by F/W */ if (wl->scan_request) { - wl_notify_escan_complete(wl, dev, true, true); + WL_SCAN2(("Abort scan : %p(%d)\n", dev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, dev); } #endif /* ESCAN_RESULT_PATCH */ wl_set_drv_status(wl, DISCONNECTING, dev); @@ -3274,7 +3288,7 @@ wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, if (key.len == 0) { /* key delete */ swap_key_from_BE(&key); - err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), + wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); if (unlikely(err)) { WL_ERR(("key delete error (%d)\n", err)); @@ -3339,8 +3353,9 @@ wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, return -EINVAL; } swap_key_from_BE(&key); - /* need to guarantee EAPOL 4/4 send out before set key */ +#if defined(CONFIG_WIRELESS_EXT) dhd_wait_pend8021x(dev); +#endif err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); if (unlikely(err)) { @@ -3465,10 +3480,12 @@ wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev, s32 bssidx = wl_cfgp2p_find_idx(wl, dev); WL_DBG(("Enter\n")); -#ifndef IEEE80211W - if ((key_idx >= DOT11_MAX_DEFAULT_KEYS) && (key_idx < DOT11_MAX_DEFAULT_KEYS+2)) - return -EINVAL; -#endif + + #ifndef IEEE80211W + if ((key_idx >= DOT11_MAX_DEFAULT_KEYS) && (key_idx < DOT11_MAX_DEFAULT_KEYS+2)) + return -EINVAL; + #endif + CHECK_SYS_UP(wl); memset(&key, 0, sizeof(key)); @@ -3579,6 +3596,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, #endif dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); CHECK_SYS_UP(wl); + WL_DBG((" Enter\n")); if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { err = wldev_iovar_getbuf(dev, "sta_info", (struct ether_addr *)mac, ETHER_ADDR_LEN, wl->ioctl_buf, WLC_IOCTL_SMLEN, &wl->ioctl_buf_sync); @@ -3604,19 +3622,22 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, sta->idle * 1000)); #endif } else if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_BSS) { - get_pktcnt_t pktcnt; u8 *curmacp = wl_read_prof(wl, dev, WL_PROF_BSSID); if (!wl_get_drv_status(wl, CONNECTED, dev) || - (dhd_is_associated(dhd, NULL, &err) == FALSE)) { + (dhd_is_associated(dhd, NULL, &err) == FALSE)) { WL_ERR(("NOT assoc\n")); - if (err == -ERESTARTSYS) + if(err == -ERESTARTSYS) return err; +#ifdef ESCAN_RESULT_PATCH + return -ENODEV; +#else err = -ENODEV; - return err; + goto get_station_err; +#endif /* ESCAN_RESULT_PATCH */ } if (memcmp(mac, curmacp, ETHER_ADDR_LEN)) { - WL_ERR(("Wrong Mac address: "MACDBG" != "MACDBG"\n", - STR_TO_MACD(mac), STR_TO_MACD(curmacp))); + WL_ERR(("Wrong Mac address: "MACSTR" != "MACSTR"\n", + MAC2STR(mac), MAC2STR(curmacp))); } /* Report the current tx rate */ @@ -3642,18 +3663,7 @@ wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, sinfo->filled |= STATION_INFO_SIGNAL; sinfo->signal = rssi; WL_DBG(("RSSI %d dBm\n", rssi)); - err = wldev_ioctl(dev, WLC_GET_PKTCNTS, &pktcnt, - sizeof(pktcnt), false); - if (!err) { - sinfo->filled |= (STATION_INFO_RX_PACKETS | - STATION_INFO_RX_DROP_MISC | - STATION_INFO_TX_PACKETS | - STATION_INFO_TX_FAILED); - sinfo->rx_packets = pktcnt.rx_good_pkt; - sinfo->rx_dropped_misc = pktcnt.rx_bad_pkt; - sinfo->tx_packets = pktcnt.tx_good_pkt; - sinfo->tx_failed = pktcnt.tx_bad_pkt; - } + get_station_err: if (err && (err != -ERESTARTSYS)) { /* Disconnect due to zero BSSID or error to get RSSI */ @@ -3767,12 +3777,15 @@ static s32 wl_cfg80211_suspend(struct wiphy *wiphy) if (wl->scan_request) { cfg80211_scan_done(wl->scan_request, true); wl->scan_request = NULL; + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + WL_SCAN2(("remove scan_request %p, %d\n", ndev, wl->escan_info.cur_sync_id)); + } else { + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); } for_each_ndev(wl, iter, next) { wl_clr_drv_status(wl, SCANNING, iter->ndev); wl_clr_drv_status(wl, SCAN_ABORTING, iter->ndev); } - spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); for_each_ndev(wl, iter, next) { if (wl_get_drv_status(wl, CONNECTING, iter->ndev)) { wl_bss_connect_done(wl, iter->ndev, NULL, NULL, false); @@ -3795,8 +3808,8 @@ wl_update_pmklist(struct net_device *dev, struct wl_pmk_list *pmk_list, return -EINVAL; } /* pmk list is supported only for STA interface i.e. primary interface - * Refer code wlc_bsscfg.c->wlc_bsscfg_sta_init - */ + * Refer code wlc_bsscfg.c->wlc_bsscfg_sta_init + */ if (primary_dev != dev) { WL_INFO(("Not supporting Flushing pmklist on virtual" " interfaces than primary interface\n")); @@ -3866,7 +3879,7 @@ wl_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev, CHECK_SYS_UP(wl); memcpy(&pmkid.pmkid[0].BSSID, pmksa->bssid, ETHER_ADDR_LEN); - memcpy(pmkid.pmkid[0].PMKID, pmksa->pmkid, WPA2_PMKID_LEN); + memcpy(&pmkid.pmkid[0].PMKID, pmksa->pmkid, WPA2_PMKID_LEN); WL_DBG(("del_pmksa,IW_PMKSA_REMOVE - PMKID: %pM =\n", &pmkid.pmkid[0].BSSID)); @@ -3942,18 +3955,57 @@ wl_cfg80211_scan_alloc_params(int channel, int nprobes, int *out_params_size) params->active_time = htod32(-1); params->passive_time = htod32(-1); params->home_time = htod32(10); - if (channel == -1) - params->channel_list[0] = htodchanspec(channel); - else - params->channel_list[0] = wl_ch_host_to_driver(channel); + params->channel_list[0] = htodchanspec(channel); /* Our scan params have 1 channel and 0 ssids */ params->channel_num = htod32((0 << WL_SCAN_PARAMS_NSSID_SHIFT) | - (num_chans & WL_SCAN_PARAMS_COUNT_MASK)); + (num_chans & WL_SCAN_PARAMS_COUNT_MASK)); *out_params_size = params_size; /* rtn size to the caller */ return params; } +s32 +wl_cfg80211_scan_abort(struct wl_priv *wl, struct net_device *ndev) +{ + wl_scan_params_t *params = NULL; + s32 params_size = 0; + s32 err = BCME_OK; + unsigned long flags; + + WL_DBG(("Enter\n")); + + /* Our scan params only need space for 1 channel and 0 ssids */ + params = wl_cfg80211_scan_alloc_params(-1, 0, ¶ms_size); + if (params == NULL) { + WL_ERR(("scan params allocation failed \n")); + err = -ENOMEM; + } else { + /* Do a scan abort to stop the driver's scan engine */ + err = wldev_ioctl(ndev, WLC_SCAN, params, params_size, true); + if (err < 0) { + WL_ERR(("scan abort failed \n")); + } + } + del_timer_sync(&wl->scan_timeout); +#if defined(BCM4334_CHIP) + if (wl->scan_request) { + u8 temp_id = wl->escan_info.cur_sync_id; + wl->bss_list = (wl_scan_results_t *) wl->escan_info.escan_buf[(temp_id+1)%2]; + wl_inform_bss(wl); + } +#endif + spin_lock_irqsave(&wl->cfgdrv_lock, flags); + if (wl->scan_request) { + cfg80211_scan_done(wl->scan_request, true); + wl->scan_request = NULL; + } + + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + wl_clr_drv_status(wl, SCANNING, ndev); + if (params) + kfree(params); + return err; +} static s32 wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, @@ -3965,14 +4017,19 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, u32 id; struct ether_addr primary_mac; struct net_device *ndev = NULL; - s32 err = BCME_OK; struct wl_priv *wl = wiphy_priv(wiphy); + WL_SCAN2(("duration :%d\n", duration)); WL_DBG(("Enter, ifindex: %d, channel: %d, duration ms (%d) SCANNING ?? %s \n", dev->ifindex, ieee80211_frequency_to_channel(channel->center_freq), duration, (wl_get_drv_status(wl, SCANNING, ndev)) ? "YES":"NO")); + if (wl->first_remain) { + wl->first_remain = false; + duration = 100; + } + if (wl->p2p_net == dev) { ndev = wl_to_prmry_ndev(wl); } else { @@ -3980,7 +4037,8 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, } #ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST if (wl_get_drv_status(wl, SCANNING, ndev)) { - wl_notify_escan_complete(wl, ndev, true, true); + WL_SCAN2(("Abort Scan : %p(%d)\n", ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, ndev); } #endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ @@ -3997,13 +4055,15 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST if (wl_get_drv_status(wl, SCANNING, ndev)) { struct timer_list *_timer; - WL_DBG(("scan is running. go to fake listen state\n")); + WL_DBG((": fake listen state !! \n")); wl_set_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); if (timer_pending(&wl->p2p->listen_timer)) { - WL_DBG(("cancel current listen timer \n")); + WL_ERR((": cancel current listen timer \n")); + spin_lock_bh(&wl->p2p->timer_lock); del_timer_sync(&wl->p2p->listen_timer); + spin_unlock_bh(&wl->p2p->timer_lock); } _timer = &wl->p2p->listen_timer; @@ -4015,8 +4075,8 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, } #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ -#ifdef WL_CFG80211_SYNC_GON - if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { +#ifdef WL_CFG80211_SYNC_GON_TIME + if (wl_get_drv_status_all(wl, WAITING_MORE_TIME_NEXT_ACT_FRM)) { /* do not enter listen mode again if we are in listen mode already for next af. * remain on channel completion will be returned by waiting next af completion. */ @@ -4027,21 +4087,25 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ goto exit; } -#endif /* WL_CFG80211_SYNC_GON */ +#endif /* WL_CFG80211_SYNC_GON_TIME */ + if (wl->p2p && !wl->p2p->on) { + get_primary_mac(wl, &primary_mac); + wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); + /* In case of p2p_listen command, supplicant send remain_on_channel * without turning on P2P */ - get_primary_mac(wl, &primary_mac); - wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); - p2p_on(wl) = true; - } - if (p2p_is_on(wl)) { + p2p_on(wl) = true; err = wl_cfgp2p_enable_discovery(wl, ndev, NULL, 0); + if (unlikely(err)) { goto exit; } + } + + if (p2p_is_on(wl)) { #ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST wl_set_drv_status(wl, REMAINING_ON_CHANNEL, ndev); #endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ @@ -4052,15 +4116,12 @@ wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, wl_set_drv_status(wl, REMAINING_ON_CHANNEL, ndev); } else { /* if failed, firmware may be internal scanning state. - * so other scan request shall not abort it - */ + so other scan request shall not abort it */ wl_set_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); + /* set err = ok to prevent cookie mismatch */ + err = BCME_OK; } #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ - /* WAR: set err = ok to prevent cookie mismatch in wpa_supplicant - * and expire timer will send a completion to the upper layer - */ - err = BCME_OK; } exit: @@ -4075,10 +4136,49 @@ wl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy, struct net_device *dev WL_DBG((" enter ) netdev_ifidx: %d \n", dev->ifindex)); return err; } +static s32 +wl_cfg80211_send_pending_tx_act_frm(struct wl_priv *wl) +{ + wl_af_params_t *tx_act_frm; + struct net_device *dev = wl->afx_hdl->dev; + if (dev == NULL) + return -1; + + if (!p2p_is_on(wl)) + return -1; + + if (dev == wl->p2p_net) { + dev = wl_to_prmry_ndev(wl); + } + + tx_act_frm = wl->afx_hdl->pending_tx_act_frm; + WL_DBG(("Sending the action frame\n")); + wl->afx_hdl->pending_tx_act_frm = NULL; + if (tx_act_frm != NULL) { + /* Suspend P2P discovery's search-listen to prevent it from + * starting a scan or changing the channel. + */ +#ifndef CUSTOMER_HW_SAMSUNG +#error remove sending act frame to improve P2P connection ratio + wl_clr_drv_status(wl, SENDING_ACT_FRM, wl->afx_hdl->dev); +#endif + wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); +/* Do not abort scan for VSDB. Scan will be aborted in firmware if necessary */ +#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST + wl_cfg80211_scan_abort(wl, dev); +#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ + wl_cfgp2p_discover_enable_search(wl, false); + tx_act_frm->channel = wl->afx_hdl->peer_chan; + wl->afx_hdl->ack_recv = (wl_cfgp2p_tx_action_frame(wl, dev, + tx_act_frm, wl->afx_hdl->bssidx)) ? false : true; + } + return 0; +} static void wl_cfg80211_afx_handler(struct work_struct *work) { + struct afx_hdl *afx_instance; struct wl_priv *wl = wlcfg_drv_priv; s32 ret = BCME_OK; @@ -4086,34 +4186,41 @@ wl_cfg80211_afx_handler(struct work_struct *work) afx_instance = container_of(work, struct afx_hdl, work); if (afx_instance != NULL && wl->afx_hdl->is_active) { if (wl->afx_hdl->is_listen && wl->afx_hdl->my_listen_chan) { - ret = wl_cfgp2p_discover_listen(wl, wl->afx_hdl->my_listen_chan, - (100 * (1 + (random32() % 3)))); /* 100ms ~ 300ms */ + ret = wl_cfgp2p_discover_listen(wl, wl->afx_hdl->my_listen_chan, 200); } else { ret = wl_cfgp2p_act_frm_search(wl, wl->afx_hdl->dev, wl->afx_hdl->bssidx, wl->afx_hdl->peer_listen_chan); } if (unlikely(ret != BCME_OK)) { WL_ERR(("ERROR occurred! returned value is (%d)\n", ret)); - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) complete(&wl->act_frm_scan); } } } -static s32 -wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) +static bool +wl_cfg80211_send_at_common_channel(struct wl_priv *wl, + struct net_device *dev, + wl_af_params_t *af_params) { u32 max_retry = WL_CHANNEL_SYNC_RETRY; - if (dev == NULL) - return -1; - WL_DBG((" enter ) \n")); + /* initialize afx_hdl */ + wl->afx_hdl->pending_tx_act_frm = af_params; + wl->afx_hdl->bssidx = wl_cfgp2p_find_idx(wl, dev); + wl->afx_hdl->dev = dev; + wl->afx_hdl->retry = 0; + wl->afx_hdl->peer_chan = WL_INVALID; + wl->afx_hdl->ack_recv = false; + + WL_AF_TX_REDUCE_RETRY_VSDB(wl, max_retry); - wl_set_drv_status(wl, FINDING_COMMON_CHANNEL, dev); + wl_set_drv_status(wl, SCANNING_PEER_CHANNEL, dev); wl->afx_hdl->is_active = TRUE; - /* Loop to wait until we find a peer's channel or the + /* Loop to wait until we have sent the pending tx action frame or the * pending action frame tx is cancelled. */ while ((wl->afx_hdl->retry < max_retry) && @@ -4122,25 +4229,25 @@ wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) wl_set_drv_status(wl, SCANNING, dev); WL_DBG(("Scheduling the action frame for sending.. retry %d\n", wl->afx_hdl->retry)); - /* search peer on peer's listen channel */ + /* Do find_peer_for_action */ schedule_work(&wl->afx_hdl->work); wait_for_completion_timeout(&wl->act_frm_scan, - msecs_to_jiffies(MAX_WAIT_TIME)); + msecs_to_jiffies(MAX_WAIT_TIME)); if ((wl->afx_hdl->peer_chan != WL_INVALID) || - !(wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev))) + !(wl_get_drv_status(wl, SCANNING_PEER_CHANNEL, dev))) break; if (wl->afx_hdl->my_listen_chan) { WL_DBG(("Scheduling Listen peer in my listen channel = %d\n", wl->afx_hdl->my_listen_chan)); - /* listen on my listen channel */ wl->afx_hdl->is_listen = TRUE; + /* Do find_peer_for_action */ schedule_work(&wl->afx_hdl->work); wait_for_completion_timeout(&wl->act_frm_scan, - msecs_to_jiffies(MAX_WAIT_TIME)); + msecs_to_jiffies(MAX_WAIT_TIME)); } - if (!wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev)) + if (!wl_get_drv_status(wl, SCANNING_PEER_CHANNEL, dev)) break; wl->afx_hdl->retry++; @@ -4150,380 +4257,26 @@ wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) wl->afx_hdl->is_active = FALSE; wl_clr_drv_status(wl, SCANNING, dev); - wl_clr_drv_status(wl, FINDING_COMMON_CHANNEL, dev); - - return (wl->afx_hdl->peer_chan); -} - -struct p2p_config_af_params { - s32 max_tx_retry; /* max tx retry count if tx no ack */ - /* To make sure to send successfully action frame, we have to turn off mpc - * 0: off, 1: on, (-1): do nothing - */ - s32 mpc_onoff; -#ifdef WL_CFG80211_GON_COLLISION - /* drop tx go nego request if go nego collision occurs */ - bool drop_tx_req; -#endif -#ifdef WL_CFG80211_SYNC_GON - bool extra_listen; -#endif - bool search_channel; /* 1: search peer's channel to send af */ -}; - -static s32 -wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, - wl_action_frame_t *action_frame, wl_af_params_t *af_params, - struct p2p_config_af_params *config_af_params) -{ - s32 err = BCME_OK; - struct wl_priv *wl = wiphy_priv(wiphy); - wifi_p2p_pub_act_frame_t *act_frm = - (wifi_p2p_pub_act_frame_t *) (action_frame->data); - - /* initialize default value */ -#ifdef WL_CFG80211_GON_COLLISION - config_af_params->drop_tx_req = false; -#endif -#ifdef WL_CFG80211_SYNC_GON - config_af_params->extra_listen = true; -#endif - config_af_params->search_channel = false; - config_af_params->max_tx_retry = WL_AF_TX_MAX_RETRY; - config_af_params->mpc_onoff = -1; - - switch (act_frm->subtype) { - case P2P_PAF_GON_REQ: { - WL_DBG(("P2P: GO_NEG_PHASE status set \n")); - wl_set_p2p_status(wl, GO_NEG_PHASE); - - config_af_params->mpc_onoff = 0; - config_af_params->search_channel = true; - wl->next_af_subtype = act_frm->subtype + 1; - - /* increase dwell time to wait for RESP frame */ - af_params->dwell_time = WL_MED_DWELL_TIME; - -#ifdef WL_CFG80211_GON_COLLISION - config_af_params->drop_tx_req = true; -#endif /* WL_CFG80211_GON_COLLISION */ - break; - } - case P2P_PAF_GON_RSP: { - wl->next_af_subtype = act_frm->subtype + 1; - /* increase dwell time to wait for CONF frame */ - af_params->dwell_time = WL_MED_DWELL_TIME; - break; - } - case P2P_PAF_GON_CONF: { - /* If we reached till GO Neg confirmation reset the filter */ - WL_DBG(("P2P: GO_NEG_PHASE status cleared \n")); - wl_clr_p2p_status(wl, GO_NEG_PHASE); - - /* turn on mpc again if go nego is done */ - config_af_params->mpc_onoff = 1; - - /* minimize dwell time */ - af_params->dwell_time = WL_MIN_DWELL_TIME; - -#ifdef WL_CFG80211_GON_COLLISION - /* if go nego formation done, clear it */ - wl->block_gon_req_tx_count = 0; - wl->block_gon_req_rx_count = 0; -#endif /* WL_CFG80211_GON_COLLISION */ -#ifdef WL_CFG80211_SYNC_GON - config_af_params->extra_listen = false; -#endif /* WL_CFG80211_SYNC_GON */ - break; - } - case P2P_PAF_INVITE_REQ: { - config_af_params->search_channel = true; - wl->next_af_subtype = act_frm->subtype + 1; - - /* increase dwell time */ - af_params->dwell_time = WL_MED_DWELL_TIME; - break; - } - case P2P_PAF_INVITE_RSP: - /* minimize dwell time */ - af_params->dwell_time = WL_MIN_DWELL_TIME; -#ifdef WL_CFG80211_SYNC_GON - config_af_params->extra_listen = false; -#endif /* WL_CFG80211_SYNC_GON */ - break; - case P2P_PAF_DEVDIS_REQ: { - config_af_params->search_channel = true; - - wl->next_af_subtype = act_frm->subtype + 1; - /* maximize dwell time to wait for RESP frame */ - af_params->dwell_time = WL_LONG_DWELL_TIME; - break; - } - case P2P_PAF_DEVDIS_RSP: - /* minimize dwell time */ - af_params->dwell_time = WL_MIN_DWELL_TIME; -#ifdef WL_CFG80211_SYNC_GON - config_af_params->extra_listen = false; -#endif /* WL_CFG80211_SYNC_GON */ - break; - case P2P_PAF_PROVDIS_REQ: { - if (IS_PROV_DISC_WITHOUT_GROUP_ID(&act_frm->elts[0], - action_frame->len)) { - config_af_params->search_channel = true; - } - - config_af_params->mpc_onoff = 0; - wl->next_af_subtype = act_frm->subtype + 1; - /* increase dwell time to wait for RESP frame */ - af_params->dwell_time = WL_MED_DWELL_TIME; - break; - } - case P2P_PAF_PROVDIS_RSP: { - wl->next_af_subtype = P2P_PAF_GON_REQ; - /* increase dwell time to MED level */ - af_params->dwell_time = WL_MED_DWELL_TIME; -#ifdef WL_CFG80211_SYNC_GON - config_af_params->extra_listen = false; -#endif /* WL_CFG80211_SYNC_GON */ - break; - } - default: - WL_DBG(("Unknown p2p pub act frame subtype: %d\n", - act_frm->subtype)); - err = BCME_BADARG; - } - return err; -} - - -static bool -wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, - struct net_device *ndev, wl_af_params_t *af_params, - wl_action_frame_t *action_frame, u16 action_frame_len, s32 bssidx) -{ - struct wl_priv *wl = wiphy_priv(wiphy); - bool ack = false; - u8 category, action; - s32 tx_retry; - struct p2p_config_af_params config_af_params; - -#ifdef WL11U - if (!af_params || !action_frame || (!p2p_is_on(wl) && !wl->wl11u)) -#else - if (!af_params || !action_frame || !p2p_is_on(wl)) - return false; -#endif - - wl_cfgp2p_print_actframe(true, action_frame->data, action_frame->len); - - category = action_frame->data[DOT11_ACTION_CAT_OFF]; - action = action_frame->data[DOT11_ACTION_ACT_OFF]; - - /* initialize variables */ - tx_retry = 0; - wl->next_af_subtype = -1; - config_af_params.max_tx_retry = WL_AF_TX_MAX_RETRY; - config_af_params.mpc_onoff = -1; - config_af_params.search_channel = false; -#ifdef WL_CFG80211_GON_COLLISION - config_af_params.drop_tx_req = false; -#endif -#ifdef WL_CFG80211_SYNC_GON - config_af_params.extra_listen = false; -#endif - - /* config parameters */ - /* Public Action Frame Process - DOT11_ACTION_CAT_PUBLIC */ - if (category == DOT11_ACTION_CAT_PUBLIC) { - if ((action == P2P_PUB_AF_ACTION) && - (action_frame_len >= sizeof(wifi_p2p_pub_act_frame_t))) { - /* p2p public action frame process */ - if (BCME_OK != wl_cfg80211_config_p2p_pub_af_tx(wiphy, - action_frame, af_params, &config_af_params)) { - WL_DBG(("Unknown subtype.\n")); - } - -#ifdef WL_CFG80211_GON_COLLISION - if (config_af_params.drop_tx_req) { - if (wl->block_gon_req_tx_count) { - /* drop gon req tx action frame */ - WL_DBG(("Drop gon req tx action frame: count %d\n", - wl->block_gon_req_tx_count)); - goto exit; - } - } -#endif /* WL_CFG80211_GON_COLLISION */ - } else if (action_frame_len >= sizeof(wifi_p2psd_gas_pub_act_frame_t)) { - /* service discovery process */ - if (action == P2PSD_ACTION_ID_GAS_IREQ || - action == P2PSD_ACTION_ID_GAS_IREQ) { - /* configure service discovery query frame */ - - config_af_params.search_channel = true; - - /* save next af suptype to cancel remained dwell time */ - wl->next_af_subtype = action + 1; - - af_params->dwell_time = WL_MED_DWELL_TIME; - } else if (action == P2PSD_ACTION_ID_GAS_IRESP || - action == P2PSD_ACTION_ID_GAS_IRESP) { - /* configure service discovery response frame */ - af_params->dwell_time = WL_MIN_DWELL_TIME; - } else { - WL_DBG(("Unknown action type: %d\n", action)); - } - } else { - WL_DBG(("Unknown Frame: category 0x%x, action 0x%x, length %d\n", - category, action, action_frame_len)); - } - } else if (category == P2P_AF_CATEGORY) { - /* do not configure anything. it will be sent with a default configuration */ - } else { - WL_DBG(("Unknown Frame: category 0x%x, action 0x%x\n", - category, action)); - } - - /* To make sure to send successfully action frame, we have to turn off mpc */ - if (config_af_params.mpc_onoff == 0) { - wldev_iovar_setint(dev, "mpc", 0); - } - - /* validate channel and p2p ies */ - if (config_af_params.search_channel && IS_P2P_SOCIAL(af_params->channel) && - wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) { - config_af_params.search_channel = true; - } else { - config_af_params.search_channel = false; - } - -#ifdef WL11U - if (ndev == wl_to_prmry_ndev(wl)) - config_af_params.search_channel = false; -#endif /* WL11U */ - -#ifdef VSDB - /* if connecting on primary iface, sleep for a while before sending af tx for VSDB */ - if (wl_get_drv_status(wl, CONNECTING, wl_to_prmry_ndev(wl))) { - msleep(50); - } -#endif - - /* if scan is ongoing, abort current scan. */ - if (wl_get_drv_status_all(wl, SCANNING)) { - wl_notify_escan_complete(wl, ndev, true, true); - } - - /* set status and destination address before sending af */ - if (wl->next_af_subtype != -1) { - /* set this status to cancel the remained dwell time in rx process */ - wl_set_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); - } - wl_set_drv_status(wl, SENDING_ACT_FRM, dev); - memcpy(wl->afx_hdl->tx_dst_addr.octet, - af_params->action_frame.da.octet, - sizeof(wl->afx_hdl->tx_dst_addr.octet)); + wl_clr_drv_status(wl, SCANNING_PEER_CHANNEL, dev); - /* save af_params for rx process */ - wl->afx_hdl->pending_tx_act_frm = af_params; - - /* search peer's channel */ - if (config_af_params.search_channel) { - /* initialize afx_hdl */ - wl->afx_hdl->bssidx = wl_cfgp2p_find_idx(wl, dev); - wl->afx_hdl->dev = dev; - wl->afx_hdl->retry = 0; - wl->afx_hdl->peer_chan = WL_INVALID; - - if (wl_cfg80211_af_searching_channel(wl, dev) == WL_INVALID) { - WL_ERR(("couldn't find peer's channel.\n")); - goto exit; - } - - /* Suspend P2P discovery's search-listen to prevent it from - * starting a scan or changing the channel. - */ - wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); -/* Do not abort scan for VSDB. Scan will be aborted in firmware if necessary */ -#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - wl_notify_escan_complete(wl, dev, true, true); -#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ - wl_cfgp2p_discover_enable_search(wl, false); - - /* update channel */ - af_params->channel = wl->afx_hdl->peer_chan; - } - - /* Now send a tx action frame */ - ack = wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx) ? false : true; - - /* if failed, retry it. tx_retry_max value is configure by .... */ - while ((ack == false) && (tx_retry++ < config_af_params.max_tx_retry)) { - WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); - - ack = wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx) ? - false : true; - } - if (ack == false) { - WL_ERR(("Failed to send Action Frame(retry %d)\n", tx_retry)); + if (wl->afx_hdl->peer_chan != WL_INVALID) + wl_cfg80211_send_pending_tx_act_frm(wl); + else { + WL_ERR(("Couldn't find the peer after %d retries\n", + wl->afx_hdl->retry)); } -exit: - /* Clear SENDING_ACT_FRM after all sending af is done */ + wl->afx_hdl->is_listen = FALSE; + wl->afx_hdl->pending_tx_act_frm = NULL; + wl->afx_hdl->dev = NULL; + wl->afx_hdl->bssidx = WL_INVALID; +#ifndef CUSTOMER_HW_SAMSUNG +#error remove sending act frame to improve P2P connection ratio wl_clr_drv_status(wl, SENDING_ACT_FRM, dev); - -#ifdef WL_CFG80211_SYNC_GON - /* WAR: sometimes dongle does not keep the dwell time of 'actframe'. - * if we coundn't get the next action response frame and dongle does not keep - * the dwell time, go to listen state again to get next action response frame. - */ - if (ack && config_af_params.extra_listen && -#ifdef WL_CFG80211_GON_COLLISION - !wl->block_gon_req_tx_count && -#endif /* WL_CFG80211_GON_COLLISION */ - wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM) && - wl->af_sent_channel == wl->afx_hdl->my_listen_chan) { - s32 extar_listen_time; - - extar_listen_time = af_params->dwell_time - - jiffies_to_msecs(jiffies - wl->af_tx_sent_jiffies); - - if (extar_listen_time > 50) { - wl_set_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, dev); - WL_DBG(("Wait more time! actual af time:%d," - "calculated extar listen:%d\n", - af_params->dwell_time, extar_listen_time)); - if (wl_cfgp2p_discover_listen(wl, wl->af_sent_channel, - extar_listen_time + 100) == BCME_OK) { - wait_for_completion_timeout(&wl->wait_next_af, - msecs_to_jiffies(extar_listen_time + 100 + 300)); - } - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, dev); - } - } -#endif /* WL_CFG80211_SYNC_GON */ - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); - - if (wl->afx_hdl->pending_tx_act_frm) - wl->afx_hdl->pending_tx_act_frm = NULL; - - WL_INFO(("-- sending Action Frame is %s, listen chan: %d\n", - (ack) ? "Succeeded!!":"Failed!!", wl->afx_hdl->my_listen_chan)); - -#ifdef WL_CFG80211_GON_COLLISION - if (wl->block_gon_req_tx_count) { - wl->block_gon_req_tx_count--; - /* if ack is ture, supplicant will wait more time(100ms). - * so we will return it as a success to get more time . - */ - ack = true; - } -#endif /* WL_CFG80211_GON_COLLISION */ - - /* if all done, turn mpc on again */ - if (config_af_params.mpc_onoff == 1) { - wldev_iovar_setint(dev, "mpc", 1); - } - - return ack; +#endif + if (wl->afx_hdl->ack_recv) + return true; /* ACK */ + else + return false; /* NO ACK */ } static s32 @@ -4531,26 +4284,40 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, struct ieee80211_channel *channel, bool offchan, enum nl80211_channel_type channel_type, bool channel_type_valid, unsigned int wait, - const u8* buf, size_t len, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) - bool no_cck, -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) - bool dont_wait_for_ack, -#endif - u64 *cookie) + const u8* buf, size_t len, u64 *cookie) { wl_action_frame_t *action_frame; wl_af_params_t *af_params; - scb_val_t scb_val; + wifi_p2p_ie_t *p2p_ie; + wpa_ie_fixed_t *wps_ie; + wifi_wfd_ie_t *wfd_ie; + wifi_p2p_ie_t *customer_ie; const struct ieee80211_mgmt *mgmt; struct wl_priv *wl = wiphy_priv(wiphy); struct net_device *dev = NULL; s32 err = BCME_OK; s32 bssidx = 0; + u32 p2pie_len = 0; + u32 wpsie_len = 0; + u32 wfdie_len = 0; + u32 customer_ie_len = 0; + u32 remain_len; u32 id; + u32 retry = 0; + u8 *ptr; bool ack = false; + wifi_p2p_pub_act_frame_t *act_frm = NULL; + wifi_p2p_action_frame_t *p2p_act_frm = NULL; + wifi_p2psd_gas_pub_act_frame_t *sd_act_frm = NULL; + scb_val_t scb_val; s8 eabuf[ETHER_ADDR_STR_LEN]; +#ifdef WL_CFG80211_GON_COLLISION + static uint8 saved_af_subtype = 0xff; +#endif /* WL_CFG80211_GON_COLLISION */ +#ifdef WL_CFG80211_SYNC_GON_TIME + bool is_waiting_more_time = false; +#endif /* WL_CFG80211_SYNC_GON_TIME */ + bool is_PROVDIS_REQ_GO = false; WL_DBG(("Enter \n")); @@ -4587,22 +4354,63 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, if (ieee80211_is_probe_resp(mgmt->frame_control)) { s32 ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; s32 ie_len = len - ie_offset; - if (dev == wl_to_prmry_ndev(wl)) - bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); - wl_cfgp2p_set_management_ie(wl, dev, bssidx, - VNDR_IE_PRBRSP_FLAG, (u8 *)(buf + ie_offset), ie_len); + if ((p2p_ie = wl_cfgp2p_find_p2pie((u8 *)(buf + ie_offset), ie_len)) + != NULL) { + /* Total length of P2P Information Element */ + p2pie_len = p2p_ie->len + sizeof(p2p_ie->len) + sizeof(p2p_ie->id); + } + if ((wfd_ie = wl_cfgp2p_find_wfdie((u8 *)(buf + ie_offset), ie_len)) + != NULL) { + /* Total length of WFD Information Element */ + wfdie_len = wfd_ie->len + sizeof(wfd_ie->len) + sizeof(wfd_ie->id); + } + if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)(buf + ie_offset), ie_len)) + != NULL) { + wpsie_len = wps_ie->length + sizeof(wps_ie->length) + + sizeof(wps_ie->tag); + } + + /* Customer IE */ + ptr = (u8 *)(buf + ie_offset); + remain_len = ie_len; + customer_ie_len = 0; + while (remain_len > 0) + { + customer_ie = wl_cfgp2p_find_customer_ie(ptr, &remain_len); + if (customer_ie) + { + u32 add_len; + add_len = customer_ie->len + sizeof(customer_ie->len) + + sizeof(customer_ie->id); + customer_ie_len += add_len; + ptr = (u8*)customer_ie + add_len; + remain_len -= add_len; + WL_INFO(("Customer IE exist(len:%d)\n", add_len)); + } + else + break; + } + /* Order of Vendor IE is 1) WPS IE + + * 2) P2P IE created by supplicant + * So, it is ok to find start address of WPS IE + * to save IEs + */ + + wl_cfgp2p_set_management_ie(wl, dev, bssidx, + VNDR_IE_PRBRSP_FLAG, + (u8 *)wps_ie, wpsie_len + p2pie_len + wfdie_len + customer_ie_len); + cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); goto exit; } else if (ieee80211_is_disassoc(mgmt->frame_control) || ieee80211_is_deauth(mgmt->frame_control)) { memcpy(scb_val.ea.octet, mgmt->da, ETH_ALEN); scb_val.val = mgmt->u.disassoc.reason_code; - wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, - sizeof(scb_val_t), true); - WL_DBG(("Disconnect STA : %s scb_val.val %d\n", - bcm_ether_ntoa((const struct ether_addr *)mgmt->da, eabuf), - scb_val.val)); - wl_delay(400); + if (wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, + sizeof(scb_val_t), true) < 0) + WL_ERR(("Connect Status check is required\n")); + WL_DBG(("Disconnect STA : %s\n", + bcm_ether_ntoa((const struct ether_addr *)mgmt->da, eabuf))); cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); goto exit; @@ -4618,7 +4426,9 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, * And previous off-channel action frame must be ended before new af tx. */ #ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - wl_notify_escan_complete(wl, dev, true, true); + WL_SCAN2(("Abort scan: %p(%d)\n", dev, wl->escan_info.cur_sync_id)); + + wl_cfg80211_scan_abort(wl, dev); #endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ } @@ -4656,19 +4466,230 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, wl->afx_hdl->peer_listen_chan = af_params->channel; WL_DBG(("channel from upper layer %d\n", wl->afx_hdl->peer_listen_chan)); - /* Add the default dwell time + + + /* Add the dwell time * Dwell time to stay off-channel to wait for a response action frame * after transmitting an GO Negotiation action frame */ af_params->dwell_time = WL_DWELL_TIME; memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], action_frame->len); + if (wl_cfgp2p_is_pub_action(action_frame->data, action_frame->len)) { + act_frm = (wifi_p2p_pub_act_frame_t *) (action_frame->data); + WL_DBG(("P2P PUB action_frame->len: %d chan %d category %d subtype %d\n", + action_frame->len, af_params->channel, + act_frm->category, act_frm->subtype)); + } else if (wl_cfgp2p_is_p2p_action(action_frame->data, action_frame->len)) { + p2p_act_frm = (wifi_p2p_action_frame_t *) (action_frame->data); + WL_DBG(("P2P action_frame->len: %d chan %d category %d subtype %d\n", + action_frame->len, af_params->channel, + p2p_act_frm->category, p2p_act_frm->subtype)); + } else if (wl_cfgp2p_is_gas_action(action_frame->data, action_frame->len)) { + sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *) (action_frame->data); + WL_DBG(("Service Discovery action_frame->len: %d chan %d category %d action %d\n", + action_frame->len, af_params->channel, + sd_act_frm->category, sd_act_frm->action)); - ack = wl_cfg80211_send_action_frame(wiphy, dev, ndev, af_params, - action_frame, action_frame->len, bssidx); + } + wl_cfgp2p_print_actframe(true, action_frame->data, action_frame->len); + /* + * To make sure to send successfully action frame, we have to turn off mpc + */ - cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); + if (act_frm) { +#ifdef WL_CFG80211_GON_COLLISION + if (wl->block_gon_req_tx_count && act_frm->subtype == P2P_PAF_GON_REQ) { + /* drop gon req tx action frame */ + wl->block_gon_req_tx_count--; + WL_ERR(("Drop gon req tx action frame: count %d\n", wl->block_gon_req_tx_count)); + cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); + kfree(af_params); + goto exit; + } else if (act_frm->subtype == P2P_PAF_GON_CONF) { + /* if go formation done, clear it */ + wl->block_gon_req_tx_count = 0; + wl->block_gon_req_rx_count = 0; + } +#endif /* WL_CFG80211_GON_COLLISION */ + + if ((act_frm->subtype == P2P_PAF_GON_REQ) || + (act_frm->subtype == P2P_PAF_GON_RSP) || + (act_frm->subtype == P2P_PAF_GON_CONF) || + (act_frm->subtype == P2P_PAF_PROVDIS_REQ)) { + wldev_iovar_setint(dev, "mpc", 0); + } + + if (act_frm->subtype == P2P_PAF_GON_REQ) { + wl->afx_hdl->my_listen_chan = + wl_find_my_listen_channel(wl, act_frm->elts, action_frame->len); + } + + if (act_frm->subtype == P2P_PAF_DEVDIS_REQ) { + af_params->dwell_time = WL_LONG_DWELL_TIME; + } else if (act_frm->subtype == P2P_PAF_PROVDIS_REQ || + act_frm->subtype == P2P_PAF_INVITE_REQ || + act_frm->subtype == P2P_PAF_GON_REQ || + act_frm->subtype == P2P_PAF_GON_RSP || + act_frm->subtype == P2P_PAF_PROVDIS_RSP) { + af_params->dwell_time = WL_MED_DWELL_TIME; + } + +#ifdef WL_CFG80211_SYNC_GON_TIME + if (act_frm->subtype == P2P_PAF_PROVDIS_REQ || + act_frm->subtype == P2P_PAF_INVITE_REQ || + act_frm->subtype == P2P_PAF_GON_REQ || + act_frm->subtype == P2P_PAF_GON_RSP) { + /* sometimes we can't get next gon frame with remain-on-channel, + * waiting for next gon frame more! + */ + is_waiting_more_time = true; + if (act_frm->subtype == P2P_PAF_PROVDIS_RSP) + wl->next_gon_af_subtype = P2P_PAF_GON_REQ; + else + wl->next_gon_af_subtype = act_frm->subtype + 1; + + wl_set_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); + wl->afx_hdl->peer_chan = WL_INVALID; + } else + wl->next_gon_af_subtype = -1; +#endif /* WL_CFG80211_SYNC_GON_TIME */ + } + + +#ifdef VSDB + /* if connecting, sleep for a while before retry for VSDB */ + if (wl_get_drv_status(wl, CONNECTING, wl_to_prmry_ndev(wl))) { + msleep(50); + } +#endif + /* if scanning, abort current scan. */ + if (wl_get_drv_status_all(wl, SCANNING)) { + wl_cfg80211_scan_abort(wl, dev); + } + + /* Set SENDING_ACT_FRM and destinatio address for sending af */ + wl_set_drv_status(wl, SENDING_ACT_FRM, dev); + memcpy(wl->afx_hdl->tx_dst_addr.octet, + af_params->action_frame.da.octet, + sizeof(wl->afx_hdl->tx_dst_addr.octet)); + if (act_frm && act_frm->elts) { + if ((act_frm->subtype == P2P_PAF_PROVDIS_REQ) && + (p2p_ie = wl_cfgp2p_find_p2pie((u8 *)act_frm->elts, + action_frame->len)) != NULL) { + if ((ptr = wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID))) { + is_PROVDIS_REQ_GO = true; + } + } + } + + if (!is_PROVDIS_REQ_GO && IS_P2P_SOCIAL(af_params->channel) && + (IS_P2P_PUB_ACT_REQ(act_frm, action_frame->len) || + IS_GAS_REQ(sd_act_frm, action_frame->len)) && + wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) { + /* channel offload require P2P IE for Probe request + * otherwise, we will use wl_cfgp2p_tx_action_frame directly. + * channel offload for action request frame + */ + + /* channel offload for action request frame */ + ack = wl_cfg80211_send_at_common_channel(wl, dev, af_params); + } else { + if (!wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) + WL_ERR(("<<<< TX action frame without probe req ie >>>>\n")); + if (!IS_P2P_SOCIAL(af_params->channel)) + WL_ERR(("<<<< TX action frame with (CH %d) >>>>\n", + af_params->channel)); + ack = (wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx)) ? false : true; + if (!ack) { + u32 max_retry = WL_CHANNEL_SYNC_RETRY; + WL_AF_TX_REDUCE_RETRY_VSDB(wl, max_retry); + + if (wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) { + /* if the NO ACK occurs, the peer device will be on + * listen channel of the peer + * So, we have to find the peer and send action frame on + * that channel. + */ + /* if public action response, the peer only wait for 100ms. + * do not sync channel + */ + if (act_frm && IS_P2P_SOCIAL(af_params->channel) && + !IS_P2P_PUB_ACT_RSP_SUBTYPE(act_frm->subtype)) { + ack = wl_cfg80211_send_at_common_channel(wl, dev, af_params); + } else { + for (retry = 0; retry < max_retry; retry++) { + WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); + ack = (wl_cfgp2p_tx_action_frame(wl, dev, + af_params, bssidx)) ? false : true; + if (ack) + break; + } + } + } else { + for (retry = 0; retry < max_retry; retry++) { + WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); + ack = (wl_cfgp2p_tx_action_frame(wl, dev, + af_params, bssidx)) ? false : true; + if (ack) + break; + } + + } + + } + + } + + /* Clear SENDING_ACT_FRM after all sending af is done */ + wl_clr_drv_status(wl, SENDING_ACT_FRM, dev); + +#ifdef WL_CFG80211_SYNC_GON_TIME + if (ack && is_waiting_more_time && !wl->block_gon_req_tx_count && + wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM) && + wl->af_sent_channel == wl->afx_hdl->my_listen_chan) { + s32 extar_listen_time; + + extar_listen_time = + af_params->dwell_time - jiffies_to_msecs(jiffies - wl->saved_jiffies); + + if (extar_listen_time > 50) { + wl_set_drv_status(wl, WAITING_MORE_TIME_NEXT_ACT_FRM, dev); + WL_DBG(("Wait more time! actual af time:%d, calculated extar listen:%d\n", + af_params->dwell_time, extar_listen_time)); + if (wl_cfgp2p_discover_listen(wl, wl->af_sent_channel, + extar_listen_time + 100) == BCME_OK) { + wait_for_completion_timeout(&wl->wait_next_af, + msecs_to_jiffies(extar_listen_time + 100 + 300)); + } + wl_clr_drv_status(wl, WAITING_MORE_TIME_NEXT_ACT_FRM, dev); + } + } + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); + + WL_INFO(("-- sending Action Frame is %s, af sent chan: %d, my listen chan: %d\n", + (ack) ? "Succeeded!!":"Failed!!", wl->af_sent_channel, wl->afx_hdl->my_listen_chan)); +#endif /* WL_CFG80211_SYNC_GON_TIME */ + +#ifdef WL_CFG80211_GON_COLLISION + /* Save Action Frame subtype */ + if (act_frm) + saved_af_subtype = act_frm->subtype; + else + saved_af_subtype = 0xff; + + /* if ack is ture, supplicant will wait more time(100ms). + * so we will return it as a success if block gon req tx is on. + */ + if (wl->block_gon_req_tx_count) + ack = true; +#endif /* WL_CFG80211_GON_COLLISION */ + + cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); + if (ack && act_frm && act_frm->subtype == P2P_PAF_GON_CONF) { + wldev_iovar_setint(dev, "mpc", 1); + } kfree(af_params); exit: return err; @@ -4749,9 +4770,9 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, chspec = CH20MHZ_CHSPEC(channel); } -#endif /* NOT_YET */ +#endif #ifdef HT40_GO - switch (_chan) { + switch(_chan) { /* adjust channel to center of 40MHz band */ case 40: case 48: @@ -4774,7 +4795,7 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, break; } - chspec = wl_chspec_host_to_driver(chspec); + if ((err = wldev_iovar_setint(dev, "chanspec", chspec)) == BCME_BADCHAN) { err = wldev_ioctl(dev, WLC_SET_CHANNEL, &_chan, sizeof(_chan), true); if (err < 0) { @@ -4788,38 +4809,11 @@ wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, WL_ERR(("WLC_SET_CHANNEL error %d" "chip may not be supporting this channel\n", err)); } -#endif /* HT40_GO */ +#endif return err; } static s32 -wl_validate_opensecurity(struct net_device *dev, s32 bssidx) -{ - s32 err = BCME_OK; - - /* set auth */ - err = wldev_iovar_setint_bsscfg(dev, "auth", 0, bssidx); - if (err < 0) { - WL_ERR(("auth error %d\n", err)); - return BCME_ERROR; - } - /* set wsec */ - err = wldev_iovar_setint_bsscfg(dev, "wsec", 0, bssidx); - if (err < 0) { - WL_ERR(("wsec error %d\n", err)); - return BCME_ERROR; - } - /* set upper-layer auth */ - err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", WPA_AUTH_NONE, bssidx); - if (err < 0) { - WL_ERR(("wpa_auth error %d\n", err)); - return BCME_ERROR; - } - - return 0; -} - -static s32 wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) { s32 len = 0; @@ -4832,11 +4826,6 @@ wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) wpa_suite_mcast_t *mcast; wpa_suite_ucast_t *ucast; wpa_suite_auth_key_mgmt_t *mgmt; - - u16 suite_count; - u8 rsn_cap[2]; - u32 wme_bss_disable; - if (wpa2ie == NULL) goto exit; @@ -4867,12 +4856,10 @@ wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) WL_ERR(("No Security Info\n")); break; } - if ((len -= WPA_SUITE_LEN) <= 0) - return BCME_BADLEN; - + len -= WPA_SUITE_LEN; /* check the unicast cipher */ ucast = (wpa_suite_ucast_t *)&mcast[1]; - suite_count = ltoh16_ua(&ucast->count); + ltoh16_ua(&ucast->count); switch (ucast->list[0].type) { case WPA_CIPHER_NONE: pval = 0; @@ -4895,14 +4882,11 @@ wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) default: WL_ERR(("No Security Info\n")); } - if ((len -= (WPA_IE_SUITE_COUNT_LEN + (WPA_SUITE_LEN * suite_count))) <= 0) - return BCME_BADLEN; - /* FOR WPS , set SEC_OW_ENABLED */ wsec = (pval | gval | SES_OW_ENABLED); /* check the AKM */ - mgmt = (wpa_suite_auth_key_mgmt_t *)&ucast->list[suite_count]; - suite_count = ltoh16_ua(&mgmt->count); + mgmt = (wpa_suite_auth_key_mgmt_t *)&ucast->list[1]; + ltoh16_ua(&mgmt->count); switch (mgmt->list[0].type) { case RSN_AKM_NONE: wpa_auth = WPA_AUTH_NONE; @@ -4916,27 +4900,6 @@ wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) default: WL_ERR(("No Key Mgmt Info\n")); } - - if ((len -= (WPA_IE_SUITE_COUNT_LEN + (WPA_SUITE_LEN * suite_count))) >= RSN_CAP_LEN) { - rsn_cap[0] = *(u8 *)&mgmt->list[suite_count]; - rsn_cap[1] = *((u8 *)&mgmt->list[suite_count] + 1); - - if (rsn_cap[0] & (RSN_CAP_16_REPLAY_CNTRS << RSN_CAP_PTK_REPLAY_CNTR_SHIFT)) { - wme_bss_disable = 0; - } else { - wme_bss_disable = 1; - } - - /* set wme_bss_disable to sync RSN Capabilities */ - err = wldev_iovar_setint_bsscfg(dev, "wme_bss_disable", wme_bss_disable, bssidx); - if (err < 0) { - WL_ERR(("wme_bss_disable error %d\n", err)); - return BCME_ERROR; - } - } else { - WL_DBG(("There is no RSN Capabilities. remained len %d\n", len)); - } - /* set auth */ err = wldev_iovar_setint_bsscfg(dev, "auth", auth, bssidx); if (err < 0) { @@ -5106,187 +5069,128 @@ exit: } static s32 -wl_cfg80211_bcn_validate_sec( - struct net_device *dev, - struct parsed_ies *ies, - u32 dev_role, - s32 bssidx) -{ - struct wl_priv *wl = wlcfg_drv_priv; - - if (dev_role == NL80211_IFTYPE_P2P_GO && (ies->wpa2_ie)) { - /* For P2P GO, the sec type is WPA2-PSK */ - WL_DBG(("P2P GO: validating wpa2_ie")); - if (wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0) - return BCME_ERROR; - - } else if (dev_role == NL80211_IFTYPE_AP) { - - WL_DBG(("SoftAP: validating security")); - /* If wpa2_ie or wpa_ie is present validate it */ - if ((ies->wpa2_ie || ies->wpa_ie) && - ((wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0 || - wl_validate_wpaie(dev, ies->wpa_ie, bssidx) < 0))) { - wl->ap_info->security_mode = false; - return BCME_ERROR; - } - - wl->ap_info->security_mode = true; - if (wl->ap_info->rsn_ie) { - kfree(wl->ap_info->rsn_ie); - wl->ap_info->rsn_ie = NULL; - } - if (wl->ap_info->wpa_ie) { - kfree(wl->ap_info->wpa_ie); - wl->ap_info->wpa_ie = NULL; - } - if (wl->ap_info->wps_ie) { - kfree(wl->ap_info->wps_ie); - wl->ap_info->wps_ie = NULL; - } - if (ies->wpa_ie != NULL) { - /* WPAIE */ - wl->ap_info->rsn_ie = NULL; - wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, - ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); - } else if (ies->wpa2_ie != NULL) { - /* RSNIE */ - wl->ap_info->wpa_ie = NULL; - wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, - ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); - } - - if (!ies->wpa2_ie && !ies->wpa_ie) { - wl_validate_opensecurity(dev, bssidx); - wl->ap_info->security_mode = false; - } - - if (ies->wps_ie) { - wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); - } - } - - return 0; - -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) -static s32 wl_cfg80211_bcn_set_params( - struct cfg80211_ap_settings *info, - struct net_device *dev, - u32 dev_role, s32 bssidx) +wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev, + struct beacon_parameters *info) { - struct wl_priv *wl = wlcfg_drv_priv; s32 err = BCME_OK; + bcm_tlv_t *ssid_ie; + wlc_ssid_t ssid; + struct wl_priv *wl = wiphy_priv(wiphy); + struct wl_join_params join_params; + wpa_ie_fixed_t *wps_ie; + wpa_ie_fixed_t *wpa_ie; + bcm_tlv_t *wpa2_ie; + wifi_p2p_ie_t *p2p_ie; + wifi_wfd_ie_t *wfd_ie; + bool is_bssup = false; + bool update_bss = false; + bool pbc = false; + u16 wpsie_len = 0; + u16 p2pie_len = 0; + u32 wfdie_len = 0; + u8 beacon_ie[IE_MAX_LEN]; + s32 ie_offset = 0; + s32 bssidx = 0; + s32 infra = 1; + s32 join_params_size = 0; + s32 ap = 0; + WL_DBG(("interval (%d) dtim_period (%d) head_len (%d) tail_len (%d)\n", + info->interval, info->dtim_period, info->head_len, info->tail_len)); - WL_DBG(("interval (%d) \ndtim_period (%d) \n", - info->beacon_interval, info->dtim_period)); - - if (info->beacon_interval) { - if ((err = wldev_ioctl(dev, WLC_SET_BCNPRD, - &info->beacon_interval, sizeof(s32), true)) < 0) { - WL_ERR(("Beacon Interval Set Error, %d\n", err)); - return err; - } + if (wl->p2p_net == dev) { + dev = wl_to_prmry_ndev(wl); } - if (info->dtim_period) { - if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, - &info->dtim_period, sizeof(s32), true)) < 0) { - WL_ERR(("DTIM Interval Set Error, %d\n", err)); - return err; - } - } + bssidx = wl_cfgp2p_find_idx(wl, dev); + if (p2p_is_on(wl) && + (bssidx == wl_to_p2p_bss_bssidx(wl, + P2PAPI_BSSCFG_CONNECTION))) { + memset(beacon_ie, 0, sizeof(beacon_ie)); + /* We don't need to set beacon for P2P_GO, + * but need to parse ssid from beacon_parameters + * because there is no way to set ssid + */ + ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; + /* find the SSID */ + if ((ssid_ie = bcm_parse_tlvs((u8 *)&info->head[ie_offset], + info->head_len - ie_offset, + DOT11_MNG_SSID_ID)) != NULL) { + memcpy(wl->p2p->ssid.SSID, ssid_ie->data, ssid_ie->len); + wl->p2p->ssid.SSID_len = ssid_ie->len; + WL_DBG(("SSID (%s) in Head \n", ssid_ie->data)); - if ((info->ssid) && (info->ssid_len > 0) && - (info->ssid_len <= 32)) { - WL_DBG(("SSID (%s) len:%d \n", info->ssid, info->ssid_len)); - if (dev_role == NL80211_IFTYPE_AP) { - /* Store the hostapd SSID */ - memset(wl->hostapd_ssid.SSID, 0x00, 32); - memcpy(wl->hostapd_ssid.SSID, info->ssid, info->ssid_len); - wl->hostapd_ssid.SSID_len = info->ssid_len; } else { - /* P2P GO */ - memset(wl->p2p->ssid.SSID, 0x00, 32); - memcpy(wl->p2p->ssid.SSID, info->ssid, info->ssid_len); - wl->p2p->ssid.SSID_len = info->ssid_len; + WL_ERR(("No SSID in beacon \n")); } - } - - if (info->hidden_ssid) { - if ((err = wldev_iovar_setint(dev, "closednet", 1)) < 0) - WL_ERR(("failed to set hidden : %d\n", err)); - WL_DBG(("hidden_ssid_enum_val: %d \n", info->hidden_ssid)); - } - - return err; -} -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ -static s32 -wl_cfg80211_parse_ies(u8 *ptr, u32 len, struct parsed_ies *ies) -{ - s32 err = BCME_OK; - - memset(ies, 0, sizeof(struct parsed_ies)); - - /* find the WPSIE */ - if ((ies->wps_ie = wl_cfgp2p_find_wpsie(ptr, len)) != NULL) { - WL_DBG(("WPSIE in beacon \n")); - ies->wps_ie_len = ies->wps_ie->length + WPA_RSN_IE_TAG_FIXED_LEN; - } else { - WL_ERR(("No WPSIE in beacon \n")); - } - - /* find the RSN_IE */ - if ((ies->wpa2_ie = bcm_parse_tlvs(ptr, len, - DOT11_MNG_RSN_ID)) != NULL) { - WL_DBG((" WPA2 IE found\n")); - ies->wpa2_ie_len = ies->wpa2_ie->len; - } - - /* find the WPA_IE */ - if ((ies->wpa_ie = wl_cfgp2p_find_wpaie(ptr, len)) != NULL) { - WL_DBG((" WPA found\n")); - ies->wpa_ie_len = ies->wpa_ie->length; - } + /* find the WPSIE */ + if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)info->tail, info->tail_len)) != NULL) { + wpsie_len = wps_ie->length + WPA_RSN_IE_TAG_FIXED_LEN; + /* + * Should be compared with saved ie before saving it + */ + wl_validate_wps_ie((char *) wps_ie, &pbc); + memcpy(beacon_ie, wps_ie, wpsie_len); + } else { + WL_ERR(("No WPSIE in beacon \n")); + } - return err; -} + /* find the P2PIE */ + if ((p2p_ie = wl_cfgp2p_find_p2pie((u8 *)info->tail, info->tail_len)) != NULL) { + /* Total length of P2P Information Element */ + p2pie_len = p2p_ie->len + sizeof(p2p_ie->len) + sizeof(p2p_ie->id); + memcpy(&beacon_ie[wpsie_len], p2p_ie, p2pie_len); -static s32 -wl_cfg80211_bcn_bringup_ap( - struct net_device *dev, - struct parsed_ies *ies, - u32 dev_role, s32 bssidx) -{ - struct wl_priv *wl = wlcfg_drv_priv; - struct wl_join_params join_params; - bool is_bssup = false; - s32 infra = 1; - s32 join_params_size = 0; - s32 ap = 1; - s32 err = BCME_OK; - - WL_DBG(("Enter dev_role: %d\n", dev_role)); + } else { + WL_ERR(("No P2PIE in beacon \n")); + } - /* Common code for SoftAP and P2P GO */ - wldev_iovar_setint(dev, "mpc", 0); + /* find the WFD IEs */ + if ((wfd_ie = wl_cfgp2p_find_wfdie((u8 *)info->tail, info->tail_len)) != NULL) { + /* Total length of P2P Information Element */ + wfdie_len = wfd_ie->len + sizeof(wfd_ie->len) + sizeof(wfd_ie->id); + if ((wpsie_len + p2pie_len + wfdie_len) < IE_MAX_LEN) { + memcpy(&beacon_ie[wpsie_len + p2pie_len], wfd_ie, wfdie_len); + } else { + WL_ERR(("Found WFD IE but there is no space, (%d)(%d)(%d)\n", + wpsie_len, p2pie_len, wfdie_len)); + wfdie_len = 0; + } + } else { + WL_INFO(("No WFDIE in beacon \n")); + } + /* add WLC_E_PROBREQ_MSG event to respose probe_request from STA */ + wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, pbc); + wl_cfgp2p_set_management_ie(wl, dev, bssidx, VNDR_IE_BEACON_FLAG, + beacon_ie, wpsie_len + p2pie_len + wfdie_len); - if (dev_role == NL80211_IFTYPE_P2P_GO) { + /* find the RSN_IE */ + if ((wpa2_ie = bcm_parse_tlvs((u8 *)info->tail, info->tail_len, + DOT11_MNG_RSN_ID)) != NULL) { + WL_DBG((" WPA2 IE is found\n")); + } is_bssup = wl_cfgp2p_bss_isup(dev, bssidx); - if (!is_bssup && (ies->wpa2_ie != NULL)) { + if (!is_bssup && (wpa2_ie != NULL)) { + if (!info->dtim_period) { + info->dtim_period = 1; + } + if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, + &info->dtim_period, sizeof(s32), true)) < 0) { + WL_ERR(("DTIM Interval Set Error, %d\n", err)); + return err; + } + wldev_iovar_setint(dev, "mpc", 0); + if ((err = wl_validate_wpa2ie(dev, wpa2_ie, bssidx)) < 0) { + WL_ERR(("WPA2 IE parsing error")); + goto exit; + } err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); if (err < 0) { WL_ERR(("SET INFRA error %d\n", err)); goto exit; } - err = wldev_iovar_setbuf_bsscfg(dev, "ssid", &wl->p2p->ssid, sizeof(wl->p2p->ssid), wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); @@ -5294,522 +5198,237 @@ wl_cfg80211_bcn_bringup_ap( WL_ERR(("GO SSID setting error %d\n", err)); goto exit; } - if ((err = wl_cfgp2p_bss(wl, dev, bssidx, 1)) < 0) { WL_ERR(("GO Bring up error %d\n", err)); goto exit; } - } else - WL_DBG(("Bss is already up\n")); - } else if ((dev_role == NL80211_IFTYPE_AP) && - (wl_get_drv_status(wl, AP_CREATING, dev))) { - /* Device role SoftAP */ - err = wldev_ioctl(dev, WLC_DOWN, &ap, sizeof(s32), true); - if (err < 0) { - WL_ERR(("WLC_DOWN error %d\n", err)); - goto exit; - } - err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); - if (err < 0) { - WL_ERR(("SET INFRA error %d\n", err)); - goto exit; - } - if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { - WL_ERR(("setting AP mode failed %d \n", err)); - goto exit; - } - - err = wldev_ioctl(dev, WLC_UP, &ap, sizeof(s32), true); - if (unlikely(err)) { - WL_ERR(("WLC_UP error (%d)\n", err)); - goto exit; } - - memset(&join_params, 0, sizeof(join_params)); - /* join parameters starts with ssid */ - join_params_size = sizeof(join_params.ssid); - memcpy(join_params.ssid.SSID, wl->hostapd_ssid.SSID, - wl->hostapd_ssid.SSID_len); - join_params.ssid.SSID_len = htod32(wl->hostapd_ssid.SSID_len); - - /* create softap */ - if ((err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, - join_params_size, true)) == 0) { - WL_DBG(("SoftAP set SSID (%s) success\n", join_params.ssid.SSID)); - wl_clr_drv_status(wl, AP_CREATING, dev); - wl_set_drv_status(wl, AP_CREATED, dev); - } - } - - -exit: - return err; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) -s32 -wl_cfg80211_parse_set_ies( - struct net_device *dev, - struct cfg80211_beacon_data *info, - struct parsed_ies *ies, - u32 dev_role, - s32 bssidx) -{ - struct wl_priv *wl = wlcfg_drv_priv; - struct parsed_ies prb_ies; - s32 err = BCME_OK; - - memset(ies, 0, sizeof(struct parsed_ies)); - memset(&prb_ies, 0, sizeof(struct parsed_ies)); - - /* Parse Beacon IEs */ - if (wl_cfg80211_parse_ies((u8 *)info->tail, - info->tail_len, ies) < 0) { - WL_ERR(("Beacon get IEs failed \n")); - err = -EINVAL; - goto fail; - } - - /* Set Beacon IEs to FW */ - if ((err = wl_cfgp2p_set_management_ie(wl, dev, bssidx, - VNDR_IE_BEACON_FLAG, (u8 *)info->tail, - info->tail_len)) < 0) { - WL_ERR(("Set Beacon IE Failed \n")); - } else { - WL_DBG(("Applied Vndr IEs for Beacon \n")); - } - - /* Parse Probe Response IEs */ - if (wl_cfg80211_parse_ies((u8 *)info->proberesp_ies, - info->proberesp_ies_len, &prb_ies) < 0) { - WL_ERR(("PRB RESP get IEs failed \n")); - err = -EINVAL; - goto fail; - } - - /* Set Probe Response IEs to FW */ - if ((err = wl_cfgp2p_set_management_ie(wl, dev, bssidx, - VNDR_IE_PRBRSP_FLAG, (u8 *)info->proberesp_ies, - info->proberesp_ies_len)) < 0) { - WL_ERR(("Set Probe Resp IE Failed \n")); - } else { - WL_DBG(("Applied Vndr IEs for Probe Resp \n")); - } - -fail: - - return err; -} -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ - -static s32 wl_cfg80211_hostapd_sec( - struct net_device *dev, - struct parsed_ies *ies, - s32 bssidx) -{ - bool update_bss = 0; - struct wl_priv *wl = wlcfg_drv_priv; - - - if (ies->wps_ie) { - if (wl->ap_info->wps_ie && - memcmp(wl->ap_info->wps_ie, ies->wps_ie, ies->wps_ie_len)) { - WL_DBG((" WPS IE is changed\n")); - kfree(wl->ap_info->wps_ie); - wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); - } else if (wl->ap_info->wps_ie == NULL) { - WL_DBG((" WPS IE is added\n")); - wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); - } - if ((ies->wpa_ie != NULL || ies->wpa2_ie != NULL)) { - if (!wl->ap_info->security_mode) { - /* change from open mode to security mode */ - update_bss = true; - if (ies->wpa_ie != NULL) { - wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, - ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); - } else { - wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, - ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); + } else if (wl_get_drv_status(wl, AP_CREATING, dev)) { + ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; + ap = 1; + /* find the SSID */ + if ((ssid_ie = bcm_parse_tlvs((u8 *)&info->head[ie_offset], + info->head_len - ie_offset, + DOT11_MNG_SSID_ID)) != NULL) { + memset(&ssid, 0, sizeof(wlc_ssid_t)); + memcpy(ssid.SSID, ssid_ie->data, ssid_ie->len); + WL_DBG(("SSID is (%s) in Head \n", ssid.SSID)); + ssid.SSID_len = ssid_ie->len; + wldev_iovar_setint(dev, "mpc", 0); + err = wldev_ioctl(dev, WLC_DOWN, &ap, sizeof(s32), true); + if (err < 0) { + WL_ERR(("WLC_DOWN error %d\n", err)); + goto exit; + } + err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); + if (err < 0) { + WL_ERR(("SET INFRA error %d\n", err)); + goto exit; + } + if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { + WL_ERR(("setting AP mode failed %d \n", err)); + return err; + } + /* find the RSN_IE */ + if ((wpa2_ie = bcm_parse_tlvs((u8 *)info->tail, info->tail_len, + DOT11_MNG_RSN_ID)) != NULL) { + WL_DBG((" WPA2 IE is found\n")); + } + /* find the WPA_IE */ + if ((wpa_ie = wl_cfgp2p_find_wpaie((u8 *)info->tail, + info->tail_len)) != NULL) { + WL_DBG((" WPA IE is found\n")); + } + if ((wpa_ie != NULL || wpa2_ie != NULL)) { + if (wl_validate_wpa2ie(dev, wpa2_ie, bssidx) < 0 || + wl_validate_wpaie(dev, wpa_ie, bssidx) < 0) { + wl->ap_info->security_mode = false; + return BCME_ERROR; } - } else if (wl->ap_info->wpa_ie) { - /* change from WPA2 mode to WPA mode */ - if (ies->wpa_ie != NULL) { - update_bss = true; + wl->ap_info->security_mode = true; + if (wl->ap_info->rsn_ie) { kfree(wl->ap_info->rsn_ie); wl->ap_info->rsn_ie = NULL; - wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, - ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); - } else if (memcmp(wl->ap_info->rsn_ie, - ies->wpa2_ie, ies->wpa2_ie->len - + WPA_RSN_IE_TAG_FIXED_LEN)) { - update_bss = true; - kfree(wl->ap_info->rsn_ie); - wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, - ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, - GFP_KERNEL); + } + if (wl->ap_info->wpa_ie) { + kfree(wl->ap_info->wpa_ie); wl->ap_info->wpa_ie = NULL; } + if (wl->ap_info->wps_ie) { + kfree(wl->ap_info->wps_ie); + wl->ap_info->wps_ie = NULL; + } + if (wpa_ie != NULL) { + /* WPAIE */ + wl->ap_info->rsn_ie = NULL; + wl->ap_info->wpa_ie = kmemdup(wpa_ie, + wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + } else { + /* RSNIE */ + wl->ap_info->wpa_ie = NULL; + wl->ap_info->rsn_ie = kmemdup(wpa2_ie, + wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + } + } else + wl->ap_info->security_mode = false; + /* find the WPSIE */ + if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)info->tail, + info->tail_len)) != NULL) { + wpsie_len = wps_ie->length +WPA_RSN_IE_TAG_FIXED_LEN; + /* + * Should be compared with saved ie before saving it + */ + wl_validate_wps_ie((char *) wps_ie, &pbc); + memcpy(beacon_ie, wps_ie, wpsie_len); + wl_cfgp2p_set_management_ie(wl, dev, bssidx, VNDR_IE_BEACON_FLAG, + beacon_ie, wpsie_len); + wl->ap_info->wps_ie = kmemdup(wps_ie, wpsie_len, GFP_KERNEL); + /* add WLC_E_PROBREQ_MSG event to respose probe_request from STA */ + wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, pbc); + } else { + WL_DBG(("No WPSIE in beacon \n")); } - if (update_bss) { - wl->ap_info->security_mode = true; - wl_cfgp2p_bss(wl, dev, bssidx, 0); - if (wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0 || - wl_validate_wpaie(dev, ies->wpa_ie, bssidx) < 0) { - return BCME_ERROR; + if (info->interval) { + if ((err = wldev_ioctl(dev, WLC_SET_BCNPRD, + &info->interval, sizeof(s32), true)) < 0) { + WL_ERR(("Beacon Interval Set Error, %d\n", err)); + return err; } - wl_cfgp2p_bss(wl, dev, bssidx, 1); } - } - } else { - WL_ERR(("No WPSIE in beacon \n")); - } - return 0; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) -static s32 -wl_cfg80211_start_ap( - struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_ap_settings *info) -{ - struct wl_priv *wl = wiphy_priv(wiphy); - s32 err = BCME_OK; - struct parsed_ies ies; - s32 bssidx = 0; - u32 dev_role = 0; - - WL_DBG(("Enter \n")); - if (dev == wl_to_prmry_ndev(wl)) { - WL_DBG(("Start AP req on primary iface: Softap\n")); - dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { - /* Group Add request on p2p0 */ - WL_DBG(("Start AP req on P2P iface: GO\n")); - dev = wl_to_prmry_ndev(wl); - dev_role = NL80211_IFTYPE_P2P_GO; - } - - bssidx = wl_cfgp2p_find_idx(wl, dev); - if (p2p_is_on(wl) && - (bssidx == wl_to_p2p_bss_bssidx(wl, - P2PAPI_BSSCFG_CONNECTION))) { - dev_role = NL80211_IFTYPE_P2P_GO; - WL_DBG(("Start AP req on P2P connection iface\n")); - } - - if ((err = wl_cfg80211_bcn_set_params(info, dev, - dev_role, bssidx)) < 0) { - WL_ERR(("Beacon params set failed \n")); - goto fail; - } - - /* Set IEs to FW */ - if ((err = wl_cfg80211_parse_set_ies(dev, &info->beacon, - &ies, dev_role, bssidx) < 0)) { - WL_ERR(("Set IEs failed \n")); - goto fail; - } - - if ((wl_cfg80211_bcn_validate_sec(dev, &ies, - dev_role, bssidx)) < 0) - { - WL_ERR(("Beacon set security failed \n")); - goto fail; - } - - if ((err = wl_cfg80211_bcn_bringup_ap(dev, &ies, - dev_role, bssidx)) < 0) { - WL_ERR(("Beacon bring up AP/GO failed \n")); - goto fail; - } - - WL_DBG(("** AP/GO Created **\n")); - -fail: - if (err) { - WL_ERR(("ADD/SET beacon failed\n")); - wldev_iovar_setint(dev, "mpc", 1); - } - - return err; -} - -static s32 -wl_cfg80211_stop_ap( - struct wiphy *wiphy, - struct net_device *dev) -{ - int err = 0; - u32 dev_role = 0; - int infra = 0; - int ap = 0; - s32 bssidx = 0; - struct wl_priv *wl = wiphy_priv(wiphy); - - WL_DBG(("Enter \n")); - if (dev == wl_to_prmry_ndev(wl)) { - dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { - /* Group Add request on p2p0 */ - dev = wl_to_prmry_ndev(wl); - dev_role = NL80211_IFTYPE_P2P_GO; - } - bssidx = wl_cfgp2p_find_idx(wl, dev); - if (p2p_is_on(wl) && - (bssidx == wl_to_p2p_bss_bssidx(wl, - P2PAPI_BSSCFG_CONNECTION))) { - dev_role = NL80211_IFTYPE_P2P_GO; - } - - if (dev_role == NL80211_IFTYPE_AP) { - /* SoftAp on primary Interface. - * Shut down AP and turn on MPC - */ - err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); - if (err < 0) { - WL_ERR(("SET INFRA error %d\n", err)); - err = -ENOTSUPP; - goto exit; - } - if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { - WL_ERR(("setting AP mode failed %d \n", err)); - err = -ENOTSUPP; - goto exit; - } - - err = wldev_ioctl(dev, WLC_UP, &ap, sizeof(s32), true); - if (unlikely(err)) { - WL_ERR(("WLC_UP error (%d)\n", err)); - err = -EINVAL; - goto exit; - } - - wl_clr_drv_status(wl, AP_CREATED, dev); - /* Turn on the MPC */ - wldev_iovar_setint(dev, "mpc", 1); - } else { - WL_DBG(("Stopping P2P GO \n")); - } - -exit: - return err; -} -static s32 -wl_cfg80211_del_station( - struct wiphy *wiphy, - struct net_device *ndev, - u8* mac_addr) -{ - struct net_device *dev; - struct wl_priv *wl = wiphy_priv(wiphy); - scb_val_t scb_val; - s8 eabuf[ETHER_ADDR_STR_LEN]; - - WL_DBG(("Entry\n")); - if (mac_addr == NULL) { - WL_DBG(("mac_addr is NULL ignore it\n")); - return 0; - } - - if (ndev == wl->p2p_net) { - dev = wl_to_prmry_ndev(wl); - } else { - dev = ndev; - } - - if (p2p_is_on(wl)) { - /* Suspend P2P discovery search-listen to prevent it from changing the - * channel. - */ - if ((wl_cfgp2p_discover_enable_search(wl, false)) < 0) { - WL_ERR(("Can not disable discovery mode\n")); - return -EFAULT; - } - } - - memcpy(scb_val.ea.octet, mac_addr, ETHER_ADDR_LEN); - scb_val.val = DOT11_RC_DEAUTH_LEAVING; - wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, - sizeof(scb_val_t), true); - WL_DBG(("Disconnect STA : %s scb_val.val %d\n", - bcm_ether_ntoa((const struct ether_addr *)mac_addr, eabuf), - scb_val.val)); - wl_delay(400); - return 0; -} - -static s32 -wl_cfg80211_change_beacon( - struct wiphy *wiphy, - struct net_device *dev, - struct cfg80211_beacon_data *info) -{ - s32 err = BCME_OK; - struct wl_priv *wl = wiphy_priv(wiphy); - struct parsed_ies ies; - u32 dev_role = 0; - s32 bssidx = 0; - - WL_DBG(("Enter \n")); - - if (dev == wl_to_prmry_ndev(wl)) { - dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { - /* Group Add request on p2p0 */ - dev = wl_to_prmry_ndev(wl); - dev_role = NL80211_IFTYPE_P2P_GO; - } - - bssidx = wl_cfgp2p_find_idx(wl, dev); - if (p2p_is_on(wl) && - (bssidx == wl_to_p2p_bss_bssidx(wl, - P2PAPI_BSSCFG_CONNECTION))) { - dev_role = NL80211_IFTYPE_P2P_GO; - } - - /* Set IEs to FW */ - if ((err = wl_cfg80211_parse_set_ies(dev, info, - &ies, dev_role, bssidx) < 0)) { - WL_ERR(("Set IEs failed \n")); - goto fail; - } + if (!info->dtim_period) { + info->dtim_period = 1; + } + if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, + &info->dtim_period, sizeof(s32), true)) < 0) { + WL_ERR(("DTIM Interval Set Error, %d\n", err)); + return err; + } - if (dev_role == NL80211_IFTYPE_AP) { - if (wl_cfg80211_hostapd_sec(dev, &ies, bssidx) < 0) { - WL_ERR(("Hostapd update sec failed \n")); - err = -EINVAL; - goto fail; + err = wldev_ioctl(dev, WLC_UP, &ap, sizeof(s32), true); + if (unlikely(err)) { + WL_ERR(("WLC_UP error (%d)\n", err)); + return err; + } + memset(&join_params, 0, sizeof(join_params)); + /* join parameters starts with ssid */ + join_params_size = sizeof(join_params.ssid); + memcpy(join_params.ssid.SSID, ssid.SSID, ssid.SSID_len); + join_params.ssid.SSID_len = htod32(ssid.SSID_len); + /* create softap */ + if ((err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, + join_params_size, true)) == 0) { + wl_clr_drv_status(wl, AP_CREATING, dev); + wl_set_drv_status(wl, AP_CREATED, dev); + } } - } - -fail: - return err; -} -#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ -static s32 -wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev, - struct beacon_parameters *info) -{ - s32 err = BCME_OK; - struct wl_priv *wl = wiphy_priv(wiphy); - s32 ie_offset = 0; - s32 bssidx = 0; - u32 dev_role = NL80211_IFTYPE_AP; - struct parsed_ies ies; - bcm_tlv_t *ssid_ie; - bool pbc = 0; - WL_DBG(("interval (%d) dtim_period (%d) head_len (%d) tail_len (%d)\n", - info->interval, info->dtim_period, info->head_len, info->tail_len)); - - if (dev == wl_to_prmry_ndev(wl)) { - dev_role = NL80211_IFTYPE_AP; - } else if (dev == wl->p2p_net) { - /* Group Add request on p2p0 */ - dev = wl_to_prmry_ndev(wl); - dev_role = NL80211_IFTYPE_P2P_GO; - } - - bssidx = wl_cfgp2p_find_idx(wl, dev); - if (p2p_is_on(wl) && - (bssidx == wl_to_p2p_bss_bssidx(wl, - P2PAPI_BSSCFG_CONNECTION))) { - dev_role = NL80211_IFTYPE_P2P_GO; - } - - ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; - /* find the SSID */ - if ((ssid_ie = bcm_parse_tlvs((u8 *)&info->head[ie_offset], - info->head_len - ie_offset, - DOT11_MNG_SSID_ID)) != NULL) { - if (dev_role == NL80211_IFTYPE_AP) { - /* Store the hostapd SSID */ - memset(&wl->hostapd_ssid.SSID[0], 0x00, 32); - memcpy(&wl->hostapd_ssid.SSID[0], ssid_ie->data, ssid_ie->len); - wl->hostapd_ssid.SSID_len = ssid_ie->len; + } else if (wl_get_drv_status(wl, AP_CREATED, dev)) { + ap = 1; + /* find the WPSIE */ + if ((wps_ie = wl_cfgp2p_find_wpsie((u8 *)info->tail, info->tail_len)) != NULL) { + wpsie_len = wps_ie->length + WPA_RSN_IE_TAG_FIXED_LEN; + /* + * Should be compared with saved ie before saving it + */ + wl_validate_wps_ie((char *) wps_ie, &pbc); + memcpy(beacon_ie, wps_ie, wpsie_len); + wl_cfgp2p_set_management_ie(wl, dev, bssidx, VNDR_IE_BEACON_FLAG, + beacon_ie, wpsie_len); + if (wl->ap_info->wps_ie && + memcmp(wl->ap_info->wps_ie, wps_ie, wpsie_len)) { + WL_DBG((" WPS IE is changed\n")); + kfree(wl->ap_info->wps_ie); + wl->ap_info->wps_ie = kmemdup(wps_ie, wpsie_len, GFP_KERNEL); + /* add WLC_E_PROBREQ_MSG event to respose probe_request from STA */ + wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, pbc); + } else if (wl->ap_info->wps_ie == NULL) { + WL_DBG((" WPS IE is added\n")); + wl->ap_info->wps_ie = kmemdup(wps_ie, wpsie_len, GFP_KERNEL); + /* add WLC_E_PROBREQ_MSG event to respose probe_request from STA */ + wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, pbc); + } + /* find the RSN_IE */ + if ((wpa2_ie = bcm_parse_tlvs((u8 *)info->tail, info->tail_len, + DOT11_MNG_RSN_ID)) != NULL) { + WL_DBG((" WPA2 IE is found\n")); + } + /* find the WPA_IE */ + if ((wpa_ie = wl_cfgp2p_find_wpaie((u8 *)info->tail, + info->tail_len)) != NULL) { + WL_DBG((" WPA IE is found\n")); + } + if ((wpa_ie != NULL || wpa2_ie != NULL)) { + if (!wl->ap_info->security_mode) { + /* change from open mode to security mode */ + update_bss = true; + if (wpa_ie != NULL) { + wl->ap_info->wpa_ie = kmemdup(wpa_ie, + wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + } else { + wl->ap_info->rsn_ie = kmemdup(wpa2_ie, + wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + } + } else if (wl->ap_info->wpa_ie) { + /* change from WPA mode to WPA2 mode */ + if (wpa2_ie != NULL) { + update_bss = true; + kfree(wl->ap_info->wpa_ie); + wl->ap_info->rsn_ie = kmemdup(wpa2_ie, + wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + wl->ap_info->wpa_ie = NULL; + } + else if (memcmp(wl->ap_info->wpa_ie, + wpa_ie, wpa_ie->length + + WPA_RSN_IE_TAG_FIXED_LEN)) { + kfree(wl->ap_info->wpa_ie); + update_bss = true; + wl->ap_info->wpa_ie = kmemdup(wpa_ie, + wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + wl->ap_info->rsn_ie = NULL; + } + } else { + /* change from WPA2 mode to WPA mode */ + if (wpa_ie != NULL) { + update_bss = true; + kfree(wl->ap_info->rsn_ie); + wl->ap_info->rsn_ie = NULL; + wl->ap_info->wpa_ie = kmemdup(wpa_ie, + wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + } else if (memcmp(wl->ap_info->rsn_ie, + wpa2_ie, wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN)) { + update_bss = true; + kfree(wl->ap_info->rsn_ie); + wl->ap_info->rsn_ie = kmemdup(wpa2_ie, + wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, + GFP_KERNEL); + wl->ap_info->wpa_ie = NULL; + } + } + if (update_bss) { + wl->ap_info->security_mode = true; + wl_cfgp2p_bss(wl, dev, bssidx, 0); + if (wl_validate_wpa2ie(dev, wpa2_ie, bssidx) < 0 || + wl_validate_wpaie(dev, wpa_ie, bssidx) < 0) { + return BCME_ERROR; + } + wl_cfgp2p_bss(wl, dev, bssidx, 1); + } + } } else { - /* P2P GO */ - memset(&wl->p2p->ssid.SSID[0], 0x00, 32); - memcpy(wl->p2p->ssid.SSID, ssid_ie->data, ssid_ie->len); - wl->p2p->ssid.SSID_len = ssid_ie->len; - } - } - - if (wl_cfg80211_parse_ies((u8 *)info->tail, - info->tail_len, &ies) < 0) { - WL_ERR(("Beacon get IEs failed \n")); - err = -EINVAL; - goto fail; - } - - if (wl_cfgp2p_set_management_ie(wl, dev, bssidx, - VNDR_IE_BEACON_FLAG, (u8 *)info->tail, - info->tail_len) < 0) { - WL_ERR(("Beacon set IEs failed \n")); - goto fail; - } else { - WL_DBG(("Applied Vndr IEs for Beacon \n")); - } - if (!wl_cfgp2p_bss_isup(dev, bssidx) && - (wl_cfg80211_bcn_validate_sec(dev, &ies, dev_role, bssidx) < 0)) - { - WL_ERR(("Beacon set security failed \n")); - goto fail; - } - - if (wl_cfg80211_bcn_bringup_ap(dev, &ies, dev_role, bssidx) < 0) { - WL_ERR(("Beacon bring up AP/GO failed \n")); - goto fail; - } - - /* Set BI and DTIM period */ - if (info->interval) { - if ((err = wldev_ioctl(dev, WLC_SET_BCNPRD, - &info->interval, sizeof(s32), true)) < 0) { - WL_ERR(("Beacon Interval Set Error, %d\n", err)); - return err; + WL_ERR(("No WPSIE in beacon \n")); } } - if (info->dtim_period) { - if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, - &info->dtim_period, sizeof(s32), true)) < 0) { - WL_ERR(("DTIM Interval Set Error, %d\n", err)); - return err; - } - } - - if (wl_get_drv_status(wl, AP_CREATED, dev)) { - /* Soft AP already running. Update changed params */ - if (wl_cfg80211_hostapd_sec(dev, &ies, bssidx) < 0) { - WL_ERR(("Hostapd update sec failed \n")); - err = -EINVAL; - goto fail; - } - } - - /* Enable Probe Req filter */ - if (((dev_role == NL80211_IFTYPE_P2P_GO) || - (dev_role == NL80211_IFTYPE_AP)) && (ies.wps_ie != NULL)) { - wl_validate_wps_ie((char *) ies.wps_ie, ies.wps_ie_len, &pbc); - if (pbc) - wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, true); - } - - WL_DBG(("** ADD/SET beacon done **\n")); - -fail: - if (err) { - WL_ERR(("ADD/SET beacon failed\n")); +exit: + if (err) wldev_iovar_setint(dev, "mpc", 1); - } return err; - } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ static struct cfg80211_ops wl_cfg80211_ops = { .add_virtual_intf = wl_cfg80211_add_virtual_iface, @@ -5841,15 +5460,8 @@ static struct cfg80211_ops wl_cfg80211_ops = { .mgmt_frame_register = wl_cfg80211_mgmt_frame_register, .change_bss = wl_cfg80211_change_bss, .set_channel = wl_cfg80211_set_channel, -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) .set_beacon = wl_cfg80211_add_set_beacon, .add_beacon = wl_cfg80211_add_set_beacon, -#else - .change_beacon = wl_cfg80211_change_beacon, - .start_ap = wl_cfg80211_start_ap, - .stop_ap = wl_cfg80211_stop_ap, - .del_station = wl_cfg80211_del_station, -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ }; s32 wl_mode_to_nl80211_iftype(s32 mode) @@ -5887,13 +5499,10 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX; wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) -#if !(defined(WLP2P) && defined(WL_ENABLE_P2P_IF)) - | BIT(NL80211_IFTYPE_MONITOR) -#endif - | BIT(NL80211_IFTYPE_AP); + | BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR); wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; - + wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a; wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; wdev->wiphy->cipher_suites = __wl_cipher_suites; wdev->wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); @@ -5910,29 +5519,9 @@ static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS | #endif WIPHY_FLAG_4ADDR_STATION; - /* If driver advertises FW_ROAM, the supplicant wouldn't - * send the BSSID & Freq in the connect command allowing the - * the driver to choose the AP to connect to. But unless we - * support ROAM_CACHE in firware this will delay the ASSOC as - * as the FW need to do a full scan before attempting to connect - * So that feature will just increase assoc. The better approach - * to let Supplicant to provide channel info and FW letter may roam - * if needed so DON'T advertise that featur eto Supplicant. - */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) -/* wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; */ -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) - wdev->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | - WIPHY_FLAG_OFFCHAN_TX; -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - /* From 3.4 kernel ownards AP_SME flag can be advertised - * to remove the patch from supplicant - */ - wdev->wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; + wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; #endif - WL_DBG(("Registering custom regulatory)\n")); wdev->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; wiphy_apply_custom_regulatory(wdev->wiphy, &brcm_regdom); @@ -5960,8 +5549,8 @@ static void wl_free_wdev(struct wl_priv *wl) wl_delete_all_netinfo(wl); wiphy_free(wiphy); /* PLEASE do NOT call any function after wiphy_free, the driver's private structure "wl", - * which is the private part of wiphy, has been freed in wiphy_free !!!!!!!!!!! - */ + * which is the private part of wiphy, has been freed in wiphy_free !!!!!!!!!!! + */ } static s32 wl_inform_bss(struct wl_priv *wl) @@ -5981,7 +5570,7 @@ static s32 wl_inform_bss(struct wl_priv *wl) #ifdef ROAM_CHANNEL_CACHE add_roam_cache(bi); #endif - err = wl_inform_single_bss(wl, bi); + err = wl_inform_single_bss(wl, bi, 0); if (unlikely(err)) break; } @@ -5991,13 +5580,13 @@ static s32 wl_inform_bss(struct wl_priv *wl) return err; } -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done) { - struct wiphy *wiphy = wl_to_wiphy(wl); + struct wiphy *wiphy = wiphy_from_scan(wl); struct ieee80211_mgmt *mgmt; struct ieee80211_channel *channel; struct ieee80211_supported_band *band; - struct wl_cfg80211_bss_info *notif_bss_info; + struct wl_cfg80211_bss_info *notif_bss_info = NULL; struct wl_scan_req *sr = wl_to_sr(wl); struct beacon_proberesp *beacon_proberesp; struct cfg80211_bss *cbss = NULL; @@ -6005,6 +5594,7 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) s32 signal; u32 freq; s32 err = 0; + u8 * ie_offset = NULL; gfp_t aflags; if (unlikely(dtoh32(bi->length) > WL_BSS_INFO_MAX)) { @@ -6020,17 +5610,18 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) } mgmt = (struct ieee80211_mgmt *)notif_bss_info->frame_buf; notif_bss_info->channel = - bi->ctl_ch ? bi->ctl_ch : CHSPEC_CHANNEL(wl_chspec_driver_to_host(bi->chanspec)); + bi->ctl_ch ? bi->ctl_ch : CHSPEC_CHANNEL(bi->chanspec); if (notif_bss_info->channel <= CH_MAX_2G_CHANNEL) band = wiphy->bands[IEEE80211_BAND_2GHZ]; else band = wiphy->bands[IEEE80211_BAND_5GHZ]; - if (!band) { - WL_ERR(("No valid band")); + + if(band==NULL) { kfree(notif_bss_info); - return -EINVAL; + return err; } + notif_bss_info->rssi = dtoh16(bi->RSSI) + RSSI_OFFSET; memcpy(mgmt->bssid, &bi->BSSID, ETHER_ADDR_LEN); mgmt_type = wl->active_scan ? @@ -6046,7 +5637,35 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) beacon_proberesp->capab_info = cpu_to_le16(bi->capability); wl_rst_ie(wl); - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + ie_offset = ((u8 *) bi) + bi->ie_offset; + + if (is_roam_done && ((int)(*(ie_offset)) == WLAN_EID_SSID && + ((int)(*(ie_offset+1)) == 0 || (int)(*(ie_offset+2)) == 0))) { + u8 *ie_new_offset = NULL; + uint8 ie_new_length; + + WL_ERR(("WAR trace: Changing the SSID Info, from beacon %d\n", bi->flags & WL_BSS_FLAGS_FROM_BEACON)); + + ie_new_offset = (u8 *)kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); + if (ie_new_offset) { + *(ie_new_offset) = WLAN_EID_SSID; + *(ie_new_offset+1) = bi->SSID_len; + memcpy(ie_new_offset+2, bi->SSID, bi->SSID_len); + ie_new_length = bi->ie_length - *(ie_offset+1) + bi->SSID_len; + + /* Copy the remaining IE apart from SSID IE from bi */ + memcpy( ie_new_offset+2 + bi->SSID_len, + ie_offset+2 + *(ie_offset+1), + bi->ie_length - 2 - *(ie_offset+1)); + wl_mrg_ie(wl, ie_new_offset , ie_new_length); + kfree(ie_new_offset); + } else { + wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + } + } else { + wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + } + wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - offsetof(struct wl_cfg80211_bss_info, frame_buf)); notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, @@ -6057,17 +5676,13 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) #else freq = ieee80211_channel_to_frequency(notif_bss_info->channel, band->band); #endif - if (freq == 0) { - WL_ERR(("Invalid channel, fail to chcnage channel to freq\n")); - kfree(notif_bss_info); - return -EINVAL; - } channel = ieee80211_get_channel(wiphy, freq); if (unlikely(!channel)) { WL_ERR(("ieee80211_get_channel error\n")); kfree(notif_bss_info); - return -EINVAL; + return EINVAL; } + WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x, bssid %pM" "mgmt_type %d frame_len %d\n", bi->SSID, notif_bss_info->rssi, notif_bss_info->channel, @@ -6075,23 +5690,9 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) notif_bss_info->frame_len)); signal = notif_bss_info->rssi * 100; - if (!mgmt->u.probe_resp.timestamp) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - struct timespec ts; - get_monotonic_boottime(&ts); - mgmt->u.probe_resp.timestamp = ((u64)ts.tv_sec*1000000) - + ts.tv_nsec / 1000; -#else - struct timeval tv; - do_gettimeofday(&tv); - mgmt->u.probe_resp.timestamp = ((u64)tv.tv_sec*1000000) - + tv.tv_usec; -#endif - } - cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt, - le16_to_cpu(notif_bss_info->frame_len), signal, aflags); + le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL); if (unlikely(!cbss)) { WL_ERR(("cfg80211_inform_bss_frame error\n")); kfree(notif_bss_info); @@ -6100,6 +5701,7 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) cfg80211_put_bss(cbss); kfree(notif_bss_info); + return err; } @@ -6109,7 +5711,7 @@ static bool wl_is_linkup(struct wl_priv *wl, const wl_event_msg_t *e, struct net u32 status = ntoh32(e->status); u16 flags = ntoh16(e->flags); - WL_DBG(("event %d, status %d flags %x\n", event, status, flags)); + WL_DBG(("event %d, status %d\n", event, status)); if (event == WLC_E_SET_SSID) { if (status == WLC_E_STATUS_SUCCESS) { if (!wl_is_ibssmode(wl, ndev)) @@ -6133,17 +5735,10 @@ static bool wl_is_linkdown(struct wl_priv *wl, const wl_event_msg_t *e) event == WLC_E_DISASSOC_IND || event == WLC_E_DISASSOC || event == WLC_E_DEAUTH) { -#if (WL_DBG_LEVEL > 0) - WL_ERR(("Link down Reason : WLC_E_%s\n", wl_dbg_estr[event])); -#endif /* (WL_DBG_LEVEL > 0) */ return true; } else if (event == WLC_E_LINK) { - if (!(flags & WLC_EVENT_MSG_LINK)) { -#if (WL_DBG_LEVEL > 0) - WL_ERR(("Link down Reason : WLC_E_%s\n", wl_dbg_estr[event])); -#endif /* (WL_DBG_LEVEL > 0) */ + if (!(flags & WLC_EVENT_MSG_LINK)) return true; - } } return false; @@ -6164,9 +5759,11 @@ static bool wl_is_nonetwork(struct wl_priv *wl, const wl_event_msg_t *e) /* The mainline kernel >= 3.2.0 has support for indicating new/del station * to AP/P2P GO via events. If this change is backported to kernel for which - * this driver is being built, then define WL_CFG80211_STA_EVENT. You - * should use this new/del sta event mechanism for BRCM supplicant >= 22. + * this driver is being built, set CFG80211_STA_EVENT_AVAILABLE to 1. You + * should use this new/del sta event mechanism for BRCM supplicant from BRANCH + * HOSTAP_BRANCH_0_15 (ver >= 15_1). */ +#define CFG80211_STA_EVENT_AVAILABLE 0 static s32 wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data) @@ -6176,15 +5773,14 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, u32 reason = ntoh32(e->reason); u32 len = ntoh32(e->datalen); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !CFG80211_STA_EVENT_AVAILABLE bool isfree = false; u8 *mgmt_frame; u8 bsscfgidx = e->bsscfgidx; s32 freq; s32 channel; - u8 *body = NULL; + u8 *body=NULL; u16 fc = 0; - struct ieee80211_supported_band *band; struct ether_addr da; struct ether_addr bssid; @@ -6192,7 +5788,7 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, channel_info_t ci; #else struct station_info sinfo; -#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !WL_CFG80211_STA_EVENT */ +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !CFG80211_STA_EVENT_AVAILABLE */ /* if link down, bsscfg is disabled. */ if (event == WLC_E_LINK && reason == WLC_E_LINK_BSSCFG_DIS && @@ -6202,30 +5798,29 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, return 0; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) - body = kzalloc(len, GFP_KERNEL); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !CFG80211_STA_EVENT_AVAILABLE WL_DBG(("Enter \n")); if (!len && (event == WLC_E_DEAUTH)) { len = 2; /* reason code field */ data = &reason; } if (len) { - body = kzalloc(len, GFP_KERNEL); + body=kzalloc(len, GFP_KERNEL); - if (body == NULL) { - WL_ERR(("wl_notify_connect_status: Failed to allocate body\n")); - return WL_INVALID; - } + if(body==NULL) { + WL_ERR(("wl_notify_connect_status: Failed to allocate body\n")); + return WL_INVALID; + } } memset(&bssid, 0, ETHER_ADDR_LEN); - WL_DBG(("Enter event %d ndev %p\n", event, ndev)); + WL_DBG(("Enter \n")); if (wl_get_mode_by_netdev(wl, ndev) == WL_INVALID) { kfree(body); return WL_INVALID; } if (len) - memcpy(body, data, len); - + memcpy(body, data, len); + wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr", NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); @@ -6251,7 +5846,7 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, goto exit; } if ((err = wldev_ioctl(ndev, WLC_GET_CHANNEL, &ci, sizeof(ci), false))) { - kfree(body); + kfree (body); return err; } @@ -6260,11 +5855,11 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, band = wiphy->bands[IEEE80211_BAND_2GHZ]; else band = wiphy->bands[IEEE80211_BAND_5GHZ]; - if (!band) { - WL_ERR(("No valid band")); - if (body) - kfree(body); - return -EINVAL; + + if(band == NULL) { + WL_ERR(("band is null(channel=%d)\n", channel)); + kfree(body); + return WL_INVALID; } #if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) freq = ieee80211_channel_to_frequency(channel); @@ -6274,29 +5869,17 @@ wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, #endif err = wl_frame_get_mgmt(fc, &da, &e->addr, &bssid, - &mgmt_frame, &len, body); + &mgmt_frame, &len, body); if (err < 0) - goto exit; + goto exit; isfree = true; if (event == WLC_E_ASSOC_IND && reason == DOT11_SC_SUCCESS) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); -#else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ } else if (event == WLC_E_DISASSOC_IND) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); -#else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); -#else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ } exit: @@ -6305,7 +5888,7 @@ exit: if (body) kfree(body); return err; -#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !CFG80211_STA_EVENT_AVAILABLE */ sinfo.filled = 0; if (((event == WLC_E_ASSOC_IND) || (event == WLC_E_REASSOC_IND)) && reason == DOT11_SC_SUCCESS) { @@ -6322,7 +5905,7 @@ exit: } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); } -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !CFG80211_STA_EVENT_AVAILABLE */ return err; } @@ -6337,8 +5920,13 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) { wl_notify_connect_status_ap(wl, ndev, e, data); } else { - WL_DBG(("wl_notify_connect_status : event %d status : %d ndev %p\n", - ntoh32(e->event_type), ntoh32(e->status), ndev)); + WL_DBG(("wl_notify_connect_status : event %d status : %d \n", + ntoh32(e->event_type), ntoh32(e->status))); + /* chanyun TBD from DHD 15 no p2p firmware exist should change to interface */ + if (strstr(fw_path, "_p2p") == NULL && event == WLC_E_DEAUTH) { + WL_DBG(("unexpected event WLC_E_DEAUTH\n")); + return WL_INVALID; + } if (wl_is_linkup(wl, e, ndev)) { wl_link_up(wl); act = true; @@ -6361,41 +5949,58 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, } else if (wl_is_linkdown(wl, e)) { if (wl->scan_request) { + del_timer_sync(&wl->scan_timeout); if (wl->escan_on) { - wl_notify_escan_complete(wl, ndev, true, true); - } else { - del_timer_sync(&wl->scan_timeout); + WL_SCAN2(("link down notify escan complete: %p(%d)\n", + ndev, wl->escan_info.cur_sync_id)); +#ifndef CUSTOMER_HW_SAMSUNG +#error inform bss will be done at notify function + { + u8 temp_id = wl->escan_info.cur_sync_id; + wl->bss_list = + (wl_scan_results_t *) + wl->escan_info.escan_buf[(temp_id+1)%2]; + wl_inform_bss(wl); + } +#endif + wl_notify_escan_complete(wl, ndev, true); + } else wl_iscan_aborted(wl); - } } if (wl_get_drv_status(wl, CONNECTED, ndev)) { scb_val_t scbval; u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - printk("link down if %s may call cfg80211_disconnected. " - "(reason=%d)\n", ndev->name, ntoh32(e->reason)); - if (memcmp(curbssid, &e->addr, ETHER_ADDR_LEN) != 0) { - WL_ERR(("BSSID of event is not the connected BSSID" - "(ignore it) cur: " MACDBG " event: " MACDBG"\n", - STR_TO_MACD(curbssid), STR_TO_MACD((u8*)(&e->addr)))); - return 0; - } - wl_clr_drv_status(wl, CONNECTED, ndev); - if (! wl_get_drv_status(wl, DISCONNECTING, ndev)) { + printk("link down, call cfg80211_disconnected. (reason=%d)\n", + ntoh32(e->reason)); + WL_DBG(("con=%02x:%02x:%02x:%02x:%02x:%02x\n", + curbssid[0], curbssid[1], curbssid[2], + curbssid[3],curbssid[4], curbssid[5])); + WL_DBG(("dis=%02x:%02x:%02x:%02x:%02x:%02x\n", + ((u8 *)&e->addr)[0], ((u8 *)&e->addr)[1], + ((u8 *)&e->addr)[2], ((u8 *)&e->addr)[3], + ((u8 *)&e->addr)[4], ((u8 *)&e->addr)[5])); +#ifdef ESCAN_RESULT_PATCH + if (memcmp(curbssid, &e->addr, ETHER_ADDR_LEN) == 0) { +#endif /* ESCAN_RESULT_PATCH */ + wl_clr_drv_status(wl, CONNECTED, ndev); /* To make sure disconnect, explictly send dissassoc * for BSSID 00:00:00:00:00:00 issue */ scbval.val = WLAN_REASON_DEAUTH_LEAVING; - memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); scbval.val = htod32(scbval.val); - wldev_ioctl(ndev, WLC_DISASSOC, &scbval, - sizeof(scb_val_t), true); + err =wldev_ioctl(ndev, WLC_DISASSOC, &scbval, + sizeof(scb_val_t), true); + if (err < 0) + WL_ERR(("Check Assoc Status : %d\n", err)); cfg80211_disconnected(ndev, 0, NULL, 0, GFP_KERNEL); wl_link_down(wl); wl_init_prof(wl, ndev); - } - } - else if (wl_get_drv_status(wl, CONNECTING, ndev)) { +#ifdef ESCAN_RESULT_PATCH + } else + WL_ERR(("BSSID of event is not the connected BSSID\n")); +#endif /* ESCAN_RESULT_PATCH */ + } else if (wl_get_drv_status(wl, CONNECTING, ndev)) { printk("link down, during connecting\n"); #ifdef ESCAN_RESULT_PATCH if ((memcmp(connect_req_bssid, broad_bssid, ETHER_ADDR_LEN) == 0) || @@ -6415,14 +6020,17 @@ wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, printk("connect failed event=%d e->status 0x%x\n", event, (int)ntoh32(e->status)); /* Clean up any pending scan request */ + if (wl->scan_request) { + del_timer_sync(&wl->scan_timeout); if (wl->escan_on) { - wl_notify_escan_complete(wl, ndev, true, true); - } else { - del_timer_sync(&wl->scan_timeout); + WL_SCAN2((" send noti due to connect fail : %p(%d)\n", + ndev, wl->escan_info.cur_sync_id)); + wl_notify_escan_complete(wl, ndev, true); + } else wl_iscan_aborted(wl); - } } + if (wl_get_drv_status(wl, CONNECTING, ndev)) wl_bss_connect_done(wl, ndev, e, data, false); } else { @@ -6470,6 +6078,8 @@ static s32 wl_get_assoc_ies(struct wl_priv *wl, struct net_device *ndev) assoc_info.req_len = htod32(assoc_info.req_len); assoc_info.resp_len = htod32(assoc_info.resp_len); assoc_info.flags = htod32(assoc_info.flags); + WL_DBG(("assoc info: %d %d %d\n", assoc_info.req_len, + assoc_info.resp_len, assoc_info.flags)); if (conn_info->req_ie_len) { conn_info->req_ie_len = 0; bzero(conn_info->req_ie, sizeof(conn_info->req_ie)); @@ -6534,7 +6144,7 @@ static void wl_ch_to_chanspec(int ch, struct wl_join_params *join_params, int n_channels; n_channels = get_roam_channel_list(ch, join_params->params.chanspec_list, - &join_params->ssid, ioctl_version); + &join_params->ssid); join_params->params.chanspec_num = htod32(n_channels); *join_params_size += WL_ASSOC_PARAMS_FIXED_SIZE + join_params->params.chanspec_num * sizeof(chanspec_t); @@ -6560,15 +6170,15 @@ static void wl_ch_to_chanspec(int ch, struct wl_join_params *join_params, join_params->params.chanspec_num = htod32(join_params->params.chanspec_num); - #endif /* ROAM_CHANNEL_CACHE */ WL_DBG(("join_params->params.chanspec_list[0]= %X, %d channels\n", join_params->params.chanspec_list[0], join_params->params.chanspec_num)); + } } -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done) { struct cfg80211_bss *bss; struct wl_bss_info *bi; @@ -6608,7 +6218,7 @@ static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) err = -EIO; goto update_bss_info_out; } - err = wl_inform_single_bss(wl, bi); + err = wl_inform_single_bss(wl, bi, is_roam_done); if (unlikely(err)) goto update_bss_info_out; @@ -6659,13 +6269,10 @@ wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev); + wl_update_bss_info(wl, ndev, 1); wl_update_pmklist(ndev, wl->pmk_list, err); cfg80211_roamed(ndev, - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) - NULL, /* struct cfg80211_bss *bss */ -#elif LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) NULL, #endif curbssid, @@ -6683,10 +6290,11 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data, bool completed) { struct wl_connect_info *conn_info = wl_to_conn(wl); + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); s32 err = 0; u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - WL_DBG((" enter\n")); + WL_DBG((" Enter\n")); #ifdef ESCAN_RESULT_PATCH if (wl_get_drv_status(wl, CONNECTED, ndev)) { if (memcmp(curbssid, connect_req_bssid, ETHER_ADDR_LEN) == 0) { @@ -6700,25 +6308,34 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, memcpy(curbssid, connect_req_bssid, ETHER_ADDR_LEN); } + WL_SCAN2(("Connect done \n")); #if defined(BCM4334_CHIP) if (wl->scan_request) { - wl_notify_escan_complete(wl, ndev, true, true); + WL_SCAN2(("Abort scan : %p(%d)\n", ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, ndev); } #endif #else if (wl->scan_request) { - wl_notify_escan_complete(wl, ndev, true, true); + WL_SCAN2(("Abort scan : %p(%d)\n", ndev, wl->escan_info.cur_sync_id)); + wl_cfg80211_scan_abort(wl, ndev); } #endif /* ESCAN_RESULT_PATCH */ if (wl_get_drv_status(wl, CONNECTING, ndev)) { wl_clr_drv_status(wl, CONNECTING, ndev); if (completed) { - wl_get_assoc_ies(wl, ndev); + err = wl_get_assoc_ies(wl, ndev); + if (err) { + WL_DBG(("no assoc ies\n")); + err = 0; + } wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev); + wl_update_bss_info(wl, ndev, 0); wl_update_pmklist(ndev, wl->pmk_list, err); wl_set_drv_status(wl, CONNECTED, ndev); + if (dhd->roam_env_detection) + wldev_iovar_setint(ndev, "roam_env_detection", AP_ENV_INDETERMINATE); } cfg80211_connect_result(ndev, curbssid, @@ -6726,13 +6343,18 @@ wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, conn_info->req_ie_len, conn_info->resp_ie, conn_info->resp_ie_len, - completed ? WLAN_STATUS_SUCCESS : e->reason, + completed ? WLAN_STATUS_SUCCESS : WLAN_STATUS_AUTH_TIMEOUT, GFP_KERNEL); if (completed) - WL_INFO(("Report connect result - connection succeeded\n")); + WL_SCAN2(("Report connect result - connection succeeded(%d)\n", + conn_info->resp_ie_len)); else WL_ERR(("Report connect result - connection failed\n")); } +#ifdef ESCAN_RESULT_PATCH + else + WL_DBG(("wl_bss_connect_done : do nothing\n")); +#endif /* ESCAN_RESULT_PATCH */ return err; } @@ -6810,9 +6432,12 @@ scan_done_out: if (wl->scan_request) { cfg80211_scan_done(wl->scan_request, false); wl->scan_request = NULL; + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + WL_DBG(("cfg80211_scan_done\n")); + WL_SCAN2(("Remove Scan Request %p, %d\n", ndev, wl->escan_info.cur_sync_id)); + } else { + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); } - spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); - WL_DBG(("cfg80211_scan_done\n")); mutex_unlock(&wl->usr_sync); return err; } @@ -6860,123 +6485,24 @@ wl_frame_get_mgmt(u16 fc, const struct ether_addr *da, } #ifdef WL_CFG80211_GON_COLLISION -static void -wl_gon_req_collision(struct wl_priv *wl, wl_action_frame_t *tx_act_frm, - wifi_p2p_pub_act_frame_t *rx_act_frm, struct net_device *ndev, - struct ether_addr sa, struct ether_addr da) +static bool +wl_is_gon_req_collision(struct wl_priv *wl, wl_action_frame_t *tx_act_frm, + wifi_p2p_pub_act_frame_t *rx_act_frm) { - if (wl->afx_hdl->pending_tx_act_frm == NULL) - return; - - if (tx_act_frm && - wl_cfgp2p_is_pub_action(tx_act_frm->data, tx_act_frm->len)) { + if (tx_act_frm && wl_cfgp2p_is_pub_action(tx_act_frm->data, tx_act_frm->len)) { wifi_p2p_pub_act_frame_t *pact_frm; pact_frm = (wifi_p2p_pub_act_frame_t *)tx_act_frm->data; - if (!(pact_frm->subtype == P2P_PAF_GON_REQ && - rx_act_frm->subtype == P2P_PAF_GON_REQ)) { - return; - } - } - - WL_ERR((" GO NEGO Request COLLISION !!! \n")); - - /* if sa(peer) addr is less than da(my) addr, - * my device will process peer's gon request and block to send my gon req. - * - * if not (sa addr > da addr), - * my device will process gon request and drop gon req of peer. - */ - if (memcmp(sa.octet, da.octet, ETHER_ADDR_LEN) < 0) { - /* block to send tx gon request */ - wl->block_gon_req_tx_count = BLOCK_GON_REQ_MAX_NUM; - WL_ERR((" block to send gon req tx !!!\n")); - - /* if we are finding a common channel for sending af, - * do not scan more to block to send current gon req - */ - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { - wl_clr_drv_status(wl, FINDING_COMMON_CHANNEL, ndev); - complete(&wl->act_frm_scan); + if (pact_frm->subtype == P2P_PAF_GON_REQ && + rx_act_frm->subtype == P2P_PAF_GON_REQ) { + WL_ERR((" GO NEGO Request COLLISION !!! \n")); + return true; } - } else { - /* drop gon request of peer to process gon request by my device. */ - WL_ERR((" drop to receive gon req rx !!! \n")); - wl->block_gon_req_rx_count = BLOCK_GON_REQ_MAX_NUM; - } - - return; -} -#endif /* WL_CFG80211_GON_COLLISION */ - -void -wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev) -{ - if (wl_get_drv_status_all(wl, SENDING_ACT_FRM) && - (wl_get_p2p_status(wl, ACTION_TX_COMPLETED) || - wl_get_p2p_status(wl, ACTION_TX_NOACK))) { - WL_DBG(("*** Wake UP ** abort actframe iovar\n")); - /* if channel is not zero, "actfame" uses off channel scan. - * So abort scan for off channel completion. - */ - if (wl->af_sent_channel) - /* wl_cfg80211_scan_abort(wl, ndev); */ - wl_notify_escan_complete(wl, - (ndev == wl->p2p_net) ? wl_to_prmry_ndev(wl) : ndev, true, true); } -#ifdef WL_CFG80211_SYNC_GON - else if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { - WL_DBG(("*** Wake UP ** abort listen for next af frame\n")); - /* So abort scan to cancel listen */ - wl_notify_escan_complete(wl, - (ndev == wl->p2p_net) ? wl_to_prmry_ndev(wl) : ndev, true, true); - } -#endif /* WL_CFG80211_SYNC_GON */ -} - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -static int wes_mode = 0; -int wl_cfg80211_set_wes_mode(int mode) -{ - wes_mode = mode; - return 0; -} - -int wl_cfg80211_get_wes_mode(void) -{ - return wes_mode; -} - -bool wl_cfg80211_is_wes(void *frame, u32 frame_len) -{ - unsigned char *data; - - if (frame == NULL) { - WL_ERR(("%s: Invalid frame \n", __FUNCTION__)); - return false; - } - - if (frame_len < 4) { - WL_ERR(("%s: Invalid frame length [%d] \n", __FUNCTION__, frame_len)); - return false; - } - - data = frame; - - if (memcmp(data, "\x7f\x00\x00\xf0", 4) == 0) { - WL_DBG(("%s: Receive WES VS Action Frame \n", __FUNCTION__)); - return true; - } - return false; } - -int wl_cfg80211_get_ioctl_version(void) -{ - return ioctl_version; -} -#endif /* WES_SUPPORT */ +#endif /* WL_CFG80211_GON_COLLISION */ static s32 wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, @@ -7000,9 +6526,6 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, u8 bsscfgidx = e->bsscfgidx; u32 mgmt_frame_len = ntoh32(e->datalen) - sizeof(wl_event_rx_frame_data_t); u16 channel = ((ntoh16(rxframe->channel) & WL_CHANSPEC_CHAN_MASK)); -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - bool is_wes = false; -#endif memset(&bssid, 0, ETHER_ADDR_LEN); @@ -7016,9 +6539,10 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, band = wiphy->bands[IEEE80211_BAND_2GHZ]; else band = wiphy->bands[IEEE80211_BAND_5GHZ]; - if (!band) { - WL_ERR(("No valid band")); - return -EINVAL; + + if(band == NULL) { + WL_ERR(("band is null(channel=%d)\n", channel)); + return WL_INVALID; } #if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) freq = ieee80211_channel_to_frequency(channel); @@ -7030,7 +6554,11 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, wldev_iovar_getbuf_bsscfg(dev, "cur_etheraddr", NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); - wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); + err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); + if( err < 0) { + bzero (&bssid, ETHER_ADDR_LEN); + WL_ERR (("NO Connected BSSID set to zero\n")); + } memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); err = wl_frame_get_mgmt(FC_ACTION, &da, &e->addr, &bssid, &mgmt_frame, &mgmt_frame_len, @@ -7054,42 +6582,43 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, mgmt_frame_len - DOT11_MGMT_HDR_LEN)) { sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *) (&mgmt_frame[DOT11_MGMT_HDR_LEN]); - if (sd_act_frm && wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) { - if (wl->next_af_subtype == sd_act_frm->action) { - WL_DBG(("We got a right next frame of SD!(%d)\n", - sd_act_frm->action)); - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, - (ndev == wl->p2p_net) ? - wl_to_prmry_ndev(wl) : ndev); - - /* Stop waiting for next AF. */ - wl_stop_wait_next_action_frame(wl, ndev); - } - } (void) sd_act_frm; - } else { - /* - * if we got normal action frame and ndev is p2p0, - * we have to change ndev from p2p0 to wlan0 - */ -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - if (wl_cfg80211_is_wes(&mgmt_frame[DOT11_MGMT_HDR_LEN], - mgmt_frame_len - DOT11_MGMT_HDR_LEN) && wes_mode == 0) { - /* Ignore WES VS Action frame */ - goto exit; - } -#endif /* WES_SUPPORT */ - if (wl->p2p_net == ndev) - ndev = wl_to_prmry_ndev(wl); } if (act_frm) { #ifdef WL_CFG80211_GON_COLLISION if (act_frm->subtype == P2P_PAF_GON_REQ) { - wl_gon_req_collision(wl, - &wl->afx_hdl->pending_tx_act_frm->action_frame, - act_frm, ndev, e->addr, da); + if (wl->afx_hdl->pending_tx_act_frm) { + wl_action_frame_t *tx_act_frm = + &wl->afx_hdl->pending_tx_act_frm->action_frame; + if (wl_is_gon_req_collision(wl, tx_act_frm, act_frm)) { + /* if sa(peer) addr is less than da(my) addr, + * my device will process peer's gon request and block to send my gon req. + * + * if not (sa addr > da addr), + * my device will process gon request and drop current gon req of peer. + */ + if (memcmp(e->addr.octet, da.octet, ETHER_ADDR_LEN) < 0) { + /* block to send tx gon request */ + wl->block_gon_req_tx_count = BLOCK_GON_REQ_MAX_NUM; + WL_ERR((" block to send gon req tx !!!\n")); + + /* if we are scanning peer channel for sending af, + * do not scan more to block to send current gon req + */ + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { + wl_clr_drv_status(wl, SCANNING_PEER_CHANNEL, ndev); + complete(&wl->act_frm_scan); + } + } else { + /* drop current gon request of peer to process gon request by my device */ + /* should reduce another af tx to keep 100ms for next gon process */ + WL_ERR((" drop to receive gon req rx !!! \n")); + wl->block_gon_req_rx_count = BLOCK_GON_REQ_MAX_NUM; + } + } + } if (wl->block_gon_req_rx_count) { WL_ERR(("drop frame GON Req Rx : count (%d)\n", wl->block_gon_req_rx_count)); @@ -7103,18 +6632,32 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, } #endif /* WL_CFG80211_GON_COLLISION */ +#ifdef WL_CFG80211_SYNC_GON_TIME if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) { - if (wl->next_af_subtype == act_frm->subtype) { - WL_DBG(("We got a right next frame!(%d)\n", - act_frm->subtype)); - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, - (ndev == wl->p2p_net) ? - wl_to_prmry_ndev(wl) : ndev); - - /* Stop waiting for next AF. */ - wl_stop_wait_next_action_frame(wl, ndev); + if (wl->next_gon_af_subtype == act_frm->subtype) { + WL_DBG(("We got a right next frame!(%d) time (%d)\n", + act_frm->subtype, + jiffies_to_msecs(jiffies - wl->saved_jiffies))); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); + + if (wl_get_drv_status_all(wl, SENDING_ACT_FRM) && + (wl_get_p2p_status(wl, ACTION_TX_COMPLETED) || + wl_get_p2p_status(wl, ACTION_TX_NOACK))) { + WL_DBG(("*** Wake UP ** abort actframe ** \n")); + //wake_up_interruptible(&wl->send_af_done_event); + /* if channel is not zero, "actfame" uses off channel scan. + * So abort scan for off channel completion. */ + if (wl->af_sent_channel) + wl_cfg80211_scan_abort(wl, dev); + } else if (wl_get_drv_status_all(wl, WAITING_MORE_TIME_NEXT_ACT_FRM)) { + WL_DBG(("*** Wake UP ** wait_next_af ** \n")); + complete(&wl->wait_next_af); + } + //wake_up_interruptible(&wl->send_af_done_event); + //msleep(5); } } +#endif /* WL_CFG80211_SYNC_GON_TIME */ } wl_cfgp2p_print_actframe(false, &mgmt_frame[DOT11_MGMT_HDR_LEN], @@ -7123,14 +6666,13 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, * After complete GO Negotiation, roll back to mpc mode */ if (act_frm && ((act_frm->subtype == P2P_PAF_GON_CONF) || - (act_frm->subtype == P2P_PAF_PROVDIS_RSP))) { + (act_frm->subtype == P2P_PAF_PROVDIS_RSP))) { wldev_iovar_setint(dev, "mpc", 1); } - if (act_frm && (act_frm->subtype == P2P_PAF_GON_CONF)) { - WL_DBG(("P2P: GO_NEG_PHASE status cleared \n")); - wl_clr_p2p_status(wl, GO_NEG_PHASE); - } } else { + if (wl_get_mode_by_netdev(wl, ndev) == WL_INVALID) + return WL_INVALID; + mgmt_frame = (u8 *)((wl_event_rx_frame_data_t *)rxframe + 1); /* wpa supplicant use probe request event for restarting another GON Req. @@ -7142,44 +6684,37 @@ wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, WL_DBG((" Event %s\n", (event == WLC_E_P2P_PROBREQ_MSG) ? "WLC_E_P2P_PROBREQ_MSG":"WLC_E_PROBREQ_MSG")); + if ((wl_get_drv_status_all(wl, SENDING_ACT_FRM) +#ifdef WL_CFG80211_SYNC_GON_TIME + || wl_get_drv_status_all(wl, WAITING_MORE_TIME_NEXT_ACT_FRM) +#endif /* WL_CFG80211_SYNC_GON_TIME */ + ) && + !memcmp(wl->afx_hdl->tx_dst_addr.octet, e->addr.octet, ETHER_ADDR_LEN)) { #ifdef WL_CFG80211_USE_PRB_REQ_FOR_AF_TX - if (WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl) && - !memcmp(wl->afx_hdl->tx_dst_addr.octet, e->addr.octet, - ETHER_ADDR_LEN)) { if (wl->afx_hdl->pending_tx_act_frm && - wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { s32 channel = CHSPEC_CHANNEL(hton16(rxframe->channel)); - WL_DBG(("PROBE REQUEST : Peer found, channel : %d\n", - channel)); + WL_DBG(("PROBE REQUEST : Peer found, channel : %d\n", channel)); wl->afx_hdl->peer_chan = channel; complete(&wl->act_frm_scan); } - } #endif /* WL_CFG80211_USE_PRB_REQ_FOR_AF_TX */ - - /* Filter any P2P probe reqs arriving during the - * GO-NEG Phase - */ - if (wl->p2p && - wl_get_p2p_status(wl, GO_NEG_PHASE)) { - WL_DBG(("Filtering P2P probe_req while " - "being in GO-Neg state\n")); + /* do not send probe request event to upper layer */ + WL_DBG((" Do Not Send..... PROBE REQUEST Event !!!!!\n")); return 0; } } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) - cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); -#else cfg80211_rx_mgmt(ndev, freq, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ WL_DBG(("%s: mgmt_frame_len (%d) , e->datalen (%d), channel (%d), freq (%d)\n", __func__, mgmt_frame_len, ntoh32(e->datalen), channel, freq)); + exit: if (isfree) kfree(mgmt_frame); + return 0; } @@ -7275,8 +6810,6 @@ static s32 wl_init_priv_mem(struct wl_priv *wl) WL_ERR(("sta info alloc failed\n")); goto init_priv_mem_out; } - -#if defined(STATIC_WL_PRIV_STRUCT) wl->conn_info = (void *)kzalloc(sizeof(*wl->conn_info), GFP_KERNEL); if (unlikely(!wl->conn_info)) { WL_ERR(("wl->conn_info alloc failed\n")); @@ -7287,23 +6820,32 @@ static s32 wl_init_priv_mem(struct wl_priv *wl) WL_ERR(("wl->ie alloc failed\n")); goto init_priv_mem_out; } -#if defined(DUAL_ESCAN_RESULT_BUFFER) +#ifdef CONFIG_DHD_USE_STATIC_BUF wl->escan_info.escan_buf[0] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); bzero(wl->escan_info.escan_buf[0], ESCAN_BUF_SIZE); wl->escan_info.escan_buf[1] = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN1, 0); bzero(wl->escan_info.escan_buf[1], ESCAN_BUF_SIZE); #else - wl->escan_info.escan_buf = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); - bzero(wl->escan_info.escan_buf, ESCAN_BUF_SIZE); -#endif /* DUAL_ESCAN_RESULT_BUFFER */ -#endif /* STATIC_WL_PRIV_STRUCT */ + wl->escan_info.escan_buf[0] = (void *)kzalloc(ESCAN_BUF_SIZE, GFP_KERNEL); + if (unlikely(!wl->escan_info.escan_buf[0])) { + WL_ERR(("wl->escan_info.escan_buf[0] alloc failed\n")); + goto init_priv_mem_out; + } + wl->escan_info.escan_buf[1] = (void *)kzalloc(ESCAN_BUF_SIZE, GFP_KERNEL); + if (unlikely(!wl->escan_info.escan_buf[1])) { + WL_ERR(("wl->escan_info.escan_buf[1] alloc failed\n")); + goto init_priv_mem_out; + } +#endif wl->afx_hdl = (void *)kzalloc(sizeof(*wl->afx_hdl), GFP_KERNEL); if (unlikely(!wl->afx_hdl)) { WL_ERR(("afx hdl alloc failed\n")); goto init_priv_mem_out; } else { init_completion(&wl->act_frm_scan); +#ifdef WL_CFG80211_SYNC_GON_TIME init_completion(&wl->wait_next_af); +#endif /* WL_CFG80211_SYNC_GON_TIME */ INIT_WORK(&wl->afx_hdl->work, wl_cfg80211_afx_handler); } @@ -7335,18 +6877,16 @@ static void wl_deinit_priv_mem(struct wl_priv *wl) wl->pmk_list = NULL; kfree(wl->sta_info); wl->sta_info = NULL; -#if defined(STATIC_WL_PRIV_STRUCT) kfree(wl->conn_info); wl->conn_info = NULL; kfree(wl->ie); wl->ie = NULL; -#if defined(DUAL_ESCAN_RESULT_BUFFER) +#ifndef CONFIG_DHD_USE_STATIC_BUF + kfree(wl->escan_info.escan_buf[0]); + kfree(wl->escan_info.escan_buf[1]); +#endif wl->escan_info.escan_buf[0] = NULL; wl->escan_info.escan_buf[1] = NULL; -#else - wl->escan_info.escan_buf = NULL; -#endif -#endif /* STATIC_WL_PRIV_STRUCT */ if (wl->afx_hdl) { cancel_work_sync(&wl->afx_hdl->work); kfree(wl->afx_hdl); @@ -7365,16 +6905,15 @@ static void wl_deinit_priv_mem(struct wl_priv *wl) static s32 wl_create_event_handler(struct wl_priv *wl) { int ret = 0; - WL_DBG(("Enter \n")); - + WL_ERR(("Enter \n")); + WL_ERR(("wl = 0x%08x, wl->event_tsk = 0x%08x\n", + (unsigned int )wl, (unsigned int)&wl->event_tsk)); + if (wl->event_tsk.thr_pid > 0) + WL_ERR(("wl->event_tsk already created ?\n")); + /* Do not use DHD in cfg driver */ wl->event_tsk.thr_pid = -1; - -#ifdef USE_KTHREAD_API - PROC_START2(wl_event_handler, wl, &wl->event_tsk, 0, "wl_event_handler"); -#else PROC_START(wl_event_handler, wl, &wl->event_tsk, 0); -#endif if (wl->event_tsk.thr_pid < 0) ret = -ENOMEM; return ret; @@ -7413,12 +6952,12 @@ static void wl_notify_iscan_complete(struct wl_iscan_ctrl *iscan, bool aborted) return; } spin_lock_irqsave(&wl->cfgdrv_lock, flags); - wl_clr_drv_status(wl, SCANNING, ndev); if (likely(wl->scan_request)) { cfg80211_scan_done(wl->scan_request, aborted); wl->scan_request = NULL; } spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + wl_clr_drv_status(wl, SCANNING, ndev); wl->iscan_kickstart = false; } @@ -7490,7 +7029,7 @@ static s32 wl_iscan_pending(struct wl_priv *wl) s32 err = 0; /* Reschedule the timer */ - mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); + mod_timer(&iscan->timer, jiffies + iscan->timer_ms * HZ / 1000); iscan->timer_on = 1; return err; @@ -7506,7 +7045,7 @@ static s32 wl_iscan_inprogress(struct wl_priv *wl) wl_run_iscan(iscan, NULL, WL_SCAN_ACTION_CONTINUE); mutex_unlock(&wl->usr_sync); /* Reschedule the timer */ - mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); + mod_timer(&iscan->timer, jiffies + iscan->timer_ms * HZ / 1000); iscan->timer_on = 1; return err; @@ -7562,12 +7101,26 @@ static s32 wl_iscan_thread(void *data) static void wl_scan_timeout(unsigned long data) { struct wl_priv *wl = (struct wl_priv *)data; - + wl_event_msg_t msg; + wl_escan_result_t *escan_results; if (wl->scan_request) { WL_ERR(("timer expired\n")); - if (wl->escan_on) - wl_notify_escan_complete(wl, wl->escan_info.ndev, true, true); - else + if (wl->escan_on) { + msg.event_type = hton32(WLC_E_ESCAN_RESULT); + msg.status = hton32(WLC_E_STATUS_SUCCESS); + escan_results = kzalloc(sizeof(wl_escan_result_t), GFP_ATOMIC); + if (escan_results != NULL) { + msg.datalen = hton32(sizeof(wl_escan_result_t)); + escan_results->sync_id = htod16(wl->escan_info.cur_sync_id); + escan_results->bss_count =htod16(0); + escan_results->buflen = htod32(WL_ESCAN_RESULTS_FIXED_SIZE); + escan_results->version =htod32(WL_BSS_INFO_VERSION); + wl_cfg80211_event(wl->escan_info.ndev, &msg, escan_results); + kfree(escan_results); + } else { + wl_notify_escan_complete(wl, wl->escan_info.ndev, true); + } + } else wl_notify_iscan_complete(wl_to_iscan(wl), true); } } @@ -7626,10 +7179,10 @@ wl_cfg80211_netdev_notifier_call(struct notifier_block * nb, return NOTIFY_DONE; switch (state) { case NETDEV_DOWN: - while (work_pending(&wdev->cleanup_work) && refcnt < 100) { - if (refcnt%5 == 0) - WL_ERR(("%s : [NETDEV_DOWN] work_pending (%d th)\n", - __FUNCTION__, refcnt)); + while(work_pending(&wdev->cleanup_work) && refcnt < 100) { + if(refcnt%5==0) + WL_ERR(("%s : [NETDEV_DOWN] work_pending (%d th)\n", + __FUNCTION__, refcnt)); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(100); set_current_state(TASK_RUNNING); @@ -7649,8 +7202,10 @@ wl_cfg80211_netdev_notifier_call(struct notifier_block * nb, * make the scan done forcibly. */ if (wl_get_drv_status(wl, SCANNING, dev)) { + WL_SCAN2(("Abort Scan and send result\n")); + wl_cfg80211_scan_abort(wl, dev); if (wl->escan_on) { - wl_notify_escan_complete(wl, dev, true, true); + wl_notify_escan_complete(wl, dev, true); } } break; @@ -7660,56 +7215,23 @@ wl_cfg80211_netdev_notifier_call(struct notifier_block * nb, static struct notifier_block wl_cfg80211_netdev_notifier = { .notifier_call = wl_cfg80211_netdev_notifier_call, }; - -static s32 wl_notify_escan_complete(struct wl_priv *wl, +static void wl_notify_escan_complete(struct wl_priv *wl, struct net_device *ndev, - bool aborted, bool fw_abort) + bool aborted) { - wl_scan_params_t *params = NULL; - s32 params_size = 0; - s32 err = BCME_OK; unsigned long flags; - struct net_device *dev; WL_DBG(("Enter \n")); if (wl->escan_info.ndev != ndev) { - WL_ERR(("ndev is different %p %p\n", wl->escan_info.ndev, ndev)); - return err; - } - - if (wl->scan_request) { - if (wl->scan_request->dev == wl->p2p_net) - dev = wl_to_prmry_ndev(wl); - else - dev = wl->scan_request->dev; - } - else { - WL_DBG(("wl->scan_request is NULL may be internal scan." - "doing scan_abort for ndev %p primary %p p2p_net %p", - ndev, wl_to_prmry_ndev(wl), wl->p2p_net)); - dev = ndev; - } - if (fw_abort) { - /* Our scan params only need space for 1 channel and 0 ssids */ - params = wl_cfg80211_scan_alloc_params(-1, 0, ¶ms_size); - if (params == NULL) { - WL_ERR(("scan params allocation failed \n")); - err = -ENOMEM; - } else if (!in_atomic()) { - /* Do a scan abort to stop the driver's scan engine */ - err = wldev_ioctl(dev, WLC_SCAN, params, params_size, true); - if (err < 0) { - WL_ERR(("scan abort failed \n")); - } - } + WL_SCAN2(("ndev is different %p %p\n", wl->escan_info.ndev, ndev)); + return; } - if (timer_pending(&wl->scan_timeout)) - del_timer_sync(&wl->scan_timeout); -#if defined(ESCAN_RESULT_PATCH) - if (likely(wl->scan_request)) { -#if defined(DUAL_ESCAN_RESULT_BUFFER) + wl_clr_drv_status(wl, SCANNING, ndev); + if (p2p_is_on(wl)) + wl_clr_p2p_status(wl, SCANNING); + if(likely(wl->scan_request)) { u8 temp_id = wl->escan_info.cur_sync_id; if (aborted) wl->bss_list = @@ -7717,25 +7239,20 @@ static s32 wl_notify_escan_complete(struct wl_priv *wl, else wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf[(temp_id)%2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif wl_inform_bss(wl); } -#endif /* ESCAN_RESULT_PATCH */ + spin_lock_irqsave(&wl->cfgdrv_lock, flags); if (likely(wl->scan_request)) { cfg80211_scan_done(wl->scan_request, aborted); wl->scan_request = NULL; + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); } - if (p2p_is_on(wl)) - wl_clr_p2p_status(wl, SCANNING); - wl_clr_drv_status(wl, SCANNING, dev); - spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); - if (params) - kfree(params); - - return err; + else { + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + WL_SCAN2(("no scan request is existed\n")); + } + WL_DBG(("Exit \n")); } static s32 wl_escan_handler(struct wl_priv *wl, @@ -7752,11 +7269,10 @@ static s32 wl_escan_handler(struct wl_priv *wl, u32 bi_length; u32 i; u8 *p2p_dev_addr = NULL; + u8 *ptr; WL_DBG((" enter event type : %d, status : %d \n", ntoh32(e->event_type), ntoh32(e->status))); - - mutex_lock(&wl->usr_sync); /* P2P SCAN is coming from primary interface */ if (wl_get_p2p_status(wl, SCANNING)) { if (wl_get_drv_status_all(wl, SENDING_ACT_FRM)) @@ -7767,23 +7283,16 @@ static s32 wl_escan_handler(struct wl_priv *wl, } if (!ndev || !wl->escan_on || !wl_get_drv_status(wl, SCANNING, ndev)) { -#if defined(DUAL_ESCAN_RESULT_BUFFER) WL_ERR(("escan is not ready ndev %p wl->escan_on %d" " drv_status 0x%x e_type %d e_states %d\n", ndev, wl->escan_on, wl_get_drv_status(wl, SCANNING, ndev), ntoh32(e->event_type), ntoh32(e->status))); -#else - WL_ERR(("escan is not ready ndev %p wl->escan_on %d drv_status 0x%x\n", - ndev, wl->escan_on, wl_get_drv_status(wl, SCANNING, ndev))); -#endif - goto exit; + return err; } -#if defined(DUAL_ESCAN_RESULT_BUFFER) + escan_result = (wl_escan_result_t *) data; -#endif if (status == WLC_E_STATUS_PARTIAL) { WL_INFO(("WLC_E_STATUS_PARTIAL \n")); - escan_result = (wl_escan_result_t *) data; if (!escan_result) { WL_ERR(("Invalid escan result (NULL pointer)\n")); goto exit; @@ -7802,14 +7311,12 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_ERR(("Invalid bss_info length %d: ignoring\n", bi_length)); goto exit; } -#if defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) { - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); + + if (dtoh16(escan_result->sync_id) != wl->escan_info.cur_sync_id) { + WL_ERR(("Escan sync id mismatch: status %d cur_sync_id %d coming_sync_id %d\n" + , status, wl->escan_info.cur_sync_id, dtoh16(escan_result->sync_id))); goto exit; } -#endif if (!(wl_to_wiphy(wl)->interface_modes & BIT(NL80211_IFTYPE_ADHOC))) { if (dtoh16(bi->capability) & DOT11_CAP_IBSS) { @@ -7818,14 +7325,15 @@ static s32 wl_escan_handler(struct wl_priv *wl, } } - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + ptr = (u8 *) bi; + ptr += dtoh16(bi->ie_offset); + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { p2p_dev_addr = wl_cfgp2p_retreive_p2p_dev_addr(bi, bi_length); if (p2p_dev_addr && !memcmp(p2p_dev_addr, wl->afx_hdl->tx_dst_addr.octet, ETHER_ADDR_LEN)) { s32 channel = CHSPEC_CHANNEL( wl_chspec_driver_to_host(bi->chanspec)); - WL_DBG(("ACTION FRAME SCAN : Peer " MACDBG " found, channel : %d\n", - STR_TO_MACD(wl->afx_hdl->tx_dst_addr.octet), channel)); + WL_DBG(("ACTION FRAME SCAN : Peer found, channel : %d\n", channel)); wl_clr_p2p_status(wl, SCANNING); wl->afx_hdl->peer_chan = channel; complete(&wl->act_frm_scan); @@ -7834,15 +7342,10 @@ static s32 wl_escan_handler(struct wl_priv *wl, } else { int cur_len = 0; -#if defined(DUAL_ESCAN_RESULT_BUFFER) - list = (wl_scan_results_t *) - wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2]; -#else - list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif + list = (wl_scan_results_t *)wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2]; #if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) if (wl->p2p_net && wl->scan_request && - wl->scan_request->dev == wl->p2p_net) { + wl->scan_request->dev == wl->p2p_net) { #else if (p2p_is_on(wl) && p2p_scan(wl)) { #endif @@ -7850,19 +7353,17 @@ static s32 wl_escan_handler(struct wl_priv *wl, if (bi->flags & WL_BSS_FLAGS_FROM_BEACON) goto exit; if ((p2p_ie = wl_cfgp2p_find_p2pie(((u8 *) bi) + bi->ie_offset, - bi->ie_length)) == NULL) { - WL_ERR(("Couldn't find P2PIE in probe" - " response/beacon\n")); + bi->ie_length)) == NULL) { + WL_ERR(("Couldn't find P2PIE in probe response/beacon\n")); goto exit; } } +#define WLC_BSS_RSSI_ON_CHANNEL 0x0002 for (i = 0; i < list->count; i++) { bss = bss ? (wl_bss_info_t *)((uintptr)bss + dtoh32(bss->length)) : list->bss_info; - if (!bcmp(&bi->BSSID, &bss->BSSID, ETHER_ADDR_LEN) && - (CHSPEC_BAND(wl_chspec_driver_to_host(bi->chanspec)) - == CHSPEC_BAND(wl_chspec_driver_to_host(bss->chanspec))) && + CHSPEC_BAND(bi->chanspec) == CHSPEC_BAND(bss->chanspec) && bi->SSID_len == bss->SSID_len && !bcmp(bi->SSID, bss->SSID, bi->SSID_len)) { @@ -7873,9 +7374,9 @@ static s32 wl_escan_handler(struct wl_priv *wl, (bi->flags & WL_BSS_FLAGS_FROM_BEACON)) goto exit; - WL_DBG(("%s("MACDBG"), i=%d prev: RSSI %d" + WL_DBG(("%s("MACSTR"), i=%d prev: RSSI %d" " flags 0x%x, new: RSSI %d flags 0x%x\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), i, + bss->SSID, MAC2STR(bi->BSSID.octet), i, bss->RSSI, bss->flags, bi->RSSI, bi->flags)); if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) == @@ -7883,9 +7384,9 @@ static s32 wl_escan_handler(struct wl_priv *wl, /* preserve max RSSI if the measurements are * both on-channel or both off-channel */ - WL_SCAN(("%s("MACDBG"), same onchan" + WL_SCAN(("%s("MACSTR"), same onchan" ", RSSI: prev %d new %d\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + bss->SSID, MAC2STR(bi->BSSID.octet), bss->RSSI, bi->RSSI)); bi->RSSI = MAX(bss->RSSI, bi->RSSI); } else if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) && @@ -7893,9 +7394,9 @@ static s32 wl_escan_handler(struct wl_priv *wl, /* preserve the on-channel rssi measurement * if the new measurement is off channel */ - WL_SCAN(("%s("MACDBG"), prev onchan" + WL_SCAN(("%s("MACSTR"), prev onchan" ", RSSI: prev %d new %d\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + bss->SSID, MAC2STR(bi->BSSID.octet), bss->RSSI, bi->RSSI)); bi->RSSI = bss->RSSI; bi->flags |= WL_BSS_FLAGS_RSSI_ONCHANNEL; @@ -7906,8 +7407,8 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_SCAN(("bss info replacement" " is occured(bcast:%d->probresp%d)\n", bss->ie_length, bi->ie_length)); - WL_DBG(("%s("MACDBG"), replacement!(%d -> %d)\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + WL_DBG(("%s("MACSTR"), replacement!(%d -> %d)\n", + bss->SSID, MAC2STR(bi->BSSID.octet), prev_len, bi_length)); if (list->buflen - prev_len + bi_length @@ -7940,117 +7441,99 @@ static s32 wl_escan_handler(struct wl_priv *wl, WL_ERR(("Buffer is too small: ignoring\n")); goto exit; } -#if defined(DUAL_ESCAN_RESULT_BUFFER) - memcpy(&(wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2] - [list->buflen]), bi, bi_length); -#else - memcpy(&(wl->escan_info.escan_buf[list->buflen]), bi, bi_length); -#endif + memcpy(&(wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2][list->buflen]), bi, bi_length); list->version = dtoh32(bi->version); list->buflen += bi_length; list->count++; + } } else if (status == WLC_E_STATUS_SUCCESS) { wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + if (dtoh16(escan_result->sync_id) != wl->escan_info.cur_sync_id) + WL_ERR(("Escan sync id mismatch: status %d cur_sync_id %d coming_sync_id %d\n" + , status, wl->escan_info.cur_sync_id, dtoh16(escan_result->sync_id))); + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_p2p_status(wl, SCANNING); wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); } else if (likely(wl->scan_request)) { - WL_INFO(("ESCAN COMPLETED\n")); -#if defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif + mutex_lock(&wl->usr_sync); + del_timer_sync(&wl->scan_timeout); + WL_SCAN2(("ESCAN COMPLETED\n")); +#ifndef CUSTOMER_HW_SAMSUNG +#error bss list is informed at notify function + wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf[wl->escan_info.cur_sync_id%2]; wl_inform_bss(wl); - wl_notify_escan_complete(wl, ndev, false, false); +#endif + wl_notify_escan_complete(wl, ndev, false); + mutex_unlock(&wl->usr_sync); } -#if defined(DUAL_ESCAN_RESULT_BUFFER) wl->escan_info.cur_sync_id++; -#endif } else if (status == WLC_E_STATUS_ABORT) { wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + if (dtoh16(escan_result->sync_id) !=wl->escan_info.cur_sync_id) + WL_ERR(("Escan sync id mismatch: status %d cur_sync_id %d coming_sync_id %d\n" + , status, wl->escan_info.cur_sync_id, dtoh16(escan_result->sync_id))); + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); wl_clr_p2p_status(wl, SCANNING); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); } else if (likely(wl->scan_request)) { - WL_INFO(("ESCAN ABORTED\n")); -#if defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id+1)%2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif + mutex_lock(&wl->usr_sync); + del_timer_sync(&wl->scan_timeout); + WL_SCAN2(("ESCAN ABORTED\n")); +#ifndef CUSTOMER_HW_SAMSUNG +#error bss list is informed at notify function + wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id+1)%2]; wl_inform_bss(wl); - wl_notify_escan_complete(wl, ndev, true, false); +#endif + wl_notify_escan_complete(wl, ndev, true); + mutex_unlock(&wl->usr_sync); } -#if defined(DUAL_ESCAN_RESULT_BUFFER) wl->escan_info.cur_sync_id += 2; -#endif } else if (status == WLC_E_STATUS_NEWSCAN) { escan_result = (wl_escan_result_t *) data; WL_ERR(("WLC_E_STATUS_NEWSCAN : scan_request[%p]\n", wl->scan_request)); - WL_ERR(("sync_id[%d], bss_count[%d]\n", escan_result->sync_id, - escan_result->bss_count)); - } else { + WL_ERR(("sync_id[%d], bss_count[%d]\n", escan_result->sync_id, escan_result->bss_count)); + } + else { WL_ERR(("unexpected Escan Event %d : abort\n", status)); wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(DUAL_ESCAN_RESULT_BUFFER) - if (escan_result->sync_id != wl->escan_info.cur_sync_id) - WL_ERR(("Escan sync id mismatch: status %d " - "cur_sync_id %d coming_sync_id %d\n", - status, wl->escan_info.cur_sync_id, escan_result->sync_id)); -#endif - if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + if (dtoh16(escan_result->sync_id) != wl->escan_info.cur_sync_id) + WL_ERR(("Escan sync id mismatch: status %d cur_sync_id %d coming_sync_id %d\n" + , status, wl->escan_info.cur_sync_id, dtoh16(escan_result->sync_id))); + if (wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { WL_INFO(("ACTION FRAME SCAN DONE\n")); wl_clr_p2p_status(wl, SCANNING); wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); } else if (likely(wl->scan_request)) { -#if defined(DUAL_ESCAN_RESULT_BUFFER) - wl->bss_list = (wl_scan_results_t *) - wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id+1)%2]; -#else - wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; -#endif + mutex_lock(&wl->usr_sync); + del_timer_sync(&wl->scan_timeout); +#ifndef CUSTOMER_HW_SAMSUNG +#error bss list is informed at notify function + wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id+1)%2]; wl_inform_bss(wl); - wl_notify_escan_complete(wl, ndev, true, false); +#endif + wl_notify_escan_complete(wl, ndev, true); + mutex_unlock(&wl->usr_sync); } -#if defined(DUAL_ESCAN_RESULT_BUFFER) wl->escan_info.cur_sync_id += 2; -#endif } exit: - mutex_unlock(&wl->usr_sync); return err; } -static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, - enum wl_status state, bool set) +static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set) { s32 pm = PM_FAST; s32 err = BCME_OK; @@ -8059,129 +7542,99 @@ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_in u32 prev_chan = 0; u32 connected_cnt = 0; struct net_info *iter, *next; + struct net_device *primary_dev = wl_to_prmry_ndev(wl); if (set) { /* set */ switch (state) { - case WL_STATUS_CONNECTED: { - if ((connected_cnt = wl_get_drv_status_all(wl, CONNECTED)) > 1) { - pm = PM_OFF; - WL_INFO(("Do not enable the power save for VSDB mode\n")); - } else if (_net_info->pm_block) { - pm = PM_OFF; - } else { - pm = PM_FAST; - } - for_each_ndev(wl, iter, next) { - if ((connected_cnt == 1) && (iter->ndev != _net_info->ndev)) - continue; - chanspec = 0; - chan = 0; - if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { - if (wldev_iovar_getint(iter->ndev, "chanspec", - (s32 *)&chanspec) == BCME_OK) { - chan = CHSPEC_CHANNEL(chanspec); - if (CHSPEC_IS40(chanspec)) { - if (CHSPEC_SB_UPPER(chanspec)) - chan += CH_10MHZ_APART; - else - chan -= CH_10MHZ_APART; + case WL_STATUS_CONNECTED: { + if ((connected_cnt = wl_get_drv_status_all(wl, CONNECTED)) > 1) { + pm = PM_OFF; + WL_INFO(("Do not enable the power save for VSDB mode\n")); + } else if (_net_info->pm_block) { + pm = PM_OFF; + } else { + pm = PM_FAST; + } + for_each_ndev(wl, iter, next) { + if ((connected_cnt == 1) && (iter->ndev != _net_info->ndev)) + continue; + chanspec = 0; + chan = 0; + if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { + if (wldev_iovar_getint(iter->ndev, "chanspec", (s32 *)&chanspec) == BCME_OK) { + chan = CHSPEC_CHANNEL(chanspec); + if (CHSPEC_IS40(chanspec)) { + if (CHSPEC_SB_UPPER(chanspec)) + chan += CH_10MHZ_APART; + else + chan -= CH_10MHZ_APART; + } + wl_update_prof(wl, iter->ndev, NULL, &chan, WL_PROF_CHAN); } - wl_update_prof(wl, iter->ndev, NULL, - &chan, WL_PROF_CHAN); - } - if ((wl_get_mode_by_netdev(wl, iter->ndev) - == WL_MODE_BSS)) { + if ((wl_get_mode_by_netdev(wl, iter->ndev) == WL_MODE_BSS)) { pm = htod32(pm); - WL_DBG(("power save %s\n", - (pm ? "enabled" : "disabled"))); - err = wldev_ioctl(iter->ndev, WLC_SET_PM, - &pm, sizeof(pm), true); + WL_DBG(("power save %s\n", (pm ? "enabled" : "disabled"))); + err = wldev_ioctl(iter->ndev, WLC_SET_PM, &pm, sizeof(pm), true); if (unlikely(err)) { if (err == -ENODEV) - WL_DBG(("net_device" - " is not ready\n")); + WL_DBG(("net_device is not ready yet\n")); else - WL_ERR(("error" - " (%d)\n", err)); + WL_ERR(("error (%d)\n", err)); break; } } - if (connected_cnt > 1) { - if (!prev_chan && chan) - prev_chan = chan; - else if (prev_chan && (prev_chan != chan)) { - wl->vsdb_mode = true; - } - if (wl->roamoff_on_concurrent) { - if ((err = wldev_iovar_getint(iter->ndev, - "roam_off", (s32 *)&iter->roam_off)) - == BCME_OK) { - if ((err = - wldev_iovar_setint(iter->ndev, - "roam_off", 1)) != - BCME_OK) { - WL_ERR((" failed to set " - "roam_off : %d\n", err)); - } - } else - WL_ERR(("failed to get" - " roam_off : %d\n", err)); + if (connected_cnt > 1) { + if (!prev_chan && chan) + prev_chan = chan; + else if (prev_chan && (prev_chan != chan)){ + wl->vsdb_mode = true; + } } } } + if ((wl_get_mode_by_netdev(wl, _net_info->ndev) == WL_MODE_AP) && p2p_is_on(wl)) + if (wl_add_remove_eventmsg(primary_dev, WLC_E_P2P_PROBREQ_MSG, true) != BCME_OK) + CFGP2P_ERR((" failed to set WLC_E_P2P_PROPREQ_MSG\n")); + + break; } - break; - } - default: - break; + default: + break; } } else { /* clear */ switch (state) { - case WL_STATUS_CONNECTED: { - chan = 0; - /* clear chan information when the net device is disconnected */ - wl_update_prof(wl, _net_info->ndev, NULL, &chan, WL_PROF_CHAN); - if (wl_get_drv_status_all(wl, CONNECTED) == 1) { - wl->vsdb_mode = false; - for_each_ndev(wl, iter, next) { - if (wl_get_drv_status(wl, CONNECTED, iter->ndev) && - (wl_get_mode_by_netdev(wl, iter->ndev) - == WL_MODE_BSS)) { - if (wl_get_netinfo_by_netdev(wl, - iter->ndev)->pm_block) - pm = PM_OFF; - else - pm = PM_FAST; - pm = htod32(pm); - WL_DBG(("power save %s\n", - (pm ? "enabled" : "disabled"))); - err = wldev_ioctl(iter->ndev, - WLC_SET_PM, &pm, sizeof(pm), true); - if (unlikely(err)) { - if (err == -ENODEV) - WL_DBG(("net_device" - " is not ready\n")); + case WL_STATUS_CONNECTED: { + chan = 0; + wl_update_prof(wl, _net_info->ndev, NULL, &chan, WL_PROF_CHAN); + if (wl_get_drv_status_all(wl, CONNECTED) == 1) { + wl->vsdb_mode = false; + for_each_ndev(wl, iter, next) { + if (wl_get_drv_status(wl, CONNECTED, iter->ndev) && + (wl_get_mode_by_netdev(wl, iter->ndev) == WL_MODE_BSS)) { + if (wl_get_netinfo_by_netdev(wl, iter->ndev)->pm_block) + pm = PM_OFF; else - WL_ERR(("error" - " (%d)\n", err)); - break; + pm = PM_FAST; + pm = htod32(pm); + WL_DBG(("power save %s\n", (pm ? "enabled" : "disabled"))); + err = wldev_ioctl(iter->ndev, WLC_SET_PM, + &pm, sizeof(pm), true); + if (unlikely(err)) { + if (err == -ENODEV) + WL_DBG(("net_device is not ready yet\n")); + else + WL_ERR(("error (%d)\n", err)); + break; + } } } } + if ((wl_get_mode_by_netdev(wl, _net_info->ndev) == WL_MODE_AP) && p2p_is_on(wl)) + if (wl_add_remove_eventmsg(primary_dev, WLC_E_P2P_PROBREQ_MSG, false) != BCME_OK) + CFGP2P_ERR((" failed to unset WLC_E_P2P_PROPREQ_MSG\n")); + break; } - if (wl->roamoff_on_concurrent) { - for_each_ndev(wl, iter, next) { - if ((iter->roam_off != WL_INVALID) && - ((err = wldev_iovar_setint(iter->ndev, "roam_off", - iter->roam_off)) == BCME_OK)) { - iter->roam_off = WL_INVALID; - } else if (err) - WL_ERR((" failed to set roam_off : %d\n", err)); - } - } - break; - } - default: - break; + default: + break; } } return err; @@ -8210,9 +7663,7 @@ static s32 wl_init_scan(struct wl_priv *wl) } else if (wl->escan_on) { wl->evt_handler[WLC_E_ESCAN_RESULT] = wl_escan_handler; wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; -#if defined(DUAL_ESCAN_RESULT_BUFFER) wl->escan_info.cur_sync_id = 0; -#endif } /* Init scan_timeout timer */ init_timer(&wl->scan_timeout); @@ -8236,9 +7687,9 @@ static s32 wl_init_priv(struct wl_priv *wl) wl->iscan_kickstart = false; wl->active_scan = true; wl->rf_blocked = false; - wl->vsdb_mode = false; + wl->first_remain = true; wl->wlfc_on = false; - wl->roamoff_on_concurrent = true; + /* register interested state */ set_bit(WL_STATUS_CONNECTED, &wl->interrested_state); spin_lock_init(&wl->cfgdrv_lock); @@ -8277,7 +7728,7 @@ static void wl_deinit_priv(struct wl_priv *wl) unregister_netdevice_notifier(&wl_cfg80211_netdev_notifier); } -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WLP2P) && (ENABLE_P2P_INTERFACE) static s32 wl_cfg80211_attach_p2p(void) { struct wl_priv *wl = wlcfg_drv_priv; @@ -8312,7 +7763,7 @@ static s32 wl_cfg80211_detach_p2p(void) return 0; } -#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ +#endif /* defined(WLP2P) && (ENABLE_P2P_INTERFACE) */ s32 wl_cfg80211_attach_post(struct net_device *ndev) { @@ -8327,7 +7778,7 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev) if (wl && !wl_get_drv_status(wl, READY, ndev)) { if (wl->wdev && wl_cfgp2p_supported(wl, ndev)) { -#if !defined(WL_ENABLE_P2P_IF) +#if !ENABLE_P2P_INTERFACE wl->wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT)| BIT(NL80211_IFTYPE_P2P_GO)); @@ -8335,20 +7786,19 @@ s32 wl_cfg80211_attach_post(struct net_device *ndev) if ((err = wl_cfgp2p_init_priv(wl)) != 0) goto fail; -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WLP2P) && (ENABLE_P2P_INTERFACE) if (wl->p2p_net) { /* Update MAC addr for p2p0 interface here. */ memcpy(wl->p2p_net->dev_addr, ndev->dev_addr, ETH_ALEN); wl->p2p_net->dev_addr[0] |= 0x02; - WL_ERR(("%s: p2p_dev_addr="MACDBG "\n", - wl->p2p_net->name, - STR_TO_MACD(wl->p2p_net->dev_addr))); + printk("%s: p2p_dev_addr="MACSTR "\n", + wl->p2p_net->name, MAC2STR(wl->p2p_net->dev_addr)); } else { WL_ERR(("p2p_net not yet populated." " Couldn't update the MAC Address for p2p0 \n")); return -ENODEV; } -#endif /* defined(WLP2P) && (WL_ENABLE_P2P_IF) */ +#endif /* defined(WLP2P) && (ENABLE_P2P_INTERFACE) */ wl->p2p_supported = true; } @@ -8386,6 +7836,8 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data) } wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS); wl = (struct wl_priv *)wiphy_priv(wdev->wiphy); + WL_ERR(("%s: wl = 0x%08x\n", __FUNCTION__, (unsigned int)wl)); + wl->wdev = wdev; wl->pub = data; INIT_LIST_HEAD(&wl->net_list); @@ -8403,7 +7855,6 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data) WL_ERR(("Failed to init iwm_priv (%d)\n", err)); goto cfg80211_attach_out; } - err = wl_setup_rfkill(wl, TRUE); if (err) { WL_ERR(("Failed to setup rfkill %d\n", err)); @@ -8417,11 +7868,11 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data) #if defined(COEX_DHCP) if (wl_cfg80211_btcoex_init(wl)) goto cfg80211_attach_out; -#endif +#endif wlcfg_drv_priv = wl; -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) +#if defined(WLP2P) && (ENABLE_P2P_INTERFACE) err = wl_cfg80211_attach_p2p(); if (err) goto cfg80211_attach_out; @@ -8446,17 +7897,16 @@ void wl_cfg80211_detach(void *para) #if defined(COEX_DHCP) wl_cfg80211_btcoex_deinit(wl); -#endif +#endif +#if defined(WLP2P) && (ENABLE_P2P_INTERFACE) + wl_cfg80211_detach_p2p(); +#endif wl_setup_rfkill(wl, FALSE); if (wl->p2p_supported) { WL_ERR(("wl_cfgp2p_down() is not called yet\n")); wl_cfgp2p_down(wl); } - -#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) - wl_cfg80211_detach_p2p(); -#endif wl_deinit_priv(wl); wlcfg_drv_priv = NULL; wl_cfg80211_clear_parent_dev(); @@ -8516,19 +7966,23 @@ static s32 wl_event_handler(void *data) struct wl_priv *wl = NULL; struct wl_event_q *e; tsk_ctl_t *tsk = (tsk_ctl_t *)data; + int ret; wl = (struct wl_priv *)tsk->parent; -#ifndef USE_KTHREAD_API + WL_ERR(("tsk Enter, tsk = 0x%08x\n", (unsigned int)tsk)); DAEMONIZE("dhd_cfg80211_event"); + WL_ERR(("DAEMONIZE completed\n")); complete(&tsk->completed); -#else - WL_ERR(("tsk Enter, tsk = 0x%08x\n", (unsigned int)tsk)); -#endif + WL_ERR(("tsk completed\n")); - while (down_interruptible (&tsk->sema) == 0) { + while ((ret = down_interruptible (&tsk->sema)) == 0) { + WL_DBG(("down the event sema\n")); SMP_RD_BARRIER_DEPENDS(); - if (tsk->terminated) + if (tsk->terminated) { + WL_DBG(("%s was terminated[%d] ret=%d\n", + __func__, __LINE__, ret)); break; + } while ((e = wl_deq_event(wl))) { WL_DBG(("event type (%d), if idx: %d\n", e->etype, e->emsg.ifidx)); /* All P2P device address related events comes on primary interface since @@ -8543,15 +7997,17 @@ static s32 wl_event_handler(void *data) if (!netdev) netdev = wl_to_prmry_ndev(wl); if (e->etype < WLC_E_LAST && wl->evt_handler[e->etype]) { + WL_DBG(("call event handler\n")); wl->evt_handler[e->etype] (wl, netdev, &e->emsg, e->edata); } else { + WL_DBG(("Unknown Event (%d): ignoring\n", e->etype)); } wl_put_event(e); } DHD_OS_WAKE_UNLOCK(wl->pub); } - WL_ERR(("%s was terminated\n", __func__)); + WL_ERR(("%s was terminated[%d] ret=%d\n", __func__, __LINE__, ret)); complete_and_exit(&tsk->completed, 0); return 0; } @@ -8561,6 +8017,9 @@ wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t * e, void *data) { u32 event_type = ntoh32(e->event_type); struct wl_priv *wl = wlcfg_drv_priv; +#if defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) + int pno_wakelock_timeout = 10; /* 10 second */ +#endif #if (WL_DBG_LEVEL > 0) s8 *estr = (event_type <= sizeof(wl_dbg_estr) / WL_DBG_ESTR_MAX - 1) ? @@ -8568,12 +8027,15 @@ wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t * e, void *data) WL_DBG(("event_type (%d):" "WLC_E_" "%s\n", event_type, estr)); #endif /* (WL_DBG_LEVEL > 0) */ - if (event_type == WLC_E_PFN_NET_FOUND) { - WL_DBG((" PNOEVENT: PNO_NET_FOUND\n")); - } - else if (event_type == WLC_E_PFN_NET_LOST) { - WL_DBG((" PNOEVENT: PNO_NET_LOST\n")); + if (event_type == WLC_E_PFN_NET_FOUND) + { +#if defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) + net_os_wake_lock_timeout_for_pno(ndev, pno_wakelock_timeout); +#endif + WL_ERR((" PNO Event\n")); } + else if (event_type == WLC_E_PFN_NET_LOST) + WL_ERR((" PNOEVENT: PNO_NET_LOST\n")); if (likely(!wl_enq_event(wl, ndev, event_type, e, data))) wl_wakeup_event(wl); @@ -8648,6 +8110,7 @@ wl_enq_event(struct wl_priv *wl, struct net_device *ndev, u32 event, const wl_ev if (data) memcpy(e->edata, data, data_len); flags = wl_lock_eq(wl); + WL_DBG(("enque the event to event queue\n")); list_add_tail(&e->eq_list, &wl->eq_list); wl_unlock_eq(wl, flags); @@ -8747,7 +8210,6 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) bool update; bool ht40_allowed; u8 *pbuf = NULL; - #define LOCAL_BUF_LEN 1024 pbuf = kzalloc(LOCAL_BUF_LEN, GFP_KERNEL); @@ -8767,7 +8229,6 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) return err; } #undef LOCAL_BUF_LEN - list = (wl_uint32_list_t *)(void *)pbuf; band = array_size = n_2g = n_5g = 0; for (i = 0; i < dtoh32(list->count); i++) { @@ -8775,7 +8236,6 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) update = false; ht40_allowed = false; c = (chanspec_t)dtoh32(list->element[i]); - c = wl_chspec_driver_to_host(c); channel = CHSPEC_CHANNEL(c); if (CHSPEC_IS40(c)) { if (CHSPEC_SB_UPPER(c)) @@ -8797,8 +8257,7 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) ht40_allowed = (bw_cap == WLC_N_BW_20ALL)? false : true; } else { WL_ERR(("Invalid channel Sepc. 0x%x.\n", c)); - kfree(pbuf); - return BCME_ERROR; + continue; } for (j = 0; (j < *n_cnt && (*n_cnt < array_size)); j++) { if (band_chan_arr[j].hw_value == channel) { @@ -8811,24 +8270,16 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) else index = *n_cnt; if (index < array_size) { -#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) - band_chan_arr[index].center_freq = - ieee80211_channel_to_frequency(channel); -#else band_chan_arr[index].center_freq = ieee80211_channel_to_frequency(channel, band); -#endif band_chan_arr[index].hw_value = channel; if (CHSPEC_IS40(c) && ht40_allowed) { - /* assuming the order is HT20, HT40 Upper, - HT40 lower from chanspecs - */ + /* assuming the order is HT20, HT40 Upper, HT40 lower from chanspecs */ u32 ht40_flag = band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40; if (CHSPEC_SB_UPPER(c)) { if (ht40_flag == IEEE80211_CHAN_NO_HT40) - band_chan_arr[index].flags &= - ~IEEE80211_CHAN_NO_HT40; + band_chan_arr[index].flags &= ~IEEE80211_CHAN_NO_HT40; band_chan_arr[index].flags |= IEEE80211_CHAN_NO_HT40PLUS; } else { /* It should be one of @@ -8836,8 +8287,7 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) */ band_chan_arr[index].flags &= ~IEEE80211_CHAN_NO_HT40; if (ht40_flag == IEEE80211_CHAN_NO_HT40) - band_chan_arr[index].flags |= - IEEE80211_CHAN_NO_HT40MINUS; + band_chan_arr[index].flags |= IEEE80211_CHAN_NO_HT40MINUS; } } else { band_chan_arr[index].flags = IEEE80211_CHAN_NO_HT40; @@ -8845,18 +8295,13 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) channel |= WL_CHANSPEC_BAND_2G; else channel |= WL_CHANSPEC_BAND_5G; - channel |= WL_CHANSPEC_BW_20; - channel = wl_chspec_host_to_driver(channel); err = wldev_iovar_getint(dev, "per_chan_info", &channel); if (!err) { if (channel & WL_CHAN_RADAR) - band_chan_arr[index].flags |= - (IEEE80211_CHAN_RADAR | - IEEE80211_CHAN_NO_IBSS); + band_chan_arr[index].flags |= (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS); if (channel & WL_CHAN_PASSIVE) - band_chan_arr[index].flags |= - IEEE80211_CHAN_PASSIVE_SCAN; - } + band_chan_arr[index].flags |= IEEE80211_CHAN_PASSIVE_SCAN; + } } if (!update) (*n_cnt)++; @@ -8879,84 +8324,80 @@ s32 wl_update_wiphybands(struct wl_priv *wl) s32 err = 0; s32 index = 0; s32 nmode = 0; - bool rollback_lock = false; s32 bw_cap = 0; s32 cur_band = -1; - if (wl == NULL) { + if (wl == NULL) wl = wlcfg_drv_priv; - mutex_lock(&wl->usr_sync); - rollback_lock = true; - } dev = wl_to_prmry_ndev(wl); + memset(bandlist, 0, sizeof(bandlist)); err = wldev_ioctl(dev, WLC_GET_BANDLIST, bandlist, sizeof(bandlist), false); if (unlikely(err)) { - WL_ERR(("error real bandlist (%d)\n", err)); - goto end_bands; + WL_ERR(("error (%d)\n", err)); + return err; } err = wldev_ioctl(dev, WLC_GET_BAND, &cur_band, sizeof(s32), false); if (unlikely(err)) { WL_ERR(("error (%d)\n", err)); - goto end_bands; + return err; } err = wldev_iovar_getint(dev, "nmode", &nmode); - if (unlikely(err)) { - WL_ERR(("error reading nmode (%d)\n", err)); - } else { - /* For nmodeonly check bw cap */ - err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap); - if (unlikely(err)) { - WL_ERR(("error get mimo_bw_cap (%d)\n", err)); - } + if (err) { + return err; } + err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap); + if (err) { + return err; + } + err = wl_construct_reginfo(wl, bw_cap); if (err) { WL_ERR(("wl_construct_reginfo() fails err=%d\n", err)); - if (err != BCME_UNSUPPORTED) - goto end_bands; - err = 0; + return err; } + if ((cur_band == WLC_BAND_2G) || + (cur_band == WLC_BAND_5G)) { + bandlist[0] = 1; + bandlist[1] = cur_band; + } + wiphy = wl_to_wiphy(wl); nband = bandlist[0]; wiphy->bands[IEEE80211_BAND_5GHZ] = NULL; wiphy->bands[IEEE80211_BAND_2GHZ] = NULL; for (i = 1; i <= nband && i < ARRAYSIZE(bandlist); i++) { index = -1; - if (bandlist[i] == WLC_BAND_5G && __wl_band_5ghz_a.n_channels > 0) { + if (bandlist[i] == WLC_BAND_5G) { wiphy->bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a; index = IEEE80211_BAND_5GHZ; if (bw_cap == WLC_N_BW_40ALL || bw_cap == WLC_N_BW_20IN2G_40IN5G) wiphy->bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; } - else if (bandlist[i] == WLC_BAND_2G && __wl_band_2ghz.n_channels > 0) { + else if (bandlist[i] == WLC_BAND_2G) { wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; index = IEEE80211_BAND_2GHZ; if (bw_cap == WLC_N_BW_40ALL) wiphy->bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; - } + } if ((index >= 0) && nmode) { wiphy->bands[index]->ht_cap.cap |= - (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_DSSSCCK40); + (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_DSSSCCK40); wiphy->bands[index]->ht_cap.ht_supported = TRUE; wiphy->bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; wiphy->bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; } } - wiphy_apply_custom_regulatory(wiphy, &brcm_regdom); - end_bands: - if (rollback_lock) - mutex_unlock(&wl->usr_sync); - return err; + return err; } static s32 __wl_cfg80211_up(struct wl_priv *wl) @@ -8965,7 +8406,7 @@ static s32 __wl_cfg80211_up(struct wl_priv *wl) struct net_device *ndev = wl_to_prmry_ndev(wl); struct wireless_dev *wdev = ndev->ieee80211_ptr; - WL_DBG(("In\n")); + WL_TRACE(("In\n")); err = dhd_config_dongle(wl, false); if (unlikely(err)) @@ -8992,13 +8433,8 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) unsigned long flags; struct net_info *iter, *next; struct net_device *ndev = wl_to_prmry_ndev(wl); -#ifdef WL_ENABLE_P2P_IF - struct wiphy *wiphy = wl_to_prmry_ndev(wl)->ieee80211_ptr->wiphy; -#if !defined(CUSTOMER_HW4) - struct net_device *p2p_net = wl->p2p_net; -#endif /* !defined(CUSTOMER_HW4) */ -#endif /* WL_ENABLE_P2P_IF */ - WL_DBG(("In\n")); + + WL_TRACE(("In\n")); /* Check if cfg80211 interface is already down */ if (!wl_get_drv_status(wl, READY, ndev)) return err; /* it is even not ready */ @@ -9006,12 +8442,6 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev); wl_term_iscan(wl); - spin_lock_irqsave(&wl->cfgdrv_lock, flags); - if (wl->scan_request) { - cfg80211_scan_done(wl->scan_request, true); - wl->scan_request = NULL; - } - spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); for_each_ndev(wl, iter, next) { wl_clr_drv_status(wl, READY, iter->ndev); @@ -9023,19 +8453,15 @@ static s32 __wl_cfg80211_down(struct wl_priv *wl) wl_clr_drv_status(wl, AP_CREATED, iter->ndev); wl_clr_drv_status(wl, AP_CREATING, iter->ndev); } + spin_lock_irqsave(&wl->cfgdrv_lock, flags); + if (wl->scan_request) { + cfg80211_scan_done(wl->scan_request, true); + wl->scan_request = NULL; + } wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION; -#ifdef WL_ENABLE_P2P_IF -// wiphy->interface_modes = (wiphy->interface_modes) -// & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| -// BIT(NL80211_IFTYPE_P2P_GO))); -#if !defined(CUSTOMER_HW4) - if ((p2p_net) && (p2p_net->flags & IFF_UP)) { - /* p2p0 interface is still UP. Bring it down */ - p2p_net->flags &= ~IFF_UP; - } -#endif -#endif /* WL_ENABLE_P2P_IF */ + spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + DNGL_FUNC(dhd_cfg80211_down, (wl)); wl_flush_eq(wl); wl_link_down(wl); @@ -9054,7 +8480,7 @@ s32 wl_cfg80211_up(void *para) dhd_pub_t *dhd; (void)para; - WL_DBG(("In\n")); + WL_TRACE(("In\n")); wl = wlcfg_drv_priv; if ((err = wldev_ioctl(wl_to_prmry_ndev(wl), WLC_GET_VERSION, &val, @@ -9104,7 +8530,7 @@ s32 wl_cfg80211_down(void *para) s32 err = 0; (void)para; - WL_DBG(("In\n")); + WL_TRACE(("In\n")); wl = wlcfg_drv_priv; mutex_lock(&wl->usr_sync); err = __wl_cfg80211_down(wl); @@ -9312,7 +8738,8 @@ static void wl_init_eq_lock(struct wl_priv *wl) static void wl_delay(u32 ms) { - if (in_atomic() || (ms < jiffies_to_msecs(1))) { + if (ms < 1000 / HZ) { + cond_resched(); mdelay(ms); } else { msleep(ms); @@ -9383,8 +8810,8 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, } if (!wl->p2p->on) { get_primary_mac(wl, &primary_mac); - wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, - &wl->p2p->int_addr); + wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); + /* In case of p2p_listen command, supplicant send remain_on_channel * without turning on P2P */ @@ -9395,7 +8822,7 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, if (unlikely(ret)) { goto exit; } - } + } if (net != wl_to_prmry_ndev(wl)) { if (wl_get_mode_by_netdev(wl, net) == WL_MODE_AP) { ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); @@ -9421,7 +8848,7 @@ s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, if (pktflag) ret = wl_cfgp2p_set_management_ie(wl, ndev, bssidx, pktflag, buf, len); } -exit: +exit: return ret; } @@ -9500,7 +8927,6 @@ static void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac) 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, 0, &wl->ioctl_buf_sync); memcpy(mac->octet, wl->ioctl_buf, ETHER_ADDR_LEN); } - int wl_cfg80211_do_driver_init(struct net_device *net) { struct wl_priv *wl = *(struct wl_priv **)netdev_priv(net); @@ -9516,98 +8942,5 @@ int wl_cfg80211_do_driver_init(struct net_device *net) void wl_cfg80211_enable_trace(int level) { - wl_dbg_level = (u32)level; -} - -#ifdef WL11U -bcm_tlv_t * -wl_cfg80211_find_interworking_ie(u8 *parse, u32 len) -{ - bcm_tlv_t *ie; - - while ((ie = bcm_parse_tlvs(parse, (u32)len, DOT11_MNG_INTERWORKING_ID))) { - return (bcm_tlv_t *)ie; - } - return NULL; -} - - -static s32 -wl_cfg80211_add_iw_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s32 pktflag, - uint8 ie_id, uint8 *data, uint8 data_len) -{ - s32 err = BCME_OK; - s32 buf_len; - s32 iecount; - ie_setbuf_t *ie_setbuf; - - if (ie_id != DOT11_MNG_INTERWORKING_ID) - return BCME_UNSUPPORTED; - - /* Validate the pktflag parameter */ - if ((pktflag & ~(VNDR_IE_BEACON_FLAG | VNDR_IE_PRBRSP_FLAG | - VNDR_IE_ASSOCRSP_FLAG | VNDR_IE_AUTHRSP_FLAG | - VNDR_IE_PRBREQ_FLAG | VNDR_IE_ASSOCREQ_FLAG| - VNDR_IE_CUSTOM_FLAG))) { - WL_ERR(("cfg80211 Add IE: Invalid packet flag 0x%x\n", pktflag)); - return -1; - } - - /* use VNDR_IE_CUSTOM_FLAG flags for none vendor IE . currently fixed value */ - pktflag = htod32(pktflag); - - buf_len = sizeof(ie_setbuf_t) + data_len - 1; - ie_setbuf = (ie_setbuf_t *) kzalloc(buf_len, GFP_KERNEL); - - if (!ie_setbuf) { - WL_ERR(("Error allocating buffer for IE\n")); - return -ENOMEM; - } - - if (wl->iw_ie_len == data_len && !memcmp(wl->iw_ie, data, data_len)) { - WL_ERR(("Previous IW IE is equals to current IE\n")); - return err; - } - - strncpy(ie_setbuf->cmd, "add", VNDR_IE_CMD_LEN - 1); - ie_setbuf->cmd[VNDR_IE_CMD_LEN - 1] = '\0'; - - /* Buffer contains only 1 IE */ - iecount = htod32(1); - memcpy((void *)&ie_setbuf->ie_buffer.iecount, &iecount, sizeof(int)); - memcpy((void *)&ie_setbuf->ie_buffer.ie_list[0].pktflag, &pktflag, sizeof(uint32)); - - /* Now, add the IE to the buffer */ - ie_setbuf->ie_buffer.ie_list[0].ie_data.id = ie_id; - - /* if already set with previous values, delete it first */ - if (wl->iw_ie_len != 0) { - WL_DBG(("Different IW_IE was already set. clear first\n")); - - ie_setbuf->ie_buffer.ie_list[0].ie_data.len = 0; - - err = wldev_iovar_setbuf_bsscfg(ndev, "ie", ie_setbuf, buf_len, - wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); - - if (err != BCME_OK) - return err; - } - - ie_setbuf->ie_buffer.ie_list[0].ie_data.len = data_len; - memcpy((uchar *)&ie_setbuf->ie_buffer.ie_list[0].ie_data.data[0], data, data_len); - - err = wldev_iovar_setbuf_bsscfg(ndev, "ie", ie_setbuf, buf_len, - wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); - - if (err == BCME_OK) { - memcpy(wl->iw_ie, data, data_len); - wl->iw_ie_len = data_len; - wl->wl11u = TRUE; - - err = wldev_iovar_setint_bsscfg(ndev, "grat_arp", 1, bssidx); - } - - kfree(ie_setbuf); - return err; + wl_dbg_level |= WL_DBG_DBG; } -#endif /* WL11U */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.h index 30c8620..4c9e516 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfg80211.h @@ -1,14 +1,14 @@ /* * Linux cfg80211 driver * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.h 353885 2012-08-29 05:21:34Z $ + * $Id: wl_cfg80211.h 307885 2012-01-12 23:30:48Z $ */ #ifndef _wl_cfg80211_h_ @@ -52,34 +52,23 @@ struct wl_ibss; #define dtohchanspec(i) i #define WL_DBG_NONE 0 -#define WL_DBG_P2P_ACTION (1 << 5) +#define WL_DBG_SCAN2 (1 <<5) #define WL_DBG_TRACE (1 << 4) -#define WL_DBG_SCAN (1 << 3) -#define WL_DBG_DBG (1 << 2) +#define WL_DBG_SCAN (1 << 3) +#define WL_DBG_DBG (1 << 2) #define WL_DBG_INFO (1 << 1) #define WL_DBG_ERR (1 << 0) /* 0 invalidates all debug messages. default is 1 */ #define WL_DBG_LEVEL 0xFF -#if defined(DHD_DEBUG) #define WL_ERR(args) \ do { \ if (wl_dbg_level & WL_DBG_ERR) { \ printk(KERN_INFO "CFG80211-INFO2) %s : ", __func__); \ printk args; \ - } \ -} while (0) -#else /* defined(DHD_DEBUG) */ -#define WL_ERR(args) \ -do { \ - if ((wl_dbg_level & WL_DBG_ERR) && net_ratelimit()) { \ - printk(KERN_INFO "CFG80211-INFO2) %s : ", __func__); \ - printk args; \ - } \ + } \ } while (0) -#endif /* defined(DHD_DEBUG) */ - #ifdef WL_INFO #undef WL_INFO #endif @@ -110,20 +99,6 @@ do { \ printk args; \ } \ } while (0) -#ifdef WL_TRACE_HW4 -#undef WL_TRACE_HW4 -#endif -#ifdef CUSTOMER_HW4 -#define WL_TRACE_HW4(args) \ -do { \ - if (wl_dbg_level & WL_DBG_ERR) { \ - printk(KERN_INFO "CFG80211-TRACE) %s : ", __func__); \ - printk args; \ - } \ -} while (0) -#else -#define WL_TRACE_HW4 WL_TRACE -#endif /* CUSTOMER_HW4 */ #if (WL_DBG_LEVEL > 0) #define WL_DBG(args) \ do { \ @@ -137,10 +112,22 @@ do { \ #endif /* (WL_DBG_LEVEL > 0) */ +#if (WL_DBG_LEVEL > 0) +#define WL_SCAN2(args) \ +do { \ + if (wl_dbg_level & WL_DBG_SCAN2) { \ + printk(KERN_DEBUG "CFG80211-SCAN) %s :", __func__); \ + printk args; \ + } \ +} while (0) +#else /* !(WL_DBG_LEVEL > 0) */ +#define WL_DBG(args) +#endif /* (WL_DBG_LEVEL > 0) */ + #define WL_SCAN_RETRY_MAX 3 #define WL_NUM_PMKIDS_MAX MAXPMKID -#define WL_SCAN_BUF_MAX (1024 * 8) -#define WL_TLV_INFO_MAX 1500 +#define WL_SCAN_BUF_MAX (1024 * 8) +#define WL_TLV_INFO_MAX 1500 /* customer want to large size IE, so increase ie length */ #define WL_SCAN_IE_LEN_MAX 2048 #define WL_BSS_INFO_MAX 2048 #define WL_ASSOC_INFO_MAX 512 @@ -148,26 +135,18 @@ do { \ #define WL_EXTRA_BUF_MAX 2048 #define WL_ISCAN_BUF_MAX 2048 #define WL_ISCAN_TIMER_INTERVAL_MS 3000 -#define WL_SCAN_ERSULTS_LAST (WL_SCAN_RESULTS_NO_MEM+1) +#define WL_SCAN_ERSULTS_LAST (WL_SCAN_RESULTS_NO_MEM+1) #define WL_AP_MAX 256 #define WL_FILE_NAME_MAX 256 -#define WL_DWELL_TIME 200 +#define WL_DWELL_TIME 200 #define WL_MED_DWELL_TIME 400 -#define WL_MIN_DWELL_TIME 100 -#define WL_LONG_DWELL_TIME 1000 -#define IFACE_MAX_CNT 2 -#define WL_SCAN_CONNECT_DWELL_TIME_MS 200 -#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20 -#define WL_AF_TX_MAX_RETRY 5 +#define WL_LONG_DWELL_TIME 1000 +#define IFACE_MAX_CNT 2 +#define WL_SCAN_CONNECT_DWELL_TIME_MS 100 #define WL_SCAN_TIMER_INTERVAL_MS 8000 /* Scan timeout */ -#define WL_CHANNEL_SYNC_RETRY 5 -#define WL_INVALID -1 - -/* Bring down SCB Timeout to 20secs from 60secs default */ -#ifndef WL_SCB_TIMEOUT -#define WL_SCB_TIMEOUT 20 -#endif +#define WL_CHANNEL_SYNC_RETRY 5 +#define WL_INVALID -1 /* driver status */ enum wl_status { @@ -179,33 +158,25 @@ enum wl_status { WL_STATUS_DISCONNECTING, WL_STATUS_AP_CREATING, WL_STATUS_AP_CREATED, - /* whole sending action frame procedure: - * includes a) 'finding common channel' for public action request frame - * and b) 'sending af via 'actframe' iovar' - */ - WL_STATUS_SENDING_ACT_FRM, - /* find a peer to go to a common channel before sending public action req frame */ - WL_STATUS_FINDING_COMMON_CHANNEL, - /* waiting for next af to sync time of supplicant. - * it includes SENDING_ACT_FRM and WAITING_NEXT_ACT_FRM_LISTEN - */ - WL_STATUS_WAITING_NEXT_ACT_FRM, -#ifdef WL_CFG80211_SYNC_GON - /* go to listen state to wait for next af after SENDING_ACT_FRM */ - WL_STATUS_WAITING_NEXT_ACT_FRM_LISTEN, -#endif /* WL_CFG80211_SYNC_GON */ + WL_STATUS_SENDING_ACT_FRM, /* includes scanning peer chan and sending af via "actframe" */ + WL_STATUS_SCANNING_PEER_CHANNEL, /* scanning peer chan for searching peer's channel */ /* it will be set when upper layer requests listen and succeed in setting listen mode. - * if set, other scan request can abort current listen state - */ + * if set, other scan request can abort current listen state */ WL_STATUS_REMAINING_ON_CHANNEL, #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - /* it's fake listen state to keep current scan state. - * it will be set when upper layer requests listen but scan is running. then just run - * a expire timer without actual listen state. - * if set, other scan request does not need to abort scan. - */ - WL_STATUS_FAKE_REMAINING_ON_CHANNEL + /* it will be set when upper layer requests listen but scan is running. + * it's fake listen state to keep current scan process. + * if set, other scan request will not abort scan. */ + WL_STATUS_FAKE_REMAINING_ON_CHANNEL, #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ +#ifdef WL_CFG80211_SYNC_GON_TIME + /* waiting for next af to sync time of supplicant. + * it includes SENDING_ACT_FRM and WAITING_MORE_TIME_NEXT_ACT_FRM + */ + WL_STATUS_WAITING_NEXT_ACT_FRM, + /* go to listen state to wait for next af after SENDING_ACT_FRM */ + WL_STATUS_WAITING_MORE_TIME_NEXT_ACT_FRM +#endif /* WL_CFG80211_SYNC_GON_TIME */ }; /* wi-fi mode */ @@ -337,7 +308,6 @@ struct net_info { struct wireless_dev *wdev; struct wl_profile profile; s32 mode; - s32 roam_off; unsigned long sme_state; bool pm_block; struct list_head list; /* list of all net_info structure */ @@ -394,33 +364,16 @@ struct wl_pmk_list { struct escan_info { u32 escan_state; -#if defined(STATIC_WL_PRIV_STRUCT) -#ifndef CONFIG_DHD_USE_STATIC_BUF -#error STATIC_WL_PRIV_STRUCT should be used with CONFIG_DHD_USE_STATIC_BUF -#endif -#if defined(DUAL_ESCAN_RESULT_BUFFER) u8 *escan_buf[2]; -#else - u8 *escan_buf; -#endif -#else -#if defined(DUAL_ESCAN_RESULT_BUFFER) - u8 escan_buf[2][ESCAN_BUF_SIZE]; -#else - u8 escan_buf[ESCAN_BUF_SIZE]; -#endif -#endif /* STATIC_WL_PRIV_STRUCT */ -#if defined(DUAL_ESCAN_RESULT_BUFFER) u8 cur_sync_id; -#endif struct wiphy *wiphy; struct net_device *ndev; }; struct ap_info { /* Structure to hold WPS, WPA IEs for a AP */ - u8 probe_res_ie[VNDR_IES_MAX_BUF_LEN]; - u8 beacon_ie[VNDR_IES_MAX_BUF_LEN]; + u8 probe_res_ie[IE_MAX_LEN]; + u8 beacon_ie[IE_MAX_LEN]; u32 probe_res_ie_len; u32 beacon_ie_len; u8 *wpa_ie; @@ -444,8 +397,8 @@ struct btcoex_info { struct sta_info { /* Structure to hold WPS IE for a STA */ - u8 probe_req_ie[VNDR_IES_BUF_LEN]; - u8 assoc_req_ie[VNDR_IES_BUF_LEN]; + u8 probe_req_ie[IE_MAX_LEN]; + u8 assoc_req_ie[IE_MAX_LEN]; u32 probe_req_ie_len; u32 assoc_req_ie_len; }; @@ -458,27 +411,13 @@ struct afx_hdl { u32 bssidx; u32 retry; s32 peer_chan; - s32 peer_listen_chan; /* search channel: configured by upper layer */ - s32 my_listen_chan; /* listen chanel: extract it from prb req or gon req */ + s32 peer_listen_chan; /* configured by upper layer */ + s32 my_listen_chan; /* my listen channel in GON Req frame */ bool is_listen; bool ack_recv; bool is_active; }; -struct parsed_ies { - wpa_ie_fixed_t *wps_ie; - u32 wps_ie_len; - wpa_ie_fixed_t *wpa_ie; - u32 wpa_ie_len; - bcm_tlv_t *wpa2_ie; - u32 wpa2_ie_len; -}; - -#ifdef WL11U -/* Max length of Interworking element */ -#define IW_IES_MAX_BUF_LEN 9 -#endif - /* private data of cfg80211 interface */ struct wl_priv { struct wireless_dev *wdev; /* representing wl cfg80211 device */ @@ -495,7 +434,9 @@ struct wl_priv { spinlock_t cfgdrv_lock; /* to protect scan status (and others if needed) */ struct completion act_frm_scan; struct completion iface_disable; +#ifdef WL_CFG80211_SYNC_GON_TIME struct completion wait_next_af; +#endif /* WL_CFG80211_SYNC_GON_TIME */ struct mutex usr_sync; /* maily for up/down synchronization */ struct wl_scan_results *bss_list; struct wl_scan_results *scan_results; @@ -503,31 +444,25 @@ struct wl_priv { /* scan request object for internal purpose */ struct wl_scan_req *scan_req_int; /* information element object for internal purpose */ -#if defined(STATIC_WL_PRIV_STRUCT) struct wl_ie *ie; -#else - struct wl_ie ie; -#endif struct wl_iscan_ctrl *iscan; /* iscan controller */ /* association information container */ -#if defined(STATIC_WL_PRIV_STRUCT) struct wl_connect_info *conn_info; -#else - struct wl_connect_info conn_info; -#endif struct wl_pmk_list *pmk_list; /* wpa2 pmk list */ - tsk_ctl_t event_tsk; /* task of main event handler thread */ + tsk_ctl_t event_tsk; /* task of main event handler thread */ void *pub; u32 iface_cnt; u32 channel; /* current channel */ +#ifdef WL_CFG80211_SYNC_GON_TIME u32 af_sent_channel; /* channel action frame is sent */ - /* next af subtype to cancel the remained dwell time in rx process */ - u8 next_af_subtype; -#ifdef WL_CFG80211_SYNC_GON - ulong af_tx_sent_jiffies; -#endif /* WL_CFG80211_SYNC_GON */ + /* save the next gon af subtype when it needs to wait more time for next gon af + * default value is 0xff (-1) + */ + u8 next_gon_af_subtype; + ulong saved_jiffies; /* the time to send af via "actframe" iovar */ +#endif /* WL_CFG80211_SYNC_GON_TIME */ bool iscan_on; /* iscan on/off switch */ bool iscan_kickstart; /* indicate iscan already started */ bool escan_on; /* escan on/off switch */ @@ -542,7 +477,6 @@ struct wl_priv { bool scan_tried; /* indicates if first scan attempted */ bool wlfc_on; bool vsdb_mode; - bool roamoff_on_concurrent; u8 *ioctl_buf; /* ioctl buffer */ struct mutex ioctl_buf_sync; u8 *escan_ioctl_buf; @@ -563,19 +497,13 @@ struct wl_priv { bool p2p_supported; struct btcoex_info *btcoex_info; struct timer_list scan_timeout; /* Timer for catch scan event timeout */ + bool first_remain; #ifdef WL_CFG80211_GON_COLLISION u8 block_gon_req_tx_count; u8 block_gon_req_rx_count; #endif /* WL_CFG80211_GON_COLLISION */ - s32(*state_notifier) (struct wl_priv *wl, - struct net_info *_net_info, enum wl_status state, bool set); + s32 (*state_notifier) (struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set); unsigned long interrested_state; - wlc_ssid_t hostapd_ssid; -#ifdef WL11U - bool wl11u; - u8 iw_ie[IW_IES_MAX_BUF_LEN]; - u32 iw_ie_len; -#endif /* WL11U */ }; @@ -600,7 +528,6 @@ wl_alloc_netinfo(struct wl_priv *wl, struct net_device *ndev, _net_info->ndev = ndev; _net_info->wdev = wdev; _net_info->pm_block = pm_block; - _net_info->roam_off = WL_INVALID; wl->iface_cnt++; list_add(&_net_info->list, &wl->net_list); } @@ -650,6 +577,7 @@ wl_get_status_all(struct wl_priv *wl, s32 status) } return cnt; } + static inline void wl_set_status_all(struct wl_priv *wl, s32 status, u32 op) { @@ -660,38 +588,74 @@ wl_set_status_all(struct wl_priv *wl, s32 status, u32 op) return; /* set all status is not allowed */ case 2: clear_bit(status, &_net_info->sme_state); - if (wl->state_notifier && - test_bit(status, &(wl->interrested_state))) + if (wl->state_notifier && test_bit(status, &(wl->interrested_state))) wl->state_notifier(wl, _net_info, status, false); break; case 4: return; /* change all status is not allowed */ default: - return; /* unknown operation */ + return; /*unknown operation */ } } } +#define wl_set_status_by_netdev(wl, status, _ndev, op) \ +{ \ + struct net_info *_net_info, *next;\ + int found = 0;\ + list_for_each_entry_safe(_net_info, next, &(wl)->net_list, list) {\ + if(_ndev && ((_net_info->ndev) == _ndev)) {\ + found = 1;\ + switch(op){\ + case 1:\ + set_bit(status, &(_net_info->sme_state));\ + if (wl->state_notifier && test_bit(status, &(wl->interrested_state))) \ + wl->state_notifier(wl, _net_info, status, true); \ + if(status == WL_STATUS_SCANNING)\ + WL_SCAN2(("<<<Set SCANNING bit %p>>>\n", _ndev));\ + break;\ + case 2:\ + clear_bit(status, &(_net_info->sme_state));\ + if (wl->state_notifier && test_bit(status, &(wl->interrested_state))) \ + wl->state_notifier(wl, _net_info, status, false); \ + if(status == WL_STATUS_SCANNING)\ + WL_SCAN2(("<<<Clear SCANNING bit %p>>>\n", _ndev));\ + break;\ + case 4:\ + change_bit(status, &(_net_info->sme_state));\ + break;\ + }\ + }\ + }\ + if(found == 0)\ + WL_ERR(("<<<Set Status command with not eixst device %p>>>\n", _ndev));\ +} + +#if 0 static inline void wl_set_status_by_netdev(struct wl_priv *wl, s32 status, struct net_device *ndev, u32 op) { struct net_info *_net_info, *next; + int found = 0; list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { if (ndev && (_net_info->ndev == ndev)) { + found = 1; switch (op) { case 1: set_bit(status, &_net_info->sme_state); - if (wl->state_notifier && - test_bit(status, &(wl->interrested_state))) - wl->state_notifier(wl, _net_info, status, true); +#if (WL_DBG_LEVEL > 0) + if(status == WL_STATUS_SCANNING ) + WL_SCAN2(("<<<Set SCANNING bit %p >>>\n", ndev)); +#endif break; case 2: clear_bit(status, &_net_info->sme_state); - if (wl->state_notifier && - test_bit(status, &(wl->interrested_state))) - wl->state_notifier(wl, _net_info, status, false); +#if (WL_DBG_LEVEL > 0) + if(status == WL_STATUS_SCANNING ) + WL_SCAN2(("<<<Clear SCANNING bit %p >>>\n", ndev)); +#endif break; case 4: change_bit(status, &_net_info->sme_state); @@ -700,9 +664,11 @@ wl_set_status_by_netdev(struct wl_priv *wl, s32 status, } } + if(found ==0 ) + WL_ERR(("<<Set Status command with not exist device %p>>\n", ndev)); } - +#endif static inline u32 wl_get_status_by_netdev(struct wl_priv *wl, s32 status, struct net_device *ndev) @@ -755,7 +721,6 @@ static inline struct net_info * wl_get_netinfo_by_netdev(struct wl_priv *wl, struct net_device *ndev) { struct net_info *_net_info, *next; - list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { if (ndev && (_net_info->ndev == ndev)) return _net_info; @@ -766,15 +731,10 @@ wl_get_netinfo_by_netdev(struct wl_priv *wl, struct net_device *ndev) #define wl_to_prmry_ndev(w) (w->wdev->netdev) #define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr)) #define wl_to_sr(w) (w->scan_req_int) -#if defined(STATIC_WL_PRIV_STRUCT) #define wl_to_ie(w) (w->ie) -#define wl_to_conn(w) (w->conn_info) -#else -#define wl_to_ie(w) (&w->ie) -#define wl_to_conn(w) (&w->conn_info) -#endif #define iscan_to_wl(i) ((struct wl_priv *)(i->data)) #define wl_to_iscan(w) (w->iscan) +#define wl_to_conn(w) (w->conn_info) #define wiphy_from_scan(w) (w->escan_info.wiphy) #define wl_get_drv_status_all(wl, stat) \ (wl_get_status_all(wl, WL_STATUS_ ## stat)) @@ -817,7 +777,7 @@ extern s32 wl_cfg80211_down(void *para); extern s32 wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, void* _net_attach); extern s32 wl_cfg80211_ifdel_ops(struct net_device *net); -extern s32 wl_cfg80211_notify_ifdel(void); +extern s32 wl_cfg80211_notify_ifdel(struct net_device *ndev); extern s32 wl_cfg80211_is_progress_ifadd(void); extern s32 wl_cfg80211_is_progress_ifchange(void); extern s32 wl_cfg80211_is_progress_ifadd(void); @@ -834,8 +794,9 @@ extern s32 wl_mode_to_nl80211_iftype(s32 mode); int wl_cfg80211_do_driver_init(struct net_device *net); void wl_cfg80211_enable_trace(int level); extern s32 wl_update_wiphybands(struct wl_priv *wl); +/* do scan abort */ +extern s32 wl_cfg80211_scan_abort(struct wl_priv *wl, struct net_device *ndev); + extern s32 wl_cfg80211_if_is_group_owner(void); -extern chanspec_t wl_ch_host_to_driver(u16 channel); extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add); -extern void wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev); #endif /* _wl_cfg80211_h_ */ diff --git a/drivers/net/wireless/bcmdhd/wl_cfgp2p.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.c index 483e129..9071637 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.c @@ -2,13 +2,13 @@ * Linux cfgp2p driver * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.c 354184 2012-08-30 08:08:08Z $ + * $Id: wl_cfgp2p.c 308397 2012-01-15 07:32:58Z $ * */ #include <typedefs.h> @@ -35,13 +35,17 @@ #include <linux/string.h> #include <linux/timer.h> #include <linux/if_arp.h> +#include <linux/random.h> #include <asm/uaccess.h> #include <bcmutils.h> #include <bcmendian.h> #include <proto/ethernet.h> -#include <proto/802.11.h> - +#include <dngl_stats.h> +#include <dhd.h> +#include <dhdioctl.h> +#include <wlioctl.h> +#include <dhd_cfg80211.h> #include <wl_cfg80211.h> #include <wl_cfgp2p.h> #include <wldev_common.h> @@ -49,6 +53,7 @@ static s8 scanparambuf[WLC_IOCTL_SMLEN]; static s8 g_mgmt_ie_buf[2048]; +extern struct wl_priv *wlcfg_drv_priv; static bool wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u8 type); @@ -60,8 +65,6 @@ static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev); static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd); static int wl_cfgp2p_if_open(struct net_device *net); static int wl_cfgp2p_if_stop(struct net_device *net); -static s32 wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, - bool notify); static const struct net_device_ops wl_cfgp2p_if_ops = { .ndo_open = wl_cfgp2p_if_open, @@ -108,46 +111,6 @@ bool wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len) return false; } - -/* -* Currently Action frame just pass to P2P interface regardless real dst. -* but GAS Action can be used for Hotspot2.0 as well -* Need to distingush that it's for P2P or HS20 -*/ -#ifdef WL11U -#define GAS_RESP_LEN 2 -#define DOUBLE_TLV_BODY_OFF 4 -#define GAS_RESP_OFFSET 4 -#define GAS_CRESP_OFFSET 5 - -bool wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len) -{ - bcm_tlv_t *ie = (bcm_tlv_t *)data; - u8 *frame = NULL; - u16 id, flen; - - /* Skipped first ANQP Element, if frame has anqp elemnt */ - ie = bcm_parse_tlvs(ie, (int)len, DOT11_MNG_ADVERTISEMENT_ID); - - if (ie == NULL) - return false; - - frame = (uint8 *)ie + ie->len + TLV_HDR_LEN + GAS_RESP_LEN; - id = ((u16) (((frame)[1] << 8) | (frame)[0])); - flen = ((u16) (((frame)[3] << 8) | (frame)[2])); - - /* If the contents match the OUI and the type */ - if (flen >= WFA_OUI_LEN + 1 && - id == P2PSD_GAS_NQP_INFOID && - !bcmp(&frame[DOUBLE_TLV_BODY_OFF], (const uint8*)WFA_OUI, WFA_OUI_LEN) && - subtype == frame[DOUBLE_TLV_BODY_OFF+WFA_OUI_LEN]) { - return true; - } - - return false; -} -#endif /* WL11U */ - bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) { @@ -162,22 +125,6 @@ bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) if (sd_act_frm->category != P2PSD_ACTION_CATEGORY) return false; -#ifdef WL11U - if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IRESP) - return wl_cfgp2p_find_gas_subtype(P2PSD_GAS_OUI_SUBTYPE, - (u8 *)sd_act_frm->query_data + GAS_RESP_OFFSET, - frame_len); - - else if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_CRESP) - return wl_cfgp2p_find_gas_subtype(P2PSD_GAS_OUI_SUBTYPE, - (u8 *)sd_act_frm->query_data + GAS_CRESP_OFFSET, - frame_len); - else if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IREQ || - sd_act_frm->action == P2PSD_ACTION_ID_GAS_CREQ) - return true; - else - return false; -#else if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IREQ || sd_act_frm->action == P2PSD_ACTION_ID_GAS_IRESP || sd_act_frm->action == P2PSD_ACTION_ID_GAS_CREQ || @@ -185,57 +132,57 @@ bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) return true; else return false; -#endif /* WLC11U */ + } void wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len) { wifi_p2p_pub_act_frame_t *pact_frm; wifi_p2p_action_frame_t *act_frm; wifi_p2psd_gas_pub_act_frame_t *sd_act_frm; - if (!frame || frame_len <= 2) + if(!frame || frame_len <= 2) return; if (wl_cfgp2p_is_pub_action(frame, frame_len)) { pact_frm = (wifi_p2p_pub_act_frame_t *)frame; - switch (pact_frm->subtype) { + switch(pact_frm->subtype) { case P2P_PAF_GON_REQ: - CFGP2P_ACTION(("%s P2P Group Owner Negotiation Req Frame\n", + CFGP2P_ERR(("%s P2P Group Owner Negotiation Req Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_GON_RSP: - CFGP2P_ACTION(("%s P2P Group Owner Negotiation Rsp Frame\n", + CFGP2P_ERR(("%s P2P Group Owner Negotiation Rsp Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_GON_CONF: - CFGP2P_ACTION(("%s P2P Group Owner Negotiation Confirm Frame\n", + CFGP2P_ERR(("%s P2P Group Owner Negotiation Confirm Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_INVITE_REQ: - CFGP2P_ACTION(("%s P2P Invitation Request Frame\n", + CFGP2P_ERR(("%s P2P Invitation Request Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_INVITE_RSP: - CFGP2P_ACTION(("%s P2P Invitation Response Frame\n", + CFGP2P_ERR(("%s P2P Invitation Response Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_DEVDIS_REQ: - CFGP2P_ACTION(("%s P2P Device Discoverability Request Frame\n", + CFGP2P_ERR(("%s P2P Device Discoverability Request Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_DEVDIS_RSP: - CFGP2P_ACTION(("%s P2P Device Discoverability Response Frame\n", + CFGP2P_ERR(("%s P2P Device Discoverability Response Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_PROVDIS_REQ: - CFGP2P_ACTION(("%s P2P Provision Discovery Request Frame\n", + CFGP2P_ERR(("%s P2P Provision Discovery Request Frame\n", (tx)? "TX": "RX")); break; case P2P_PAF_PROVDIS_RSP: - CFGP2P_ACTION(("%s P2P Provision Discovery Response Frame\n", + CFGP2P_ERR(("%s P2P Provision Discovery Response Frame\n", (tx)? "TX": "RX")); break; default: - CFGP2P_ACTION(("%s Unknown P2P Public Action Frame\n", + CFGP2P_ERR(("%s Unknown P2P Public Action Frame\n", (tx)? "TX": "RX")); } @@ -244,52 +191,53 @@ void wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len) act_frm = (wifi_p2p_action_frame_t *)frame; switch (act_frm->subtype) { case P2P_AF_NOTICE_OF_ABSENCE: - CFGP2P_ACTION(("%s P2P Notice of Absence Frame\n", + CFGP2P_ERR(("%s P2P Notice of Absence Frame\n", (tx)? "TX": "RX")); break; case P2P_AF_PRESENCE_REQ: - CFGP2P_ACTION(("%s P2P Presence Request Frame\n", + CFGP2P_ERR(("%s P2P Presence Request Frame\n", (tx)? "TX": "RX")); break; case P2P_AF_PRESENCE_RSP: - CFGP2P_ACTION(("%s P2P Presence Response Frame\n", + CFGP2P_ERR(("%s P2P Presence Response Frame\n", (tx)? "TX": "RX")); break; case P2P_AF_GO_DISC_REQ: - CFGP2P_ACTION(("%s P2P Discoverability Request Frame\n", + CFGP2P_ERR(("%s P2P Discoverability Request Frame\n", (tx)? "TX": "RX")); break; default: - CFGP2P_ACTION(("%s Unknown P2P Action Frame\n", + CFGP2P_ERR(("%s Unknown P2P Action Frame\n", (tx)? "TX": "RX")); } } else if (wl_cfgp2p_is_gas_action(frame, frame_len)) { sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *)frame; - switch (sd_act_frm->action) { + switch(sd_act_frm->action) { case P2PSD_ACTION_ID_GAS_IREQ: - CFGP2P_ACTION(("%s P2P GAS Initial Request\n", + CFGP2P_ERR(("%s P2P GAS Initial Request\n", (tx)? "TX" : "RX")); break; case P2PSD_ACTION_ID_GAS_IRESP: - CFGP2P_ACTION(("%s P2P GAS Initial Response\n", + CFGP2P_ERR(("%s P2P GAS Initial Response\n", (tx)? "TX" : "RX")); break; case P2PSD_ACTION_ID_GAS_CREQ: - CFGP2P_ACTION(("%s P2P GAS Comback Request\n", + CFGP2P_ERR(("%s P2P GAS Comback Request\n", (tx)? "TX" : "RX")); break; case P2PSD_ACTION_ID_GAS_CRESP: - CFGP2P_ACTION(("%s P2P GAS Comback Response\n", + CFGP2P_ERR(("%s P2P GAS Comback Response\n", (tx)? "TX" : "RX")); break; default: - CFGP2P_ACTION(("%s Unknown P2P GAS Frame\n", + CFGP2P_ERR(("%s Unknown P2P GAS Frame\n", (tx)? "TX" : "RX")); } } + } /* @@ -332,6 +280,7 @@ wl_cfgp2p_init_priv(struct wl_priv *wl) wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = 0; wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION) = NULL; wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION) = 0; + spin_lock_init(&wl->p2p->timer_lock); return BCME_OK; } @@ -383,7 +332,7 @@ wl_cfgp2p_set_firm_p2p(struct wl_priv *wl) ret = wldev_iovar_setbuf_bsscfg(ndev, "p2p_da_override", &null_eth_addr, sizeof(null_eth_addr), wl->ioctl_buf, WLC_IOCTL_MAXLEN, 0, &wl->ioctl_buf_sync); if (ret && ret != BCME_UNSUPPORTED) { - CFGP2P_ERR(("failed to update device address ret %d\n", ret)); + CFGP2P_ERR(("failed to update device address\n")); } return ret; } @@ -401,15 +350,16 @@ wl_cfgp2p_ifadd(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, { wl_p2p_if_t ifreq; s32 err; - u32 scb_timeout = WL_SCB_TIMEOUT; + u32 scb_timeout=10; struct net_device *ndev = wl_to_prmry_ndev(wl); ifreq.type = if_type; ifreq.chspec = chspec; memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); - CFGP2P_DBG(("---wl p2p_ifadd "MACDBG" %s %u\n", - STR_TO_MACD(ifreq.addr.octet), + CFGP2P_INFO(("---wl p2p_ifadd %02x:%02x:%02x:%02x:%02x:%02x %s %u\n", + ifreq.addr.octet[0], ifreq.addr.octet[1], ifreq.addr.octet[2], + ifreq.addr.octet[3], ifreq.addr.octet[4], ifreq.addr.octet[5], (if_type == WL_P2P_IF_GO) ? "go" : "client", (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT)); @@ -423,6 +373,7 @@ wl_cfgp2p_ifadd(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, if (unlikely(err < 0)) printk("'wl scb_timeout' error %d\n", err); } + return err; } @@ -437,8 +388,9 @@ wl_cfgp2p_ifdisable(struct wl_priv *wl, struct ether_addr *mac) s32 ret; struct net_device *netdev = wl_to_prmry_ndev(wl); - CFGP2P_INFO(("------primary idx %d : wl p2p_ifdis "MACDBG"\n", - netdev->ifindex, STR_TO_MACD(mac->octet))); + CFGP2P_INFO(("------primary idx %d : wl p2p_ifdis %02x:%02x:%02x:%02x:%02x:%02x\n", + netdev->ifindex, mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5])); ret = wldev_iovar_setbuf(netdev, "p2p_ifdis", mac, sizeof(*mac), wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); if (unlikely(ret < 0)) { @@ -458,8 +410,9 @@ wl_cfgp2p_ifdel(struct wl_priv *wl, struct ether_addr *mac) s32 ret; struct net_device *netdev = wl_to_prmry_ndev(wl); - CFGP2P_INFO(("------primary idx %d : wl p2p_ifdel "MACDBG"\n", - netdev->ifindex, STR_TO_MACD(mac->octet))); + CFGP2P_INFO(("------primary idx %d : wl p2p_ifdel %02x:%02x:%02x:%02x:%02x:%02x\n", + netdev->ifindex, mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5])); ret = wldev_iovar_setbuf(netdev, "p2p_ifdel", mac, sizeof(*mac), wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); if (unlikely(ret < 0)) { @@ -479,17 +432,18 @@ wl_cfgp2p_ifchange(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, { wl_p2p_if_t ifreq; s32 err; - u32 scb_timeout = WL_SCB_TIMEOUT; - + u32 scb_timeout=10; struct net_device *netdev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); ifreq.type = if_type; ifreq.chspec = chspec; memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); - CFGP2P_INFO(("---wl p2p_ifchange "MACDBG" %s %u" - " chanspec 0x%04x\n", STR_TO_MACD(ifreq.addr.octet), - (if_type == WL_P2P_IF_GO) ? "go" : "client", + CFGP2P_INFO(("---wl p2p_ifchange %02x:%02x:%02x:%02x:%02x:%02x %s %u" + " chanspec 0x%04x\n", + ifreq.addr.octet[0], ifreq.addr.octet[1], ifreq.addr.octet[2], + ifreq.addr.octet[3], ifreq.addr.octet[4], ifreq.addr.octet[5], + (if_type == WL_P2P_IF_GO) ? "go" : "client", (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT, ifreq.chspec)); @@ -520,7 +474,9 @@ wl_cfgp2p_ifidx(struct wl_priv *wl, struct ether_addr *mac, s32 *index) u8 getbuf[64]; struct net_device *dev = wl_to_prmry_ndev(wl); - CFGP2P_INFO(("---wl p2p_if "MACDBG"\n", STR_TO_MACD(mac->octet))); + CFGP2P_INFO(("---wl p2p_if %02x:%02x:%02x:%02x:%02x:%02x\n", + mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5])); ret = wldev_iovar_getbuf_bsscfg(dev, "p2p_if", mac, sizeof(*mac), getbuf, sizeof(getbuf), wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_PRIMARY), NULL); @@ -565,7 +521,6 @@ wl_cfgp2p_set_p2p_mode(struct wl_priv *wl, u8 mode, u32 channel, u16 listen_ms, s32 ret; struct net_device *dev; CFGP2P_DBG(("enter\n")); - if (unlikely(bssidx == WL_INVALID || bssidx >= P2PAPI_BSSCFG_MAX)) { CFGP2P_ERR((" %d index out of range\n", bssidx)); return -1; @@ -579,7 +534,7 @@ wl_cfgp2p_set_p2p_mode(struct wl_priv *wl, u8 mode, u32 channel, u16 listen_ms, /* Put the WL driver into P2P Listen Mode to respond to P2P probe reqs */ discovery_mode.state = mode; - discovery_mode.chspec = wl_ch_host_to_driver(channel); + discovery_mode.chspec = CH20MHZ_CHSPEC(channel); discovery_mode.dwell = listen_ms; ret = wldev_iovar_setbuf_bsscfg(dev, "p2p_state", &discovery_mode, sizeof(discovery_mode), wl->ioctl_buf, WLC_IOCTL_MAXLEN, @@ -636,7 +591,7 @@ wl_cfgp2p_init_discovery(struct wl_priv *wl) /* Set the initial discovery state to SCAN */ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, - wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); + wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); if (unlikely(ret != 0)) { CFGP2P_ERR(("unable to set WL_P2P_DISC_ST_SCAN\n")); @@ -695,8 +650,6 @@ wl_cfgp2p_enable_discovery(struct wl_priv *wl, struct net_device *dev, const u8 *ie, u32 ie_len) { s32 ret = BCME_OK; - s32 bssidx = (wl_to_prmry_ndev(wl) == dev) ? - wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) : wl_cfgp2p_find_idx(wl, dev); if (wl_get_p2p_status(wl, DISCOVERY_ON)) { CFGP2P_INFO((" DISCOVERY is already initialized, we have nothing to do\n")); goto set_ie; @@ -721,15 +674,13 @@ wl_cfgp2p_enable_discovery(struct wl_priv *wl, struct net_device *dev, CFGP2P_ERR((" wsec error %d\n", ret)); } set_ie: - if (ie_len) { - ret = wl_cfgp2p_set_management_ie(wl, dev, - bssidx, - VNDR_IE_PRBREQ_FLAG, ie, ie_len); - - if (unlikely(ret < 0)) { - CFGP2P_ERR(("set probreq ie occurs error %d\n", ret)); - goto exit; - } + ret = wl_cfgp2p_set_management_ie(wl, dev, + wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE), + VNDR_IE_PRBREQ_FLAG, ie, ie_len); + + if (unlikely(ret < 0)) { + CFGP2P_ERR(("set probreq ie occurs error %d\n", ret)); + goto exit; } exit: return ret; @@ -796,6 +747,7 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, #define P2PAPI_SCAN_AF_SEARCH_DWELL_TIME_MS 100 struct net_device *pri_dev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY); + //wl_set_p2p_status(wl, SCANNING); /* Allocate scan params which need space for 3 channels and 0 ssids */ eparams_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_escan_params_t, params)) + @@ -825,15 +777,10 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, * we have to set ssid to P2P WILDCARD because * we just do broadcast scan unless setting SSID */ - strncpy(ssid.SSID, WL_P2P_WILDCARD_SSID, sizeof(ssid.SSID) - 1); - ssid.SSID[sizeof(ssid.SSID) - 1] = 0; + strcpy(ssid.SSID, WL_P2P_WILDCARD_SSID); ssid.SSID_len = htod32(WL_P2P_WILDCARD_SSID_LEN); wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, bssidx); } - else { - CFGP2P_ERR((" invalid search state %d\n", search_state)); - return -1; - } /* Fill in the P2P scan structure at the start of the iovar param block */ @@ -853,29 +800,18 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, eparams->params.home_time = htod32(P2PAPI_SCAN_HOME_TIME_MS); - /* SOCIAL_CHAN_CNT + 1 takes care of the Progressive scan supported by - * the supplicant - */ - if ((num_chans == SOCIAL_CHAN_CNT) || (num_chans == SOCIAL_CHAN_CNT + 1)) + if (num_chans == SOCIAL_CHAN_CNT) eparams->params.active_time = htod32(P2PAPI_SCAN_SOCIAL_DWELL_TIME_MS); else if (num_chans == AF_PEER_SEARCH_CNT) eparams->params.active_time = htod32(P2PAPI_SCAN_AF_SEARCH_DWELL_TIME_MS); + else if (num_chans == 1) + eparams->params.active_time = htod32(WL_SCAN_CONNECT_DWELL_TIME_MS); else if (wl_get_drv_status_all(wl, CONNECTED)) eparams->params.active_time = -1; else eparams->params.active_time = htod32(P2PAPI_SCAN_DWELL_TIME_MS); eparams->params.nprobes = htod32((eparams->params.active_time / P2PAPI_SCAN_NPROBS_TIME_MS)); - - /* Override scan params to find a peer for a connection */ - if (num_chans == 1) { - eparams->params.active_time = htod32(WL_SCAN_CONNECT_DWELL_TIME_MS); - eparams->params.nprobes = htod32(eparams->params.active_time / - WL_SCAN_JOIN_PROBE_INTERVAL_MS); - } - - if (eparams->params.nprobes <= 0) - eparams->params.nprobes = 1; CFGP2P_DBG(("nprobes # %d, active_time %d\n", eparams->params.nprobes, eparams->params.active_time)); eparams->params.passive_time = htod32(-1); @@ -883,15 +819,11 @@ wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, (num_chans & WL_SCAN_PARAMS_COUNT_MASK)); for (i = 0; i < num_chans; i++) { - eparams->params.channel_list[i] = wl_ch_host_to_driver(channels[i]); + eparams->params.channel_list[i] = htodchanspec(channels[i]); } eparams->version = htod32(ESCAN_REQ_VERSION); eparams->action = htod16(action); -#if defined(DUAL_ESCAN_RESULT_BUFFER) eparams->sync_id = wl->escan_info.cur_sync_id; -#else - eparams->sync_id = htod16(0x1234); -#endif CFGP2P_INFO(("SCAN CHANNELS : ")); for (i = 0; i < num_chans; i++) { @@ -924,13 +856,15 @@ wl_cfgp2p_act_frm_search(struct wl_priv *wl, struct net_device *ndev, u16 *default_chan_list = NULL; if (!p2p_is_on(wl) || ndev == NULL || bssidx == WL_INVALID) return -BCME_ERROR; - CFGP2P_ERR((" Enter\n")); + CFGP2P_DBG((" Enter\n")); if (bssidx == P2PAPI_BSSCFG_PRIMARY) bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); + if (channel) chan_cnt = AF_PEER_SEARCH_CNT; else chan_cnt = SOCIAL_CHAN_CNT; + default_chan_list = kzalloc(chan_cnt * sizeof(*default_chan_list), GFP_KERNEL); if (default_chan_list == NULL) { CFGP2P_ERR(("channel list allocation failed \n")); @@ -966,67 +900,14 @@ exit: #define wl_cfgp2p_is_p2p_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ (const uint8 *)WFA_OUI, WFA_OUI_LEN, WFA_OUI_TYPE_P2P) /* Check whether the given IE looks like WFA WFDisplay IE. */ -#define WFA_OUI_TYPE_WFD 0x0a /* WiFi Display OUI TYPE */ +#define WFA_OUI_TYPE_WFD 0x0a /* WiFi Display OUI TYPE */ #define wl_cfgp2p_is_wfd_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ (const uint8 *)WFA_OUI, WFA_OUI_LEN, WFA_OUI_TYPE_WFD) -static s32 -wl_cfgp2p_parse_vndr_ies(u8 *parse, u32 len, - struct parsed_vndr_ies *vndr_ies) -{ - s32 err = BCME_OK; - vndr_ie_t *vndrie; - bcm_tlv_t *ie; - struct parsed_vndr_ie_info *parsed_info; - u32 count = 0; - s32 remained_len; - - remained_len = (s32)len; - memset(vndr_ies, 0, sizeof(*vndr_ies)); - - WL_INFO(("---> len %d\n", len)); - ie = (bcm_tlv_t *) parse; - if (!bcm_valid_tlv(ie, remained_len)) - ie = NULL; - while (ie) { - if (count >= MAX_VNDR_IE_NUMBER) - break; - if (ie->id == DOT11_MNG_VS_ID) { - vndrie = (vndr_ie_t *) ie; - /* len should be bigger than OUI length + one data length at least */ - if (vndrie->len < (VNDR_IE_MIN_LEN + 1)) { - CFGP2P_ERR(("%s: invalid vndr ie. length is too small %d\n", - __FUNCTION__, vndrie->len)); - goto end; - } - /* if wpa or wme ie, do not add ie */ - if (!bcmp(vndrie->oui, (u8*)WPA_OUI, WPA_OUI_LEN) && - ((vndrie->data[0] == WPA_OUI_TYPE) || - (vndrie->data[0] == WME_OUI_TYPE))) { - CFGP2P_DBG(("Found WPA/WME oui. Do not add it\n")); - goto end; - } - - parsed_info = &vndr_ies->ie_info[count++]; - - /* save vndr ie information */ - parsed_info->ie_ptr = (char *)vndrie; - parsed_info->ie_len = (vndrie->len + TLV_HDR_LEN); - memcpy(&parsed_info->vndrie, vndrie, sizeof(vndr_ie_t)); - - vndr_ies->count = count; - - CFGP2P_DBG(("\t ** OUI %02x %02x %02x, type 0x%02x \n", - parsed_info->vndrie.oui[0], parsed_info->vndrie.oui[1], - parsed_info->vndrie.oui[2], parsed_info->vndrie.data[0])); - } -end: - ie = bcm_next_tlv(ie, &remained_len); - } - return err; -} - - +#define SAMSUNG_OUI "\x00\x00\xf0" +#define SAMSUNG_OUI_LEN 3 +#define wl_cfgp2p_is_customer_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ + (const uint8 *)SAMSUNG_OUI, 3, 0) /* Delete and Set a management vndr ie to firmware * Parameters: * @wl : wl_private data @@ -1043,26 +924,25 @@ s32 wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len) { + /* Vendor-specific Information Element ID */ +#define VNDR_SPEC_ELEMENT_ID 0xdd s32 ret = BCME_OK; + u32 pos; + u8 *ie_buf; u8 *curr_ie_buf = NULL; u8 *mgmt_ie_buf = NULL; u32 mgmt_ie_buf_len = 0; u32 *mgmt_ie_len = 0; u32 del_add_ie_buf_len = 0; u32 total_ie_buf_len = 0; - u32 parsed_ie_buf_len = 0; - struct parsed_vndr_ies old_vndr_ies; - struct parsed_vndr_ies new_vndr_ies; - s32 i; - u8 *ptr; - u32 remained_buf_len; - + u8 ie_id, ie_len; #define IE_TYPE(type, bsstype) (wl_to_p2p_bss_saved_ie(wl, bsstype).p2p_ ## type ## _ie) #define IE_TYPE_LEN(type, bsstype) (wl_to_p2p_bss_saved_ie(wl, bsstype).p2p_ ## type ## _ie_len) memset(g_mgmt_ie_buf, 0, sizeof(g_mgmt_ie_buf)); curr_ie_buf = g_mgmt_ie_buf; - CFGP2P_DBG((" bssidx %d, pktflag : 0x%02X\n", bssidx, pktflag)); - if (wl->p2p != NULL) { + if (p2p_is_on(wl) && bssidx != -1) { + if (bssidx == P2PAPI_BSSCFG_PRIMARY) + bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); switch (pktflag) { case VNDR_IE_PRBREQ_FLAG : mgmt_ie_buf = IE_TYPE(probe_req, bssidx); @@ -1114,7 +994,7 @@ wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bss return -1; } bssidx = 0; - } else if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_BSS) { + } else if (bssidx == -1 && wl_get_mode_by_netdev(wl, ndev) == WL_MODE_BSS) { switch (pktflag) { case VNDR_IE_PRBREQ_FLAG : mgmt_ie_buf = wl->sta_info->probe_req_ie; @@ -1142,104 +1022,66 @@ wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bss CFGP2P_ERR(("extra IE size too big\n")); ret = -ENOMEM; } else { - /* parse and save new vndr_ie in curr_ie_buff before comparing it */ - if (vndr_ie && vndr_ie_len && curr_ie_buf) { - ptr = curr_ie_buf; - - wl_cfgp2p_parse_vndr_ies((u8*)vndr_ie, - vndr_ie_len, &new_vndr_ies); - - for (i = 0; i < new_vndr_ies.count; i++) { - struct parsed_vndr_ie_info *vndrie_info = - &new_vndr_ies.ie_info[i]; - - memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr, - vndrie_info->ie_len); - parsed_ie_buf_len += vndrie_info->ie_len; - } - } - if (mgmt_ie_buf != NULL) { - if (parsed_ie_buf_len && (parsed_ie_buf_len == *mgmt_ie_len) && - (memcmp(mgmt_ie_buf, curr_ie_buf, parsed_ie_buf_len) == 0)) { + if (vndr_ie && vndr_ie_len && (vndr_ie_len == *mgmt_ie_len) && + (memcmp(mgmt_ie_buf, vndr_ie, vndr_ie_len) == 0)) { CFGP2P_INFO(("Previous mgmt IE is equals to current IE")); goto exit; } - - /* parse old vndr_ie */ - wl_cfgp2p_parse_vndr_ies(mgmt_ie_buf, *mgmt_ie_len, - &old_vndr_ies); - - /* make a command to delete old ie */ - for (i = 0; i < old_vndr_ies.count; i++) { - struct parsed_vndr_ie_info *vndrie_info = - &old_vndr_ies.ie_info[i]; - - CFGP2P_INFO(("DELETED ID : %d, Len: %d , OUI:%02x:%02x:%02x\n", - vndrie_info->vndrie.id, vndrie_info->vndrie.len, - vndrie_info->vndrie.oui[0], vndrie_info->vndrie.oui[1], - vndrie_info->vndrie.oui[2])); - - del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, - bssidx, pktflag, vndrie_info->vndrie.oui, - vndrie_info->vndrie.id, - vndrie_info->ie_ptr + VNDR_IE_FIXED_LEN, - vndrie_info->ie_len - VNDR_IE_FIXED_LEN, - "del"); - - curr_ie_buf += del_add_ie_buf_len; - total_ie_buf_len += del_add_ie_buf_len; + pos = 0; + ie_buf = (u8 *) mgmt_ie_buf; + while (pos < *mgmt_ie_len) { + ie_id = ie_buf[pos++]; + ie_len = ie_buf[pos++]; + if ((ie_id == DOT11_MNG_VS_ID) && + (wl_cfgp2p_is_wps_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_p2p_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_wfd_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_customer_ie(&ie_buf[pos-2], NULL, 0))) { + CFGP2P_INFO(("DELETED ID : %d, Len : %d , OUI :" + "%02x:%02x:%02x\n", ie_id, ie_len, ie_buf[pos], + ie_buf[pos+1], ie_buf[pos+2])); + del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, bssidx, pktflag, + ie_buf+pos, VNDR_SPEC_ELEMENT_ID, ie_buf+pos+3, + ie_len-3, "del"); + curr_ie_buf += del_add_ie_buf_len; + total_ie_buf_len += del_add_ie_buf_len; + } + pos += ie_len; } - } + } *mgmt_ie_len = 0; /* Add if there is any extra IE */ - if (mgmt_ie_buf && parsed_ie_buf_len) { - ptr = mgmt_ie_buf; - - remained_buf_len = mgmt_ie_buf_len; - - /* make a command to add new ie */ - for (i = 0; i < new_vndr_ies.count; i++) { - struct parsed_vndr_ie_info *vndrie_info = - &new_vndr_ies.ie_info[i]; - - CFGP2P_INFO(("ADDED ID : %d, Len: %d(%d), OUI:%02x:%02x:%02x\n", - vndrie_info->vndrie.id, vndrie_info->vndrie.len, - vndrie_info->ie_len - 2, - vndrie_info->vndrie.oui[0], vndrie_info->vndrie.oui[1], - vndrie_info->vndrie.oui[2])); - - del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, - bssidx, pktflag, vndrie_info->vndrie.oui, - vndrie_info->vndrie.id, - vndrie_info->ie_ptr + VNDR_IE_FIXED_LEN, - vndrie_info->ie_len - VNDR_IE_FIXED_LEN, - "add"); - - /* verify remained buf size before copy data */ - if ((remained_buf_len -= vndrie_info->ie_len) < 0) { - CFGP2P_ERR(("no space in mgmt_ie_buf: pktflag = %d, " - "found vndr ies # = %d(cur %d), remained len %d, " - "cur mgmt_ie_len %d, new ie len = %d\n", - pktflag, new_vndr_ies.count, i, remained_buf_len, - *mgmt_ie_len, vndrie_info->ie_len)); - break; + if (mgmt_ie_buf && vndr_ie && vndr_ie_len) { + /* save the current IE in wl struct */ + memcpy(mgmt_ie_buf, vndr_ie, vndr_ie_len); + *mgmt_ie_len = vndr_ie_len; + pos = 0; + ie_buf = (u8 *) vndr_ie; + while (pos < vndr_ie_len) { + ie_id = ie_buf[pos++]; + ie_len = ie_buf[pos++]; + if ((ie_id == DOT11_MNG_VS_ID) && + (wl_cfgp2p_is_wps_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_p2p_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_wfd_ie(&ie_buf[pos-2], NULL, 0) || + wl_cfgp2p_is_customer_ie(&ie_buf[pos-2], NULL, 0))) { + CFGP2P_INFO(("ADDED ID : %d, Len : %d , OUI :" + "%02x:%02x:%02x\n", ie_id, ie_len, ie_buf[pos], + ie_buf[pos+1], ie_buf[pos+2])); + del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, bssidx, pktflag, + ie_buf+pos, VNDR_SPEC_ELEMENT_ID, ie_buf+pos+3, + ie_len-3, "add"); + curr_ie_buf += del_add_ie_buf_len; + total_ie_buf_len += del_add_ie_buf_len; } - - /* save the parsed IE in wl struct */ - memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr, - vndrie_info->ie_len); - *mgmt_ie_len += vndrie_info->ie_len; - - curr_ie_buf += del_add_ie_buf_len; - total_ie_buf_len += del_add_ie_buf_len; + pos += ie_len; } } if (total_ie_buf_len) { - ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf, - total_ie_buf_len, wl->ioctl_buf, WLC_IOCTL_MAXLEN, - bssidx, &wl->ioctl_buf_sync); + ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf, total_ie_buf_len, + wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); if (ret) CFGP2P_ERR(("vndr ie set error : %d\n", ret)); } @@ -1287,8 +1129,15 @@ wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u { /* If the contents match the OUI and the type */ if (ie[TLV_LEN_OFF] >= oui_len + 1 && - !bcmp(&ie[TLV_BODY_OFF], oui, oui_len) && - type == ie[TLV_BODY_OFF + oui_len]) { + !bcmp(&ie[TLV_BODY_OFF], oui, oui_len) && + type != 0 && + type == ie[TLV_BODY_OFF + oui_len]) { + return TRUE; + } + + /* If the contents match the SAMSUNG OUI */ + if (ie[TLV_LEN_OFF] >= oui_len + 1 && + !bcmp(&ie[TLV_BODY_OFF], oui, oui_len)) { return TRUE; } @@ -1331,6 +1180,20 @@ wl_cfgp2p_find_wpsie(u8 *parse, u32 len) } wifi_p2p_ie_t * +wl_cfgp2p_find_customer_ie(u8 *parse, u32 *len) +{ + bcm_tlv_t *ie; + + while ((ie = bcm_parse_tlvs(parse, *((int*)len), DOT11_MNG_VS_ID))) { + if (wl_cfgp2p_has_ie((uint8 *) ie, &parse, len, + (const uint8 *)SAMSUNG_OUI, WFA_OUI_LEN, 0)) { + return (wifi_p2p_ie_t *)ie; + } + } + return NULL; +} + +wifi_p2p_ie_t * wl_cfgp2p_find_p2pie(u8 *parse, u32 len) { bcm_tlv_t *ie; @@ -1375,19 +1238,13 @@ wl_cfgp2p_vndr_ie(struct wl_priv *wl, u8 *iebuf, s32 bssidx, s32 pktflag, strncpy(hdr.cmd, add_del_cmd, VNDR_IE_CMD_LEN - 1); hdr.cmd[VNDR_IE_CMD_LEN - 1] = '\0'; - /* Set the IE count - the buffer contains only 1 IE */ + /* Buffer contains only 1 IE */ iecount = htod32(1); memcpy((void *)&hdr.vndr_ie_buffer.iecount, &iecount, sizeof(s32)); - - /* Copy packet flags that indicate which packets will contain this IE */ pktflag = htod32(pktflag); memcpy((void *)&hdr.vndr_ie_buffer.vndr_ie_list[0].pktflag, &pktflag, sizeof(u32)); - - /* Add the IE ID to the buffer */ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.id = ie_id; - - /* Add the IE length to the buffer */ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.len = (uint8) VNDR_IE_MIN_LEN + datalen; @@ -1399,7 +1256,6 @@ wl_cfgp2p_vndr_ie(struct wl_priv *wl, u8 *iebuf, s32 bssidx, s32 pktflag, /* Copy the aligned temporary vndr_ie buffer header to the IE buffer */ memcpy(iebuf, &hdr, sizeof(hdr) - 1); - /* Copy the IE data to the IE buffer */ data_offset = (u8*)&hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.data[0] - (u8*)&hdr; @@ -1439,6 +1295,33 @@ wl_cfgp2p_find_idx(struct wl_priv *wl, struct net_device *ndev) exit: return index; } +s32 wl_cfgp2p_p2p_listen_suspend(void) +{ + struct wl_priv *wl = wlcfg_drv_priv; + bool enable = true; + s32 ret = BCME_OK; + s32 bssidx = -1; + struct net_device *netdev = wl_to_prmry_ndev(wl); + CFGP2P_ERR(("enter\n")); + if (wl == NULL || wl->p2p == NULL || netdev == NULL) + goto exit; + if (wl_get_p2p_status(wl, DISCOVERY_ON) == 0) + goto exit; + if (!timer_pending(&wl->p2p->listen_timer)) + goto exit; + bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); + if (bssidx) { + if (wl_to_p2p_bss_saved_ie(wl, bssidx).p2p_probe_res_ie_len) + enable = false; + + if ((ret = wl_add_remove_eventmsg(netdev, WLC_E_P2P_PROBREQ_MSG, enable)) != BCME_OK) { + CFGP2P_ERR((" failed to %s WLC_E_P2P_PROPREQ_MSG\n", enable? "set":"unset" )); + } + + } +exit: + return ret; +} /* * Callback function for WLC_E_P2P_DISC_LISTEN_COMPLETE */ @@ -1447,55 +1330,50 @@ wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data) { s32 ret = BCME_OK; - struct net_device *netdev; - if (wl->p2p_net == ndev) { - netdev = wl_to_prmry_ndev(wl); - } else { - netdev = ndev; - } + struct net_device *netdev = wl_to_prmry_ndev(wl); CFGP2P_DBG((" Enter\n")); if (wl_get_p2p_status(wl, LISTEN_EXPIRED) == 0) { wl_set_p2p_status(wl, LISTEN_EXPIRED); if (timer_pending(&wl->p2p->listen_timer)) { + spin_lock_bh(&wl->p2p->timer_lock); del_timer_sync(&wl->p2p->listen_timer); + spin_unlock_bh(&wl->p2p->timer_lock); } if (wl->afx_hdl->is_listen == TRUE && - wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { + wl_get_drv_status_all(wl, SCANNING_PEER_CHANNEL)) { WL_DBG(("Listen DONE for action frame\n")); complete(&wl->act_frm_scan); } -#ifdef WL_CFG80211_SYNC_GON - else if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, netdev); +#ifdef WL_CFG80211_SYNC_GON_TIME + else if (wl_get_drv_status_all(wl, WAITING_MORE_TIME_NEXT_ACT_FRM)) { + wl_clr_drv_status(wl, WAITING_MORE_TIME_NEXT_ACT_FRM, ndev); WL_DBG(("Listen DONE and wake up wait_next_af !!(%d)\n", - jiffies_to_msecs(jiffies - wl->af_tx_sent_jiffies))); + jiffies_to_msecs(jiffies - wl->saved_jiffies))); if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) - wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, netdev); + wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ndev); complete(&wl->wait_next_af); } -#endif /* WL_CFG80211_SYNC_GON */ +#endif /* WL_CFG80211_SYNC_GON_TIME */ -#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL)) { -#else - if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL) || - wl_get_drv_status_all(wl, FAKE_REMAINING_ON_CHANNEL)) { + if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL) +#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST + || wl_get_drv_status_all(wl, FAKE_REMAINING_ON_CHANNEL) #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ + ) { WL_DBG(("Listen DONE for ramain on channel expired\n")); - wl_clr_drv_status(wl, REMAINING_ON_CHANNEL, netdev); + wl_clr_drv_status(wl, REMAINING_ON_CHANNEL, ndev); #ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST - wl_clr_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, netdev); + wl_clr_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ if (ndev && (ndev->ieee80211_ptr != NULL)) { cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, &wl->remain_on_chan, wl->remain_on_chan_type, GFP_KERNEL); } } - if (wl_add_remove_eventmsg(wl_to_prmry_ndev(wl), - WLC_E_P2P_PROBREQ_MSG, false) != BCME_OK) { + if (wl_add_remove_eventmsg(netdev, WLC_E_P2P_PROBREQ_MSG, false) != BCME_OK) { CFGP2P_ERR((" failed to unset WLC_E_P2P_PROPREQ_MSG\n")); } } else @@ -1515,38 +1393,12 @@ wl_cfgp2p_listen_expired(unsigned long data) { wl_event_msg_t msg; struct wl_priv *wl = (struct wl_priv *) data; + CFGP2P_DBG((" Enter\n")); - bzero(&msg, sizeof(wl_event_msg_t)); msg.event_type = hton32(WLC_E_P2P_DISC_LISTEN_COMPLETE); - wl_cfg80211_event(wl->p2p_net ? wl->p2p_net : - wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), &msg, NULL); -} -/* - * Routine for cancelling the P2P LISTEN - */ -static s32 -wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, - bool notify) -{ - WL_DBG(("Enter \n")); - /* Irrespective of whether timer is running or not, reset - * the LISTEN state. - */ -#ifdef NOT_YET - wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, - wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); -#endif /* NOT_YET */ - if (timer_pending(&wl->p2p->listen_timer)) { - del_timer_sync(&wl->p2p->listen_timer); - if (notify) - if (ndev && ndev->ieee80211_ptr) { - cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, - &wl->remain_on_chan, wl->remain_on_chan_type, - GFP_KERNEL); - } - } - return 0; + wl_cfg80211_event(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), &msg, NULL); } + /* * Do a P2P Listen on the given channel for the given duration. * A listen consists of sitting idle and responding to P2P probe requests @@ -1561,11 +1413,14 @@ wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, s32 wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms) { -#define EXTRA_DELAY_TIME 100 +#define EXTRA_DEAY_TIME 100 s32 ret = BCME_OK; struct timer_list *_timer; s32 extra_delay; struct net_device *netdev = wl_to_prmry_ndev(wl); + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); + bool enable = true; + s32 bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); CFGP2P_DBG((" Enter Listen Channel : %d, Duration : %d\n", channel, duration_ms)); if (unlikely(wl_get_p2p_status(wl, DISCOVERY_ON) == 0)) { @@ -1584,19 +1439,22 @@ wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms) else wl_clr_p2p_status(wl, LISTEN_EXPIRED); #endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ - if (wl_add_remove_eventmsg(netdev, WLC_E_P2P_PROBREQ_MSG, true) != BCME_OK) { - CFGP2P_ERR((" failed to set WLC_E_P2P_PROPREQ_MSG\n")); + if (wl_to_p2p_bss_saved_ie(wl, bssidx).p2p_probe_res_ie_len && dhd && dhd->in_suspend) { + /* Clear WLC_E_P2P_PROBREQ_MSG in case of early suspend and p2p ie != 0 */ + enable = false; } - ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_LISTEN, channel, (u16) duration_ms, - wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); + if (wl_add_remove_eventmsg(netdev, WLC_E_P2P_PROBREQ_MSG, enable) != BCME_OK) { + CFGP2P_ERR((" failed to set WLC_E_P2P_PROPREQ_MSG\n")); + } + ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_LISTEN, channel, (u16) duration_ms, bssidx); _timer = &wl->p2p->listen_timer; /* We will wait to receive WLC_E_P2P_DISC_LISTEN_COMPLETE from dongle , - * otherwise we will wait up to duration_ms + 100ms + duration / 10 + * otherwise we will wait up to duration_ms + 100ms + duration / 20 */ if (ret == BCME_OK) { - extra_delay = EXTRA_DELAY_TIME + (duration_ms / 10); + extra_delay = EXTRA_DEAY_TIME + (duration_ms / 10); } else { /* if failed to set listen, it doesn't need to wait whole duration. */ duration_ms = 100 + duration_ms / 20; @@ -1608,7 +1466,7 @@ wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms) wl_clr_p2p_status(wl, LISTEN_EXPIRED); #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ -#undef EXTRA_DELAY_TIME +#undef EXTRA_DEAY_TIME exit: return ret; } @@ -1662,8 +1520,7 @@ wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, } else { wl_set_p2p_status(wl, ACTION_TX_NOACK); - CFGP2P_INFO(("WLC_E_ACTION_FRAME_COMPLETE : NO ACK\n")); - wl_stop_wait_next_action_frame(wl, ndev); + CFGP2P_DBG(("WLC_E_ACTION_FRAME_COMPLETE : NO ACK\n")); } } else { CFGP2P_INFO((" WLC_E_ACTION_FRAME_OFFCHAN_COMPLETE is received," @@ -1700,10 +1557,10 @@ wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, if (bssidx == P2PAPI_BSSCFG_PRIMARY) bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); +#ifdef WL_CFG80211_SYNC_GON_TIME wl->af_sent_channel = af_params->channel; -#ifdef WL_CFG80211_SYNC_GON - wl->af_tx_sent_jiffies = jiffies; -#endif /* WL_CFG80211_SYNC_GON */ + wl->saved_jiffies = jiffies; +#endif /* WL_CFG80211_SYNC_GON_TIME */ ret = wldev_iovar_setbuf_bsscfg(dev, "actframe", af_params, sizeof(*af_params), wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); @@ -1874,7 +1731,7 @@ wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev) ret = wldev_iovar_getint(ndev, "p2p", &p2p_supported); if (ret < 0) { - CFGP2P_ERR(("wl p2p error %d\n", ret)); + CFGP2P_ERR(("wl p2p supported IOVAR = %d\n", ret)); return 0; } if (p2p_supported == 1) { @@ -1889,10 +1746,10 @@ wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev) s32 wl_cfgp2p_down(struct wl_priv *wl) { - - wl_cfgp2p_cancel_listen(wl, - wl->p2p_net ? wl->p2p_net : wl_to_prmry_ndev(wl), TRUE); - + if (wl->p2p == NULL) + return 0; + if (timer_pending(&wl->p2p->listen_timer)) + del_timer_sync(&wl->p2p->listen_timer); wl_cfgp2p_deinit_priv(wl); return 0; } @@ -1911,7 +1768,7 @@ wl_cfgp2p_set_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, in wl->p2p->noa.desc[0].start = 0; - sscanf(buf, "%10d %10d %10d", &count, &start, &duration); + sscanf(buf, "%d %d %d", &count, &start, &duration); CFGP2P_DBG(("set_p2p_noa count %d start %d duration %d\n", count, start, duration)); if (count != -1) @@ -2000,7 +1857,7 @@ wl_cfgp2p_get_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, in } /* We have to convert the buffer data into ASCII strings */ for (i = 0; i < len; i++) { - snprintf(buf, 3, "%02x", _buf[i]); + sprintf(buf, "%02x", _buf[i]); buf += 2; } buf[i*2] = '\0'; @@ -2021,7 +1878,7 @@ wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int CFGP2P_DBG((" Enter\n")); if (wl->p2p && wl->p2p->vif_created) { - sscanf(buf, "%10d %10d %10d", &legacy_ps, &ps, &ctw); + sscanf(buf, "%d %d %d", &legacy_ps, &ps, &ctw); CFGP2P_DBG((" Enter legacy_ps %d ps %d ctw %d\n", legacy_ps, ps, ctw)); if (ctw != -1) { wl->p2p->ops.ctw = ctw; @@ -2068,11 +1925,11 @@ wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id) return 0; } - ie = (wifi_p2p_ie_t*) buf; + ie = (wifi_p2p_ie_t *) buf; len = ie->len; /* Point subel to the P2P IE's subelt field. - * Subtract the preceding fields (id, len, OUI, oui_type) from the length. + * Subtract the preceding fields (id,len,OUI,oui_type) from the length. */ subel = ie->subelts; len -= 4; /* exclude OUI + OUI_TYPE */ @@ -2109,7 +1966,7 @@ wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id) u8 * wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length) { - wifi_p2p_ie_t * p2p_ie = NULL; + wifi_p2p_ie_t *p2p_ie = NULL; u8 *capability = NULL; bool p2p_go = 0; u8 *ptr = NULL; @@ -2144,19 +2001,6 @@ wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length) return ptr; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) -static void -wl_cfgp2p_ethtool_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) -{ - snprintf(info->driver, sizeof(info->driver), "p2p"); - snprintf(info->version, sizeof(info->version), "%lu", (unsigned long)(0)); -} - -struct ethtool_ops cfgp2p_ethtool_ops = { - .get_drvinfo = wl_cfgp2p_ethtool_get_drvinfo -}; -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ - s32 wl_cfgp2p_register_ndev(struct wl_priv *wl) { @@ -2166,16 +2010,16 @@ wl_cfgp2p_register_ndev(struct wl_priv *wl) uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x33, 0x22, 0x11 }; /* Allocate etherdev, including space for private structure */ - if (!(net = alloc_etherdev(sizeof(struct wl_priv *)))) { + if (!(net = alloc_etherdev(sizeof(wl)))) { CFGP2P_ERR(("%s: OOM - alloc_etherdev\n", __FUNCTION__)); goto fail; } - strncpy(net->name, "p2p%d", sizeof(net->name) - 1); + strcpy(net->name, "p2p%d"); net->name[IFNAMSIZ - 1] = '\0'; /* Copy the reference to wl_priv */ - memcpy((void *)netdev_priv(net), &wl, sizeof(struct wl_priv *)); + memcpy((void *)netdev_priv(net), &wl, sizeof(wl)); #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ASSERT(!net->open); @@ -2203,10 +2047,6 @@ wl_cfgp2p_register_ndev(struct wl_priv *wl) net->ieee80211_ptr = wdev; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) - net->ethtool_ops = &cfgp2p_ethtool_ops; -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ - SET_NETDEV_DEV(net, wiphy_dev(wdev->wiphy)); /* Associate p2p0 network interface with new wdev */ @@ -2230,8 +2070,6 @@ wl_cfgp2p_register_ndev(struct wl_priv *wl) } printk("%s: P2P Interface Registered\n", net->name); - wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO)); return ret; fail: @@ -2307,42 +2145,21 @@ static int wl_cfgp2p_if_open(struct net_device *net) */ wl_cfg80211_do_driver_init(net); -// wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) -// | BIT(NL80211_IFTYPE_P2P_GO)); + wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO)); return 0; } static int wl_cfgp2p_if_stop(struct net_device *net) { - extern struct wl_priv *wlcfg_drv_priv; - struct wl_priv *wl = NULL; - unsigned long flags; struct wireless_dev *wdev = net->ieee80211_ptr; - int clear_flag = 0; - if (!wdev) - return -EINVAL; - WL_TRACE(("Enter\n")); - wl = wlcfg_drv_priv; - if (!wl) + if (!wdev) return -EINVAL; - spin_lock_irqsave(&wl->cfgdrv_lock, flags); - if (wl->scan_request && wl->scan_request->dev == net) { - cfg80211_scan_done(wl->scan_request, true); - wl->scan_request = NULL; - clear_flag = 1; - } - spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); - if (clear_flag) - wl_clr_drv_status(wl, SCANNING, net); -// wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) -// & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| -// BIT(NL80211_IFTYPE_P2P_GO))); -#if defined(CUSTOMER_HW4) - if (net->flags & IFF_UP) - net->flags &= ~IFF_UP; -#endif + wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) + & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| + BIT(NL80211_IFTYPE_P2P_GO))); return 0; } diff --git a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.h index 808e576..348aeca 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_cfgp2p.h @@ -1,14 +1,14 @@ /* * Linux cfgp2p driver * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.h 354184 2012-08-30 08:08:08Z $ + * $Id: wl_cfgp2p.h 307885 2012-01-12 23:30:48Z $ */ #ifndef _wl_cfgp2p_h_ #define _wl_cfgp2p_h_ @@ -43,18 +43,15 @@ typedef enum { P2PAPI_BSSCFG_MAX } p2p_bsscfg_type_t; -/* vendor ies max buffer length for probe response or beacon */ -#define VNDR_IES_MAX_BUF_LEN 1400 -/* normal vendor ies buffer length */ -#define VNDR_IES_BUF_LEN 512 - +#define IE_MAX_LEN 300 +#define P2P_RES_MAX_LEN 1400 /* Structure to hold all saved P2P and WPS IEs for a BSSCFG */ struct p2p_saved_ie { - u8 p2p_probe_req_ie[VNDR_IES_BUF_LEN]; - u8 p2p_probe_res_ie[VNDR_IES_MAX_BUF_LEN]; - u8 p2p_assoc_req_ie[VNDR_IES_BUF_LEN]; - u8 p2p_assoc_res_ie[VNDR_IES_BUF_LEN]; - u8 p2p_beacon_ie[VNDR_IES_MAX_BUF_LEN]; + u8 p2p_probe_req_ie[IE_MAX_LEN]; + u8 p2p_probe_res_ie[P2P_RES_MAX_LEN]; + u8 p2p_assoc_req_ie[IE_MAX_LEN]; + u8 p2p_assoc_res_ie[IE_MAX_LEN]; + u8 p2p_beacon_ie[IE_MAX_LEN]; u32 p2p_probe_req_ie_len; u32 p2p_probe_res_ie_len; u32 p2p_assoc_req_ie_len; @@ -82,19 +79,7 @@ struct p2p_info { wl_p2p_sched_t noa; wl_p2p_ops_t ops; wlc_ssid_t ssid; -}; - -#define MAX_VNDR_IE_NUMBER 5 - -struct parsed_vndr_ie_info { - char *ie_ptr; - u32 ie_len; /* total length including id & length field */ - vndr_ie_t vndrie; -}; - -struct parsed_vndr_ies { - u32 count; - struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER]; + spinlock_t timer_lock; }; /* dongle status */ @@ -109,15 +94,14 @@ enum wl_cfgp2p_status { WLP2P_STATUS_LISTEN_EXPIRED, WLP2P_STATUS_ACTION_TX_COMPLETED, WLP2P_STATUS_ACTION_TX_NOACK, - WLP2P_STATUS_SCANNING, - WLP2P_STATUS_GO_NEG_PHASE + WLP2P_STATUS_SCANNING }; -#define wl_to_p2p_bss_ndev(w, type) ((wl)->p2p->bss_idx[type].dev) -#define wl_to_p2p_bss_bssidx(w, type) ((wl)->p2p->bss_idx[type].bssidx) -#define wl_to_p2p_bss_saved_ie(w, type) ((wl)->p2p->bss_idx[type].saved_ie) -#define wl_to_p2p_bss_private(w, type) ((wl)->p2p->bss_idx[type].private_data) +#define wl_to_p2p_bss_ndev(w, type) ((wl)->p2p->bss_idx[type].dev) +#define wl_to_p2p_bss_bssidx(w, type) ((wl)->p2p->bss_idx[type].bssidx) +#define wl_to_p2p_bss_saved_ie(w, type) ((wl)->p2p->bss_idx[type].saved_ie) +#define wl_to_p2p_bss_private(w, type) ((wl)->p2p->bss_idx[type].private_data) #define wl_to_p2p_bss(wl, type) ((wl)->p2p->bss_idx[type]) #define wl_get_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : test_bit(WLP2P_STATUS_ ## stat, \ &(wl)->p2p->status)) @@ -133,6 +117,8 @@ enum wl_cfgp2p_status { /* dword align allocation */ #define WLC_IOCTL_MAXLEN 8192 +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" #define CFGP2P_ERR(args) \ do { \ @@ -155,14 +141,6 @@ enum wl_cfgp2p_status { printk args; \ } \ } while (0) - -#define CFGP2P_ACTION(args) \ - do { \ - if (wl_dbg_level & WL_DBG_P2P_ACTION) { \ - printk(KERN_DEBUG "CFGP2P-ACTION) %s :", __func__); \ - printk args; \ - } \ - } while (0) #define INIT_TIMER(timer, func, duration, extra_delay) \ do { \ init_timer(timer); \ @@ -225,6 +203,9 @@ extern wpa_ie_fixed_t * wl_cfgp2p_find_wpsie(u8 *parse, u32 len); extern wifi_p2p_ie_t * +wl_cfgp2p_find_customer_ie(u8 *parse, u32 *len); + +extern wifi_p2p_ie_t * wl_cfgp2p_find_p2pie(u8 *parse, u32 len); extern wifi_wfd_ie_t * @@ -240,6 +221,8 @@ wl_cfgp2p_find_idx(struct wl_priv *wl, struct net_device *ndev); extern s32 +wl_cfgp2p_p2p_listen_suspend(void); +extern s32 wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data); extern s32 @@ -304,28 +287,20 @@ wl_cfgp2p_unregister_ndev(struct wl_priv *wl); #define WL_P2P_WILDCARD_SSID "DIRECT-" #define WL_P2P_WILDCARD_SSID_LEN 7 #define WL_P2P_INTERFACE_PREFIX "p2p" -#define WL_P2P_TEMP_CHAN 11 +#define WL_P2P_TEMP_CHAN "11" -/* If the provision discovery is for JOIN operations, - * then we need not do an internal scan to find GO. - */ -#define IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len) \ - (wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL) #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \ ((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \ (frame->action == P2PSD_ACTION_ID_GAS_CREQ))) -#define IS_P2P_PUB_ACT_REQ(frame, p2p_ie, len) \ - (wl_cfgp2p_is_pub_action(frame, len) && \ - ((frame->subtype == P2P_PAF_GON_REQ) || \ - (frame->subtype == P2P_PAF_INVITE_REQ) || \ - ((frame->subtype == P2P_PAF_PROVDIS_REQ) && \ - IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len)))) +#define IS_P2P_PUB_ACT_REQ(frame, len) (wl_cfgp2p_is_pub_action(frame, len) && \ + ((frame->subtype == P2P_PAF_GON_REQ) || \ + (frame->subtype == P2P_PAF_INVITE_REQ) || \ + (frame->subtype == P2P_PAF_PROVDIS_REQ))) #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \ ((subtype == P2P_PAF_GON_CONF) || \ (subtype == P2P_PAF_INVITE_RSP) || \ (subtype == P2P_PAF_PROVDIS_RSP))) #define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3)) -#define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \ - (len == WL_P2P_WILDCARD_SSID_LEN)) +#define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && (len == WL_P2P_WILDCARD_SSID_LEN)) #endif /* _wl_cfgp2p_h_ */ diff --git a/drivers/net/wireless/bcmdhd/wl_dbg.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_dbg.h index b5e7080..9347469 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_dbg.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_dbg.h @@ -2,14 +2,14 @@ * Minimal debug/trace/assert driver definitions for * Broadcom 802.11 Networking Adapter. * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,12 +17,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_dbg.h 326635 2012-04-10 03:15:29Z $ + * $Id: wl_dbg.h 307767 2012-01-12 15:38:01Z $ */ @@ -60,4 +60,4 @@ extern uint32 wl_msg_level2; extern uint32 wl_msg_level; extern uint32 wl_msg_level2; -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/wl_iw.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.c index 6855314..c25f173 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.c @@ -2,13 +2,13 @@ * Linux Wireless Extensions support * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_iw.c 352251 2012-08-22 06:08:38Z $ + * $Id: wl_iw.c 302026 2011-12-09 11:51:50Z $ */ #if defined(USE_IW) @@ -71,15 +71,15 @@ typedef const struct si_pub si_t; #ifndef IW_AUTH_KEY_MGMT_WAPI_CERT #define IW_AUTH_KEY_MGMT_WAPI_CERT 8 #endif -#endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) #include <linux/rtnetlink.h> #endif #if defined(SOFTAP) struct net_device *ap_net_dev = NULL; -tsk_ctl_t ap_eth_ctl; -#endif +tsk_ctl_t ap_eth_ctl; +#endif extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, char* stringBuf, uint buflen); @@ -102,21 +102,21 @@ extern int dhd_wait_pend8021x(struct net_device *dev); #if WIRELESS_EXT < 19 #define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) #define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) -#endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define DAEMONIZE(a) daemonize(a); \ allow_signal(SIGKILL); \ allow_signal(SIGTERM); -#else +#else #define RAISE_RX_SOFTIRQ() \ cpu_raise_softirq(smp_processor_id(), NET_RX_SOFTIRQ) #define DAEMONIZE(a) daemonize(); \ do { if (a) \ strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a) + 1))); \ } while (0); -#endif +#endif #define ISCAN_STATE_IDLE 0 #define ISCAN_STATE_SCANING 1 @@ -137,7 +137,7 @@ typedef struct iscan_info { iscan_buf_t * list_hdr; iscan_buf_t * list_cur; - + long sysioc_pid; struct semaphore sysioc_sem; struct completion sysioc_exited; @@ -213,7 +213,7 @@ dev_wlc_ioctl( ifr.ifr_data = (caddr_t) &ioc; #ifndef LINUX_HYBRID - + dev_open(dev); #endif @@ -260,7 +260,6 @@ dev_iw_iovar_setbuf( iolen = bcm_mkiovar(iovar, param, paramlen, bufptr, buflen); ASSERT(iolen); - BCM_REFERENCE(iolen); return (dev_wlc_ioctl(dev, WLC_SET_VAR, bufptr, iolen)); } @@ -278,7 +277,6 @@ dev_iw_iovar_getbuf( iolen = bcm_mkiovar(iovar, param, paramlen, bufptr, buflen); ASSERT(iolen); - BCM_REFERENCE(iolen); return (dev_wlc_ioctl(dev, WLC_GET_VAR, bufptr, buflen)); } @@ -305,7 +303,7 @@ dev_wlc_bufvar_set( kfree(ioctlbuf); return error; } -#endif +#endif @@ -364,13 +362,13 @@ dev_wlc_intvar_get( #if WIRELESS_EXT < 13 struct iw_request_info { - __u16 cmd; - __u16 flags; + __u16 cmd; + __u16 flags; }; typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info, void *wrqu, char *extra); -#endif +#endif #if WIRELESS_EXT > 12 static int @@ -419,7 +417,7 @@ wl_iw_set_pm( error = dev_wlc_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm)); return error; } -#endif +#endif int wl_iw_send_priv_event( @@ -535,14 +533,14 @@ wl_iw_set_freq( WL_TRACE(("%s: SIOCSIWFREQ\n", dev->name)); - + if (fwrq->e == 0 && fwrq->m < MAXCHANNEL) { chan = fwrq->m; } - + else { - + if (fwrq->e >= 6) { fwrq->e -= 6; while (fwrq->e--) @@ -551,9 +549,9 @@ wl_iw_set_freq( while (fwrq->e++ < 6) fwrq->m /= 10; } - + if (fwrq->m > 4000 && fwrq->m < 5000) - sf = WF_CHAN_FACTOR_4_G; + sf = WF_CHAN_FACTOR_4_G; chan = wf_mhz2channel(fwrq->m, sf); } @@ -561,7 +559,7 @@ wl_iw_set_freq( if ((error = dev_wlc_ioctl(dev, WLC_SET_CHANNEL, &chan, sizeof(chan)))) return error; - + return -EINPROGRESS; } @@ -581,7 +579,7 @@ wl_iw_get_freq( if ((error = dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci)))) return error; - + fwrq->m = dtoh32(ci.hw_channel); fwrq->e = dtoh32(0); return 0; @@ -619,7 +617,7 @@ wl_iw_set_mode( (error = dev_wlc_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap)))) return error; - + return -EINPROGRESS; } @@ -678,10 +676,10 @@ wl_iw_get_range( dwrq->length = sizeof(struct iw_range); memset(range, 0, sizeof(*range)); - + range->min_nwid = range->max_nwid = 0; - + list->count = htod32(MAXCHANNEL); if ((error = dev_wlc_ioctl(dev, WLC_GET_VALID_CHANNELS, channels, sizeof(channels)))) return error; @@ -699,31 +697,31 @@ wl_iw_get_range( } range->num_frequency = range->num_channels = i; - + range->max_qual.qual = 5; - - range->max_qual.level = 0x100 - 200; - - range->max_qual.noise = 0x100 - 200; - + + range->max_qual.level = 0x100 - 200; + + range->max_qual.noise = 0x100 - 200; + range->sensitivity = 65535; #if WIRELESS_EXT > 11 - + range->avg_qual.qual = 3; - + range->avg_qual.level = 0x100 + WL_IW_RSSI_GOOD; - - range->avg_qual.noise = 0x100 - 75; -#endif - + range->avg_qual.noise = 0x100 - 75; +#endif + + if ((error = dev_wlc_ioctl(dev, WLC_GET_CURR_RATESET, &rateset, sizeof(rateset)))) return error; rateset.count = dtoh32(rateset.count); range->num_bitrates = rateset.count; for (i = 0; i < rateset.count && i < IW_MAX_BITRATES; i++) - range->bitrate[i] = (rateset.rates[i] & 0x7f) * 500000; + range->bitrate[i] = (rateset.rates[i] & 0x7f) * 500000; dev_wlc_intvar_get(dev, "nmode", &nmode); if ((error = dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &phytype, sizeof(phytype)))) return error; @@ -751,21 +749,21 @@ wl_iw_get_range( } range->num_bitrates += 8; for (k = 0; i < range->num_bitrates; k++, i++) { - + range->bitrate[i] = (nrate_list[nrate_list2copy][k]) * 500000; } } - + if ((error = dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &i, sizeof(i)))) return error; i = dtoh32(i); if (i == WLC_PHY_TYPE_A) - range->throughput = 24000000; + range->throughput = 24000000; else - range->throughput = 1500000; + range->throughput = 1500000; + - range->min_rts = 0; range->max_rts = 2347; range->min_frag = 256; @@ -782,7 +780,7 @@ wl_iw_get_range( #endif range->encoding_size[3] = AES_KEY_SIZE; - + range->min_pmp = 0; range->max_pmp = 0; range->min_pmt = 0; @@ -790,7 +788,7 @@ wl_iw_get_range( range->pmp_flags = 0; range->pm_capa = 0; - + range->num_txpower = 2; range->txpower[0] = 1; range->txpower[1] = 255; @@ -800,17 +798,17 @@ wl_iw_get_range( range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 19; - + range->retry_capa = IW_RETRY_LIMIT; range->retry_flags = IW_RETRY_LIMIT; range->r_time_flags = 0; - + range->min_retry = 1; range->max_retry = 255; - + range->min_r_time = 0; range->max_r_time = 0; -#endif +#endif #if WIRELESS_EXT > 17 range->enc_capa = IW_ENC_CAPA_WPA; @@ -818,13 +816,13 @@ wl_iw_get_range( range->enc_capa |= IW_ENC_CAPA_CIPHER_CCMP; range->enc_capa |= IW_ENC_CAPA_WPA2; #if (defined(BCMSUP_PSK) && defined(WLFBT)) - + range->enc_capa |= IW_ENC_CAPA_4WAY_HANDSHAKE; -#endif +#endif + - IW_EVENT_CAPA_SET_KERNEL(range->event_capa); - + IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); IW_EVENT_CAPA_SET(range->event_capa, IWEVTXDROP); @@ -834,10 +832,10 @@ wl_iw_get_range( IW_EVENT_CAPA_SET(range->event_capa, IWEVPMKIDCAND); #if WIRELESS_EXT >= 22 && defined(IW_SCAN_CAPA_ESSID) - + range->scan_capa = IW_SCAN_CAPA_ESSID; #endif -#endif +#endif return 0; } @@ -930,7 +928,7 @@ wl_iw_set_wap( return -EINVAL; } - + if (ETHER_ISBCAST(awrq->sa_data) || ETHER_ISNULLADDR(awrq->sa_data)) { scb_val_t scbval; bzero(&scbval, sizeof(scb_val_t)); @@ -939,8 +937,8 @@ wl_iw_set_wap( } return 0; } - - + + if ((error = dev_wlc_ioctl(dev, WLC_REASSOC, awrq->sa_data, ETHER_ADDR_LEN))) { WL_ERROR(("%s: WLC_REASSOC failed (%d).\n", __FUNCTION__, error)); return error; @@ -962,7 +960,7 @@ wl_iw_get_wap( awrq->sa_family = ARPHRD_ETHER; memset(awrq->sa_data, 0, ETHER_ADDR_LEN); - + (void) dev_wlc_ioctl(dev, WLC_GET_BSSID, awrq->sa_data, ETHER_ADDR_LEN); return 0; @@ -1008,7 +1006,7 @@ wl_iw_mlme( return error; } -#endif +#endif static int wl_iw_get_aplist( @@ -1030,7 +1028,7 @@ wl_iw_get_aplist( if (!extra) return -EINVAL; - + list = kmalloc(buflen, GFP_KERNEL); if (!list) return -ENOMEM; @@ -1051,23 +1049,23 @@ wl_iw_get_aplist( ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + buflen)); - + if (!(dtoh16(bi->capability) & DOT11_CAP_ESS)) continue; - + memcpy(addr[dwrq->length].sa_data, &bi->BSSID, ETHER_ADDR_LEN); addr[dwrq->length].sa_family = ARPHRD_ETHER; qual[dwrq->length].qual = rssi_to_qual(dtoh16(bi->RSSI)); qual[dwrq->length].level = 0x100 + dtoh16(bi->RSSI); qual[dwrq->length].noise = 0x100 + bi->phy_noise; - + #if WIRELESS_EXT > 18 qual[dwrq->length].updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; #else qual[dwrq->length].updated = 7; -#endif +#endif dwrq->length++; } @@ -1076,7 +1074,7 @@ wl_iw_get_aplist( if (dwrq->length) { memcpy(&addr[dwrq->length], qual, sizeof(struct iw_quality) * dwrq->length); - + dwrq->flags = 1; } @@ -1110,7 +1108,7 @@ wl_iw_iscan_get_aplist( } buf = iscan->list_hdr; - + while (buf) { list = &((wl_iscan_results_t*)buf->iscan_buf)->results; ASSERT(list->version == WL_BSS_INFO_VERSION); @@ -1121,23 +1119,23 @@ wl_iw_iscan_get_aplist( ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + WLC_IW_ISCAN_MAXLEN)); - + if (!(dtoh16(bi->capability) & DOT11_CAP_ESS)) continue; - + memcpy(addr[dwrq->length].sa_data, &bi->BSSID, ETHER_ADDR_LEN); addr[dwrq->length].sa_family = ARPHRD_ETHER; qual[dwrq->length].qual = rssi_to_qual(dtoh16(bi->RSSI)); qual[dwrq->length].level = 0x100 + dtoh16(bi->RSSI); qual[dwrq->length].noise = 0x100 + bi->phy_noise; - + #if WIRELESS_EXT > 18 qual[dwrq->length].updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; #else qual[dwrq->length].updated = 7; -#endif +#endif dwrq->length++; } @@ -1145,7 +1143,7 @@ wl_iw_iscan_get_aplist( } if (dwrq->length) { memcpy(&addr[dwrq->length], qual, sizeof(struct iw_quality) * dwrq->length); - + dwrq->flags = 1; } @@ -1165,11 +1163,11 @@ wl_iw_set_scan( WL_TRACE(("%s: SIOCSIWSCAN\n", dev->name)); - + memset(&ssid, 0, sizeof(ssid)); #if WIRELESS_EXT > 17 - + if (wrqu->data.length == sizeof(struct iw_scan_req)) { if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { struct iw_scan_req *req = (struct iw_scan_req *)extra; @@ -1179,7 +1177,7 @@ wl_iw_set_scan( } } #endif - + (void) dev_wlc_ioctl(dev, WLC_SCAN, &ssid, sizeof(ssid)); return 0; @@ -1198,7 +1196,7 @@ wl_iw_iscan_set_scan( WL_TRACE(("%s: SIOCSIWSCAN\n", dev->name)); - + if ((!iscan) || (iscan->sysioc_pid < 0)) { return wl_iw_set_scan(dev, info, wrqu, extra); } @@ -1206,11 +1204,11 @@ wl_iw_iscan_set_scan( return 0; } - + memset(&ssid, 0, sizeof(ssid)); #if WIRELESS_EXT > 17 - + if (wrqu->data.length == sizeof(struct iw_scan_req)) { if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { struct iw_scan_req *req = (struct iw_scan_req *)extra; @@ -1228,9 +1226,10 @@ wl_iw_iscan_set_scan( wl_iw_set_event_mask(dev); wl_iw_iscan(iscan, &ssid, WL_SCAN_ACTION_START); - iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); + iscan->timer.expires = jiffies + iscan->timer_ms*HZ/1000; add_timer(&iscan->timer); iscan->timer_on = 1; + DHD_ERROR(("TIMER_TIMER: i scan timer set(%s)\n", __FUNCTION__)); return 0; } @@ -1243,17 +1242,17 @@ ie_is_wpa_ie(uint8 **wpaie, uint8 **tlvs, int *tlvs_len) uint8 *ie = *wpaie; - + if ((ie[1] >= 6) && !bcmp((const void *)&ie[2], (const void *)(WPA_OUI "\x01"), 4)) { return TRUE; } - + ie += ie[1] + 2; - + *tlvs_len -= (int)(ie - *tlvs); - + *tlvs = ie; return FALSE; } @@ -1265,21 +1264,21 @@ ie_is_wps_ie(uint8 **wpsie, uint8 **tlvs, int *tlvs_len) uint8 *ie = *wpsie; - + if ((ie[1] >= 4) && !bcmp((const void *)&ie[2], (const void *)(WPA_OUI "\x04"), 4)) { return TRUE; } - + ie += ie[1] + 2; - + *tlvs_len -= (int)(ie - *tlvs); - + *tlvs = ie; return FALSE; } -#endif +#endif #ifdef BCMWAPI_WPI static inline int _wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, @@ -1309,7 +1308,7 @@ wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len) { return _wpa_snprintf_hex(buf, buf_size, data, len, 0); } -#endif +#endif static int wl_iw_handle_scanresults_ies(char **event_p, char *end, @@ -1325,7 +1324,7 @@ wl_iw_handle_scanresults_ies(char **event_p, char *end, event = *event_p; if (bi->ie_length) { - + bcm_tlv_t *ie; uint8 *ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); int ptr_len = bi->ie_length; @@ -1344,10 +1343,10 @@ wl_iw_handle_scanresults_ies(char **event_p, char *end, event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); } ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); -#endif +#endif while ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_WPA_ID))) { - + if (ie_is_wps_ie(((uint8 **)&ie), &ptr, &ptr_len)) { iwe.cmd = IWEVGENIE; iwe.u.data.length = ie->len + 2; @@ -1377,7 +1376,7 @@ wl_iw_handle_scanresults_ies(char **event_p, char *end, iwe.cmd = IWEVGENIE; iwe.u.data.length = ie->len + 2; event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); -#else +#else iwe.cmd = IWEVCUSTOM; custom_event_len = strlen("wapi_ie=") + 2*(ie->len + 2); iwe.u.data.length = custom_event_len; @@ -1394,15 +1393,14 @@ wl_iw_handle_scanresults_ies(char **event_p, char *end, wpa_snprintf_hex(buf + 10, 2+1, &(ie->len), 1); wpa_snprintf_hex(buf + 12, 2*ie->len+1, ie->data, ie->len); event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, buf); - kfree(buf); -#endif +#endif break; } -#endif +#endif *event_p = event; } -#endif +#endif return 0; } static int @@ -1418,6 +1416,7 @@ wl_iw_get_scan( struct iw_event iwe; wl_bss_info_t *bi = NULL; int error, i, j; + int rssi = 0; char *event = extra, *end = extra + dwrq->length, *value; uint buflen = dwrq->length; @@ -1426,14 +1425,14 @@ wl_iw_get_scan( if (!extra) return -EINVAL; - + if ((error = dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci)))) return error; ci.scan_channel = dtoh32(ci.scan_channel); if (ci.scan_channel) return -EAGAIN; - + list = kmalloc(buflen, GFP_KERNEL); if (!list) return -ENOMEM; @@ -1454,19 +1453,19 @@ wl_iw_get_scan( ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + buflen)); - + iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, &bi->BSSID, ETHER_ADDR_LEN); event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_ADDR_LEN); - + iwe.u.data.length = dtoh32(bi->SSID_len); iwe.cmd = SIOCGIWESSID; iwe.u.data.flags = 1; event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, bi->SSID); - + if (dtoh16(bi->capability) & (DOT11_CAP_ESS | DOT11_CAP_IBSS)) { iwe.cmd = SIOCGIWMODE; if (dtoh16(bi->capability) & DOT11_CAP_ESS) @@ -1476,7 +1475,7 @@ wl_iw_get_scan( event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_UINT_LEN); } - + iwe.cmd = SIOCGIWFREQ; iwe.u.freq.m = wf_channel2mhz(CHSPEC_CHANNEL(bi->chanspec), CHSPEC_CHANNEL(bi->chanspec) <= CH_MAX_2G_CHANNEL ? @@ -1484,17 +1483,20 @@ wl_iw_get_scan( iwe.u.freq.e = 6; event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_FREQ_LEN); - iwe.cmd = IWEVQUAL; - iwe.u.qual.qual = rssi_to_qual(dtoh16(bi->RSSI)); - iwe.u.qual.level = 0x100 + dtoh16(bi->RSSI); + rssi = dtoh16(bi->RSSI); + if (rssi >= WL_IW_RSSI_INVALID) + rssi = WL_IW_RSSI_MAXVAL; + + iwe.u.qual.qual = rssi_to_qual(rssi); + iwe.u.qual.level = 0x100 + rssi; iwe.u.qual.noise = 0x100 + bi->phy_noise; event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_QUAL_LEN); - + wl_iw_handle_scanresults_ies(&event, end, info, bi); - + iwe.cmd = SIOCGIWENCODE; if (dtoh16(bi->capability) & DOT11_CAP_PRIVACY) iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; @@ -1503,11 +1505,11 @@ wl_iw_get_scan( iwe.u.data.length = 0; event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)event); - + if (bi->rateset.count) { value = event + IW_EV_LCP_LEN; iwe.cmd = SIOCGIWRATE; - + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; for (j = 0; j < bi->rateset.count && j < IW_MAX_BITRATES; j++) { iwe.u.bitrate.value = (bi->rateset.rates[j] & 0x7f) * 500000; @@ -1521,7 +1523,7 @@ wl_iw_get_scan( kfree(list); dwrq->length = event - extra; - dwrq->flags = 0; + dwrq->flags = 0; return 0; } @@ -1548,18 +1550,18 @@ wl_iw_iscan_get_scan( if (!extra) return -EINVAL; - + if ((!iscan) || (iscan->sysioc_pid < 0)) { return wl_iw_get_scan(dev, info, dwrq, extra); } - + if (iscan->iscan_state == ISCAN_STATE_SCANING) return -EAGAIN; apcnt = 0; p_buf = iscan->list_hdr; - + while (p_buf != iscan->list_cur) { list = &((wl_iscan_results_t*)p_buf->iscan_buf)->results; @@ -1573,23 +1575,23 @@ wl_iw_iscan_get_scan( ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + WLC_IW_ISCAN_MAXLEN)); - + if (event + ETHER_ADDR_LEN + bi->SSID_len + IW_EV_UINT_LEN + IW_EV_FREQ_LEN + IW_EV_QUAL_LEN >= end) return -E2BIG; - + iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, &bi->BSSID, ETHER_ADDR_LEN); event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_ADDR_LEN); - + iwe.u.data.length = dtoh32(bi->SSID_len); iwe.cmd = SIOCGIWESSID; iwe.u.data.flags = 1; event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, bi->SSID); - + if (dtoh16(bi->capability) & (DOT11_CAP_ESS | DOT11_CAP_IBSS)) { iwe.cmd = SIOCGIWMODE; if (dtoh16(bi->capability) & DOT11_CAP_ESS) @@ -1599,7 +1601,7 @@ wl_iw_iscan_get_scan( event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_UINT_LEN); } - + iwe.cmd = SIOCGIWFREQ; iwe.u.freq.m = wf_channel2mhz(CHSPEC_CHANNEL(bi->chanspec), CHSPEC_CHANNEL(bi->chanspec) <= CH_MAX_2G_CHANNEL ? @@ -1607,17 +1609,21 @@ wl_iw_iscan_get_scan( iwe.u.freq.e = 6; event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_FREQ_LEN); - + iwe.cmd = IWEVQUAL; - iwe.u.qual.qual = rssi_to_qual(dtoh16(bi->RSSI)); - iwe.u.qual.level = 0x100 + dtoh16(bi->RSSI); + rssi = dtoh16(bi->RSSI); + if (rssi >= WL_IW_RSSI_INVALID) + rssi = WL_IW_RSSI_MAXVAL; + + iwe.u.qual.qual = rssi_to_qual(rssi); + iwe.u.qual.level = 0x100 + rssi; iwe.u.qual.noise = 0x100 + bi->phy_noise; event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_QUAL_LEN); - + wl_iw_handle_scanresults_ies(&event, end, info, bi); - + iwe.cmd = SIOCGIWENCODE; if (dtoh16(bi->capability) & DOT11_CAP_PRIVACY) iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; @@ -1626,14 +1632,14 @@ wl_iw_iscan_get_scan( iwe.u.data.length = 0; event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)event); - - if (bi->rateset.count <= sizeof(bi->rateset.rates)) { + + if (bi->rateset.count) { if (event + IW_MAX_BITRATES*IW_EV_PARAM_LEN >= end) return -E2BIG; value = event + IW_EV_LCP_LEN; iwe.cmd = SIOCGIWRATE; - + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; for (j = 0; j < bi->rateset.count && j < IW_MAX_BITRATES; j++) { iwe.u.bitrate.value = (bi->rateset.rates[j] & 0x7f) * 500000; @@ -1644,15 +1650,15 @@ wl_iw_iscan_get_scan( } } p_buf = p_buf->next; - } + } dwrq->length = event - extra; - dwrq->flags = 0; + dwrq->flags = 0; return 0; } -#endif +#endif static int @@ -1668,7 +1674,7 @@ wl_iw_set_essid( WL_TRACE(("%s: SIOCSIWESSID\n", dev->name)); - + memset(&ssid, 0, sizeof(ssid)); if (dwrq->length && extra) { #if WIRELESS_EXT > 20 @@ -1682,7 +1688,7 @@ wl_iw_set_essid( if ((error = dev_wlc_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(ssid)))) return error; } - + else { scb_val_t scbval; bzero(&scbval, sizeof(scb_val_t)); @@ -1715,12 +1721,12 @@ wl_iw_get_essid( ssid.SSID_len = dtoh32(ssid.SSID_len); - + memcpy(extra, ssid.SSID, ssid.SSID_len); dwrq->length = ssid.SSID_len; - dwrq->flags = 1; + dwrq->flags = 1; return 0; } @@ -1739,7 +1745,7 @@ wl_iw_set_nick( if (!extra) return -EINVAL; - + if (dwrq->length > sizeof(iw->nickname)) return -E2BIG; @@ -1781,47 +1787,47 @@ static int wl_iw_set_rate( WL_TRACE(("%s: SIOCSIWRATE\n", dev->name)); - + if ((error = dev_wlc_ioctl(dev, WLC_GET_CURR_RATESET, &rateset, sizeof(rateset)))) return error; rateset.count = dtoh32(rateset.count); if (vwrq->value < 0) { - + rate = rateset.rates[rateset.count - 1] & 0x7f; } else if (vwrq->value < rateset.count) { - + rate = rateset.rates[vwrq->value] & 0x7f; } else { - + rate = vwrq->value / 500000; } if (vwrq->fixed) { - + error_bg = dev_wlc_intvar_set(dev, "bg_rate", rate); error_a = dev_wlc_intvar_set(dev, "a_rate", rate); if (error_bg && error_a) return (error_bg | error_a); } else { - - + + error_bg = dev_wlc_intvar_set(dev, "bg_rate", 0); - + error_a = dev_wlc_intvar_set(dev, "a_rate", 0); if (error_bg && error_a) return (error_bg | error_a); - + for (i = 0; i < rateset.count; i++) if ((rateset.rates[i] & 0x7f) > rate) break; rateset.count = htod32(i); - + if ((error = dev_wlc_ioctl(dev, WLC_SET_RATESET, &rateset, sizeof(rateset)))) return error; } @@ -1840,7 +1846,7 @@ static int wl_iw_get_rate( WL_TRACE(("%s: SIOCGIWRATE\n", dev->name)); - + if ((error = dev_wlc_ioctl(dev, WLC_GET_RATE, &rate, sizeof(rate)))) return error; rate = dtoh32(rate); @@ -1955,7 +1961,7 @@ wl_iw_set_txpow( uint16 txpwrmw; WL_TRACE(("%s: SIOCSIWTXPOW\n", dev->name)); - + disable = vwrq->disabled ? WL_RADIO_SW_DISABLE : 0; disable += WL_RADIO_SW_DISABLE << 16; @@ -1963,15 +1969,15 @@ wl_iw_set_txpow( if ((error = dev_wlc_ioctl(dev, WLC_SET_RADIO, &disable, sizeof(disable)))) return error; - + if (disable & WL_RADIO_SW_DISABLE) return 0; - + if (!(vwrq->flags & IW_TXPOW_MWATT)) return -EINVAL; - + if (vwrq->value < 0) return 0; @@ -2023,31 +2029,31 @@ wl_iw_set_retry( WL_TRACE(("%s: SIOCSIWRETRY\n", dev->name)); - + if (vwrq->disabled || (vwrq->flags & IW_RETRY_LIFETIME)) return -EINVAL; - + if (vwrq->flags & IW_RETRY_LIMIT) { - + #if WIRELESS_EXT > 20 if ((vwrq->flags & IW_RETRY_LONG) ||(vwrq->flags & IW_RETRY_MAX) || !((vwrq->flags & IW_RETRY_SHORT) || (vwrq->flags & IW_RETRY_MIN))) { #else if ((vwrq->flags & IW_RETRY_MAX) || !(vwrq->flags & IW_RETRY_MIN)) { -#endif +#endif lrl = htod32(vwrq->value); if ((error = dev_wlc_ioctl(dev, WLC_SET_LRL, &lrl, sizeof(lrl)))) return error; } - + #if WIRELESS_EXT > 20 if ((vwrq->flags & IW_RETRY_SHORT) ||(vwrq->flags & IW_RETRY_MIN) || !((vwrq->flags & IW_RETRY_LONG) || (vwrq->flags & IW_RETRY_MAX))) { #else if ((vwrq->flags & IW_RETRY_MIN) || !(vwrq->flags & IW_RETRY_MAX)) { -#endif +#endif srl = htod32(vwrq->value); if ((error = dev_wlc_ioctl(dev, WLC_SET_SRL, &srl, sizeof(srl)))) @@ -2070,13 +2076,13 @@ wl_iw_get_retry( WL_TRACE(("%s: SIOCGIWRETRY\n", dev->name)); - vwrq->disabled = 0; + vwrq->disabled = 0; + - if ((vwrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) return -EINVAL; - + if ((error = dev_wlc_ioctl(dev, WLC_GET_LRL, &lrl, sizeof(lrl))) || (error = dev_wlc_ioctl(dev, WLC_GET_SRL, &srl, sizeof(srl)))) return error; @@ -2084,7 +2090,7 @@ wl_iw_get_retry( lrl = dtoh32(lrl); srl = dtoh32(srl); - + if (vwrq->flags & IW_RETRY_MAX) { vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX; vwrq->value = lrl; @@ -2097,7 +2103,7 @@ wl_iw_get_retry( return 0; } -#endif +#endif static int wl_iw_set_encode( @@ -2115,7 +2121,7 @@ wl_iw_set_encode( memset(&key, 0, sizeof(key)); if ((dwrq->flags & IW_ENCODE_INDEX) == 0) { - + for (key.index = 0; key.index < DOT11_MAX_DEFAULT_KEYS; key.index++) { val = htod32(key.index); if ((error = dev_wlc_ioctl(dev, WLC_GET_KEY_PRIMARY, &val, sizeof(val)))) @@ -2124,7 +2130,7 @@ wl_iw_set_encode( if (val) break; } - + if (key.index == DOT11_MAX_DEFAULT_KEYS) key.index = 0; } else { @@ -2133,15 +2139,15 @@ wl_iw_set_encode( return -EINVAL; } - + wsec = (dwrq->flags & IW_ENCODE_DISABLED) ? 0 : WEP_ENABLED; if ((error = dev_wlc_intvar_set(dev, "wsec", wsec))) return error; - + if (!extra || !dwrq->length || (dwrq->flags & IW_ENCODE_NOKEY)) { - + val = htod32(key.index); if ((error = dev_wlc_ioctl(dev, WLC_SET_KEY_PRIMARY, &val, sizeof(val)))) return error; @@ -2173,13 +2179,13 @@ wl_iw_set_encode( return -EINVAL; } - + swap_key_from_BE(&key); if ((error = dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key)))) return error; } - + val = (dwrq->flags & IW_ENCODE_RESTRICTED) ? 1 : 0; val = htod32(val); if ((error = dev_wlc_ioctl(dev, WLC_SET_AUTH, &val, sizeof(val)))) @@ -2201,11 +2207,11 @@ wl_iw_get_encode( WL_TRACE(("%s: SIOCGIWENCODE\n", dev->name)); - + bzero(&key, sizeof(wl_wsec_key_t)); if ((dwrq->flags & IW_ENCODE_INDEX) == 0) { - + for (key.index = 0; key.index < DOT11_MAX_DEFAULT_KEYS; key.index++) { val = key.index; if ((error = dev_wlc_ioctl(dev, WLC_GET_KEY_PRIMARY, &val, sizeof(val)))) @@ -2220,7 +2226,7 @@ wl_iw_get_encode( if (key.index >= DOT11_MAX_DEFAULT_KEYS) key.index = 0; - + if ((error = dev_wlc_ioctl(dev, WLC_GET_WSEC, &wsec, sizeof(wsec))) || (error = dev_wlc_ioctl(dev, WLC_GET_AUTH, &auth, sizeof(auth)))) @@ -2230,21 +2236,21 @@ wl_iw_get_encode( wsec = dtoh32(wsec); auth = dtoh32(auth); - + dwrq->length = MIN(IW_ENCODING_TOKEN_MAX, key.len); - + dwrq->flags = key.index + 1; if (!(wsec & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED))) { - + dwrq->flags |= IW_ENCODE_DISABLED; } if (auth) { - + dwrq->flags |= IW_ENCODE_RESTRICTED; } - + if (dwrq->length && extra) memcpy(extra, key.data, dwrq->length); @@ -2354,34 +2360,34 @@ wl_iw_set_encodeext( memset(&key, 0, sizeof(key)); iwe = (struct iw_encode_ext *)extra; - + if (dwrq->flags & IW_ENCODE_DISABLED) { } - + key.index = 0; if (dwrq->flags & IW_ENCODE_INDEX) key.index = (dwrq->flags & IW_ENCODE_INDEX) - 1; key.len = iwe->key_len; - + if (!ETHER_ISMULTI(iwe->addr.sa_data)) bcopy((void *)&iwe->addr.sa_data, (char *)&key.ea, ETHER_ADDR_LEN); - + if (key.len == 0) { if (iwe->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { WL_WSEC(("Changing the the primary Key to %d\n", key.index)); - + key.index = htod32(key.index); error = dev_wlc_ioctl(dev, WLC_SET_KEY_PRIMARY, &key.index, sizeof(key.index)); if (error) return error; } - + else { swap_key_from_BE(&key); error = dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key)); @@ -2390,7 +2396,7 @@ wl_iw_set_encodeext( } } #if (defined(BCMSUP_PSK) && defined(WLFBT)) - + else if (iwe->alg == IW_ENCODE_ALG_PMK) { int j; wsec_pmk_t pmk; @@ -2398,7 +2404,7 @@ wl_iw_set_encodeext( char* charptr = keystring; uint len; - + for (j = 0; j < (WSEC_MAX_PSK_LEN / 2); j++) { sprintf(charptr, "%02x", iwe->key[j]); charptr += 2; @@ -2412,7 +2418,7 @@ wl_iw_set_encodeext( if (error) return error; } -#endif +#endif else { if (iwe->key_len > sizeof(key.data)) @@ -2433,7 +2439,7 @@ wl_iw_set_encodeext( bcopy(keybuf, &key.data[16], sizeof(keybuf)); } - + if (iwe->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { uchar *ivptr; ivptr = (uchar *)iwe->rx_seq; @@ -2569,7 +2575,7 @@ wl_iw_set_pmksa( dev_wlc_bufvar_set(dev, "pmkid_info", (char *)&pmkid_list, sizeof(pmkid_list)); return 0; } -#endif +#endif static int wl_iw_get_encodeext( @@ -2609,7 +2615,7 @@ wl_iw_set_wpaauth( switch (paramid) { case IW_AUTH_WPA_VERSION: - + if (paramval & IW_AUTH_WPA_VERSION_DISABLED) val = WPA_AUTH_DISABLED; else if (paramval & (IW_AUTH_WPA_VERSION_WPA)) @@ -2677,7 +2683,7 @@ wl_iw_set_wpaauth( if ((error = dev_wlc_intvar_set(dev, "sup_wpa", 0))) return error; } -#endif +#endif break; case IW_AUTH_KEY_MGMT: @@ -2710,7 +2716,7 @@ wl_iw_set_wpaauth( break; case IW_AUTH_80211_AUTH_ALG: - + WL_ERROR(("Setting the D11auth %d\n", paramval)); if (paramval & IW_AUTH_ALG_OPEN_SYSTEM) val = 0; @@ -2730,7 +2736,7 @@ wl_iw_set_wpaauth( return error; } else { - + } break; @@ -2746,7 +2752,7 @@ wl_iw_set_wpaauth( case IW_AUTH_ROAMING_CONTROL: WL_TRACE(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__)); - + break; case IW_AUTH_PRIVACY_INVOKED: { @@ -2764,7 +2770,7 @@ wl_iw_set_wpaauth( return error; if (!WSEC_ENABLED(wsec)) { - + if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) { WL_WSEC(("Failed to set iovar is_WPS_enrollee\n")); return error; @@ -2780,7 +2786,7 @@ wl_iw_set_wpaauth( } -#endif +#endif #ifdef BCMWAPI_WPI @@ -2804,7 +2810,7 @@ wl_iw_set_wpaauth( break; -#endif +#endif default: break; @@ -2833,7 +2839,7 @@ wl_iw_get_wpaauth( switch (paramid) { case IW_AUTH_WPA_VERSION: - + if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if (val & (WPA_AUTH_NONE | WPA_AUTH_DISABLED)) @@ -2853,7 +2859,7 @@ wl_iw_get_wpaauth( break; case IW_AUTH_KEY_MGMT: - + if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) return error; if (VAL_PSK(val)) @@ -2875,7 +2881,7 @@ wl_iw_get_wpaauth( break; case IW_AUTH_80211_AUTH_ALG: - + if ((error = dev_wlc_intvar_get(dev, "auth", &val))) return error; if (!val) @@ -2896,90 +2902,90 @@ wl_iw_get_wpaauth( case IW_AUTH_ROAMING_CONTROL: WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__)); - + break; case IW_AUTH_PRIVACY_INVOKED: paramval = iw->privacy_invoked; break; -#endif +#endif } vwrq->value = paramval; return 0; } -#endif +#endif static const iw_handler wl_iw_handler[] = { - (iw_handler) wl_iw_config_commit, - (iw_handler) wl_iw_get_name, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_set_freq, - (iw_handler) wl_iw_get_freq, - (iw_handler) wl_iw_set_mode, - (iw_handler) wl_iw_get_mode, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_get_range, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_set_spy, - (iw_handler) wl_iw_get_spy, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_set_wap, - (iw_handler) wl_iw_get_wap, + (iw_handler) wl_iw_config_commit, + (iw_handler) wl_iw_get_name, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_set_freq, + (iw_handler) wl_iw_get_freq, + (iw_handler) wl_iw_set_mode, + (iw_handler) wl_iw_get_mode, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_get_range, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_set_spy, + (iw_handler) wl_iw_get_spy, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_set_wap, + (iw_handler) wl_iw_get_wap, #if WIRELESS_EXT > 17 - (iw_handler) wl_iw_mlme, + (iw_handler) wl_iw_mlme, #else - (iw_handler) NULL, + (iw_handler) NULL, #endif - (iw_handler) wl_iw_iscan_get_aplist, + (iw_handler) wl_iw_iscan_get_aplist, #if WIRELESS_EXT > 13 - (iw_handler) wl_iw_iscan_set_scan, - (iw_handler) wl_iw_iscan_get_scan, -#else - (iw_handler) NULL, - (iw_handler) NULL, -#endif - (iw_handler) wl_iw_set_essid, - (iw_handler) wl_iw_get_essid, - (iw_handler) wl_iw_set_nick, - (iw_handler) wl_iw_get_nick, - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_set_rate, - (iw_handler) wl_iw_get_rate, - (iw_handler) wl_iw_set_rts, - (iw_handler) wl_iw_get_rts, - (iw_handler) wl_iw_set_frag, - (iw_handler) wl_iw_get_frag, - (iw_handler) wl_iw_set_txpow, - (iw_handler) wl_iw_get_txpow, + (iw_handler) wl_iw_iscan_set_scan, + (iw_handler) wl_iw_iscan_get_scan, +#else + (iw_handler) NULL, + (iw_handler) NULL, +#endif + (iw_handler) wl_iw_set_essid, + (iw_handler) wl_iw_get_essid, + (iw_handler) wl_iw_set_nick, + (iw_handler) wl_iw_get_nick, + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_set_rate, + (iw_handler) wl_iw_get_rate, + (iw_handler) wl_iw_set_rts, + (iw_handler) wl_iw_get_rts, + (iw_handler) wl_iw_set_frag, + (iw_handler) wl_iw_get_frag, + (iw_handler) wl_iw_set_txpow, + (iw_handler) wl_iw_get_txpow, #if WIRELESS_EXT > 10 - (iw_handler) wl_iw_set_retry, - (iw_handler) wl_iw_get_retry, -#endif - (iw_handler) wl_iw_set_encode, - (iw_handler) wl_iw_get_encode, - (iw_handler) wl_iw_set_power, - (iw_handler) wl_iw_get_power, + (iw_handler) wl_iw_set_retry, + (iw_handler) wl_iw_get_retry, +#endif + (iw_handler) wl_iw_set_encode, + (iw_handler) wl_iw_get_encode, + (iw_handler) wl_iw_set_power, + (iw_handler) wl_iw_get_power, #if WIRELESS_EXT > 17 - (iw_handler) NULL, - (iw_handler) NULL, - (iw_handler) wl_iw_set_wpaie, - (iw_handler) wl_iw_get_wpaie, - (iw_handler) wl_iw_set_wpaauth, - (iw_handler) wl_iw_get_wpaauth, - (iw_handler) wl_iw_set_encodeext, - (iw_handler) wl_iw_get_encodeext, - (iw_handler) wl_iw_set_pmksa, -#endif + (iw_handler) NULL, + (iw_handler) NULL, + (iw_handler) wl_iw_set_wpaie, + (iw_handler) wl_iw_get_wpaie, + (iw_handler) wl_iw_set_wpaauth, + (iw_handler) wl_iw_get_wpaauth, + (iw_handler) wl_iw_set_encodeext, + (iw_handler) wl_iw_get_encodeext, + (iw_handler) wl_iw_set_pmksa, +#endif }; #if WIRELESS_EXT > 12 @@ -3026,9 +3032,9 @@ const struct iw_handler_def wl_iw_handler_def = .private_args = wl_iw_priv_args, #if WIRELESS_EXT >= 19 get_wireless_stats: dhd_get_wireless_stats, -#endif +#endif }; -#endif +#endif int wl_iw_ioctl( @@ -3083,7 +3089,7 @@ wl_iw_ioctl( else max_tokens = IW_SCAN_MAX_DATA; break; -#endif +#endif case SIOCSIWSPY: token_size = sizeof(struct sockaddr); @@ -3134,18 +3140,18 @@ wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, char* stringBuf, uint buflen) { typedef struct conn_fail_event_map_t { - uint32 inEvent; - uint32 inStatus; - uint32 inReason; - const char* outName; - const char* outCause; + uint32 inEvent; + uint32 inStatus; + uint32 inReason; + const char* outName; + const char* outCause; } conn_fail_event_map_t; - + # define WL_IW_DONT_CARE 9999 const conn_fail_event_map_t event_map [] = { - - + + {WLC_E_SET_SSID, WLC_E_STATUS_SUCCESS, WL_IW_DONT_CARE, "Conn", "Success"}, {WLC_E_SET_SSID, WLC_E_STATUS_NO_NETWORKS, WL_IW_DONT_CARE, @@ -3184,7 +3190,7 @@ wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, const char* cause = NULL; int i; - + for (i = 0; i < sizeof(event_map)/sizeof(event_map[0]); i++) { const conn_fail_event_map_t* row = &event_map[i]; if (row->inEvent == event_type && @@ -3196,7 +3202,7 @@ wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, } } - + if (cause) { memset(stringBuf, 0, buflen); snprintf(stringBuf, buflen, "%s %s %02d %02d", @@ -3224,11 +3230,11 @@ wl_iw_check_conn_fail(wl_event_msg_t *e, char* stringBuf, uint buflen) return FALSE; } } -#endif +#endif #ifndef IW_CUSTOM_MAX -#define IW_CUSTOM_MAX 256 -#endif +#define IW_CUSTOM_MAX 256 +#endif void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) @@ -3294,7 +3300,7 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) WL_TRACE(("wl_iw_event status %d \n", status)); } break; -#endif +#endif #if WIRELESS_EXT > 17 case WLC_E_MIC_ERROR: { struct iw_michaelmicfailure *micerrevt = (struct iw_michaelmicfailure *)&extra; @@ -3350,7 +3356,7 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) } break; } -#endif +#endif case WLC_E_SCAN_COMPLETE: #if WIRELESS_EXT > 14 @@ -3363,7 +3369,7 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) break; default: - + break; } @@ -3375,16 +3381,16 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) } #if WIRELESS_EXT > 14 - + memset(extra, 0, sizeof(extra)); if (wl_iw_check_conn_fail(e, extra, sizeof(extra))) { cmd = IWEVCUSTOM; wrqu.data.length = strlen(extra); wireless_send_event(dev, cmd, &wrqu, extra); } -#endif +#endif -#endif +#endif } int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstats) @@ -3407,6 +3413,9 @@ int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstat goto done; rssi = dtoh32(scb_val.val); + if (rssi >= WL_IW_RSSI_INVALID) + rssi = WL_IW_RSSI_MAXVAL; + WL_TRACE(("wl_iw_get_wireless_stats rssi=%d ****** \n", rssi)); if (rssi <= WL_IW_RSSI_NO_SIGNAL) wstats->qual.qual = 0; @@ -3421,14 +3430,14 @@ int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstat else wstats->qual.qual = 5; - + wstats->qual.level = 0x100 + rssi; wstats->qual.noise = 0x100 + phy_noise; #if WIRELESS_EXT > 18 wstats->qual.updated |= (IW_QUAL_ALL_UPDATED | IW_QUAL_DBM); #else wstats->qual.updated |= 7; -#endif +#endif #if WIRELESS_EXT > 11 WL_TRACE(("wl_iw_get_wireless_stats counters=%d\n *****", (int)sizeof(wl_cnt_t))); @@ -3465,7 +3474,7 @@ int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstat WL_TRACE(("wl_iw_get_wireless_stats counters rxrunt=%d\n", dtoh32(cnt.rxrunt))); WL_TRACE(("wl_iw_get_wireless_stats counters rxgiant=%d\n", dtoh32(cnt.rxgiant))); -#endif +#endif done: return res; @@ -3476,6 +3485,7 @@ wl_iw_timerfunc(ulong data) { iscan_info_t *iscan = (iscan_info_t *)data; iscan->timer_on = 0; + DHD_ERROR(("TIMER_TIMER: iscan timer removed(%s)\n", __FUNCTION__)); if (iscan->iscan_state != ISCAN_STATE_IDLE) { WL_TRACE(("timer trigger\n")); up(&iscan->sysioc_sem); @@ -3486,7 +3496,7 @@ static void wl_iw_set_event_mask(struct net_device *dev) { char eventmask[WL_EVENTING_MASK_LEN]; - char iovbuf[WL_EVENTING_MASK_LEN + 12]; + char iovbuf[WL_EVENTING_MASK_LEN + 12]; dev_iw_iovar_getbuf(dev, "event_msgs", "", 0, iovbuf, sizeof(iovbuf)); bcopy(iovbuf, eventmask, WL_EVENTING_MASK_LEN); @@ -3544,7 +3554,7 @@ wl_iw_iscan(iscan_info_t *iscan, wlc_ssid_t *ssid, uint16 action) params->action = htod16(action); params->scan_duration = htod16(0); - + (void) dev_iw_iovar_setbuf(iscan->dev, "iscan", params, params_size, iscan->ioctlbuf, WLC_IOCTL_SMLEN); } @@ -3563,7 +3573,7 @@ wl_iw_iscan_get(iscan_info_t *iscan) wl_scan_results_t *results; uint32 status; - + if (iscan->list_cur) { buf = iscan->list_cur; iscan->list_cur = buf->next; @@ -3612,11 +3622,11 @@ wl_iw_iscan_get(iscan_info_t *iscan) static void wl_iw_send_scan_complete(iscan_info_t *iscan) { union iwreq_data wrqu; + char extra[IW_CUSTOM_MAX + 1]; memset(&wrqu, 0, sizeof(wrqu)); - - - wireless_send_event(iscan->dev, SIOCGIWSCAN, &wrqu, NULL); + memset(extra, 0, sizeof(extra)); + wireless_send_event(iscan->dev, SIOCGIWSCAN, &wrqu, extra); } static int @@ -3632,6 +3642,7 @@ _iscan_sysioc_thread(void *data) if (iscan->timer_on) { del_timer(&iscan->timer); iscan->timer_on = 0; + DHD_ERROR(("TIMER_TIMER: iscan timer remove(%s)\n", __FUNCTION__)); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) @@ -3648,15 +3659,16 @@ _iscan_sysioc_thread(void *data) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) rtnl_lock(); #endif - + wl_iw_iscan(iscan, NULL, WL_SCAN_ACTION_CONTINUE); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) rtnl_unlock(); #endif - - iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); + + iscan->timer.expires = jiffies + iscan->timer_ms*HZ/1000; add_timer(&iscan->timer); iscan->timer_on = 1; + DHD_ERROR(("TIMER_TIMER: iscan timer set(%s)\n", __FUNCTION__)); break; case WL_SCAN_RESULTS_SUCCESS: WL_TRACE(("iscanresults complete\n")); @@ -3665,10 +3677,11 @@ _iscan_sysioc_thread(void *data) break; case WL_SCAN_RESULTS_PENDING: WL_TRACE(("iscanresults pending\n")); - - iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); + + iscan->timer.expires = jiffies + iscan->timer_ms*HZ/1000; add_timer(&iscan->timer); iscan->timer_on = 1; + DHD_ERROR(("TIMER_TIMER: iscan timer set(%s)\n", __FUNCTION__)); break; case WL_SCAN_RESULTS_ABORTED: WL_TRACE(("iscanresults aborted\n")); @@ -3696,13 +3709,13 @@ wl_iw_attach(struct net_device *dev, void * dhdp) return -ENOMEM; memset(iscan, 0, sizeof(iscan_info_t)); iscan->sysioc_pid = -1; - + g_iscan = iscan; iscan->dev = dev; iscan->iscan_state = ISCAN_STATE_IDLE; - + iscan->timer_ms = 2000; init_timer(&iscan->timer); iscan->timer.data = (ulong)iscan; @@ -3736,4 +3749,4 @@ void wl_iw_detach(void) g_iscan = NULL; } -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/wl_iw.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.h index 2afb5a6..3929e6c 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_iw.h @@ -1,14 +1,14 @@ /* * Linux Wireless Extensions support * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -33,13 +33,13 @@ #include <proto/ethernet.h> #include <wlioctl.h> -#define WL_SCAN_PARAMS_SSID_MAX 10 +#define WL_SCAN_PARAMS_SSID_MAX 10 #define GET_SSID "SSID=" #define GET_CHANNEL "CH=" -#define GET_NPROBE "NPROBE=" -#define GET_ACTIVE_ASSOC_DWELL "ACTIVE=" -#define GET_PASSIVE_ASSOC_DWELL "PASSIVE=" -#define GET_HOME_DWELL "HOME=" +#define GET_NPROBE "NPROBE=" +#define GET_ACTIVE_ASSOC_DWELL "ACTIVE=" +#define GET_PASSIVE_ASSOC_DWELL "PASSIVE=" +#define GET_HOME_DWELL "HOME=" #define GET_SCAN_TYPE "TYPE=" #define BAND_GET_CMD "GETBAND" @@ -49,7 +49,7 @@ #define SETSUSPEND_CMD "SETSUSPENDOPT" #define PNOSSIDCLR_SET_CMD "PNOSSIDCLR" -#define PNOSETUP_SET_CMD "PNOSETUP " +#define PNOSETUP_SET_CMD "PNOSETUP " #define PNOENABLE_SET_CMD "PNOFORCE" #define PNODEBUG_SET_CMD "PNODEBUG" #define TXPOWER_SET_CMD "TXPOWER" @@ -59,24 +59,25 @@ typedef struct wl_iw_extra_params { - int target_channel; + int target_channel; } wl_iw_extra_params_t; struct cntry_locales_custom { - char iso_abbrev[WLC_CNTRY_BUF_SZ]; - char custom_locale[WLC_CNTRY_BUF_SZ]; - int32 custom_locale_rev; + char iso_abbrev[WLC_CNTRY_BUF_SZ]; + char custom_locale[WLC_CNTRY_BUF_SZ]; + int32 custom_locale_rev; }; -#define WL_IW_RSSI_MINVAL -200 -#define WL_IW_RSSI_NO_SIGNAL -91 -#define WL_IW_RSSI_VERY_LOW -80 -#define WL_IW_RSSI_LOW -70 -#define WL_IW_RSSI_GOOD -68 -#define WL_IW_RSSI_VERY_GOOD -58 -#define WL_IW_RSSI_EXCELLENT -57 -#define WL_IW_RSSI_INVALID 0 +#define WL_IW_RSSI_MINVAL -200 +#define WL_IW_RSSI_NO_SIGNAL -91 +#define WL_IW_RSSI_VERY_LOW -80 +#define WL_IW_RSSI_LOW -70 +#define WL_IW_RSSI_GOOD -68 +#define WL_IW_RSSI_VERY_GOOD -58 +#define WL_IW_RSSI_EXCELLENT -57 +#define WL_IW_RSSI_INVALID 0 +#define WL_IW_RSSI_MAXVAL -15 #define MAX_WX_STRING 80 #define SSID_FMT_BUF_LEN ((4 * 32) + 1) #define isprint(c) bcm_isprint(c) @@ -88,8 +89,8 @@ struct cntry_locales_custom { #define WL_IW_SET_STOP (SIOCIWFIRSTPRIV+11) #define WL_IW_SET_START (SIOCIWFIRSTPRIV+13) -#define G_SCAN_RESULTS 8*1024 -#define WE_ADD_EVENT_FIX 0x80 +#define G_SCAN_RESULTS 8*1024 +#define WE_ADD_EVENT_FIX 0x80 #define G_WLAN_SET_ON 0 #define G_WLAN_SET_OFF 1 @@ -100,9 +101,9 @@ typedef struct wl_iw { struct iw_statistics wstats; int spy_num; - uint32 pwsec; - uint32 gwsec; - bool privacy_invoked; + uint32 pwsec; + uint32 gwsec; + bool privacy_invoked; struct ether_addr spy_addr[IW_MAX_SPY]; struct iw_quality spy_qual[IW_MAX_SPY]; void *wlinfo; @@ -120,7 +121,7 @@ struct wl_ctrl { #if WIRELESS_EXT > 12 #include <net/iw_handler.h> extern const struct iw_handler_def wl_iw_handler_def; -#endif +#endif extern int wl_iw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); extern void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data); @@ -131,7 +132,7 @@ int wl_iw_send_priv_event(struct net_device *dev, char *flag); void wl_iw_detach(void); #define CSCAN_COMMAND "CSCAN " -#define CSCAN_TLV_PREFIX 'S' +#define CSCAN_TLV_PREFIX 'S' #define CSCAN_TLV_VERSION 1 #define CSCAN_TLV_SUBVERSION 0 #define CSCAN_TLV_TYPE_SSID_IE 'S' @@ -158,4 +159,4 @@ void wl_iw_detach(void); iwe_stream_add_point(stream, ends, iwe, extra) #endif -#endif +#endif diff --git a/drivers/net/wireless/bcmdhd/wl_linux_mon.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_linux_mon.c index af25863..8a29599 100755..100644 --- a/drivers/net/wireless/bcmdhd/wl_linux_mon.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_linux_mon.c @@ -1,14 +1,14 @@ /* * Broadcom Dongle Host Driver (DHD), Linux monitor network interface * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -59,8 +59,15 @@ int dhd_monitor_uninit(void); #ifndef DHD_MAX_IFS #define DHD_MAX_IFS 16 #endif -#define MON_PRINT(format, ...) printk("DHD-MON: %s " format, __func__, ##__VA_ARGS__) -#define MON_TRACE MON_PRINT + +#define MON_DEBUG 0 +#if MON_DEBUG + #define MON_PRINT(format, ...) printk("DHD-MON: %s " format, __func__, ##__VA_ARGS__) + #define MON_TRACE MON_PRINT +#else + #define MON_PRINT(format, ...) + #define MON_TRACE MON_PRINT +#endif typedef struct monitor_interface { int radiotap_enabled; @@ -89,12 +96,8 @@ static const struct net_device_ops dhd_mon_if_ops = { .ndo_open = dhd_mon_if_open, .ndo_stop = dhd_mon_if_stop, .ndo_start_xmit = dhd_mon_if_subif_start_xmit, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) - .ndo_set_rx_mode = dhd_mon_if_set_multicast_list, -#else .ndo_set_multicast_list = dhd_mon_if_set_multicast_list, -#endif - .ndo_set_mac_address = dhd_mon_if_change_mac, + .ndo_set_mac_address = dhd_mon_if_change_mac, }; /** diff --git a/drivers/net/wireless/bcmdhd/src/wl/sys/wl_roam.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_roam.c new file mode 100644 index 0000000..5b77c5c --- /dev/null +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wl_roam.c @@ -0,0 +1,124 @@ +/* + * Linux Wireless Extensions support + * + * Copyright (C) 1999-2012, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: wl_roam.c 302026 2011-12-09 11:51:50Z $ + */ +#include <typedefs.h> +#include <osl.h> +#include <bcmwifi_channels.h> +#include <wlioctl.h> + +#define WL_DBG(x) + +#define MAX_ROAM_CACHE 100 + +typedef struct { + chanspec_t chanspec; + int ssid_len; + char ssid[36]; +} roam_channel_cache; + +static int n_roam_cache = 0; +static int roam_band = WLC_BAND_AUTO; +static roam_channel_cache roam_cache[MAX_ROAM_CACHE]; + +void set_roam_band(int band) +{ + roam_band = band; +} + +void reset_roam_cache(void) +{ + n_roam_cache = 0; +} + +void add_roam_cache(wl_bss_info_t *bi) +{ + int i; + uint8 channel; + + if (n_roam_cache == MAX_ROAM_CACHE) + return; + + for (i = 0; i < n_roam_cache; i++) { + if ((roam_cache[i].ssid_len == bi->SSID_len) && + (roam_cache[i].chanspec == bi->chanspec) && + (memcmp(roam_cache[i].ssid, bi->SSID, bi->SSID_len) == 0)) { + /* identical one found, just return */ + return; + } + } + + roam_cache[n_roam_cache].ssid_len = bi->SSID_len; + channel = (bi->ctl_ch == 0) ? CHSPEC_CHANNEL(bi->chanspec) : bi->ctl_ch; + roam_cache[n_roam_cache].chanspec = WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE | (channel <= 14 ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G) | channel; + memcpy(roam_cache[n_roam_cache].ssid, bi->SSID, bi->SSID_len); + + n_roam_cache++; +} + +int get_roam_channel_list(int target_chan, chanspec_t *channels, const wlc_ssid_t *ssid) +{ + int i, n = 1; + uint band; + + WL_DBG((" %s: %02d\n", __FUNCTION__, target_chan)); + + if (target_chan <= 14) + band = WL_CHANSPEC_BAND_2G; + else + band = WL_CHANSPEC_BAND_5G; + *channels++ = (target_chan & WL_CHANSPEC_CHAN_MASK) | band | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; + + for(i=0; i<n_roam_cache; i++) { + chanspec_t ch = roam_cache[i].chanspec; + if ((roam_cache[i].ssid_len == ssid->SSID_len) && + ((ch & WL_CHANSPEC_CHAN_MASK) != target_chan) && + ((roam_band == WLC_BAND_AUTO) || ((roam_band == WLC_BAND_2G) && CHSPEC_IS2G(ch)) || ((roam_band == WLC_BAND_5G) && CHSPEC_IS5G(ch))) && + (memcmp(roam_cache[i].ssid, ssid->SSID, ssid->SSID_len) == 0)) { + /* match found, add it */ + *channels = ch & WL_CHANSPEC_CHAN_MASK; + if (*channels <= 14) + *channels |= WL_CHANSPEC_BAND_2G | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; + else + *channels |= WL_CHANSPEC_BAND_5G | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; + WL_DBG((" %s: %02d 0x%04X\n", __FUNCTION__, ch & WL_CHANSPEC_CHAN_MASK, *channels)); + channels++; n++; + } + } + + return n; +} + + +void print_roam_cache(void) +{ + int i; + + WL_DBG((" %d cache\n", n_roam_cache)); + + for (i = 0; i < n_roam_cache; i++) { + roam_cache[i].ssid[roam_cache[i].ssid_len] = 0; + WL_DBG(("0x%02X %02d %s\n", roam_cache[i].chanspec, roam_cache[i].ssid_len, roam_cache[i].ssid)); + } +} diff --git a/drivers/net/wireless/bcmdhd/wldev_common.c b/drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.c index ef51480..516da89 100755..100644 --- a/drivers/net/wireless/bcmdhd/wldev_common.c +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.c @@ -1,14 +1,14 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -31,6 +31,7 @@ #include <wldev_common.h> #include <bcmutils.h> +#include <wl_iw.h> #define htod32(i) i #define htod16(i) i @@ -41,10 +42,16 @@ #define WLDEV_ERROR(args) \ do { \ - printk(KERN_ERR "WLDEV-ERROR) %s : ", __func__); \ + printk(KERN_ERR "WLDEV-INFO2) %s : ", __func__); \ printk args; \ } while (0) +#define WLDEV_INFO(args) \ + do { \ + printk(KERN_INFO "WLDEV-INFO) %s : ", __func__); \ + printk args; \ + } while (0) + extern int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd); s32 wldev_ioctl( @@ -105,10 +112,7 @@ s32 wldev_iovar_setbuf( mutex_lock(buf_sync); } iovar_len = wldev_mkiovar(iovar_name, param, paramlen, buf, buflen); - if (iovar_len > 0) - ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); - else - ret = BCME_BUFTOOSHORT; + ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); if (buf_sync) mutex_unlock(buf_sync); return ret; @@ -226,9 +230,11 @@ s32 wldev_iovar_setbuf_bsscfg( if (iovar_len > 0) ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); else { - ret = BCME_BUFTOOSHORT; + if (buf_sync) { + mutex_unlock(buf_sync); + } + return BCME_BUFTOOSHORT; } - if (buf_sync) { mutex_unlock(buf_sync); } @@ -295,6 +301,10 @@ int wldev_get_rssi( return error; *prssi = dtoh32(scb_val.val); + /* when the return value is zero. skip overrinding code */ + if (*prssi > WL_IW_RSSI_INVALID) + *prssi = WL_IW_RSSI_MAXVAL; + return error; } @@ -328,8 +338,6 @@ int wldev_set_band( if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) { error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), 1); - if (!error) - dhd_bus_band_set(dev, band); } return error; } @@ -359,20 +367,20 @@ int wldev_set_country( __FUNCTION__, error)); return error; } - cspec.rev = -1; - memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); - memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); - get_customized_country_code((char *)&cspec.country_abbrev, &cspec); - error = wldev_iovar_setbuf(dev, "country", &cspec, sizeof(cspec), - smbuf, sizeof(smbuf), NULL); - if (error < 0) { - WLDEV_ERROR(("%s: set country for %s as %s rev %d failed\n", - __FUNCTION__, country_code, cspec.ccode, cspec.rev)); - return error; - } - dhd_bus_country_set(dev, &cspec); - WLDEV_ERROR(("%s: set country for %s as %s rev %d\n", + } + cspec.rev = -1; + memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); + memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); + get_customized_country_code((char *)&cspec.country_abbrev, &cspec); + error = wldev_iovar_setbuf(dev, "country", &cspec, sizeof(cspec), + smbuf, sizeof(smbuf), NULL); + if (error < 0) { + WLDEV_ERROR(("%s: set country for %s as %s rev %d failed\n", __FUNCTION__, country_code, cspec.ccode, cspec.rev)); + return error; } + dhd_bus_country_set(dev, &cspec); + WLDEV_INFO(("%s: set country for %s as %s rev %d\n", + __FUNCTION__, country_code, cspec.ccode, cspec.rev)); return 0; } diff --git a/drivers/net/wireless/bcmdhd/wldev_common.h b/drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.h index f9bf425..6f7f1d6 100755..100644 --- a/drivers/net/wireless/bcmdhd/wldev_common.h +++ b/drivers/net/wireless/bcmdhd/src/wl/sys/wldev_common.h @@ -1,14 +1,14 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2012, Broadcom Corporation - * + * Copyright (C) 1999-2011, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,7 +16,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -85,7 +85,6 @@ s32 wldev_iovar_setint_bsscfg( extern void get_customized_country_code(char *country_iso_code, wl_country_t *cspec); extern void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec); -extern void dhd_bus_band_set(struct net_device *dev, uint band); extern int wldev_set_country(struct net_device *dev, char *country_code); extern int net_os_wake_lock(struct net_device *dev); extern int net_os_wake_unlock(struct net_device *dev); @@ -93,9 +92,12 @@ extern int net_os_wake_lock_timeout(struct net_device *dev); extern int net_os_wake_lock_timeout_enable(struct net_device *dev, int val); extern int net_os_set_dtim_skip(struct net_device *dev, int val); extern int net_os_set_suspend_disable(struct net_device *dev, int val); -extern int net_os_set_suspend(struct net_device *dev, int val, int force); +extern int net_os_set_suspend(struct net_device *dev, int val); extern int wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, int max, int *bytes_left); +#if defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) +int net_os_wake_lock_timeout_for_pno(struct net_device *dev, int sec); +#endif /* Get the link speed from dongle, speed is in kpbs */ int wldev_get_link_speed(struct net_device *dev, int *plink_speed); diff --git a/drivers/net/wireless/bcmdhd/wl_roam.c b/drivers/net/wireless/bcmdhd/wl_roam.c deleted file mode 100755 index 708fb3b..0000000 --- a/drivers/net/wireless/bcmdhd/wl_roam.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Linux roam cache - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: wl_roam.c 334946 2012-05-24 20:38:00Z $ - */ - -#include <typedefs.h> -#include <osl.h> -#include <bcmwifi_channels.h> -#include <wlioctl.h> - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -#include <wldev_common.h> - -#define WL_ERROR(x) printk x -#endif - -#define WL_DBG(x) - -#define MAX_ROAM_CACHE 100 - -typedef struct { - chanspec_t chanspec; - int ssid_len; - char ssid[36]; -} roam_channel_cache; - -static int n_roam_cache = 0; -static int roam_band = WLC_BAND_AUTO; -static roam_channel_cache roam_cache[MAX_ROAM_CACHE]; -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -static int roamscan_mode = 0; -#endif - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) -int get_roamscan_mode(struct net_device *dev, int *mode) -{ - *mode = roamscan_mode; - - return 0; -} - -int set_roamscan_mode(struct net_device *dev, int mode) -{ - int error = 0; - roamscan_mode = mode; - n_roam_cache = 0; - - error = wldev_iovar_setint(dev, "roamscan_mode", mode); - if (error) { - WL_ERROR(("Failed to set roamscan mode to %d, error = %d\n", mode, error)); - } - - return error; -} - -int get_roamscan_channel_list(struct net_device *dev, unsigned char channels[]) -{ - int n = 0; - - if (roamscan_mode) { - for (n = 0; n < n_roam_cache; n++) { - channels[n] = roam_cache[n].chanspec & WL_CHANSPEC_CHAN_MASK; - - WL_DBG(("%s: channel[%d] - [%02d] \n", __FUNCTION__, n, channels[n])); - } - } - - return n; -} - -int set_roamscan_channel_list(struct net_device *dev, - unsigned char n, unsigned char channels[], int ioctl_ver) -{ - int i; - int error; - struct { - int n; - chanspec_t channels[20]; - } channel_list; - char iobuf[200]; - uint band, band2G, band5G, bw; - roamscan_mode = 1; - - if (n > 20) - n = 20; - -#ifdef D11AC_IOTYPES - if (ioctl_ver == 1) { - /* legacy chanspec */ - band2G = WL_LCHANSPEC_BAND_2G; - band5G = WL_LCHANSPEC_BAND_5G; - bw = WL_LCHANSPEC_BW_20 | WL_LCHANSPEC_CTL_SB_NONE; - } else { - band2G = WL_CHANSPEC_BAND_2G; - band5G = WL_CHANSPEC_BAND_5G; - bw = WL_CHANSPEC_BW_20; - } -#else - band2G = WL_CHANSPEC_BAND_2G; - band5G = WL_CHANSPEC_BAND_5G; - bw = WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; -#endif /* D11AC_IOTYPES */ - - for (i = 0; i < n; i++) { - chanspec_t chanspec; - - if (channels[i] <= 14) { - chanspec = band2G | bw | channels[i]; - } else { - chanspec = band5G | bw | channels[i]; - } - roam_cache[i].chanspec = chanspec; - channel_list.channels[i] = chanspec; - - WL_DBG(("%s: channel[%d] - [%02d] \n", __FUNCTION__, i, channels[i])); - } - - n_roam_cache = n; - channel_list.n = n; - - error = wldev_iovar_setbuf(dev, "roamscan_channels", &channel_list, - sizeof(channel_list), iobuf, sizeof(iobuf), NULL); - if (error) { - WL_ERROR(("Failed to set roamscan channels, error = %d\n", error)); - } - - return error; -} -#endif /* WES_SUPPORT */ - -void set_roam_band(int band) -{ - roam_band = band; -} - -void reset_roam_cache(void) -{ -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - if (roamscan_mode) - return; -#endif - - n_roam_cache = 0; -} - -void add_roam_cache(wl_bss_info_t *bi) -{ - int i; - uint8 channel; - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - if (roamscan_mode) - return; -#endif - - if (n_roam_cache == MAX_ROAM_CACHE) - return; - - for (i = 0; i < n_roam_cache; i++) { - if ((roam_cache[i].ssid_len == bi->SSID_len) && - (roam_cache[i].chanspec == bi->chanspec) && - (memcmp(roam_cache[i].ssid, bi->SSID, bi->SSID_len) == 0)) { - /* identical one found, just return */ - return; - } - } - - roam_cache[n_roam_cache].ssid_len = bi->SSID_len; - channel = (bi->ctl_ch == 0) ? CHSPEC_CHANNEL(bi->chanspec) : bi->ctl_ch; - roam_cache[n_roam_cache].chanspec = - WL_CHANSPEC_BW_20 | - (channel <= 14 ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G) | - channel; - memcpy(roam_cache[n_roam_cache].ssid, bi->SSID, bi->SSID_len); - - n_roam_cache++; -} - -int get_roam_channel_list(int target_chan, - chanspec_t *channels, const wlc_ssid_t *ssid, int ioctl_ver) -{ - int i, n = 1; - uint band, band2G, band5G, bw; - -#ifdef D11AC_IOTYPES - if (ioctl_ver == 1) { - /* legacy chanspec */ - band2G = WL_LCHANSPEC_BAND_2G; - band5G = WL_LCHANSPEC_BAND_5G; - bw = WL_LCHANSPEC_BW_20 | WL_LCHANSPEC_CTL_SB_NONE; - } else { - band2G = WL_CHANSPEC_BAND_2G; - band5G = WL_CHANSPEC_BAND_5G; - bw = WL_CHANSPEC_BW_20; - } -#else - band2G = WL_CHANSPEC_BAND_2G; - band5G = WL_CHANSPEC_BAND_5G; - bw = WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; -#endif /* D11AC_IOTYPES */ - - if (target_chan <= 14) - band = band2G; - else - band = band5G; - *channels = (target_chan & WL_CHANSPEC_CHAN_MASK) | band | bw; - WL_DBG((" %s: %02d 0x%04X\n", __FUNCTION__, target_chan, *channels)); - ++channels; - -#if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) - if (roamscan_mode) { - for (i = 0; i < n_roam_cache; i++) { - if ((roam_cache[i].chanspec & WL_CHANSPEC_CHAN_MASK) != target_chan) { - *channels = roam_cache[i].chanspec & WL_CHANSPEC_CHAN_MASK; - WL_DBG((" %s: %02d\n", __FUNCTION__, *channels)); - if (*channels <= 14) - *channels |= band2G | bw; - else - *channels |= band5G | bw; - - channels++; - n++; - } - } - - return n; - } -#endif /* WES_SUPPORT */ - - for (i = 0; i < n_roam_cache; i++) { - chanspec_t ch = roam_cache[i].chanspec; - if ((roam_cache[i].ssid_len == ssid->SSID_len) && - ((ch & WL_CHANSPEC_CHAN_MASK) != target_chan) && - ((roam_band == WLC_BAND_AUTO) || - ((roam_band == WLC_BAND_2G) && CHSPEC_IS2G(ch)) || - ((roam_band == WLC_BAND_5G) && CHSPEC_IS5G(ch))) && - (memcmp(roam_cache[i].ssid, ssid->SSID, ssid->SSID_len) == 0)) { - /* match found, add it */ - *channels = ch & WL_CHANSPEC_CHAN_MASK; - if (*channels <= 14) - *channels |= band2G | bw; - else - *channels |= band5G | bw; - - WL_DBG((" %s: %02d 0x%04X\n", __FUNCTION__, - ch & WL_CHANSPEC_CHAN_MASK, *channels)); - - channels++; n++; - } - } - - return n; -} - - -void print_roam_cache(void) -{ - int i; - - WL_DBG((" %d cache\n", n_roam_cache)); - - for (i = 0; i < n_roam_cache; i++) { - roam_cache[i].ssid[roam_cache[i].ssid_len] = 0; - WL_DBG(("0x%02X %02d %s\n", roam_cache[i].chanspec, - roam_cache[i].ssid_len, roam_cache[i].ssid)); - } -} |