From e74e8cdc8d788054c493132327cbeb969a6c95cd Mon Sep 17 00:00:00 2001 From: FAROVITUS Date: Wed, 22 Apr 2020 21:12:51 +0300 Subject: [PATCH] import G96xFXXU8DTC5 OSRC Signed-off-by: FAROVITUS --- .../boot/dts/exynos/exynos9810-pinctrl.dtsi | 10 + .../boot/dts/exynos/exynos9810-rmem.dtsi | 5 + .../configs/exynos9810-star2lte_defconfig | 1 + .../configs/exynos9810-starlte_defconfig | 1 + drivers/android/binder_alloc.c | 8 +- drivers/hid/hid-axff.c | 11 +- drivers/hid/hid-dr.c | 12 +- drivers/hid/hid-emsff.c | 12 +- drivers/hid/hid-gaff.c | 12 +- drivers/hid/hid-holtekff.c | 12 +- drivers/hid/hid-lg2ff.c | 12 +- drivers/hid/hid-lg3ff.c | 11 +- drivers/hid/hid-lg4ff.c | 11 +- drivers/hid/hid-lgff.c | 11 +- drivers/hid/hid-logitech-hidpp.c | 11 +- drivers/hid/hid-sony.c | 12 +- drivers/hid/hid-tmff.c | 12 +- drivers/hid/hid-zpff.c | 12 +- drivers/hid/uhid.c | 2 +- drivers/hid/usbhid/hiddev.c | 12 + drivers/input/ff-memless.c | 9 + drivers/input/touchscreen/sec_ts/sec_ts.c | 2 +- .../input/touchscreen/sec_ts/y771/sec_ts.c | 2 +- .../fimc-is2/include/fimc-is-metadata.h | 5 +- .../platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c | 13 + .../platform/exynos/mfc/s5p_mfc_watchdog.c | 59 + .../platform/exynos/repeater/repeater_dev.c | 19 +- .../exynos/tsmux/cmu_mfc/exynos9810_cmu_mfc.h | 81 + .../media/platform/exynos/tsmux/tsmux_dev.c | 568 ++++- .../media/platform/exynos/tsmux/tsmux_dev.h | 17 + .../media/platform/exynos/tsmux/tsmux_reg.c | 56 + .../media/platform/exynos/tsmux/tsmux_reg.h | 4 + drivers/misc/modem_v1/Kconfig | 4 + drivers/misc/modem_v1/Makefile | 2 + drivers/misc/modem_v1/modem_io_device.c | 4 + drivers/misc/modem_v1/modem_klat.c | 1072 +++++++++ drivers/misc/modem_v1/modem_klat.h | 65 + drivers/net/wireless/bcmdhd_100_15/Makefile | 2 +- .../net/wireless/bcmdhd_100_15/Makefile.kk | 2 +- .../net/wireless/bcmdhd_100_15/Makefile.lp | 2 +- drivers/net/wireless/bcmdhd_100_15/aiutils.c | 2 +- .../wireless/bcmdhd_100_15/bcm_app_utils.c | 2 +- drivers/net/wireless/bcmdhd_100_15/bcmbloom.c | 2 +- drivers/net/wireless/bcmdhd_100_15/bcmevent.c | 2 +- drivers/net/wireless/bcmdhd_100_15/bcmsdh.c | 2 +- .../net/wireless/bcmdhd_100_15/bcmsdh_linux.c | 2 +- .../net/wireless/bcmdhd_100_15/bcmsdh_sdmmc.c | 2 +- .../bcmdhd_100_15/bcmsdh_sdmmc_linux.c | 2 +- .../net/wireless/bcmdhd_100_15/bcmstdlib_s.c | 2 +- drivers/net/wireless/bcmdhd_100_15/bcmutils.c | 2 +- .../wireless/bcmdhd_100_15/bcmwifi_channels.c | 2 +- .../wireless/bcmdhd_100_15/bcmwifi_channels.h | 2 +- .../wireless/bcmdhd_100_15/bcmwifi_rates.h | 2 +- .../wireless/bcmdhd_100_15/bcmwifi_rspec.h | 2 +- drivers/net/wireless/bcmdhd_100_15/bcmxtlv.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd.h | 20 +- .../net/wireless/bcmdhd_100_15/dhd_bitpack.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_bitpack.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_bus.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_cdc.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_cfg80211.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_cfg80211.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_common.c | 2 +- .../wireless/bcmdhd_100_15/dhd_custom_cis.c | 2 +- .../bcmdhd_100_15/dhd_custom_exynos.c | 2 +- .../wireless/bcmdhd_100_15/dhd_custom_gpio.c | 2 +- .../bcmdhd_100_15/dhd_custom_memprealloc.c | 2 +- .../wireless/bcmdhd_100_15/dhd_custom_msm.c | 2 +- .../wireless/bcmdhd_100_15/dhd_custom_sec.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_dbg.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_dbg_ring.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_dbg_ring.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_debug.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_debug.h | 2 +- .../wireless/bcmdhd_100_15/dhd_debug_linux.c | 2 +- .../bcmdhd_100_15/dhd_event_log_filter.c | 2 +- .../bcmdhd_100_15/dhd_event_log_filter.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_flowring.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_flowring.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_ip.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_ip.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_linux.c | 55 +- .../net/wireless/bcmdhd_100_15/dhd_linux.h | 2 +- .../bcmdhd_100_15/dhd_linux_exportfs.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_linux_lb.c | 2 +- .../bcmdhd_100_15/dhd_linux_pktdump.c | 2 +- .../bcmdhd_100_15/dhd_linux_pktdump.h | 2 +- .../bcmdhd_100_15/dhd_linux_platdev.c | 2 +- .../wireless/bcmdhd_100_15/dhd_linux_priv.h | 5 +- .../wireless/bcmdhd_100_15/dhd_linux_sched.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_linux_wq.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_linux_wq.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_mschdbg.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_mschdbg.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_msgbuf.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_pcie.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_pcie.h | 2 +- .../wireless/bcmdhd_100_15/dhd_pcie_linux.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_pktlog.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_pktlog.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_pno.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_pno.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_proto.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_rtt.c | 126 +- drivers/net/wireless/bcmdhd_100_15/dhd_rtt.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_sdio.c | 2 +- .../wireless/bcmdhd_100_15/dhd_sec_feature.h | 2 +- .../net/wireless/bcmdhd_100_15/dhd_statlog.c | 2 +- .../net/wireless/bcmdhd_100_15/dhd_statlog.h | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.c | 2 +- drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.h | 2 +- .../net/wireless/bcmdhd_100_15/dngl_stats.h | 2 +- drivers/net/wireless/bcmdhd_100_15/frag.c | 2 +- drivers/net/wireless/bcmdhd_100_15/frag.h | 2 +- .../net/wireless/bcmdhd_100_15/hnd_pktpool.c | 2 +- drivers/net/wireless/bcmdhd_100_15/hnd_pktq.c | 2 +- drivers/net/wireless/bcmdhd_100_15/hndpmu.c | 2 +- .../wireless/bcmdhd_100_15/include/802.11.h | 201 +- .../wireless/bcmdhd_100_15/include/802.11ax.h | 20 +- .../wireless/bcmdhd_100_15/include/802.11s.h | 2 +- .../wireless/bcmdhd_100_15/include/802.1d.h | 2 +- .../wireless/bcmdhd_100_15/include/802.3.h | 2 +- .../wireless/bcmdhd_100_15/include/aidmp.h | 2 +- .../wireless/bcmdhd_100_15/include/bcm_cfg.h | 2 +- .../bcmdhd_100_15/include/bcm_mpool_pub.h | 2 +- .../wireless/bcmdhd_100_15/include/bcm_ring.h | 4 +- .../wireless/bcmdhd_100_15/include/bcmarp.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmbloom.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmcdc.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmdefs.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmdevs.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmdhcp.h | 2 +- .../bcmdhd_100_15/include/bcmendian.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmeth.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmevent.h | 82 +- .../wireless/bcmdhd_100_15/include/bcmicmp.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmiov.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmip.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmipv6.h | 2 +- .../bcmdhd_100_15/include/bcmmsgbuf.h | 28 +- .../wireless/bcmdhd_100_15/include/bcmpcie.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmsdbus.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmsdh.h | 2 +- .../bcmdhd_100_15/include/bcmsdh_sdmmc.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmsdpcm.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmsdstd.h | 2 +- .../bcmdhd_100_15/include/bcmstdlib_s.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmtcp.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmtlv.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmudp.h | 2 +- .../wireless/bcmdhd_100_15/include/bcmutils.h | 2 +- .../bcmdhd_100_15/include/brcm_nl80211.h | 2 +- .../bcmdhd_100_15/include/dhd_daemon.h | 2 +- .../wireless/bcmdhd_100_15/include/dhdioctl.h | 2 +- .../bcmdhd_100_15/include/dnglevent.h | 2 +- .../wireless/bcmdhd_100_15/include/eapol.h | 2 +- .../wireless/bcmdhd_100_15/include/epivers.h | 12 +- .../net/wireless/bcmdhd_100_15/include/etd.h | 2 +- .../wireless/bcmdhd_100_15/include/ethernet.h | 6 +- .../bcmdhd_100_15/include/event_log.h | 2 +- .../bcmdhd_100_15/include/event_log_payload.h | 2 +- .../bcmdhd_100_15/include/event_log_set.h | 12 +- .../bcmdhd_100_15/include/event_log_tag.h | 59 +- .../bcmdhd_100_15/include/event_trace.h | 2 +- .../net/wireless/bcmdhd_100_15/include/fils.h | 2 +- .../bcmdhd_100_15/include/hnd_armtrap.h | 2 +- .../wireless/bcmdhd_100_15/include/hnd_cons.h | 2 +- .../bcmdhd_100_15/include/hnd_debug.h | 2 +- .../bcmdhd_100_15/include/hnd_pktpool.h | 2 +- .../wireless/bcmdhd_100_15/include/hnd_pktq.h | 2 +- .../wireless/bcmdhd_100_15/include/hnd_trap.h | 2 +- .../wireless/bcmdhd_100_15/include/hndchipc.h | 2 +- .../wireless/bcmdhd_100_15/include/hndlhl.h | 2 +- .../wireless/bcmdhd_100_15/include/hndoobr.h | 2 +- .../wireless/bcmdhd_100_15/include/hndpmu.h | 2 +- .../wireless/bcmdhd_100_15/include/hndsoc.h | 2 +- .../bcmdhd_100_15/include/linux_osl.h | 6 +- .../bcmdhd_100_15/include/linux_pkt.h | 2 +- .../wireless/bcmdhd_100_15/include/linuxver.h | 2 +- .../wireless/bcmdhd_100_15/include/lpflags.h | 2 +- .../net/wireless/bcmdhd_100_15/include/mbo.h | 2 +- .../wireless/bcmdhd_100_15/include/msgtrace.h | 2 +- .../net/wireless/bcmdhd_100_15/include/nan.h | 2 +- .../net/wireless/bcmdhd_100_15/include/osl.h | 2 +- .../wireless/bcmdhd_100_15/include/osl_decl.h | 2 +- .../wireless/bcmdhd_100_15/include/osl_ext.h | 2 +- .../net/wireless/bcmdhd_100_15/include/p2p.h | 2 +- .../include/packed_section_end.h | 2 +- .../include/packed_section_start.h | 2 +- .../wireless/bcmdhd_100_15/include/pcicfg.h | 2 +- .../bcmdhd_100_15/include/pcie_core.h | 2 +- .../bcmdhd_100_15/include/rte_ioctl.h | 2 +- .../wireless/bcmdhd_100_15/include/sbchipc.h | 2 +- .../wireless/bcmdhd_100_15/include/sbconfig.h | 2 +- .../wireless/bcmdhd_100_15/include/sbgci.h | 2 +- .../wireless/bcmdhd_100_15/include/sbhndarm.h | 2 +- .../wireless/bcmdhd_100_15/include/sbhnddma.h | 2 +- .../wireless/bcmdhd_100_15/include/sbpcmcia.h | 2 +- .../wireless/bcmdhd_100_15/include/sbsdio.h | 2 +- .../bcmdhd_100_15/include/sbsdpcmdev.h | 2 +- .../wireless/bcmdhd_100_15/include/sbsocram.h | 2 +- .../wireless/bcmdhd_100_15/include/sbsysmem.h | 2 +- .../net/wireless/bcmdhd_100_15/include/sdio.h | 2 +- .../wireless/bcmdhd_100_15/include/sdioh.h | 2 +- .../wireless/bcmdhd_100_15/include/sdiovar.h | 2 +- .../wireless/bcmdhd_100_15/include/siutils.h | 2 +- .../wireless/bcmdhd_100_15/include/typedefs.h | 2 +- .../net/wireless/bcmdhd_100_15/include/vlan.h | 6 +- .../bcmdhd_100_15/include/wlfc_proto.h | 2 +- .../wireless/bcmdhd_100_15/include/wlioctl.h | 1926 +++++++++++++++-- .../bcmdhd_100_15/include/wlioctl_defs.h | 136 +- .../bcmdhd_100_15/include/wlioctl_utils.h | 2 +- .../net/wireless/bcmdhd_100_15/include/wpa.h | 18 +- .../net/wireless/bcmdhd_100_15/linux_osl.c | 8 +- .../wireless/bcmdhd_100_15/linux_osl_priv.h | 2 +- .../net/wireless/bcmdhd_100_15/linux_pkt.c | 2 +- drivers/net/wireless/bcmdhd_100_15/otpdefs.h | 2 +- .../net/wireless/bcmdhd_100_15/pcie_core.c | 2 +- drivers/net/wireless/bcmdhd_100_15/sbutils.c | 2 +- drivers/net/wireless/bcmdhd_100_15/siutils.c | 2 +- .../net/wireless/bcmdhd_100_15/siutils_priv.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_android.c | 6 +- .../net/wireless/bcmdhd_100_15/wl_android.h | 2 +- drivers/net/wireless/bcmdhd_100_15/wl_bam.c | 2 +- drivers/net/wireless/bcmdhd_100_15/wl_bam.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_bigdata.c | 2 +- .../net/wireless/bcmdhd_100_15/wl_bigdata.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfg80211.c | 77 +- .../net/wireless/bcmdhd_100_15/wl_cfg80211.h | 4 +- .../wireless/bcmdhd_100_15/wl_cfg_btcoex.c | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfgnan.c | 410 ++-- .../net/wireless/bcmdhd_100_15/wl_cfgnan.h | 24 +- .../net/wireless/bcmdhd_100_15/wl_cfgp2p.c | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfgp2p.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfgscan.c | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfgscan.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_cfgvendor.c | 63 +- .../net/wireless/bcmdhd_100_15/wl_cfgvendor.h | 2 +- .../net/wireless/bcmdhd_100_15/wl_linux_mon.c | 2 +- drivers/net/wireless/bcmdhd_100_15/wl_roam.c | 2 +- .../net/wireless/bcmdhd_100_15/wlc_types.h | 2 +- .../net/wireless/bcmdhd_100_15/wldev_common.c | 2 +- .../net/wireless/bcmdhd_100_15/wldev_common.h | 2 +- drivers/tty/serial/samsung.c | 148 +- drivers/tty/serial/samsung.h | 6 +- drivers/usb/core/file.c | 10 +- drivers/usb/gadget/function/u_ether.c | 38 +- fs/sdcardfs/q/dentry.c | 2 + fs/sdcardfs/q/lookup.c | 2 - include/linux/netfilter/xt_domainfilter.h | 35 + include/linux/serial_s3c.h | 13 + include/media/exynos_tsmux.h | 5 + include/net/tcp.h | 3 + .../uapi/linux/netfilter/xt_domainfilter.h | 35 + net/key/af_key.c | 40 +- net/netfilter/Makefile | 1 + net/netfilter/xt_domainfilter.c | 152 ++ security/samsung/defex_lsm/Makefile | 2 +- security/samsung/defex_lsm/defex_ht.c | 289 ++- security/samsung/defex_lsm/defex_priv.c | 25 +- security/samsung/defex_lsm/defex_procs.c | 72 +- security/samsung/defex_lsm/defex_rules.c | 1 - security/samsung/defex_lsm/defex_sysfs.c | 5 - .../defex_lsm/include/defex_internal.h | 37 +- .../samsung/defex_lsm/include/defex_rules.h | 13 +- sound/core/timer.c | 5 +- sound/soc/samsung/abox/abox_rdma.c | 11 +- sound/soc/samsung/abox/abox_wdma.c | 11 +- 268 files changed, 5581 insertions(+), 1228 deletions(-) create mode 100644 drivers/media/platform/exynos/tsmux/cmu_mfc/exynos9810_cmu_mfc.h create mode 100644 drivers/misc/modem_v1/modem_klat.c create mode 100644 drivers/misc/modem_v1/modem_klat.h create mode 100644 include/linux/netfilter/xt_domainfilter.h create mode 100644 include/uapi/linux/netfilter/xt_domainfilter.h create mode 100644 net/netfilter/xt_domainfilter.c diff --git a/arch/arm64/boot/dts/exynos/exynos9810-pinctrl.dtsi b/arch/arm64/boot/dts/exynos/exynos9810-pinctrl.dtsi index 4c5233e9e8db..d10b5172f940 100644 --- a/arch/arm64/boot/dts/exynos/exynos9810-pinctrl.dtsi +++ b/arch/arm64/boot/dts/exynos/exynos9810-pinctrl.dtsi @@ -117,6 +117,16 @@ samsung,pin-val = <1>; }; + uart1_bus_tx_dat: uart1-bus-tx-dat { + samsung,pins = "gpq0-1"; + samsung,pin-val = <1>; + }; + + uart1_bus_tx_con: uart1-bus-tx-con { + samsung,pins = "gpq0-1"; + samsung,pin-function = <1>; + }; + dwmmc2_cd_ext_irq: dwmmc2_cd_ext_irq { samsung,pins = "gpa1-5"; samsung,pin-function = <0xf>; diff --git a/arch/arm64/boot/dts/exynos/exynos9810-rmem.dtsi b/arch/arm64/boot/dts/exynos/exynos9810-rmem.dtsi index 81161a12f531..82b1c66ca55f 100644 --- a/arch/arm64/boot/dts/exynos/exynos9810-rmem.dtsi +++ b/arch/arm64/boot/dts/exynos/exynos9810-rmem.dtsi @@ -33,6 +33,11 @@ reg = <0x0 0xF9200000 0x2000000>; }; + zswap_debug { + compatible = "exynos,zswap_debug"; + reg = <0x0 0x91300000 0x1000>; + }; + sec_debug_magic { compatible = "exynos,sec_debug_magic"; reg = <0x0 0x80000000 0x1000>; diff --git a/arch/arm64/configs/exynos9810-star2lte_defconfig b/arch/arm64/configs/exynos9810-star2lte_defconfig index 6b727cb721b6..1256ddd35030 100644 --- a/arch/arm64/configs/exynos9810-star2lte_defconfig +++ b/arch/arm64/configs/exynos9810-star2lte_defconfig @@ -1433,6 +1433,7 @@ CONFIG_CP_RAM_LOGGING=y # CONFIG_HW_REV_DETECT is not set CONFIG_MODEM_IF_QOS=y CONFIG_MODEM_IF_NET_GRO=y +CONFIG_KLAT=y # # Samsung Modem Interface Driver for Memory-type Interface diff --git a/arch/arm64/configs/exynos9810-starlte_defconfig b/arch/arm64/configs/exynos9810-starlte_defconfig index 331a5b5919f1..7fc0af46fa6b 100644 --- a/arch/arm64/configs/exynos9810-starlte_defconfig +++ b/arch/arm64/configs/exynos9810-starlte_defconfig @@ -1433,6 +1433,7 @@ CONFIG_CP_RAM_LOGGING=y # CONFIG_HW_REV_DETECT is not set CONFIG_MODEM_IF_QOS=y CONFIG_MODEM_IF_NET_GRO=y +CONFIG_KLAT=y # # Samsung Modem Interface Driver for Memory-type Interface diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index 56887209d4dd..3cff8b41695c 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -475,12 +475,12 @@ static struct binder_buffer *binder_alloc_new_buf_locked( buffer->extra_buffers_size = extra_buffers_size; if (is_async) { alloc->free_async_space -= size + sizeof(struct binder_buffer); - if ((system_server_pid == alloc->pid) && (alloc->free_async_space <= 102400)) { // 100K - pr_info("%d: [free_size<100K] binder_alloc_buf size %zd async free %zd\n", + if ((system_server_pid == alloc->pid) && (alloc->free_async_space <= 153600)) { // 150K + pr_info("%d: [free_size<150K] binder_alloc_buf size %zd async free %zd\n", alloc->pid, size, alloc->free_async_space); } - if ((system_server_pid == alloc->pid) && (size >= 204800)) { // 200K - pr_info("%d: [alloc_size>200K] binder_alloc_buf size %zd async free %zd\n", + if ((system_server_pid == alloc->pid) && (size >= 122880)) { // 120K + pr_info("%d: [alloc_size>120K] binder_alloc_buf size %zd async free %zd\n", alloc->pid, size, alloc->free_async_space); } binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, diff --git a/drivers/hid/hid-axff.c b/drivers/hid/hid-axff.c index a594e478a1e2..843aed4dec80 100644 --- a/drivers/hid/hid-axff.c +++ b/drivers/hid/hid-axff.c @@ -75,13 +75,20 @@ static int axff_init(struct hid_device *hid) { struct axff_device *axff; struct hid_report *report; - struct hid_input *hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + struct hid_input *hidinput; struct list_head *report_list =&hid->report_enum[HID_OUTPUT_REPORT].report_list; - struct input_dev *dev = hidinput->input; + struct input_dev *dev; int field_count = 0; int i, j; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + dev = hidinput->input; + if (list_empty(report_list)) { hid_err(hid, "no output reports found\n"); return -ENODEV; diff --git a/drivers/hid/hid-dr.c b/drivers/hid/hid-dr.c index 818ea7d93533..309969b8dc2e 100644 --- a/drivers/hid/hid-dr.c +++ b/drivers/hid/hid-dr.c @@ -87,13 +87,19 @@ static int drff_init(struct hid_device *hid) { struct drff_device *drff; struct hid_report *report; - struct hid_input *hidinput = list_first_entry(&hid->inputs, - struct hid_input, list); + struct hid_input *hidinput; struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; - struct input_dev *dev = hidinput->input; + struct input_dev *dev; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + dev = hidinput->input; + if (list_empty(report_list)) { hid_err(hid, "no output reports found\n"); return -ENODEV; diff --git a/drivers/hid/hid-emsff.c b/drivers/hid/hid-emsff.c index d82d75bb11f7..80f9a02dfa69 100644 --- a/drivers/hid/hid-emsff.c +++ b/drivers/hid/hid-emsff.c @@ -59,13 +59,19 @@ static int emsff_init(struct hid_device *hid) { struct emsff_device *emsff; struct hid_report *report; - struct hid_input *hidinput = list_first_entry(&hid->inputs, - struct hid_input, list); + struct hid_input *hidinput; struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; - struct input_dev *dev = hidinput->input; + struct input_dev *dev; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + dev = hidinput->input; + if (list_empty(report_list)) { hid_err(hid, "no output reports found\n"); return -ENODEV; diff --git a/drivers/hid/hid-gaff.c b/drivers/hid/hid-gaff.c index 2d8cead3adca..5a02c50443cb 100644 --- a/drivers/hid/hid-gaff.c +++ b/drivers/hid/hid-gaff.c @@ -77,14 +77,20 @@ static int gaff_init(struct hid_device *hid) { struct gaff_device *gaff; struct hid_report *report; - struct hid_input *hidinput = list_entry(hid->inputs.next, - struct hid_input, list); + struct hid_input *hidinput; struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; struct list_head *report_ptr = report_list; - struct input_dev *dev = hidinput->input; + struct input_dev *dev; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + if (list_empty(report_list)) { hid_err(hid, "no output reports found\n"); return -ENODEV; diff --git a/drivers/hid/hid-holtekff.c b/drivers/hid/hid-holtekff.c index 9325545fc3ae..3e84551cca9c 100644 --- a/drivers/hid/hid-holtekff.c +++ b/drivers/hid/hid-holtekff.c @@ -140,13 +140,19 @@ static int holtekff_init(struct hid_device *hid) { struct holtekff_device *holtekff; struct hid_report *report; - struct hid_input *hidinput = list_entry(hid->inputs.next, - struct hid_input, list); + struct hid_input *hidinput; struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; - struct input_dev *dev = hidinput->input; + struct input_dev *dev; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + if (list_empty(report_list)) { hid_err(hid, "no output report found\n"); return -ENODEV; diff --git a/drivers/hid/hid-lg2ff.c b/drivers/hid/hid-lg2ff.c index 0e3fb1a7e421..6909d9c2fc67 100644 --- a/drivers/hid/hid-lg2ff.c +++ b/drivers/hid/hid-lg2ff.c @@ -62,11 +62,17 @@ int lg2ff_init(struct hid_device *hid) { struct lg2ff_device *lg2ff; struct hid_report *report; - struct hid_input *hidinput = list_entry(hid->inputs.next, - struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; int error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + /* Check that the report looks ok */ report = hid_validate_values(hid, HID_OUTPUT_REPORT, 0, 0, 7); if (!report) diff --git a/drivers/hid/hid-lg3ff.c b/drivers/hid/hid-lg3ff.c index 8c2da183d3bc..acf739fc4060 100644 --- a/drivers/hid/hid-lg3ff.c +++ b/drivers/hid/hid-lg3ff.c @@ -129,12 +129,19 @@ static const signed short ff3_joystick_ac[] = { int lg3ff_init(struct hid_device *hid) { - struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; const signed short *ff_bits = ff3_joystick_ac; int error; int i; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + /* Check that the report looks ok */ if (!hid_validate_values(hid, HID_OUTPUT_REPORT, 0, 0, 35)) return -ENODEV; diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c index 1fc12e357035..a37a60725514 100644 --- a/drivers/hid/hid-lg4ff.c +++ b/drivers/hid/hid-lg4ff.c @@ -1261,8 +1261,8 @@ static int lg4ff_handle_multimode_wheel(struct hid_device *hid, u16 *real_produc int lg4ff_init(struct hid_device *hid) { - struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; struct hid_report *report = list_entry(report_list->next, struct hid_report, list); const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor); @@ -1274,6 +1274,13 @@ int lg4ff_init(struct hid_device *hid) int mmode_ret, mmode_idx = -1; u16 real_product_id; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + /* Check that the report looks ok */ if (!hid_validate_values(hid, HID_OUTPUT_REPORT, 0, 0, 7)) return -1; diff --git a/drivers/hid/hid-lgff.c b/drivers/hid/hid-lgff.c index e1394af0ae7b..1871cdcd1e0a 100644 --- a/drivers/hid/hid-lgff.c +++ b/drivers/hid/hid-lgff.c @@ -127,12 +127,19 @@ static void hid_lgff_set_autocenter(struct input_dev *dev, u16 magnitude) int lgff_init(struct hid_device* hid) { - struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; const signed short *ff_bits = ff_joystick; int error; int i; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + /* Check that the report looks ok */ if (!hid_validate_values(hid, HID_OUTPUT_REPORT, 0, 0, 7)) return -ENODEV; diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index 2e2515a4c070..478c91a78e84 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c @@ -1229,8 +1229,8 @@ static void hidpp_ff_destroy(struct ff_device *ff) static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) { struct hid_device *hid = hidpp->hid_dev; - struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor); const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice); struct ff_device *ff; @@ -1239,6 +1239,13 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) int error, j, num_slots; u8 version; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + if (!dev) { hid_err(hid, "Struct input_dev not set!\n"); return -EINVAL; diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index d03203a82e8f..66fcdf19c493 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -2159,9 +2159,15 @@ static int sony_play_effect(struct input_dev *dev, void *data, static int sony_init_ff(struct sony_sc *sc) { - struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, - struct hid_input, list); - struct input_dev *input_dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *input_dev; + + if (list_empty(&sc->hdev->inputs)) { + hid_err(sc->hdev, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(sc->hdev->inputs.next, struct hid_input, list); + input_dev = hidinput->input; input_set_capability(input_dev, EV_FF, FF_RUMBLE); return input_ff_create_memless(input_dev, NULL, sony_play_effect); diff --git a/drivers/hid/hid-tmff.c b/drivers/hid/hid-tmff.c index b83376077d72..9e908d94cc4c 100644 --- a/drivers/hid/hid-tmff.c +++ b/drivers/hid/hid-tmff.c @@ -126,12 +126,18 @@ static int tmff_init(struct hid_device *hid, const signed short *ff_bits) struct tmff_device *tmff; struct hid_report *report; struct list_head *report_list; - struct hid_input *hidinput = list_entry(hid->inputs.next, - struct hid_input, list); - struct input_dev *input_dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *input_dev; int error; int i; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + input_dev = hidinput->input; + tmff = kzalloc(sizeof(struct tmff_device), GFP_KERNEL); if (!tmff) return -ENOMEM; diff --git a/drivers/hid/hid-zpff.c b/drivers/hid/hid-zpff.c index a29756c6ca02..4e7e01be99b1 100644 --- a/drivers/hid/hid-zpff.c +++ b/drivers/hid/hid-zpff.c @@ -66,11 +66,17 @@ static int zpff_init(struct hid_device *hid) { struct zpff_device *zpff; struct hid_report *report; - struct hid_input *hidinput = list_entry(hid->inputs.next, - struct hid_input, list); - struct input_dev *dev = hidinput->input; + struct hid_input *hidinput; + struct input_dev *dev; int i, error; + if (list_empty(&hid->inputs)) { + hid_err(hid, "no inputs found\n"); + return -ENODEV; + } + hidinput = list_entry(hid->inputs.next, struct hid_input, list); + dev = hidinput->input; + for (i = 0; i < 4; i++) { report = hid_validate_values(hid, HID_OUTPUT_REPORT, 0, i, 1); if (!report) diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index df174b5be2d5..cbe2c499057a 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c @@ -193,7 +193,7 @@ static int __uhid_report_queue_and_wait(struct uhid_device *uhid, ret = wait_event_interruptible_timeout(uhid->report_wait, !uhid->report_running || !uhid->running, - 10/*5 * HZ*/); // from 5000 to 10 due to BT stuck when connecting apple magic mouse + 5 * HZ); if (!ret || !uhid->running || uhid->report_running) ret = -EIO; else if (ret < 0) diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 8fd2ffa831b8..e848cdecb277 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -308,6 +308,14 @@ static int hiddev_open(struct inode *inode, struct file *file) spin_unlock_irq(&list->hiddev->list_lock); mutex_lock(&hiddev->existancelock); + /* + * recheck exist with existance lock held to + * avoid opening a disconnected device + */ + if (!list->hiddev->exist) { + res = -ENODEV; + goto bail_unlock; + } if (!list->hiddev->open++) if (list->hiddev->exist) { struct hid_device *hid = hiddev->hid; @@ -322,6 +330,10 @@ static int hiddev_open(struct inode *inode, struct file *file) return 0; bail_unlock: mutex_unlock(&hiddev->existancelock); + + spin_lock_irq(&list->hiddev->list_lock); + list_del(&list->node); + spin_unlock_irq(&list->hiddev->list_lock); bail: file->private_data = NULL; vfree(list); diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index fcc6c3368182..180808db2a23 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c @@ -501,6 +501,15 @@ static void ml_ff_destroy(struct ff_device *ff) { struct ml_device *ml = ff->private; + /* + * Even though we stop all playing effects when tearing down + * an input device (via input_device_flush() that calls into + * input_ff_flush() that stops and erases all effects), we + * do not actually stop the timer, and therefore we should + * do it here. + */ + del_timer_sync(&ml->timer); + kfree(ml->private); } diff --git a/drivers/input/touchscreen/sec_ts/sec_ts.c b/drivers/input/touchscreen/sec_ts/sec_ts.c index 25c078ad1a7a..8474870944f6 100644 --- a/drivers/input/touchscreen/sec_ts/sec_ts.c +++ b/drivers/input/touchscreen/sec_ts/sec_ts.c @@ -3202,7 +3202,7 @@ out: static int sec_ts_pm_suspend(struct device *dev) { struct sec_ts_data *ts = dev_get_drvdata(dev); -#ifdef USE_OPEN_CLOSE +#if 0//def USE_OPEN_CLOSE int retval; if (ts->input_dev) { diff --git a/drivers/input/touchscreen/sec_ts/y771/sec_ts.c b/drivers/input/touchscreen/sec_ts/y771/sec_ts.c index c50901df5c11..a281153cc1ac 100644 --- a/drivers/input/touchscreen/sec_ts/y771/sec_ts.c +++ b/drivers/input/touchscreen/sec_ts/y771/sec_ts.c @@ -3482,7 +3482,7 @@ out: static int sec_ts_pm_suspend(struct device *dev) { struct sec_ts_data *ts = dev_get_drvdata(dev); -#ifdef USE_OPEN_CLOSE +#if 0//def USE_OPEN_CLOSE int retval; if (ts->input_dev) { diff --git a/drivers/media/platform/exynos/fimc-is2/include/fimc-is-metadata.h b/drivers/media/platform/exynos/fimc-is2/include/fimc-is-metadata.h index 8627cd3e24f4..53a472391048 100644 --- a/drivers/media/platform/exynos/fimc-is2/include/fimc-is-metadata.h +++ b/drivers/media/platform/exynos/fimc-is2/include/fimc-is-metadata.h @@ -1064,7 +1064,10 @@ struct camera2_aa_ctl { float vendor_objectDistanceCm; int32_t vendor_colorTempKelvin; int32_t vendor_enableDynamicShotDm; - uint32_t vendor_reserved[8]; + uint32_t vendor_captureHint; + int32_t vendor_captureEV; + uint32_t vendor_ssrmHint; + uint32_t vendor_reserved[5]; }; struct camera2_aa_dm { diff --git a/drivers/media/platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c b/drivers/media/platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c index b18d3955c0b4..480410f975be 100644 --- a/drivers/media/platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c +++ b/drivers/media/platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c @@ -179,6 +179,19 @@ static int s5p_mfc_dec_buf_init(struct vb2_buffer *vb) if (ret < 0) return ret; + if (dec->dynamic_used & (1 << buf->vb.vb2_buf.index)) { + for (i = 0; i < ctx->dst_fmt->mem_planes; i++) { + mfc_err_dev("ref buf[%d] plane[%d] %#08llx->%#08llx\n", + buf->vb.vb2_buf.index, + i, buf->planes.raw[i], + s5p_mfc_mem_get_daddr_vb(vb, i)); + MFC_TRACE_DEV("ref buf[%d] plane[%d] %#08llx->%#08llx\n", + buf->vb.vb2_buf.index, + i, buf->planes.raw[i], + s5p_mfc_mem_get_daddr_vb(vb, i)); + } + } + start_raw = s5p_mfc_mem_get_daddr_vb(vb, 0); if (ctx->dst_fmt->fourcc == V4L2_PIX_FMT_NV12N) { buf->planes.raw[0] = start_raw; diff --git a/drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.c b/drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.c index f6fa3d04acb8..02a492877ad0 100644 --- a/drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.c +++ b/drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.c @@ -345,6 +345,64 @@ static void mfc_print_trace_longterm(struct s5p_mfc_dev *dev) dev->mfc_trace_longterm[cnt].time, dev->mfc_trace_longterm[cnt].str); } } +static void mfc_print_dpb_queue(struct s5p_mfc_dev *dev) +{ + struct s5p_mfc_ctx *ctx = dev->ctx[dev->curr_ctx]; + struct s5p_mfc_dec *dec = NULL; + struct s5p_mfc_buf *mfc_buf = NULL; + int i, index = 0; + + if (!ctx) + return; + + dec = ctx->dec_priv; + + if (ctx->type != MFCINST_DECODER || dec == NULL) + return; + + pr_err("-----------dumping MFC DPB queue (used flag: %#x)\n", + s5p_mfc_get_dec_used_flag()); + pr_err("used %#x, set %#x, avail %#lx\n", + dec->dynamic_used, dec->dynamic_set, dec->available_dpb); + + if (!list_empty(&ctx->dst_buf_queue.head)) { + list_for_each_entry(mfc_buf, &ctx->dst_buf_queue.head, list) { + index = mfc_buf->vb.vb2_buf.index; + pr_err("dst[%d]: Plane[0] fd:%d Addr:%#llx / Plane[1] fd:%d Addr:%#llx\n", + index, + mfc_buf->vb.vb2_buf.planes[0].m.fd, + mfc_buf->planes.raw[0], + mfc_buf->vb.vb2_buf.planes[1].m.fd, + mfc_buf->planes.raw[1]); + } + } + if (!list_empty(&ctx->ref_buf_queue.head)) { + list_for_each_entry(mfc_buf, &ctx->ref_buf_queue.head, list) { + index = mfc_buf->vb.vb2_buf.index; + pr_err("ref[%d]: Plane[0] fd:%d Addr:%#llx / Plane[1] fd:%d Addr:%#llx\n", + index, + mfc_buf->vb.vb2_buf.planes[0].m.fd, + mfc_buf->planes.raw[0], + mfc_buf->vb.vb2_buf.planes[1].m.fd, + mfc_buf->planes.raw[1]); + } + } + if (!list_empty(&ctx->dst_buf_nal_queue.head)) { + list_for_each_entry(mfc_buf, &ctx->dst_buf_nal_queue.head, list) { + index = mfc_buf->vb.vb2_buf.index; + pr_err("dst nal[%d]: Plane[0] fd:%d Addr:%#llx / Plane[1] fd:%d Addr:%#llx\n", + index, + mfc_buf->vb.vb2_buf.planes[0].m.fd, + mfc_buf->planes.raw[0], + mfc_buf->vb.vb2_buf.planes[1].m.fd, + mfc_buf->planes.raw[1]); + } + } + + for (i = 0; i < MFC_MAX_DPBS; i++) + if (ctx->dec_priv->assigned_fd[i] != MFC_INFO_INIT_FD) + pr_err("fd[%d]: %d\n", i, ctx->dec_priv->assigned_fd[i]); +} void s5p_mfc_dump_buffer_info(struct s5p_mfc_dev *dev, unsigned long addr) { @@ -432,6 +490,7 @@ void s5p_mfc_dump_info_and_stop_hw(struct s5p_mfc_dev *dev) MFC_TRACE_DEV("** mfc will stop!!!\n"); mfc_display_state(dev); mfc_print_trace(dev); + mfc_print_dpb_queue(dev); mfc_save_logging_sfr(dev); mfc_dump_regs(dev); exynos_sysmmu_show_status(dev->device); diff --git a/drivers/media/platform/exynos/repeater/repeater_dev.c b/drivers/media/platform/exynos/repeater/repeater_dev.c index b9497caf85bf..2d819977076c 100644 --- a/drivers/media/platform/exynos/repeater/repeater_dev.c +++ b/drivers/media/platform/exynos/repeater/repeater_dev.c @@ -72,6 +72,11 @@ int hwfc_request_buffer(struct shared_buffer_info *info, int owner) info->pixel_format = ctx->info.pixel_format; info->width = ctx->info.width; info->height = ctx->info.height; + if (ctx->info.buffer_count > MAX_SHARED_BUF_NUM) { + print_repeater_debug(RPT_ERROR, "%s, buffer_count is invalid %d", + __func__, ctx->info.buffer_count); + ctx->info.buffer_count = MAX_SHARED_BUF_NUM; + } info->buffer_count = ctx->info.buffer_count; buf_fd = ctx->info.buf_fd; @@ -356,7 +361,8 @@ void encoding_work_handler(struct work_struct *work) print_repeater_debug(RPT_INT_INFO, "%s--\n", __func__); } -int repeater_ioctl_map_buf(struct repeater_context *ctx) +int repeater_ioctl_map_buf( + struct repeater_context *ctx, struct repeater_info *info) { int ret = 0; unsigned long flags; @@ -366,6 +372,8 @@ int repeater_ioctl_map_buf(struct repeater_context *ctx) spin_lock_irqsave(&repeater_spinlock, flags); + memcpy(&ctx->info, info, sizeof(struct repeater_info)); + if (ctx->info.buffer_count > MAX_SHARED_BUF_NUM) { print_repeater_debug(RPT_ERROR, "%s, buffer_count is invalid %d", __func__, ctx->info.buffer_count); @@ -391,6 +399,8 @@ int repeater_ioctl_map_buf(struct repeater_context *ctx) __func__, ctx->ctx_status); } + memcpy(info, &ctx->info, sizeof(struct repeater_info)); + spin_unlock_irqrestore(&repeater_spinlock, flags); print_repeater_debug(RPT_INT_INFO, "%s--\n", __func__); @@ -684,6 +694,7 @@ static long repeater_ioctl(struct file *filp, { int ret = 0; struct repeater_context *ctx; + struct repeater_info info; print_repeater_debug(RPT_INT_INFO, "%s++\n", __func__); @@ -696,17 +707,17 @@ static long repeater_ioctl(struct file *filp, switch (cmd) { case REPEATER_IOCTL_MAP_BUF: - if (copy_from_user(&ctx->info, + if (copy_from_user(&info, (struct repeater_info __user *)arg, sizeof(struct repeater_info))) { ret = -EFAULT; break; } - ret = repeater_ioctl_map_buf(ctx); + ret = repeater_ioctl_map_buf(ctx, &info); if (copy_to_user((struct repeater_info __user *)arg, - &ctx->info, + &info, sizeof(struct repeater_info))) { ret = -EFAULT; break; diff --git a/drivers/media/platform/exynos/tsmux/cmu_mfc/exynos9810_cmu_mfc.h b/drivers/media/platform/exynos/tsmux/cmu_mfc/exynos9810_cmu_mfc.h new file mode 100644 index 000000000000..01ea0373ab2c --- /dev/null +++ b/drivers/media/platform/exynos/tsmux/cmu_mfc/exynos9810_cmu_mfc.h @@ -0,0 +1,81 @@ +/* + * copyright (c) 2019 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Core file for Samsung EXYNOS TSMUX driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef EXYNOS9810_CMU_MFC_H +#define EXYNOS9810_CMU_MFC_H + +/* CMU_MFC_SFR is for debugging */ + +#define TSMUX_CMU_MFC_DESC(_sfr_name, _base_pa, _offset) { \ + .sfr_name = _sfr_name, \ + .base_pa = _base_pa, \ + .offset = _offset, \ +} + +struct tsmux_cmu_mfc_sfr { + char *sfr_name; + phys_addr_t base_pa; + u32 offset; +}; + +struct tsmux_cmu_mfc_sfr tsmux_cmu_mfc_sfr_list[] = { + TSMUX_CMU_MFC_DESC("CLK_CON_DIV_DIV_CLK_MFC_BUSP", 0x17800000, 0x1804), + TSMUX_CMU_MFC_DESC("PLL_CON0_MUX_CLKCMU_MFC_WFD_USER", 0x17800000, 0x120), + TSMUX_CMU_MFC_DESC("PLL_CON0_MUX_CLKCMU_MFC_BUS_USER", 0x17800000, 0x100), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_WFD_QCH", 0x17800000, 0x705c), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_SYSREG_MFC_QCH", 0x17800000, 0x7058), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_SYSMMU_MFCD1_QCH", 0x17800000, 0x7054), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_SYSMMU_MFCD0_QCH", 0x17800000, 0x7050), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_RSTNSYNC_CLK_MFC_BUSD_WFD_SW_RESET_QCH", 0x17800000, 0x704c), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_RSTNSYNC_CLK_MFC_BUSD_MFC_SW_RESET_QCH", 0x17800000, 0x7048), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_RSTNSYNC_CLK_MFC_BUSD_LH_ATB_SI_SW_RESET_QCH", 0x17800000, 0x7044), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_RSTNSYNC_CLK_MFC_BUSD_LH_ATB_MI_SW_RESET_QCH", 0x17800000, 0x7040), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_PPMU_MFCD2_QCH", 0x17800000, 0x703c), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_PPMU_MFCD1_QCH", 0x17800000, 0x7038), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_PPMU_MFCD0_QCH", 0x17800000, 0x7034), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_PGEN100_LITE_MFC_QCH", 0x17800000, 0x7030), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_MFC_QCH", 0x17800000, 0x702c), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_MFC_CMU_MFC_QCH", 0x17800000, 0x7028), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_LH_ATB_QCH_SI", 0x17800000, 0x7024), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_LH_ATB_QCH_MI", 0x17800000, 0x7020), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_LHS_AXI_D1_MFC_QCH", 0x17800000, 0x701c), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_LHS_AXI_D0_MFC_QCH", 0x17800000, 0x7018), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_LHM_AXI_P_MFC_QCH", 0x17800000, 0x7014), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_BTM_MFCD1_QCH", 0x17800000, 0x7010), + TSMUX_CMU_MFC_DESC("DBG_NFO_QCH_CON_BTM_MFCD0_QCH", 0x17800000, 0x700c), + TSMUX_CMU_MFC_DESC("QCH_CON_WFD_QCH", 0x17800000, 0x305c), + TSMUX_CMU_MFC_DESC("QCH_CON_SYSREG_MFC_QCH", 0x17800000, 0x3058), + TSMUX_CMU_MFC_DESC("QCH_CON_SYSMMU_MFCD1_QCH", 0x17800000, 0x3054), + TSMUX_CMU_MFC_DESC("QCH_CON_SYSMMU_MFCD0_QCH", 0x17800000, 0x3050), + TSMUX_CMU_MFC_DESC("QCH_CON_RSTNSYNC_CLK_MFC_BUSD_WFD_SW_RESET_QCH", 0x17800000, 0x304c), + TSMUX_CMU_MFC_DESC("QCH_CON_RSTNSYNC_CLK_MFC_BUSD_MFC_SW_RESET_QCH", 0x17800000, 0x3048), + TSMUX_CMU_MFC_DESC("QCH_CON_RSTNSYNC_CLK_MFC_BUSD_LH_ATB_SI_SW_RESET_QCH", 0x17800000, 0x3044), + TSMUX_CMU_MFC_DESC("QCH_CON_RSTNSYNC_CLK_MFC_BUSD_LH_ATB_MI_SW_RESET_QCH", 0x17800000, 0x3040), + TSMUX_CMU_MFC_DESC("QCH_CON_PPMU_MFCD2_QCH", 0x17800000, 0x303c), + TSMUX_CMU_MFC_DESC("QCH_CON_PPMU_MFCD1_QCH", 0x17800000, 0x3038), + TSMUX_CMU_MFC_DESC("QCH_CON_PPMU_MFCD0_QCH", 0x17800000, 0x3034), + TSMUX_CMU_MFC_DESC("QCH_CON_PGEN100_LITE_MFC_QCH", 0x17800000, 0x3030), + TSMUX_CMU_MFC_DESC("QCH_CON_MFC_QCH", 0x17800000, 0x302c), + TSMUX_CMU_MFC_DESC("QCH_CON_MFC_CMU_MFC_QCH", 0x17800000, 0x3028), + TSMUX_CMU_MFC_DESC("QCH_CON_LH_ATB_QCH_SI", 0x17800000, 0x3024), + TSMUX_CMU_MFC_DESC("QCH_CON_LH_ATB_QCH_MI", 0x17800000, 0x3020), + TSMUX_CMU_MFC_DESC("QCH_CON_LHS_AXI_D1_MFC_QCH", 0x17800000, 0x301c), + TSMUX_CMU_MFC_DESC("QCH_CON_LHS_AXI_D0_MFC_QCH", 0x17800000, 0x3018), + TSMUX_CMU_MFC_DESC("QCH_CON_LHM_AXI_P_MFC_QCH", 0x17800000, 0x3014), + TSMUX_CMU_MFC_DESC("QCH_CON_BTM_MFCD1_QCH", 0x17800000, 0x3010), + TSMUX_CMU_MFC_DESC("QCH_CON_BTM_MFCD0_QCH", 0x17800000, 0x300c), + TSMUX_CMU_MFC_DESC("MFC_CMU_MFC_CONTROLLER_OPTION", 0x17800000, 0x0800), + TSMUX_CMU_MFC_DESC("BUS_COMPONENT_DRCG_EN", 0x17810000, 0x0104), +}; + +u32 tsmux_cmu_mfc_sfr_list_size = ARRAY_SIZE(tsmux_cmu_mfc_sfr_list); + +#endif diff --git a/drivers/media/platform/exynos/tsmux/tsmux_dev.c b/drivers/media/platform/exynos/tsmux/tsmux_dev.c index 1ad83438bb03..f32b448dd55e 100644 --- a/drivers/media/platform/exynos/tsmux/tsmux_dev.c +++ b/drivers/media/platform/exynos/tsmux/tsmux_dev.c @@ -38,6 +38,9 @@ #define RTP_HEADER_SIZE 12 #define TS_PACKET_SIZE 188 +#define WATCHDOG_INTERVAL 1000 +#define MAX_WATCHDOG_TICK_CNT 5 + static struct tsmux_device *g_tsmux_dev; int g_tsmux_debug_level; module_param(g_tsmux_debug_level, int, 0600); @@ -139,9 +142,11 @@ static int tsmux_iommu_fault_handler( struct iommu_domain *domain, struct device *dev, unsigned long fault_addr, int fault_flags, void *token) { - print_tsmux(TSMUX_COMMON, "%s++\n", __func__); + print_tsmux(TSMUX_ERR, "%s++\n", __func__); - print_tsmux(TSMUX_COMMON, "%s--\n", __func__); + tsmux_sfr_dump(); + + print_tsmux(TSMUX_ERR, "%s--\n", __func__); return 0; } @@ -183,6 +188,99 @@ static int increment_rtp_sequence_number( return rtp_packet_count; } +void tsmux_watchdog_tick_start(struct tsmux_device *tsmux_dev, int job_id) +{ + struct tsmux_watchdog_tick *watchdog_tick; + + print_tsmux(TSMUX_COMMON, "%s++\n", __func__); + + if (job_id >= 0 && job_id < TSMUX_MAX_CMD_QUEUE_NUM) { + watchdog_tick = &tsmux_dev->watchdog_tick[job_id]; + if (atomic_read(&watchdog_tick->watchdog_tick_running)) { + print_tsmux(TSMUX_COMMON, "job id %d tick was already running\n", job_id); + } else { + print_tsmux(TSMUX_COMMON, "job id %d tick is now running\n", job_id); + atomic_set(&watchdog_tick->watchdog_tick_running, 1); + } + + /* Reset the timeout watchdog */ + atomic_set(&watchdog_tick->watchdog_tick_count, 0); + } else + print_tsmux(TSMUX_ERR, "invalid job id(%d)\n", job_id); + + print_tsmux(TSMUX_COMMON, "%s--\n", __func__); +} + +void tsmux_watchdog_tick_stop(struct tsmux_device *tsmux_dev, int job_id) +{ + struct tsmux_watchdog_tick *watchdog_tick; + + print_tsmux(TSMUX_COMMON, "%s++\n", __func__); + + if (job_id >= 0 && job_id < TSMUX_MAX_CMD_QUEUE_NUM) { + watchdog_tick = &tsmux_dev->watchdog_tick[job_id]; + if (atomic_read(&watchdog_tick->watchdog_tick_running)) { + print_tsmux(TSMUX_COMMON, "job id %d tick is now stopped\n", job_id); + atomic_set(&watchdog_tick->watchdog_tick_running, 0); + } else { + print_tsmux(TSMUX_COMMON, "job id %d tick was already stopped\n", job_id); + } + + /* Reset the timeout watchdog */ + atomic_set(&watchdog_tick->watchdog_tick_count, 0); + } else + print_tsmux(TSMUX_ERR, "invalid job id(%d)\n", job_id); + + print_tsmux(TSMUX_COMMON, "%s--\n", __func__); +} + +void tsmux_watchdog_work_handler(struct work_struct *work) +{ + struct tsmux_device *tsmux_dev; + + print_tsmux(TSMUX_COMMON, "%s++\n", __func__); + + tsmux_dev = container_of(work, struct tsmux_device, watchdog_work); + + tsmux_sfr_dump(); + + /* If OTF job exists, MFC device driver generates kernel panic */ + /* Otherwise, TSMUX device driver generates kernel panic */ + if (atomic_read(&tsmux_dev->watchdog_tick[0].watchdog_tick_running) == 0) + BUG(); + + print_tsmux(TSMUX_COMMON, "%s--\n", __func__); +} + +void tsmux_watchdog(unsigned long data) +{ + struct tsmux_device *tsmux_dev = g_tsmux_dev; + int i = 0; + + if (tsmux_dev == NULL) { + print_tsmux(TSMUX_ERR, "g_tsmux_dev is NULL\n"); + return; + } + + print_tsmux(TSMUX_COMMON, "%s++\n", __func__); + + for (i = 0; i < TSMUX_MAX_CMD_QUEUE_NUM; i++) { + if (atomic_read(&tsmux_dev->watchdog_tick[i].watchdog_tick_running)) + atomic_inc(&tsmux_dev->watchdog_tick[i].watchdog_tick_count); + else + atomic_set(&tsmux_dev->watchdog_tick[i].watchdog_tick_count, 0); + + if (atomic_read(&tsmux_dev->watchdog_tick[i].watchdog_tick_count) >= MAX_WATCHDOG_TICK_CNT) { + /* TSMUX H/W is running, but interrupt was not generated */ + schedule_work(&tsmux_dev->watchdog_work); + } + } + + mod_timer(&tsmux_dev->watchdog_timer, jiffies + msecs_to_jiffies(WATCHDOG_INTERVAL)); + + print_tsmux(TSMUX_COMMON, "%s--\n", __func__); +} + irqreturn_t tsmux_irq(int irq, void *priv) { struct tsmux_device *tsmux_dev = priv; @@ -220,6 +318,7 @@ irqreturn_t tsmux_irq(int irq, void *priv) } else print_tsmux(TSMUX_ERR, "wrong index: %d\n", i); + tsmux_watchdog_tick_stop(tsmux_dev, job_id); wake_up_interruptible(&ctx->otf_wait_queue); } @@ -228,6 +327,7 @@ irqreturn_t tsmux_irq(int irq, void *priv) print_tsmux(TSMUX_COMMON, "Job ID %d is done\n", job_id); tsmux_clear_job_done(tsmux_dev, job_id); ctx->m2m_job_done[get_m2m_buffer_idx(job_id)] = true; + tsmux_watchdog_tick_stop(tsmux_dev, job_id); } if (tsmux_is_job_done_id_2(tsmux_dev)) { @@ -235,6 +335,7 @@ irqreturn_t tsmux_irq(int irq, void *priv) print_tsmux(TSMUX_COMMON, "Job ID %d is done\n", job_id); tsmux_clear_job_done(tsmux_dev, job_id); ctx->m2m_job_done[get_m2m_buffer_idx(job_id)] = true; + tsmux_watchdog_tick_stop(tsmux_dev, job_id); } if (tsmux_is_job_done_id_3(tsmux_dev)) { @@ -242,6 +343,7 @@ irqreturn_t tsmux_irq(int irq, void *priv) print_tsmux(TSMUX_COMMON, "Job ID %d is done\n", job_id); tsmux_clear_job_done(tsmux_dev, job_id); ctx->m2m_job_done[get_m2m_buffer_idx(job_id)] = true; + tsmux_watchdog_tick_stop(tsmux_dev, job_id); } spin_unlock(&tsmux_dev->device_spinlock); @@ -322,6 +424,8 @@ static int tsmux_open(struct inode *inode, struct file *filp) init_waitqueue_head(&ctx->m2m_wait_queue); init_waitqueue_head(&ctx->otf_wait_queue); + ctx->otf_buf_mapped = false; + //print_tsmux_sfr(tsmux_dev); //print_dbg_info_all(tsmux_dev); @@ -330,6 +434,11 @@ static int tsmux_open(struct inode *inode, struct file *filp) //print_tsmux_sfr(tsmux_dev); //print_dbg_info_all(tsmux_dev); + tsmux_dev->hw_version = tsmux_get_hw_version(tsmux_dev); + + if (tsmux_dev->ctx_cnt == 1) + mod_timer(&tsmux_dev->watchdog_timer, jiffies + msecs_to_jiffies(1000)); + print_tsmux(TSMUX_COMMON, "%s--\n", __func__); return ret; @@ -356,6 +465,9 @@ static int tsmux_release(struct inode *inode, struct file *filp) #endif spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + if (tsmux_dev->ctx_cnt == 1) + del_timer(&tsmux_dev->watchdog_timer); + ctx->tsmux_dev->ctx_cnt--; kfree(ctx); filp->private_data = NULL; @@ -420,6 +532,21 @@ int tsmux_job_queue(struct tsmux_context *ctx, tsmux_dev = ctx->tsmux_dev; + /* m2m only */ + if (pkt_ctrl->mode == 0) { + if (IS_ERR(inbuf->dmabuf) || IS_ERR(inbuf->dmabuf_att) || + IS_ERR_VALUE(inbuf->dma_addr) || inbuf->dma_addr == 0) { + print_tsmux(TSMUX_ERR, "tsmux_job_queue() inbuf is invalid\n"); + return -ENOMEM; + } + } + + if (IS_ERR(outbuf->dmabuf) || IS_ERR(outbuf->dmabuf_att) || + IS_ERR_VALUE(outbuf->dma_addr) || outbuf->dma_addr == 0) { + print_tsmux(TSMUX_ERR, "tsmux_job_queue() outbuf is invalid\n"); + return -ENOMEM; + } + /* set pck_ctrl */ tsmux_set_pkt_ctrl(tsmux_dev, pkt_ctrl); @@ -444,8 +571,7 @@ int tsmux_job_queue(struct tsmux_context *ctx, /* set pkt_ctrl_reg */ tsmux_job_queue_pkt_ctrl(tsmux_dev); - //print_tsmux_sfr(tsmux_dev); - //print_dbg_info_all(tsmux_dev); + tsmux_watchdog_tick_start(tsmux_dev, pkt_ctrl->id); print_tsmux(TSMUX_COMMON, "%s--\n", __func__); @@ -457,6 +583,10 @@ int tsmux_ioctl_m2m_map_buf(struct tsmux_context *ctx, int buf_fd, int buf_size, { int ret = 0; struct tsmux_device *tsmux_dev; + unsigned long flags; + struct dma_buf *temp_dmabuf; + struct dma_buf_attachment *temp_dmabuf_att; + dma_addr_t temp_dma_addr; print_tsmux(TSMUX_M2M, "%s++\n", __func__); @@ -467,27 +597,42 @@ int tsmux_ioctl_m2m_map_buf(struct tsmux_context *ctx, int buf_fd, int buf_size, print_tsmux(TSMUX_M2M, "map m2m in_buf\n"); - buf_info->dmabuf = dma_buf_get(buf_fd); + temp_dmabuf = dma_buf_get(buf_fd); print_tsmux(TSMUX_M2M, "dma_buf_get(%d) ret dmabuf %pK\n", - buf_fd, buf_info->dmabuf); + buf_fd, temp_dmabuf); - if (IS_ERR(buf_info->dmabuf)) { - buf_info->dmabuf_att = ERR_PTR(-EINVAL); + if (IS_ERR(temp_dmabuf)) { + temp_dmabuf_att = ERR_PTR(-EINVAL); + print_tsmux(TSMUX_ERR, "m2m dma_buf_get() error\n"); + ret = -ENOMEM; } else { - buf_info->dmabuf_att = dma_buf_attach(buf_info->dmabuf, tsmux_dev->dev); + temp_dmabuf_att = dma_buf_attach(temp_dmabuf, tsmux_dev->dev); print_tsmux(TSMUX_M2M, "dma_buf_attach() ret dmabuf_att %pK\n", - buf_info->dmabuf_att); + temp_dmabuf_att); } - if (IS_ERR(buf_info->dmabuf_att)) { - buf_info->dma_addr = -EINVAL; + if (IS_ERR(temp_dmabuf_att)) { + temp_dma_addr = -EINVAL; + print_tsmux(TSMUX_ERR, "m2m dma_buf_attach() error\n"); + ret = -ENOMEM; } else { - buf_info->dma_addr = ion_iovmm_map(buf_info->dmabuf_att, 0, buf_size, + temp_dma_addr = ion_iovmm_map(temp_dmabuf_att, 0, buf_size, DMA_TO_DEVICE, 0); print_tsmux(TSMUX_M2M, "ion_iovmm_map() ret dma_addr_t 0x%llx\n", - buf_info->dma_addr); + temp_dma_addr); } + if (IS_ERR_VALUE(temp_dma_addr) || temp_dma_addr == 0) { + print_tsmux(TSMUX_ERR, "m2m ion_iovmm_map() error\n"); + ret = -ENOMEM; + } + + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + buf_info->dmabuf = temp_dmabuf; + buf_info->dmabuf_att = temp_dmabuf_att; + buf_info->dma_addr = temp_dma_addr; + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + print_tsmux(TSMUX_M2M, "%s--\n", __func__); return ret; @@ -499,6 +644,10 @@ int tsmux_ioctl_m2m_unmap_buf(struct tsmux_context *ctx, int ret = 0; struct tsmux_device *tsmux_dev; struct ion_client *client; + unsigned long flags; + struct dma_buf *temp_dmabuf; + struct dma_buf_attachment *temp_dmabuf_att; + dma_addr_t temp_dma_addr; print_tsmux(TSMUX_M2M, "%s++\n", __func__); @@ -510,24 +659,30 @@ int tsmux_ioctl_m2m_unmap_buf(struct tsmux_context *ctx, print_tsmux(TSMUX_M2M, "unmap m2m in_buf\n"); - if (!IS_ERR_VALUE(buf_info->dma_addr) && buf_info->dma_addr) { - print_tsmux(TSMUX_M2M, "ion_iovmm_unmap(%pK, %pK)\n", - buf_info->dmabuf_att, (void *)buf_info->dma_addr); - ion_iovmm_unmap(buf_info->dmabuf_att, buf_info->dma_addr); - buf_info->dma_addr = 0; + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + temp_dma_addr = buf_info->dma_addr; + temp_dmabuf_att = buf_info->dmabuf_att; + temp_dmabuf = buf_info->dmabuf; + buf_info->dma_addr = 0; + buf_info->dmabuf_att = 0; + buf_info->dmabuf = 0; + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + + if (!IS_ERR_VALUE(temp_dma_addr) && temp_dma_addr) { + print_tsmux(TSMUX_M2M, "ion_iovmm_unmap(%pK, %llx)\n", + temp_dmabuf_att, temp_dma_addr); + ion_iovmm_unmap(temp_dmabuf_att, temp_dma_addr); } - if (!IS_ERR_OR_NULL(buf_info->dmabuf_att)) { + if (!IS_ERR_OR_NULL(temp_dmabuf_att)) { print_tsmux(TSMUX_M2M, "dma_buf_detach(%pK, %pK)\n", - buf_info->dmabuf, buf_info->dmabuf_att); - dma_buf_detach(buf_info->dmabuf, buf_info->dmabuf_att); - buf_info->dmabuf_att = 0; + temp_dmabuf, temp_dmabuf_att); + dma_buf_detach(temp_dmabuf, temp_dmabuf_att); } - if (!IS_ERR_OR_NULL(buf_info->dmabuf)) { - print_tsmux(TSMUX_M2M, "dma_buf_put(%pK)\n", buf_info->dmabuf); - dma_buf_put(buf_info->dmabuf); - buf_info->dmabuf = 0; + if (!IS_ERR_OR_NULL(temp_dmabuf)) { + print_tsmux(TSMUX_M2M, "dma_buf_put(%pK)\n", temp_dmabuf); + dma_buf_put(temp_dmabuf); } print_tsmux(TSMUX_M2M, "%s--\n", __func__); @@ -630,14 +785,14 @@ int tsmux_ioctl_m2m_run(struct tsmux_context *ctx) m2m_job->pkt_ctrl.rtp_size = TS_PKT_COUNT_PER_RTP; print_tsmux(TSMUX_COMMON, "m2m job_queue, a_cc %.2x\n", ctx->rtp_ts_info.ts_audio_cc); - tsmux_job_queue(ctx, - &m2m_job->pkt_ctrl, - &m2m_job->pes_hdr, - &m2m_job->ts_hdr, - &m2m_job->rtp_hdr, - m2m_job->in_buf.actual_size, - &ctx->m2m_inbuf_info[i], - &ctx->m2m_outbuf_info[i]); + ret = tsmux_job_queue(ctx, &m2m_job->pkt_ctrl, + &m2m_job->pes_hdr, &m2m_job->ts_hdr, + &m2m_job->rtp_hdr, m2m_job->in_buf.actual_size, + &ctx->m2m_inbuf_info[i], &ctx->m2m_outbuf_info[i]); + if (ret) { + print_tsmux(TSMUX_ERR, "tsmux_job_queue() failed\n"); + break; + } } } @@ -851,6 +1006,13 @@ int packetize(struct packetizing_param *param) } } + if (ctx->otf_buf_mapped == false) { + print_tsmux(TSMUX_ERR, "otf_buf_mapped is false\n"); + ret = -1; + spin_unlock_irqrestore(&g_tsmux_dev->device_spinlock, flags); + return ret; + } + if (ctx->otf_outbuf_info[0].dma_addr == 0) { print_tsmux(TSMUX_ERR, "otf_out_buf is NULL\n"); ret = -1; @@ -982,6 +1144,91 @@ void set_es_size(unsigned int size) { print_tsmux(TSMUX_OTF, "es_size: %d\n", size); } +void tsmux_print_context_info(struct tsmux_context *ctx) +{ + int i = 0; + struct tsmux_buffer_info *buf_info = NULL; + struct tsmux_buffer *buf = NULL; + + if (ctx == NULL) { + print_tsmux(TSMUX_ERR, "tsmux ctx is null\n"); + return; + } + + for (i = 0; i < TSMUX_OUT_BUF_CNT; i++) { + buf_info = &ctx->otf_outbuf_info[i]; + buf = &ctx->otf_cmd_queue.out_buf[i]; + print_tsmux(TSMUX_ERR, + "otf_outbuf_info[%d] buf_state: %d\n", + i, buf_info->buf_state); + print_tsmux(TSMUX_ERR, + "otf_outbuf_info[%d] fd: %d, buffer_size: %d, actual_size: %d, offset: %d\n", + i, buf->ion_buf_fd, buf->buffer_size, + buf->actual_size, buf->offset); + print_tsmux(TSMUX_ERR, + "otf_outbuf_info[%d] job_done: %d, part_done: %d, timestamp: %lld\n", + i, buf->job_done, buf->partial_done, buf->time_stamp); + print_tsmux(TSMUX_ERR, + "otf_psi_enabled[%d]: %d\n", i, ctx->otf_psi_enabled[i]); + } + + print_tsmux(TSMUX_ERR, "otf_job_queued: %d, set_hex_info: %d\n", + ctx->otf_job_queued, ctx->set_hex_info); + + for (i = 0; i < TSMUX_MAX_M2M_CMD_QUEUE_NUM; i++) { + buf = &ctx->m2m_cmd_queue.m2m_job[i].in_buf; + print_tsmux(TSMUX_ERR, + "m2m_inbuf_info[%d] fd: %d, buffer_size: %d, actual_size: %d\n", + i, buf->ion_buf_fd, buf->buffer_size, buf->actual_size); + buf = &ctx->m2m_cmd_queue.m2m_job[i].out_buf; + print_tsmux(TSMUX_ERR, + "m2m_outbuf_info[%d] fd: %d, buffer_size: %d, actual_size: %d, time_stamp: %lld\n", + i, buf->ion_buf_fd, buf->buffer_size, buf->actual_size, buf->time_stamp); + print_tsmux(TSMUX_ERR, + "m2m_job_done[%d]: %d\n", i, ctx->m2m_job_done[i]); + } + + print_tsmux(TSMUX_ERR, + "rtp_ts_info: rtp 0x%x, overr %d, pat_cc 0x%x, pmt_cc 0x%x, v_cc 0x%x, a_cc 0x%x\n", + ctx->rtp_ts_info.rtp_seq_number, ctx->rtp_ts_info.rtp_seq_override, + ctx->rtp_ts_info.ts_pat_cc, ctx->rtp_ts_info.ts_pmt_cc, + ctx->rtp_ts_info.ts_video_cc, ctx->rtp_ts_info.ts_audio_cc); + print_tsmux(TSMUX_ERR, "audio_frame_cnt: %lld, video_frame_cnt: %lld\n", + ctx->audio_frame_count, ctx->video_frame_count); +} + +void tsmux_sfr_dump(void) +{ + struct tsmux_context *ctx = NULL; + struct tsmux_device *tsmux_dev = NULL; + int prev_tsmux_debug_level; + + print_tsmux(TSMUX_ERR, "%s++\n", __func__); + + if (g_tsmux_dev == NULL) { + print_tsmux(TSMUX_ERR, "g_tsmux_dev is null\n"); + return; + } + + ctx = g_tsmux_dev->ctx[g_tsmux_dev->ctx_cur]; + if (ctx == NULL || ctx->tsmux_dev == NULL) { + print_tsmux(TSMUX_ERR, "tsmux ctx is null\n"); + return; + } + + tsmux_dev = ctx->tsmux_dev; + prev_tsmux_debug_level = g_tsmux_debug_level; + g_tsmux_debug_level |= TSMUX_SFR; + g_tsmux_debug_level |= TSMUX_DBG_SFR; + tsmux_print_tsmux_sfr(tsmux_dev); + tsmux_print_dbg_info_all(tsmux_dev); + tsmux_print_context_info(ctx); + tsmux_print_cmu_mfc_sfr(tsmux_dev); + g_tsmux_debug_level = prev_tsmux_debug_level; + + print_tsmux(TSMUX_ERR, "%s--\n", __func__); +} + static int get_job_done_buf(struct tsmux_context *ctx) { struct tsmux_buffer_info *out_buf_info = NULL; @@ -1203,14 +1450,13 @@ void add_null_ts_packet(uint8_t *ptr, int out_buf_size, struct tsmux_ts_hdr *ts_ { uint8_t payload_unit_start_indicator = 1; /* Adaptation_field, payload */ - uint8_t adapt_ctrl = 0x3; + uint8_t adapt_ctrl = 0x2; /* When the adaptation_field_control value is 'b10' */ /* the value of the adaptation_field_length shall be 183 */ - uint8_t adapt_field_length = 183 - (9 + 8); + uint8_t adapt_field_length = 183; uint8_t last_ts_continuity_counter = 0; uint32_t last_rtp_size = 0; uint8_t *ts_data = 0; - int pes_packet_len = 0; last_ts_continuity_counter = *(ptr + out_buf_size - (TS_PACKET_SIZE - 3)); last_ts_continuity_counter = last_ts_continuity_counter & 0xf; @@ -1237,26 +1483,6 @@ void add_null_ts_packet(uint8_t *ptr, int out_buf_size, struct tsmux_ts_hdr *ts_ /* stuffing bytes */ memset(ptr, 0xff, adapt_field_length); ptr += adapt_field_length; - /* PES header */ - *ptr++ = 0x0; - *ptr++ = 0x0; - *ptr++ = 0x1; - *ptr++ = 0xe0; - pes_packet_len = 3 + 8; - *ptr++ = pes_packet_len >> 8; - *ptr++ = pes_packet_len & 0xff; - *ptr++ = 0x80; /* markder bit b10, 5 flags */ - *ptr++ = 0x0; /* 7 flags */ - *ptr++ = 0x0; /* PES header data length */ - /* filler data NAL unit 8 bytes */ - *ptr++ = 0x0; - *ptr++ = 0x0; - *ptr++ = 0x0; - *ptr++ = 0x1; - *ptr++ = 0xc; - *ptr++ = 0xff; - *ptr++ = 0xff; - *ptr++ = 0x80; print_tsmux(TSMUX_COMMON, "ts data %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n", ts_data[0], ts_data[1], ts_data[2], ts_data[3], @@ -1352,6 +1578,7 @@ static bool tsmux_ioctl_otf_dq_buf(struct tsmux_context *ctx) ctx->otf_cmd_queue.out_buf[index].actual_size += TS_PACKET_SIZE; #endif + ctx->video_frame_count++; spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); } else { print_tsmux(TSMUX_ERR, "time out: wait_time: %ld\n", wait_time); @@ -1402,12 +1629,18 @@ static bool tsmux_ioctl_otf_q_buf(struct tsmux_context *ctx) return true; } -static bool tsmux_ioctl_otf_map_buf(struct tsmux_context *ctx) +static int tsmux_ioctl_otf_map_buf(struct tsmux_context *ctx) { int i = 0; + int ret = 0; + unsigned long flags; struct tsmux_buffer_info *out_buf_info = NULL; struct tsmux_buffer *user_info = NULL; struct tsmux_device *tsmux_dev = NULL; + struct dma_buf *temp_dmabuf; + struct dma_buf_attachment *temp_dmabuf_att; + dma_addr_t temp_dma_addr; + void *temp_vaddr; if (ctx == NULL || ctx->tsmux_dev == NULL) return -ENOMEM; @@ -1420,44 +1653,61 @@ static bool tsmux_ioctl_otf_map_buf(struct tsmux_context *ctx) out_buf_info = &ctx->otf_outbuf_info[i]; user_info = &ctx->otf_cmd_queue.out_buf[i]; - out_buf_info->dmabuf = + temp_dmabuf = dma_buf_get(user_info->ion_buf_fd); print_tsmux(TSMUX_OTF, "dma_buf_get(%d) ret dmabuf %pK\n", - user_info->ion_buf_fd, out_buf_info->dmabuf); + user_info->ion_buf_fd, temp_dmabuf); - if (IS_ERR(out_buf_info->dmabuf)) { - out_buf_info->dmabuf_att = ERR_PTR(-EINVAL); + if (IS_ERR(temp_dmabuf)) { + temp_dmabuf_att = ERR_PTR(-EINVAL); + print_tsmux(TSMUX_ERR, "otf dma_buf_get() error\n"); + ret = -ENOMEM; } else { - out_buf_info->dmabuf_att = - dma_buf_attach(out_buf_info->dmabuf, tsmux_dev->dev); + temp_dmabuf_att = dma_buf_attach(temp_dmabuf, tsmux_dev->dev); print_tsmux(TSMUX_OTF, "dma_buf_attach() ret dmabuf_att %pK\n", - out_buf_info->dmabuf_att); + temp_dmabuf_att); } - if (IS_ERR(out_buf_info->dmabuf_att)) { - out_buf_info->dma_addr = -EINVAL; + if (IS_ERR(temp_dmabuf_att)) { + temp_dma_addr = -EINVAL; + print_tsmux(TSMUX_ERR, "otf dma_buf_attach() error\n"); + ret = -ENOMEM; } else { - out_buf_info->dma_addr = - ion_iovmm_map(out_buf_info->dmabuf_att, - 0, user_info->buffer_size, - DMA_TO_DEVICE, 0); + temp_dma_addr = ion_iovmm_map( + temp_dmabuf_att, 0, user_info->buffer_size, DMA_TO_DEVICE, 0); print_tsmux(TSMUX_OTF, "ion_iovmm_map() ret dma_addr_t 0x%llx\n", - out_buf_info->dma_addr); + temp_dma_addr); } - if (IS_ERR_VALUE(out_buf_info->dma_addr) || out_buf_info->dma_addr == 0) { - out_buf_info->vaddr = NULL; + if (IS_ERR_VALUE(temp_dma_addr) || temp_dma_addr == 0) { + temp_vaddr = NULL; + print_tsmux(TSMUX_ERR, "otf ion_iovmm_map() error\n"); + ret = -ENOMEM; } else { - out_buf_info->vaddr = - dma_buf_vmap(out_buf_info->dmabuf); + temp_vaddr = dma_buf_vmap(temp_dmabuf); print_tsmux(TSMUX_OTF, "dma_buf_vmap(%pK) ret vaddr %pK\n", - out_buf_info->dmabuf, out_buf_info->vaddr); + temp_dmabuf, temp_vaddr); } + if (temp_vaddr == NULL) { + print_tsmux(TSMUX_ERR, "otf dma_buf_vmap() error\n"); + ret = -ENOMEM; + } + + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + out_buf_info->dmabuf = temp_dmabuf; + out_buf_info->dmabuf_att = temp_dmabuf_att; + out_buf_info->dma_addr = temp_dma_addr; + out_buf_info->vaddr = temp_vaddr; out_buf_info->buf_state = BUF_FREE; + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); } - return true; + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + ctx->otf_buf_mapped = true; + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + + return ret; } int tsmux_ioctl_otf_unmap_buf(struct tsmux_context *ctx) @@ -1465,53 +1715,75 @@ int tsmux_ioctl_otf_unmap_buf(struct tsmux_context *ctx) int i = 0; struct tsmux_buffer_info *out_buf_info = NULL; int ret = 0; + unsigned long flags; + bool otf_job_queued = false; + int64_t wait_us = 0; + struct dma_buf *temp_dmabuf; + struct dma_buf_attachment *temp_dmabuf_att; + dma_addr_t temp_dma_addr; + void *temp_vaddr; print_tsmux(TSMUX_OTF, "%s++\n", __func__); if (ctx == NULL || ctx->tsmux_dev == NULL) return -ENOMEM; + do { + spin_lock_irqsave(&ctx->tsmux_dev->device_spinlock, flags); + otf_job_queued = ctx->otf_job_queued; + if (!otf_job_queued) + ctx->otf_buf_mapped = false; + spin_unlock_irqrestore(&ctx->tsmux_dev->device_spinlock, flags); + if (otf_job_queued) { + udelay(1000); + wait_us += 1000; + if (wait_us > 1000000) { + print_tsmux(TSMUX_ERR, "%s, unmap buf failed\n", __func__); + return -EBUSY; + } + } + } while (otf_job_queued); + /* free otf buffer */ print_tsmux(TSMUX_OTF, "unmap otf out_buf\n"); for (i = 0; i < TSMUX_OUT_BUF_CNT; i++) { out_buf_info = &ctx->otf_outbuf_info[i]; + spin_lock_irqsave(&ctx->tsmux_dev->device_spinlock, flags); + temp_dma_addr = out_buf_info->dma_addr; + temp_dmabuf_att = out_buf_info->dmabuf_att; + temp_dmabuf = out_buf_info->dmabuf; + temp_vaddr = out_buf_info->vaddr; + out_buf_info->dma_addr = 0; + out_buf_info->dmabuf_att = 0; + out_buf_info->dmabuf = 0; + out_buf_info->vaddr = 0; + spin_unlock_irqrestore(&ctx->tsmux_dev->device_spinlock, flags); - if (out_buf_info->vaddr) { + if (temp_vaddr) { print_tsmux(TSMUX_OTF, "dma_buf_vunmap(%pK, %pK)\n", - out_buf_info->dmabuf, - out_buf_info->vaddr); - dma_buf_vunmap(out_buf_info->dmabuf, - out_buf_info->vaddr); - out_buf_info->vaddr = 0; + temp_dmabuf, temp_vaddr); + dma_buf_vunmap(temp_dmabuf, temp_vaddr); } - if (!IS_ERR_VALUE(out_buf_info->dma_addr) && out_buf_info->dma_addr) { - print_tsmux(TSMUX_OTF, "ion_iovmm_unmmap(%pK, %pK)\n", - out_buf_info->dmabuf_att, - (void *)out_buf_info->dma_addr); - ion_iovmm_unmap(out_buf_info->dmabuf_att, - out_buf_info->dma_addr); - out_buf_info->dma_addr = 0; + if (!IS_ERR_VALUE(temp_dma_addr) && temp_dma_addr) { + print_tsmux(TSMUX_OTF, "ion_iovmm_unmmap(%pK, %llx)\n", + temp_dmabuf_att, temp_dma_addr); + ion_iovmm_unmap(temp_dmabuf_att, temp_dma_addr); } print_tsmux(TSMUX_OTF, "ion_iovmm_unmap() ok\n"); - if (!IS_ERR_OR_NULL(out_buf_info->dmabuf_att)) { + if (!IS_ERR_OR_NULL(temp_dmabuf_att)) { print_tsmux(TSMUX_OTF, "dma_buf_detach(%pK, %pK)\n", - out_buf_info->dmabuf, - out_buf_info->dmabuf_att); - dma_buf_detach(out_buf_info->dmabuf, - out_buf_info->dmabuf_att); - out_buf_info->dmabuf_att = 0; + temp_dmabuf, temp_dmabuf_att); + dma_buf_detach(temp_dmabuf, temp_dmabuf_att); } print_tsmux(TSMUX_OTF, "dma_buf_detach() ok\n"); - if (!IS_ERR_OR_NULL(out_buf_info->dmabuf)) { - print_tsmux(TSMUX_OTF, "dma_buf_put(%pK)\n", - out_buf_info->dmabuf); - dma_buf_put(out_buf_info->dmabuf); - out_buf_info->dmabuf = 0; + if (!IS_ERR_OR_NULL(temp_dmabuf)) { + print_tsmux(TSMUX_OTF, "dma_buf_put(%pK)\n", temp_dmabuf); + dma_buf_put(temp_dmabuf); } print_tsmux(TSMUX_OTF, "dma_buf_put() ok\n"); @@ -1534,6 +1806,10 @@ static long tsmux_ioctl(struct file *filp, unsigned long flags; struct tsmux_psi_info temp_psi_info; struct tsmux_otf_config temp_otf_config; + struct tsmux_m2m_cmd_queue temp_m2m_cmd_queue; + struct tsmux_otf_cmd_queue temp_otf_cmd_queue; + int32_t temp_cur_buf_num; + struct tsmux_rtp_ts_info temp_rtp_ts_info; print_tsmux(TSMUX_COMMON, "%s++\n", __func__); @@ -1566,13 +1842,18 @@ static long tsmux_ioctl(struct file *filp, case TSMUX_IOCTL_M2M_MAP_BUF: print_tsmux(TSMUX_M2M, "TSMUX_IOCTL_M2M_MAP_BUF\n"); - if (copy_from_user(&ctx->m2m_cmd_queue, + if (copy_from_user(&temp_m2m_cmd_queue, (struct tsmux_m2m_cmd_queue __user *)arg, sizeof(struct tsmux_m2m_cmd_queue))) { ret = -EFAULT; break; } + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + memcpy(&ctx->m2m_cmd_queue, &temp_m2m_cmd_queue, + sizeof(struct tsmux_m2m_cmd_queue)); + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + for (i = 0; i < TSMUX_MAX_M2M_CMD_QUEUE_NUM; i++) { buf_fd = ctx->m2m_cmd_queue.m2m_job[i].in_buf.ion_buf_fd; buf_size = ctx->m2m_cmd_queue.m2m_job[i].in_buf.buffer_size; @@ -1625,13 +1906,18 @@ static long tsmux_ioctl(struct file *filp, case TSMUX_IOCTL_M2M_RUN: print_tsmux(TSMUX_M2M, "TSMUX_IOCTL_M2M_RUN\n"); - if (copy_from_user(&ctx->m2m_cmd_queue, + if (copy_from_user(&temp_m2m_cmd_queue, (struct tsmux_m2m_cmd_queue __user *)arg, sizeof(struct tsmux_m2m_cmd_queue))) { ret = -EFAULT; break; } + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + memcpy(&ctx->m2m_cmd_queue, &temp_m2m_cmd_queue, + sizeof(struct tsmux_m2m_cmd_queue)); + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + ret = tsmux_ioctl_m2m_run(ctx); if (copy_to_user((struct tsmux_m2m_cmd_queue __user *)arg, @@ -1644,18 +1930,19 @@ static long tsmux_ioctl(struct file *filp, case TSMUX_IOCTL_OTF_MAP_BUF: print_tsmux(TSMUX_OTF, "TSMUX_IOCTL_OTF_MAP_BUF\n"); - if (copy_from_user(&ctx->otf_cmd_queue, + if (copy_from_user(&temp_otf_cmd_queue, (struct tsmux_otf_cmd_queue __user *)arg, sizeof(struct tsmux_otf_cmd_queue))) { ret = -EFAULT; break; } - if (!tsmux_ioctl_otf_map_buf(ctx)) { - print_tsmux(TSMUX_ERR, "map fail for dst buf\n"); - ret = -EFAULT; - break; - } + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + memcpy(&ctx->otf_cmd_queue, &temp_otf_cmd_queue, + sizeof(struct tsmux_otf_cmd_queue)); + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + + ret = tsmux_ioctl_otf_map_buf(ctx); if (copy_to_user((struct tsmux_otf_cmd_queue __user *) arg, &ctx->otf_cmd_queue, sizeof(struct tsmux_otf_cmd_queue))) { @@ -1688,13 +1975,17 @@ static long tsmux_ioctl(struct file *filp, case TSMUX_IOCTL_OTF_Q_BUF: print_tsmux(TSMUX_OTF, "TSMUX_IOCTL_OTF_Q_BUF\n"); - if (copy_from_user(&ctx->otf_cmd_queue.cur_buf_num, + if (copy_from_user(&temp_cur_buf_num, (int32_t *)arg, sizeof(int32_t))) { ret = -EFAULT; break; } + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + ctx->otf_cmd_queue.cur_buf_num = temp_cur_buf_num; + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + if (!tsmux_ioctl_otf_q_buf(ctx)) ret = -EFAULT; break; @@ -1715,12 +2006,16 @@ static long tsmux_ioctl(struct file *filp, break; case TSMUX_IOCTL_SET_RTP_TS_INFO: - if (copy_from_user(&ctx->rtp_ts_info, + if (copy_from_user(&temp_rtp_ts_info, (struct tsmux_rtp_ts_info __user *)arg, sizeof(struct tsmux_rtp_ts_info))) { ret = -EFAULT; break; } + spin_lock_irqsave(&tsmux_dev->device_spinlock, flags); + memcpy(&ctx->rtp_ts_info, &temp_rtp_ts_info, sizeof(struct tsmux_rtp_ts_info)); + spin_unlock_irqrestore(&tsmux_dev->device_spinlock, flags); + print_tsmux(TSMUX_COMMON, "set, rtp 0x%x, overr %d, pat_cc 0x%x, pmt_cc 0x%x, v_cc 0x%x, a_cc 0x%x\n", ctx->rtp_ts_info.rtp_seq_number, ctx->rtp_ts_info.rtp_seq_override, ctx->rtp_ts_info.ts_pat_cc, ctx->rtp_ts_info.ts_pmt_cc, @@ -1757,11 +2052,40 @@ static const struct file_operations tsmux_fops = { .compat_ioctl = tsmux_ioctl, }; +#ifdef CONFIG_EXYNOS_ITMON +static int tsmux_itmon_notifier(struct notifier_block *nb, unsigned long action, void *nb_data) +{ + struct tsmux_device *tsmux_dev; + struct itmon_notifier *itmon_info = nb_data; + int is_port = 0, is_master = 0, is_dest = 0; + + tsmux_dev = container_of(nb, struct tsmux_device, itmon_nb); + + if (IS_ERR_OR_NULL(itmon_info)) + return NOTIFY_DONE; + + if (itmon_info->port && strncmp("WFD", itmon_info->port, sizeof("WFD") - 1) == 0) + is_port = 1; + if (itmon_info->master && strncmp("WFD", itmon_info->master, sizeof("WFD") - 1) == 0) + is_master = 1; + if (itmon_info->dest && strncmp("WFD", itmon_info->dest, sizeof("WFD") - 1) == 0) + is_dest = 1; + + if (is_port || is_master || is_dest) { + tsmux_sfr_dump(); + return NOTIFY_BAD; + } else { + return NOTIFY_DONE; + } +} +#endif + static int tsmux_probe(struct platform_device *pdev) { int ret = 0; struct tsmux_device *tsmux_dev; struct resource *res; + int i; print_tsmux(TSMUX_COMMON, "%s++\n", __func__); @@ -1795,6 +2119,8 @@ static int tsmux_probe(struct platform_device *pdev) goto err_ioremap; } + tsmux_ioremap_cmu_mfc_sfr(tsmux_dev); + pm_runtime_enable(&pdev->dev); if (ret < 0) { print_tsmux(TSMUX_ERR, "Failed to pm_runtime_enable (%d)\n", ret); @@ -1851,7 +2177,17 @@ static int tsmux_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tsmux_dev); - tsmux_dev->hw_version = tsmux_get_hw_version(tsmux_dev); +#ifdef CONFIG_EXYNOS_ITMON + tsmux_dev->itmon_nb.notifier_call = tsmux_itmon_notifier; + itmon_notifier_chain_register(&tsmux_dev->itmon_nb); +#endif + + setup_timer(&tsmux_dev->watchdog_timer, tsmux_watchdog, 0); + INIT_WORK(&tsmux_dev->watchdog_work, tsmux_watchdog_work_handler); + for (i = 0; i < TSMUX_MAX_CMD_QUEUE_NUM; i++) { + atomic_set(&tsmux_dev->watchdog_tick[i].watchdog_tick_running, 0); + atomic_set(&tsmux_dev->watchdog_tick[i].watchdog_tick_count, 0); + } print_tsmux(TSMUX_COMMON, "%s--\n", __func__); @@ -1885,6 +2221,10 @@ static int tsmux_remove(struct platform_device *pdev) ion_client_destroy(tsmux_dev->tsmux_ion_client); free_irq(tsmux_dev->irq, tsmux_dev); + + if (tsmux_dev->regs_base_cmu_mfc) + iounmap(tsmux_dev->regs_base_cmu_mfc); + iounmap(tsmux_dev->regs_base); if (tsmux_dev) { diff --git a/drivers/media/platform/exynos/tsmux/tsmux_dev.h b/drivers/media/platform/exynos/tsmux/tsmux_dev.h index 85f5dad7cfb1..feba05016256 100644 --- a/drivers/media/platform/exynos/tsmux/tsmux_dev.h +++ b/drivers/media/platform/exynos/tsmux/tsmux_dev.h @@ -24,6 +24,9 @@ #include #include #include +#ifdef CONFIG_EXYNOS_ITMON +#include +#endif #include "tsmux.h" @@ -45,12 +48,18 @@ struct tsmux_buffer_info { enum otf_buf_state buf_state; }; +struct tsmux_watchdog_tick { + atomic_t watchdog_tick_running; + atomic_t watchdog_tick_count; +}; + struct tsmux_device { struct miscdevice misc_dev; struct device *dev; uint32_t hw_version; void __iomem *regs_base; + void __iomem *regs_base_cmu_mfc; struct resource *tsmux_mem; struct clk *tsmux_clock; int irq; @@ -60,6 +69,13 @@ struct tsmux_device { int ctx_cnt; int ctx_cur; +#ifdef CONFIG_EXYNOS_ITMON + struct notifier_block itmon_nb; +#endif + struct timer_list watchdog_timer; + struct work_struct watchdog_work; + struct tsmux_watchdog_tick watchdog_tick[TSMUX_MAX_CMD_QUEUE_NUM]; + struct tsmux_context *ctx[TSMUX_MAX_CONTEXTS_NUM]; struct ion_client *tsmux_ion_client; }; @@ -82,6 +98,7 @@ struct tsmux_context { bool otf_psi_enabled[TSMUX_OUT_BUF_CNT]; bool otf_job_queued; + bool otf_buf_mapped; wait_queue_head_t m2m_wait_queue; wait_queue_head_t otf_wait_queue; diff --git a/drivers/media/platform/exynos/tsmux/tsmux_reg.c b/drivers/media/platform/exynos/tsmux/tsmux_reg.c index fdda40c55cdc..f62490218bf9 100644 --- a/drivers/media/platform/exynos/tsmux/tsmux_reg.c +++ b/drivers/media/platform/exynos/tsmux/tsmux_reg.c @@ -28,6 +28,8 @@ #define TSMUX_PKT_CTRL_SW_RESET_MASK (0x80000000) #define TSMUX_PKT_CTRL_PSI_EN_SHIFT (28) #define TSMUX_PKT_CTRL_PSI_EN_MASK (0x10000000) +#define TSMUX_PKT_CTRL_TSP_CONTINUITY_CNT_INIT_SHIFT (27) +#define TSMUX_PKT_CTRL_TSP_CONTINUITY_CNT_INIT_MASK (0x8000000) #define TSMUX_PKT_CTRL_RTP_SIZE_SHIFT (11) #define TSMUX_PKT_CTRL_RTP_SIZE_MASK (0x07FFF800) #define TSMUX_PKT_CTRL_RTP_SEQ_OVER_SHIFT (10) @@ -247,6 +249,53 @@ #define TSMUX_HEX_DBG_CTRL (TSMUX_HEX_BASE_ADDR + 0xC00) +#ifdef CONFIG_SOC_EXYNOS9810 +#include "cmu_mfc/exynos9810_cmu_mfc.h" +#endif +#define MAX_OFFSET_CMU_MFC_SFR 0x8000 +#define TSMUX_CMU_MFC_READL(offset) \ + (readl(tsmux_dev->regs_base_cmu_mfc + (offset))) + +void tsmux_ioremap_cmu_mfc_sfr(struct tsmux_device *tsmux_dev) { + if (tsmux_dev == NULL) { + print_tsmux(TSMUX_ERR, "tsmux_dev is NULL\n"); + return; + } + + tsmux_dev->regs_base_cmu_mfc = ioremap( + tsmux_cmu_mfc_sfr_list[0].base_pa, MAX_OFFSET_CMU_MFC_SFR); + if (tsmux_dev->regs_base_cmu_mfc == NULL) + print_tsmux(TSMUX_ERR, "ioremap(tsmux_cmu_mfc_sfr_list[0].base_pa) failed\n"); +} + +void tsmux_print_cmu_mfc_sfr(struct tsmux_device *tsmux_dev) { + int i; + u32 cmu_mfc_sfr; + + if (tsmux_dev == NULL) { + print_tsmux(TSMUX_ERR, "tsmux_dev is NULL\n"); + return; + } + + if (tsmux_dev->regs_base_cmu_mfc == NULL) { + print_tsmux(TSMUX_ERR, "regs_base_cmu_mfc is null\n"); + return; + } + + print_tsmux(TSMUX_SFR, "tsmux_cmu_mfc_sfr_list_size %d\n", tsmux_cmu_mfc_sfr_list_size); + print_tsmux(TSMUX_SFR, "cmu_mfc base addr: offset: value, name\n"); + + for (i = 0; i < tsmux_cmu_mfc_sfr_list_size; i++) { + cmu_mfc_sfr = TSMUX_CMU_MFC_READL(tsmux_cmu_mfc_sfr_list[i].offset); + print_tsmux(TSMUX_SFR, "%.8x: %.8x: %.8x, %s\n", + (uint32_t)tsmux_cmu_mfc_sfr_list[i].base_pa, + tsmux_cmu_mfc_sfr_list[i].offset, + cmu_mfc_sfr, + tsmux_cmu_mfc_sfr_list[i].sfr_name); + } + +} + uint32_t tsmux_get_hw_version(struct tsmux_device *tsmux_dev) { uint32_t version = 0; @@ -391,6 +440,7 @@ void tsmux_set_pkt_ctrl(struct tsmux_device *tsmux_dev, struct tsmux_pkt_ctrl *pkt_ctrl) { u32 pkt_ctrl_reg; + int32_t tsp_continuity_cnt_init = 1; print_tsmux(TSMUX_SFR, "%s++\n", __func__); @@ -407,6 +457,12 @@ void tsmux_set_pkt_ctrl(struct tsmux_device *tsmux_dev, print_tsmux(TSMUX_SFR, "PKT_CTRL_PSI_EN %d\n", pkt_ctrl->psi_en); print_tsmux(TSMUX_SFR, "pkt_ctrl_reg 0x%x\n", pkt_ctrl_reg); + pkt_ctrl_reg &= ~(TSMUX_PKT_CTRL_TSP_CONTINUITY_CNT_INIT_MASK); + pkt_ctrl_reg |= TSMUX_PKT_CTRL_TSP_CONTINUITY_CNT_INIT_MASK & + (tsp_continuity_cnt_init << TSMUX_PKT_CTRL_TSP_CONTINUITY_CNT_INIT_SHIFT); + print_tsmux(TSMUX_SFR, "PKT_CTRL_TSP_CONTINUITY_CNT_INIT %d\n", tsp_continuity_cnt_init); + print_tsmux(TSMUX_SFR, "pkt_ctrl_reg 0x%x\n", pkt_ctrl_reg); + pkt_ctrl_reg &= ~(TSMUX_PKT_CTRL_RTP_SIZE_MASK); pkt_ctrl_reg |= TSMUX_PKT_CTRL_RTP_SIZE_MASK & (pkt_ctrl->rtp_size << TSMUX_PKT_CTRL_RTP_SIZE_SHIFT); diff --git a/drivers/media/platform/exynos/tsmux/tsmux_reg.h b/drivers/media/platform/exynos/tsmux/tsmux_reg.h index e817740d0904..4f2ff521fe95 100644 --- a/drivers/media/platform/exynos/tsmux/tsmux_reg.h +++ b/drivers/media/platform/exynos/tsmux/tsmux_reg.h @@ -16,6 +16,10 @@ #include "tsmux_dev.h" +void tsmux_ioremap_cmu_mfc_sfr(struct tsmux_device *tsmux_dev); + +void tsmux_print_cmu_mfc_sfr(struct tsmux_device *tsmux_dev); + uint32_t tsmux_get_hw_version(struct tsmux_device *tsmux_dev); void tsmux_print_dbg_info_all(struct tsmux_device *tsmux_dev); diff --git a/drivers/misc/modem_v1/Kconfig b/drivers/misc/modem_v1/Kconfig index a6c68117abef..39f380124c1d 100644 --- a/drivers/misc/modem_v1/Kconfig +++ b/drivers/misc/modem_v1/Kconfig @@ -12,6 +12,7 @@ config SEC_MODEM_SS310AP select LINK_DEVICE_SHMEM select CP_SECURE_BOOT select CP_RAM_LOGGING + select KLAT default y config CP_ZEROCOPY @@ -119,5 +120,8 @@ config MODEM_IF_NET_GRO ---help--- This enables GRO(Generic Receive Offload) feature +config KLAT + bool "kernel CLAT" + default n endmenu endif diff --git a/drivers/misc/modem_v1/Makefile b/drivers/misc/modem_v1/Makefile index 22adaf279cd8..6cd8b21e56fb 100644 --- a/drivers/misc/modem_v1/Makefile +++ b/drivers/misc/modem_v1/Makefile @@ -28,3 +28,5 @@ ifeq ($(CONFIG_ARGOS), y) obj-y += modem_argos_notifier.o endif endif + +obj-$(CONFIG_KLAT) += modem_klat.o \ No newline at end of file diff --git a/drivers/misc/modem_v1/modem_io_device.c b/drivers/misc/modem_v1/modem_io_device.c index 01c3d17e7948..9dec3faeacc5 100644 --- a/drivers/misc/modem_v1/modem_io_device.c +++ b/drivers/misc/modem_v1/modem_io_device.c @@ -31,6 +31,7 @@ #include "modem_prj.h" #include "modem_utils.h" +#include "modem_klat.h" static u8 sipc5_build_config(struct io_device *iod, struct link_device *ld, unsigned int count); @@ -371,6 +372,9 @@ static int rx_multi_pdp(struct sk_buff *skb) skb_reset_network_header(skb); skb_reset_mac_header(skb); + /* klat */ + klat_rx(skb, skbpriv(skb)->sipc_ch - SIPC_CH_ID_PDP_0); + if (check_gro_support(skb)) { ret = napi_gro_receive(napi_get_current(), skb); if (ret == GRO_DROP) { diff --git a/drivers/misc/modem_v1/modem_klat.c b/drivers/misc/modem_v1/modem_klat.c new file mode 100644 index 000000000000..6e7b143b9924 --- /dev/null +++ b/drivers/misc/modem_v1/modem_klat.c @@ -0,0 +1,1072 @@ +/* + * Copyright (C) 2019 Samsung Electronics. + * + * This program has been developed as a CLAT module running at kernel, + * and it is based on android-clat written by + * + * Copyright (c) 2010-2012, Daniel Drown + * + * This file is dual licensed. It may be redistributed and/or modified + * under the terms of the Apache 2.0 License OR version 2 of the GNU + * General Public License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "modem_prj.h" +#include "modem_utils.h" +#include "modem_klat.h" + +//#define SUPPORT_KLAT_ICMP +//#define SUPPORT_KLAT_TX +#define KOBJ_CLAT "clat" + +#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ +#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ +#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ + +#define MAX_TCP_HDR (15 * 4) + +#define IN6_ARE_ADDR_EQUAL(a,b) \ + ((((const uint32_t *) (a))[0] == ((const uint32_t *) (b))[0]) \ + && (((const uint32_t *) (a))[1] == ((const uint32_t *) (b))[1]) \ + && (((const uint32_t *) (a))[2] == ((const uint32_t *) (b))[2]) \ + && (((const uint32_t *) (a))[3] == ((const uint32_t *) (b))[3])) + +struct klat klat_obj; + +static uint16_t ip_checksum_fold(uint32_t temp_sum) +{ + while(temp_sum > 0xFFFF) + temp_sum = (temp_sum >> 16) + (temp_sum & 0xFFFF); + + return temp_sum; +} + +static uint16_t ip_checksum_finish(uint32_t temp_sum) +{ + return ~ip_checksum_fold(temp_sum); +} + +static uint32_t ip_checksum_add(uint32_t curr, const void *data, int len) +{ + uint32_t checksum = curr; + int left = len; + const uint16_t *data_16 = data; + + while (left > 1) { + checksum += *data_16; + data_16++; + left -= 2; + } + + if (left) + checksum += *(uint8_t *)data_16; + + return checksum; +} + +static uint16_t ip_checksum(const void *data, int len) +{ + uint32_t temp_sum; + + temp_sum = ip_checksum_add(0, data, len); + return ip_checksum_finish(temp_sum); +} + +static uint32_t ipv6_pseudo_header_checksum(struct ipv6hdr *ip6, uint16_t len, + uint8_t protocol) +{ + uint32_t checksum_len, checksum_next; + uint32_t curr = 0; + + checksum_len = htonl((uint32_t) len); + checksum_next = htonl(protocol); + + curr = ip_checksum_add(curr, &(ip6->saddr), sizeof(struct in6_addr)); + curr = ip_checksum_add(curr, &(ip6->daddr), sizeof(struct in6_addr)); + curr = ip_checksum_add(curr, &checksum_len, sizeof(checksum_len)); + curr = ip_checksum_add(curr, &checksum_next, sizeof(checksum_next)); + + return curr; +} + +static uint32_t ipv4_pseudo_header_checksum(struct iphdr *ip, uint16_t len) +{ + uint16_t temp_protocol, temp_length; + uint32_t curr = 0; + + temp_protocol = htons(ip->protocol); + temp_length = htons(len); + + curr = ip_checksum_add(curr, &(ip->saddr), sizeof(uint32_t)); + curr = ip_checksum_add(curr, &(ip->daddr), sizeof(uint32_t)); + curr = ip_checksum_add(curr, &temp_protocol, sizeof(uint16_t)); + curr = ip_checksum_add(curr, &temp_length, sizeof(uint16_t)); + + return curr; +} + +static uint16_t ip_checksum_adjust(uint16_t checksum, uint32_t old_hdr_sum, + uint32_t new_hdr_sum) +{ + uint16_t folded_sum, folded_old; + + /* Algorithm suggested in RFC 1624. + * http://tools.ietf.org/html/rfc1624#section-3 + */ + checksum = ~checksum; + + folded_sum = ip_checksum_fold(checksum + new_hdr_sum); + folded_old = ip_checksum_fold(old_hdr_sum); + + if (folded_sum > folded_old) + return ~(folded_sum - folded_old); + + return ~(folded_sum - folded_old - 1); +} + +static uint16_t packet_checksum(uint32_t checksum, uint8_t *packet, size_t len) +{ + checksum = ip_checksum_add(checksum, packet, len); + + return ip_checksum_finish(checksum); +} + +static int udp_translate(struct udphdr *udp, uint32_t old_sum, uint32_t new_sum, + uint8_t *payload, size_t payload_size) +{ + if (udp->check) { + udp->check = ip_checksum_adjust(udp->check, old_sum, new_sum); + } else { + udp->check = 0; + udp->check = packet_checksum(new_sum, payload, payload_size); + } + + /* RFC 768: "If the computed checksum is zero, + * it is transmitted as all ones (the equivalent in one's complement + * arithmetic)." + */ + if (!udp->check) + udp->check = 0xFFFF; + + return 1; +} + +static int tcp_translate(struct tcphdr *tcp, + size_t header_size, uint32_t old_sum, uint32_t new_sum, + const uint8_t *payload, size_t payload_size) +{ + if (header_size > MAX_TCP_HDR) { + mif_err("header too long %d > %d, truncating", (int)header_size, + MAX_TCP_HDR); + header_size = MAX_TCP_HDR; + } + + tcp->check = ip_checksum_adjust(tcp->check, old_sum, new_sum); + + return 1; +} + +#ifdef SUPPORT_KLAT_ICMP +static int is_icmp_error(uint8_t type) +{ + return type == 3 || type == 11 || type == 12; +} + +static int is_icmp6_error(uint8_t type) +{ + return type < 128; +} + +static uint8_t icmp6_to_icmp_type(uint8_t type, uint8_t code) +{ + switch (type) { + case ICMPV6_ECHO_REQUEST: + return ICMP_ECHO; + + case ICMPV6_ECHO_REPLY: + return ICMP_ECHOREPLY; + + case ICMPV6_DEST_UNREACH: + return ICMP_DEST_UNREACH; + + case ICMPV6_TIME_EXCEED: + return ICMP_TIME_EXCEEDED; + } + + mif_err("unhandled ICMP type/code %d/%d\n", type, code); + return ICMP_PARAMETERPROB; +} + +static uint8_t icmp6_to_icmp_code(uint8_t type, uint8_t code) +{ + switch (type) { + case ICMPV6_ECHO_REQUEST: + case ICMPV6_ECHO_REPLY: + case ICMPV6_TIME_EXCEED: + return code; + + case ICMPV6_DEST_UNREACH: + switch (code) { + case ICMPV6_NOROUTE: + return ICMP_HOST_UNREACH; + case ICMPV6_ADM_PROHIBITED: + return ICMP_HOST_ANO; + case ICMPV6_NOT_NEIGHBOUR: + return ICMP_HOST_UNREACH; + case ICMPV6_ADDR_UNREACH: + return ICMP_HOST_UNREACH; + case ICMPV6_PORT_UNREACH: + return ICMP_PORT_UNREACH; + } + } + + mif_err("unhandled ICMP type/code %d/%d\n", type, code); + return 0; +} + +static uint8_t icmp_to_icmp6_type(uint8_t type, uint8_t code) +{ + switch (type) { + case ICMP_ECHO: + return ICMPV6_ECHO_REQUEST; + + case ICMP_ECHOREPLY: + return ICMPV6_ECHO_REPLY; + + case ICMP_TIME_EXCEEDED: + return ICMPV6_TIME_EXCEED; + + case ICMP_DEST_UNREACH: + if (code != ICMP_PORT_UNREACH && code != ICMP_FRAG_NEEDED) + return ICMPV6_DEST_UNREACH; + } + + mif_err("unhandled ICMP type %d\n", type); + return ICMPV6_PARAMPROB; +} + +static uint8_t icmp_to_icmp6_code(uint8_t type, uint8_t code) +{ + switch (type) { + case ICMP_ECHO: + case ICMP_ECHOREPLY: + return 0; + + case ICMP_TIME_EXCEEDED: + return code; + + case ICMP_DEST_UNREACH: + switch (code) { + case ICMP_NET_UNREACH: + case ICMP_HOST_UNREACH: + return ICMPV6_NOROUTE; + + case ICMP_PROT_UNREACH: + return ICMPV6_PORT_UNREACH; + + case ICMP_NET_ANO: + case ICMP_HOST_ANO: + case ICMP_PKT_FILTERED: + case ICMP_PREC_CUTOFF: + return ICMPV6_ADM_PROHIBITED; + } + } + mif_err("unhandled ICMP type/code %d/%d\n", type, code); + return 0; +} + +static int icmp_to_icmp6(struct sk_buff *skb, struct icmphdr *icmp, + uint32_t checksum, uint8_t *payload, + size_t payload_size) +{ + /* todo */ + return 0; +} + +static int icmp6_to_icmp(struct sk_buff *skb, struct icmp6hdr *icmp6, + uint8_t *payload, size_t payload_size, bool recursive) +{ + struct icmphdr *icmp_targ = ; + uint8_t icmp_type; + int clat_packet_len; + + memset(icmp_targ, 0, sizeof(struct icmphdr)); + + icmp_type = icmp6_to_icmp_type(icmp6->icmp6_type, icmp6->icmp6_code); + icmp_targ->type = icmp_type; + icmp_targ->code = icmp6_to_icmp_code(icmp6->icmp6_type, icmp6->icmp6_code); + + if (!recursive && is_icmp6_error(icmp6->icmp6_type) && icmp_type != ICMP_PARAMETERPROB) { + clat_packet_len = ipv6_packet(skb, payload, payload_size); + } else if (icmp_type == ICMP_ECHO || icmp_type == ICMP_ECHOREPLY) { + // Ping packet. + icmp_targ->un.echo.id = icmp6->icmp6_id; + icmp_targ->un.echo.sequence = icmp6->icmp6_seq; + clat_packet_len = 1; + } else { + /* Unknown type/code. */ + return 0; + } + + icmp_targ->checksum = 0; + icmp_targ->checksum = packet_checksum(0, payload, payload_size); + + return clat_packet_len; +} + +int icmp_packet(struct sk_buff *skb, struct icmphdr *icmp, uint32_t checksum, + size_t len) +{ + uint8_t *payload; + size_t payload_size; + + if (len < sizeof(struct icmphdr)) { + mif_err("icmp_packet/(too small)\n"); + return 0; + } + + payload = (uint8_t *) (icmp + 1); + payload_size = len - sizeof(struct icmphdr); + + return icmp_to_icmp6(skb, icmp, checksum, payload, payload_size); +} + +static int icmp6_packet(struct sk_buff *skb, struct icmp6hdr *icmp6, size_t len, bool recursive) +{ + uint8_t *payload; + size_t payload_size; + + if (len < sizeof(struct icmp6hdr)) { + mif_err("too small\n"); + return 0; + } + + payload = (uint8_t *) (icmp6 + 1); + payload_size = len - sizeof(struct icmp6hdr); + + return icmp6_to_icmp(skb, icmp6, payload, payload_size, recursive); +} +#endif +static int udp_packet(struct udphdr *udp, uint32_t old_sum, uint32_t new_sum, + size_t len) +{ + uint8_t *payload; + size_t payload_size; + + if (len < sizeof(struct udphdr)) { + mif_err("too small\n"); + return 0; + } + + payload = (uint8_t *) (udp + 1); + payload_size = len - sizeof(struct udphdr); + + return udp_translate(udp, old_sum, new_sum, payload, payload_size); +} + +static int tcp_packet(struct tcphdr *tcp, uint32_t old_sum, uint32_t new_sum, + size_t len) +{ + uint8_t *payload; + size_t payload_size, header_size; + + if (len < sizeof(struct tcphdr)) { + mif_err("too small\n"); + return 0; + } + + if (tcp->doff < 5) { + mif_err("tcp header length is less than 5: %x\n", tcp->doff); + return 0; + } + + if ((size_t)tcp->doff * 4 > len) { + mif_err("tcp header length set too large: %x\n", tcp->doff); + return 0; + } + + header_size = tcp->doff * 4; + payload = ((uint8_t *)tcp) + header_size; + payload_size = len - header_size; + + return tcp_translate(tcp, header_size, old_sum, new_sum, payload, + payload_size); +} + +static uint8_t parse_frag_header(struct frag_hdr *frag_hdr, + struct iphdr *ip_targ) +{ + uint16_t frag_off = (ntohs(frag_hdr->frag_off & IP6F_OFF_MASK) >> 3); + + if (frag_hdr->frag_off & IP6F_MORE_FRAG) { + frag_off |= IP_MF; + } + + ip_targ->frag_off = htons(frag_off); + ip_targ->id = htons(ntohl(frag_hdr->identification) & 0xFFFF); + ip_targ->protocol = frag_hdr->nexthdr; + + return frag_hdr->nexthdr; +} + +static uint8_t icmp_guess_ttl(uint8_t ttl) +{ + if (ttl > 128) { + return 255 - ttl; + } else if (ttl > 64) { + return 128 - ttl; + } else if (ttl > 32) { + return 64 - ttl; + } else { + return 32 - ttl; + } +} + +static bool is_in_plat_subnet(struct in6_addr *addr6) +{ + /* Assumes a /96 plat subnet. */ + return (addr6 != NULL) && + (memcmp(addr6->s6_addr, &klat_obj.plat_subnet, 12) == 0); +} + +static struct in6_addr ipv4_daddr_to_ipv6_daddr(uint32_t addr4) +{ + struct in6_addr addr6; + + /* Assumes a /96 plat subnet. */ + addr6 = klat_obj.plat_subnet; + addr6.s6_addr32[3] = addr4; + return addr6; +} + +static uint32_t ipv6_saddr_to_ipv4_saddr(struct in6_addr *addr6) +{ + if (is_in_plat_subnet(addr6)) { + /* Assumes a /96 plat subnet. */ + return addr6->s6_addr32[3]; + } + + return INADDR_NONE; +} + +static void fill_ip_header(struct iphdr *ip, uint16_t payload_len, + uint8_t protocol, struct ipv6hdr *old_header, + int ndev_index) +{ + int ttl_guess; + + memset(ip, 0, sizeof(struct iphdr)); + + ip->ihl = 5; + ip->version = 4; + ip->tos = 0; + ip->tot_len = htons(sizeof(struct iphdr) + payload_len); + ip->id = 0; + ip->frag_off = htons(IP_DF); + ip->ttl = old_header->hop_limit; + ip->protocol = protocol; + ip->check = 0; + + ip->saddr = ipv6_saddr_to_ipv4_saddr(&old_header->saddr); + ip->daddr = klat_obj.xlat_v4_addrs[ndev_index].s_addr; + + if ((uint32_t)ip->saddr == INADDR_NONE) { + ttl_guess = icmp_guess_ttl(old_header->hop_limit); + ip->saddr = htonl((0xff << 24) + ttl_guess); + } +} + +static void fill_ip6_header(struct ipv6hdr *ip6, uint16_t payload_len, + uint8_t protocol, + const struct iphdr *old_header, int ndev_index) +{ + memset(ip6, 0, sizeof(struct ipv6hdr)); + + ip6->version = 6; + ip6->payload_len = htons(payload_len); + ip6->nexthdr = protocol; + ip6->hop_limit = old_header->ttl; + + ip6->saddr = klat_obj.xlat_addrs[ndev_index]; + ip6->daddr = ipv4_daddr_to_ipv6_daddr(old_header->daddr); +} + +static size_t maybe_fill_frag_header(struct frag_hdr *frag_hdr, + struct ipv6hdr *ip6_targ, + const struct iphdr *old_header) +{ + uint16_t frag_flags = ntohs(old_header->frag_off); + uint16_t frag_off = frag_flags & IP_OFFSET; + + if (frag_off == 0 && (frag_flags & IP_MF) == 0) { + // Not a fragment. + return 0; + } + + frag_hdr->nexthdr = ip6_targ->nexthdr; + frag_hdr->reserved = 0; + + frag_hdr->frag_off = htons(frag_off << 3); + if (frag_flags & IP_MF) + frag_hdr->frag_off |= IP6F_MORE_FRAG; + + frag_hdr->identification = htonl(ntohs(old_header->id)); + ip6_targ->nexthdr = IPPROTO_FRAGMENT; + + return sizeof(*frag_hdr); +} + +static int ipv4_packet(struct sk_buff *skb, int ndev_index) +{ + struct iphdr *header = (struct iphdr *)skb->data; + struct ipv6hdr ip6_targ; + struct frag_hdr frag_hdr; + size_t frag_hdr_len; + uint8_t nxthdr; + uint8_t *next_header; + uint8_t *p_curr; + size_t len_left; + uint32_t old_sum, new_sum; + int iov_len = 0; + int len = skb->len; + + if (len < sizeof(struct iphdr)) { + mif_err("too short for an ip header\n"); + return 0; + } + + if (header->ihl < 5) { + mif_err("ip header length is less than 5: %x\n", header->ihl); + return 0; + } + + if (header->ihl * 4 > len) { + mif_err("ip header length set too large: %x\n", header->ihl); + return 0; + } + + if (header->version != 4) { + mif_err("ip header version not 4: %x\n", header->version); + return 0; + } + + next_header = skb->data + header->ihl*4; + len_left = len - header->ihl * 4; + + nxthdr = header->protocol; + if (nxthdr == IPPROTO_ICMP) + nxthdr = IPPROTO_ICMPV6; + + fill_ip6_header(&ip6_targ, 0, nxthdr, header, ndev_index); + + old_sum = ipv4_pseudo_header_checksum(header, len_left); + new_sum = ipv6_pseudo_header_checksum(&ip6_targ, len_left, nxthdr); + + frag_hdr_len = maybe_fill_frag_header(&frag_hdr, &ip6_targ, header); + + if (frag_hdr_len && frag_hdr.frag_off & IP6F_OFF_MASK) { + /* TODO */ + } else if (nxthdr == IPPROTO_ICMPV6) { +#ifdef SUPPORT_KLAT_ICMP + iov_len = icmp_packet(skb, (struct icmphdr *)next_header, new_sum, len_left); +#endif + } else if (nxthdr == IPPROTO_TCP) { + iov_len = tcp_packet((struct tcphdr *)next_header, old_sum, + new_sum, len_left); + } else if (nxthdr == IPPROTO_UDP) { + iov_len = udp_packet((struct udphdr *)next_header, old_sum, + new_sum, len_left); + } else { +#ifdef KLAT_DEBUG + mif_err("unknown protocol: %x\n", header->protocol); + mif_err("protocol: %*ph\n", skb->data, min(skb->len, 48)); +#endif + return 0; + } + + if (iov_len) { + int headroom = frag_hdr_len + sizeof(struct ipv6hdr) + - sizeof(struct iphdr); + + if (skb_headroom(skb) < headroom) { +#ifdef KLAT_DEBUG + pr_info("%s: head:%d, needed:%d\n", + skb_headroom(skb), headroom); +#endif + if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) { + pr_info("%s: ERR! re alloc failed\n", __func__); + return 0; + } + } + + skb_push(skb, headroom); + + /* Set the length.*/ + ip6_targ.payload_len = htons(len_left); + + /* copy ip_targ to skb */ + p_curr = skb->data; + memcpy(p_curr, &ip6_targ, sizeof(struct ipv6hdr)); + if (frag_hdr_len) { + p_curr += sizeof(struct ipv6hdr); + memcpy(p_curr, &frag_hdr, frag_hdr_len); + } + } + return iov_len; +} + +static int ipv6_packet(struct sk_buff *skb, int ndev_index) +{ + struct ipv6hdr *ip6 = (struct ipv6hdr *)skb->data; + struct iphdr ip_targ; + struct frag_hdr *frag_hdr = NULL; + uint8_t protocol; + unsigned char *next_header; + size_t len_left; + uint32_t old_sum, new_sum; + struct in6_addr *xlat_addr = &klat_obj.xlat_addrs[ndev_index]; + int iov_len = 0; + + if (skb->len < sizeof(struct ipv6hdr)) { + mif_info("too short for an ip6 header: %d\n", skb->len); + return 0; + } + + if (ipv6_addr_is_multicast(&ip6->daddr)) { + mif_err("multicast %pI6->%pI6\n", &ip6->saddr, &ip6->daddr); + return 0; + } + + if (!(is_in_plat_subnet(&ip6->saddr) && + IN6_ARE_ADDR_EQUAL(&ip6->daddr, xlat_addr)) && + !(is_in_plat_subnet(&ip6->daddr) && + IN6_ARE_ADDR_EQUAL(&ip6->saddr, xlat_addr)) && + ip6->nexthdr != NEXTHDR_ICMP) { + mif_err("wrong saddr: %pI6->%pI6\n", &ip6->saddr, &ip6->daddr); + return 0; + } + + next_header = skb->data + sizeof(struct ipv6hdr); + len_left = skb->len - sizeof(struct ipv6hdr); + + protocol = ip6->nexthdr; + + fill_ip_header(&ip_targ, 0, protocol, ip6, ndev_index); + + if (protocol == IPPROTO_FRAGMENT) { + frag_hdr = (struct frag_hdr *)next_header; + if (len_left < sizeof(*frag_hdr)) { + mif_err("short for fragment header: %d\n", skb->len); + return 0; + } + + next_header += sizeof(*frag_hdr); + len_left -= sizeof(*frag_hdr); + + protocol = parse_frag_header(frag_hdr, &ip_targ); + } + + if (protocol == IPPROTO_ICMPV6) { + protocol = IPPROTO_ICMP; + ip_targ.protocol = IPPROTO_ICMP; + } + + old_sum = ipv6_pseudo_header_checksum(ip6, len_left, protocol); + new_sum = ipv4_pseudo_header_checksum(&ip_targ, len_left); + + /* Does not support IPv6 extension headers except Fragment. */ + if (frag_hdr && (frag_hdr->frag_off & IP6F_OFF_MASK)) { + /* TODO */ + } else if (protocol == IPPROTO_ICMP) { +#ifdef SUPPORT_KLAT_ICMP + iov_len = icmp6_packet(skb, (struct icmp6hdr *)next_header, len_left, recursive); +#endif + } else if (protocol == IPPROTO_TCP) { + iov_len = tcp_packet((struct tcphdr *)next_header, old_sum, + new_sum, len_left); + } else if (protocol == IPPROTO_UDP) { + iov_len = udp_packet((struct udphdr *)next_header, old_sum, + new_sum, len_left); + } else { +#ifdef KLAT_DEBUG + mif_err("unknown next header type: %x\n", ip6->nexthdr); + mif_err("nxthdr: %*ph\n", skb->data, min(skb->len, 48)); +#endif + return 0; + } + + if (iov_len) { + /* Set the length and calculate the checksum. */ + ip_targ.tot_len = htons(len_left + sizeof(struct iphdr)); + ip_targ.check = ip_checksum(&ip_targ, sizeof(struct iphdr)); + + /* copy ip_targ to skb */ + memcpy(next_header - sizeof(struct iphdr), &ip_targ, + sizeof(struct iphdr)); + skb_pull(skb, next_header - skb->data - sizeof(struct iphdr)); + } + return iov_len; +} + +int klat_rx(struct sk_buff *skb, int ndev_index) +{ + if (klat_obj.use[ndev_index] && skb->protocol == htons(ETH_P_IPV6)) { + struct ipv6hdr *ip6hdr = (struct ipv6hdr *)skb->data; + + if (ipv6_addr_equal(&ip6hdr->daddr, + &klat_obj.xlat_addrs[ndev_index])) { + if (ipv6_packet(skb, ndev_index) > 0) { + skb->protocol = htons(ETH_P_IP); + skb->dev = klat_obj.tun_device[ndev_index]; + return 0; + } else { + pr_err("%s: src:%pI6c | dst:%pI6c | %*ph\n", + __func__, &ip6hdr->saddr, &ip6hdr->daddr, 48, ip6hdr); + } + } + } + + return -1; +} + +#ifdef SUPPORT_KLAT_TX +static int klat_tun_dev_index(struct net_device *dev) +{ + int index; + + for (index = 0; index < KLAT_MAX_NDEV; index++) + if (klat_obj.tun_device[index] == dev) + return index; + + return -1; +} + +static struct net_device_ops klat_netdev_ops; +static const struct net_device_ops *tun_netdev_ops; + +static netdev_tx_t klat_net_xmit(struct sk_buff *skb, struct net_device *dev) +{ + int ndev_index = klat_tun_dev_index(dev); +#if 0 // check if what is better + int queue_index = 0; +#endif + + if (ndev_index < 0 || klat_tx(skb, ndev_index)) + return tun_netdev_ops->ndo_start_xmit(skb, dev); + +#if 0 // check if what is better + if (dev->real_num_tx_queues != 1) { + const struct net_device_ops *ops = dev->netdev_ops; + + if (ops->ndo_select_queue) + queue_index = ops->ndo_select_queue(dev, skb, NULL, NULL); + else + queue_index = __netdev_pick_tx(dev, skb); + + queue_index = netdev_cap_txqueue(dev, queue_index); + } + + skb_set_queue_mapping(skb, queue_index); + return dev->netdev_ops->ndo_start_xmit(dev, skb); +#endif + + return dev_queue_xmit(skb); +} + +static void hook_tun_ops(struct net_device *ndev) +{ + if (klat_netdev_ops.ndo_start_xmit != klat_net_xmit) { + memcpy(&klat_netdev_ops, ndev->netdev_ops, sizeof(struct net_device_ops)); + klat_netdev_ops.ndo_start_xmit = klat_net_xmit; + tun_netdev_ops = ndev->netdev_ops; + } + + ndev->netdev_ops = &klat_netdev_ops; +} + +static void revert_tun_ops(struct net_device *ndev) +{ + ndev->netdev_ops = tun_netdev_ops; +} +#endif + +int klat_tx(struct sk_buff *skb, int ndev_index) +{ + if (klat_obj.use[ndev_index] && skb->protocol == htons(ETH_P_IP)) { + struct iphdr *iphdr = (struct iphdr *)skb->data; + + if (iphdr->saddr == klat_obj.xlat_v4_addrs[ndev_index].s_addr) { + if (ipv4_packet(skb, ndev_index) > 0) { + skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->protocol = htons(ETH_P_IPV6); + + skb->dev = klat_obj.rmnet_device[ndev_index]; + return 0; + } + } + } + return -1; +} + +static struct net_device *klat_dev_get_by_name(const char *devname) +{ + struct net_device *dev = NULL; + + rcu_read_lock(); + dev = dev_get_by_name_rcu(&init_net, devname); + rcu_read_unlock(); + + return dev; +} + +static int get_rmnet_index(const char *buf) +{ + if (buf && *buf != '\0' && strncmp(buf, "rmnet", 5) == 0 && + *(buf + 5) != '\0') { + int rmnet_idx = *(buf + 5) - '0'; + + if (rmnet_idx < KLAT_MAX_NDEV) + return rmnet_idx; + } + + return -1; +} + +static int klat_netdev_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + struct net_device *net = netdev_notifier_info_to_dev(ptr); + char *buf = strstr(net->name, "v4-rmnet"); + int ndev_idx; + + if (!buf) + return NOTIFY_DONE; + + ndev_idx = get_rmnet_index(buf + 3); + if (ndev_idx < 0) + return NOTIFY_DONE; + + switch (event) { + case NETDEV_DOWN: + case NETDEV_UNREGISTER: + if (klat_obj.use[ndev_idx]) { +#ifdef SUPPORT_KLAT_TX + revert_tun_ops(net); +#endif + klat_obj.use[ndev_idx] = 0; + mif_info("klat disabled(%s)\n", net->name); + } + break; + } + return NOTIFY_DONE; +} + +static struct notifier_block klat_netdev_notifier = { + .notifier_call = klat_netdev_event, +}; + +ssize_t klat_plat_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct in6_addr val; + char *ptr = NULL; + int rmnet_idx = 0; + + mif_err("plat prefix: %s\n", buf); + + ptr = strstr(buf, "@"); + if (!ptr) + return -EINVAL; + *ptr++ = '\0'; + + if (in6_pton(buf, strlen(buf), val.s6_addr, '\0', NULL) == 0) + return -EINVAL; + + rmnet_idx = get_rmnet_index(ptr); + if (rmnet_idx >= 0) { + klat_obj.plat_subnet = val; + klat_obj.use[rmnet_idx] = 1; + + mif_err("plat prefix: %pI6, klat(%d) enabled\n", + &klat_obj.plat_subnet, + rmnet_idx); + } else { + mif_err("plat prefix: %pI6, failed to enable klat\n", + &klat_obj.plat_subnet); + } + + return count; +} + +ssize_t klat_addrs_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct in6_addr val; + char *ptr = NULL; + int dev_index = -1; + char v4_rmnet[12]; + + mif_err("-- v6 addr: %s\n", buf); + + ptr = strstr(buf, "@"); + if (!ptr) + return -EINVAL; + *ptr++ = '\0'; + + if (in6_pton(buf, strlen(buf), val.s6_addr, '\0', NULL) == 0) + return -EINVAL; + + if (sscanf(ptr, "rmnet%d", &dev_index) != 1 || dev_index < 0 || dev_index >= KLAT_MAX_NDEV) { + mif_err("unhandled clat addr for device %s\n", ptr); + return -EINVAL; + } + + sprintf(v4_rmnet, "v4-rmnet%d", dev_index); + klat_obj.xlat_addrs[dev_index] = val; + klat_obj.tun_device[dev_index] = klat_dev_get_by_name(v4_rmnet); + klat_obj.rmnet_device[dev_index] = klat_dev_get_by_name(ptr); +#ifdef CONFIG_MODEM_IF_NET_GRO + klat_obj.tun_device[dev_index]->features |= NETIF_F_GRO; +#endif +#ifdef SUPPORT_KLAT_TX + hook_tun_ops(klat_obj.tun_device[dev_index]); +#endif + mif_err("rmnet%d: %pI6\n", dev_index, &val); + + return count; +} + +ssize_t klat_v4_addrs_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct in_addr val; + char *ptr = NULL; + int dev_index = -1; + + mif_err("v4 addr: %s\n", buf); + + ptr = strstr(buf, "@"); + if (!ptr) + return -EINVAL; + *ptr++ = '\0'; + + if (in4_pton(buf, strlen(buf), (u8 *)&val.s_addr, '\0', NULL) == 0) + return -EINVAL; + + ptr = strstr(ptr, "rmnet"); + if (!ptr) { + mif_err("can't find the right string\n"); + return -EINVAL; + } + + if (sscanf(ptr, "rmnet%d", &dev_index) != 1 || dev_index < 0 || dev_index >= KLAT_MAX_NDEV) { + mif_err("unhandled(%d) clat v4 addr for device %s\n", dev_index, ptr); + return -EINVAL; + } + + klat_obj.xlat_v4_addrs[dev_index].s_addr = val.s_addr; + mif_err("v4_rmnet%d: %pI4\n", dev_index, &val.s_addr); + + return count; +} + +#ifndef CONFIG_CP_DIT +static ssize_t klat_plat_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "plat prefix: %pI6\n", &klat_obj.plat_subnet); +} + +static ssize_t klat_addrs_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "%pI6\n%pI6\n", + &klat_obj.xlat_addrs[0], + &klat_obj.xlat_addrs[1]); +}; + +static ssize_t klat_v4_addrs_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "%pI4\n%pI4\n", + &klat_obj.xlat_v4_addrs[0], + &klat_obj.xlat_v4_addrs[1]); +} + +static struct kobject *clat_kobject; +static struct kobj_attribute xlat_plat_attribute = { + .attr = {.name = "xlat_plat", .mode = 0660}, + .show = klat_plat_show, + .store = klat_plat_store, +}; +static struct kobj_attribute xlat_addrs_attribute = { + .attr = {.name = "xlat_addrs", .mode = 0660}, + .show = klat_addrs_show, + .store = klat_addrs_store, +}; +static struct kobj_attribute xlat_v4_addrs_attribute = { + .attr = {.name = "xlat_v4_addrs", .mode = 0660}, + .show = klat_v4_addrs_show, + .store = klat_v4_addrs_store, +}; +static struct attribute *clat_attrs[] = { + &xlat_plat_attribute.attr, + &xlat_addrs_attribute.attr, + &xlat_v4_addrs_attribute.attr, + NULL, +}; +ATTRIBUTE_GROUPS(clat); +#endif + +static int __init klat_init(void) +{ +#ifndef CONFIG_CP_DIT + clat_kobject = kobject_create_and_add(KOBJ_CLAT, kernel_kobj); + if (!clat_kobject) + mif_err("%s: done ---\n", KOBJ_CLAT); + + if (sysfs_create_groups(clat_kobject, clat_groups)) + mif_err("failed to create clat groups node\n"); +#endif + register_netdevice_notifier(&klat_netdev_notifier); + + return 0; +} + +static void klat_exit(void) +{ + unregister_netdevice_notifier(&klat_netdev_notifier); + +#ifndef CONFIG_CP_DIT + if (clat_kobject) + kobject_put(clat_kobject); +#endif +} + +module_init(klat_init); +module_exit(klat_exit); + +MODULE_LICENSE("GPL and additional rights"); +MODULE_DESCRIPTION("SAMSUNG klat module"); +MODULE_AUTHOR("Jong eon Park "); \ No newline at end of file diff --git a/drivers/misc/modem_v1/modem_klat.h b/drivers/misc/modem_v1/modem_klat.h new file mode 100644 index 000000000000..3b362f333ff4 --- /dev/null +++ b/drivers/misc/modem_v1/modem_klat.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2019 Samsung Electronics. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __MODEM_KLAT_H__ +#define __MODEM_KLAT_H__ + +#include +#include +#include "modem_prj.h" + +#ifdef CONFIG_KLAT +/* for supporting max 4 rmnets (rmnet0, rmnet1 ...) */ +#define KLAT_MAX_NDEV 4 + +struct klat { + int use[KLAT_MAX_NDEV]; + + struct in_addr xlat_v4_addrs[KLAT_MAX_NDEV]; /* CLAT -> ipv4_local_subnet */ + struct in6_addr xlat_addrs[KLAT_MAX_NDEV]; /* CLAT -> ipv6_local_subnet */ + struct in6_addr plat_subnet; /* CLAT -> plat_subnet */ + + struct net_device *tun_device[KLAT_MAX_NDEV]; + struct net_device *rmnet_device[KLAT_MAX_NDEV]; +}; + +extern struct klat klat_obj; + +int klat_rx(struct sk_buff *skb, int ndev_index); +int klat_tx(struct sk_buff *skb, int ndev_index); + +ssize_t klat_plat_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count); +ssize_t klat_addrs_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count); +ssize_t klat_v4_addrs_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count); +#else +static inline int klat_rx(struct sk_buff *skb, int ndev_index) { return -1; } +static inline int klat_tx(struct sk_buff *skb, int ndev_index) { return -1; } + +static inline +ssize_t klat_plat_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) { return 0; } +static inline +ssize_t klat_addrs_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count) { return 0; } +static inline +ssize_t klat_v4_addrs_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count) { return 0; } +#endif /* CONFIG_KLAT */ + +#endif /*__MODEM_KLAT_H__*/ + diff --git a/drivers/net/wireless/bcmdhd_100_15/Makefile b/drivers/net/wireless/bcmdhd_100_15/Makefile index 5a43cd3ac4a3..c1b5bf6557fa 100644 --- a/drivers/net/wireless/bcmdhd_100_15/Makefile +++ b/drivers/net/wireless/bcmdhd_100_15/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 1999-2019, Broadcom. +# Copyright (C) 1999-2020, Broadcom. # # Unless you and Broadcom execute a separate written software license # agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/Makefile.kk b/drivers/net/wireless/bcmdhd_100_15/Makefile.kk index 9d229ec32455..5e1136531b07 100644 --- a/drivers/net/wireless/bcmdhd_100_15/Makefile.kk +++ b/drivers/net/wireless/bcmdhd_100_15/Makefile.kk @@ -1,5 +1,5 @@ # -# Copyright (C) 1999-2019, Broadcom. +# Copyright (C) 1999-2020, Broadcom. # # Unless you and Broadcom execute a separate written software license # agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/Makefile.lp b/drivers/net/wireless/bcmdhd_100_15/Makefile.lp index 66d0099cf85d..a54db0d9a959 100644 --- a/drivers/net/wireless/bcmdhd_100_15/Makefile.lp +++ b/drivers/net/wireless/bcmdhd_100_15/Makefile.lp @@ -1,5 +1,5 @@ # -# Copyright (C) 1999-2019, Broadcom. +# Copyright (C) 1999-2020, Broadcom. # # Unless you and Broadcom execute a separate written software license # agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/aiutils.c b/drivers/net/wireless/bcmdhd_100_15/aiutils.c index 72cdd827243b..e5a4db16a691 100644 --- a/drivers/net/wireless/bcmdhd_100_15/aiutils.c +++ b/drivers/net/wireless/bcmdhd_100_15/aiutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcm_app_utils.c b/drivers/net/wireless/bcmdhd_100_15/bcm_app_utils.c index 893c7b65914e..7f244a6295e3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcm_app_utils.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcm_app_utils.c @@ -3,7 +3,7 @@ * Contents are wifi-specific, used by any kernel or app-level * software that might want wifi things as it grows. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmbloom.c b/drivers/net/wireless/bcmdhd_100_15/bcmbloom.c index 211df5f2be66..9470371f122e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmbloom.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmbloom.c @@ -1,7 +1,7 @@ /* * Bloom filter support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmevent.c b/drivers/net/wireless/bcmdhd_100_15/bcmevent.c index 2a8a08b125b9..ba4328c021bb 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmevent.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmevent.c @@ -1,7 +1,7 @@ /* * bcmevent read-only data shared by kernel or app layers * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmsdh.c b/drivers/net/wireless/bcmdhd_100_15/bcmsdh.c index 53ba3a75bb25..2400fc8b2510 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmsdh.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmsdh.c @@ -2,7 +2,7 @@ * BCMSDH interface glue * implement bcmsdh API for SDIOH driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_linux.c b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_linux.c index 6d88766366f3..c5d0b0d54d55 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_linux.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_linux.c @@ -1,7 +1,7 @@ /* * SDIO access interface for drivers - linux specific (pci only) * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc.c b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc.c index c93c8f627da3..cacb87781f06 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc.c @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc_linux.c index d50ff59ae929..5673d118ac90 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmsdh_sdmmc_linux.c @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmstdlib_s.c b/drivers/net/wireless/bcmdhd_100_15/bcmstdlib_s.c index 42e74c17b142..79aab5f59c34 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmstdlib_s.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmstdlib_s.c @@ -1,7 +1,7 @@ /* * Broadcom Secure Standard Library. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmutils.c b/drivers/net/wireless/bcmdhd_100_15/bcmutils.c index bd096c94e942..69f31d7b44c4 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmutils.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmutils.c @@ -1,7 +1,7 @@ /* * Driver O/S-independent utility routines * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.c b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.c index 0c8b1cd5a0dc..aa0348e94b74 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.c @@ -3,7 +3,7 @@ * Contents are wifi-specific, used by any kernel or app-level * software that might want wifi things as it grows. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.h b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.h index 2e0d07e7f300..56bfa373fdb9 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.h +++ b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_channels.h @@ -3,7 +3,7 @@ * This header file housing the define and function prototype use by * both the wl driver, tools & Apps. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rates.h b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rates.h index 95b90a7e2324..9afaf2d72810 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rates.h +++ b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rates.h @@ -1,7 +1,7 @@ /* * Indices for 802.11 a/b/g/n/ac 1-3 chain symmetric transmit rates * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rspec.h b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rspec.h index 3b7685feeca0..05e12080e20d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rspec.h +++ b/drivers/net/wireless/bcmdhd_100_15/bcmwifi_rspec.h @@ -1,7 +1,7 @@ /* * Common OS-independent driver header for rate management. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/bcmxtlv.c b/drivers/net/wireless/bcmdhd_100_15/bcmxtlv.c index 8e4a3361cbf9..494c80d0e15e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/bcmxtlv.c +++ b/drivers/net/wireless/bcmdhd_100_15/bcmxtlv.c @@ -1,7 +1,7 @@ /* * Driver O/S-independent utility routines * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd.h b/drivers/net/wireless/bcmdhd_100_15/dhd.h index 23b603211678..c0568119080c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -27,7 +27,7 @@ * * <> * - * $Id: dhd.h 851174 2019-11-18 12:13:55Z $ + * $Id: dhd.h 860004 2020-01-20 02:39:12Z $ */ /**************** @@ -1578,6 +1578,8 @@ extern void dhd_pm_wake_lock_timeout(dhd_pub_t *pub, int val); extern void dhd_pm_wake_unlock(dhd_pub_t *pub); extern void dhd_txfl_wake_lock_timeout(dhd_pub_t *pub, int val); extern void dhd_txfl_wake_unlock(dhd_pub_t *pub); +extern void dhd_nan_wake_lock_timeout(dhd_pub_t *pub, int val); +extern void dhd_nan_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); @@ -1651,6 +1653,16 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) printf("call pm_wake unlock\n"); \ dhd_txfl_wake_unlock(pub); \ } while (0) +#define DHD_NAN_WAKE_LOCK_TIMEOUT(pub, val) \ + do { \ + printf("call pm_wake_timeout enable\n"); \ + dhd_nan_wake_lock_timeout(pub, val); \ + } while (0) +#define DHD_NAN_WAKE_UNLOCK(pub) \ + do { \ + printf("call pm_wake unlock\n"); \ + dhd_nan_wake_unlock(pub); \ + } while (0) #define DHD_OS_WAKE_LOCK_TIMEOUT(pub) \ do { \ printf("call wake_lock_timeout: %s %d\n", \ @@ -1708,6 +1720,8 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) #define DHD_PM_WAKE_UNLOCK(pub) dhd_pm_wake_unlock(pub) #define DHD_TXFL_WAKE_LOCK_TIMEOUT(pub, val) dhd_txfl_wake_lock_timeout(pub, val) #define DHD_TXFL_WAKE_UNLOCK(pub) dhd_txfl_wake_unlock(pub) +#define DHD_NAN_WAKE_LOCK_TIMEOUT(pub, val) dhd_nan_wake_lock_timeout(pub, val) +#define DHD_NAN_WAKE_UNLOCK(pub) dhd_nan_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) @@ -2073,11 +2087,13 @@ void dhd_schedule_cto_recovery(dhd_pub_t *dhdp); #define DHD_IP4BCAST_DROP_FILTER_NUM 7 #define DHD_LLC_STP_DROP_FILTER_NUM 8 #define DHD_LLC_XID_DROP_FILTER_NUM 9 +#define DHD_UDPNETBIOS_DROP_FILTER_NUM 10 #define DISCARD_IPV4_MCAST "102 1 6 IP4_H:16 0xf0 0xe0" #define DISCARD_IPV6_MCAST "103 1 6 IP6_H:24 0xff 0xff" #define DISCARD_IPV4_BCAST "107 1 6 IP4_H:16 0xffffffff 0xffffffff" #define DISCARD_LLC_STP "108 1 6 ETH_H:14 0xFFFFFFFFFFFF 0xAAAA0300000C" #define DISCARD_LLC_XID "109 1 6 ETH_H:14 0xFFFFFF 0x0001AF" +#define DISCARD_UDPNETBIOS "110 1 6 UDP_H:2 0xffff 0x0089" extern int dhd_os_enable_packet_filter(dhd_pub_t *dhdp, int val); extern void dhd_enable_packet_filter(int value, dhd_pub_t *dhd); extern int dhd_packet_filter_add_remove(dhd_pub_t *dhdp, int add_remove, int num); diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.c b/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.c index 50ef1531f094..d9646208a015 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.c @@ -1,7 +1,7 @@ /* * Bit packing and Base64 utils for EWP * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.h b/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.h index 02eb52d4427c..911e96e8ffdd 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_bitpack.h @@ -1,7 +1,7 @@ /* * Bit packing and Base64 utils for EWP * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_bus.h b/drivers/net/wireless/bcmdhd_100_15/dhd_bus.h index d5b5a31ffaa0..433d472c0dbd 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_bus.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_bus.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_cdc.c b/drivers/net/wireless/bcmdhd_100_15/dhd_cdc.c index fc457a3824a2..306cb745a083 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_cdc.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_cdc.c @@ -1,7 +1,7 @@ /* * DHD Protocol Module for CDC and BDC. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.c b/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.c index 016296117a37..b2529c103af1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.h b/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.h index dd0766a2987c..e2d61e80dbe0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_cfg80211.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_common.c b/drivers/net/wireless/bcmdhd_100_15/dhd_common.c index 7f718db8af2a..ba4a2fa77810 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_common.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_common.c @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), common DHD core. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_cis.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_cis.c index 4e983dfaf799..5a417ec3f103 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_cis.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_cis.c @@ -2,7 +2,7 @@ * Process CIS information from OTP for customer platform * (Handle the MAC address and module information) * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_exynos.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_exynos.c index 6fd524e47caf..61122769b930 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_exynos.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_exynos.c @@ -1,7 +1,7 @@ /* * Platform Dependent file for Samsung Exynos * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_gpio.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_gpio.c index fd5f97797f34..e7d1656cd9cf 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_gpio.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_gpio.c @@ -1,7 +1,7 @@ /* * Customer code to add GPIO control during WLAN start/stop * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_memprealloc.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_memprealloc.c index ef9f91022d07..7814f95e075b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_memprealloc.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_memprealloc.c @@ -1,7 +1,7 @@ /* * Platform Dependent file for usage of Preallocted Memory * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_msm.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_msm.c index 7c7ed9a7b22d..d328c23ec80f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_msm.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_msm.c @@ -1,7 +1,7 @@ /* * Platform Dependent file for Qualcomm MSM/APQ * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_sec.c b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_sec.c index c2bd6cbc5ce6..46622352c853 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_custom_sec.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_custom_sec.c @@ -1,7 +1,7 @@ /* * Customer HW 4 dependant file * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg.h b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg.h index 69b5076d67ab..691244f95463 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg.h @@ -1,7 +1,7 @@ /* * Debug/trace/assert driver definitions for Dongle Host Driver. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.c b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.c index d1e84e101159..2d68979ea8d7 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.c @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.h b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.h index ed83466f3cd2..163fc30c6924 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_dbg_ring.h @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_debug.c b/drivers/net/wireless/bcmdhd_100_15/dhd_debug.c index 7c2a27e23b33..33559adaf208 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_debug.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_debug.c @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_debug.h b/drivers/net/wireless/bcmdhd_100_15/dhd_debug.h index 184ee814dcfd..4deb07a8c811 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_debug.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_debug.h @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_debug_linux.c b/drivers/net/wireless/bcmdhd_100_15/dhd_debug_linux.c index fc2f9d969568..c51068143244 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_debug_linux.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_debug_linux.c @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.c b/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.c index a0c12032ace6..8b9a6fdff252 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.c @@ -1,7 +1,7 @@ /* * Wifi dongle status Filter and Report * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.h b/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.h index caf0f4acd993..0be3b03d83d1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_event_log_filter.h @@ -1,7 +1,7 @@ /* * Wifi dongle status Filter and Report * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.c b/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.c index ed6420669dd7..b17fa29b9762 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.c @@ -4,7 +4,7 @@ * Flow rings are transmit traffic (=propagating towards antenna) related entities * * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.h b/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.h index b205d9f4c87a..8d88085cd70a 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_flowring.h @@ -6,7 +6,7 @@ * Provides type definitions and function prototypes used to create, delete and manage flow rings at * high level. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_ip.c b/drivers/net/wireless/bcmdhd_100_15/dhd_ip.c index 484f01d6048b..e9c788a76832 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_ip.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_ip.c @@ -1,7 +1,7 @@ /* * IP Packet Parser Module. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_ip.h b/drivers/net/wireless/bcmdhd_100_15/dhd_ip.h index 6bda8149e2e5..532fad30d29e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_ip.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_ip.h @@ -3,7 +3,7 @@ * * Provides type definitions and function prototypes used to parse ip packet. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux.c index da7423fa72f6..1ff7ea10588d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux.c @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD), Linux-specific network interface * Basically selected code segments from usb-cdc.c and usb-rndis.c * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -25,7 +25,7 @@ * * <> * - * $Id: dhd_linux.c 854462 2019-12-09 02:29:44Z $ + * $Id: dhd_linux.c 864043 2020-02-12 07:34:04Z $ */ #include @@ -11134,7 +11134,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd->pktfilter[DHD_LLC_STP_DROP_FILTER_NUM] = DISCARD_LLC_STP; /* Immediately pkt filter TYPE 6 Dicard Cisco XID protocol */ dhd->pktfilter[DHD_LLC_XID_DROP_FILTER_NUM] = DISCARD_LLC_XID; - dhd->pktfilter_count = 10; + /* Immediately pkt filter TYPE 6 Dicard NETBIOS packet(port 137) */ + dhd->pktfilter[DHD_UDPNETBIOS_DROP_FILTER_NUM] = DISCARD_UDPNETBIOS; + dhd->pktfilter_count = 11; } #ifdef GAN_LITE_NAT_KEEPALIVE_FILTER @@ -16308,6 +16310,18 @@ dhd_txfl_wake_lock_timeout(dhd_pub_t *pub, int val) #endif /* CONFIG_HAS_WAKE_LOCK */ } +void +dhd_nan_wake_lock_timeout(dhd_pub_t *pub, int val) +{ +#ifdef CONFIG_HAS_WAKELOCK + dhd_info_t *dhd = (dhd_info_t *)(pub->info); + + if (dhd) { + wake_lock_timeout(&dhd->wl_nanwake, msecs_to_jiffies(val)); + } +#endif /* CONFIG_HAS_WAKE_LOCK */ +} + int net_os_wake_lock(struct net_device *dev) { dhd_info_t *dhd = DHD_DEV_INFO(dev); @@ -16390,6 +16404,20 @@ void dhd_txfl_wake_unlock(dhd_pub_t *pub) #endif /* CONFIG_HAS_WAKELOCK */ } +void dhd_nan_wake_unlock(dhd_pub_t *pub) +{ +#ifdef CONFIG_HAS_WAKELOCK + dhd_info_t *dhd = (dhd_info_t *)(pub->info); + + if (dhd) { + /* if wl_nanwake is active, unlock it */ + if (wake_lock_active(&dhd->wl_nanwake)) { + wake_unlock(&dhd->wl_nanwake); + } + } +#endif /* CONFIG_HAS_WAKELOCK */ +} + int dhd_os_check_wakelock(dhd_pub_t *pub) { #if defined(CONFIG_HAS_WAKELOCK) || defined(BCMSDIO) @@ -16417,7 +16445,7 @@ dhd_os_check_wakelock_all(dhd_pub_t *pub) { #if defined(CONFIG_HAS_WAKELOCK) || defined(BCMSDIO) #if defined(CONFIG_HAS_WAKELOCK) - int l1, l2, l3, l4, l7, l8, l9; + int l1, l2, l3, l4, l7, l8, l9, l10; int l5 = 0, l6 = 0; int c, lock_active; #endif /* CONFIG_HAS_WAKELOCK */ @@ -16447,13 +16475,14 @@ dhd_os_check_wakelock_all(dhd_pub_t *pub) #endif /* DHD_USE_SCAN_WAKELOCK */ l8 = wake_lock_active(&dhd->wl_pmwake); l9 = wake_lock_active(&dhd->wl_txflwake); - lock_active = (l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 || l9); + l10 = wake_lock_active(&dhd->wl_nanwake); + lock_active = (l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 || l9 || l10); /* Indicate to the Host to avoid going to suspend if internal locks are up */ if (lock_active) { DHD_ERROR(("%s wakelock c-%d wl-%d wd-%d rx-%d " - "ctl-%d intr-%d scan-%d evt-%d, pm-%d, txfl-%d\n", - __FUNCTION__, c, l1, l2, l3, l4, l5, l6, l7, l8, l9)); + "ctl-%d intr-%d scan-%d evt-%d, pm-%d, txfl-%d nan-%d\n", + __FUNCTION__, c, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10)); return 1; } #elif defined(BCMSDIO) @@ -16671,6 +16700,7 @@ void dhd_os_wake_lock_init(struct dhd_info *dhd) #ifdef DHD_USE_SCAN_WAKELOCK wake_lock_init(&dhd->wl_scanwake, WAKE_LOCK_SUSPEND, "wlan_scan_wake"); #endif /* DHD_USE_SCAN_WAKELOCK */ + wake_lock_init(&dhd->wl_nanwake, WAKE_LOCK_SUSPEND, "wlan_nan_wake"); #endif /* CONFIG_HAS_WAKELOCK */ #ifdef DHD_TRACE_WAKE_LOCK dhd_wk_lock_trace_init(dhd); @@ -16696,6 +16726,7 @@ void dhd_os_wake_lock_destroy(struct dhd_info *dhd) #ifdef DHD_USE_SCAN_WAKELOCK wake_lock_destroy(&dhd->wl_scanwake); #endif /* DHD_USE_SCAN_WAKELOCK */ + wake_lock_destroy(&dhd->wl_nanwake); #ifdef DHD_TRACE_WAKE_LOCK dhd_wk_lock_trace_deinit(dhd); #endif /* DHD_TRACE_WAKE_LOCK */ @@ -16714,6 +16745,7 @@ bool dhd_os_check_if_up(dhd_pub_t *pub) void dhd_set_version_info(dhd_pub_t *dhdp, char *fw) { int i; + uint chip; i = snprintf(info_string, sizeof(info_string), " Driver: %s\n Firmware: %s ", EPI_VERSION_STR, fw); @@ -16721,9 +16753,14 @@ void dhd_set_version_info(dhd_pub_t *dhdp, char *fw) if (!dhdp) return; + chip = dhd_bus_chip_id(dhdp); + if (chip == BCM4347_CHIP_ID) { + chip = BCM4361_CHIP_ID; + } + 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)); + "\n Chip: %x Rev %x Pkg %x", chip, dhd_bus_chiprev_id(dhdp), + dhd_bus_chippkg_id(dhdp)); } #endif /* BCMSDIO || BCMPCIE */ int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd) diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux.h b/drivers/net/wireless/bcmdhd_100_15/dhd_linux.h index cda002d277a8..b7bbf18c6da5 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux.h @@ -1,7 +1,7 @@ /* * DHD Linux header file (dhd_linux exports for cfg80211 and other components) * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_exportfs.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_exportfs.c index eee556b07743..2a7b4d851295 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_exportfs.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_exportfs.c @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD), Linux-specific network interface * Basically selected code segments from usb-cdc.c and usb-rndis.c * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_lb.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_lb.c index f57005b8fecb..49f68b535c25 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_lb.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_lb.c @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD), Linux-specific network interface * Basically selected code segments from usb-cdc.c and usb-rndis.c * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.c index 01e331c3bf6d..7dcf35336f63 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.c @@ -1,7 +1,7 @@ /* * Packet dump helper functions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.h b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.h index 016076f75f53..9a79c1a484c2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_pktdump.h @@ -1,7 +1,7 @@ /* * Header file for the Packet dump helper functions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_platdev.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_platdev.c index d8386b9a9c90..5bbd13a1da9c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_platdev.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_platdev.c @@ -1,7 +1,7 @@ /* * Linux platform device for DHD WLAN adapter * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_priv.h b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_priv.h index ce951759e1fd..7ff9d746d8e4 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_priv.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_priv.h @@ -1,7 +1,7 @@ /* * DHD Linux header file - contains private structure definition of the Linux specific layer * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: dhd_linux_priv.h 842211 2019-09-20 10:52:20Z $ + * $Id: dhd_linux_priv.h 860004 2020-01-20 02:39:12Z $ */ #ifndef __DHD_LINUX_PRIV_H__ @@ -123,6 +123,7 @@ typedef struct dhd_info { #ifdef DHD_USE_SCAN_WAKELOCK struct wake_lock wl_scanwake; /* Wifi scan wakelock */ #endif /* DHD_USE_SCAN_WAKELOCK */ + struct wake_lock wl_nanwake; /* NAN wakelock */ #endif /* CONFIG_HAS_WAKELOCK */ /* net_device interface lock, prevent race conditions among net_dev interface diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_sched.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_sched.c index fb76b3f0c9e3..19fca13ed34e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_sched.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_sched.c @@ -1,7 +1,7 @@ /* * Expose some of the kernel scheduler routines * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.c b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.c index c5f57bb8fa21..d19c9a4feaf0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.c @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD), Generic work queue framework * Generic interface to handle dhd deferred work events * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.h b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.h index 1367cb17ea02..a91db31da4db 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_linux_wq.h @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD), Generic work queue framework * Generic interface to handle dhd deferred work events * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.c b/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.c index bef05b67db24..eba560e64e90 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.c @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.h b/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.h index 8cb28c480f73..00f47351c368 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_mschdbg.h @@ -3,7 +3,7 @@ * * <> * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_msgbuf.c b/drivers/net/wireless/bcmdhd_100_15/dhd_msgbuf.c index 9cae29c17d60..9193ec7b02f2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_msgbuf.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_msgbuf.c @@ -3,7 +3,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.c b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.c index 951c8e36f3d3..592a789a5862 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.c @@ -1,7 +1,7 @@ /* * DHD Bus Module for PCIE * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.h b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.h index 14d384fbf3b5..9a6c21dd095d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie.h @@ -1,7 +1,7 @@ /* * Linux DHD Bus Module for PCIE * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie_linux.c b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie_linux.c index 2c269539ec34..0c9a30f34080 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pcie_linux.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pcie_linux.c @@ -1,7 +1,7 @@ /* * Linux DHD Bus Module for PCIE * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.c b/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.c index fe9f7f0c2e78..d0bca4d47a69 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.c @@ -1,7 +1,7 @@ /* * DHD debugability packet logging support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.h b/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.h index 28b2ec966d8a..e252f037683b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pktlog.h @@ -1,7 +1,7 @@ /* * DHD debugability packet logging header file * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pno.c b/drivers/net/wireless/bcmdhd_100_15/dhd_pno.c index 5d281cea3f06..ce56d1c3b00c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pno.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pno.c @@ -2,7 +2,7 @@ * Broadcom Dongle Host Driver (DHD) * Prefered Network Offload and Wi-Fi Location Service(WLS) code. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_pno.h b/drivers/net/wireless/bcmdhd_100_15/dhd_pno.h index fa4e24510a41..0b8098d7e23b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_pno.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_pno.h @@ -2,7 +2,7 @@ * Header file of Broadcom Dongle Host Driver (DHD) * Prefered Network Offload code and Wi-Fi Location Service(WLS) code. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_proto.h b/drivers/net/wireless/bcmdhd_100_15/dhd_proto.h index b607478a78ae..4457069c797c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_proto.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_proto.h @@ -4,7 +4,7 @@ * Provides type definitions and function prototypes used to link the * DHD OS, bus, and protocol modules. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.c b/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.c index 298174c374c1..7fb627afc33b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.c @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), RTT * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -656,20 +656,18 @@ exit: } static wl_proxd_iov_t * -rtt_alloc_getset_buf(wl_proxd_method_t method, wl_proxd_session_id_t session_id, +rtt_alloc_getset_buf(dhd_pub_t *dhd, wl_proxd_method_t method, wl_proxd_session_id_t session_id, wl_proxd_cmd_t cmdid, uint16 tlvs_bufsize, uint16 *p_out_bufsize) { uint16 proxd_iovsize; - uint32 kflags; wl_proxd_tlv_t *p_tlv; wl_proxd_iov_t *p_proxd_iov = (wl_proxd_iov_t *) NULL; *p_out_bufsize = 0; /* init */ - kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL; /* calculate the whole buffer size, including one reserve-tlv entry in the header */ proxd_iovsize = sizeof(wl_proxd_iov_t) + tlvs_bufsize; - p_proxd_iov = kzalloc(proxd_iovsize, kflags); + p_proxd_iov = (wl_proxd_iov_t *)MALLOCZ(dhd->osh, proxd_iovsize); if (p_proxd_iov == NULL) { DHD_RTT_ERR(("error: failed to allocate %d bytes of memory\n", proxd_iovsize)); return NULL; @@ -706,7 +704,7 @@ dhd_rtt_common_get_handler(dhd_pub_t *dhd, ftm_subcmd_info_t *p_subcmd_info, ftm_cmdid_to_str(p_subcmd_info->cmdid))); #endif // endif /* alloc mem for ioctl headr + reserved 0 bufsize for tlvs (initialize to zero) */ - p_proxd_iov = rtt_alloc_getset_buf(method, session_id, p_subcmd_info->cmdid, + p_proxd_iov = rtt_alloc_getset_buf(dhd, method, session_id, p_subcmd_info->cmdid, 0, &proxd_iovsize); if (p_proxd_iov == NULL) @@ -717,7 +715,7 @@ dhd_rtt_common_get_handler(dhd_pub_t *dhd, ftm_subcmd_info_t *p_subcmd_info, if (status != BCME_OK) { DHD_RTT(("%s failed: status=%d\n", __FUNCTION__, status)); } - kfree(p_proxd_iov); + MFREE(dhd->osh, p_proxd_iov, proxd_iovsize); return status; } @@ -753,8 +751,8 @@ dhd_rtt_common_set_handler(dhd_pub_t *dhd, const ftm_subcmd_info_t *p_subcmd_inf /* allocate and initialize a temp buffer for 'set proxd' iovar */ proxd_iovsize = 0; - p_proxd_iov = rtt_alloc_getset_buf(method, session_id, p_subcmd_info->cmdid, - 0, &proxd_iovsize); /* no TLV */ + p_proxd_iov = rtt_alloc_getset_buf(dhd, method, session_id, p_subcmd_info->cmdid, + 0, &proxd_iovsize); /* no TLV */ if (p_proxd_iov == NULL) return BCME_NOMEM; @@ -766,7 +764,7 @@ dhd_rtt_common_set_handler(dhd_pub_t *dhd, const ftm_subcmd_info_t *p_subcmd_inf } #endif // endif /* clean up */ - kfree(p_proxd_iov); + MFREE(dhd->osh, p_proxd_iov, proxd_iovsize); return ret; } @@ -1315,7 +1313,7 @@ dhd_rtt_ftm_config(dhd_pub_t *dhd, wl_proxd_session_id_t session_id, subcmd_info.name = "config"; subcmd_info.cmdid = WL_PROXD_CMD_CONFIG; - p_proxd_iov = rtt_alloc_getset_buf(WL_PROXD_METHOD_FTM, session_id, subcmd_info.cmdid, + p_proxd_iov = rtt_alloc_getset_buf(dhd, WL_PROXD_METHOD_FTM, session_id, subcmd_info.cmdid, FTM_IOC_BUFSZ, &proxd_iovsize); if (p_proxd_iov == NULL) { @@ -1346,7 +1344,7 @@ dhd_rtt_ftm_config(dhd_pub_t *dhd, wl_proxd_session_id_t session_id, } } /* clean up */ - kfree(p_proxd_iov); + MFREE(dhd->osh, p_proxd_iov, proxd_iovsize); return ret; } @@ -1814,19 +1812,20 @@ dhd_rtt_remove_geofence_target(dhd_pub_t *dhd, struct ether_addr *peer_addr) } /* left shift all the valid entries, as we dont keep holes in list */ - for (j = index; (j+1) < geofence_target_cnt; j++) { - if (geofence_target_info[j].valid == TRUE) { - /* - * src and dest buffer len same, pointers of same DS - * statically allocated - */ + for (j = index; j < geofence_target_cnt; j++) { + /* + * src and dest buffer len same, pointers of same DS + * statically allocated + */ + if ((j + 1) < geofence_target_cnt) { (void)memcpy_s(&geofence_target_info[j], sizeof(geofence_target_info[j]), - &geofence_target_info[j + 1], - sizeof(geofence_target_info[j + 1])); + &geofence_target_info[j + 1], sizeof(geofence_target_info[j + 1])); } else { - break; + /* reset the last target info */ + bzero(&geofence_target_info[j], sizeof(rtt_geofence_target_info_t)); } } + rtt_status->geofence_cfg.geofence_target_cnt--; if ((rtt_status->geofence_cfg.geofence_target_cnt == 0) || (index == rtt_status->geofence_cfg.cur_target_idx)) { @@ -1902,6 +1901,9 @@ dhd_rtt_sched_geofencing_target(dhd_pub_t *dhd) rtt_invalid_reason = dhd_rtt_invalid_states(dev, &geofence_target_info->peer_addr); if (rtt_invalid_reason != RTT_STATE_VALID) { + /* TODO: see if we can move to next target.. + * i.e, if invalid state is due to DP with same peer + */ ret = BCME_BUSY; DHD_RTT_ERR(("DRV State is not valid for RTT, " "invalid_state = %d\n", rtt_invalid_reason)); @@ -2072,9 +2074,10 @@ dhd_rtt_stop(dhd_pub_t *dhd, struct ether_addr *mac_list, int mac_cnt) list_for_each_entry_safe(rtt_result, next2, &entry->result_list, list) { list_del(&rtt_result->list); - kfree(rtt_result); + MFREE(dhd->osh, rtt_result, + sizeof(rtt_result_t)); } - kfree(entry); + MFREE(dhd->osh, entry, sizeof(rtt_results_header_t)); } GCC_DIAGNOSTIC_POP(); } @@ -2161,7 +2164,7 @@ dhd_rtt_timeout(dhd_pub_t *dhd) if (!ranging_inst) { goto exit; } - ret = wl_cfgnan_cancel_ranging(ndev, cfg, ranging_inst->range_id, + ret = wl_cfgnan_cancel_ranging(ndev, cfg, &ranging_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("%s:nan range cancel failed ret = %d status = %d\n", @@ -2552,7 +2555,7 @@ dhd_rtt_register_noti_callback(dhd_pub_t *dhd, void *ctx, dhd_rtt_compl_noti_fn goto exit; } } - cb = kmalloc(sizeof(struct rtt_noti_callback), GFP_ATOMIC); + cb = (struct rtt_noti_callback *)MALLOCZ(dhd->osh, sizeof(struct rtt_noti_callback)); if (!cb) { err = -ENOMEM; goto exit; @@ -2588,7 +2591,7 @@ dhd_rtt_unregister_noti_callback(dhd_pub_t *dhd, dhd_rtt_compl_noti_fn noti_fn) spin_unlock_bh(¬i_list_lock); if (cb) { - kfree(cb); + MFREE(dhd->osh, cb, sizeof(struct rtt_noti_callback)); } return err; } @@ -3163,9 +3166,10 @@ dhd_rtt_handle_rtt_session_end(dhd_pub_t *dhd) list_for_each_entry_safe(rtt_result, next2, &entry->result_list, list) { list_del(&rtt_result->list); - kfree(rtt_result); + MFREE(dhd->osh, rtt_result, + sizeof(rtt_result_t)); } - kfree(entry); + MFREE(dhd->osh, entry, sizeof(rtt_results_header_t)); } } GCC_DIAGNOSTIC_POP(); @@ -3210,7 +3214,8 @@ dhd_rtt_create_failure_result(rtt_status_info_t *rtt_status, sizeof(rtt_result_t)); if (!rtt_result) { ret = -ENOMEM; - kfree(rtt_results_header); + /* Free rtt result header */ + MFREE(rtt_status->dhd->osh, rtt_results_header, sizeof(rtt_results_header_t)); goto exit; } /* fill out the results from the configuration param */ @@ -3368,8 +3373,8 @@ exit: " ret = %d, err_at = %d\n", ret, err_at)); if (rtt_results_header) { list_del(&rtt_results_header->list); - kfree(rtt_results_header); - rtt_results_header = NULL; + MFREE(dhd->osh, rtt_results_header, + sizeof(rtt_results_header_t)); } } return ret; @@ -3389,7 +3394,6 @@ dhd_rtt_nan_range_report(struct bcm_cfg80211 *cfg, goto exit; } bzero(&range_res, sizeof(range_res)); - range_res.indication = 0; range_res.dist_mm = rtt_result->report.distance; /* same src and header len, ignoring ret val here */ (void)memcpy_s(&range_res.peer_m_addr, ETHER_ADDR_LEN, @@ -3501,6 +3505,7 @@ dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) rtt_status_info_t *rtt_status; rtt_results_header_t *rtt_results_header = NULL; bool is_new = TRUE; + rtt_target_info_t *target = NULL; #endif /* WL_CFG80211 */ DHD_RTT(("Enter %s \n", __FUNCTION__)); @@ -3577,6 +3582,16 @@ dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) goto exit; } } + + /* check current target_mac and event_mac are matching */ + target = &rtt_status->rtt_config.target_info[rtt_status->cur_idx]; + if (memcmp(&target->addr, &event->addr, ETHER_ADDR_LEN)) { + DHD_RTT(("Ignore Proxd event for the unexpected peer "MACDBG + " expected peer "MACDBG"\n", MAC2STRDBG(&event->addr), + MAC2STRDBG(&target->addr))); + goto exit; + } + #endif /* WL_CFG80211 */ #ifdef WL_CFG80211 @@ -3606,8 +3621,8 @@ dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) ret = dhd_rtt_handle_directed_rtt_burst_end(dhd, &event->addr, p_event, tlvs_len, rtt_result, FALSE); if (rtt_result && (ret != BCME_OK)) { - kfree(rtt_result); - rtt_result = NULL; + MFREE(dhd->osh, rtt_result, + sizeof(rtt_result_t)); goto exit; } break; @@ -3679,7 +3694,7 @@ dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) ret = bcm_unpack_xtlv_buf(buffer, (uint8 *)&p_event->tlvs[0], tlvs_len, BCM_XTLV_OPTION_NONE, rtt_unpack_xtlv_cbfn); - kfree(buffer); + MFREE(dhd->osh, buffer, tlvs_len); if (ret != BCME_OK) { DHD_RTT_ERR(("%s : Failed to unpack xtlv for event %d\n", __FUNCTION__, event_type)); @@ -3699,7 +3714,7 @@ dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) ret = bcm_unpack_xtlv_buf(buffer, (uint8 *)&p_event->tlvs[0], tlvs_len, BCM_XTLV_OPTION_NONE, rtt_unpack_xtlv_cbfn); - kfree(buffer); + MFREE(dhd->osh, buffer, tlvs_len); if (ret != BCME_OK) { DHD_RTT_ERR(("%s : Failed to unpack xtlv for event %d\n", __FUNCTION__, event_type)); @@ -4031,8 +4046,9 @@ dhd_rtt_init(dhd_pub_t *dhd) mutex_unlock(&rtt_status->rtt_work_mutex); exit: if (err < 0) { - kfree(rtt_status->rtt_config.target_info); - kfree(dhd->rtt_state); + MFREE(dhd->osh, rtt_status->rtt_config.target_info, + TARGET_INFO_SIZE(RTT_MAX_TARGET_CNT)); + MFREE(dhd->osh, dhd->rtt_state, sizeof(rtt_status_info_t)); } #endif /* WL_CFG80211 */ return err; @@ -4051,6 +4067,19 @@ dhd_rtt_deinit(dhd_pub_t *dhd) NULL_CHECK(dhd, "dhd is NULL", err); rtt_status = GET_RTTSTATE(dhd); NULL_CHECK(rtt_status, "rtt_status is NULL", err); + + if (delayed_work_pending(&rtt_status->rtt_retry_timer)) { + cancel_delayed_work_sync(&rtt_status->rtt_retry_timer); + } + + if (work_pending(&rtt_status->work)) { + cancel_work_sync(&rtt_status->work); + } + + if (delayed_work_pending(&rtt_status->proxd_timeout)) { + cancel_delayed_work_sync(&rtt_status->proxd_timeout); + } + rtt_status->status = RTT_STOPPED; DHD_RTT(("rtt is stopped %s \n", __FUNCTION__)); /* clear evt callback list */ @@ -4058,7 +4087,7 @@ dhd_rtt_deinit(dhd_pub_t *dhd) if (!list_empty(&rtt_status->noti_fn_list)) { list_for_each_entry_safe(iter, iter2, &rtt_status->noti_fn_list, list) { list_del(&iter->list); - kfree(iter); + MFREE(dhd->osh, iter, sizeof(struct rtt_noti_callback)); } } /* remove the rtt results */ @@ -4068,24 +4097,15 @@ dhd_rtt_deinit(dhd_pub_t *dhd) list_for_each_entry_safe(rtt_result, next2, &rtt_header->result_list, list) { list_del(&rtt_result->list); - kfree(rtt_result); + MFREE(dhd->osh, rtt_result, sizeof(rtt_result_t)); } - kfree(rtt_header); + MFREE(dhd->osh, rtt_header, sizeof(rtt_results_header_t)); } } GCC_DIAGNOSTIC_POP(); - - if (delayed_work_pending(&rtt_status->rtt_retry_timer)) { - cancel_delayed_work_sync(&rtt_status->rtt_retry_timer); - } - - if (delayed_work_pending(&rtt_status->proxd_timeout)) { - cancel_delayed_work_sync(&rtt_status->proxd_timeout); - } - - kfree(rtt_status->rtt_config.target_info); - kfree(dhd->rtt_state); - dhd->rtt_state = NULL; + MFREE(dhd->osh, rtt_status->rtt_config.target_info, + TARGET_INFO_SIZE(RTT_MAX_TARGET_CNT)); + MFREE(dhd->osh, dhd->rtt_state, sizeof(rtt_status_info_t)); #endif /* WL_CFG80211 */ return err; } diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.h b/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.h index ac993cf74091..71b1dd631e77 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_rtt.h @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), RTT * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_sdio.c b/drivers/net/wireless/bcmdhd_100_15/dhd_sdio.c index b3a163fe8cf0..9858f89811f1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_sdio.c @@ -1,7 +1,7 @@ /* * DHD Bus Module for SDIO * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_sec_feature.h b/drivers/net/wireless/bcmdhd_100_15/dhd_sec_feature.h index a86b36300561..83ae198b8bb0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_sec_feature.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_sec_feature.h @@ -1,7 +1,7 @@ /* * Customer HW 4 dependant file * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.c b/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.c index 90df38fee29c..22b4ebd06cc3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.c @@ -1,7 +1,7 @@ /* * DHD debugability: Status Information Logging support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.h b/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.h index 2f09933b34d0..9baba8efd997 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_statlog.h @@ -1,7 +1,7 @@ /* * DHD debugability: Header file for the Status Information Logging * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.c b/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.c index f6436ef84c85..92c5fdcb2316 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.c +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.c @@ -1,7 +1,7 @@ /* * DHD PROP_TXSTATUS Module. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.h b/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.h index 50e5e048d34a..77edd61e6aa4 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.h +++ b/drivers/net/wireless/bcmdhd_100_15/dhd_wlfc.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/dngl_stats.h b/drivers/net/wireless/bcmdhd_100_15/dngl_stats.h index a570f978c84c..8827fcca736d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/dngl_stats.h +++ b/drivers/net/wireless/bcmdhd_100_15/dngl_stats.h @@ -2,7 +2,7 @@ * Common stats definitions for clients of dongle * ports * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/frag.c b/drivers/net/wireless/bcmdhd_100_15/frag.c index de6f98c7db4d..ba82516f03df 100644 --- a/drivers/net/wireless/bcmdhd_100_15/frag.c +++ b/drivers/net/wireless/bcmdhd_100_15/frag.c @@ -2,7 +2,7 @@ * IE/TLV fragmentation/defragmentation support for * Broadcom 802.11bang Networking Device Driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/frag.h b/drivers/net/wireless/bcmdhd_100_15/frag.h index b415047145c0..775666d4bdf2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/frag.h +++ b/drivers/net/wireless/bcmdhd_100_15/frag.h @@ -2,7 +2,7 @@ * IE/TLV (de)fragmentation declarations/definitions for * Broadcom 802.11abgn Networking Device Driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/hnd_pktpool.c b/drivers/net/wireless/bcmdhd_100_15/hnd_pktpool.c index 3bbe7dc1ca8d..fe7a12dae56d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/hnd_pktpool.c +++ b/drivers/net/wireless/bcmdhd_100_15/hnd_pktpool.c @@ -1,7 +1,7 @@ /* * HND generic packet pool operation primitives * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/hnd_pktq.c b/drivers/net/wireless/bcmdhd_100_15/hnd_pktq.c index d6bbc94d6004..2f6a72c640cb 100644 --- a/drivers/net/wireless/bcmdhd_100_15/hnd_pktq.c +++ b/drivers/net/wireless/bcmdhd_100_15/hnd_pktq.c @@ -1,7 +1,7 @@ /* * HND generic pktq operation primitives * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/hndpmu.c b/drivers/net/wireless/bcmdhd_100_15/hndpmu.c index 4cf392dd4593..db9c92982ec4 100644 --- a/drivers/net/wireless/bcmdhd_100_15/hndpmu.c +++ b/drivers/net/wireless/bcmdhd_100_15/hndpmu.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing PMU corerev specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/802.11.h b/drivers/net/wireless/bcmdhd_100_15/include/802.11.h index 9ff60440d6a3..ee853263e1a2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/802.11.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/802.11.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to 802.11 * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -249,7 +249,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_management_header { uint16 seq; /* sequence control */ } BWL_POST_PACKED_STRUCT; typedef struct dot11_management_header dot11_management_header_t; -#define DOT11_MGMT_HDR_LEN 24 /* d11 management header length */ +#define DOT11_MGMT_HDR_LEN 24u /* d11 management header length */ /* Management frame payloads */ @@ -358,7 +358,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_tpc_rep { } BWL_POST_PACKED_STRUCT; typedef struct dot11_tpc_rep dot11_tpc_rep_t; #define DOT11_MNG_IE_TPC_REPORT_SIZE (sizeof(dot11_tpc_rep_t)) -#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ +#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ BWL_PRE_PACKED_STRUCT struct dot11_supp_channels { uint8 id; @@ -580,10 +580,33 @@ typedef struct dot11_extcap_ie dot11_extcap_ie_t; #define TDLS_CAP_MAX_BIT 39 /* TDLS max bit defined in ext cap */ +#define DOT11_CAP_SAE_HASH_TO_ELEMENT 5 /* SAE Hash-to-element support */ +#define DOT11_EXT_RSN_CAP_MAX_BIT DOT11_CAP_SAE_HASH_TO_ELEMENT /* Last bit */ + +BWL_PRE_PACKED_STRUCT struct dot11_rsnxe { + uint8 id; /* id DOT11_MNG_RSNXE_ID */ + uint8 len; + uint8 cap[1]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rsnxe dot11_rsnxe_t; + +#define RSNXE_CAP_LENGTH_MASK (0x0f) +#define RSNXE_CAP_LENGTH(cap) ((uint8)(cap) & RSNXE_CAP_LENGTH_MASK) +#define RSNXE_SET_CAP_LENGTH(cap, len)\ + (cap = (cap & ~RSNXE_CAP_LENGTH_MASK) | ((uint8)(len) & RSNXE_CAP_LENGTH_MASK)) + +BWL_PRE_PACKED_STRUCT struct dot11_rejected_groups_ie { + uint8 id; /* DOT11_MNG_EXT_ID */ + uint8 len; + uint8 id_ext; /* DOT11_MNG_REJECTED_GROUPS_ID */ + uint16 groups[0]; +} BWL_POST_PACKED_STRUCT; +typedef struct dot11_rejected_groups_ie dot11_rejected_groups_ie_t; + /* 802.11h/802.11k Measurement Request/Report IEs */ /* Measurement Type field */ -#define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */ -#define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */ +#define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */ +#define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */ #define DOT11_MEASURE_TYPE_RPI 2 /* d11 measurement RPI type */ #define DOT11_MEASURE_TYPE_CHLOAD 3 /* d11 measurement Channel Load type */ #define DOT11_MEASURE_TYPE_NOISE 4 /* d11 measurement Noise Histogram type */ @@ -602,13 +625,13 @@ typedef struct dot11_extcap_ie dot11_extcap_ie_t; #define DOT11_MEASURE_TYPE_PAUSE 255 /* d11 measurement pause type */ /* Measurement Request Modes */ -#define DOT11_MEASURE_MODE_PARALLEL (1<<0) /* d11 measurement parallel */ -#define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */ +#define DOT11_MEASURE_MODE_PARALLEL (1<<0) /* d11 measurement parallel */ +#define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */ #define DOT11_MEASURE_MODE_REQUEST (1<<2) /* d11 measurement request */ -#define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */ -#define DOT11_MEASURE_MODE_DUR (1<<4) /* d11 measurement dur mandatory */ +#define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */ +#define DOT11_MEASURE_MODE_DUR (1<<4) /* d11 measurement dur mandatory */ /* Measurement Report Modes */ -#define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */ +#define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */ #define DOT11_MEASURE_MODE_INCAPABLE (1<<1) /* d11 measurement incapable */ #define DOT11_MEASURE_MODE_REFUSED (1<<2) /* d11 measurement refuse */ /* Basic Measurement Map bits */ @@ -1388,11 +1411,12 @@ typedef struct ccx_qfl_ie ccx_qfl_ie_t; #define DOT11_SC_ANTICLOG_TOCKEN_REQUIRED 76 /* Anti-clogging tocken required */ #define DOT11_SC_INVALID_FINITE_CYCLIC_GRP 77 /* Invalid contents of RSNIE */ -#define DOT11_SC_TRANSMIT_FAILURE 79 /* transmission failure */ +#define DOT11_SC_TRANSMIT_FAILURE 79 /* transmission failure */ #define DOT11_SC_ASSOC_VHT_REQUIRED 104 /* Association denied because the requesting * station does not support VHT features. */ #define DOT11_SC_UNKNOWN_PASSWORD_IDENTIFIER 123 /* mismatch of password id */ +#define DOT11_SC_SAE_HASH_TO_ELEMENT 126 /* SAE Hash-to-element PWE required */ /* Info Elts, length of INFORMATION portion of Info Elts */ #define DOT11_MNG_DS_PARAM_LEN 1 /* d11 management DS parameter length */ @@ -1427,14 +1451,14 @@ typedef struct ccx_qfl_ie ccx_qfl_ie_t; #define DOT11_MNG_HOPPING_TABLE_ID 9 /* d11 management hopping table id */ #define DOT11_MNG_FTM_SYNC_INFO_ID 9 /* 11mc D4.3 */ #define DOT11_MNG_REQUEST_ID 10 /* d11 management request id */ -#define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */ +#define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */ #define DOT11_MNG_EDCA_PARAM_ID 12 /* 11E EDCA Parameter id */ #define DOT11_MNG_TSPEC_ID 13 /* d11 management TSPEC id */ #define DOT11_MNG_TCLAS_ID 14 /* d11 management TCLAS id */ #define DOT11_MNG_CHALLENGE_ID 16 /* d11 management chanllenge id */ #define DOT11_MNG_PWR_CONSTRAINT_ID 32 /* 11H PowerConstraint */ #define DOT11_MNG_PWR_CAP_ID 33 /* 11H PowerCapability */ -#define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */ +#define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */ #define DOT11_MNG_TPC_REPORT_ID 35 /* 11H TPC Report */ #define DOT11_MNG_SUPP_CHANNELS_ID 36 /* 11H Supported Channels */ #define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement */ @@ -1526,6 +1550,7 @@ typedef struct ccx_qfl_ie ccx_qfl_ie_t; #define DOT11_MNG_MESH_CSP_ID 222 /* d11 Mesh Channel Switch Parameter */ #define DOT11_MNG_FILS_IND_ID 240 /* 11ai FILS Indication element */ #define DOT11_MNG_FRAGMENT_ID 242 /* IE's fragment ID */ +#define DOT11_MNG_RSNXE_ID 244 /* RSN Extension Element (RSNXE) ID */ /* The follwing ID extensions should be defined >= 255 * i.e. the values should include 255 (DOT11_MNG_ID_EXT_ID + ID Extension). @@ -1573,6 +1598,9 @@ typedef struct ccx_qfl_ie ccx_qfl_ie_t; #define FILS_EXTID_MNG_NONCE_ID 13u /* FILS Nonce element */ #define DOT11_MNG_FILS_NONCE (DOT11_MNG_ID_EXT_ID + FILS_EXTID_MNG_NONCE_ID) +#define EXT_REJECTED_GROUPS_ID 14u /* Rejected Groups element */ +#define DOT11_MNG_REJECTED_GROUPS_ID (DOT11_MNG_ID_EXT_ID + EXT_REJECTED_GROUPS_ID) + /* deprecated definitions, do not use, to be deleted later */ #define FILS_HLP_CONTAINER_EXT_ID FILS_EXTID_MNG_HLP_CONTAINER_ID #define DOT11_ESP_EXT_ID OCE_EXTID_MNG_ESP_ID @@ -1632,6 +1660,7 @@ typedef struct ccx_qfl_ie ccx_qfl_ie_t; #define DOT11_BSS_MEMBERSHIP_HT 0xFF /* Basic 0x80 + 127, HT Required to join */ #define DOT11_BSS_MEMBERSHIP_VHT 0xFE /* Basic 0x80 + 126, VHT Required to join */ #define DOT11_BSS_MEMBERSHIP_HE 0xFD /* Basic 0x80 + 125, HE Required to join */ +#define DOT11_BSS_SAE_HASH_TO_ELEMENT 123u /* SAE Hash-to-element Required to join */ /* ERP info element bit values */ #define DOT11_MNG_ERP_LEN 1 /* ERP is currently 1 byte long */ @@ -3343,7 +3372,7 @@ typedef struct rrm_tscm { uint32 bin5; } rrm_tscm_t; enum { - DOT11_FTM_LOCATION_SUBJ_LOCAL = 0, /* Where am I? */ + DOT11_FTM_LOCATION_SUBJ_LOCAL = 0, /* Where am I? */ DOT11_FTM_LOCATION_SUBJ_REMOTE = 1, /* Where are you? */ DOT11_FTM_LOCATION_SUBJ_THIRDPARTY = 2 /* Where is he/she? */ }; @@ -3379,10 +3408,10 @@ BWL_PRE_PACKED_STRUCT struct dot11_rmrep_ftm_lci { } BWL_POST_PACKED_STRUCT; typedef struct dot11_rmrep_ftm_lci dot11_rmrep_ftm_lci_t; -#define DOT11_FTM_LCI_SUBELEM_ID 0 -#define DOT11_FTM_LCI_SUBELEM_LEN 2 -#define DOT11_FTM_LCI_FIELD_LEN 16 -#define DOT11_FTM_LCI_UNKNOWN_LEN 2 +#define DOT11_FTM_LCI_SUBELEM_ID 0 +#define DOT11_FTM_LCI_SUBELEM_LEN 2 +#define DOT11_FTM_LCI_FIELD_LEN 16 +#define DOT11_FTM_LCI_UNKNOWN_LEN 2 BWL_PRE_PACKED_STRUCT struct dot11_rmreq_ftm_civic { uint8 id; @@ -3414,11 +3443,11 @@ BWL_PRE_PACKED_STRUCT struct dot11_rmrep_ftm_civic { typedef struct dot11_rmrep_ftm_civic dot11_rmrep_ftm_civic_t; #define DOT11_FTM_CIVIC_LOC_TYPE_RFC4776 0 -#define DOT11_FTM_CIVIC_SUBELEM_ID 0 -#define DOT11_FTM_CIVIC_SUBELEM_LEN 2 -#define DOT11_FTM_CIVIC_LOC_SI_NONE 0 -#define DOT11_FTM_CIVIC_TYPE_LEN 1 -#define DOT11_FTM_CIVIC_UNKNOWN_LEN 3 +#define DOT11_FTM_CIVIC_SUBELEM_ID 0 +#define DOT11_FTM_CIVIC_SUBELEM_LEN 2 +#define DOT11_FTM_CIVIC_LOC_SI_NONE 0 +#define DOT11_FTM_CIVIC_TYPE_LEN 1 +#define DOT11_FTM_CIVIC_UNKNOWN_LEN 3 /* Location Identifier measurement request */ BWL_PRE_PACKED_STRUCT struct dot11_rmreq_locid { @@ -3588,7 +3617,7 @@ BWL_PRE_PACKED_STRUCT struct dot11_neighbor_rep_ie { uint8 reg; /* Operating class */ uint8 channel; uint8 phytype; - uint8 data[1]; /* Variable size subelements */ + uint8 data[1]; /* Variable size subelements */ } BWL_POST_PACKED_STRUCT; typedef struct dot11_neighbor_rep_ie dot11_neighbor_rep_ie_t; #define DOT11_NEIGHBOR_REP_IE_FIXED_LEN 13u @@ -3787,13 +3816,13 @@ typedef struct d11cnt { #define BRCM_PROP_OUI "\x00\x90\x4C" -#define BRCM_FTM_IE_TYPE 14 +#define BRCM_FTM_IE_TYPE 14 -/* #define HT_CAP_IE_TYPE 51 - * #define HT_ADD_IE_TYPE 52 +/* #define HT_CAP_IE_TYPE 51 + * #define HT_ADD_IE_TYPE 52 * #define BRCM_EXTCH_IE_TYPE 53 * #define MEMBER_OF_BRCM_PROP_IE_TYPE 54 - * #define BRCM_RELMACST_IE_TYPE 55 + * #define BRCM_RELMACST_IE_TYPE 55 * #define BRCM_EVT_WL_BSS_INFO 64 * #define RWL_ACTION_WIFI_FRAG_TYPE 85 * #define BTC_INFO_BRCM_PROP_IE_TYPE 90 @@ -3860,11 +3889,12 @@ BWL_PRE_PACKED_STRUCT struct brcm_ie { uint8 flags; /* misc flags */ uint8 flags1; /* misc flags */ uint16 amsdu_mtu_pref; /* preferred A-MSDU MTU */ + uint8 flags2; /* Bit 0: DTPC TX cap, Bit 1: DTPC Recv Cap */ } BWL_POST_PACKED_STRUCT; typedef struct brcm_ie brcm_ie_t; -#define BRCM_IE_LEN 11 /* BRCM IE length */ -#define BRCM_IE_VER 2 /* BRCM IE version */ -#define BRCM_IE_LEGACY_AES_VER 1 /* BRCM IE legacy AES version */ +#define BRCM_IE_LEN 12u /* BRCM IE length */ +#define BRCM_IE_VER 2u /* BRCM IE version */ +#define BRCM_IE_LEGACY_AES_VER 1u /* BRCM IE legacy AES version */ /* brcm_ie flags */ #define BRF_ABCAP 0x1 /* afterburner is obsolete, defined for backward compat */ @@ -3888,6 +3918,11 @@ typedef struct brcm_ie brcm_ie_t; #define BRF1_SOFTAP 0x40 /* Configure as Broadcom SOFTAP */ #define BRF1_DWDS 0x80 /* DWDS capable */ +/* brcm_ie flags2 */ +#define BRF2_DTPC_TX 0x1u /* DTPC: DTPC TX Cap */ +#define BRF2_DTPC_RX 0x2u /* DTPC: DTPC RX Cap */ +#define BRF2_DTPC_TX_RX 0x3u /* DTPC: Enable Both DTPC TX and RX Cap */ + /** Vendor IE structure */ BWL_PRE_PACKED_STRUCT struct vndr_ie { uchar id; @@ -4031,10 +4066,10 @@ typedef struct ht_prop_cap_ie ht_prop_cap_ie_t; #define HT_CAP_TXBF_CAP_CHAN_ESTIM_SHIFT 27 #define HT_CAP_TXBF_CAP_CHAN_ESTIM_MASK 0x18000000 -#define HT_CAP_TXBF_FB_TYPE_NONE 0 -#define HT_CAP_TXBF_FB_TYPE_DELAYED 1 -#define HT_CAP_TXBF_FB_TYPE_IMMEDIATE 2 -#define HT_CAP_TXBF_FB_TYPE_BOTH 3 +#define HT_CAP_TXBF_FB_TYPE_NONE 0 +#define HT_CAP_TXBF_FB_TYPE_DELAYED 1 +#define HT_CAP_TXBF_FB_TYPE_IMMEDIATE 2 +#define HT_CAP_TXBF_FB_TYPE_BOTH 3 #define HT_CAP_TX_BF_CAP_EXPLICIT_CSI_FB_MASK 0x400 #define HT_CAP_TX_BF_CAP_EXPLICIT_CSI_FB_SHIFT 10 @@ -4119,7 +4154,7 @@ typedef struct ht_prop_add_ie ht_prop_add_ie_t; /* byte1 defn's */ #define HT_BW_ANY 0x04 /* set, STA can use 20 or 40MHz */ -#define HT_RIFS_PERMITTED 0x08 /* RIFS allowed */ +#define HT_RIFS_PERMITTED 0x08 /* RIFS allowed */ /* opmode defn's */ #define HT_OPMODE_MASK 0x0003 /* protection mode mask */ @@ -4303,7 +4338,7 @@ typedef struct vht_cap_ie vht_cap_ie_t; #define VHT_CAP_MCS_0_7_RATEMAP 0x00ff #define VHT_CAP_MCS_0_8_RATEMAP 0x01ff #define VHT_CAP_MCS_0_9_RATEMAP 0x03ff -#define VHT_CAP_MCS_FULL_RATEMAP VHT_CAP_MCS_0_9_RATEMAP +#define VHT_CAP_MCS_FULL_RATEMAP VHT_CAP_MCS_0_9_RATEMAP #define VHT_PROP_MCS_MAP_10_11 0 #define VHT_PROP_MCS_MAP_UNUSED1 1 @@ -4573,10 +4608,12 @@ typedef struct vht_features_ie_hdr vht_features_ie_hdr_t; #define WCN_OUI "\x00\x50\xf2" /* WCN OUI */ #define WCN_TYPE 4 /* WCN type */ +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WPI #define SMS4_KEY_LEN 16 #define SMS4_WPI_CBC_MAC_LEN 16 #endif // endif +// MOG-OFF: BCMWAPI /* 802.11r protocol definitions */ @@ -4686,13 +4723,15 @@ typedef struct dot11_ft_rrb_frame dot11_ft_rrb_frame_t; #define BSSID_INVALID "\x00\x00\x00\x00\x00\x00" #define BSSID_BROADCAST "\xFF\xFF\xFF\xFF\xFF\xFF" +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WAI -#define WAPI_IE_MIN_LEN 20 /* WAPI IE min length */ +#define WAPI_IE_MIN_LEN 20 /* WAPI IE min length */ #define WAPI_VERSION 1 /* WAPI version */ #define WAPI_VERSION_LEN 2 /* WAPI version length */ #define WAPI_OUI "\x00\x14\x72" /* WAPI OUI */ #define WAPI_OUI_LEN DOT11_OUI_LEN /* WAPI OUI length */ #endif /* BCMWAPI_WAI */ +// MOG-OFF: BCMWAPI /* ************* WMM Parameter definitions. ************* */ #define WMM_OUI "\x00\x50\xF2" /* WNN OUI */ @@ -5039,25 +5078,25 @@ enum { }; enum { - FTM_PARAMS_CHAN_INFO_NO_PREF = 0, - FTM_PARAMS_CHAN_INFO_RESERVE1 = 1, - FTM_PARAMS_CHAN_INFO_RESERVE2 = 2, - FTM_PARAMS_CHAN_INFO_RESERVE3 = 3, - FTM_PARAMS_CHAN_INFO_NON_HT_5 = 4, + FTM_PARAMS_CHAN_INFO_NO_PREF = 0, + FTM_PARAMS_CHAN_INFO_RESERVE1 = 1, + FTM_PARAMS_CHAN_INFO_RESERVE2 = 2, + FTM_PARAMS_CHAN_INFO_RESERVE3 = 3, + FTM_PARAMS_CHAN_INFO_NON_HT_5 = 4, FTM_PARAMS_CHAN_INFO_RESERVE5 = 5, - FTM_PARAMS_CHAN_INFO_NON_HT_10 = 6, + FTM_PARAMS_CHAN_INFO_NON_HT_10 = 6, FTM_PARAMS_CHAN_INFO_RESERVE7 = 7, - FTM_PARAMS_CHAN_INFO_NON_HT_20 = 8, /* excludes 2.4G, and High rate DSSS */ - FTM_PARAMS_CHAN_INFO_HT_MF_20 = 9, - FTM_PARAMS_CHAN_INFO_VHT_20 = 10, - FTM_PARAMS_CHAN_INFO_HT_MF_40 = 11, - FTM_PARAMS_CHAN_INFO_VHT_40 = 12, - FTM_PARAMS_CHAN_INFO_VHT_80 = 13, - FTM_PARAMS_CHAN_INFO_VHT_80_80 = 14, - FTM_PARAMS_CHAN_INFO_VHT_160_2_RFLOS = 15, + FTM_PARAMS_CHAN_INFO_NON_HT_20 = 8, /* excludes 2.4G, and High rate DSSS */ + FTM_PARAMS_CHAN_INFO_HT_MF_20 = 9, + FTM_PARAMS_CHAN_INFO_VHT_20 = 10, + FTM_PARAMS_CHAN_INFO_HT_MF_40 = 11, + FTM_PARAMS_CHAN_INFO_VHT_40 = 12, + FTM_PARAMS_CHAN_INFO_VHT_80 = 13, + FTM_PARAMS_CHAN_INFO_VHT_80_80 = 14, + FTM_PARAMS_CHAN_INFO_VHT_160_2_RFLOS = 15, FTM_PARAMS_CHAN_INFO_VHT_160 = 16, /* Reserved from 17 - 30 */ - FTM_PARAMS_CHAN_INFO_DMG_2160 = 31, + FTM_PARAMS_CHAN_INFO_DMG_2160 = 31, /* Reserved from 32 - 63 */ FTM_PARAMS_CHAN_INFO_MAX = 63 }; @@ -5106,21 +5145,49 @@ enum { /* add additional types above */ }; -/* the following definitions are *DEPRECATED* and moved to implemenetion files. They +/* the following definitions are *DEPRECATED* and moved to implementation files. They * are retained here because previous (May 2016) some branches use them */ -#define FTM_TPK_LEN 16 -#define FTM_RI_RR_BUF_LEN 32 -#define FTM_TPK_RI_RR_LEN 13 -#define FTM_TPK_RI_RR_LEN_SECURE_2_0 28 -#define FTM_TPK_DIGEST_LEN 32 -#define FTM_TPK_BUFFER_LEN 128 -#define FTM_TPK_RI_PHY_LEN 7 -#define FTM_TPK_RR_PHY_LEN 7 -#define FTM_TPK_DATA_BUFFER_LEN 88 -#define FTM_TPK_LEN_SECURE_2_0 32 -#define FTM_TPK_RI_PHY_LEN_SECURE_2_0 14 -#define FTM_TPK_RR_PHY_LEN_SECURE_2_0 14 +#define FTM_TPK_LEN 16u +#define FTM_RI_RR_BUF_LEN 32u +#define FTM_TPK_RI_RR_LEN 13 +#define FTM_TPK_RI_RR_LEN_SECURE_2_0 28 +#define FTM_TPK_RI_PHY_LEN 7u +#define FTM_TPK_RR_PHY_LEN 7u +#define FTM_TPK_DATA_BUFFER_LEN 88u +#define FTM_TPK_LEN_SECURE_2_0 64u +#define FTM_TPK_RI_PHY_LEN_SECURE_2_0 14u +#define FTM_TPK_RR_PHY_LEN_SECURE_2_0 14u + +#define FTM_RI_RR_BUF_LEN_20MHZ 32u +#define FTM_RI_RR_BUF_LEN_80MHZ 64u + +#define FTM_RI_RR_BUF_LEN_FROM_CHANSPEC(chanspec) \ + (CHSPEC_IS20((chanspec)) ? \ + FTM_RI_RR_BUF_LEN_20MHZ : FTM_RI_RR_BUF_LEN_80MHZ) + +#define FTM_TPK_RI_RR_LEN_SECURE_2_0_20MHZ 28u +#define FTM_TPK_RI_RR_LEN_SECURE_2_0_80MHZ 62u +#define FTM_TPK_RI_RR_LEN_SECURE_2_0_2G FTM_TPK_RI_RR_LEN_SECURE_2_0 +#define FTM_TPK_RI_RR_LEN_SECURE_2_0_5G FTM_TPK_RI_RR_LEN_SECURE_2_0_80MHZ + +#define FTM_TPK_RI_RR_LEN_FROM_CHANSPEC(chanspec) \ + (CHSPEC_IS20((chanspec)) ? FTM_TPK_RI_RR_LEN_SECURE_2_0_20MHZ : \ + FTM_TPK_RI_RR_LEN_SECURE_2_0_80MHZ) + +#define FTM_TPK_RI_PHY_LEN_SECURE_2_0_20MHZ 14u +#define FTM_TPK_RI_PHY_LEN_SECURE_2_0_80MHZ 31u +#define FTM_TPK_RR_PHY_LEN_SECURE_2_0_80MHZ 31u + +#define FTM_TPK_RI_PHY_LEN_FROM_CHANSPEC(chanspec) \ + (CHSPEC_IS20((chanspec)) ? FTM_TPK_RI_PHY_LEN_SECURE_2_0_20MHZ : \ + FTM_TPK_RI_PHY_LEN_SECURE_2_0_80MHZ) + +#define FTM_TPK_RR_PHY_LEN_SECURE_2_0_20MHZ 14u + +#define FTM_TPK_RR_PHY_LEN_FROM_CHANSPEC(chanspec) \ + (CHSPEC_IS20((chanspec)) ? FTM_TPK_RR_PHY_LEN_SECURE_2_0_20MHZ : \ + FTM_TPK_RR_PHY_LEN_SECURE_2_0_80MHZ) BWL_PRE_PACKED_STRUCT struct dot11_ftm_vs_params { uint8 id; /* DOT11_MNG_VS_ID */ @@ -5347,7 +5414,7 @@ typedef enum { DOT11_5GHZ_20MHZ_CLASS_4_DFS = 121, /* Ch 100-140 */ DOT11_5GHZ_20MHZ_CLASS_5 = 125, /* Ch 149-165 */ DOT11_5GHZ_40MHZ_CLASS_22 = 116, /* Ch 36-44, lower */ - DOT11_5GHZ_40MHZ_CLASS_23_DFS = 119, /* Ch 52-60, lower */ + DOT11_5GHZ_40MHZ_CLASS_23_DFS = 119, /* Ch 52-60, lower */ DOT11_5GHZ_40MHZ_CLASS_24_DFS = 122, /* Ch 100-132, lower */ DOT11_5GHZ_40MHZ_CLASS_25 = 126, /* Ch 149-157, lower */ DOT11_5GHZ_40MHZ_CLASS_27 = 117, /* Ch 40-48, upper */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/802.11ax.h b/drivers/net/wireless/bcmdhd_100_15/include/802.11ax.h index 0a668ef16057..a4c4c98b3128 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/802.11ax.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/802.11ax.h @@ -2,7 +2,7 @@ * Basic types and constants relating to 802.11ax/HE STA * This is a portion of 802.11ax definition. The rest are in 802.11.h. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -349,14 +349,19 @@ typedef uint8 he_phy_cap_t[HE_PHY_CAP_INFO_SIZE]; #define HE_MAC_MAX_AMPDU_EXP_ADOPT_VHT (0) /* Max. AMPDU length = * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_1) -1 (if this value in VHT CAP is 7) or - * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_1) -1 (if this value in HT CAP is 7). + * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_1) -1 (if this value in HT CAP is 3). */ #define HE_MAC_MAX_AMPDU_EXP_HE_1 (1) /* Max. AMPDU length = * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_2) -1 (if this value in VHT CAP is 7) or - * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_2) -1 (if this value in HT CAP is 7). + * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_2) -1 (if this value in HT CAP is 3). */ #define HE_MAC_MAX_AMPDU_EXP_HE_2 (2) +/* Max. AMPDU length = + * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_3) -1 (if this value in VHT CAP is 7) or + * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_3) -1 (if this value in HT CAP is 3). + */ +#define HE_MAC_MAX_AMPDU_EXP_HE_3 (3) /* HE PHY Capabilities values */ /* b1-b7: Channel Width Support field */ @@ -637,8 +642,10 @@ typedef struct he_op_ie he_op_ie_t; #define HE_6G_OP_BW_80 2u #define HE_6G_OP_BW_160_80P80 3u +/* Figure 9-787l Control field format in Draft P802.11ax_D5.0 */ #define HE_6G_CTL_CHBW_MASK 0x03u #define HE_6G_OP_CTL_CHBW(ctl) (ctl & HE_6G_CTL_CHBW_MASK) +#define HE_6G_CTL_DUP_BCN_MASK 0x04u /* HE 6G Operation info */ BWL_PRE_PACKED_STRUCT struct he_6g_op_info { @@ -662,11 +669,14 @@ BWL_PRE_PACKED_STRUCT struct he_6g_cap_ie { typedef struct he_6g_cap_ie he_6g_cap_ie_t; #define HE_6G_CAP_IE_LEN sizeof(he_6g_cap_ie_t) -/* HE Capabilities Information bit position and fieldwidth */ +/* HE Capabilities Information bit position and fieldwidth. + * Figure 9-787ai Capabilities Information field format in + * Draft P802.11ax_D5.0. + */ #define HE_6G_CAP_MIN_MPDU_START_MASK 0x0007u #define HE_6G_CAP_MAX_AMPDU_LEN_EXP_MASK 0x0038u #define HE_6G_CAP_MAX_AMPDU_LEN_EXP_SHIFT 3u -#define HE_6G_CAP_MAX_MPDU_LEN_MASK 0x01C0u +#define HE_6G_CAP_MAX_MPDU_LEN_MASK 0x00C0u #define HE_6G_CAP_MAX_MPDU_LEN_SHIFT 6u #define HE_6G_CAP_SM_PW_SAVE_MASK 0x0600u #define HE_6G_CAP_SM_PW_SAVE_SHIFT 9u diff --git a/drivers/net/wireless/bcmdhd_100_15/include/802.11s.h b/drivers/net/wireless/bcmdhd_100_15/include/802.11s.h index efbd144ac803..27656d653103 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/802.11s.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/802.11s.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to 802.11s Mesh * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/802.1d.h b/drivers/net/wireless/bcmdhd_100_15/include/802.1d.h index 02b80de14d8e..60a6ca6c7882 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/802.1d.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/802.1d.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to 802.1D * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/802.3.h b/drivers/net/wireless/bcmdhd_100_15/include/802.3.h index b467d988d89e..56140d0bc3f0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/802.3.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/802.3.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to 802.3 * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/aidmp.h b/drivers/net/wireless/bcmdhd_100_15/include/aidmp.h index 0007f8356e0e..d24cee910cd1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/aidmp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/aidmp.h @@ -1,7 +1,7 @@ /* * Broadcom AMBA Interconnect definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcm_cfg.h b/drivers/net/wireless/bcmdhd_100_15/include/bcm_cfg.h index 07e20870b0d3..27ad1854d1dc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcm_cfg.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcm_cfg.h @@ -1,7 +1,7 @@ /* * BCM common config options * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcm_mpool_pub.h b/drivers/net/wireless/bcmdhd_100_15/include/bcm_mpool_pub.h index 755a51b2d098..0b8569685bbd 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcm_mpool_pub.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcm_mpool_pub.h @@ -35,7 +35,7 @@ * and instrumentation on top of the heap, without modifying the heap * allocation implementation. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcm_ring.h b/drivers/net/wireless/bcmdhd_100_15/include/bcm_ring.h index beb966076176..0ccf7d9367dc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcm_ring.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcm_ring.h @@ -6,7 +6,7 @@ * * NOTE: A ring of size N, may only hold N-1 elements. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -101,7 +101,7 @@ * private L1 data cache. * +---------------------------------------------------------------------------- * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmarp.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmarp.h index db5cfbf5fa9f..e4e1834e190c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmarp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmarp.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to ARP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmbloom.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmbloom.h index bb41cdcbb7bb..ff6b8060b22f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmbloom.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmbloom.h @@ -1,7 +1,7 @@ /* * Bloom filter support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmcdc.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmcdc.h index 506d154c2150..4ba5581104da 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmcdc.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmcdc.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmdefs.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmdefs.h index c6440d834067..fa5899bddf31 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmdefs.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmdefs.h @@ -1,7 +1,7 @@ /* * Misc system wide definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmdevs.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmdevs.h index 405a580744d1..759fa9480727 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmdevs.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmdevs.h @@ -1,7 +1,7 @@ /* * Broadcom device-specific manifest constants. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmdhcp.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmdhcp.h index 328ded846e89..7fd55024429d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmdhcp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmdhcp.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to DHCP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmendian.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmendian.h index 4ce0595208b4..3d504a81501b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmendian.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmendian.h @@ -1,7 +1,7 @@ /* * Byte order utilities * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmeth.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmeth.h index 5614b53aa905..0e66b47e2059 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmeth.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmeth.h @@ -1,7 +1,7 @@ /* * Broadcom Ethernettype protocol definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmevent.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmevent.h index ad0d6d56a6f8..298705f62e2b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmevent.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmevent.h @@ -3,7 +3,7 @@ * * Dependencies: bcmeth.h * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -178,9 +178,9 @@ typedef union bcm_event_msg_u { #define WLC_E_DFS_AP_STOP 65 /* AP stopped due to DFS */ #define WLC_E_DFS_AP_RESUME 66 /* AP resumed due to DFS */ #define WLC_E_WAI_STA_EVENT 67 /* WAI stations event */ -#define WLC_E_WAI_MSG 68 /* event encapsulating an WAI message */ -#define WLC_E_ESCAN_RESULT 69 /* escan result event */ -#define WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE 70 /* action frame off channel complete */ +#define WLC_E_WAI_MSG 68 /* event encapsulating an WAI message */ +#define WLC_E_ESCAN_RESULT 69 /* escan result event */ +#define WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE 70 /* action frame off channel complete */ #define WLC_E_PROBRESP_MSG 71 /* probe response received */ #define WLC_E_P2P_PROBREQ_MSG 72 /* P2P Probe request received */ #define WLC_E_DCS_REQUEST 73 @@ -212,6 +212,10 @@ typedef union bcm_event_msg_u { #define WLC_E_SPEEDY_RECREATE_FAIL 93 /* fast assoc recreation failed */ #define WLC_E_NATIVE 94 /* port-specific event and payload (e.g. NDIS) */ #define WLC_E_PKTDELAY_IND 95 /* event for tx pkt delay suddently jump */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WLC_E_PSTA_PRIMARY_INTF_IND 99 /* psta primary interface indication */ #define WLC_E_NAN 100 /* NAN event - Reserved for future */ #define WLC_E_BEACON_FRAME_RX 101 @@ -298,9 +302,11 @@ typedef union bcm_event_msg_u { * dwell time complete */ #define WLC_E_WSEC 186 /* wsec keymgmt event */ -#define WLC_E_LAST 187 /* highest val + 1 for range checking */ -#if (WLC_E_LAST > 187) -#error "WLC_E_LAST: Invalid value for last event; must be <= 187." +#define WLC_E_OBSS_DETECTION 187 /* OBSS HW event */ +#define WLC_E_SC_CHAN_QUAL 189 /* Event to indicate the SC chanel quality */ +#define WLC_E_LAST 190 /* highest val + 1 for range checking */ +#if (WLC_E_LAST > 190) +#error "WLC_E_LAST: Invalid value for last event; must be <= 190." #endif /* WLC_E_LAST */ /* define an API for getting the string name of an event */ @@ -316,6 +322,21 @@ extern int is_wlc_event_frame(void *pktdata, uint pktlen, uint16 exp_usr_subtype void wl_event_to_host_order(wl_event_msg_t * evt); void wl_event_to_network_order(wl_event_msg_t * evt); +/* No Networks reasons */ +#define WLC_E_REASON_NO_NETWORKS 0x0u /* value 0 means no networks found */ +#define WLC_E_REASON_NO_NETWORKS_BY_SCORE 0x01u /* bit 1 indicates filtered by score */ + +#define WLC_E_ROAM_NO_NETWORKS_TAG 0x1u /* tag id */ +#define WLC_E_ROAM_NO_NETWORKS_VER 0x1u /* version */ + +struct wl_ev_roam_no_nets_s { + uint8 id; /* id */ + uint8 len; /* length */ + uint16 version; /* version */ + uint32 fail_reason; /* roam no networks fail reason */ +}; +typedef struct wl_ev_roam_no_nets_s wl_ev_roam_no_nets_t; + /* Event status codes */ #define WLC_E_STATUS_SUCCESS 0 /* operation was successful */ #define WLC_E_STATUS_FAIL 1 /* operation failed */ @@ -331,7 +352,7 @@ void wl_event_to_network_order(wl_event_msg_t * evt); #define WLC_E_STATUS_11HQUIET 11 /* 802.11h quiet period started */ #define WLC_E_STATUS_SUPPRESS 12 /* user disabled scanning (WLC_SET_SCANSUPPRESS) */ #define WLC_E_STATUS_NOCHANS 13 /* no allowable channels to scan */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define WLC_E_STATUS_CCXFASTRM 14 /* scan aborted due to CCX fast roam */ #endif /* BCMCCX */ #define WLC_E_STATUS_CS_ABORT 15 /* abort channel select */ @@ -371,6 +392,9 @@ void wl_event_to_network_order(wl_event_msg_t * evt); #define WLC_E_REASON_INFRA_DISASSOC 3 #define WLC_E_REASON_NO_MODE_CHANGE_NEEDED 4 +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* TX STAT ERROR REASON CODE */ #define WLC_E_REASON_TXBACKOFF_NOT_DECREMENTED 0x1 @@ -394,6 +418,10 @@ typedef struct wl_event_sdb_trans { /* reason codes for WLC_E_GTK_KEYROT_NO_CHANSW event */ #define WLC_E_GTKKEYROT_SCANDELAY 0 /* Delay scan while gtk in progress */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WLC_E_GTKKEYROT_SKIPCHANSW_P2P 2 /* Avoid chansw by p2p while gtk in progress */ /* roam reason codes */ @@ -430,18 +458,18 @@ typedef struct wl_event_sdb_trans { #define WLC_E_RSN_MISMATCH 8 /* STA does not support AP's RSN */ #define WLC_E_PRUNE_NO_COMMON_RATES 9 /* No rates in common with AP */ #define WLC_E_PRUNE_BASIC_RATES 10 /* STA does not support all basic rates of BSS */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define WLC_E_PRUNE_CCXFAST_PREVAP 11 /* CCX FAST ROAM: prune previous AP */ #endif /* def BCMCCX */ #define WLC_E_PRUNE_CIPHER_NA 12 /* BSS's cipher not supported */ #define WLC_E_PRUNE_KNOWN_STA 13 /* AP is already known to us as a STA */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define WLC_E_PRUNE_CCXFAST_DROAM 14 /* CCX FAST ROAM: prune unqualified AP */ #endif /* def BCMCCX */ #define WLC_E_PRUNE_WDS_PEER 15 /* AP is already known to us as a WDS peer */ #define WLC_E_PRUNE_QBSS_LOAD 16 /* QBSS LOAD - AAC is too low */ #define WLC_E_PRUNE_HOME_AP 17 /* prune home AP */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define WLC_E_PRUNE_AP_BLOCKED 18 /* prune blocked AP */ #define WLC_E_PRUNE_NO_DIAG_SUPPORT 19 /* prune due to diagnostic mode not supported */ #endif /* BCMCCX */ @@ -532,6 +560,9 @@ typedef struct wlc_wsec_event { * WLC_E_ACTION_FRAME_RX */ +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define MAX_PHY_CORE_NUM 4u #define BCM_RX_FRAME_DATA_VERSION_2 2u @@ -590,6 +621,10 @@ typedef struct wl_event_data_natoe { #define WLC_E_IF_ROLE_WDS 2 /* WDS link */ #define WLC_E_IF_ROLE_P2P_GO 3 /* P2P Group Owner */ #define WLC_E_IF_ROLE_P2P_CLIENT 4 /* P2P Client */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WLC_E_IF_ROLE_IBSS 8 /* IBSS */ #define WLC_E_IF_ROLE_NAN 9 /* NAN */ @@ -681,14 +716,17 @@ typedef struct wlc_phy_cal_info { uint8 pad; } wlc_phy_cal_info_t; +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* GAS event data */ typedef BWL_PRE_PACKED_STRUCT struct wl_event_gas { - uint16 channel; /* channel of GAS protocol */ + uint16 channel; /* channel of GAS protocol */ uint8 dialog_token; /* GAS dialog token */ uint8 fragment_id; /* fragment id */ uint16 status_code; /* status code on GAS completion */ - uint16 data_len; /* length of data to follow */ - uint8 data[1]; /* variable length specified by data_len */ + uint16 data_len; /* length of data to follow */ + uint8 data[1]; /* variable length specified by data_len */ } BWL_POST_PACKED_STRUCT wl_event_gas_t; /* service discovery TLV */ @@ -778,6 +816,9 @@ typedef BWL_PRE_PACKED_STRUCT struct proxd_event_ts_results { ts_sample_t ts_buff[1]; /* Timestamps */ } BWL_POST_PACKED_STRUCT wl_proxd_event_ts_results_t; +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* Video Traffic Interference Monitor Event */ #define INTFER_EVENT_VERSION 1 #define INTFER_STREAM_TYPE_NONTCP 1 @@ -1064,6 +1105,10 @@ typedef enum { CHANSW_NAN = 18, /* channel switch due to NAN */ CHANSW_NAN_DISC = 19, /* channel switch due to NAN Disc */ CHANSW_NAN_SCHED = 20, /* channel switch due to NAN Sched */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + CHANSW_TDLS = 26, /* channel switch due to TDLS */ CHANSW_PROXD = 27, /* channel switch due to PROXD */ CHANSW_SLOTTED_BSS = 28, /* channel switch due to slotted bss */ @@ -1285,4 +1330,13 @@ typedef wl_event_adps_v1_t wl_event_adps_t; #define WLC_USER_E_KEY_UPDATE 1 /* Key add/remove */ +/* OBSS HW event data */ +typedef struct wlc_obss_hw_event_data { + uint16 available_chanspec; /* Contains band, channel and BW info */ +} wlc_obss_hw_event_data_t; + +/* status when WLC_E_OBSS_DETECTION */ +#define WLC_OBSS_BW_UPDATED 1 /* Sent when BW is update at SW */ +#define WLC_OBSS_BW_AVAILABLE 2 /* Sent When a change in BW is detected / noticed */ + #endif /* _BCMEVENT_H_ */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmicmp.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmicmp.h index a41eca04fc18..1749b06469fc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmicmp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmicmp.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to ICMP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmiov.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmiov.h index 28e01fe2f465..fe8910569965 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmiov.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmiov.h @@ -4,7 +4,7 @@ * To be used in firmware and host apps or dhd - reducing code size, * duplication, and maintenance overhead. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmip.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmip.h index f40a6c164ed4..7cb511c0bac0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmip.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmip.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to IP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmipv6.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmipv6.h index 591bce1418ff..0fd34c453f47 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmipv6.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmipv6.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to Neighbor Discovery Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmmsgbuf.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmmsgbuf.h index d58630b5e73b..49792cd01e24 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmmsgbuf.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmmsgbuf.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -58,15 +58,22 @@ #define D2HRING_SNAPSHOT_CMPLT_ITEMSIZE 20 -#define H2DRING_TXPOST_MAX_ITEM 512 -#define H2DRING_RXPOST_MAX_ITEM 512 #define H2DRING_CTRL_SUB_MAX_ITEM 64 -#define D2HRING_TXCMPLT_MAX_ITEM 1024 -#define D2HRING_RXCMPLT_MAX_ITEM 512 - #define H2DRING_DYNAMIC_INFO_MAX_ITEM 32 #define D2HRING_DYNAMIC_INFO_MAX_ITEM 32 +#if defined(DHD_HTPUT_TUNABLES) +#define H2DRING_TXPOST_MAX_ITEM 1024 +#define H2DRING_RXPOST_MAX_ITEM 1024 +#define D2HRING_RXCMPLT_MAX_ITEM 1024 +#define D2HRING_TXCMPLT_MAX_ITEM 2048 +#else +#define H2DRING_TXPOST_MAX_ITEM 512 +#define H2DRING_RXPOST_MAX_ITEM 512 +#define D2HRING_TXCMPLT_MAX_ITEM 1024 +#define D2HRING_RXCMPLT_MAX_ITEM 512 +#endif /* DHD_HTPUT_TUNABLES */ + #define D2HRING_EDL_HDR_SIZE 48u #define D2HRING_EDL_ITEMSIZE 2048u #define D2HRING_EDL_MAX_ITEM 256u @@ -432,7 +439,9 @@ typedef struct pcie_dma_xfer_params { uint8 flags; } pcie_dma_xfer_params_t; -#define BCMPCIE_FLOW_RING_INTF_HP2P 0x1 +#define BCMPCIE_FLOW_RING_INTF_HP2P 0x1 +#define BCMPCIE_FLOW_RING_OPT_EXT_TXSTATUS 0x2 + /** Complete msgbuf hdr for flow ring update from host to dongle */ typedef struct tx_flowring_create_request { cmn_msg_hdr_t msg; @@ -1389,4 +1398,9 @@ typedef struct ts_host_timestamping_config { #define IS_CONFIG_NODROP(x) ((x) & FLAG_CONFIG_NODROP) #define CLEAR_CONFIG_NODROP(x) ((x) & ~FLAG_CONFIG_NODROP) +/* HP2P RLLW Extended TxStatus info when host enables the same */ +#define D2H_TXSTATUS_EXT_PKT_WITH_OVRRD 0x8000 /**< set when pkt had override bit on */ +#define D2H_TXSTATUS_EXT_PKT_XMIT_ON5G 0x4000 /**< set when pkt xmitted on 5G */ +#define D2H_TXSTATUS_EXT_PKT_BT_DENY 0x2000 /**< set when WLAN is given prio over BT */ + #endif /* _bcmmsgbuf_h_ */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmpcie.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmpcie.h index 3efba64dc141..2899e31e82ea 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmpcie.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmpcie.h @@ -3,7 +3,7 @@ * Software-specific definitions shared between device and host side * Explains the shared area between host and dongle * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdbus.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdbus.h index b9e2b9c293e5..1d0ee1cc264a 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdbus.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdbus.h @@ -2,7 +2,7 @@ * Definitions for API from sdio common code (bcmsdh) to individual * host controller drivers. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh.h index fe0782e076b3..bf1fbd6a360f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh.h @@ -3,7 +3,7 @@ * export functions to client drivers * abstract OS and BUS specific details of SDIO * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh_sdmmc.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh_sdmmc.h index 9115c8076159..9063e9cb54ca 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh_sdmmc.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdh_sdmmc.h @@ -1,7 +1,7 @@ /* * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdpcm.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdpcm.h index d57efa749017..4fcaec38aecb 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdpcm.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdpcm.h @@ -2,7 +2,7 @@ * Broadcom SDIO/PCMCIA * Software-specific definitions shared between device and host side * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdstd.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdstd.h index 8e2dc95d6419..f45d73248493 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmsdstd.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmsdstd.h @@ -1,7 +1,7 @@ /* * 'Standard' SDIO HOST CONTROLLER driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmstdlib_s.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmstdlib_s.h index a364f6bcf3db..0d8e42635514 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmstdlib_s.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmstdlib_s.h @@ -1,7 +1,7 @@ /* * Broadcom Secure Standard Library. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmtcp.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmtcp.h index 7139a9dafb0d..2e6f9e257263 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmtcp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmtcp.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to TCP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmtlv.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmtlv.h index 421df10b7d45..130cee1393e9 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmtlv.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmtlv.h @@ -1,7 +1,7 @@ /* * TLV and XTLV support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmudp.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmudp.h index f1e8dc8c8bc2..9b7da8fbe256 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmudp.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmudp.h @@ -1,7 +1,7 @@ /* * Fundamental constants relating to UDP Protocol * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/bcmutils.h b/drivers/net/wireless/bcmdhd_100_15/include/bcmutils.h index 2ce95895a6d8..7617597886de 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/bcmutils.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/bcmutils.h @@ -1,7 +1,7 @@ /* * Misc useful os-independent macros and functions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/brcm_nl80211.h b/drivers/net/wireless/bcmdhd_100_15/include/brcm_nl80211.h index 34ce64648952..8af88bb39ede 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/brcm_nl80211.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/brcm_nl80211.h @@ -1,7 +1,7 @@ /* * Definitions for nl80211 vendor command/event access to host driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/dhd_daemon.h b/drivers/net/wireless/bcmdhd_100_15/include/dhd_daemon.h index b324b51197a5..e7b4eac65cef 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/dhd_daemon.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/dhd_daemon.h @@ -1,7 +1,7 @@ /* * Header file for DHD daemon to handle timeouts * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/dhdioctl.h b/drivers/net/wireless/bcmdhd_100_15/include/dhdioctl.h index 966f6c7480cd..7267f84ff9c3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/dhdioctl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/dhdioctl.h @@ -5,7 +5,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/dnglevent.h b/drivers/net/wireless/bcmdhd_100_15/include/dnglevent.h index 6302ba9bb869..e6f5709dfb5e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/dnglevent.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/dnglevent.h @@ -3,7 +3,7 @@ * * Dependencies: bcmeth.h * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/eapol.h b/drivers/net/wireless/bcmdhd_100_15/include/eapol.h index bbd265891610..082db0329ad3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/eapol.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/eapol.h @@ -5,7 +5,7 @@ * IEEE Std 802.1X-2001 * IEEE 802.1X RADIUS Usage Guidelines * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/epivers.h b/drivers/net/wireless/bcmdhd_100_15/include/epivers.h index 0472cc1dba4e..9d0c9f71b9eb 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/epivers.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/epivers.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -33,19 +33,19 @@ #define EPI_MINOR_VERSION 15 -#define EPI_RC_NUMBER 31 +#define EPI_RC_NUMBER 36 #define EPI_INCREMENTAL_NUMBER 0 #define EPI_BUILD_NUMBER 0 -#define EPI_VERSION 100, 15, 31, 0 +#define EPI_VERSION 100, 15, 36, 0 -#define EPI_VERSION_NUM 0x640f1f00 +#define EPI_VERSION_NUM 0x640f2400 -#define EPI_VERSION_DEV 100.15.31 +#define EPI_VERSION_DEV 100.15.36 /* Driver Version String, ASCII, 32 chars max */ -#define EPI_VERSION_STR "100.15.31 (r854462)" +#define EPI_VERSION_STR "100.15.36 (r864043)" #endif /* _epivers_h_ */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/etd.h b/drivers/net/wireless/bcmdhd_100_15/include/etd.h index 764af8524833..0a56442d97a3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/etd.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/etd.h @@ -1,7 +1,7 @@ /* * Extended Trap data component interface file. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/ethernet.h b/drivers/net/wireless/bcmdhd_100_15/include/ethernet.h index 3b2ad3120156..b1c678b12a40 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/ethernet.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/ethernet.h @@ -1,7 +1,7 @@ /* * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -131,6 +131,8 @@ BWL_PRE_PACKED_STRUCT struct ether_header { BWL_PRE_PACKED_STRUCT struct ether_addr { uint8 octet[ETHER_ADDR_LEN]; } BWL_POST_PACKED_STRUCT; +#endif /* __INCif_etherh */ +#ifdef __INCif_etherh #endif /* !__INCif_etherh Quick and ugly hack for VxWorks */ /* @@ -138,7 +140,7 @@ BWL_PRE_PACKED_STRUCT struct ether_addr { * address bit in the 48-bit Ethernet address. */ #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)) diff --git a/drivers/net/wireless/bcmdhd_100_15/include/event_log.h b/drivers/net/wireless/bcmdhd_100_15/include/event_log.h index 9e0b4b081238..0f72ae8e4361 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/event_log.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/event_log.h @@ -1,7 +1,7 @@ /* * EVENT_LOG system definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/event_log_payload.h b/drivers/net/wireless/bcmdhd_100_15/include/event_log_payload.h index 3720bda1fc79..8c49c5b308a1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/event_log_payload.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/event_log_payload.h @@ -4,7 +4,7 @@ * This file describes the payloads of event log entries that are data buffers * rather than formatted string entries. The contents are generally XTLVs. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/event_log_set.h b/drivers/net/wireless/bcmdhd_100_15/include/event_log_set.h index 2a6b12dffb8d..8652afc4099b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/event_log_set.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/event_log_set.h @@ -1,7 +1,7 @@ /* * EVENT_LOG system definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -102,6 +102,12 @@ /* AMT logging and other related information */ #define EVENT_LOG_SET_AMT (26u) +/* State machine logging. Part of preserve logs */ +#define EVENT_LOG_SET_FSM (27u) + +/* wbus related logging */ +#define EVENT_LOG_SET_WBUS (28u) + #ifndef NUM_EVENT_LOG_SETS /* Set a maximum number of sets here. It is not dynamic for * efficiency of the EVENT_LOG calls. Old branches could define @@ -110,9 +116,9 @@ */ #ifdef NUM_EVENT_LOG_SETS_V2 /* for v2, everything has became unsigned */ -#define NUM_EVENT_LOG_SETS (27u) +#define NUM_EVENT_LOG_SETS (29u) #else /* NUM_EVENT_LOG_SETS_V2 */ -#define NUM_EVENT_LOG_SETS (27) +#define NUM_EVENT_LOG_SETS (29) #endif /* NUM_EVENT_LOG_SETS_V2 */ #endif /* NUM_EVENT_LOG_SETS */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/event_log_tag.h b/drivers/net/wireless/bcmdhd_100_15/include/event_log_tag.h index 9aa4be4395f2..8792e3025f79 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/event_log_tag.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/event_log_tag.h @@ -1,7 +1,7 @@ /* * EVENT_LOG system definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -47,9 +47,15 @@ #define EVENT_LOG_TAG_BUS_SETUP 10 #define EVENT_LOG_TAG_BUS_MISC 11 +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_SRSCAN 22 #define EVENT_LOG_TAG_PWRSTATS_INFO 23 +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* Timestamp logging for plotting. */ #define EVENT_LOG_TAG_TSLOG 26 @@ -83,6 +89,10 @@ #define EVENT_LOG_TAG_PCI_DBG 52 #define EVENT_LOG_TAG_PCI_DATA 53 #define EVENT_LOG_TAG_PCI_RING 54 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_RANGING_TRACE 55 #define EVENT_LOG_TAG_WL_ERROR 56 #define EVENT_LOG_TAG_PHY_ERROR 57 @@ -125,9 +135,17 @@ #define EVENT_LOG_TAG_MIMO_PS_INFO 94 #define EVENT_LOG_TAG_BTCX_STATS 95 #define EVENT_LOG_TAG_LEAKY_AP_STATS 96 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_MIMO_PS_STATS 98 #define EVENT_LOG_TAG_PWRSTATS_PHY 99 #define EVENT_LOG_TAG_PWRSTATS_SCAN 100 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_PWRSTATS_WAKE_V2 102 #define EVENT_LOG_TAG_LQM 103 #define EVENT_LOG_TAG_TRACE_WL_INFO 104 @@ -182,9 +200,17 @@ #define EVENT_LOG_TAG_STATS 153 #define EVENT_LOG_TAG_BAM 154 #define EVENT_LOG_TAG_TXFAIL 155 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_RANDMAC_INFO 159 #define EVENT_LOG_TAG_RANDMAC_DBG 160 #define EVENT_LOG_TAG_RANDMAC_ERR 161 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_MSCH_CAL 163 #define EVENT_LOG_TAG_MSCH_OPP_CAL 164 #define EVENT_LOG_TAG_MSCH 165 @@ -219,6 +245,10 @@ #define EVENT_LOG_TAG_PHY_ACI_INFO 208 #define EVENT_LOG_TAG_WL_COUNTERS_AUX 209 #define EVENT_LOG_TAG_AMPDU_DUMP_AUX 210 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define EVENT_LOG_TAG_PWRSTATS_PHY_AUX 212 #define EVENT_LOG_TAG_PWRSTATS_SCAN_AUX 213 #define EVENT_LOG_TAG_PWRSTATS_WAKE_V2_AUX 214 @@ -394,6 +424,9 @@ #define EVENT_LOG_TAG_BTCEC_INFO 341 #define EVENT_LOG_TAG_BTCEC_SCHED 342 +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #ifdef SLOT_SCHED #define EVENT_LOG_TAG_SBSS_HC 344 #endif /* SLOT_SCHED */ @@ -408,8 +441,30 @@ #define EVENT_LOG_TAG_AMT_INFO 349 #define EVENT_LOG_TAG_AMT_TRACE 350 +/* OBSS hw logging */ +#define EVENT_LOG_TAG_WLC_OBSS_ERR 351 +#define EVENT_LOG_TAG_WLC_OBSS_TRACE 352 +#define EVENT_LOG_TAG_WLC_OBSS_INFO 353 + +#define EVENT_LOG_TAG_ALLOC_TRACE 354 + +/* ASSOC and SUP state machine log tags */ +#define EVENT_LOG_TAG_ASSOC_SM 355 +#define EVENT_LOG_TAG_SUP_SM 356 +/* Place holders for additional state machine logging */ +#define EVENT_LOG_TAG_AUTH_SM 357 +#define EVENT_LOG_TAG_SAE_SM 358 +#define EVENT_LOG_TAG_FTM_SM 359 +#define EVENT_LOG_TAG_NAN_SM 360 + +#define EVENT_LOG_TAG_SDTC_INFO 361 +#define EVENT_LOG_TAG_SDTC_ERR 362 + +/* HP2P - RLLW logging */ +#define EVENT_LOG_TAG_RLLW_TRACE 361 + /* EVENT_LOG_TAG_MAX = Set to the same value of last tag, not last tag + 1 */ -#define EVENT_LOG_TAG_MAX 350 +#define EVENT_LOG_TAG_MAX 361 typedef enum wl_el_set_type_def { EVENT_LOG_SET_TYPE_DEFAULT = 0, /* flush the log buffer when it is full - Default option */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/event_trace.h b/drivers/net/wireless/bcmdhd_100_15/include/event_trace.h index fe9bb3580ea1..5bd20774c155 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/event_trace.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/event_trace.h @@ -1,7 +1,7 @@ /* * Trace log blocks sent over HBUS * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/fils.h b/drivers/net/wireless/bcmdhd_100_15/include/fils.h index 38b4180a25b3..f0471f59ba3f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/fils.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/fils.h @@ -1,6 +1,6 @@ /* * Fundamental types and constants relating to FILS AUTHENTICATION - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_armtrap.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_armtrap.h index 184a7ddc8cdb..43d550300d7b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_armtrap.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_armtrap.h @@ -1,7 +1,7 @@ /* * HND arm trap handling. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_cons.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_cons.h index 879906dafe98..3aaa78af4bf3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_cons.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_cons.h @@ -1,7 +1,7 @@ /* * Console support for RTE - for host use only. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_debug.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_debug.h index a16123ebfce3..cd57a5b2d02f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_debug.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_debug.h @@ -1,7 +1,7 @@ /* * HND Run Time Environment debug info area * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktpool.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktpool.h index caa436c1055d..620e63e84618 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktpool.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktpool.h @@ -1,7 +1,7 @@ /* * HND generic packet pool operation primitives * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktq.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktq.h index a7af8ef6f1bd..1efe449f044b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktq.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_pktq.h @@ -1,7 +1,7 @@ /* * HND generic pktq operation primitives * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hnd_trap.h b/drivers/net/wireless/bcmdhd_100_15/include/hnd_trap.h index 02561f34adbc..be7aa7e4f710 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hnd_trap.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hnd_trap.h @@ -1,7 +1,7 @@ /* * HND Trap handling. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hndchipc.h b/drivers/net/wireless/bcmdhd_100_15/include/hndchipc.h index 971311d4367c..112ab6537367 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hndchipc.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hndchipc.h @@ -1,7 +1,7 @@ /* * HND SiliconBackplane chipcommon support - OS independent. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hndlhl.h b/drivers/net/wireless/bcmdhd_100_15/include/hndlhl.h index 8e75e3970e88..5ed670edcbf7 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hndlhl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hndlhl.h @@ -1,7 +1,7 @@ /* * HND SiliconBackplane PMU support. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hndoobr.h b/drivers/net/wireless/bcmdhd_100_15/include/hndoobr.h index 4e672ccc8016..4f49b959b1c2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hndoobr.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hndoobr.h @@ -1,7 +1,7 @@ /* * HND OOBR interface header * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hndpmu.h b/drivers/net/wireless/bcmdhd_100_15/include/hndpmu.h index 2abff465af1e..41818b729d47 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hndpmu.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hndpmu.h @@ -1,7 +1,7 @@ /* * HND SiliconBackplane PMU support. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/hndsoc.h b/drivers/net/wireless/bcmdhd_100_15/include/hndsoc.h index 35574ea8a2f1..f1242ad7ff39 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/hndsoc.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/hndsoc.h @@ -1,7 +1,7 @@ /* * Broadcom HND chip & on-chip-interconnect-related definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/linux_osl.h b/drivers/net/wireless/bcmdhd_100_15/include/linux_osl.h index 2a930cc901a7..7137f376d01a 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/linux_osl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/linux_osl.h @@ -1,7 +1,7 @@ /* * Linux OS Independent Layer * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: linux_osl.h 815919 2019-04-22 09:06:50Z $ + * $Id: linux_osl.h 862862 2020-02-05 09:10:41Z $ */ #ifndef _linux_osl_h_ @@ -171,7 +171,7 @@ extern bool osl_is_flag_set(osl_t *osh, uint32 mask); #define BUS_SWAP32(v) (v) #define MALLOC(osh, size) osl_malloc((osh), (size)) #define MALLOCZ(osh, size) osl_mallocz((osh), (size)) - #define MFREE(osh, addr, size) osl_mfree((osh), (addr), (size)) + #define MFREE(osh, addr, size) ({osl_mfree((osh), ((void *)addr), (size));(addr) = NULL;}) #define VMALLOC(osh, size) osl_vmalloc((osh), (size)) #define VMALLOCZ(osh, size) osl_vmallocz((osh), (size)) #define VMFREE(osh, addr, size) osl_vmfree((osh), (addr), (size)) diff --git a/drivers/net/wireless/bcmdhd_100_15/include/linux_pkt.h b/drivers/net/wireless/bcmdhd_100_15/include/linux_pkt.h index 5a67aec2d7d6..9baec5296c44 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/linux_pkt.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/linux_pkt.h @@ -1,7 +1,7 @@ /* * Linux Packet (skb) interface * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/linuxver.h b/drivers/net/wireless/bcmdhd_100_15/include/linuxver.h index d838f724d547..3cc5df669e9b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/linuxver.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/linuxver.h @@ -2,7 +2,7 @@ * 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-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/lpflags.h b/drivers/net/wireless/bcmdhd_100_15/include/lpflags.h index b27013294dd2..72871bc69ada 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/lpflags.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/lpflags.h @@ -1,7 +1,7 @@ /* * Chip related low power flags * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/mbo.h b/drivers/net/wireless/bcmdhd_100_15/include/mbo.h index 9d23ccb3708d..15f287a4e72e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/mbo.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/mbo.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to WFA MBO * (Multiband Operation) - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/msgtrace.h b/drivers/net/wireless/bcmdhd_100_15/include/msgtrace.h index 1c684fd1151f..2b5747410b5e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/msgtrace.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/msgtrace.h @@ -1,7 +1,7 @@ /* * Trace messages sent over HBUS * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/nan.h b/drivers/net/wireless/bcmdhd_100_15/include/nan.h index f6c2a705fc05..8fafd473c628 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/nan.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/nan.h @@ -2,7 +2,7 @@ * Fundamental types and constants relating to WFA NAN * (Neighbor Awareness Networking) * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/osl.h b/drivers/net/wireless/bcmdhd_100_15/include/osl.h index 68cde0d53337..8972def8d3e3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/osl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/osl.h @@ -1,7 +1,7 @@ /* * OS Abstraction Layer * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/osl_decl.h b/drivers/net/wireless/bcmdhd_100_15/include/osl_decl.h index 652b3191acc9..0f41129dea7b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/osl_decl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/osl_decl.h @@ -1,7 +1,7 @@ /* * osl forward declarations * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/osl_ext.h b/drivers/net/wireless/bcmdhd_100_15/include/osl_ext.h index da2eb6e1f556..3a12f45cf0dd 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/osl_ext.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/osl_ext.h @@ -2,7 +2,7 @@ * OS Abstraction Layer Extension - the APIs defined by the "extension" API * are only supported by a subset of all operating systems. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/p2p.h b/drivers/net/wireless/bcmdhd_100_15/include/p2p.h index 28813778381c..802c0e49fe6c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/p2p.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/p2p.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/packed_section_end.h b/drivers/net/wireless/bcmdhd_100_15/include/packed_section_end.h index 3fedac454be8..878e899502e3 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/packed_section_end.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/packed_section_end.h @@ -15,7 +15,7 @@ * #include * * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/packed_section_start.h b/drivers/net/wireless/bcmdhd_100_15/include/packed_section_start.h index abb2cffeb9f9..833b19fb912f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/packed_section_start.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/packed_section_start.h @@ -15,7 +15,7 @@ * #include * * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/pcicfg.h b/drivers/net/wireless/bcmdhd_100_15/include/pcicfg.h index af491449f8ba..e63d5a0c8760 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/pcicfg.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/pcicfg.h @@ -1,7 +1,7 @@ /* * pcicfg.h: PCI configuration constants and structures. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/pcie_core.h b/drivers/net/wireless/bcmdhd_100_15/include/pcie_core.h index 18905a0e05ee..86039513ca9f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/pcie_core.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/pcie_core.h @@ -1,7 +1,7 @@ /* * BCM43XX PCIE core hardware definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/rte_ioctl.h b/drivers/net/wireless/bcmdhd_100_15/include/rte_ioctl.h index 18900ab64556..59253eb73949 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/rte_ioctl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/rte_ioctl.h @@ -1,7 +1,7 @@ /* * HND Run Time Environment ioctl. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbchipc.h b/drivers/net/wireless/bcmdhd_100_15/include/sbchipc.h index 72678a45c881..684542b46cc9 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbchipc.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbchipc.h @@ -7,7 +7,7 @@ * * $Id: sbchipc.h 798061 2019-01-04 23:27:15Z $ * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbconfig.h b/drivers/net/wireless/bcmdhd_100_15/include/sbconfig.h index 05c337a4abc4..2ba56f9090fe 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbconfig.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbconfig.h @@ -1,7 +1,7 @@ /* * Broadcom SiliconBackplane hardware register definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbgci.h b/drivers/net/wireless/bcmdhd_100_15/include/sbgci.h index 3fd6dca90aa9..3a7e373f3462 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbgci.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbgci.h @@ -1,7 +1,7 @@ /* * SiliconBackplane GCI core hardware definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbhndarm.h b/drivers/net/wireless/bcmdhd_100_15/include/sbhndarm.h index 1aa46070b6dd..4ea2f753a2fe 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbhndarm.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbhndarm.h @@ -1,7 +1,7 @@ /* * Broadcom SiliconBackplane ARM definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbhnddma.h b/drivers/net/wireless/bcmdhd_100_15/include/sbhnddma.h index 862a1dc3ac06..6250abb7ee98 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbhnddma.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbhnddma.h @@ -2,7 +2,7 @@ * Generic Broadcom Home Networking Division (HND) DMA engine HW interface * This supports the following chips: BCM42xx, 44xx, 47xx . * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbpcmcia.h b/drivers/net/wireless/bcmdhd_100_15/include/sbpcmcia.h index 5e422486cf45..549ef12ee9bf 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbpcmcia.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbpcmcia.h @@ -1,7 +1,7 @@ /* * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbsdio.h b/drivers/net/wireless/bcmdhd_100_15/include/sbsdio.h index 38fee229e2ba..e8123a064ce8 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbsdio.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbsdio.h @@ -4,7 +4,7 @@ * * SDIO core support 1bit, 4 bit SDIO mode as well as SPI mode. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbsdpcmdev.h b/drivers/net/wireless/bcmdhd_100_15/include/sbsdpcmdev.h index fba8ad7bce47..6bbecf9ff095 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbsdpcmdev.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbsdpcmdev.h @@ -2,7 +2,7 @@ * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific * device core support * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbsocram.h b/drivers/net/wireless/bcmdhd_100_15/include/sbsocram.h index 6cb24141a8c8..8143781b2c3d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbsocram.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbsocram.h @@ -1,7 +1,7 @@ /* * BCM47XX Sonics SiliconBackplane embedded ram core * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sbsysmem.h b/drivers/net/wireless/bcmdhd_100_15/include/sbsysmem.h index bd347cc848fc..dc00f6f64fdc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sbsysmem.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sbsysmem.h @@ -1,7 +1,7 @@ /* * SiliconBackplane System Memory core * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sdio.h b/drivers/net/wireless/bcmdhd_100_15/include/sdio.h index 90eddcc1386a..27e8a2fba041 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sdio.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sdio.h @@ -2,7 +2,7 @@ * SDIO spec header file * Protocol and standard (common) device definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sdioh.h b/drivers/net/wireless/bcmdhd_100_15/include/sdioh.h index 907b3f6bccd4..367f8dbdcefb 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sdioh.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sdioh.h @@ -2,7 +2,7 @@ * SDIO Host Controller Spec header file * Register map and definitions for the Standard Host Controller * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/sdiovar.h b/drivers/net/wireless/bcmdhd_100_15/include/sdiovar.h index f58ece307f28..834c7dcc2f5d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/sdiovar.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/sdiovar.h @@ -2,7 +2,7 @@ * Structure used by apps whose drivers access SDIO drivers. * Pulled out separately so dhdu and wlu can both use it. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/siutils.h b/drivers/net/wireless/bcmdhd_100_15/include/siutils.h index 670e5e5555a0..bbd69eaffa9c 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/siutils.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/siutils.h @@ -2,7 +2,7 @@ * Misc utility routines for accessing the SOC Interconnects * of Broadcom HNBU chips. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/typedefs.h b/drivers/net/wireless/bcmdhd_100_15/include/typedefs.h index c862f4919d49..03b795443901 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/typedefs.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/typedefs.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/vlan.h b/drivers/net/wireless/bcmdhd_100_15/include/vlan.h index 7db898f6a163..d6816e994b16 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/vlan.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/vlan.h @@ -1,7 +1,7 @@ /* * 802.1Q VLAN protocol definitions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -57,13 +57,13 @@ struct vlan_header { uint16 vlan_tag; /* priority, cfi and vid */ }; -struct ethervlan_header { +BWL_PRE_PACKED_STRUCT struct ethervlan_header { uint8 ether_dhost[ETHER_ADDR_LEN]; uint8 ether_shost[ETHER_ADDR_LEN]; uint16 vlan_type; /* 0x8100 */ uint16 vlan_tag; /* priority, cfi and vid */ uint16 ether_type; -}; +} BWL_POST_PACKED_STRUCT; struct dot3_mac_llc_snapvlan_header { uint8 ether_dhost[ETHER_ADDR_LEN]; /* dest mac */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/wlfc_proto.h b/drivers/net/wireless/bcmdhd_100_15/include/wlfc_proto.h index 0e10e97ab72e..1374707d78fe 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/wlfc_proto.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/wlfc_proto.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl.h b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl.h index 6b40a7b6649f..0fd31f555d87 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl.h @@ -6,7 +6,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -27,7 +27,7 @@ * other than the GPL, without Broadcom's express prior written consent. * * - * <> + * <> */ #ifndef _wlioctl_h_ @@ -292,87 +292,6 @@ typedef struct ulp_shm_info { uint32 m_ulp_wakeind; } ulp_shm_info_t; -/* Legacy structure to help keep backward compatible wl tool and tray app */ - -#define LEGACY_WL_BSS_INFO_VERSION 107 /**< older version of wl_bss_info struct */ - -typedef struct wl_bss_info_107 { - uint32 version; /**< version field */ - uint32 length; /**< byte length of data in this record, - * starting at version and including IEs - */ - struct ether_addr BSSID; - uint16 beacon_period; /**< units are Kusec */ - uint16 capability; /**< Capability information */ - uint8 SSID_len; - uint8 SSID[32]; - uint8 PAD; - struct { - uint32 count; /**< # rates in this set */ - uint8 rates[16]; /**< rates in 500kbps units w/hi bit set if basic */ - } rateset; /**< supported rates */ - uint8 channel; /**< Channel no. */ - uint8 PAD; - uint16 atim_window; /**< units are Kusec */ - uint8 dtim_period; /**< DTIM period */ - uint8 PAD; - int16 RSSI; /**< receive signal strength (in dBm) */ - int8 phy_noise; /**< noise (in dBm) */ - uint8 PAD[3]; - uint32 ie_length; /**< byte length of Information Elements */ - /* variable length Information Elements */ -} wl_bss_info_107_t; - -/* - * Per-BSS information structure. - */ - -#define LEGACY2_WL_BSS_INFO_VERSION 108 /**< old version of wl_bss_info struct */ - -/** - * BSS info structure - * Applications MUST CHECK ie_offset field and length field to access IEs and - * next bss_info structure in a vector (in wl_scan_results_t) - */ -typedef struct wl_bss_info_108 { - uint32 version; /**< version field */ - uint32 length; /**< byte length of data in this record, - * starting at version and including IEs - */ - struct ether_addr BSSID; - uint16 beacon_period; /**< units are Kusec */ - uint16 capability; /**< Capability information */ - uint8 SSID_len; - uint8 SSID[32]; - uint8 PAD[1]; - struct { - uint32 count; /**< # rates in this set */ - uint8 rates[16]; /**< rates in 500kbps units w/hi bit set if basic */ - } rateset; /**< supported rates */ - chanspec_t chanspec; /**< chanspec for bss */ - uint16 atim_window; /**< units are Kusec */ - uint8 dtim_period; /**< DTIM period */ - uint8 PAD; - int16 RSSI; /**< receive signal strength (in dBm) */ - int8 phy_noise; /**< noise (in dBm) */ - - uint8 n_cap; /**< BSS is 802.11N Capable */ - uint8 PAD[2]; - uint32 nbss_cap; /**< 802.11N BSS Capabilities (based on HT_CAP_*) */ - uint8 ctl_ch; /**< 802.11N BSS control channel number */ - uint8 PAD[3]; - uint32 reserved32[1]; /**< Reserved for expansion of BSS properties */ - uint8 flags; /**< flags */ - uint8 reserved[3]; /**< Reserved for expansion of BSS properties */ - uint8 basic_mcs[MCSSET_LEN]; /**< 802.11N BSS required MCS set */ - - uint16 ie_offset; /**< offset at which IEs start, from beginning */ - uint8 PAD[2]; - uint32 ie_length; /**< byte length of Information Elements */ - /* Add new fields here */ - /* variable length Information Elements */ -} wl_bss_info_108_t; - #define WL_BSS_INFO_VERSION 109 /**< current version of wl_bss_info struct */ /** @@ -1123,12 +1042,33 @@ 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; #define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE +#define WL_EXT_REASSOC_VER 1 + +typedef struct wl_ext_reassoc_params { + uint16 version; + uint16 length; + uint32 flags; + wl_reassoc_params_t params; +} wl_ext_reassoc_params_t; + +/* Flags field defined above in wl_ext_reassoc_params + * The value in bits [2:0] is used to specify the type + * of scan to be used for reassoc + */ + +#define WL_SCAN_MODE_HIGH_ACC 0u /**< use high accuracy scans for roam */ +#define WL_SCAN_MODE_LOW_SPAN 1u /**< use low span scans for roam */ +#define WL_SCAN_MODE_LOW_POWER 2u /**< use low power scans for roam */ + +#define WL_EXTREASSOC_PARAMS_FIXED_SIZE (OFFSETOF(wl_ext_reassoc_params_t, params) + \ + WL_REASSOC_PARAMS_FIXED_SIZE) + /** used for association to a specific BSSID and channel */ typedef wl_assoc_params_t wl_join_assoc_params_t; #define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE @@ -1477,7 +1417,7 @@ typedef struct wl_rm_rep { wl_rm_rep_elt_t rep[1]; /**< variable length block of reports */ } wl_rm_rep_t; #define WL_RM_REP_FIXED_LEN 8 -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define LEAP_USER_MAX 32 #define LEAP_DOMAIN_MAX 32 @@ -1708,13 +1648,6 @@ typedef struct wl_assoc_info { uint32 state; } wl_assoc_info_t; -typedef struct wl_led_info { - uint32 index; /**< led index */ - uint32 behavior; - uint8 activehi; - uint8 PAD[3]; -} wl_led_info_t; - /** srom read/write struct passed through ioctl */ typedef struct { uint32 byteoff; /**< byte offset */ @@ -1784,9 +1717,6 @@ typedef struct wl_pm_mute_tx { } wl_pm_mute_tx_t; /* - * Please update the following when modifying this structure: - * StaInfo Twiki page flags section - description of the sta_info_t struct - * src/wl/exe/wlu.c - print of sta_info_t * Pay attention to version if structure changes. */ @@ -1931,9 +1861,6 @@ typedef struct { } sta_info_v5_t; /* - * Please update the following when modifying this structure: - * StaInfo Twiki page flags section - description of the sta_info_t struct - * src/wl/exe/wlu.c - print of sta_info_t * Pay attention to version if structure changes. */ @@ -2885,6 +2812,7 @@ typedef struct { #define WL_TXPPR_VERSION 1 #define WL_TXPPR_LENGTH (sizeof(wl_txppr_t)) #define TX_POWER_T_VERSION 45 +#define TX_POWER_T_VERSION_V2 46 /* curpower ppr types */ enum { @@ -3052,8 +2980,10 @@ enum { #define WL_MIMO_PS_STATUS_HW_STATE_NONE 0 #define WL_MIMO_PS_STATUS_HW_STATE_LTECOEX (0x1 << 0) #define WL_MIMO_PS_STATUS_HW_STATE_MIMOPS_BSS (0x1 << 1) -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WL_MIMO_PS_STATUS_HW_STATE_SCAN (0x1 << 3) #define WL_MIMO_PS_STATUS_HW_STATE_TXPPR (0x1 << 4) #define WL_MIMO_PS_STATUS_HW_STATE_PWRTHOTTLE (0x1 << 5) @@ -3323,6 +3253,139 @@ typedef struct wl_psbw_status_v1 { #define WL_PSBW_EXIT_BW_UPD 0x00010000 /* BW being updated */ #define WL_PSBW_DISA_NONE 0x80000000 /* reserved for internal use only */ +/* DVFS */ +#define DVFS_CMND_VERSION_1 1 +/* Common IOVAR struct */ +typedef struct dvfs_cmnd_v1 { + uint16 ver; /* version of this structure */ + uint16 len; /* includes both fixed and variable data[] fields */ + uint32 subcmd; /* subcommand id */ + uint8 data[]; /* subcommand data */ +} dvfs_cmnd_v1_t; + +/* subcommand ids */ +enum { + DVFS_SUBCMD_ENABLE = 0, /* DVFS enable/disable, 1-byte data + * DVFS enable:1, disable:0 + */ + DVFS_SUBCMD_LDV = 1, /* DVFS force arm state to LDV, 1-byte data + * DVFS force LDV ON 1, LDV OFF 0 + */ + DVFS_SUBCMD_STATUS = 2, /* DVFS status, data[] contains dvfs_status */ + DVFS_SUBCMD_HIST = 3, /* DVFS history, data[] contains + * history of dvfs state change + */ + DVFS_SUBCMD_LAST +}; + +/* DVFS Status */ +/* current DVFS state request for ARM */ +#define DVFS_STATE_BIT_MASK 0x0Fu +#define DVFS_STATE_BIT_SHIFT 0u +/* Bit value for DVFS state request */ +#define DVFS_STATE_LDV 0u +#define DVFS_STATE_NDV 1u +/* current DVFS status */ +#define DVFS_STATUS_BIT_MASK 0xF0u +#define DVFS_STATUS_BIT_SHIFT 4u +/* Bit value for DVFS status */ +#define DVFS_STATUS_LDV 0u +#define DVFS_STATUS_NDV 1u +/* DVFS bits are for status, raw request and active request */ +/* 4387b0 supports only status bits for aux, main, and bt */ +/* 4387c0 supports all eight status and request bits */ +#define DVFS_BIT_AUX_MASK 0x0001u +#define DVFS_BIT_AUX_SHIFT 0u +#define DVFS_BIT_AUX_VAL(_val) (((_val) & DVFS_BIT_AUX_MASK) \ + >> DVFS_BIT_AUX_SHIFT) +#define DVFS_BIT_MAIN_MASK 0x0002u +#define DVFS_BIT_MAIN_SHIFT 1u +#define DVFS_BIT_MAIN_VAL(_val) (((_val) & DVFS_BIT_MAIN_MASK) \ + >> DVFS_BIT_MAIN_SHIFT) +#define DVFS_BIT_BT_MASK 0x0004u +#define DVFS_BIT_BT_SHIFT 2u +#define DVFS_BIT_BT_VAL(_val) (((_val) & DVFS_BIT_BT_MASK) \ + >> DVFS_BIT_BT_SHIFT) +#define DVFS_BIT_CHIPC_MASK 0x0008u +#define DVFS_BIT_CHIPC_SHIFT 3u +#define DVFS_BIT_CHIPC_VAL(_val) (((_val) & DVFS_BIT_CHIPC_MASK) \ + >> DVFS_BIT_CHIPC_SHIFT) +#define DVFS_BIT_PCIE_MASK 0x0010u +#define DVFS_BIT_PCIE_SHIFT 4u +#define DVFS_BIT_PCIE_VAL(_val) (((_val) & DVFS_BIT_PCIE_MASK) \ + >> DVFS_BIT_PCIE_SHIFT) +#define DVFS_BIT_ARM_MASK 0x0020u +#define DVFS_BIT_ARM_SHIFT 5u +#define DVFS_BIT_ARM_VAL(_val) (((_val) & DVFS_BIT_ARM_MASK) \ + >> DVFS_BIT_ARM_SHIFT) +#define DVFS_BIT_SCAN_MASK 0x0040u +#define DVFS_BIT_SCAN_SHIFT 6u +#define DVFS_BIT_SCAN_VAL(_val) (((_val) & DVFS_BIT_SCAN_MASK) \ + >> DVFS_BIT_SCAN_SHIFT) +#define DVFS_BIT_BTSCAN_MASK 0x0080u +#define DVFS_BIT_BTSCAN_SHIFT 7u +#define DVFS_BIT_BTSCAN_VAL(_val) (((_val) & DVFS_BIT_BTSCAN_MASK) \ + >> DVFS_BIT_BTSCAN_SHIFT) +/* to convert voltage to volt from multiple of 10mVolt */ +#define DVFS_CONVERT_TO_VOLT 100u + +/* status version for 4387b0 */ +#define DVFS_STATUS_VERSION_1 1 +typedef struct dvfs_status_v1 { + uint16 version; /* version of dvfs_status */ + uint16 len; /* total length including all fixed fields */ + uint8 info; /* current dvfs state request and status */ + uint8 voltage; /* voltage (multiple of 10mV) */ + uint16 freq; /* arm clock frequency (in MHz) */ + uint32 state_change_count; /* total state (LDV/NDV) transition count */ + uint32 ldv_duration; /* total time (ms) in LDV */ + uint32 ndv_duration; /* total time (ms) in NDV */ + uint16 status; /* status bits */ + uint16 pad; /* word aligned for size */ +} dvfs_status_v1_t; +#define DVFS_STATUS_VER_1_LEN (sizeof(dvfs_status_v1_t)) +/* status version for 4387c0 */ +#define DVFS_STATUS_VERSION_2 2 +typedef struct dvfs_status_v2 { + uint16 version; /* version of dvfs_status */ + uint16 len; /* total length including all fixed fields */ + uint8 info; /* current dvfs state request and status */ + uint8 voltage; /* voltage (multiple of 10mV) */ + uint16 freq; /* arm clock frequency (in MHz) */ + uint32 state_change_count; /* total state (LDV/NDV) transition count */ + uint32 ldv_duration; /* total time (ms) in LDV */ + uint32 ndv_duration; /* total time (ms) in NDV */ + uint16 status; /* status bits */ + uint16 raw_request; /* raw request bits */ + uint16 active_request; /* active request bits */ +} dvfs_status_v2_t; +#define DVFS_STATUS_VER_2_LEN (sizeof(dvfs_status_v2_t)) + +/* DVFS_SUBCMD_HIST */ +#define DVFS_HIST_CMD_VERSION_1 1 +typedef struct dvfs_hist_cmd_v1 { + uint16 version; /* version of this structure */ + uint16 len; /* includes both fixed and variable data[] fields */ + uint8 data[]; /* subcommand data : array of dvfs_hist_v1_t */ +} dvfs_hist_cmd_v1_t; + +/* DVFS_SUBCMD_HIST data[] payload */ +typedef struct dvfs_hist_v1 { + uint8 old_state; /* old state */ + uint8 new_state; /* new state */ + uint16 reason; /* reason for state change */ + uint32 timestamp; /* timestamp of state change */ +} dvfs_hist_v1_t; + +/* Bits for DVFS state change reason */ +#define WL_DVFS_REASON_NOTPM 0x0001u /* Not PM */ +#define WL_DVFS_REASON_MPC 0x0002u /* MPC */ +#define WL_DVFS_REASON_TX_ACTIVE 0x0004u /* TX Active */ +#define WL_DVFS_REASON_DBGST_ACTIVE 0x0008u /* Power state ative */ +#define WL_DVFS_REASON_DBGST_ASLEEP 0x0010u /* Power state asleep */ +#define WL_DVFS_REASON_LTR_ACTIVE 0x0020u /* LTR Active */ +#define WL_DVFS_REASON_HOST 0x0040u /* Host disabled */ + /* * Join preference iovar value is an array of tuples. Each tuple has a one-byte type, * a one-byte length, and a variable length value. RSSI type tuple must be present @@ -3504,9 +3567,16 @@ enum { WL_REINIT_RC_MAC_ENABLE = 52, WL_REINIT_RC_SCAN_STALLED = 53, WL_REINIT_RC_PHY_HC = 54, - WL_REINIT_RC_LAST /* This must be the last entry */ + WL_REINIT_RC_LAST, /* DONOT use this any more, kept for legacy reasons */ + WL_REINIT_RC_RADIO_CRASH = 55, + WL_REINIT_RC_SUPPORTED_LAST /* Use for app ONLY, DONOT use this in wlc code. + * For wlc, use WL_REINIT_RC_VERSIONED_LAST + */ }; +#define WL_REINIT_RC_V2 (2u) +#define WL_REINIT_RC_LAST_V2 (WL_REINIT_RC_RADIO_CRASH) + #define WL_REINIT_RC_INVALID 255 #define NREINITREASONCOUNT 8 @@ -3514,8 +3584,9 @@ enum { * Any change to this will break wl tool compatibility with other branches * #define NREINITREASONCOUNT WL_REINIT_RC_LAST */ - +/* REINITRSNIDX is kept for legacy reasons. Use REINIT_RSN_IDX for new versioned structure */ #define REINITRSNIDX(_x) (((_x) < WL_REINIT_RC_LAST) ? (_x) : 0) +#define REINIT_RSN_IDX(_x) (((_x) < WL_REINIT_RC_SUPPORTED_LAST) ? (_x) : 0) #define WL_CNT_T_VERSION 30 /**< current version of wl_cnt_t struct */ #define WL_CNT_VERSION_6 6 @@ -3542,10 +3613,11 @@ enum { enum wl_cnt_xtlv_id { WL_CNT_XTLV_SLICE_IDX = 0x1, /**< Slice index */ WL_CNT_XTLV_WLC = 0x100, /**< WLC layer counters */ - WL_CNT_XTLV_WLC_RINIT_RSN = 0x101, /**< WLC layer reinitreason extension */ + WL_CNT_XTLV_WLC_RINIT_RSN = 0x101, /**< WLC layer reinitreason extension: LEGACY */ WL_CNT_XTLV_WLC_HE = 0x102, /* he counters */ WL_CNT_XTLV_WLC_SECVLN = 0x103, /* security vulnerabilities counters */ WL_CNT_XTLV_WLC_HE_OMI = 0x104, /* he omi counters */ + WL_CNT_XTLV_WLC_RINIT_RSN_V2 = 0x105, /**< WLC layer reinitreason extension */ WL_CNT_XTLV_CNTV_LE10_UCODE = 0x200, /**< wl counter ver < 11 UCODE MACSTAT */ WL_CNT_XTLV_LT40_UCODE_V1 = 0x300, /**< corerev < 40 UCODE MACSTAT */ WL_CNT_XTLV_GE40_UCODE_V1 = 0x400, /**< corerev >= 40 UCODE MACSTAT */ @@ -3753,10 +3825,6 @@ enum { #define WL_CNTBUF_MAX_SIZE MAX(WL_XTLV_CNTBUF_MAX_SIZE, (uint32)sizeof(wl_cnt_ver_11_t)) -/* Please refer to the twiki for counters addition/deletion. - * http://hwnbu-twiki.sj.broadcom.com/bin/view/Mwgroup/WlCounters#Counter_Edition - */ - /** Top structure of counters IOVar buffer */ typedef struct { uint16 version; /**< see definition of WL_CNT_T_VERSION */ @@ -4043,11 +4111,11 @@ typedef struct { uint32 txbar_noack; /* number of TX BAR sent, but not acknowledged by peer */ uint32 rxfrag_agedout; /**< # of aged out rx fragmentation */ uint32 pmkid_mismatch_cnt; /* number of EAPOL msg1 PMKID mismatch */ + uint32 txaction_vndr_attempt; /* Number of VS AFs scheduled successfully for Tx */ + uint32 txaction_vndr_fail; /* Number of VS AFs not sent or not acked */ /* Do not remove or rename in the middle of this struct. * All counter variables have to be of uint32. - * Please follow the instruction in - * http://hwnbu-twiki.sj.broadcom.com/bin/view/Mwgroup/WlCounters#Counter_Edition */ } wl_cnt_wlc_t; @@ -4272,10 +4340,17 @@ typedef struct { } wl_secvln_cnt_t; /* Reinit reasons - do not put anything else other than reinit reasons here */ +/* LEGACY STRUCTURE, DO NO MODIFY, SEE reinit_rsns_v1_t and further versions */ typedef struct { uint32 rsn[WL_REINIT_RC_LAST]; } reinit_rsns_t; +typedef struct { + uint16 version; + uint16 len; + uint32 rsn[WL_REINIT_RC_LAST_V2]; +} reinit_rsns_v2_t; + /* MACXSTAT counters for ucodex (corerev >= 64) */ typedef struct { uint32 macxsusp; @@ -4970,9 +5045,6 @@ typedef struct { /* This structure is deprecated and used only for ver <= 11. * All counter variables have to be of uint32. - * Please refer to the following twiki before editing. - * http://hwnbu-twiki.sj.broadcom.com/bin/view/ - * Mwgroup/WlCounters#wlc_layer_counters_non_xTLV */ } wl_cnt_ver_11_t; @@ -5611,6 +5683,38 @@ typedef struct wl_mkeep_alive_pkt { #define WL_MKEEP_ALIVE_PERIOD_MASK 0x7FFFFFFF #define WL_MKEEP_ALIVE_IMMEDIATE 0x80000000 +typedef struct wl_mkeep_alive_hist_info_v1 { + uint32 first_pktsend_ts; /**< timestamp(ms): packet was sent */ + uint32 first_txs_ts; /**< timestamp(ms): received the first txstatus */ + uint32 last_retry_txs_ts; /**< timestamp(ms): received the last txstatus */ + uint32 first_retry_ts; /**< timestamp(ms): resent the packet first time */ + uint32 last_retry_ts; /**< timestamp(ms): resent the packet last time */ + uint32 first_txs; /**< txstatus when dongle received first time */ + uint32 last_retry_txs; /**< txstatus when dongle received last time */ + uint32 retry_cnt; /**< number of retries for the packet */ +} wl_mkeep_alive_hist_info_v1_t; + +typedef struct wl_mkeep_alive_hist_req_v1 { + uint16 version; /**< version of structure */ + uint16 length; /**< length of this structure */ + uint16 flags; /**< mkeepalive idx, operation codes */ + uint16 count; /**< number of results */ + uint16 max; /**< maximum number of history */ + wl_mkeep_alive_hist_info_v1_t info[]; /**< struct array of length count */ +} wl_mkeep_alive_hist_req_v1_t; + +/* version of the mkeep_alive_hist IOVAR */ +#define WL_MKEEP_ALIVE_HIST_REQ_VER_1 1u +/* Fixed length of wl_mkeep_alive_hist_req_v1_t */ +#define WL_MKEEP_ALIVE_HIST_REQ_FIXED_LEN_VER_1 OFFSETOF(wl_mkeep_alive_hist_req_v1_t, info) +/* Keepalive ID */ +#define WL_MKEEP_ALIVE_HIST_ID_MASK 0xFF00u /**< ID mask */ +#define WL_MKEEP_ALIVE_HIST_ID_SHIFT 8u /**< Offset of keepalive ID */ +/* OP Codes */ +#define WL_MKEEP_ALIVE_HIST_OP_MASK 0x00FFu /**< OP code mask */ +#define WL_MKEEP_ALIVE_HIST_RESET (0x1u << 0u) /**< Clear history of specified ID */ +#define WL_MKEEP_ALIVE_HIST_RESET_ALL (0x1u << 1u) /**< Clear all history */ + /** TCP Keep-Alive conn struct */ typedef struct wl_mtcpkeep_alive_conn_pkt { struct ether_addr saddr; /**< src mac address */ @@ -5903,8 +6007,6 @@ enum { /** report found/lost events for SSID and BSSID networks seperately */ #define REPORT_SEPERATELY_MASK 0x0800 -#define PFN_VERSION 2 - #define PFN_COMPLETE 1 #define PFN_INCOMPLETE 0 @@ -6072,28 +6174,63 @@ typedef struct wl_pfn_scanresult_v2_1 { uint8 bss_info[]; /* var length wl_bss_info_X structures */ } wl_pfn_scanresult_v2_1_t; +#define WL_PFN_MAX_RAND_LIMIT 20u +#define PFN_VERSION_V2 2u /**PFN data structure */ -typedef struct wl_pfn_param { +typedef struct wl_pfn_param_v2 { int32 version; /**< PNO parameters version */ int32 scan_freq; /**< Scan frequency */ int32 lost_network_timeout; /**< Timeout in sec. to declare - * discovered network as lost - */ + * discovered network as lost + */ int16 flags; /**< Bit field to control features - * of PFN such as sort criteria auto - * enable switch and background scan - */ + * of PFN such as sort criteria auto + * enable switch and background scan + */ int16 rssi_margin; /**< Margin to avoid jitter for choosing a - * PFN based on RSSI sort criteria - */ - uint8 bestn; /**< number of best networks in each scan */ - uint8 mscan; /**< number of scans recorded */ - uint8 repeat; /**< Minimum number of scan intervals - *before scan frequency changes in adaptive scan - */ - uint8 exp; /**< Exponent of 2 for maximum scan interval */ - int32 slow_freq; /**< slow scan period */ -} wl_pfn_param_t; + * PFN based on RSSI sort criteria + */ + uint8 bestn; /**< number of best networks in each scan */ + uint8 mscan; /**< number of scans recorded */ + uint8 repeat; /**< Minimum number of scan intervals + *before scan frequency changes in adaptive scan + */ + uint8 exp; /**< Exponent of 2 for maximum scan interval */ + int32 slow_freq; /**< slow scan period */ +} wl_pfn_param_v2_t; + +#define PFN_VERSION_V3 3u +typedef struct wl_pfn_param_v3 { + int16 version; /**< PNO parameters version */ + int16 length; /* length of the structure */ + int32 scan_freq; /**< Scan frequency */ + int32 lost_network_timeout; /**< Timeout in sec. to declare + * discovered network as lost + */ + int16 flags; /**< Bit field to control features + * of PFN such as sort criteria auto + * enable switch and background scan + */ + int16 rssi_margin; /**< Margin to avoid jitter for choosing a + * PFN based on RSSI sort criteria + */ + uint8 bestn; /**< number of best networks in each scan */ + uint8 mscan; /**< number of scans recorded */ + uint8 repeat; /**< Minimum number of scan intervals + *before scan frequency changes in adaptive scan + */ + uint8 exp; /**< Exponent of 2 for maximum scan interval */ + int32 slow_freq; /**< slow scan period */ + uint8 min_bound; /**< pfn scan period randomization - lower bound % */ + uint8 max_bound; /**< pfn scan period randomization - upper bound % */ + uint8 pfn_lp_scan_disable; /* add support to enable/disable scan-core scan for PNO */ + uint8 PAD[1]; /**< Pad to 32-bit alignment */ +} wl_pfn_param_v3_t; + +#ifndef PFN_PARAM_HAS_ALIAS +typedef wl_pfn_param_v2_t wl_pfn_param_t; +#define PFN_VERSION PFN_VERSION_V2 +#endif // endif typedef struct wl_pfn_bssid { struct ether_addr macaddr; @@ -6668,6 +6805,7 @@ typedef struct rssi_struct { uint8 idx; /**< next rssi location */ } rssi_struct_t; +// MOG-ON: WLDFSP #ifdef WLDFSP #define DFSP_EVT_OFFSET OFFSETOF(dfsp_event_data_t, ie) #define DFSP_EVT_FLAGS_AP_ASSOC (1 << 0) @@ -6733,8 +6871,10 @@ typedef struct dfsp_stats { uint32 dfsp_evtresume; } dfsp_stats_t; #endif /* WLDFSP */ -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL +// MOG-OFF: WLDFSP + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL /* * ptk_start: iovar to start 4-way handshake for secured ranging @@ -6816,7 +6956,7 @@ typedef enum wl_pkt_filter_type { WL_PKT_FILTYER_TYPE_MAX = 7, /* Pkt filter type MAX */ } wl_pkt_filter_type_t; -#define WL_PKT_FILTER_TYPE wl_pkt_filter_type_t +#define WL_PKT_FILTER_TYPE wl_pkt_filter_type_t /* backward compatibility; remove */ /* String mapping for types that may be used by applications or debug */ #define WL_PKT_FILTER_TYPE_NAMES \ @@ -7022,6 +7162,8 @@ typedef struct wl_pkteng_rx_pkt { #define WL_PKTENG_RU_FILL_VER_1 1u #define WL_PKTENG_RU_FILL_VER_2 2u +#define WL_PKTENG_RU_FILL_VER_3 3u + // struct for ru packet engine typedef struct wl_pkteng_ru_v1 { uint16 version; /* ver is 1 */ @@ -7064,12 +7206,36 @@ typedef struct wl_pkteng_ru_v2 { uint8 trig_type; /* type of trigger frame */ uint8 trig_period; /* trigger tx periodicity TBD */ uint8 tgt_rssi; /* target rssi value in encoded format */ - uint8 pad[3]; /* 3 byte padding to make structure size a multiple of 32bits */ + uint8 pad[3]; /* 2 byte padding to make structure size a multiple of 32bits */ } wl_pkteng_ru_v2_t; +typedef struct wl_pkteng_ru_v3 { + uint16 version; /* ver is 3 */ + uint16 length; /* size of complete structure */ + uint8 bw; /* bandwidth info */ + uint8 ru_alloc_val; /* ru allocation index number */ + uint8 mcs_val; /* mcs allocated value */ + uint8 nss_val; /* num of spatial streams */ + uint32 num_bytes; /* approx num of bytes to calculate other required params */ + struct ether_addr dest; /* destination address for un-associated mode */ + uint8 cp_ltf_val ; /* GI and LTF symbol size */ + uint8 he_ltf_symb ; /* num of HE-LTF symbols */ + uint8 stbc; /* STBC support */ + uint8 coding_val; /* BCC/LDPC coding support */ + uint8 pe_category; /* PE duration 0/8/16usecs */ + uint8 dcm; /* dual carrier modulation */ + uint8 mumimo_ltfmode; /* ltf mode */ + uint8 trig_tx; /* form and transmit the trigger frame */ + uint8 trig_type; /* type of trigger frame */ + uint8 trig_period; /* trigger tx periodicity TBD */ + uint8 tgt_rssi; /* target rssi value in encoded format */ + uint8 sub_band; /* in 160MHz case, 80L, 80U */ + uint8 pad[2]; /* 2 byte padding to make structure size a multiple of 32bits */ +} wl_pkteng_ru_v3_t; + #ifndef WL_PKTENG_RU_VER /* App uses the latest version - source picks it up from wlc_types.h */ -typedef wl_pkteng_ru_v2_t wl_pkteng_ru_fill_t; +typedef wl_pkteng_ru_v3_t wl_pkteng_ru_fill_t; #endif // endif typedef struct wl_trig_frame_info { @@ -7162,6 +7328,13 @@ typedef struct wl_txcal_params_v2 { uint16 version; } wl_txcal_params_v2_t; +typedef struct wl_txtone_idxsweep_params { + int8 gidx_step; + uint8 gidx_start_percore[WL_STA_ANT_MAX]; + uint8 gidx_stop_percore[WL_STA_ANT_MAX]; + uint32 dwell_time; +} wl_txtone_idxsweep_params; + typedef wl_txcal_params_t wl_txcal_params_v1_t; typedef struct wl_rssilog_params { @@ -7622,7 +7795,7 @@ typedef enum event_msgs_ext_command { } event_msgs_ext_command_t; #define EVENTMSGS_VER 1 -#define EVENTMSGS_EXT_STRUCT_SIZE OFFSETOF(eventmsgs_ext_t, mask[0]) +#define EVENTMSGS_EXT_STRUCT_SIZE ((uint)(sizeof(eventmsgs_ext_t) - 1)) /* len- for SET it would be mask size from the application to the firmware */ /* for GET it would be actual firmware mask size */ @@ -7762,24 +7935,30 @@ typedef BWL_PRE_PACKED_STRUCT struct wl_pwrstats { #define WL_PWR_STATS_HDRLEN OFFSETOF(wl_pwrstats_t, data) /* Bits for wake reasons */ -#define WLC_PMD_WAKE_SET 0x1 -#define WLC_PMD_PM_AWAKE_BCN 0x2 +#define WLC_PMD_WAKE_SET 0x1u +#define WLC_PMD_PM_AWAKE_BCN 0x2u /* BIT:3 is no longer being used */ -#define WLC_PMD_SCAN_IN_PROGRESS 0x8 -#define WLC_PMD_RM_IN_PROGRESS 0x10 -#define WLC_PMD_AS_IN_PROGRESS 0x20 -#define WLC_PMD_PM_PEND 0x40 -#define WLC_PMD_PS_POLL 0x80 -#define WLC_PMD_CHK_UNALIGN_TBTT 0x100 -#define WLC_PMD_APSD_STA_UP 0x200 -#define WLC_PMD_TX_PEND_WAR 0x400 /* obsolete, can be reused */ -#define WLC_PMD_NAN_AWAKE 0x400 /* Reusing for NAN */ -#define WLC_PMD_GPTIMER_STAY_AWAKE 0x800 -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL -#define WLC_PMD_PM2_RADIO_SOFF_PEND 0x2000 -#define WLC_PMD_NON_PRIM_STA_UP 0x4000 -#define WLC_PMD_AP_UP 0x8000 +#define WLC_PMD_SCAN_IN_PROGRESS 0x8u +#define WLC_PMD_RM_IN_PROGRESS 0x10u +#define WLC_PMD_AS_IN_PROGRESS 0x20u +#define WLC_PMD_PM_PEND 0x40u +#define WLC_PMD_PS_POLL 0x80u +#define WLC_PMD_CHK_UNALIGN_TBTT 0x100u +#define WLC_PMD_APSD_STA_UP 0x200u +#define WLC_PMD_TX_PEND_WAR 0x400u /* obsolete, can be reused */ +#define WLC_PMD_NAN_AWAKE 0x400u /* Reusing for NAN */ +#define WLC_PMD_GPTIMER_STAY_AWAKE 0x800u + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + +#define WLC_PMD_PM2_RADIO_SOFF_PEND 0x2000u +#define WLC_PMD_NON_PRIM_STA_UP 0x4000u +#define WLC_PMD_AP_UP 0x8000u +#define WLC_PMD_TX_IN_PROGRESS 0x10000u /* Dongle awake due to packet TX */ +#define WLC_PMD_4WAYHS_IN_PROGRESS 0x20000u /* Dongle awake due to 4 way handshake */ +#define WLC_PMD_PM_OVERRIDE 0x40000u /* Dongle awake due to PM override */ +#define WLC_PMD_WAKE_OTHER 0x80000u typedef struct wlc_pm_debug { uint32 timestamp; /**< timestamp in millisecond */ @@ -8163,8 +8342,10 @@ typedef struct wl_pwr_phy_stats { uint32 tx_dur; /**< TX Active duration in us */ uint32 rx_dur; /**< RX Active duration in us */ } wl_pwr_phy_stats_t; -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + typedef struct wl_mimo_meas_metrics_v1 { uint16 type; uint16 len; @@ -8552,6 +8733,32 @@ typedef BWL_PRE_PACKED_STRUCT struct { int8 SARLIMIT[MAX_STREAMS_SUPPORTED]; uint8 pprdata[1]; /**< ppr serialization buffer */ } BWL_POST_PACKED_STRUCT tx_pwr_rpt_t; + +typedef BWL_PRE_PACKED_STRUCT struct { + uint32 flags; + chanspec_t chanspec; /**< txpwr report for this channel */ + chanspec_t local_chanspec; /**< channel on which we are associated */ + uint8 local_max; /**< local max according to the AP */ + uint8 local_constraint; /**< local constraint according to the AP */ + int8 pad[2]; /**< unused */ + 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 w/o adjustment */ + uint8 est_Pout_cck; /**< Latest CCK tx power out estimate */ + uint8 tx_power_max[4]; /**< Maximum target power among all rates */ + uint32 tx_power_max_rate_ind[4]; /**< Index of the rate with the max target power */ + 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 */ + int8 target_offsets[4]; /**< Target power offsets for current rate per core */ + uint32 last_tx_ratespec; /**< Ratespec for last transmition */ + uint32 user_target; /**< user limit */ + uint32 ppr_len; /**< length of each ppr serialization buffer */ + int8 SARLIMIT[MAX_STREAMS_SUPPORTED]; + int8 antgain[3]; /**< Ant gain for each band - from SROM */ + uint8 pprdata[1]; /**< ppr serialization buffer */ +} BWL_POST_PACKED_STRUCT tx_pwr_rpt_v2_t; #include typedef struct tx_pwr_ru_rate_info { @@ -8913,10 +9120,10 @@ typedef struct { chanim_stats_t stats[1]; } wl_chanim_stats_t; -#define WL_SC_CHANIM_STATS_V1 1 +#define WL_SC_CHANIM_STATS_V1 1u /* sc chanim interface stats */ typedef struct sc_chanim_stats_v1 { - uint32 stats_ms; + uint32 stats_ms; /* duraion for which stats are collected, in ms */ chanspec_t chanspec; uint16 PAD; uint32 sc_only_rx_dur; /* rx only on sc, in ms */ @@ -8924,22 +9131,74 @@ typedef struct sc_chanim_stats_v1 { uint32 sc_rx_ac_rx_dur; /* Rx on SC when AC is active, in ms */ uint32 sc_rx_mc_tx_dur; /* sc rx with MC tx, in ms */ uint32 sc_rx_ac_bt_tx_dur; /* sc rx with AC-BT tx, in ms */ - uint32 sc_rx_bt_rx_dur; /* sc rx when BT is active, in ms */ + uint32 sc_rx_bt_rx_dur; /* sc rx when BT Main is active, in ms */ + uint32 sc_rx_btsc_rx_dur; /* BT sc and wlan SC rx is active, in ms */ } sc_chanim_stats_v1_t; typedef struct { uint32 version; uint32 length; - uint32 count; /* Count of stats that are queried, + uint8 flags; /* flags: to print the stats, * WL_CHANIM_COUNT_ONE ==> Query stats for Home channel, * WL_CHANIM_COUNT_ALL ==> Query stats for all channels */ + uint8 id; /* Module id, to know which module has sent the stats + * SC_CHANIM_ID_SCAN ==> For SCAN + * SC_CHANIM_ID_STA ==> For STA + */ + uint8 count; /* o/p: Count of channels for which stats needs to be displayed. + * This value is number of channels supported in particular locale when + * flags is WL_CHANIM_COUNT_ALL, one when flag is + * WL_CHANIM_COUNT_ONE + */ + uint8 PAD; sc_chanim_stats_v1_t sc_stats[1]; } wl_chanim_sc_stats_v1_t; +/* WL_CHANIM_SC_STATS_FIXED_LEN: when we change size of any field above sc_stats, this macro + * needs versioning. At present it uses offset of v1, which is same for all versions so far + */ #define WL_CHANIM_SC_STATS_FIXED_LEN OFFSETOF(wl_chanim_sc_stats_v1_t, sc_stats) #define WL_CHANIM_STATS_FIXED_LEN OFFSETOF(wl_chanim_stats_t, stats) +#define WL_SC_CHANIM_STATS_V2 2u +/* sc chanim interface stats */ +typedef struct sc_chanim_stats_v2 { + uint32 stats_ms; /* duraion for which stats are collected, in ms */ + chanspec_t chanspec; + uint16 PAD; + uint32 sc_only_rx_dur; /* rx only on sc, in ms */ + uint32 sc_rx_mc_rx_dur; /* Rx on SC when MC is active, in ms */ + uint32 sc_rx_ac_rx_dur; /* Rx on SC when AC is active, in ms */ + uint32 sc_rx_mc_tx_dur; /* sc rx with MC tx, in ms */ + uint32 sc_rx_ac_bt_tx_dur; /* sc rx with AC-BT tx, in ms */ + uint32 sc_rx_bt_rx_dur; /* sc rx when BT Main is active, in ms */ + uint32 sc_btle_overlap_dur; /* wlsc was awake and btsc le scan overlapped, in ms */ + uint32 sc_btpage_overlap_dur; /* wlsc was awake and btsc page scan overlapped, in ms */ + uint32 sc_btle_blnk_dur; /* wlauxtx blanked btsc le scan, in ms */ + uint32 sc_btpage_blnk_dur; /* wlauxtx blanked btsc page scan, in ms */ +} sc_chanim_stats_v2_t; + +typedef struct { + uint32 version; + uint32 length; + uint8 flags; /* flags: to print the stats, + * WL_CHANIM_COUNT_ONE ==> Query stats for Home channel, + * WL_CHANIM_COUNT_ALL ==> Query stats for all channels + */ + uint8 id; /* Module id, to know which module has sent the stats + * SC_CHANIM_ID_SCAN ==> For SCAN + * SC_CHANIM_ID_STA ==> For STA + */ + uint8 count; /* o/p: Count of channels for which stats needs to be displayed. + * This value is number of channels supported in particular locale when + * flags is WL_CHANIM_COUNT_ALL, one when flag is + * WL_CHANIM_COUNT_ONE + */ + uint8 PAD; + sc_chanim_stats_v2_t sc_stats[1]; +} wl_chanim_sc_stats_v2_t; + /** Noise measurement metrics. */ #define NOISE_MEASURE_KNOISE 0x1 @@ -9836,8 +10095,11 @@ typedef struct wl_proxd_params_rssi_method { #define Q1_NS 25 /**< Q1 time units */ -#define TOF_BW_NUM 3 /**< number of bandwidth that the TOF can support */ -#define TOF_BW_SEQ_NUM (TOF_BW_NUM+2) /* number of total index */ +/* Number of bandwidth that the TOF can support */ +#define TOF_BW_NUM 3 +/* Number of total index including seq tx/rx idx */ +#define TOF_BW_SEQ_NUM 5 + enum tof_bw_index { TOF_BW_20MHZ_INDEX = 0, TOF_BW_40MHZ_INDEX = 1, @@ -9846,16 +10108,36 @@ enum tof_bw_index { TOF_BW_SEQRX_INDEX = 4 }; +/* + * Version 2 of above bw defines + * and enum tof_bw_index, + * with advent of 160 MHz + */ +#define TOF_BW_NUM_V2 4u +#define TOF_BW_SEQ_NUM_V2 6u + +enum tof_bw_index_v2 { + TOF_BW_20MHZ_INDEX_V2 = 0, + TOF_BW_40MHZ_INDEX_V2 = 1, + TOF_BW_80MHZ_INDEX_V2 = 2, + TOF_BW_160MHZ_INDEX_V2 = 3, + TOF_BW_SEQTX_INDEX_V2 = 4, + TOF_BW_SEQRX_INDEX_V2 = 5 +}; + #define BANDWIDTH_BASE 20 /**< base value of bandwidth */ -#define TOF_BW_20MHZ (BANDWIDTH_BASE << TOF_BW_20MHZ_INDEX) -#define TOF_BW_40MHZ (BANDWIDTH_BASE << TOF_BW_40MHZ_INDEX) -#define TOF_BW_80MHZ (BANDWIDTH_BASE << TOF_BW_80MHZ_INDEX) +#define TOF_BW_20MHZ (BANDWIDTH_BASE << TOF_BW_20MHZ_INDEX_V2) +#define TOF_BW_40MHZ (BANDWIDTH_BASE << TOF_BW_40MHZ_INDEX_V2) +#define TOF_BW_80MHZ (BANDWIDTH_BASE << TOF_BW_80MHZ_INDEX_V2) +#define TOF_BW_160MHZ (BANDWIDTH_BASE << TOF_BW_160MHZ_INDEX_V2) + #define TOF_BW_10MHZ 10 #define NFFT_BASE 64 /**< base size of fft */ -#define TOF_NFFT_20MHZ (NFFT_BASE << TOF_BW_20MHZ_INDEX) -#define TOF_NFFT_40MHZ (NFFT_BASE << TOF_BW_40MHZ_INDEX) -#define TOF_NFFT_80MHZ (NFFT_BASE << TOF_BW_80MHZ_INDEX) +#define TOF_NFFT_20MHZ (NFFT_BASE << TOF_BW_20MHZ_INDEX_V2) +#define TOF_NFFT_40MHZ (NFFT_BASE << TOF_BW_40MHZ_INDEX_V2) +#define TOF_NFFT_80MHZ (NFFT_BASE << TOF_BW_80MHZ_INDEX_V2) +#define TOF_NFFT_160MHZ (NFFT_BASE << TOF_BW_160MHZ_INDEX_V2) typedef struct wl_proxd_params_tof_method { chanspec_t chanspec; /**< chanspec for home channel */ @@ -10011,6 +10293,48 @@ typedef struct wl_proxd_params_tof_tune_v3 { uint8 PAD[3]; } wl_proxd_params_tof_tune_v3_t; +/* + * tof tune with 160 MHz support + */ +#define WL_PROXD_TUNE_VERSION_4 4u +typedef struct wl_proxd_params_tof_tune_v4 { + uint16 version; + uint16 len; + uint8 core; /**< core to use for tx */ + uint8 setflags; /* set flags of K, N. S values */ + uint8 totalfrmcnt; /**< total count of transfered measurement frames */ + uint8 sw_adj; /**< enable sw assisted timestamp adjustment */ + uint8 hw_adj; /**< enable hw assisted timestamp adjustment */ + uint8 seq_en; /**< enable ranging sequence */ + uint8 smooth_win_en; + uint8 core_mask; /* core mask selection */ + int8 recv_2g_thresh; /* 2g recieve sensitivity threshold */ + int8 acs_rssi_thresh; + int8 acs_delta_rssi_thresh; + uint8 ftm_cnt[TOF_BW_SEQ_NUM_V2]; /**< no. of ftm frames based on bw */ + uint8 PAD[3]; /* Use this for any int8/16 uint8/16 ext in future */ + uint16 rsv_media; /**< reserve media value for TOF */ + uint16 bitflip_thresh; /* bitflip threshold */ + uint16 snr_thresh; /* SNR threshold */ + int16 vhtack; /**< enable/disable VHT ACK */ + int16 N_log2_2g; /**< simple threshold crossing for 2g channel */ + int16 N_scale_2g; /**< simple threshold crossing for 2g channel */ + int16 N_log2[TOF_BW_SEQ_NUM_V2]; /**< simple threshold crossing */ + int16 w_offset[TOF_BW_NUM_V2]; /**< offset of thresh crossing window(per BW) */ + int16 w_len[TOF_BW_NUM_V2]; /**< length of thresh crossing window(per BW) */ + int16 N_scale[TOF_BW_SEQ_NUM_V2]; /**< simple threshold crossing */ + uint32 Ki; /**< h/w delay K factor for initiator */ + uint32 Kt; /**< h/w delay K factor for target */ + uint32 flags; /**< flags */ + uint32 acs_gdv_thresh; + int32 maxDT; /**< max time difference of T4/T1 or T3/T2 */ + int32 minDT; /**< min time difference of T4/T1 or T3/T2 */ + int32 acs_gdmm_thresh; + int32 emu_delay; + wl_proxd_seq_config_t seq_5g20; /* Thresh crossing params for 2G Sequence */ + wl_proxd_seq_config_t seq_2g20; /* Thresh crossing params for 2G Sequence */ +} wl_proxd_params_tof_tune_v4_t; + typedef struct wl_proxd_params_iovar { uint16 method; /**< Proximity Detection method */ uint8 PAD[2]; @@ -10025,6 +10349,27 @@ typedef struct wl_proxd_params_iovar { } u; /**< Method specific optional parameters */ } wl_proxd_params_iovar_t; +/* + * proxd param iov with 160 MHz support + */ +#define WL_PROXD_IOVAR_VERSION_2 2u +typedef struct wl_proxd_params_iovar_v2 { + uint16 version; + uint16 len; + uint16 method; /**< Proximity Detection method */ + uint16 PAD; + union { + /* common params for pdsvc */ + wl_proxd_params_common_t cmn_params; /**< common parameters */ + /* method specific */ + wl_proxd_params_rssi_method_t rssi_params; /**< RSSI method parameters */ + wl_proxd_params_tof_method_t tof_params; /**< TOF method parameters */ + /* tune parameters */ + wl_proxd_params_tof_tune_v4_t tof_tune; /**< TOF tune parameters */ + } u; /**< Method specific optional parameters */ + uint8 tlv_params[]; /* xtlvs for variable ext params */ +} wl_proxd_params_iovar_v2_t; + #define PROXD_COLLECT_GET_STATUS 0 #define PROXD_COLLECT_SET_STATUS 1 #define PROXD_COLLECT_QUERY_HEADER 2 @@ -10079,6 +10424,38 @@ typedef BWL_PRE_PACKED_STRUCT struct wl_proxd_collect_header { } BWL_POST_PACKED_STRUCT wl_proxd_collect_header_t; #include +/* + * proxd collect header with 160 MHz support + */ +#define WL_PROXD_COLLECT_HEADER_VERSION_2 2u +typedef struct wl_proxd_collect_header_v2 { + uint16 version; + uint16 len; + uint8 chiprev; /**< chip revision */ + uint8 phyver; /**< phy version */ + uint8 PAD[2]; /* Use this for any int8/16 uint8/16 ext in future */ + uint16 total_frames; /**< The total frames for this collect. */ + uint16 nfft; /**< nfft value */ + uint16 bandwidth; /**< bandwidth */ + uint16 channel; /**< channel number */ + uint16 fpfactor_shift; /**< avb timer value shift bits */ + uint16 chipnum; /**< chip type */ + uint32 chanspec; /**< channel spec */ + uint32 fpfactor; /**< avb timer value factor */ + uint32 meanrtt; /**< mean of RTTs */ + uint32 modertt; /**< mode of RTTs */ + uint32 medianrtt; /**< median of RTTs */ + uint32 sdrtt; /**< standard deviation of RTTs */ + uint32 clkdivisor; /**< clock divisor */ + int32 distance; /**< distance calculated by fw */ + struct ether_addr localMacAddr; /**< local mac address */ + uint16 PAD; /* Use this for any int8/16 uint8/16 ext in future */ + struct ether_addr remoteMacAddr; /**< remote mac address */ + uint16 PAD; /* Use this for any int8/16 uint8/16 ext in future */ + wl_proxd_params_tof_tune_v4_t params; /* TOF tune params */ + uint8 tlv_params[]; /* xtlvs for variable ext params */ +} wl_proxd_collect_header_v2_t; + /* ifdef WL_NAN */ /* ********************** NAN wl interface struct types and defs ******************** */ /* @@ -10386,6 +10763,32 @@ typedef struct wl_nan_range_txs { #define NAN_MAX_BANDS 2 +enum wl_nan_oob_af_txs_reason_code { + WL_NAN_OOB_AF_TX_REASON_BMAP = 0x01 /* Bitmap schedule */ +}; + +/* WL_NAN_EVENT_OOB_AF_TXS event sent to host after NAN OOB AF transmit attempted */ +typedef struct wl_nan_event_oob_af_txs { + uint8 result; /* For TX status, success or failure */ + uint8 reason; /* wl_nan_oob_af_txs_reason_code */ + uint16 token; /* Token from the host */ +} wl_nan_event_oob_af_txs_t; + +/* WL_NAN_EVENT_OOB_AF_RX event sent to host upon receiving a NAN OOB AF frame */ +typedef struct wl_nan_event_oob_af_rx { + struct ether_addr sa; + struct ether_addr da; + struct ether_addr bssid; + uint16 payload_len; + uint8 payload[]; /* AF hdr + NAN attrbutes in TLV format */ +} wl_nan_event_oob_af_rx_t; + +#define WL_NAN_CFG_OOB_AF_BODY_MAX_SIZE 1024u /* Max size of AF payload */ + +/* Max size of the NAN OOB AF information in the IOVAR */ +#define WL_NAN_CFG_OOB_AF_MAX_INFO_SIZE \ + (sizeof(bcm_xtlv_t) + sizeof(wl_nan_oob_af_t) + \ + WL_NAN_CFG_OOB_AF_BODY_MAX_SIZE) /* * TLVs - Below XTLV definitions will be deprecated * in due course (soon as all other branches update @@ -10501,6 +10904,9 @@ typedef enum wl_nan_tlv { /* wl_nan_fw_cap_v2_t */ WL_NAN_XTLV_GEN_FW_CAP_V2 = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x02), + /* NAN OOB AF tlv */ + WL_NAN_XTLV_OOB_AF = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x03), + WL_NAN_XTLV_SCHED_INFO = NAN_CMD(WL_NAN_CMD_SCHED_COMP_ID, 0x01), /* Nan Save-Restore XTLVs */ @@ -10673,7 +11079,8 @@ enum wl_nan_sub_cmd_xtlv_id { /* Generic componenet */ WL_NAN_CMD_GEN_STATS = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x01), WL_NAN_CMD_GEN_FW_CAP = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x02), - WL_NAN_CMD_GEN_MAX = WL_NAN_CMD_GEN_FW_CAP, + WL_NAN_CMD_CFG_OOB_AF = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x03), + WL_NAN_CMD_GEN_MAX = WL_NAN_CMD_CFG_OOB_AF, /* NAN Save-Restore */ WL_NAN_CMD_NSR2 = NAN_CMD(WL_NAN_CMD_NSR_COMP_ID, 0x20), @@ -10713,6 +11120,7 @@ typedef enum wl_nan_stats_tlv { WL_NAN_XTLV_GEN_PEER_STATS_SCHED = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x05), WL_NAN_XTLV_GEN_AVAIL_STATS_SCHED = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x06), WL_NAN_XTLV_GEN_NDP_STATS = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x07), + WL_NAN_XTLV_GEN_PARSE_STATS = NAN_CMD(WL_NAN_CMD_GENERIC_COMP_ID, 0x08), WL_NAN_XTLV_DAM_STATS = NAN_CMD(WL_NAN_CMD_DAM_COMP_ID, 0x01), WL_NAN_XTLV_DAM_AVAIL_STATS = NAN_CMD(WL_NAN_CMD_DAM_COMP_ID, 0x02), @@ -11399,8 +11807,10 @@ typedef struct nan_sync_master { uint8 amr[WL_NAN_MASTER_RANK_LEN]; uint32 ambtt; } nan_sync_master_t; -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* NAN advertiser structure */ /* TODO RSDB: add chspec to indicates core corresponds correct core */ typedef struct nan_adv_entry { @@ -12287,6 +12697,18 @@ typedef struct wl_nan_dp_opaque_info { #define NAN_DP_SECURITY_MK 2 #define WL_NAN_DATA_NMSGID_LEN 8 /* 8 bytes as per nan spec */ +/* DP TERM event causes */ +#define WL_NAN_DP_TERM_WITH_INACTIVITY 1u +#define WL_NAN_DP_TERM_WITH_FSM_DESTROY 2u +#define WL_NAN_DP_TERM_WITH_PEER_DP_END 3u +#define WL_NAN_DP_TERM_WITH_STALE_NDP 4u +#define WL_NAN_DP_TERM_WITH_DISABLE 5u +#define WL_NAN_DP_TERM_WITH_NDI_DEL 6u +#define WL_NAN_DP_TERM_WITH_PEER_HB_FAIL 7u +#define WL_NAN_DP_TERM_WITH_HOST_IOVAR 8u +#define WL_NAN_DP_TERM_WITH_ESTB_FAIL 9u +#define WL_NAN_DP_TERM_WITH_SCHED_REJECT 10u + /* Common event structure for Nan Datapath * Used for sending NDP Indication, Response, Confirmation, Securty Install and Establish events */ @@ -12305,7 +12727,7 @@ typedef struct wl_nan_ev_datapath_cmn { /* Following two fields are valid only if type is multicast */ uint8 nmsg_id[WL_NAN_DATA_NMSGID_LEN]; uint8 mc_id; - uint8 pad; + uint8 event_cause; uint16 opt_tlv_len; uint8 opt_tlvs[]; } wl_nan_ev_datapath_cmn_t; @@ -12379,7 +12801,8 @@ enum wl_nan_fw_cap_flag1 { WL_NAN_FW_CAP_FLAG1_NSR2 = 0x00010000, WL_NAN_FW_CAP_FLAG1_NSR2_SAVE = 0x00020000, WL_NAN_FW_CAP_FLAG1_NANHO = 0x00040000, - WL_NAN_FW_CAP_FLAG1_NDPE = 0x00080000 + WL_NAN_FW_CAP_FLAG1_NDPE = 0x00080000, + WL_NAN_FW_CAP_FLAG1_OOB_AF = 0x00100000 }; /* WL_NAN_XTLV_GEN_FW_CAP */ @@ -12659,6 +13082,9 @@ typedef struct wl_nan_fastdisc_s { #define WL_NAN_FASTDISC_CFG_SIZE 1024 /* arbitrary */ +// MOG-ON: WL_NANHO +// MOG-OFF: WL_NANHO + /* ********************* end of NAN section ******************************** */ /* endif WL_NAN */ @@ -13067,15 +13493,19 @@ typedef BWL_PRE_PACKED_STRUCT struct wl_proxd_collect_info { A few extra samples are required to estimate frequency offset Right now 16 samples are being used. Can be changed in future. */ -#define K_TOF_COLLECT_SAMP_SIZE_20MHZ (2*(K_TOF_COLLECT_SC_20MHZ)+16+K_TOF_COLLECT_H_PAD) -#define K_TOF_COLLECT_RAW_SAMP_SIZE_20MHZ (2*K_TOF_COLLECT_SAMP_SIZE_20MHZ) -#define K_TOF_COLLECT_H_SIZE_20MHZ (K_TOF_COLLECT_SAMP_SIZE_20MHZ) -#define K_TOF_COLLECT_HRAW_SIZE_20MHZ (K_TOF_COLLECT_RAW_SAMP_SIZE_20MHZ) +#define K_TOF_COLLECT_SAMP_SIZE_20MHZ ((2u) * (K_TOF_COLLECT_SC_20MHZ) + \ + (16u) + (K_TOF_COLLECT_H_PAD)) +#define K_TOF_COLLECT_RAW_SAMP_SIZE_20MHZ ((2u) * (K_TOF_COLLECT_SAMP_SIZE_20MHZ)) +#define K_TOF_COLLECT_H_SIZE_20MHZ (K_TOF_COLLECT_SAMP_SIZE_20MHZ) +#define K_TOF_COLLECT_HRAW_SIZE_20MHZ (K_TOF_COLLECT_RAW_SAMP_SIZE_20MHZ) -#define K_TOF_COLLECT_SAMP_SIZE_80MHZ (2*(K_TOF_COLLECT_SC_80MHZ)+16+K_TOF_COLLECT_H_PAD) -#define K_TOF_COLLECT_RAW_SAMP_SIZE_80MHZ (2*K_TOF_COLLECT_SAMP_SIZE_80MHZ) -#define K_TOF_COLLECT_H_SIZE_80MHZ (K_TOF_COLLECT_SAMP_SIZE_80MHZ) -#define K_TOF_COLLECT_HRAW_SIZE_80MHZ (K_TOF_COLLECT_RAW_SAMP_SIZE_80MHZ) +#define K_TOF_COLLECT_SAMP_SIZE_80MHZ ((2u) * (K_TOF_COLLECT_SC_80MHZ) + \ + (16u) + (K_TOF_COLLECT_H_PAD)) +#define K_TOF_COLLECT_RAW_SAMP_SIZE_80MHZ ((2u) * K_TOF_COLLECT_SAMP_SIZE_80MHZ) +#define K_TOF_COLLECT_H_SIZE_80MHZ (K_TOF_COLLECT_SAMP_SIZE_80MHZ) +#define K_TOF_COLLECT_HRAW_SIZE_80MHZ (K_TOF_COLLECT_RAW_SAMP_SIZE_80MHZ) +#define K_TOF_COLLECT_HRAW_SIZE_20MHZ_1FS (K_TOF_COLLECT_SAMP_SIZE_20MHZ) +#define K_TOF_COLLECT_HRAW_SIZE_80MHZ_1FS ((2u) * (K_TOF_COLLECT_SAMP_SIZE_20MHZ)) #define WL_PROXD_COLLECT_DATA_VERSION_1 1 #include @@ -13107,7 +13537,18 @@ typedef struct wl_proxd_collect_data_v3 { uint32 H[K_TOF_COLLECT_H_SIZE_20MHZ]; uint32 chan[4 * K_TOF_COLLECT_CHAN_SIZE]; } wl_proxd_collect_data_t_v3; -#define WL_PROXD_COLLECT_DATA_VERSION_MAX WL_PROXD_COLLECT_DATA_VERSION_3 + +#define WL_PROXD_COLLECT_DATA_VERSION_4 4 +typedef struct wl_proxd_collect_data_v4 { + uint16 version; + uint16 len; + wl_proxd_collect_info_t info; + uint8 ri_rr[FTM_TPK_RI_RR_LEN_SECURE_2_0_5G]; + /**< raw data read from phy used to adjust timestamps */ + uint32 H[K_TOF_COLLECT_H_SIZE_20MHZ]; + uint32 chan[4 * K_TOF_COLLECT_CHAN_SIZE]; +} wl_proxd_collect_data_t_v4; +#define WL_PROXD_COLLECT_DATA_VERSION_MAX WL_PROXD_COLLECT_DATA_VERSION_4 typedef struct wl_proxd_debug_data { uint8 count; /**< number of packets */ @@ -13171,10 +13612,51 @@ typedef enum { WL_WSEC_INFO_BSS_KEY_LEN = (WL_WSEC_INFO_BSS_BASE + 5), WL_WSEC_INFO_BSS_ALGOS = (WL_WSEC_INFO_BSS_BASE + 6), WL_WSEC_INFO_BSS_WPA_AP_RESTRICT = (WL_WSEC_INFO_BSS_BASE + 7), + WL_WSEC_INFO_BSS_PMK_PASSPHRASE = (WL_WSEC_INFO_BSS_BASE + 8), + WL_WSEC_INFO_BSS_SAE_PWE = (WL_WSEC_INFO_BSS_BASE + 9), /* add per-BSS properties above */ WL_WSEC_INFO_MAX = 0xffff } wl_wsec_info_type_t; +#define WL_WSEC_PMK_INFO_VERSION 0x0100 /**< version 1.0 */ + +typedef uint16 wl_wsec_info_pmk_info_flags_t; +typedef uint32 wl_wsec_info_pmk_lifetime_t; +typedef uint8 wl_wsec_info_akm_mask_t; +typedef uint16 wl_wsec_info_pmk_info_flags; + +enum { + WL_WSEC_PMK_INFO_SSID_PRESENT = 0x1, + WL_WSEC_PMK_DEFAULT_LIFETIME = 0x2 +}; + +struct bcm_xlo { + uint16 len; + uint16 off; +}; +typedef struct bcm_xlo bcm_xlo_t; + +/* +** all offsets are from the beginning of the structure that starts +** with the version field and length field is the total length of the structure +** including the version and length fields +*/ +typedef struct wl_wsec_info_pmk_info { + uint16 version; /* WL_WSEC_PMK_INFO_VERSION */ + uint16 len; + uint16 next_offset; /* If non zero, specifies offset of next next_offset field */ + wl_wsec_info_pmk_info_flags_t flags; /* Fill in the input based on the flags */ + wl_wsec_info_pmk_lifetime_t pmk_lifetime; + wl_wsec_info_akm_mask_t akm_mask; /* RSN authenticated key management suite */ + uint8 rsvd[3]; /* reserved for future use */ + bcm_xlo_t ssid; /* ssid - key, zero length is allowed for SSID */ + bcm_xlo_t bssid; /* bssid - key, zero length = broadcast/wildcard */ + bcm_xlo_t pass_id; /* key - optional password id for SAE */ + bcm_xlo_t pmk; /* pmk - either 32 or 48 byte for SuiteB-192 */ + bcm_xlo_t passphrase; /* passphrase info */ + /* data follows */ +} wl_wsec_info_pmk_info_t; + typedef struct { uint32 algos; /* set algos to be enabled/disabled */ uint32 mask; /* algos outside mask unaltered */ @@ -13204,6 +13686,10 @@ typedef struct { uint32 wpa_ap_restrict; /* set WPA2 / WPA3 AP restriction policy */ } wl_wsec_info_wpa_ap_restrict_t; +/* SAE PWE derivation method */ +#define SAE_PWE_LOOP 0x1u +#define SAE_PWE_H2E 0x2u + /* * randmac definitions */ @@ -13362,12 +13848,15 @@ typedef struct wl_scanmac_config { } wl_scanmac_config_t; /* scan bitmap */ -#define WL_SCANMAC_SCAN_UNASSOC (0x01 << 0) /**< unassociated scans */ -#define WL_SCANMAC_SCAN_ASSOC_ROAM (0x01 << 1) /**< associated roam scans */ -#define WL_SCANMAC_SCAN_ASSOC_PNO (0x01 << 2) /**< associated PNO scans */ -#define WL_SCANMAC_SCAN_ASSOC_HOST (0x01 << 3) /**< associated host scans */ +#define WL_SCANMAC_SCAN_UNASSOC (0x01 << 0u) /**< unassociated scans */ +#define WL_SCANMAC_SCAN_ASSOC_ROAM (0x01 << 1u) /**< associated roam scans */ +#define WL_SCANMAC_SCAN_ASSOC_PNO (0x01 << 2u) /**< associated PNO scans */ +#define WL_SCANMAC_SCAN_ASSOC_HOST (0x01 << 3u) /**< associated host scans */ +#define WL_SCANMAC_SCAN_RAND_PERPRQ (0x01 << 4u) /* enable per probe rand */ +#define WL_SCANMAC_SCAN_RAND_SCANCH (0x01 << 5u) /* enable scan chan rand */ -#define WL_SCAN_EVENT_VERSION 1 +#define WL_SCAN_EVENT_VER1 1 +#define WL_SCAN_EVENT_VER2 2 #define WL_SCAN_TYPE_ASSOC 0x1 /* Assoc scan */ #define WL_SCAN_TYPE_ROAM 0x2 /* Roam scan */ @@ -13381,7 +13870,30 @@ typedef struct scan_event_data { uint16 num_chan_slice1; /* Will contain num_chan_slice0 followed by num_chan_slice1 chanspecs */ chanspec_t scan_chan_list[]; -} scan_event_data_t; +} scan_event_data_v1_t; + +/** tlv used to return chanspec list of each slice */ +typedef struct scan_chan_tlv { + uint16 type; /* slice index */ + uint16 len; /* data length */ + uint8 data[1]; /* chanspec list */ +} scan_chan_tlv_t; + +typedef struct scan_event_data_v2 { + uint32 version; + uint32 flags; + uint32 num_tlvs; /* no of chanspec list tlvs */ + scan_chan_tlv_t tlvs[1]; +} scan_event_data_v2_t; + +#ifdef WL_SCAN_EVENT_V2 +typedef scan_event_data_v2_t scan_event_data_t; +#define WL_SCAN_EVENT_FIXED_LEN_V2 OFFSETOF(scan_event_data_t, tlvs) +#define WL_SCAN_EVENT_VERSION WL_SCAN_EVENT_VER2 +#else +#define WL_SCAN_EVENT_VERSION WL_SCAN_EVENT_VER1 +typedef scan_event_data_v1_t scan_event_data_t; +#endif // endif /* * bonjour dongle offload definitions @@ -14039,7 +14551,10 @@ typedef enum wl_gpaio_option { GPAIO_PMU_VCOCORELDO, GPAIO_PMU_PLLLDO, GPAIO_PMU_RXLDO, - GPAIO_IQDAC_DC_TP + GPAIO_IQDAC_DC_TP, + GPAIO_BG_ICTAT_CAL, + GPAIO_BG_ICTAT_UNCAL, + GPAIO_BG_CTAT_UNCAL } wl_gpaio_option_t; /** IO Var Operations - the Value of iov_op In wlc_ap_doiovar */ @@ -14114,6 +14629,14 @@ typedef struct { uint16 combo[16]; /* mws ant selection 2nd */ } mws_ant_map_t_2nd; +/* MWS Coex bitmap v2 map for Type0/Type6 */ +typedef struct { + uint16 bitmap_2G; /* 2G Bitmap */ + uint16 bitmap_5G_lo; /* 5G lo bitmap */ + uint16 bitmap_5G_mid; /* 5G mid bitmap */ + uint16 bitmap_5G_hi; /* 5G hi bitmap */ +} mws_coex_bitmap_v2_t; + /* MWS SCAN_REQ Bitmap */ typedef struct mws_scanreq_params { uint16 idx; @@ -14123,6 +14646,22 @@ typedef struct mws_scanreq_params { uint16 bm_5g_hi; } mws_scanreq_params_t; +/* MWS NR Coex Channel map */ +#define WL_MWS_NR_COEXMAP_VERSION 1 +typedef struct wl_mws_nr_coexmap { + uint16 version; /* Structure version */ + uint16 bitmap_5g_lo; /* bitmap for 5G low channels by 2: + *34-48, 52-56, 60-64, 100-102 + */ + uint16 bitmap_5g_mid; /* bitmap for 5G mid channels by 2: + * 104, 108-112, 116-120, 124-128, + * 132-136, 140, 149-151 + */ + uint16 bitmap_5g_high; /* bitmap for 5G high channels by 2 + * 153, 157-161, 165 + */ +} wl_mws_nr_coexmap_t; + typedef struct { uint32 config; /**< MODE: AUTO (-1), Disable (0), Enable (1) */ uint32 status; /**< Current state: Disabled (0), Enabled (1) */ @@ -14252,7 +14791,7 @@ typedef struct wl_scan_version { enum { WL_PROXD_METHOD_NONE = 0, WL_PROXD_METHOD_RSVD1 = 1, /**< backward compatibility - RSSI, not supported */ - WL_PROXD_METHOD_TOF = 2, + WL_PROXD_METHOD_TOF = 2, /**< 11v+BCM proprietary */ WL_PROXD_METHOD_RSVD2 = 3, /**< 11v only - if needed */ WL_PROXD_METHOD_FTM = 4, /**< IEEE rev mc/2014 */ WL_PROXD_METHOD_MAX @@ -15089,7 +15628,17 @@ typedef struct wl_proxd_collect_event_data_v3 { wl_proxd_phy_error_t phy_err_mask; } wl_proxd_collect_event_data_v3_t; -#define WL_PROXD_COLLECT_EVENT_DATA_VERSION_MAX WL_PROXD_COLLECT_EVENT_DATA_VERSION_3 +#define WL_PROXD_COLLECT_EVENT_DATA_VERSION_4 4 +typedef struct wl_proxd_collect_event_data_v4 { + uint16 version; + uint16 length; + uint32 H_LB[K_TOF_COLLECT_H_SIZE_20MHZ]; + uint32 H_RX[K_TOF_COLLECT_H_SIZE_20MHZ]; + uint8 ri_rr[FTM_TPK_RI_RR_LEN_SECURE_2_0_5G]; + wl_proxd_phy_error_t phy_err_mask; +} wl_proxd_collect_event_data_v4_t; + +#define WL_PROXD_COLLECT_EVENT_DATA_VERSION_MAX WL_PROXD_COLLECT_EVENT_DATA_VERSION_4 /** Data returned by the bssload_report iovar. This is also the WLC_E_BSS_LOAD event data */ #include @@ -15125,6 +15674,29 @@ typedef struct wl_bssload_cfg { uint8 PAD[3]; } wl_bssload_cfg_t; +/** User roam cache support */ +#define WL_USER_ROAM_CACHE_VER_1 1u +#define WL_USER_ROAM_CACHE_VER WL_USER_ROAM_CACHE_VER_1 + +#define WL_USER_ROAM_CACHE_GET 0u /**< Read back the chanspec[s] */ +#define WL_USER_ROAM_CACHE_ADD 1u /**< Add chanspec[s] */ +#define WL_USER_ROAM_CACHE_DEL 2u /**< Delete chanspec[s] */ +#define WL_USER_ROAM_CACHE_CLR 3u /**< Delete all chanspec[s] */ +#define WL_USER_ROAM_CACHE_OVERRIDE 4u /**< Set to use roam cached chanspec only */ + +typedef struct wl_user_roamcache { + uint16 version; + uint16 length; /**< Total length including version and length */ + uint32 subcmd; /**< Sub-command for chanspec add/rel etc.. */ + union { + uint32 val; /**< Command value when applicable */ + struct { + uint16 num_ch; /**< Number of chanspecs in the following array */ + chanspec_t chanspecs[]; + } chlist; + } u; +} wl_user_roamcache_t; + /** Multiple roaming profile suport */ #define WL_MAX_ROAM_PROF_BRACKETS 4 @@ -15139,6 +15711,7 @@ typedef struct wl_bssload_cfg { #define WL_ROAM_PROF_LAZY (1 << 0) #define WL_ROAM_PROF_NO_CI (1 << 1) #define WL_ROAM_PROF_SUSPEND (1 << 2) +#define WL_ROAM_PROF_EXTSCAN (1 << 3) #define WL_ROAM_PROF_SYNC_DTIM (1 << 6) #define WL_ROAM_PROF_DEFAULT (1 << 7) /**< backward compatible single default profile */ @@ -15364,8 +15937,10 @@ typedef struct wnm_roam_trigger_cfg { typedef enum wl_interface_type { WL_INTERFACE_TYPE_STA = 0, WL_INTERFACE_TYPE_AP = 1, - //MOG-ON: WLAWDL - //MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + WL_INTERFACE_TYPE_NAN = 3, WL_INTERFACE_TYPE_P2P_GO = 4, WL_INTERFACE_TYPE_P2P_GC = 5, @@ -15638,7 +16213,14 @@ typedef enum tbow_ho_opmode { #define BCNTRIMST_NUM 14 -#define WL_BCNTRIM_STATUS_VERSION_1 1 +#define WL_BCNTRIM_STATUS_VERSION_1 1 +#define WL_BCNTRIM_STATUS_VERSION_2 2 /* current version of + * struct wl_bcntrim_status_v2_t and + * struct wl_bcntrim_status_query_v2_t + * changes in v2: curr_slice_id also include + * beacon offload state + */ + typedef struct wl_bcntrim_status_query_v1 { uint16 version; uint16 len; /* Total length includes fixed fields */ @@ -15646,6 +16228,13 @@ typedef struct wl_bcntrim_status_query_v1 { uint8 pad[3]; /* 4-byte alignment */ } wl_bcntrim_status_query_v1_t; +/* bits for curr_slice_id */ +#define WL_BCNTRIM_CURR_SLICE_ID_MASK 0x0Fu /* bits 0-3 for curr_slice_id */ +#define WL_BCNTRIM_SC_OFFLOAD_ACTIVE_MASK 0x80u /* mask for sc beacon offload */ +#define WL_BCNTRIM_SC_OFFLOAD_ACTIVE_FLAG (1u << 7u) /* MSB of curr_slice_id is used + * to indicate if the offload is + * currently active or not + */ typedef struct wl_bcntrim_status_v1 { uint16 version; uint16 len; /* Total length includes fixed fields and variable data[] */ @@ -15659,6 +16248,10 @@ typedef struct wl_bcntrim_status_v1 { uint32 data[]; /* variable length data containing stats */ } wl_bcntrim_status_v1_t; +/* v1 and v2 struct format for query and status are identical */ +typedef wl_bcntrim_status_v1_t wl_bcntrim_status_v2_t; +typedef wl_bcntrim_status_query_v1_t wl_bcntrim_status_query_v2_t; + #define BCNTRIM_STATS_MAX 10 /* Total stats part of the status data[] */ /* Bits for FW status */ @@ -15668,8 +16261,9 @@ typedef struct wl_bcntrim_status_v1 { */ #define WL_BCNTRIM_DISABLE_QUIET_IE 0x4 /* bcntrim disable when Quiet IE present */ #define WL_BCNTRIM_DISABLE_QBSSLOAD_IE 0x8 /* bcntrim disable when QBSS Load IE present */ -#define WL_BCNTRIM_DISABLE_OPERMODE_IE 0x10 /* bcntrim dsiable when opermode IE is present */ +#define WL_BCNTRIM_DISABLE_OPERMODE_IE 0x10 /* bcntrim disable when opermode IE is present */ #define WL_BCNTRIM_DISABLE_CSA_IE 0x20 /* bcntrim dsiable when CSA IE is present */ +#define WL_BCNTRIM_DISABLE_SC_OFFLOAD 0x40 /* bcntrim disable on SC */ #define BCNTRIM_DISABLE_THRESHOLD_TIME 1000 * 10 /* enable bcntrim after a threshold (10sec) * when disabled due to above mentioned IE's @@ -15687,10 +16281,11 @@ typedef struct wl_bcntrim_cfg_v1 { /* subcommands ids */ enum { WL_BCNTRIM_CFG_SUBCMD_PHY_RATE_THRESH = 0, /* PHY rate threshold above - which bcntrim is not applied + * which bcntrim is not applied */ WL_BCNTRIM_CFG_SUBCMD_OVERRIDE_DISABLE_MASK = 1, /* Override bcntrim disable reasons */ - WL_BCNTRIM_CFG_SUBCMD_TSF_DRIFT_LIMIT = 2 /* TSF drift limit to consider bcntrim */ + WL_BCNTRIM_CFG_SUBCMD_TSF_DRIFT_LIMIT = 2, /* TSF drift limit to consider bcntrim */ + WL_BCNTRIM_CFG_SUBCMD_SC_BCNTRIM = 3 /* config bcntrim on SC */ }; #define BCNTRIM_MAX_PHY_RATE 48 /* in 500Kbps */ @@ -15714,6 +16309,11 @@ typedef struct wl_bcntrim_cfg_tsf_drift_limit { uint8 pad[2]; /* 4-byte alignment */ } wl_bcntrim_cfg_tsf_drift_limit_t; +/* WL_BCNTRIM_CFG_SUBCMD_SC_BCNTRIM */ +typedef struct wl_bcntrim_cfg_sc_bcntrim { + uint32 sc_config; /* 0 disable or 1 enable sc bcntrim */ +} wl_bcntrim_cfg_sc_bcntrim_t; + /* -------------- TX Power Cap --------------- */ #define TXPWRCAP_MAX_NUM_CORES 8 #define TXPWRCAP_MAX_NUM_ANTENNAS (TXPWRCAP_MAX_NUM_CORES * 2) @@ -15955,6 +16555,160 @@ typedef struct wl_txpwrcap_tbl_v3 { int8 pwrs[][TXPWRCAP_MAX_NUM_ANTENNAS_V3]; /* qdBm units */ } wl_txpwrcap_tbl_v3_t; +/* dynamic sar iovar subcommand ids */ +enum { + IOV_DYNSAR_MODE = 1, + IOV_DYNSAR_PWR_OFF = 2, + IOV_DYNSAR_STAT_SUM = 3, + IOV_DYNSAR_STAT_DET = 4, + IOV_DYNSAR_TS = 5, + IOV_DYNSAR_OPT_DUR = 6, + IOV_DYNSAR_OPT_TXDC = 7, + IOV_DYNSAR_STATUS = 8, + IOV_DYNSAR_EVENT = 9, + IOV_DYNSAR_CMD_LAST +}; + +/* when subcommand is IOV_DYNSAR_MODE, the mode can be one of the below */ +enum { + IOV_DYNSAR_MODE_OFF = 0, + IOV_DYNSAR_MODE_PWR = 1 +}; + +#define DYNSAR_CNT_VERSION_V1 1u +#define DYNSAR_CNT_VERSION_V2 2u +#define DYNSAR_STS_OBS_WIN 20u +#define DYNSAR_MAX_ANT 4u /* max antennas per slice */ +#define DYNSAR_MAX_AGG_IDX (DYNSAR_MAX_ANT << 1u) /* max antenna aggregation index */ +#define DYNSAR_MAC_NUM 2u + +/* Error bits */ +#define DYNSAR_NO_TXCAP (1u << 0u) +#define DYNSAR_NO_CLM (1u << 1u) + +typedef struct wlc_dynsar_sts_mon_ctr_st { + uint32 tx_dur; /* in usec */ + uint32 tx_dur_raw; /* in usec */ + uint32 plim_avg; /* In uw. plim averaged over mon win. */ + uint32 energy; /* pavg * dur in mw * ms */ + uint32 qsar; /* plim * dur in mw * ms */ +} wlc_dynsar_sts_mon_ctr_t; + +typedef struct wlc_dynsar_sts_obs_win { + uint8 opt; + uint8 valid; + uint16 pad; + uint32 dur; /* monitor duration in usec */ + uint64 ts; /* timestamp in usec */ +} wlc_dynsar_sts_obs_win_t; + +/* structure holding dynsar per slice counters that interface to iovar */ +typedef struct dynsar_cnt_v1 { + uint16 ver; + uint16 len; /* length of this structure */ + uint8 num_ant; /* num_antennas */ + uint8 win; /* number of valid entries in the observe window */ + uint8 slice; + uint8 pad; /* num_antennas */ + uint64 sync_ts; /* time of first mon period collection after last sync */ + wlc_dynsar_sts_obs_win_t obs[DYNSAR_STS_OBS_WIN]; + wlc_dynsar_sts_mon_ctr_t mon_ctr[DYNSAR_STS_OBS_WIN][DYNSAR_MAX_ANT]; +} dynsar_cnt_v1_t; + +typedef struct dynsar_shared_ant_stats { + uint32 tx_dur; /* tx duration */ + uint8 sar_util; /* sar utilization */ + uint8 pad[3]; /* pad */ +} dynsar_shared_ant_stats_t; + +typedef struct dynsar_unshared_ant_stats { + uint32 qsar; /* mw * ms */ + uint32 energy; /* mw * ms */ + uint32 tx_dur; /* tx duration */ +} dynsar_unshared_ant_stats_t; + +typedef struct dynsar_sum_v1 { + uint16 ver; + uint16 len; /* length of this structure */ + uint32 dur; /* duration in us */ + uint64 ts; /* time stamp of report in us */ + uint64 sync_ts; /* time of first mon period collection after last sync */ + uint8 slice; + uint8 num_ant; + uint8 opt; + uint8 sync; + /* per antenna counters aggregated if shared between radios */ + struct { + uint32 tx_dur; /* tx duration */ + uint8 sar_util; /* sar utilization */ + uint8 PAD[3]; /* pad */ + } shared[DYNSAR_MAX_ANT]; + + /* per antenna counters not aggregated between radios */ + struct { + uint32 qsar; /* mw * ms */ + uint32 energy; /* mw * ms */ + } unshared[DYNSAR_MAX_ANT]; +} dynsar_sum_v1_t; + +typedef struct dynsar_sum_v2 { + uint16 ver; + uint16 len; /* length of this structure */ + uint32 dur; /* duration in us */ + uint64 ts; /* time stamp of report in us */ + uint64 sync_ts; /* time of first mon period collection after last sync */ + uint8 num_ant; /* max number of antennas between 2 slices */ + uint8 opt; + uint8 sync; + uint8 max_mac; /* number of slices */ + uint8 num_agg; /* number of aggregated antennas */ + uint8 offset_shared; /* offset from beginning of structure to shared antenna data */ + uint8 offset_unshared; /* offset from beginning of structure to unshared antenna data */ + uint8 pad; + /* Variable length data sections follow as per above offsets: + * dynsar_unshared_ant_stats_t [max_mac][num_ant] + * dynsar_shared_ant_stats_t [num_agg] + */ +} dynsar_sum_v2_t; + +typedef struct dynsar_status { + uint16 ver; + uint16 len; /* length of this structure */ + uint8 slice; /* slice number */ + uint8 mode; /* optimization mode */ + uint8 util_thrhd; /* utilization threshold */ + uint8 opt_txdc; /* txdc prediction percentage */ + uint8 opt_dur; /* optimization prediction duration */ + uint8 event; /* if wl event is configured */ + uint8 time_sync; /* if gpio pulse is configured */ + uint8 power_off; /* power offset in db */ + uint8 num_ant; /* num antenna */ + uint8 status; /* status bitmap. e.g. WL_DYNSAR_STS_PWR_OPT. + * These are same as status field in wl_event + */ + uint8 error; /* error bits */ + uint8 gpio_pin; /* gpio pin */ + /* aggregation index array of num_ant entries */ + uint8 agg[]; /* aggregation indices */ +} dynsar_status_t; + +typedef struct wl_dynsar_ioc { + uint16 id; /* ID of the sub-command */ + uint16 len; /* total length of all data[] */ + union { /* var len payload */ + uint8 cnt; + dynsar_cnt_v1_t det; + dynsar_sum_v1_t sum; + dynsar_sum_v2_t sumv2; + dynsar_status_t status; + } data; +} wl_dynsar_ioc_t; + +typedef struct wlc_dynsar_status { + uint16 ver; + uint16 len; /* length of this structure */ +} wl_dynsar_status_t; + /* ##### Ecounters section ##### */ #define ECOUNTERS_VERSION_1 1 @@ -16369,6 +17123,66 @@ typedef struct { int16 deauth_rssi; /* deauth pkt rssi */ } wl_event_based_statistics_v4_t; +/* ##### SC/ Sc offload/ WBUS related ecounters */ + +#define WL_SC_PERIODIC_COMPACT_CNTRS_VER_1 (1) +typedef struct { + uint16 version; + uint16 pad; + uint32 rxstrt; /**< number of received frames with a good PLCP */ + uint32 rxbadplcp; /**< number of parity check of the PLCP header failed */ + uint32 rxcrsglitch; /**< PHY was able to correlate the preamble but not the header */ + uint32 rxnodelim; /**< number of no valid delimiter detected by ampdu parser */ + uint32 bphy_badplcp; /**< number of bad PLCP reception on BPHY rate */ + uint32 bphy_rxcrsglitch; /**< PHY count of bphy glitches */ + uint32 rxbadfcs; /**< number of frames for which the CRC check failed in the MAC */ + uint16 rxrtsucast; /**< number of unicast RTS addressed to the MAC (good FCS) */ + uint16 rxf0ovfl; /**< number of receive fifo 0 overflows */ + uint16 rxf1ovfl; /**< number of receive fifo 0 overflows */ + uint16 rxhlovfl; /**< number of length / header fifo overflows */ + uint16 rxbeaconmbss; /**< beacons received from member of BSS */ + uint16 rxdtucastmbss; /**< number of received DATA frames with good FCS and matching RA */ + uint16 rxbeaconobss; /**< beacons received from other BSS */ + uint16 rxdtmcast; /**< number of RX Data multicast frames received by the MAC */ + uint16 rxtoolate; /**< receive too late */ + uint16 chswitch_cnt; /* Number of channel switches */ + uint32 pm_dur; /* Total sleep time in PM, msecs */ + uint16 hibernate_cnt; /* Number of times sc went to hibernate */ + uint16 awake_cnt; /* Number of times sc awake is called */ + uint16 sc_up_cnt; /* Number of times sc up/down happened */ + uint16 sc_down_cnt; /* Number of times sc down happened */ +} wl_sc_periodic_compact_cntrs_v1_t; + +#define WL_WBUS_PERIODIC_CNTRS_VER_1 (1) +typedef struct { + uint16 version; + uint16 pad; + uint16 num_register; /* Number of registrations */ + uint16 num_deregister; /* Number of deregistrations */ + uint8 num_pending; /* Number of pending non-bt */ + uint8 num_active; /* Number of active non-bt */ + uint8 num_bt; /* Number of bt users */ + uint8 pad1; + uint16 num_rej; /* Number of reject */ + uint16 num_rej_bt; /* Number of rejects for bt */ + uint16 num_accept_attempt; /* Numbber of accept attempt */ + uint16 num_accept_ok; /* Number of accept ok */ +} wl_wbus_periodic_cntrs_v1_t; + +#define WL_STA_OFLD_CNTRS_VER_1 (1) +typedef struct { + uint16 version; + uint16 pad; + + uint16 sc_ofld_enter_cnt; + uint16 sc_ofld_exit_cnt; + uint16 sc_ofld_wbus_reject_cnt; + uint16 sc_ofld_wbus_cb_fail_cnt; + uint16 sc_ofld_missed_bcn_cnt; + uint8 sc_ofld_last_exit_reason; + uint8 sc_ofld_last_enter_fail_reason; +} wl_sta_ofld_cntrs_v1_t; + /* ##### Ecounters v2 section ##### */ #define ECOUNTERS_VERSION_2 2 @@ -16397,8 +17211,9 @@ typedef struct ecounters_config_request_v2 { #define ECOUNTERS_STATS_TYPES_DEFAULT 0x8 /* Slice mask bits */ -#define ECOUNTERS_STATS_TYPES_SLICE_MASK_SLICE0 0x1 -#define ECOUNTERS_STATS_TYPES_SLICE_MASK_SLICE1 0x2 +#define ECOUNTERS_STATS_TYPES_SLICE_MASK_SLICE0 0x1u +#define ECOUNTERS_STATS_TYPES_SLICE_MASK_SLICE1 0x2u +#define ECOUNTERS_STATS_TYPES_SLICE_MASK_SLICE_SC 0x4u typedef struct ecounters_stats_types_report_req { /* flags: bit0 = slice, bit1 = iface, bit2 = global, @@ -16999,8 +17814,10 @@ typedef enum { CHANSW_IOVAR = 7, /* channel switch due to IOVAR */ CHANSW_CSA_DFS = 8, /* channel switch due to chan switch announcement from AP */ CHANSW_APCS = 9, /* Channel switch from AP channel select module */ -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + CHANSW_FBT = 11, /* Channel switch from FBT module for action frame response */ CHANSW_UPDBW = 12, /* channel switch at update bandwidth */ CHANSW_ULB = 13, /* channel switch at ULB */ @@ -17300,6 +18117,7 @@ typedef struct wl_nap_status_v1 { #define NAP_DISABLED_ASSOC 0x0008 /* Disabled because of association */ #define NAP_DISABLED_LTE 0x0010 /* Disabled because of LTE */ #define NAP_DISABLED_ACI 0x0020 /* Disabled because of ACI mitigation */ +#define NAP_DISABLED_SEQ_RANGE 0x0040 /* Disabled during SEQ Ranging */ /* Bits for hw_status */ #define NAP_HWCFG 0x01 /* State of NAP config bit in phy HW */ @@ -17651,8 +18469,10 @@ typedef enum wl_hc_dd_type { WL_HC_DD_REINIT = 6, /* Reinit due to other reasons */ WL_HC_DD_TXQ_STALL = 7, /* TXQ stall */ WL_HC_DD_RX_STALL_V2 = 8, /* RX stall check v2 */ + // MOG-ON: WLAWDL // MOG-OFF: WLAWDL + WL_HC_DD_SBSS =10, /* Slotted bss health check */ WL_HC_DD_NAN =11, /* NAN health check */ WL_HC_DD_MAX @@ -18449,8 +19269,10 @@ typedef struct wlc_leaked_infra_guard_marker { #define WL_LEAKED_GUARD_TIME_NONE 0 /* Not in any guard time */ #define WL_LEAKED_GUARD_TIME_FRTS (0x01 << 0) /* Normal FRTS power save */ #define WL_LEAKED_GUARD_TIME_SCAN (0x01 << 1) /* Channel switch due to scanning */ -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WL_LEAKED_GUARD_TIME_INFRA_STA (0x01 << 4) /* generic type infra sta channel switch */ #define WL_LEAKED_GUARD_TIME_TERMINATED (0x01 << 7) /* indicate a GT is terminated early */ @@ -18529,11 +19351,13 @@ typedef struct wlc_btcx_profile_v1 { wlc_btcx_chain_attr_t chain_attr[]; /* variable length array with chain attributes */ } wlc_btcx_profile_v1_t; -#define SSSR_D11_RESET_SEQ_STEPS 5 +#define SSSR_D11_RESET_SEQ_STEPS 5u +#define SSSR_HWA_RESET_SEQ_STEPS 8u #define SSSR_REG_INFO_VER_0 0u #define SSSR_REG_INFO_VER_1 1u #define SSSR_REG_INFO_VER_2 2u +#define SSSR_REG_INFO_VER_3 3u typedef struct sssr_reg_info_v0 { uint16 version; @@ -18731,6 +19555,82 @@ typedef struct sssr_reg_info_v2 { } dig_mem_info; } sssr_reg_info_v2_t; +typedef struct sssr_reg_info_v3 { + uint16 version; + uint16 length; /* length of the structure validated at host */ + struct { + struct { + uint32 pmuintmask0; + uint32 pmuintmask1; + uint32 resreqtimer; + uint32 macresreqtimer; + uint32 macresreqtimer1; + uint32 macresreqtimer2; + } base_regs; + } pmu_regs; + struct { + struct { + uint32 intmask; + uint32 powerctrl; + uint32 clockcontrolstatus; + uint32 powerctrl_mask; + } base_regs; + } chipcommon_regs; + struct { + struct { + uint32 clockcontrolstatus; + uint32 clockcontrolstatus_val; + } base_regs; + struct { + uint32 resetctrl; + uint32 extrsrcreq; + } wrapper_regs; + } arm_regs; + struct { + struct { + uint32 ltrstate; + uint32 clockcontrolstatus; + uint32 clockcontrolstatus_val; + } base_regs; + struct { + uint32 extrsrcreq; + } wrapper_regs; + } pcie_regs; + struct { + struct { + uint32 xmtaddress; + uint32 xmtdata; + uint32 clockcontrolstatus; + uint32 clockcontrolstatus_val; + } base_regs; + struct { + uint32 resetctrl; + uint32 extrsrcreq; + uint32 ioctrl; + uint32 ioctrl_resetseq_val[SSSR_D11_RESET_SEQ_STEPS]; + } wrapper_regs; + uint32 sr_size; + } mac_regs[MAX_NUM_D11_CORES_WITH_SCAN]; + struct { + uint32 dig_sr_addr; + uint32 dig_sr_size; + } dig_mem_info; + uint32 fis_enab; + struct { + struct { + uint32 clkenable; + uint32 clkgatingenable; + uint32 clkext; + uint32 clkctlstatus; + } base_regs; + struct { + uint32 ioctrl; + uint32 resetctrl; + } wrapper_regs; + uint32 hwa_resetseq_val[SSSR_HWA_RESET_SEQ_STEPS]; + } hwa_regs; +} sssr_reg_info_v3_t; + #ifndef SSSR_REG_INFO_HAS_ALIAS typedef sssr_reg_info_v0_t sssr_reg_info_t; #define SSSR_REG_INFO_VER SSSR_REG_INFO_VER_0 @@ -18741,6 +19641,7 @@ typedef union sssr_reg_info { sssr_reg_info_v0_t rev0; sssr_reg_info_v1_t rev1; sssr_reg_info_v2_t rev2; + sssr_reg_info_v3_t rev3; } sssr_reg_info_cmn_t; /* ADaptive Power Save(ADPS) structure definition */ @@ -19013,6 +19914,9 @@ enum wl_ifstats_xtlv_id { /* HE TX related stats */ WL_IFSTATS_XTLV_HE_TXMU_STATS = 0x108, + WL_IFSTATS_XTLV_SC_PERIODIC_STATE = 0x109, + WL_IFSTATS_XTLV_WBUS_PERIODIC_STATE = 0x10A, + /* Per-slice information * Per-interface reporting could also include slice specific data */ @@ -19051,6 +19955,11 @@ enum wl_ifstats_xtlv_id { WL_IFSTATS_XTLV_WL_SLICE_TXBF = 0x313, /* Per-slice BTCOEX task duration stats */ WL_IFSTATS_XTLV_WL_SLICE_BTCOEX_TSKDUR_STATS = 0x314, + /* Per-slice RC1 COEX (NR5G Coex) stats */ + WL_IFSTATS_XTLV_WL_SLICE_NR5GCX = 0x315, + /* Per-slice sta offload stats */ + WL_IFSTATS_XTLV_WL_SLICE_STA_OFLD_STATS = 0x316, + /* Per-interface */ /* XTLV container for reporting */ WL_IFSTATS_XTLV_IF = 0x501, @@ -19063,8 +19972,10 @@ enum wl_ifstats_xtlv_id { /* AMPDU stats on per-IF */ WL_IFSTATS_XTLV_AMPDU_DUMP = 0x505, WL_IFSTATS_XTLV_IF_SPECIFIC = 0x506, - //MOG-ON: WLAWDL - //MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + WL_IFSTATS_XTLV_IF_LQM = 0x508, /* Interface specific state capture in periodic fashion */ WL_IFSTATS_XTLV_IF_PERIODIC_STATE = 0x509, @@ -19307,6 +20218,7 @@ typedef enum { WL_TVPM_REQ_ENABLE, /* req_value: uint32, range 0...1 */ WL_TVPM_REQ_STATUS, /* req_value: none */ WL_TVPM_REQ_PERIOD, /* req_value: int32, range {-1,1-10} */ + WL_TVPM_REQ_TXDC, /* req_value: uint32, range 1...100 */ WL_TVPM_REQ_MAX } wl_tvpm_req_type_t; @@ -19510,6 +20422,19 @@ typedef struct wl_nan_disc_frame_status_v1_s { uint8 pad; uint16 token; /* seq num to keep track of pkts sent by host */ } wl_nan_disc_frame_status_v1_t; + +typedef struct wl_nan_oob_af { + uint64 bitmap; /* 16 TU slots in 1024 TU window */ + struct ether_addr sa; /* Optional SA. Default set to NMI */ + struct ether_addr da; + struct ether_addr bssid; + bool secured; /* Optional. Default set to 0 (Open) */ + uint8 pad; /* Structure padding. Can be used in future */ + uint16 token; /* host generated. Used by FW in TX status event */ + uint16 payload_len; + uint8 payload[]; /* AF hdr + NAN attrbutes in TLV format */ +} wl_nan_oob_af_t; + /* * BT log definitions */ @@ -19651,7 +20576,8 @@ enum wl_rmc_report_cmd_id { enum wl_rmc_report_xtlv_id { WL_RMC_RPT_XTLV_VER = 0x0, WL_RMC_RPT_XTLV_BSS_INFO = 0x1, - WL_RMC_RPT_XTLV_CANDIDATE_INFO = 0x2 + WL_RMC_RPT_XTLV_CANDIDATE_INFO = 0x2, + WL_RMC_RPT_XTLV_USER_CACHE_INFO = 0x3 }; /* WL_RMC_RPT_XTLV_BSS_INFO */ @@ -20128,18 +21054,65 @@ enum wl_wbus_cmd { #define WBUS_BT_SCHED_TEST_PARAMS_VER_1 1 typedef struct wbus_bt_sched_test_params_v1 { - uint16 version; - uint16 pad; - uint32 flags; - uint32 action; - uint32 duration; - uint32 interval; + uint16 version; + uint8 min_duty_cycle; + uint8 type; + uint32 flags; + uint32 action; + uint32 duration; + uint32 interval; } wbus_bt_sched_test_params_v1_t; +enum wl_wbus_bt_test_type { + WBUS_TEST_BT_USER_TYPE_LE_SCAN = 0u, + WBUS_TEST_BT_USER_TYPE_PAGE_SCAN = 1u, + WBUS_TEST_BT_USER_TYPE_MAX = 2u +}; + #define WBUS_BT_SCHED_ADD 0u #define WBUS_BT_SCHED_REMOVE 1u #define WBUS_BT_SCHED_INVALID 0xFFu +enum wlc_btcec_iocv_subcmds { + WL_BTCEC_SUBCMD_TEST = 0, + WL_BTCEC_SUBCMD_STATS = 1, + WL_BTCEC_SUBCMD_LAST +}; + +#define WLC_BTCEC_STATS_V1 1u + +typedef struct wlc_btcec_stats_v1 { + uint16 ver; + uint16 len; + uint32 pmdur; /* duration in millisec granted for bt corr to which wlsc slept */ +} wlc_btcec_stats_v1_t; + +#define WBUS_OFFLOAD_STATS_V1 1u +#define WBUS_OFFLOAD_USER_STATS_V1 1u + +typedef struct wbus_offload_user_stats_v1 { + uint16 version; /* version of this structure */ + uint16 len; /* size of this structure */ + uint8 type; /* Offload type */ + uint8 pad[3]; + uint32 num_accepted; /* num of times user got accepted */ + uint32 num_rejected; /* num of times user got rejected */ + uint32 num_failed; /* num of times user accept failed */ +} wbus_offload_user_stats_v1_t; + +typedef struct wbus_offload_stats_v1 { + uint16 version; /* version of this structure */ + uint16 len; /* size of this structure */ + uint32 num_accept_ok; /* num accept pass */ + uint32 num_accept_fail; /* num accept fail */ + uint32 num_rejected; /* num of rejected users so far */ + uint32 num_rejected_bt; /* num of rejected users so far for BT */ + uint32 num_rejected_all; /* num times all offloads are rejected */ + uint8 pad[3]; + uint8 num_user; /* num of users stats */ + wbus_offload_user_stats_v1_t user_stats[]; /* per user stats */ +} wbus_offload_stats_v1_t; + #define KEY_UPDATE_INFO_VER_V1 1 typedef struct key_update_info_v1 { @@ -20368,8 +21341,10 @@ typedef struct wl_omi_req { /* Bits for ULMU disable reason */ #define OMI_ULMU_DISABLED_HOST 0x01u /* Host has disabled through he omi */ -//MOG-ON: WLAWDL -//MOG-OFF: WLAWDL + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define OMI_ULMU_DISABLED_NAN 0x04u /* Disabled due to NAN enabled */ #define OMI_ULMU_DISABLED_BTCOEX 0x08u /* Disabled while in BT Coex activity */ #define OMI_ULMU_DISABLED_LTECOEX 0x10u /* Disabled due to LTE Coex activity */ @@ -20621,6 +21596,15 @@ typedef struct wlc_rcroam_info_v1 { #define RCROAM_HDRLEN 4u #define MAX_RCSCAN_TIMER 300u +/* Reasons for re-setting RC ROAM params */ +#define WLC_RCROAM_RESET_JOIN 0 /* New join */ +#define WLC_RCROAM_REASON_ROAM_SUCCESS 1 /* Successful roam */ +#define WLC_RCROAM_RESET_RSSI_CHANGE 2 /* RSSI of the link which was bad regained/worsened */ +#define WLC_RCROAM_RESET_BCN_LOSS 3 /* Beacon loss */ +#define WLC_RCROAM_RESET_DISASSOC_RX 4 /* Disassoc was received */ +#define WLC_RCROAM_RESET_DEAUTH_RX 5 /* Deauth was received */ +#define WLC_RCROAM_RESET_IOVAR 6 /* Iovar to disable rcroam was received from host */ + #define WLC_SILENT_ROAM_VER_1 1 /* silent roam information struct */ typedef struct wlc_sroam_info_v1 { @@ -20763,16 +21747,44 @@ typedef struct hp2p_counters_hdr { uint8 counters[]; } hp2p_counters_hdr_t; +/* HP2P RLLW Stats */ +#define WL_HP2P_RLLW_STATS_VER 1u +typedef struct hp2p_rllw_stats_hdr { + uint16 version; /* version of hptp_rllw_stats structure */ + uint16 len; /* length of the payload */ + uint8 slice_idx; /* Slice idx BAND_2G_INDEX - 0 / BAND_5G_INDEX - 1 */ + uint8 pad[3]; + uint8 stats[]; /* rllw_stats instance */ +} hp2p_rllw_stats_hdr_t; + +/* + * rllw stats common & per band + * + */ +typedef struct hp2p_rllw_stats_v1 { + /* Slice Specific Stats */ + uint16 n_hnav_intrs; /* # of high nav interrupts */ + uint16 n_switches; /* # of Switches to band n */ + /* Stats on wlc_trig */ + uint16 n_override_pkts; /* # of pkts enqd with ovrd bit set */ + uint16 n_overrides; /* # of overrides - this is only trig_wlc */ + uint16 n_override_pkts_acked; /* # of ovrd pkts that got an ACK */ + uint16 n_override_pkts_not_acked; /* # of ovrd pkts that werent ACKed */ +} hp2p_rllw_stats_v1_t; + /* TX enable flags */ #define WL_HP2P_TX_AMPDU 0x0001u #define WL_HP2P_TX_AMSDU 0x0002u #define WL_HP2P_TX_RDG 0x0004u +#define WL_HP2P_TX_TXOP 0x0008u +#define WL_HP2P_TX_TXOP_RTS 0x0010u /* RX enable flags */ #define WL_HP2P_RX_AMPDU 0x0001u #define WL_HP2P_RX_AMSDU 0x0002u #define WL_HP2P_RX_RDG 0x0004u #define WL_HP2P_RX_AMPDU_REORDER 0x0008u +#define WL_HP2P_RX_DELETE 0x0010u /* Max/min values for configuration parameters to check validity */ #define WL_HP2P_MAX_RETRY_MAX 14u @@ -20784,7 +21796,8 @@ typedef struct hp2p_counters_hdr { #define WL_HP2P_MAX_UCODE_RECOV_TO 500u #define WL_HP2P_MAX_UCODE_NAV_THR 50000u -#define WLC_HP2P_MIN_NAV_THRESH 0u +#define WLC_HP2P_DEF_NAV_THRESH 13u +#define WLC_HP2P_MIN_NAV_THRESH 1u #define WLC_HP2P_MAX_NAV_THRESH 35u #define WL_HP2P_VERSION 1u @@ -20792,7 +21805,7 @@ typedef struct hp2p_tx_config { struct ether_addr peer_addr; uint16 max_burst; uint16 txop; /* stored in network order (ls octet first) */ - uint16 flags; /* flags to enable/disable AMPDU, AMSDU, RDG */ + uint16 flags; /* flags to enable/disable AMPDU, AMSDU, RDG, TXOP, TXOP_RTS */ uint8 aci; uint8 ecw; uint8 fifo; @@ -20817,17 +21830,102 @@ typedef struct hp2p_udbg_config { uint16 nav_thresh; /* in usec */ } hp2p_udbg_config_t; +#define WLC_HP2P_RLLW_RETRY_LIMIT 7u +#define WLC_HP2P_MAX_PKTLIFETIME_IN_MS 2000u /* 2 seconds */ + +/* + * nav_thresh: 13 : By default set to 13ms + * retry_limit: 0 : Auto / Default retry limit to be applied + * Max retry limit is 7 + * pkt_lifetime: 0 : Auto / Default pkt lifetime to be applied + * Max value cant exceed 2000u (2seconds) + * floor_rate: 0 : Auto / Default min rate to be applied + * ceiling_rate: 0 : Auto / Default max rate to be applied + */ typedef struct hp2p_rllw_cfg { - uint8 nav_thresh; /* NAV threshold in ms */ - uint8 pad[3]; + uint8 nav_thresh; /* NAV threshold in ms */ + uint8 retry_limit; /* # max retries before pkt is discarded */ + uint16 pkt_lifetime; /* Pkt lifetime in ms */ + uint16 floor_rate; /* Min rate in Mbps */ + uint16 ceiling_rate; /* Max rate in Mbps */ } hp2p_rllw_cfg_t; +#define WL_HP2P_CAP_MPEER 0x01u /* Multipeer Hp2p */ +#define WL_HP2P_CAP_MPEER_TXOP 0x02u /* Same txop transmit on mpeer Hp2p */ +#define WL_HP2P_CAP_RLLW 0x04u /* Band switching and override on NAV */ +#define WL_HP2P_CAP_SPLIT_TXS 0x08u /* Spilt tx status for rllw sub feature */ + +typedef uint32 hp2p_cap_t; /* HP2P capabilities */ + typedef struct hp2p_cmd { uint16 type; uint16 len; uint8 data[]; } hp2p_cmd_t; +#define WL_HP2P_CTRL_MPEER_TXOP_ENAB 0x01u /* Same txop transmit on mpeer Hp2p */ +/* + * Band switching on NAV. Control for band + * switching for HPP traffic, applies only + * for dual local/peer map availability. + */ +#define WL_HP2P_CTRL_RLLW_SWITCH_ENAB 0x02u /* RLLW Band switching enabled */ +#define WL_HP2P_CTRL_RLLW_PRIMARY_OVR 0x04u /* RLLW Override enab on primary band. */ +#define WL_HP2P_CTRL_RLLW_DENY_BT 0x08u /* RLLW Give WiFi priority over BT */ +#define WL_HP2P_CTRL_RLLW_PKTLT_ENAB 0x10u /* RLLW pkt lifetime based decision enabled */ + +typedef uint32 hp2p_ctrl_t; /* HP2P Ctrl bits */ + +/* TLVs for HP2P related IOVARs */ +typedef enum wl_hp2p_tlv { + HP2P_TLV_RLLW_SLICE_STATS = 1u, + HP2P_TLV_RLLW_PEER_STATS = 2u +} wl_hp2p_tlv_t; + +/* Top level HP2P RLLW stats header */ +typedef struct wl_hp2p_stats_hdr { + uint32 n_stats; /* # of TLVs in the payload */ + uint32 totlen; /* total length of TLVs following this field */ + uint8 stats_tlvs[]; /* chain of TLVs for reader to decode based on length */ +} wl_hp2p_stats_hdr; + +/* Per Slice RLLW Stats */ +typedef struct wlc_hp2p_rllw_slice_stats { + uint8 slice; /* slice number */ + uint8 pad; + uint16 n_hnav_intrs; /* # of high nav interrupts on slice n */ + uint16 n_overrides; /* # of overrides */ + uint16 n_switches; /* # of switches */ + uint32 n_switched_pkts; /* # of packets after switching to slice n */ + uint32 n_switched_pkts_not_acked; /* # of packets after switch & Not ACKed */ + uint32 n_override_pkts; /* # of pkts enqd with ovrd bit set on slice n */ + uint32 n_override_pkts_not_acked; /* # of ovrd pkts that werent ACKed on slice n */ + uint32 n_no_switch_in_pktlife; /* # of no switch happened,pkts within lifetime */ + uint32 n_no_override_in_pktlife; /* # of no ovrd happened,pkts within lifetime */ +} wlc_hp2p_rllw_slice_stats_t; + +/* Peer specific stats */ + +typedef struct { + uint8 slice; /* slice number */ + uint8 pad[3]; + uint16 n_overrides; /* # of overrides */ + uint16 n_switches; /* # of switches */ + uint32 n_switched_pkts; /* # of packets after switching to slice n */ + uint32 n_switched_pkts_not_acked; /* # of packets after switch & Not ACKed */ + uint32 n_override_pkts; /* # of pkts enqd with ovrd bit set on slice n */ + uint32 n_override_pkts_not_acked; /* # of ovrd pkts that werent ACKed on slice n */ + uint32 n_no_switch_in_pktlife; /* # of no switch happened,pkts within lifetime */ + uint32 n_no_override_in_pktlife; /* # of no ovrd happened,pkts within lifetime */ +} wlc_hp2p_rllw_peer_stats_t; + +/* Peer Stats Info to host */ +typedef struct wlc_hp2p_peer_stats_info { + struct ether_addr peer_mac; /* Mac Address of the HP2P peer */ + uint16 nslices; /* Number of slices */ + wlc_hp2p_rllw_peer_stats_t peer_stats[MAX_NUM_D11CORES]; /* Peer specific stats */ +} wlc_hp2p_peer_stats_info_t; + typedef struct hp2p_cmd_hdr { uint16 version; uint16 slice_idx; @@ -20836,18 +21934,98 @@ typedef struct hp2p_cmd_hdr { /* to be used in type field of hp2p_cmd_t structure while issuing HP2P commands */ typedef enum hp2p_cmd_id { - WL_HP2P_CMD_ENABLE = 0, - WL_HP2P_CMD_TX_CONFIG = 1, - WL_HP2P_CMD_RX_CONFIG = 2, - WL_HP2P_CMD_COUNTERS = 3, - WL_HP2P_CMD_UDBG_CONFIG = 4, - WL_HP2P_CMD_RLLW_CFG = 5 + WL_HP2P_CMD_ENABLE = 0, /* Enable HP2P */ + WL_HP2P_CMD_TX_CONFIG = 1, /* Tx Configuration */ + WL_HP2P_CMD_RX_CONFIG = 2, /* Rx Configuration */ + WL_HP2P_CMD_COUNTERS = 3, /* HP2P Counters */ + WL_HP2P_CMD_UDBG_CONFIG = 4, /* ucode debug config */ + WL_HP2P_CMD_RLLW_CFG = 5, /* HP2P RLLW config */ + WL_HP2P_CMD_RLLW_STATS = 6, /* HP2P RLLW Stats */ + WL_HP2P_CMD_CAP = 7, /* HP2P Capability */ + WL_HP2P_CMD_CTRL = 8 /* HP2P feature ctrl */ } hp2p_cmd_id_t; +/** + * TX Profile. + * + * TX Profile allows the host to configure frames with a specific profile. This + * includes but is not limited to transmit rate, number of retries, whether or + * not to use frame aggregation, whether or not to use AMSDU and RTS protection + * threshold. The original intent is for the host to be able to specify transmit + * "reliability". + */ + +/* IOVAR */ +typedef struct wlc_tx_profile_ioc { + uint16 id; + uint16 length; + union { + uint32 options; + uint32 status; + } u; + uint8 data[]; +} wlc_tx_profile_ioc_t; + +#define TX_PROFILE_IOV_HDR_SIZE (OFFSETOF(wlc_tx_profile_ioc_t, u)) +#define TX_PROFILE_IOV_OPTION_SIZE (sizeof(wlc_tx_profile_ioc_t) - TX_PROFILE_IOV_HDR_SIZE) + +/* TX Profile parameter TLV */ +enum tx_profile_param_id { + WL_TX_PROFILE_PARAM_RATE = 0, + WL_TX_PROFILE_PARAM_RTS = 1, + WL_TX_PROFILE_PARAM_RETRY = 2, + WL_TX_PROFILE_PARAM_BW = 3, + WL_TX_PROFILE_PARAM_AGGRE = 4, + WL_TX_PROFILE_PARAM_AMSDU = 5, + WL_TX_PROFILE_PARAM_AMPDU = 6, + WL_TX_PROFILE_PARAM_LAST = 7 +}; + +typedef enum tx_profile_param_id tx_profile_param_id_t; + +typedef struct tx_profile_param { + uint16 param_id; + uint16 length; + uint8 param[]; +} tx_profile_param_t; + +/* Subcommands */ +typedef enum tx_profile_cmd_id { + /* The IOVAR to enable/disable the TX Profile in general. An integer + * is passed to the firmware with value 0 or 1. + */ + WL_TX_PROFILE_ENABLE = 0, + /* Create a TX Profile with provided parameters. */ + WL_TX_PROFILE_CREATE = 1, + /* Update a TX profile with provided parameters. */ + WL_TX_PROFILE_UPDATE = 2, + /* Delete a TX Profile. */ + WL_TX_PROFILE_DELETE = 3, + /* Dump TX Profile related debug information. */ + WL_TX_PROFILE_DUMP = 4, + /* Show TX Profile stats */ + WL_TX_PROFILE_STATS = 5 +} tx_profile_cmd_id_t; + +typedef struct tx_profile_index_params { + uint16 profile_index; + uint16 length; + uint8 params[]; +} tx_profile_index_params_t; + +typedef struct tx_profile_index_stats { + uint32 profile_index; + uint32 tx_finish_cnt; + uint32 tx_acked_cnt; + uint32 tx_phy_err_cnt; + uint32 tx_suspend_cnt; +} tx_profile_index_stats_t; +/* End TX Profile section */ + typedef enum wl_rffe_cmd_type { - WL_RFFE_CMD_DEBUG_MODE = 0, - WL_RFFE_CMD_ELNABYP_MODE = 1, - WL_RFFE_CMD_REG = 2, + WL_RFFE_CMD_DEBUG_MODE = 0, + WL_RFFE_CMD_ELNABYP_MODE = 1, + WL_RFFE_CMD_REG = 2, WL_RFFE_CMD_LAST } wl_rffe_cmd_type_t; @@ -21043,4 +22221,298 @@ typedef struct wlc_obss_hw_test_v1 { uint8 test_mode; /* To stop/start respective test mode */ uint8 mitigation_mode; /* mitigation enabling/disabling options */ } wlc_obss_hw_test_v1_t; + +#define STA_PM_SC_OFLD_CFG_VER_V1 1u +#define STA_PM_SC_OFLD_ENAB_FLAG (1u << 0u) + +#define STA_PM_SC_FLAG_MASK (1u << 0u) +#define STA_PM_SC_CONS_EXP_BCN_RX_THR_MASK (1u << 1u) +#define STA_PM_SC_MISSED_BCN_THR_MASK (1u << 2u) +#define STA_PM_SC_OFLD_RSSI_THR_MASK (1u << 3u) +#define STA_PM_SC_OFLD_RSSI_HYST_MASK (1u << 4u) +#define STA_PM_SC_OFLD_FIELD_MASK_ALL (STA_PM_SC_FLAG_MASK | \ + STA_PM_SC_CONS_EXP_BCN_RX_THR_MASK | \ + STA_PM_SC_MISSED_BCN_THR_MASK | \ + STA_PM_SC_OFLD_RSSI_THR_MASK | \ + STA_PM_SC_OFLD_RSSI_HYST_MASK) + +#define STA_PM_SC_OFLD_RSSI_HYST_MAX 80u + +typedef struct wlc_sta_pm_sc_ofld_cfg_v1 { + uint16 version; + uint16 len; + uint16 field_mask; /* Provides info on which of the following fields are valid */ + uint16 flags; /* enable 0x1 */ + uint8 cons_exp_bcn_rx_thr; /* Consecutive expected bcn in true slice to offload to SC */ + uint8 sc_missed_bcn_thr; /* Missed beacons threshold in SC to exit offload */ + int8 sc_offload_rssi_thr; /* Bcn RSSI threshold to exit offload, must be negative */ + uint8 sc_offload_rssi_hyst; /* Hysteresis for the RSSI threshold, 0 - RSSI_HYST_MAX */ +} wlc_sta_pm_sc_ofld_cfg_v1_t; + +typedef enum wlc_sta_pm_sc_ofld_fail_reason { + STA_PM_SC_OFLD_FAIL_RSSI = (1u << 0u), /* Low rssi */ + STA_PM_SC_OFLD_FAIL_UNSUPPORTED = (1u << 1u), /* Unsupported by WBUS */ + STA_PM_SC_OFLD_FAIL_MISSED_BCN = (1u << 2u), /* missed bcns on true slice */ + STA_PM_SC_OFLD_FAIL_NO_PS = (1u << 3u), /* not in PM */ + STA_PM_SC_OFLD_FAIL_TX_ACTIVE = (1u << 4u), /* Active TX in true slice */ + STA_PM_SC_OFLD_FAIL_CSA = (1u << 5u), /* CSA */ + STA_PM_SC_OFLD_FAIL_MRC = (1u << 6u), /* in MRC */ + STA_PM_SC_OFLD_FAIL_AS_STATE = (1u << 7u), /* Assoc state not IDLE */ + STA_PM_SC_OFLD_FAIL_NO_BASIC_RATESET = (1u << 8u), /* AP doesn't sup basic rate */ + STA_PM_SC_OFLD_FAIL_DISABLED = (1u << 9u), /* Offload disabled */ + STA_PM_SC_OFLD_FAIL_CAL = (1u << 10u), /* Cal on main/aux core */ + STA_PM_SC_OFLD_FAIL_UNSUP_BCMC_RATE_RX = (1u << 11u), /* unsupported bcmc rate rx */ + STA_PM_SC_OFLD_FAIL_TWT_ACTIVE = (1u << 12u) /* TWT is active */ +} wlc_sta_pm_sc_ofld_fail_reason_t; + +typedef enum wlc_sta_pm_sc_ofld_exit_reason { + STA_PM_SC_OFLD_EXIT_AS_STATE = 1u, /* Exit due to assoc state not IDLE */ + STA_PM_SC_OFLD_EXIT_BCN_LOSS, /* Exit due to beacon loss */ + STA_PM_SC_OFLD_EXIT_TIM, /* Exit due to TIM bit set */ + STA_PM_SC_OFLD_EXIT_PM, /* Exit due to exit out of PM mode */ + STA_PM_SC_OFLD_EXIT_TX, /* Exit due to tx on true slice */ + STA_PM_SC_OFLD_EXIT_CSA, /* Exit due to CSA */ + STA_PM_SC_OFLD_EXIT_LOW_RSSI, /* Exit due to rssi lower than threshold */ + STA_PM_SC_OFLD_EXIT_MRC, /* Exit due to MRC being active */ + STA_PM_SC_OFLD_EXIT_BSSCFG_DOWN, /* Exit due to bsscfg down */ + STA_PM_SC_OFLD_EXIT_WLC_DOWN, /* Exit due to wlc down */ + STA_PM_SC_OFLD_EXIT_WBUS_REJECT, /* Exit due to wbus reject */ + STA_PM_SC_OFLD_EXIT_HOST_DISABLE, /* Exit due to disable by host */ + STA_PM_SC_OFLD_EXIT_CAL_TVPM, /* Exit due to Cal/TVPM on main/aux core */ + STA_PM_SC_OFLD_EXIT_DISASSOC, /* Exit due to disassoc */ + STA_PM_SC_OFLD_EXIT_CAC, /* Exit due to CAC admit */ + STA_PM_SC_OFLD_EXIT_CHN_OVERLAP, /* Exit due to true slice chan overlap */ + STA_PM_SC_OFLD_EXIT_UNSUP_BCMC_RATE_RX, /* Exit due to unsupported bcmc rate rx */ + STA_PM_SC_OFLD_EXIT_BCMC_LOSS, /* Exit due to bcmc pkt loss */ + STA_PM_SC_OFLD_EXIT_TWT, /* Exit due to TWT active */ + STA_PM_SC_OFLD_EXIT_MAX = 255u /* Max, uint8 for now */ +} wlc_sta_pm_sc_ofld_exit_reason_t; + +#define STA_PM_SC_OFLD_STATUS_VER_V1 1u + +#define STA_PM_SC_OFLD_STATUS_CLEAR (1u << 0u) +#define STA_PM_SC_OFLD_STATUS_OFFLOADED (1u << 1u) +#define STA_PM_SC_OFLD_STATUS_ASSOCIATED (1u << 2u) + +typedef struct wlc_sta_pm_sc_status_v1 { + uint16 version; + uint16 len; + uint32 flags; + uint32 sc_offload_enter_cnt; /* Offload enter cnt */ + uint32 sc_offload_exit_cnt; /* Offload exit cnt */ + uint32 sc_offload_wbus_reject_cnt; /* WBUS reject reg cnt */ + uint32 sc_offload_exp_bcn_cnt; /* SC ofld expected bcn cnt */ + uint32 sc_offload_exp_bcn_missed_cnt; /* SC ofld missed bcn cnt */ + uint32 sc_offload_last_exit_reason; /* Previous exit reason */ + uint32 sc_offload_enter_fail_reason; /* SC ofld enter fail reason */ + uint32 sc_offload_total_dur_ms; /* Cumulative duration in offload (ms) */ +} wlc_sta_pm_sc_status_v1_t; + +#define WL_SDTC_IOV_VERSION 1 +#define SDTC_SUB_IOV_VERSION_1 1 +#define SDTC_SUB_IOV_VERSION_1_1 1 +#define MAX_ATID_CORES 5u +#define SDTC_ID_ALL 0xFFu + +/* SDTC IOV ID's */ +enum wl_sdtc_iov_id { + SDTC_ID_INVALID = 0x0, + SDTC_ID_CB = 0x1, + SDTC_ID_PCIE = 0x2, + SDTC_ID_SYSMEM = 0x3, + SDTC_ID_AUXMAC = 0x4, + SDTC_ID_MAINMAC = 0x5 +}; + +/* SDTC Iovars */ +enum wl_sdtc_cmd_ids { + WL_SDTC_CMD_EN = 0x1, + WL_SDTC_CMD_CONFIG = 0x2, + WL_SDTC_CMD_CORE_ENAB = 0x3, + WL_SDTC_CMD_ETB_INFO = 0x4, + WL_SDTC_CMD_LAST +}; + +enum wl_sdtc_xtlv_version { + WL_SDTC_ENABLE_V1 = 0x1 +}; + +typedef struct sdtc_regs { + uint32 addr; + uint32 val; +} sdtc_regs_t; + +typedef struct sdtc_config { + uint16 version; + uint16 len; + + uint8 sdtc_id; /* 0xFF indicates, all core id's enable */ + uint8 pad; /* 32 bit alignment */ + uint16 num_of_registers; /* if no of reg is "0",it will use default SDTC config */ + sdtc_regs_t regs[1]; /* Array of register list */ +} sdtc_config_t; + +typedef struct sdtc_enab_atid_list { + uint16 version; + uint16 len; + + uint32 sdtc_id_bmp; + uint32 sdtc_id_mask; +} sdtc_enab_atid_list_t; + +typedef struct etb_addr_info { + uint16 version; + uint16 len; + uint32 etbinfo_addr; /* etb_info address */ +} etb_addr_info_t; + +typedef struct etb_info { + uint16 version; + uint16 len; + uint32 read_write_p; /* read write pointer address */ + uint8 etb_full; /* status bit */ + uint8 pad[3]; /* 32bit alignment */ + uint32 addr; /* H/W Address */ + uint32 read_bytes; /* Size of ETB(Embedded Trace Buffer) Memory */ +} etb_info_t; + +/* This ROAM RSSI limit value is used in order to prune LOW RSSI candidate + * for Priority roam and Beacon lost + * WLC_E_REASON_DEAUTH, WLC_E_REASON_DISASSOC, WLC_E_REASON_BCNS_LOST + */ +#define WLC_ROAM_RSSI_LMT_VER_1 1 +typedef struct wlc_roam_rssi_lmt_info_v1 { + int16 rssi_limit_2g; + int16 rssi_limit_5g; +} wlc_roam_rssi_lmt_info_v1_t; + +typedef struct wlc_wlc_roam_rssi_limit { + uint16 ver; + uint16 len; + uint8 data[]; +} wlc_roam_rssi_limit_t; + +#define ROAMRSSI_HDRLEN 4u +#define ROAMRSSI_2G_DEFAULT -128 +#define ROAMRSSI_2G_MAX -70 +#define ROAMRSSI_2G_MIN -128 +#define ROAMRSSI_5G_DEFAULT -128 +#define ROAMRSSI_5G_MAX -70 +#define ROAMRSSI_5G_MIN -128 + +/* Beacon mute mitigation specific Macros */ + +/* Macro flags to identify the specific config commands in IOVAR set operation */ +#define WLC_BCN_MUTE_MITI_CFG_CMD_ENABLE (1u << 0u) +#define WLC_BCN_MUTE_MITI_CFG_CMD_PM0_PERIOD (1u << 1u) +#define WLC_BCN_MUTE_MITI_CFG_CMD_MAX_MITI_TIMEOUT (1u << 2u) +#define WLC_BCN_MUTE_MITI_CFG_CMD_MASK (WLC_BCN_MUTE_MITI_CFG_CMD_ENABLE |\ + WLC_BCN_MUTE_MITI_CFG_CMD_PM0_PERIOD |\ + WLC_BCN_MUTE_MITI_CFG_CMD_MAX_MITI_TIMEOUT) + +/* Configurable PM0 period range */ +#define WLC_BCN_MUTE_MITI_CFG_PM0_PERIOD_MIN (1u) /* Period in sec */ +#define WLC_BCN_MUTE_MITI_CFG_PM0_PERIOD_MAX (10u) /* Period in sec */ + +/* Configurable mitigation Timeout range */ +#define WLC_BCN_MUTE_MITI_CFG_TIMEOUT_MIN (30u) /* Minimum Timeout in sec */ +#define WLC_BCN_MUTE_MITI_CFG_TIMEOUT_DEFAULT (60u) /* Default Timeout in sec */ +#define WLC_BCN_MUTE_MITI_CFG_TIMEOUT_MAX (120u) /* Maximum Timeout in sec */ + +#define WLC_BCN_MUTE_MITI_CMD_VER_1 1u /* Version number for wlc_bcn_mute_miti_cfg_v1 struct */ +typedef struct wlc_bcn_mute_miti_cfg_v1 { + uint16 version; /* Structure version */ + uint16 length; /* Length of whole struct */ + uint32 cmd_flags; /* Flag bits to Identify configuring command */ + uint8 is_enabled; /* Feature is enabled or not */ + uint8 pm0_periodicity; /* Interval between consecutive PM0 during mitigation + * period (in sec) + */ + uint16 max_miti_timeout; /* Maximum mitigation timeout in sec to send + * Mitigation Timeout event. + */ +} wlc_bcn_mute_miti_cfg_v1_t; + +/* SC scan retry config params */ +#define SC_SCAN_RETRY_CFG_VERSION 1u + +/* Bits indicating which are the valid params in the set command. */ +#define SC_SCAN_RETRY_CFG_PARAMS_THRESHOLD (1u << 0u) +#define SC_SCAN_RETRY_CFG_PARAMS_MODE (1u << 1u) + +/* Input structure for sc_scan_retry_cfg IOVAR */ +typedef struct sc_scan_retry_cfg_params_v1 { + uint16 version; /* config version. */ + uint16 len; /* Length of this struct. */ + uint32 set_flag; /* Flag bits to Identify valid param type to be set */ + uint8 threshold; /* Amount of Tx-Blanking in percentage considered as failed scan. */ + uint8 scan_mode; /* Scan mode in which scan need to be re-scheduled. */ + uint8 PAD[2]; /* 32bit alignment */ +} sc_scan_retry_cfg_params_v1_t; + +/* host queries RNG version from 'wl cap' iovar */ +#define BCM_RNG_VERSION_1 1u /* for initial "reseed" version */ +/* Supported entropy size, bytes */ +#define BCM_RNG_ENTROPY_SIZE_BYTES 64u + +/* RNG top level command IDs */ +typedef enum wl_rng_cmd_id { + WL_RNG_CMD_RESEED = 0u, + WL_RNG_CMD_LAST = 1u +} wl_rng_cmd_id_t; + +/* RNG reseed host entropy */ +typedef struct bcm_rng_reseed { + uint16 entropy_size; /* host entropy size, bytes */ + uint8 entropy[]; /* host entropy, flexible array */ +} bcm_rng_reseed_t; + +/* RNG IOVAR data */ +typedef struct wl_rng_iovar { + uint16 version; /* Version of this structure */ + uint16 subcmd_id; /* RNG subcmd ID */ + uint16 pad; /* padding for 32-bit struct alignment */ + uint16 length; /* Length of data following this length field */ + union { + bcm_rng_reseed_t reseed; /* RNG reseed data */ + } u; +} wl_rng_iovar_t; + +// MOG-ON: WL_RC_CX +#ifdef RC2CX + +/* Definitions for RC2 coex iovar */ +#define WL_RC2CX_VERSION 1 + +/* RC2 coex IOV sub command IDs */ +typedef enum rc2cx_cmd_id { + WL_RC2CX_CMD_VER = 0, /* RC2CX version sub command */ + WL_RC2CX_CMD_MODE = 1, /* RC2CX Mode sub command */ + WL_RC2CX_CMD_PM_PROT = 2, /* RC2CX PM Protection sub command */ + WL_RC2CX_CMD_PER_CTS = 3 /* RC2CX Periodic CTS sub command */ +} rc2cx_cmd_id_t; + +/* first byte of bcm_iov_batch_subcmd.data for the WL_RC2CX_CMD_MODE command */ +#define RC2CX_MODE_TDD 0x01u +#define RC2CX_MODE_DISABLED 0x00u + +/* first byte of bcm_iov_batch_subcmd.data for the WL_RC2CX_CMD_PM_PROT command */ +#define RC2CX_PM_PROT_ENABLED 0x01u +#define RC2CX_PM_PROT_DISABLED 0x00u + +/* first byte of bcm_iov_batch_subcmd.data for the WL_RC2CX_CMD_PER_CTS command */ +#define RC2CX_PER_CTS_ENABLED 0x01u +#define RC2CX_PER_CTS_DISABLED 0x00u + +/* payload for the WL_RC2CX_CMD_PER_CTS command */ +typedef struct rc2cx_per_cts_config { + uint8 enable_flag; /* 1: enabled; 0: disabled */ + uint8 duration_val; /* Must be valid with enable command */ + uint8 interval_val; /* Must be valid with enable command */ + uint8 pad; +} rc2cx_per_cts_config_t; + +#endif /* RC2CX */ +// MOG-OFF: WL_RC_CX + #endif /* _wlioctl_h_ */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_defs.h b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_defs.h index a8a4cfc527c4..0cea120fe0c0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_defs.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_defs.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -25,7 +25,7 @@ * other than the GPL, without Broadcom's express prior written consent. * * - * <> + * <> */ #ifndef wlioctl_defs_h @@ -93,8 +93,8 @@ #define OLD_NRATE_STF_STBC 2 /* stf mode STBC */ #define OLD_NRATE_STF_SDM 3 /* stf mode SDM */ -#define WLC_11N_N_PROP_MCS 6 -#define WLC_11N_FIRST_PROP_MCS 87 +#define WLC_11N_N_PROP_MCS 6 /* number of proprietary 11n MCS'es */ +#define WLC_11N_FIRST_PROP_MCS 87 /* first Broadcom proprietary MCS */ #define WLC_11N_LAST_PROP_MCS 102 #define MAX_CCA_CHANNELS 38 /* Max number of 20 Mhz wide channels */ @@ -111,9 +111,9 @@ #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 exclude 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 */ @@ -214,8 +214,12 @@ #define WL_SCAN_THROTTLE_OTHER_FW_SCAN (1U << 2) /* for other scans like pno etc */ #define WL_SCAN_THROTTLE_HOSTSCAN (1U << 3) -#define WL_SCANFLAGS_CLIENT_MASK 0xF00 -#define WL_SCANFLAGS_CLIENT_SHIFT 8 +/* Mask bit for Assoc scan, Roam scan, Other FW scan, Host scan bit defines */ +#define WL_SCANFLAGS_CLIENT_MASK 0xF00u +#define WL_SCANFLAGS_CLIENT_SHIFT 8 + +/* Mask bit for LOW power scan, High accuracy scan, LOW span scan bit defines */ +#define WL_SCANFLAGS_SCAN_MODE_MASK 0x7000u /* Bitmask for scan_type */ /* Reserved flag precludes the use of 0xff for scan_type which is @@ -254,6 +258,14 @@ * enable LISTEN along with PASSIVE flag */ +/* Value to decide scan type based on scqs */ +#define WL_SC_RETRY_SCAN_MODE_NO_SCAN 0x0u /* Do not reschedule scan */ +#define WL_SC_RETRY_SCAN_MODE_HIGH_ACC 0x1u /* Reschedule scan as HighAccuracy */ +#define WL_SC_RETRY_SCAN_MODE_LOWPOWER 0x2u /* Reschedule scan as LOWPOWER */ +#define WL_SC_RETRY_SCAN_MODE_AUTO 0x3u /* Scan rescheduling type is decided + * dynamically. + */ + /* wl_iscan_results status values */ #define WL_SCAN_RESULTS_SUCCESS 0 #define WL_SCAN_RESULTS_PARTIAL 1 @@ -421,7 +433,7 @@ #define CRYPTO_ALGO_AES_CCM 4 #define CRYPTO_ALGO_AES_OCB_MSDU 5 #define CRYPTO_ALGO_AES_OCB_MPDU 6 -#if !defined(BCMCCX) && !defined(BCMEXTCCX) +#if !defined(BCMCCX) && !defined(BCMEXTCCX) // MOG-NO #define CRYPTO_ALGO_NALG 7 #else #define CRYPTO_ALGO_CKIP 7 @@ -446,7 +458,7 @@ /* algo bit vector */ #define KEY_ALGO_MASK(_algo) (1 << _algo) -#if defined(BCMCCX) || defined(BCMEXTCCX) +#if defined(BCMCCX) || defined(BCMEXTCCX) // MOG-NO #define KEY_ALGO_MASK_CCX (KEY_ALGO_MASK(CRYPTO_ALGO_CKIP) | \ KEY_ALGO_MASK(CRYPTO_ALGO_CKIP_MMH) | \ KEY_ALGO_MASK(CRYPTO_ALGO_WEP_MMH)) @@ -472,7 +484,7 @@ #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) || defined(BCMEXTCCX) +#if defined(BCMCCX) || defined(BCMEXTCCX) // MOG-NO #define WL_CKIP_KP (1 << 4) /* CMIC */ #define WL_CKIP_MMH (1 << 5) /* CKIP */ #else @@ -489,14 +501,17 @@ #define TKIP_ENABLED 0x0002 #define AES_ENABLED 0x0004 #define WSEC_SWFLAG 0x0008 -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #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 */ + +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WPI #define SMS4_ENABLED 0x0100 #endif /* BCMWAPI_WPI */ +// MOG-OFF: BCMWAPI #define WSEC_WEP_ENABLED(wsec) ((wsec) & WEP_ENABLED) #define WSEC_TKIP_ENABLED(wsec) ((wsec) & TKIP_ENABLED) @@ -508,32 +523,44 @@ #define WSEC_INFO_ALGO_NONE(_wi) (((_wi).cur_algos) == 0) -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #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)) +// MOG-ON: BCMWAPI #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 */ +#endif /* BCMWAPI_WPI */ +// MOG-OFF: BCMWAPI + +#ifndef BCMWAPI_WPI /* 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 */ + +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WPI #define WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED | SMS4_ENABLED)) -#else /* BCMWAPI_WPI */ +#endif /* BCMWAPI_WPI */ +// MOG-OFF: BCMWAPI + +#ifndef BCMWAPI_WPI /* 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) + +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WAI #define WSEC_SMS4_ENABLED(wsec) ((wsec) & SMS4_ENABLED) #endif /* BCMWAPI_WAI */ +// MOG-OFF: BCMWAPI /* Following macros are not used any more. Just kept here to * avoid build issue in BISON/CARIBOU branch @@ -547,7 +574,7 @@ #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) || defined(BCMEXTCCX) +#if defined(BCMCCX) || defined(BCMEXTCCX) // MOG-NO #define WPA_AUTH_CCKM 0x0008 /* CCKM */ #define WPA2_AUTH_CCKM 0x0010 /* CCKM2 */ #endif /* BCMCCX || BCMEXTCCX */ @@ -812,8 +839,8 @@ #define WLC_GET_ASSOC_PREFER 206 #define WLC_SET_ROAM_PREFER 207 #define WLC_GET_ROAM_PREFER 208 -#define WLC_SET_LED 209 -#define WLC_GET_LED 210 +/* #define WLC_SET_LED 209 */ /* no longer supported */ +/* #define WLC_GET_LED 210 */ /* no longer supported */ #define WLC_GET_INTERFERENCE_MODE 211 #define WLC_SET_INTERFERENCE_MODE 212 #define WLC_GET_CHANNEL_QA 213 @@ -917,9 +944,9 @@ /* #define WLC_LAST 310 */ /* Never used - can be reused */ #define WLC_SET_INTERFERENCE_OVERRIDE_MODE 311 /* set inter mode override */ #define WLC_GET_INTERFERENCE_OVERRIDE_MODE 312 /* get inter mode override */ -/* #define WLC_GET_WAI_RESTRICT 313 */ -/* #define WLC_SET_WAI_RESTRICT 314 */ -/* #define WLC_SET_WAI_REKEY 315 */ +/* #define WLC_GET_WAI_RESTRICT 313 */ /* for WAPI, deprecated use iovar instead */ +/* #define WLC_SET_WAI_RESTRICT 314 */ /* for WAPI, deprecated use iovar instead */ +/* #define WLC_SET_WAI_REKEY 315 */ /* for WAPI, deprecated use iovar instead */ #define WLC_SET_NAT_CONFIG 316 /* for configuring NAT filter driver */ #define WLC_GET_NAT_STATE 317 #define WLC_GET_TXBF_RATESET 318 @@ -1002,6 +1029,12 @@ #define WL_AUTH_FILS_SHARED 4 /* d11 fils shared key authentication */ #define WL_AUTH_FILS_SHARED_PFS 5 /* d11 fils shared key w/ pfs authentication */ #define WL_AUTH_FILS_PUBLIC 6 /* d11 fils public key authentication */ +/* Some branch use different define for WL_AUTH_OPEN_SHARED + * for example, PHOENIX2 Branch defined WL_AUTH_OPEN_SHARED as 3 + * But other branch defined WL_AUTH_OPEN_SHARED as 2 + * if it is mismatch, WEP association can be failed. + * More information - RB:5320 + */ /* a large TX Power as an init value to factor out of MIN() calculations, * keep low enough to fit in an int8, units are .25 dBm @@ -1081,6 +1114,7 @@ #define WLC_MACMODE_DISABLED 0 /* MAC list disabled */ #define WLC_MACMODE_DENY 1 /* Deny specified (i.e. allow unspecified) */ #define WLC_MACMODE_ALLOW 2 /* Allow specified (i.e. deny unspecified) */ +#define WLC_MACMODE_AVOID 3 /* Avoid specified (i.e. conditionally avoid unspecified) */ /* * 54g modes (basic bits may still be overridden) @@ -1379,6 +1413,10 @@ #define WL_MBO_VAL 0x04000000 /* re-using WL_SRSCAN_VAL */ #define WL_RANDMAC_VAL 0x02000000 + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WL_UNUSED_VAL 0x10000000 /* Was a duplicate for WL_LPC_VAL. Removed */ #define WL_NET_DETECT_VAL 0x20000000 #define WL_OCE_VAL 0x20000000 /* reuse */ @@ -1397,50 +1435,12 @@ #define WL_LATENCY_VAL 0x00000004 #define WL_WBUS_VAL 0x00000008 -/* max # of leds supported by GPIO (gpio pin# == led index#) */ -#define WL_LED_NUMGPIO 32 /* gpio 0-31 */ - -/* led per-pin behaviors */ -#define WL_LED_OFF 0 /* always off */ -#define WL_LED_ON 1 /* always on */ -#define WL_LED_ACTIVITY 2 /* activity */ -#define WL_LED_RADIO 3 /* radio enabled */ -#define WL_LED_ARADIO 4 /* 5 Ghz radio enabled */ -#define WL_LED_BRADIO 5 /* 2.4Ghz radio enabled */ -#define WL_LED_BGMODE 6 /* on if gmode, off if bmode */ -#define WL_LED_WI1 7 /* wlan indicator 1 mode (legacy cust) */ -#define WL_LED_WI2 8 /* wlan indicator 2 mode (legacy cust) */ -#define WL_LED_WI3 9 /* wlan indicator 3 mode (legacy cust) */ -#define WL_LED_ASSOC 10 /* associated state indicator */ -#define WL_LED_INACTIVE 11 /* null behavior (clears default behavior) */ -#define WL_LED_ASSOCACT 12 /* on associated; blink fast for activity */ -#define WL_LED_WI4 13 /* wlan indicator 4 mode (legacy cust 5G) */ -#define WL_LED_WI5 14 /* wlan indicator 5 mode (legacy cust 2.4) */ -#define WL_LED_BLINKSLOW 15 /* blink slow */ -#define WL_LED_BLINKMED 16 /* blink med */ -#define WL_LED_BLINKFAST 17 /* blink fast */ -#define WL_LED_BLINKCUSTOM 18 /* blink custom */ -#define WL_LED_BLINKPERIODIC 19 /* blink period (custom 1000ms / off 400ms) */ -#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_WI6 22 /* wlan indicator 6 mode legacy rtr 43526 5 */ -#define WL_LED_WI7 23 /* wlan indicator 7 mode legacy rtr 43526 2.4 */ -#define WL_LED_WI8 24 /* wlan indicator 8 mode legacy rtr 43526 */ -#define WL_LED_NUMBEHAVIOR 25 - -/* led behavior numeric value format */ -#define WL_LED_BEH_MASK 0x3f /* behavior mask */ -#define WL_LED_PMU_OVERRIDE 0x40 /* need to set PMU Override bit for the GPIO */ -#define WL_LED_AL_MASK 0x80 /* activelow (polarity) bit */ - /* number of bytes needed to define a proper bit mask for MAC event reporting */ #define BCMIO_ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #define BCMIO_NBBY 8 #define WL_EVENTING_MASK_LEN 16 /* Don't increase this without wl review */ -#define WL_EVENTING_MASK_EXT_LEN \ - MAX(WL_EVENTING_MASK_LEN, (ROUNDUP(WLC_E_LAST, NBBY)/NBBY)) +#define WL_EVENTING_MASK_EXT_LEN ROUNDUP(WLC_E_LAST, NBBY)/NBBY /* join preference types */ #define WL_JOIN_PREF_RSSI 1 /* by RSSI */ @@ -1852,6 +1852,11 @@ #define WL_CHANIM_COUNT_ALL 0xff #define WL_CHANIM_COUNT_ONE 0x1 +/* Module id: to know which module has sent the stats */ +#define SC_CHANIM_ID_NULL 0u +#define SC_CHANIM_ID_SCAN 1u /* Module Id of scan, used to report scqs */ +#define SC_CHANIM_ID_STA 2u /* Module Id of STA, used tp report scqs */ + /* ap tpc modes */ #define AP_TPC_OFF 0 #define AP_TPC_BSS_PWR 1 /* BSS power control */ @@ -2065,7 +2070,7 @@ #define TSPEC_UNKNOWN 3 /* TSPEC unknown */ #define TSPEC_STATUS_MASK 7 /* TSPEC status mask */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO /* "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 */ @@ -2136,7 +2141,6 @@ #define REPORT_SEPERATELY_MASK 0x0800 #define BESTN_BSSID_ONLY_MASK 0x1000 -#define PFN_VERSION 2 #ifdef PFN_SCANRESULT_2 #define PFN_SCANRESULT_VERSION 2 #else @@ -2224,6 +2228,10 @@ #define ND_MULTIHOMING_MAX 10 /* Maximum local host IP addresses */ #endif /* WL_PKT_FLTR_EXT && !WL_PKT_FLTR_EXT_DISABLED */ #define ND_REQUEST_MAX 5 /* Max set of offload params */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + /* AOAC wake event flag */ #define WAKE_EVENT_NLO_DISCOVERY_BIT 1 #define WAKE_EVENT_AP_ASSOCIATION_LOST_BIT 2 @@ -2423,6 +2431,10 @@ #define WL_PWRSTATS_TYPE_USB_HSIC 2 /**< struct wl_pwr_usb_hsic_stats */ #define WL_PWRSTATS_TYPE_PM_AWAKE1 3 /**< struct wl_pwr_pm_awake_stats_v1 */ #define WL_PWRSTATS_TYPE_CONNECTION 4 /* struct wl_pwr_connect_stats; assoc and key-exch time */ + +// MOG-ON: WLAWDL +// MOG-OFF: WLAWDL + #define WL_PWRSTATS_TYPE_PCIE 6 /**< struct wl_pwr_pcie_stats */ #define WL_PWRSTATS_TYPE_PM_AWAKE2 7 /**< struct wl_pwr_pm_awake_stats_v2 */ #define WL_PWRSTATS_TYPE_SDIO 8 /* struct wl_pwr_sdio_stats */ diff --git a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_utils.h b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_utils.h index e3926fdb418b..186c833786d6 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_utils.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/wlioctl_utils.h @@ -1,7 +1,7 @@ /* * Custom OID/ioctl related helper functions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/include/wpa.h b/drivers/net/wireless/bcmdhd_100_15/include/wpa.h index 73fd4145ef3a..fffd11ee5f98 100644 --- a/drivers/net/wireless/bcmdhd_100_15/include/wpa.h +++ b/drivers/net/wireless/bcmdhd_100_15/include/wpa.h @@ -1,7 +1,7 @@ /* * Fundamental types and constants relating to WPA * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -121,7 +121,7 @@ typedef BWL_PRE_PACKED_STRUCT struct #define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */ #define WPA_CIPHER_BIP 6 /* WEP (104-bit) */ #define WPA_CIPHER_TPK 7 /* Group addressed traffic not allowed */ -#ifdef BCMCCX +#ifdef BCMCCX // MOG-NO #define WPA_CIPHER_CKIP 8 /* KP with no MIC */ #define WPA_CIPHER_CKIP_MMH 9 /* KP with MIC ("CKIP/MMH", "CKIP+CMIC") */ #define WPA_CIPHER_WEP_MMH 10 /* MIC with no KP ("WEP/MMH", "CMIC") */ @@ -133,17 +133,19 @@ typedef BWL_PRE_PACKED_STRUCT struct #define WPA_CIPHER_AES_GCM 8 /* AES (GCM) */ #define WPA_CIPHER_AES_GCM256 9 /* AES (GCM256) */ -#define WPA_CIPHER_CCMP_256 10 /* CCMP-256 */ +#define WPA_CIPHER_CCMP_256 10 /* CCMP-256 */ #define WPA_CIPHER_BIP_GMAC_128 11 /* BIP_GMAC_128 */ #define WPA_CIPHER_BIP_GMAC_256 12 /* BIP_GMAC_256 */ #define WPA_CIPHER_BIP_CMAC_256 13 /* BIP_CMAC_256 */ +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WAI #define WAPI_CIPHER_NONE WPA_CIPHER_NONE #define WAPI_CIPHER_SMS4 11 #define WAPI_CSE_WPI_SMS4 1 #endif /* BCMWAPI_WAI */ +// MOG-OFF: BCMWAPI #define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \ (cipher) == WPA_CIPHER_WEP_40 || \ @@ -157,10 +159,11 @@ typedef BWL_PRE_PACKED_STRUCT struct (cipher) == WPA_CIPHER_TPK) #define IS_WPA_BIP_CIPHER(cipher) ((cipher) == WPA_CIPHER_BIP || \ - (cipher) == WPA_CIPHER_BIP_GMAC_128 || \ + (cipher) == WPA_CIPHER_BIP_GMAC_128 || \ (cipher) == WPA_CIPHER_BIP_GMAC_256 || \ - (cipher) == WPA_CIPHER_BIP_CMAC_256) + (cipher) == WPA_CIPHER_BIP_CMAC_256) +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WAI #define IS_WAPI_CIPHER(cipher) ((cipher) == WAPI_CIPHER_NONE || \ (cipher) == WAPI_CSE_WPI_SMS4) @@ -172,6 +175,7 @@ typedef BWL_PRE_PACKED_STRUCT struct #define WAPI_CIPHER_2_CSE_WPI(cipher) ((cipher) == WAPI_CIPHER_SMS4 ? \ WAPI_CSE_WPI_SMS4 : WAPI_CIPHER_NONE) #endif /* BCMWAPI_WAI */ +// MOG-OFF: BCMWAPI #define IS_VALID_AKM(akm) ((akm) == RSN_AKM_NONE || \ (akm) == RSN_AKM_UNSPECIFIED || \ @@ -239,7 +243,7 @@ typedef BWL_PRE_PACKED_STRUCT struct /* WPA Specific defines */ #define WPA_CAP_LEN RSN_CAP_LEN /* Length of RSN capabilities in RSN IE (2 octets) */ -#define WPA_PMKID_CNT_LEN 2 /* Length of RSN PMKID count (2 octests) */ +#define WPA_PMKID_CNT_LEN 2 /* Length of RSN PMKID count (2 octests) */ #define WPA_CAP_WPA2_PREAUTH RSN_CAP_PREAUTH @@ -289,6 +293,7 @@ typedef struct rsn_ie_info { } rsn_ie_info_t; #endif /* RSN_IE_INFO_STRUCT_RELOCATED */ +// MOG-ON: BCMWAPI #ifdef BCMWAPI_WAI #define WAPI_CAP_PREAUTH RSN_CAP_PREAUTH @@ -302,6 +307,7 @@ typedef struct rsn_ie_info { #define WAPI_USK_REKEY_COUNT 0x4000000 /* 0xA00000 */ #define WAPI_MSK_REKEY_COUNT 0x4000000 /* 0xA00000 */ #endif /* BCMWAPI_WAI */ +// MOG-OFF: BCMWAPI /* This marks the end of a packed structure section. */ #include diff --git a/drivers/net/wireless/bcmdhd_100_15/linux_osl.c b/drivers/net/wireless/bcmdhd_100_15/linux_osl.c index 4e6158a82ae4..4ce0356dc791 100644 --- a/drivers/net/wireless/bcmdhd_100_15/linux_osl.c +++ b/drivers/net/wireless/bcmdhd_100_15/linux_osl.c @@ -1,7 +1,7 @@ /* * Linux OS Independent Layer * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: linux_osl.c 815919 2019-04-22 09:06:50Z $ + * $Id: linux_osl.c 862862 2020-02-05 09:10:41Z $ */ #define LINUX_PORT @@ -808,6 +808,10 @@ osl_mfree(osl_t *osh, void *addr, uint size) #ifdef CONFIG_DHD_USE_STATIC_BUF unsigned long flags; + if (addr == NULL) { + return; + } + if (bcm_static_buf) { if ((addr > (void *)bcm_static_buf) && ((unsigned char *)addr diff --git a/drivers/net/wireless/bcmdhd_100_15/linux_osl_priv.h b/drivers/net/wireless/bcmdhd_100_15/linux_osl_priv.h index 7dfb96c695f1..621ab37e09d1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/linux_osl_priv.h +++ b/drivers/net/wireless/bcmdhd_100_15/linux_osl_priv.h @@ -1,7 +1,7 @@ /* * Private header file for Linux OS Independent Layer * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/linux_pkt.c b/drivers/net/wireless/bcmdhd_100_15/linux_pkt.c index 1e1af504cb1f..b0a65a41ec0b 100644 --- a/drivers/net/wireless/bcmdhd_100_15/linux_pkt.c +++ b/drivers/net/wireless/bcmdhd_100_15/linux_pkt.c @@ -1,7 +1,7 @@ /* * Linux Packet (skb) interface * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/otpdefs.h b/drivers/net/wireless/bcmdhd_100_15/otpdefs.h index ed50b1555e50..fd18aa76aa13 100644 --- a/drivers/net/wireless/bcmdhd_100_15/otpdefs.h +++ b/drivers/net/wireless/bcmdhd_100_15/otpdefs.h @@ -1,7 +1,7 @@ /* * otpdefs.h SROM/OTP definitions. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/pcie_core.c b/drivers/net/wireless/bcmdhd_100_15/pcie_core.c index 39b0c6b944bb..ea79ca49bee8 100644 --- a/drivers/net/wireless/bcmdhd_100_15/pcie_core.c +++ b/drivers/net/wireless/bcmdhd_100_15/pcie_core.c @@ -3,7 +3,7 @@ * Contains PCIe related functions that are shared between different driver models (e.g. firmware * builds, DHD builds, BMAC builds), in order to avoid code duplication. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/sbutils.c b/drivers/net/wireless/bcmdhd_100_15/sbutils.c index 68961eeac325..019c7cfdc0ea 100644 --- a/drivers/net/wireless/bcmdhd_100_15/sbutils.c +++ b/drivers/net/wireless/bcmdhd_100_15/sbutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/siutils.c b/drivers/net/wireless/bcmdhd_100_15/siutils.c index 1fffb650ea51..4cdbdd6dc3b8 100644 --- a/drivers/net/wireless/bcmdhd_100_15/siutils.c +++ b/drivers/net/wireless/bcmdhd_100_15/siutils.c @@ -2,7 +2,7 @@ * Misc utility routines for accessing chip-specific features * of the SiliconBackplane-based Broadcom chips. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/siutils_priv.h b/drivers/net/wireless/bcmdhd_100_15/siutils_priv.h index 983619b0c983..d35b80424259 100644 --- a/drivers/net/wireless/bcmdhd_100_15/siutils_priv.h +++ b/drivers/net/wireless/bcmdhd_100_15/siutils_priv.h @@ -1,7 +1,7 @@ /* * Include file private to the SOC Interconnect support files. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_android.c b/drivers/net/wireless/bcmdhd_100_15/wl_android.c index 1a67522ac370..b4b54f4cff80 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_android.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_android.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Android related functions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_android.c 851171 2019-11-18 12:03:07Z $ + * $Id: wl_android.c 855877 2019-12-18 03:16:29Z $ */ #include @@ -5764,7 +5764,7 @@ wl_android_set_roam_vsie_enab(struct net_device *dev, const char *cmd, u32 cmd_l { s32 err = BCME_OK; u32 roam_vsie_enable = 0; - u32 cmd_str_len = strlen(CMD_ROAM_VSIE_ENAB_SET); + u32 cmd_str_len = (u32)strlen(CMD_ROAM_VSIE_ENAB_SET); struct bcm_cfg80211 *cfg = wl_get_cfg(dev); /* */ diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_android.h b/drivers/net/wireless/bcmdhd_100_15/wl_android.h index f8e0536208f0..66e899ab1d9e 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_android.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_android.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Android related functions * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_bam.c b/drivers/net/wireless/bcmdhd_100_15/wl_bam.c index 3c26291caef8..faa93fd4ae24 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_bam.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_bam.c @@ -1,7 +1,7 @@ /* * Bad AP Manager for ADPS * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_bam.h b/drivers/net/wireless/bcmdhd_100_15/wl_bam.h index 62d55a1b98f2..f5cfe27102e5 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_bam.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_bam.h @@ -1,7 +1,7 @@ /* * Bad AP Manager for ADPS * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.c b/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.c index 540bd74a028e..0a4ab598d818 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.c @@ -1,7 +1,7 @@ /* * Bigdata logging and report. None EWP and Hang event. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.h b/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.h index b225de4965cb..37548841a93a 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_bigdata.h @@ -1,7 +1,7 @@ /* * Bigdata logging and report. None EWP and Hang event. * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.c index aa0b5e60a84d..7062deaf4040 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_cfg80211.c 854674 2019-12-10 03:31:41Z $ + * $Id: wl_cfg80211.c 862085 2020-01-31 01:26:59Z $ */ /* */ #include @@ -2045,6 +2045,9 @@ wl_cfg80211_iface_state_ops(struct wireless_dev *wdev, if (wl_iftype == WL_IF_TYPE_P2P_GC) { /* Disable firmware roaming for P2P interface */ wldev_iovar_setint(ndev, "roam_off", 1); + + /* set retry_max to CUSTOM_ASSOC_RETRY_MAX(3) */ + wldev_iovar_setint(ndev, "assoc_retry_max", CUSTOM_ASSOC_RETRY_MAX); } if (wl_mode == WL_MODE_AP) { /* Common code for AP/GO */ @@ -6593,7 +6596,7 @@ static void wl_cfg80211_wait_for_disconnection(struct bcm_cfg80211 *cfg, struct CFG80211_CONNECT_RESULT(dev, NULL, NULL, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); - } else if (wl_get_drv_status(cfg, CONNECTED, dev)) { + } else { WL_INFORM_MEM(("force send disconnect event\n")); CFG80211_DISCONNECTED(dev, WLAN_REASON_DEAUTH_LEAVING, NULL, 0, false, GFP_KERNEL); @@ -6614,11 +6617,11 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, u8 *curbssid = NULL; u8 null_bssid[ETHER_ADDR_LEN]; s32 bssidx = 0; + bool connected; + bool conn_in_progress; dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub); WL_ERR(("Reason %d\n", reason_code)); RETURN_EIO_IF_NOT_UP(cfg); - act = *(bool *) wl_read_prof(cfg, dev, WL_PROF_ACT); - curbssid = wl_read_prof(cfg, dev, WL_PROF_BSSID); BCM_REFERENCE(dhdp); DHD_STATLOG_CTRL(dhdp, ST(DISASSOC_START), @@ -6627,17 +6630,18 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, dhd_cleanup_m4_state_work(dhdp, dhd_net2idx(dhdp->info, dev)); #endif /* DHD_4WAYM4_FAIL_DISCONNECT */ -#ifdef ESCAN_RESULT_PATCH - if (wl_get_drv_status(cfg, CONNECTING, dev)) { + connected = wl_get_drv_status(cfg, CONNECTED, dev); + conn_in_progress = wl_get_drv_status(cfg, CONNECTING, dev); + curbssid = wl_read_prof(cfg, dev, WL_PROF_BSSID); + act = *(bool *) wl_read_prof(cfg, dev, WL_PROF_ACT); + WL_INFORM_MEM(("disconnect in connect state [%d:%d:%d]. reason:%d\n", + connected, conn_in_progress, act, reason_code)); + if (conn_in_progress || connected) { if (curbssid) { - WL_ERR(("Disconnecting while CONNECTING status" - " connecting device: " MACDBG "\n", MAC2STRDBG(curbssid))); - } else { - WL_ERR(("Disconnecting while CONNECTING status \n")); + WL_ERR(("curbssid:" MACDBG "\n", MAC2STRDBG(curbssid))); } act = true; } -#endif /* ESCAN_RESULT_PATCH */ if (!curbssid) { WL_ERR(("Disconnecting while CONNECTING status %d\n", (int)sizeof(null_bssid))); @@ -6662,19 +6666,18 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, } /* Set DISCONNECTING state. We are clearing this state in all exit paths */ wl_set_drv_status(cfg, DISCONNECTING, dev); - if (wl_get_drv_status(cfg, CONNECTING, dev) || - wl_get_drv_status(cfg, CONNECTED, dev)) { - scbval.val = reason_code; - memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); - scbval.val = htod32(scbval.val); - WL_INFORM_MEM(("[%s] wl disassoc\n", dev->name)); - err = wldev_ioctl_set(dev, WLC_DISASSOC, &scbval, - sizeof(scb_val_t)); - if (unlikely(err)) { - wl_clr_drv_status(cfg, DISCONNECTING, dev); - WL_ERR(("error (%d)\n", err)); - goto exit; - } + if (conn_in_progress || connected) { + scbval.val = reason_code; + memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); + scbval.val = htod32(scbval.val); + WL_INFORM_MEM(("[%s] wl disassoc\n", dev->name)); + err = wldev_ioctl_set(dev, WLC_DISASSOC, &scbval, + sizeof(scb_val_t)); + if (unlikely(err)) { + wl_clr_drv_status(cfg, DISCONNECTING, dev); + WL_ERR(("error (%d)\n", err)); + goto exit; + } } #ifdef WL_WPS_SYNC /* If are in WPS reauth state, then we would be @@ -6689,15 +6692,17 @@ wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, } #endif /* WPS_SYNC */ wl_cfg80211_wait_for_disconnection(cfg, dev); + } else { + /* Not in connected or connection in progres states. Still receiving + * disassoc indicates state mismatch with upper layer. Check for state + * and issue disconnect indication if required. + */ + if (dev->ieee80211_ptr->current_bss) { + WL_INFORM_MEM(("report disconnect event\n")); + CFG80211_DISCONNECTED(dev, 0, NULL, 0, false, GFP_KERNEL); + } } - if (dev->ieee80211_ptr->current_bss) { - /* If current_bss is still valid, indicate connect fail to clear state mismatch. - */ - WL_INFORM_MEM(("report connect result fail.\n")); - CFG80211_CONNECT_RESULT(dev, NULL, NULL, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); - } #ifdef CUSTOM_SET_CPUCORE /* set default cpucore */ if (dev == bcmcfg_to_prmry_ndev(cfg)) { @@ -24946,6 +24951,8 @@ s32 wl_cfg80211_handle_macaddr_change(struct net_device *dev, u8 *macaddr) { struct bcm_cfg80211 *cfg = wl_get_cfg(dev); + uint8 wait_cnt = WAIT_FOR_DISCONNECT_MAX; + u32 status = TRUE; if (IS_STA_IFACE(dev->ieee80211_ptr) && wl_get_drv_status(cfg, CONNECTED, dev)) { @@ -24955,6 +24962,12 @@ wl_cfg80211_handle_macaddr_change(struct net_device *dev, u8 *macaddr) */ WL_INFORM_MEM(("macaddr change in connected state. Force disassoc.\n")); wl_cfg80211_disassoc(dev, WLAN_REASON_DEAUTH_LEAVING); + + while ((status = wl_get_drv_status(cfg, CONNECTED, dev)) && wait_cnt) { + WL_DBG(("Waiting for disconnection, wait_cnt: %d\n", wait_cnt)); + wait_cnt--; + OSL_SLEEP(50); + } } return BCME_OK; } diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.h b/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.h index 4bbf181fdf7c..e924296624e2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfg80211.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_cfg80211.h 850437 2019-11-13 13:01:26Z $ + * $Id: wl_cfg80211.h 854461 2019-12-09 02:16:27Z $ */ /** diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfg_btcoex.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfg_btcoex.c index 735abe04cbf9..2d59331cc591 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfg_btcoex.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfg_btcoex.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver - Dongle Host Driver (DHD) related * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.c index 91496173df4e..4f18e66d2249 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.c @@ -1,7 +1,7 @@ /* * Neighbor Awareness Networking * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_cfgnan.c 854674 2019-12-10 03:31:41Z $ + * $Id: wl_cfgnan.c 863148 2020-02-06 10:48:09Z $ */ #ifdef WL_NAN @@ -92,7 +92,9 @@ static void wl_cfgnan_terminate_ranging_session(struct bcm_cfg80211 *cfg, #ifdef RTT_SUPPORT static s32 wl_cfgnan_clear_peer_ranging(struct bcm_cfg80211 * cfg, - struct ether_addr * peer, int reason); + nan_ranging_inst_t *rng_inst, int reason); +static s32 wl_cfgnan_handle_dp_ranging_concurrency(struct bcm_cfg80211 *cfg, + struct ether_addr *peer, int reason); #endif /* RTT_SUPPORT */ static void wl_cfgnan_terminate_all_obsolete_ranging_sessions(struct bcm_cfg80211 *cfg); @@ -123,6 +125,9 @@ static const char *nan_event_to_str(u16 cmd) C2S(WL_NAN_EVENT_DATAPATH_ESTB) C2S(WL_NAN_EVENT_SDF_RX) C2S(WL_NAN_EVENT_DATAPATH_END) + C2S(WL_NAN_EVENT_PEER_DATAPATH_RESP) + C2S(WL_NAN_EVENT_PEER_DATAPATH_CONF) + C2S(WL_NAN_EVENT_PEER_DATAPATH_SEC_INST) C2S(WL_NAN_EVENT_RNG_REQ_IND) C2S(WL_NAN_EVENT_RNG_RPT_IND) C2S(WL_NAN_EVENT_RNG_TERM_IND) @@ -134,6 +139,54 @@ static const char *nan_event_to_str(u16 cmd) } } +static const char *nan_frm_type_to_str(u16 frm_type) +{ + switch (frm_type) { + C2S(WL_NAN_FRM_TYPE_PUBLISH) + C2S(WL_NAN_FRM_TYPE_SUBSCRIBE) + C2S(WL_NAN_FRM_TYPE_FOLLOWUP) + + C2S(WL_NAN_FRM_TYPE_DP_REQ) + C2S(WL_NAN_FRM_TYPE_DP_RESP) + C2S(WL_NAN_FRM_TYPE_DP_CONF) + C2S(WL_NAN_FRM_TYPE_DP_INSTALL) + C2S(WL_NAN_FRM_TYPE_DP_END) + + C2S(WL_NAN_FRM_TYPE_SCHED_REQ) + C2S(WL_NAN_FRM_TYPE_SCHED_RESP) + C2S(WL_NAN_FRM_TYPE_SCHED_CONF) + C2S(WL_NAN_FRM_TYPE_SCHED_UPD) + + C2S(WL_NAN_FRM_TYPE_RNG_REQ) + C2S(WL_NAN_FRM_TYPE_RNG_RESP) + C2S(WL_NAN_FRM_TYPE_RNG_TERM) + C2S(WL_NAN_FRM_TYPE_RNG_REPORT) + + default: + return "WL_NAN_FRM_TYPE_UNKNOWN"; + } +} + +static const char *nan_event_cause_to_str(u8 cause) +{ + switch (cause) { + C2S(WL_NAN_DP_TERM_WITH_INACTIVITY) + C2S(WL_NAN_DP_TERM_WITH_FSM_DESTROY) + C2S(WL_NAN_DP_TERM_WITH_PEER_DP_END) + C2S(WL_NAN_DP_TERM_WITH_STALE_NDP) + C2S(WL_NAN_DP_TERM_WITH_DISABLE) + C2S(WL_NAN_DP_TERM_WITH_NDI_DEL) + C2S(WL_NAN_DP_TERM_WITH_PEER_HB_FAIL) + C2S(WL_NAN_DP_TERM_WITH_HOST_IOVAR) + C2S(WL_NAN_DP_TERM_WITH_ESTB_FAIL) + C2S(WL_NAN_DP_TERM_WITH_SCHED_REJECT); + break; + + default: + return "WL_NAN_EVENT_CAUSE_UNKNOWN"; + } +} + static int wl_cfgnan_execute_ioctl(struct net_device *ndev, struct bcm_cfg80211 *cfg, bcm_iov_batch_buf_t *nan_buf, uint16 nan_buf_size, uint32 *status, uint8 *resp_buf, @@ -2423,6 +2476,9 @@ wl_cfgnan_check_nan_disable_pending(struct bcm_cfg80211 *cfg, * rely on dhd_stop context to do the nan clean up work and * just do return from delayed WQ based on state check. */ + + DHD_NAN_WAKE_UNLOCK(cfg->pub); + if (is_sync_reqd == true) { cancel_delayed_work_sync(&cfg->nan_disable); } else { @@ -2963,6 +3019,9 @@ wl_cfgnan_delayed_disable(struct work_struct *work) WL_INFORM_MEM(("nan is in disabled state\n")); } rtnl_unlock(); + + DHD_NAN_WAKE_UNLOCK(cfg->pub); + return; } @@ -3420,7 +3479,7 @@ process_resp_buf(void *iov_resp, int wl_cfgnan_cancel_ranging(struct net_device *ndev, - struct bcm_cfg80211 *cfg, uint8 range_id, uint8 flags, uint32 *status) + struct bcm_cfg80211 *cfg, uint8 *range_id, uint8 flags, uint32 *status) { bcm_iov_batch_buf_t *nan_buf = NULL; s32 ret = BCME_OK; @@ -3435,14 +3494,19 @@ wl_cfgnan_cancel_ranging(struct net_device *ndev, NAN_DBG_ENTER(); + if (*range_id == 0) { + WL_ERR(("Invalid Range ID\n")); + ret = BCME_BADARG; + goto fail; + } if (cfg->nancfg.version >= NAN_RANGE_EXT_CANCEL_SUPPORT_VER) { size_of_iov = sizeof(rng_cncl); } else { - size_of_iov = sizeof(range_id); + size_of_iov = sizeof(*range_id); } bzero(&rng_cncl, sizeof(rng_cncl)); - rng_cncl.range_id = range_id; + rng_cncl.range_id = *range_id; rng_cncl.flags = flags; nan_buf = MALLOCZ(cfg->osh, nan_buf_size); @@ -3487,7 +3551,7 @@ wl_cfgnan_cancel_ranging(struct net_device *ndev, &rng_cncl, size_of_iov); } else { (void)memcpy_s(sub_cmd->data, nan_iov_data->nan_iov_len, - &range_id, size_of_iov); + range_id, size_of_iov); } nan_buf->is_set = true; @@ -3496,10 +3560,13 @@ wl_cfgnan_cancel_ranging(struct net_device *ndev, ret = wl_cfgnan_execute_ioctl(ndev, cfg, nan_buf, nan_buf_size, status, (void*)resp_buf, NAN_IOCTL_BUF_SIZE); if (unlikely(ret) || unlikely(*status)) { - WL_ERR(("Range ID %d cancel failed ret %d status %d \n", range_id, ret, *status)); + WL_ERR(("Range ID %d cancel failed ret %d status %d \n", *range_id, ret, *status)); goto fail; } - WL_MEM(("Range cancel with Range ID [%d] successfull\n", range_id)); + WL_MEM(("Range cancel with Range ID [%d] successfull\n", *range_id)); + + /* Resetting range id */ + *range_id = 0; fail: if (nan_buf) { MFREE(cfg->osh, nan_buf, NAN_IOCTL_BUF_SIZE); @@ -3694,8 +3761,8 @@ wl_cfgnan_terminate_directed_rtt_sessions(struct net_device *ndev, for (i = 0; i < NAN_MAX_RANGING_INST; i++) { ranging_inst = &cfg->nan_ranging_info[i]; if (ranging_inst->range_id && ranging_inst->range_type == RTT_TYPE_NAN_DIRECTED) { - if (ranging_inst->range_status == NAN_RANGING_IN_PROGRESS) { - ret = wl_cfgnan_cancel_ranging(ndev, cfg, ranging_inst->range_id, + if (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)) { + ret = wl_cfgnan_cancel_ranging(ndev, cfg, &ranging_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("nan range cancel failed ret = %d status = %d\n", @@ -3728,13 +3795,18 @@ wl_cfgnan_suspend_geofence_rng_session(struct net_device *ndev, nan_ranging_inst_t *ranging_inst = NULL; struct ether_addr* peer_addr = NULL; struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); + int suspend_req_dropped_at = 0; #ifdef RTT_SUPPORT dhd_pub_t *dhd = (struct dhd_pub *)(cfg->pub); rtt_geofence_target_info_t *geofence_target_info; +#endif /* RTT_SUPPORT */ + UNUSED_PARAMETER(suspend_req_dropped_at); +#ifdef RTT_SUPPORT geofence_target_info = dhd_rtt_get_geofence_current_target(dhd); if (!geofence_target_info) { WL_DBG(("No Geofencing Targets, suspend req dropped\n")); + suspend_req_dropped_at = 1; goto exit; } peer_addr = &geofence_target_info->peer_addr; @@ -3742,31 +3814,33 @@ wl_cfgnan_suspend_geofence_rng_session(struct net_device *ndev, if (peer && memcmp(peer_addr, peer, ETHER_ADDR_LEN)) { WL_DBG(("Geofencing Ranging not in progress with given peer," " suspend req dropped\n")); + suspend_req_dropped_at = 2; goto exit; } ranging_inst = wl_cfgnan_check_for_ranging(cfg, peer_addr); if (dhd_rtt_get_geofence_rtt_state(dhd) == FALSE) { WL_DBG(("Geofencing Ranging not in progress, suspend req dropped\n")); + suspend_req_dropped_at = 3; goto exit; } #endif /* RTT_SUPPORT */ if (ranging_inst) { - if (ranging_inst->range_status != NAN_RANGING_IN_PROGRESS) { + if (!NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)) { WL_DBG(("Ranging Inst with peer not in progress, " " suspend req dropped\n")); + suspend_req_dropped_at = 4; goto exit; } cancel_flags |= NAN_RNG_TERM_FLAG_IMMEDIATE; ret = wl_cfgnan_cancel_ranging(ndev, cfg, - ranging_inst->range_id, cancel_flags, &status); + &ranging_inst->range_id, cancel_flags, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("Geofence Range suspended failed, err = %d, status = %d," - " range_id = %d, suspend_reason = %d, " MACDBG " \n", - ret, status, ranging_inst->range_id, - suspend_reason, MAC2STRDBG(peer_addr))); + "suspend_reason = %d, " MACDBG " \n", + ret, status, suspend_reason, MAC2STRDBG(peer_addr))); } ranging_inst->range_status = NAN_RANGING_REQUIRED; WL_INFORM_MEM(("Geofence Range suspended, range_id = %d," @@ -3786,6 +3860,16 @@ exit: wl_cfgnan_disc_result_on_geofence_cancel(cfg, ranging_inst); } + if (suspend_req_dropped_at) { + if (ranging_inst) { + WL_INFORM_MEM(("Ranging Suspend Req with peer: " MACDBG + ", dropped at = %d\n", MAC2STRDBG(&ranging_inst->peer_addr), + suspend_req_dropped_at)); + } else { + WL_INFORM_MEM(("Ranging Suspend Req dropped at = %d\n", + suspend_req_dropped_at)); + } + } return ret; } @@ -3817,11 +3901,6 @@ wl_cfgnan_terminate_ranging_session(struct bcm_cfg80211 *cfg, int8 index; #endif /* RTT_SUPPORT */ - if (ranging_inst->range_id == 0) { - /* Make sure, range inst is valid in caller */ - return; - } - if (ranging_inst->num_svc_ctx != 0) { /* * Make sure to remove all svc_insts for range_inst @@ -3831,9 +3910,9 @@ wl_cfgnan_terminate_ranging_session(struct bcm_cfg80211 *cfg, } /* Cancel Ranging if in progress for rang_inst */ - if (ranging_inst->range_status == NAN_RANGING_IN_PROGRESS) { + if (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)) { ret = wl_cfgnan_cancel_ranging(bcmcfg_to_prmry_ndev(cfg), - cfg, ranging_inst->range_id, + cfg, &ranging_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("%s:nan range cancel failed ret = %d status = %d\n", @@ -3946,11 +4025,9 @@ wl_cfgnan_trigger_geofencing_ranging(struct net_device *dev, goto exit; } - ASSERT(ranging_inst->range_status != - NAN_RANGING_IN_PROGRESS); + ASSERT(!NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)); - if (ranging_inst->range_status != - NAN_RANGING_IN_PROGRESS) { + if (!NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)) { WL_DBG(("Trigger range request with first svc in svc list of range inst\n")); ret = wl_cfgnan_trigger_ranging(bcmcfg_to_prmry_ndev(cfg), cfg, ranging_inst, ranging_inst->svc_idx[0], @@ -4019,8 +4096,8 @@ wl_cfgnan_check_disc_result_for_ranging(struct bcm_cfg80211 *cfg, ASSERT(ranging_inst->range_role != NAN_RANGING_ROLE_INVALID); /* For responder role, range state should be in progress only */ - ASSERT(ranging_inst->range_role == NAN_RANGING_ROLE_INITIATOR || - ranging_inst->range_status == NAN_RANGING_IN_PROGRESS); + ASSERT((ranging_inst->range_role == NAN_RANGING_ROLE_INITIATOR) || + NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)); /* * On rec disc result with ranging required, add target, if @@ -4029,7 +4106,7 @@ wl_cfgnan_check_disc_result_for_ranging(struct bcm_cfg80211 *cfg, */ add_target = ((ranging_inst->range_role == NAN_RANGING_ROLE_RESPONDER) || ((ranging_inst->range_role == NAN_RANGING_ROLE_INITIATOR) && - (ranging_inst->range_status != NAN_RANGING_IN_PROGRESS))); + (!NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)))); if (add_target) { WL_DBG(("Add Range request to geofence target list\n")); #ifdef RTT_SUPPORT @@ -4089,7 +4166,7 @@ wl_cfgnan_ranging_allowed(struct bcm_cfg80211 *cfg) for (i = 0; i < NAN_MAX_RANGING_INST; i++) { ranging_inst = &cfg->nan_ranging_info[i]; - if (ranging_inst->range_status == NAN_RANGING_IN_PROGRESS) { + if (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status)) { rng_progress_count++; } } @@ -4112,12 +4189,12 @@ wl_cfgnan_cancel_rng_responders(struct net_device *ndev, for (i = 0; i < NAN_MAX_RANGING_INST; i++) { ranging_inst = &cfg->nan_ranging_info[i]; - if (ranging_inst->range_status == NAN_RANGING_IN_PROGRESS && - ranging_inst->range_role == NAN_RANGING_ROLE_RESPONDER) { + if (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status) && + (ranging_inst->range_role == NAN_RANGING_ROLE_RESPONDER)) { num_resp_cancelled++; WL_ERR((" Cancelling responder\n")); ret = wl_cfgnan_cancel_ranging(bcmcfg_to_prmry_ndev(cfg), cfg, - ranging_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); + &ranging_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("wl_cfgnan_cancel_rng_responders: Failed to cancel" " existing ranging, ret = (%d)\n", ret)); @@ -4143,16 +4220,26 @@ wl_cfgnan_handle_ranging_ind(struct bcm_cfg80211 *cfg, bool accept = TRUE; nan_ranging_inst_t tmp_rng_inst; struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg); + struct ether_addr * peer_addr = &(rng_ind->peer_m_addr); + uint8 rtt_invalid_state; WL_DBG(("Trigger range response\n")); + /* Check if ranging is allowed */ + rtt_invalid_state = dhd_rtt_invalid_states(ndev, peer_addr); + if (rtt_invalid_state != RTT_STATE_VALID) { + WL_INFORM_MEM(("Cannot allow ranging due to reason %d \n", rtt_invalid_state)); + ret = BCME_NORESOURCE; + goto done; + } + /* check if we are already having any ranging session with peer. * If so below are the policies * If we are already a Geofence Initiator or responder w.r.t the peer * then silently teardown the current session and accept the REQ. * If we are in direct rtt initiator role then reject. */ - ranging_inst = wl_cfgnan_check_for_ranging(cfg, &(rng_ind->peer_m_addr)); + ranging_inst = wl_cfgnan_check_for_ranging(cfg, peer_addr); if (ranging_inst) { if (ranging_inst->range_type == RTT_TYPE_NAN_GEOFENCE || ranging_inst->range_role == NAN_RANGING_ROLE_RESPONDER) { @@ -4169,7 +4256,7 @@ wl_cfgnan_handle_ranging_ind(struct bcm_cfg80211 *cfg, cancel_flags); } else { ret = wl_cfgnan_cancel_ranging(ndev, cfg, - ranging_inst->range_id, cancel_flags, &status); + &ranging_inst->range_id, cancel_flags, &status); if (unlikely(ret)) { WL_ERR(("wl_cfgnan_handle_ranging_ind: Failed to cancel" " existing ranging, ret = (%d)\n", ret)); @@ -4342,8 +4429,8 @@ wl_cfgnan_trigger_ranging(struct net_device *ndev, struct bcm_cfg80211 *cfg, &ranging_inst->range_id, WL_NAN_CMD_RANGE_REQUEST); WL_INFORM_MEM(("ranging instance returned %d\n", ranging_inst->range_id)); } - /* Preventing continuous range requests */ - ranging_inst->range_status = NAN_RANGING_IN_PROGRESS; + /* Move Ranging instance to set up in progress state */ + ranging_inst->range_status = NAN_RANGING_SETUP_IN_PROGRESS; fail: if (nan_buf) { @@ -5031,7 +5118,8 @@ wl_cfgnan_publish_handler(struct net_device *ndev, WL_ERR(("%s: fail to handle pub, ret=%d\n", __FUNCTION__, ret)); goto fail; } - WL_INFORM_MEM(("[NAN] Service published for instance id:%d\n", cmd_data->pub_id)); + WL_INFORM_MEM(("[NAN] Service published for instance id:%d is_update %d\n", + cmd_data->pub_id, cmd_data->svc_update)); fail: NAN_MUTEX_UNLOCK(); @@ -5117,7 +5205,8 @@ wl_cfgnan_subscribe_handler(struct net_device *ndev, WL_ERR(("%s: fail to handle svc, ret=%d\n", __FUNCTION__, ret)); goto fail; } - WL_INFORM_MEM(("[NAN] Service subscribed for instance id:%d\n", cmd_data->sub_id)); + WL_INFORM_MEM(("[NAN] Service subscribed for instance id:%d is_update %d\n", + cmd_data->sub_id, cmd_data->svc_update)); fail: NAN_MUTEX_UNLOCK(); @@ -6117,7 +6206,7 @@ wl_cfgnan_data_path_request_handler(struct net_device *ndev, /* cancel any ongoing RTT session with peer * as we donot support DP and RNG to same peer */ - wl_cfgnan_clear_peer_ranging(cfg, &cmd_data->mac_addr, + wl_cfgnan_handle_dp_ranging_concurrency(cfg, &cmd_data->mac_addr, RTT_GEO_SUSPN_HOST_NDP_TRIGGER); #endif /* RTT_SUPPORT */ @@ -6310,8 +6399,9 @@ wl_cfgnan_data_path_request_handler(struct net_device *ndev, ret = wl_cfgnan_execute_ioctl(ndev, cfg, nan_buf, data_size, &(cmd_data->status), resp_buf, data_size + NAN_IOVAR_NAME_SIZE); if (unlikely(ret) || unlikely(cmd_data->status)) { - WL_ERR(("nan data path request handler failed, ret = %d status %d\n", - ret, cmd_data->status)); + WL_ERR(("nan data path request handler failed, ret = %d," + " status %d, peer: " MACDBG "\n", + ret, cmd_data->status, MAC2STRDBG(&(cmd_data->mac_addr)))); goto fail; } @@ -6321,8 +6411,8 @@ wl_cfgnan_data_path_request_handler(struct net_device *ndev, ndp_instance_id, WL_NAN_CMD_DATA_DATAREQ); cmd_data->ndp_instance_id = *ndp_instance_id; } - WL_INFORM_MEM(("[NAN] DP request successfull (ndp_id:%d)\n", - cmd_data->ndp_instance_id)); + WL_INFORM_MEM(("[NAN] DP request successfull (ndp_id:%d), peer: " MACDBG " \n", + cmd_data->ndp_instance_id, MAC2STRDBG(&cmd_data->mac_addr))); /* Add peer to data ndp peer list */ wl_cfgnan_data_add_peer(cfg, &datareq->peer_mac); @@ -6443,6 +6533,13 @@ wl_cfgnan_data_path_response_handler(struct net_device *ndev, /* Interface is not mandatory, when it is a reject from framework */ if (dataresp->status != WL_NAN_DP_STATUS_REJECTED) { +#ifdef RTT_SUPPORT + /* cancel any ongoing RTT session with peer + * as we donot support DP and RNG to same peer + */ + wl_cfgnan_handle_dp_ranging_concurrency(cfg, &cmd_data->mac_addr, + RTT_GEO_SUSPN_HOST_NDP_TRIGGER); +#endif /* RTT_SUPPORT */ /* Retrieve mac from given iface name */ wdev = wl_cfg80211_get_wdev_from_ifname(cfg, (char *)cmd_data->ndp_iface); @@ -6792,34 +6889,67 @@ fail: #ifdef RTT_SUPPORT static s32 wl_cfgnan_clear_peer_ranging(struct bcm_cfg80211 *cfg, - struct ether_addr *peer, int reason) + nan_ranging_inst_t *rng_inst, int reason) { uint32 status = 0; - nan_ranging_inst_t *rng_inst = NULL; int err = BCME_OK; struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg); dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub); - rng_inst = wl_cfgnan_check_for_ranging(cfg, peer); - if (rng_inst) { if (rng_inst->range_type == RTT_TYPE_NAN_GEOFENCE) { err = wl_cfgnan_suspend_geofence_rng_session(ndev, - peer, reason, 0); + &rng_inst->peer_addr, reason, 0); } else { if (rng_inst->range_type == RTT_TYPE_NAN_DIRECTED) { dhd_rtt_handle_nan_rtt_session_end(dhdp, - peer); + &rng_inst->peer_addr); } /* responder */ err = wl_cfgnan_cancel_ranging(ndev, cfg, - rng_inst->range_id, + &rng_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); + WL_INFORM_MEM(("Removing Ranging Instance " MACDBG " reason %d\n", + MAC2STRDBG(&(rng_inst->peer_addr)), reason)); bzero(rng_inst, sizeof(*rng_inst)); + } + + if (err) { + WL_ERR(("Failed to stop ranging with peer, err : %d\n", err)); + } + + return err; +} +/* + * Handle NDP-Ranging Concurrency, + * for incoming DP Reuest + * Cancel Ranging with same peer + * Cancel Ranging for set up in prog + * for all other peers + */ +static s32 +wl_cfgnan_handle_dp_ranging_concurrency(struct bcm_cfg80211 *cfg, + struct ether_addr *peer, int reason) +{ + uint8 i = 0; + nan_ranging_inst_t *cur_rng_inst = NULL; + nan_ranging_inst_t *rng_inst = NULL; + int err = BCME_OK; + + cur_rng_inst = wl_cfgnan_check_for_ranging(cfg, peer); + + for (i = 0; i < NAN_MAX_RANGING_INST; i++) { + rng_inst = &cfg->nan_ranging_info[i]; + if (rng_inst->in_use) { + if ((cur_rng_inst && cur_rng_inst == rng_inst) || + NAN_RANGING_SETUP_IS_IN_PROG(rng_inst->range_status)) { + err = wl_cfgnan_clear_peer_ranging(cfg, rng_inst, + RTT_GEO_SUSPN_HOST_NDP_TRIGGER); + } } } if (err) { - WL_ERR(("Failed to stop ranging with peer %d\n", err)); + WL_ERR(("Failed to handle dp ranging concurrency, err : %d\n", err)); } return err; @@ -6917,7 +7047,7 @@ wl_nan_dp_cmn_event_data(struct bcm_cfg80211 *cfg, void *event_data, /* cancel any ongoing RTT session with peer * as we donot support DP and RNG to same peer */ - wl_cfgnan_clear_peer_ranging(cfg, &ev_dp->peer_nmi, + wl_cfgnan_handle_dp_ranging_concurrency(cfg, &ev_dp->peer_nmi, RTT_GEO_SUSPN_PEER_NDP_TRIGGER); #endif /* RTT_SUPPORT */ ret = BCME_OK; @@ -6996,9 +7126,10 @@ wl_nan_dp_cmn_event_data(struct bcm_cfg80211 *cfg, void *event_data, /* Remove peer from data ndp peer list */ wl_cfgnan_data_remove_peer(cfg, &ev_dp->peer_nmi); wl_cfgnan_update_dp_info(cfg, false, nan_event_data->ndp_id); + WL_INFORM_MEM(("DP_END for REMOTE_NMI: " MACDBG " with %s\n", + MAC2STRDBG(&ev_dp->peer_nmi), + nan_event_cause_to_str(ev_dp->event_cause))); #ifdef RTT_SUPPORT - WL_INFORM_MEM(("DP_END for REMOTE_NMI: " MACDBG "\n", - MAC2STRDBG(&ev_dp->peer_nmi))); rng_inst = wl_cfgnan_check_for_ranging(cfg, &ev_dp->peer_nmi); if (rng_inst) { /* Trigger/Reset geofence RTT */ @@ -7033,11 +7164,6 @@ wl_cfgnan_check_ranging_cond(nan_svc_info_t *svc_info, uint32 distance, uint32 ingress_limit = svc_info->ingress_limit; uint32 egress_limit = svc_info->egress_limit; - WL_DBG(("wl_cfgnan_check_ranging_cond: Checking the svc ranging cnd %d" - " distance %d prev_distance %d, range_rep_ev_once %d\n", - svc_ind, distance, prev_distance, range_rep_ev_once)); - WL_DBG(("wl_cfgnan_check_ranging_cond: Checking the SVC ingress and" - " egress limits %d %d\n", ingress_limit, egress_limit)); if (svc_ind & NAN_RANGE_INDICATION_CONT) { *ranging_ind = NAN_RANGE_INDICATION_CONT; notify = TRUE; @@ -7053,10 +7179,10 @@ wl_cfgnan_check_ranging_cond(nan_svc_info_t *svc_info, uint32 distance, (!IN_GEOFENCE(ingress_limit, egress_limit, prev_distance))) { notify = TRUE; - if (distance < ingress_limit) { - *ranging_ind = NAN_RANGE_INDICATION_INGRESS; - } else { + if (distance > prev_distance) { *ranging_ind = NAN_RANGE_INDICATION_EGRESS; + } else { + *ranging_ind = NAN_RANGE_INDICATION_INGRESS; } WL_ERR(("\n%s :Svc has geofence Ind %d res_ind %d\n", __FUNCTION__, __LINE__, *ranging_ind)); @@ -7092,6 +7218,10 @@ wl_cfgnan_check_ranging_cond(nan_svc_info_t *svc_info, uint32 distance, goto done; } done: + WL_INFORM_MEM(("SVC ranging Ind %d distance %d prev_distance %d, " + "range_rep_ev_once %d ingress_limit %d egress_limit %d notify %d\n", + svc_ind, distance, prev_distance, range_rep_ev_once, + ingress_limit, egress_limit, notify)); svc_info->svc_range_status |= SVC_RANGE_REP_EVENT_ONCE; return notify; } @@ -7116,26 +7246,29 @@ wl_cfgnan_notify_disc_with_ranging(struct bcm_cfg80211 *cfg, nan_ranging_inst_t *rng_inst, nan_event_data_t *nan_event_data, uint32 distance) { nan_svc_info_t *svc_info; - bool notify_svc = FALSE; + bool notify_svc = TRUE; nan_disc_result_cache *disc_res = cfg->nan_disc_cache; uint8 ranging_ind = 0; int ret = BCME_OK; int i = 0, j = 0; + uint8 result_present = nan_event_data->ranging_result_present; for (i = 0; i < MAX_SUBSCRIBES; i++) { svc_info = rng_inst->svc_idx[i]; - if (svc_info) { - if (nan_event_data->ranging_result_present) { + if (svc_info && svc_info->ranging_required) { + /* if ranging_result is present notify disc result if + * result satisfies the conditions. + * if ranging_result is not present, then notify disc + * result with out ranging info. + */ + if (result_present) { notify_svc = wl_cfgnan_check_ranging_cond(svc_info, distance, - &ranging_ind, rng_inst->prev_distance_mm); + &ranging_ind, rng_inst->prev_distance_mm); nan_event_data->ranging_ind = ranging_ind; - } else { - /* Report only if ranging was needed */ - notify_svc = svc_info->ranging_required; } - WL_DBG(("wl_cfgnan_notify_disc_with_ranging: Ranging notify for" - " svc_id %d, notify %d and ind %d\n", - svc_info->svc_id, notify_svc, ranging_ind)); + WL_INFORM_MEM(("Ranging notify for svc_id %d, notify %d and ind %d" + " distance_mm %d result_present %d\n", svc_info->svc_id, notify_svc, + ranging_ind, distance, result_present)); } else { continue; } @@ -7164,17 +7297,16 @@ wl_cfgnan_notify_disc_with_ranging(struct bcm_cfg80211 *cfg, #ifdef RTT_SUPPORT static int32 wl_cfgnan_handle_directed_rtt_report(struct bcm_cfg80211 *cfg, - nan_ranging_inst_t *rng_inst, uint8 rng_id) + nan_ranging_inst_t *rng_inst) { int ret = BCME_OK; uint32 status; dhd_pub_t *dhd = (struct dhd_pub *)(cfg->pub); ret = wl_cfgnan_cancel_ranging(bcmcfg_to_prmry_ndev(cfg), cfg, - rng_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); + &rng_inst->range_id, NAN_RNG_TERM_FLAG_IMMEDIATE, &status); if (unlikely(ret) || unlikely(status)) { - WL_ERR(("%s:nan range cancel failed ret = %d status = %d\n", - __FUNCTION__, ret, status)); + WL_ERR(("nan range cancel failed ret = %d status = %d\n", ret, status)); } dhd_rtt_handle_nan_rtt_session_end(dhd, &rng_inst->peer_addr); @@ -7255,7 +7387,7 @@ wl_cfgnan_process_range_report(struct bcm_cfg80211 *cfg, rng_inst, RTT_SCHED_RNG_RPT_GEOFENCE); } } else if (rng_inst->range_type == RTT_TYPE_NAN_DIRECTED) { - wl_cfgnan_handle_directed_rtt_report(cfg, rng_inst, range_res->rng_id); + wl_cfgnan_handle_directed_rtt_report(cfg, rng_inst); } exit: @@ -7266,37 +7398,22 @@ exit: static void wl_nan_print_status(wl_nan_conf_status_t *nstatus) { - printf("> enabled: %d\n", nstatus->enabled); - printf("> Current NMI: " MACDBG "\n", MAC2STRDBG(nstatus->nmi.octet)); - printf("> Current cluster_id: " MACDBG "\n", MAC2STRDBG(nstatus->cid.octet)); + WL_INFORM_MEM(("> NMI: " MACDBG " Cluster_ID: " MACDBG "\n", + MAC2STRDBG(nstatus->nmi.octet), + MAC2STRDBG(nstatus->cid.octet))); - switch (nstatus->role) { - case WL_NAN_ROLE_AUTO: - printf("> role: %s (%d)\n", "auto", nstatus->role); - break; - case WL_NAN_ROLE_NON_MASTER_NON_SYNC: - printf("> role: %s (%d)\n", "non-master-non-sync", nstatus->role); - break; - case WL_NAN_ROLE_NON_MASTER_SYNC: - printf("> role: %s (%d)\n", "non-master-sync", nstatus->role); - break; - case WL_NAN_ROLE_MASTER: - printf("> role: %s (%d)\n", "master", nstatus->role); - break; - case WL_NAN_ROLE_ANCHOR_MASTER: - printf("> role: %s (%d)\n", "anchor-master", nstatus->role); - break; - default: - printf("> role: %s (%d)\n", "undefined", nstatus->role); - break; - } + WL_INFORM_MEM(("> NAN Device Role %s\n", nan_role_to_str(nstatus->role))); + WL_INFORM_MEM(("> Social channels: %d, %d\n", + nstatus->social_chans[0], nstatus->social_chans[1])); - printf("> social channels: %d, %d\n", - nstatus->social_chans[0], nstatus->social_chans[1]); - printf("> master_rank: " NMRSTR "\n", NMR2STR(nstatus->mr)); - printf("> amr : " NMRSTR "\n", NMR2STR(nstatus->amr)); - printf("> hop_count: %d\n", nstatus->hop_count); - printf("> ambtt: %d\n", nstatus->ambtt); + WL_INFORM_MEM(("> Master_rank: " NMRSTR " AMR : " NMRSTR " Hop Count : %d, AMBTT : %d\n", + NMR2STR(nstatus->mr), + NMR2STR(nstatus->amr), + nstatus->hop_count, + nstatus->ambtt)); + + WL_INFORM_MEM(("> Cluster TSF_H: %x , Cluster TSF_L: %x\n", + nstatus->cluster_tsf_h, nstatus->cluster_tsf_l)); } static void @@ -7348,14 +7465,15 @@ wl_cfgnan_reset_geofence_ranging(struct bcm_cfg80211 *cfg, int8 index = DHD_RTT_INVALID_TARGET_INDEX; bool geofence_state = dhd_rtt_get_geofence_rtt_state(dhd); bool retry = FALSE; + nan_ranging_inst_t *lrng_inst = NULL; + int i; - WL_INFORM_MEM(("wl_cfgnan_reset_geofence_ranging, sched_reason = %d, cur_idx = %d, " - "geofence_interval = %d\n", sched_reason, rtt_status->geofence_cfg.cur_target_idx, + WL_INFORM_MEM(("sched_reason = %d, cur_idx = %d, geofence_interval = %d\n", + sched_reason, rtt_status->geofence_cfg.cur_target_idx, rtt_status->geofence_cfg.geofence_rtt_interval)); cur_idx = dhd_rtt_get_geofence_cur_target_idx(dhd); if (cur_idx == -1) { - WL_INFORM_MEM(("wl_cfgnan_reset_geofence_ranging, " - "Removing Ranging Instance " MACDBG "\n", + WL_INFORM_MEM(("Removing Ranging Instance " MACDBG "\n", MAC2STRDBG(&(rng_inst->peer_addr)))); bzero(rng_inst, sizeof(*rng_inst)); /* Cancel pending retry timer if any */ @@ -7372,7 +7490,7 @@ wl_cfgnan_reset_geofence_ranging(struct bcm_cfg80211 *cfg, dhd_rtt_get_geofence_target(dhd, &rng_inst->peer_addr, &index); if ((sched_reason == RTT_SCHED_RTT_RETRY_GEOFENCE) && - (rng_inst->range_status == NAN_RANGING_IN_PROGRESS)) { + (NAN_RANGING_IS_IN_PROG(rng_inst->range_status))) { /* if we are already inprogress with peer * (responder or directed RTT initiator) * retyr later if sched_reason = timeout @@ -7427,6 +7545,22 @@ wl_cfgnan_reset_geofence_ranging(struct bcm_cfg80211 *cfg, retry = TRUE; } + if (sched_reason == RTT_SCHED_RTT_RETRY_GEOFENCE) { + /* + * In case of retry, check for running responder ranging, + * and retry later if any, in progress + */ + for (i = 0; i < NAN_MAX_RANGING_INST; i++) { + lrng_inst = &cfg->nan_ranging_info[i]; + if (lrng_inst->in_use && + (lrng_inst->range_role == NAN_RANGING_ROLE_RESPONDER) && + (NAN_RANGING_IS_IN_PROG(lrng_inst->range_status))) { + retry = TRUE; + break; + } + } + } + if (retry && (rtt_status->geofence_cfg.geofence_rtt_interval >= 0)) { /* Move to first target and retry over a timer */ WL_DBG(("Retry over a timer, cur_idx = %d\n", @@ -7465,6 +7599,14 @@ wl_cfgnan_reset_geofence_ranging_for_cur_target(dhd_pub_t *dhd, int sched_reason WL_DBG(("reset ranging request dropped: ranging instance null\n")); goto exit; } + + if (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status) && + (ranging_inst->range_type == RTT_TYPE_NAN_GEOFENCE)) { + WL_DBG(("Ranging is already in progress for Current target " + MACDBG " \n", MAC2STRDBG(&ranging_inst->peer_addr))); + goto exit; + } + wl_cfgnan_reset_geofence_ranging(cfg, ranging_inst, sched_reason); exit: @@ -7556,8 +7698,9 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, ret = -EINVAL; goto exit; } - WL_DBG((">> Nan Event Received: %s (num=%d, len=%d)\n", - nan_event_to_str(event_num), event_num, data_len)); + + WL_INFORM_MEM((">> Nan Event Received: %s (num=%d, len=%d)\n", + nan_event_to_str(event_num), event_num, data_len)); #ifdef WL_NAN_DEBUG prhex("nan_event_data:", event_data, data_len); @@ -7606,9 +7749,10 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, goto exit; } nan_event_data->nan_de_evt_type = event_num; -#ifdef WL_NAN_DEBUG - wl_nan_print_status(nstatus); -#endif /* WL_NAN_DEBUG */ + if (event_num == WL_NAN_EVENT_ROLE) { + wl_nan_print_status(nstatus); + } + if (event_num == WL_NAN_EVENT_START) { OSL_SMP_WMB(); cfg->nancfg.nan_event_recvd = true; @@ -7684,8 +7828,8 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, wl_nan_event_txs_t *txs = (wl_nan_event_txs_t *)xtlv->data; wl_nan_event_sd_txs_t *txs_sd = NULL; if (txs->status == WL_NAN_TXS_SUCCESS) { - WL_INFORM_MEM(("TXS success for type %d token %d\n", - txs->type, txs->host_seq)); + WL_INFORM_MEM(("TXS success for type %s(%d) token %d\n", + nan_frm_type_to_str(txs->type), txs->type, txs->host_seq)); nan_event_data->status = NAN_STATUS_SUCCESS; ret = memcpy_s(nan_event_data->nan_reason, sizeof(nan_event_data->nan_reason), @@ -7699,8 +7843,9 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, /* TODO : populate status based on reason codes For now adding it as no ACK, so that app/framework can retry */ - WL_INFORM_MEM(("TXS failed for type %d status %d token %d\n", - txs->type, txs->status, txs->host_seq)); + WL_INFORM_MEM(("TXS failed for type %s(%d) status %d token %d\n", + nan_frm_type_to_str(txs->type), txs->type, txs->status, + txs->host_seq)); nan_event_data->status = NAN_STATUS_NO_OTA_ACK; ret = memcpy_s(nan_event_data->nan_reason, sizeof(nan_event_data->nan_reason), @@ -7724,6 +7869,24 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, ret = -EINVAL; goto exit; } + } else if (txs->type == WL_NAN_FRM_TYPE_RNG_RESP) { + xtlv = (bcm_xtlv_t *)(txs->opt_tlvs); + if (txs->opt_tlvs_len && xtlv->id == WL_NAN_XTLV_RNG_TXS) { + wl_nan_range_txs_t* txs_rng_resp = (wl_nan_range_txs_t*)xtlv->data; + nan_ranging_inst_t *rng_inst = + wl_cfgnan_get_rng_inst_by_id(cfg, txs_rng_resp->range_id); + if (rng_inst && + NAN_RANGING_SETUP_IS_IN_PROG(rng_inst->range_status)) { + /* range set up is over now, move to range in progress */ + rng_inst->range_status = NAN_RANGING_SESSION_IN_PROGRESS; + WL_DBG(("Txs for range resp, rng_id = %d\n", + rng_inst->range_id)); + } + } else { + WL_ERR(("Invalid params in TX status for range response")); + ret = -EINVAL; + goto exit; + } } else { /* TODO: add for other frame types if required */ ret = -EINVAL; goto exit; @@ -7753,6 +7916,9 @@ wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, (xtlv_len >= sizeof(*cache_entry))) { cache_entry = &cache_data->cache_exp_list[entry_idx]; /* Handle ranging cases for cache timeout */ + WL_INFORM_MEM(("WL_NAN_EVENT_DISC_CACHE_TIMEOUT peer: " MACDBG + " l_id:%d r_id:%d\n", MAC2STRDBG(&cache_entry->r_nmi_addr), + cache_entry->l_sub_id, cache_entry->r_pub_id)); wl_cfgnan_ranging_clear_publish(cfg, &cache_entry->r_nmi_addr, cache_entry->l_sub_id); /* Invalidate local cache info */ diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.h b/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.h index 78c9457f9803..91481632a30f 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgnan.h @@ -1,7 +1,7 @@ /* * Neighbor Awareness Networking * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_cfgnan.h 854674 2019-12-10 03:31:41Z $ + * $Id: wl_cfgnan.h 863133 2020-02-06 10:16:12Z $ */ #ifndef _wl_cfgnan_h_ @@ -73,7 +73,7 @@ #define WL_AVAIL_BANDWIDTH_5G WL_CHANSPEC_BW_80 #define NAN_RANGING_PERIOD WL_AVAIL_PERIOD_1024 #define NAN_SYNC_DEF_AWAKE_DW 1 -#define NAN_RNG_TERM_FLAG_NONE 0 +#define NAN_RNG_TERM_FLAG_NONE 0 #define NAN_BLOOM_LENGTH_DEFAULT 240u #define NAN_SRF_MAX_MAC (NAN_BLOOM_LENGTH_DEFAULT / ETHER_ADDR_LEN) @@ -165,7 +165,8 @@ #define NAN_SVC_INST_SIZE 32u #define NAN_START_STOP_TIMEOUT 5000 #define NAN_MAX_NDP_PEER 8u -#define NAN_DISABLE_CMD_DELAY 2000u +#define NAN_DISABLE_CMD_DELAY 530u +#define NAN_WAKELOCK_TIMEOUT (NAN_DISABLE_CMD_DELAY + 100u) #define NAN_NMI_RAND_PVT_CMD_VENDOR (1 << 31) #define NAN_NMI_RAND_CLUSTER_MERGE_ENAB (1 << 30) @@ -216,6 +217,9 @@ #define NAN_RNG_REQ_ACCEPTED_BY_HOST 1 #define NAN_RNG_REQ_REJECTED_BY_HOST 0 +#define NAN_RNG_REQ_ACCEPTED_BY_PEER 0 +#define NAN_RNG_REQ_REJECTED_BY_PEER 1 + #define NAN_RNG_GEOFENCE_MAX_RETRY_CNT 3u /* @@ -230,7 +234,8 @@ typedef uint32 nan_data_path_id; typedef enum nan_range_status { NAN_RANGING_INVALID = 0, NAN_RANGING_REQUIRED = 1, - NAN_RANGING_IN_PROGRESS = 2 + NAN_RANGING_SETUP_IN_PROGRESS = 2, + NAN_RANGING_SESSION_IN_PROGRESS = 3 } nan_range_status_t; typedef enum nan_range_role { @@ -250,6 +255,13 @@ typedef struct nan_svc_inst { /* Range Status Flag bits for svc info */ #define SVC_RANGE_REP_EVENT_ONCE 0x01 +#define NAN_RANGING_SETUP_IS_IN_PROG(status) \ + ((status) == NAN_RANGING_SETUP_IN_PROGRESS) + +#define NAN_RANGING_IS_IN_PROG(status) \ + (((status) == NAN_RANGING_SETUP_IN_PROGRESS) || \ + ((status) == NAN_RANGING_SESSION_IN_PROGRESS)) + typedef struct nan_svc_info { bool valid; nan_data_path_id ndp_id[NAN_MAX_SVC_INST]; @@ -764,7 +776,7 @@ void wl_cfgnan_process_range_report(struct bcm_cfg80211 *cfg, wl_nan_ev_rng_rpt_ind_t *range_res); #endif /* RTT_SUPPORT */ int wl_cfgnan_cancel_ranging(struct net_device *ndev, - struct bcm_cfg80211 *cfg, uint8 range_id, uint8 flags, uint32 *status); + struct bcm_cfg80211 *cfg, uint8 *range_id, uint8 flags, uint32 *status); bool wl_cfgnan_ranging_allowed(struct bcm_cfg80211 *cfg); uint8 wl_cfgnan_cancel_rng_responders(struct net_device *ndev, struct bcm_cfg80211 *cfg); diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.c index c1adc4cc7ac5..802eeb5cd3e6 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.c @@ -1,7 +1,7 @@ /* * Linux cfgp2p driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.h b/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.h index a045c4f3f7bc..1d70b1c64224 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgp2p.h @@ -1,7 +1,7 @@ /* * Linux cfgp2p driver * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.c index b065f6c08edb..46665c3067dc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 driver scan related code * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.h b/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.h index 79e51b6b6ea6..b593e6604f1d 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgscan.h @@ -1,7 +1,7 @@ /* * Header for Linux cfg80211 scan * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.c b/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.c index f4c9947e5dc4..a533a27a4dd0 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.c @@ -1,7 +1,7 @@ /* * Linux cfg80211 Vendor Extension Code * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you @@ -24,7 +24,7 @@ * * <> * - * $Id: wl_cfgvendor.c 854674 2019-12-10 03:31:41Z $ + * $Id: wl_cfgvendor.c 863133 2020-02-06 10:16:12Z $ */ /* @@ -1516,6 +1516,7 @@ wl_cfgvendor_set_hal_started(struct wiphy *wiphy, dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub); int ret; #endif /* WL_STA_ASSOC_RAND */ + RETURN_EIO_IF_NOT_UP(cfg); WL_INFORM(("%s,[DUMP] HAL STARTED\n", __FUNCTION__)); cfg->hal_started = true; @@ -5668,29 +5669,36 @@ wl_cfgvendor_terminate_dp_rng_sessions(struct bcm_cfg80211 *cfg, uint8 i = 0; int status = BCME_ERROR; nan_ranging_inst_t *ranging_inst = NULL; + dhd_pub_t *dhdp = wl_cfg80211_get_dhdp(wdev->netdev); + *ssn_exists = false; /* Cleanup active Data Paths If any */ for (i = 0; i < NAN_MAX_NDP_PEER; i++) { if (cfg->nancfg.ndp_id[i]) { - *ssn_exists = true; WL_DBG(("Found entry of ndp id = [%d], end dp associated to it\n", cfg->nancfg.ndp_id[i])); - wl_cfgnan_data_path_end_handler(wdev->netdev, cfg, + ret = wl_cfgnan_data_path_end_handler(wdev->netdev, cfg, cfg->nancfg.ndp_id[i], &status); + if ((ret == BCME_OK) && cfg->nan_enable && + dhdp->up) { + *ssn_exists = true; + } } } /* Cancel ranging sessiosns */ for (i = 0; i < NAN_MAX_RANGING_INST; i++) { ranging_inst = &cfg->nan_ranging_info[i]; - if (ranging_inst->range_id) { - *ssn_exists = true; + if (ranging_inst->in_use && + (NAN_RANGING_IS_IN_PROG(ranging_inst->range_status))) { ret = wl_cfgnan_cancel_ranging(bcmcfg_to_prmry_ndev(cfg), cfg, - ranging_inst->range_id, - NAN_RNG_TERM_FLAG_NONE, &status); + &ranging_inst->range_id, + NAN_RNG_TERM_FLAG_NONE, &status); if (unlikely(ret) || unlikely(status)) { WL_ERR(("nan range cancel failed ret = %d status = %d\n", - ret, status)); + ret, status)); + } else { + *ssn_exists = true; } } } @@ -5727,6 +5735,7 @@ wl_cfgvendor_nan_stop_handler(struct wiphy *wiphy, */ WL_INFORM_MEM(("Schedule Nan Disable Req with NAN_DISABLE_CMD_DELAY\n")); delay_ms = NAN_DISABLE_CMD_DELAY; + DHD_NAN_WAKE_LOCK_TIMEOUT(cfg->pub, NAN_WAKELOCK_TIMEOUT); } else { delay_ms = 0; } @@ -6327,7 +6336,6 @@ static int wl_cfgvendor_lstats_get_info(struct wiphy *wiphy, int err = 0, i; wifi_radio_stat *radio; wifi_radio_stat_h radio_h; - wl_wme_cnt_t *wl_wme_cnt; const wl_cnt_wlc_t *wlc_cnt; scb_val_t scbval; char *output = NULL; @@ -6389,38 +6397,11 @@ static int wl_cfgvendor_lstats_get_info(struct wiphy *wiphy, output += sizeof(wifi_radio_stat_h); output += (NUM_CHAN * sizeof(wifi_channel_stat)); - err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "wme_counters", NULL, 0, - iovar_buf, WLC_IOCTL_MAXLEN, NULL); - if (unlikely(err)) { - WL_ERR(("error (%d)\n", err)); - goto exit; - } - wl_wme_cnt = (wl_wme_cnt_t *)iovar_buf; - COMPAT_BZERO_IFACE(wifi_iface_stat, iface); COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VO].ac, WIFI_AC_VO); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VO].tx_mpdu, wl_wme_cnt->tx[AC_VO].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VO].rx_mpdu, wl_wme_cnt->rx[AC_VO].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VO].mpdu_lost, - wl_wme_cnt->tx_failed[WIFI_AC_VO].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VI].ac, WIFI_AC_VI); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VI].tx_mpdu, wl_wme_cnt->tx[AC_VI].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VI].rx_mpdu, wl_wme_cnt->rx[AC_VI].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_VI].mpdu_lost, - wl_wme_cnt->tx_failed[WIFI_AC_VI].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].ac, WIFI_AC_BE); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].tx_mpdu, wl_wme_cnt->tx[AC_BE].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].rx_mpdu, wl_wme_cnt->rx[AC_BE].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].mpdu_lost, - wl_wme_cnt->tx_failed[WIFI_AC_BE].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BK].ac, WIFI_AC_BK); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BK].tx_mpdu, wl_wme_cnt->tx[AC_BK].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BK].rx_mpdu, wl_wme_cnt->rx[AC_BK].packets); - COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BK].mpdu_lost, - wl_wme_cnt->tx_failed[WIFI_AC_BK].packets); err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "counters", NULL, 0, iovar_buf, WLC_IOCTL_MAXLEN, NULL); @@ -6466,10 +6447,18 @@ static int wl_cfgvendor_lstats_get_info(struct wiphy *wiphy, if_stats->version)); goto exit; } + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].tx_mpdu, + (uint32)(if_stats->txfrmsnt - if_stats->txmulti)); + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].rx_mpdu, (uint32)if_stats->rxframe); + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].mpdu_lost, (uint32)if_stats->txfail); COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].retries, (uint32)if_stats->txretrans); } else #endif /* !DISABLE_IF_COUNTERS */ { + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].tx_mpdu, + (wlc_cnt->txfrmsnt - wlc_cnt->txmulti)); + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].rx_mpdu, wlc_cnt->rxframe); + COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].mpdu_lost, wlc_cnt->txfail); COMPAT_ASSIGN_VALUE(iface, ac[WIFI_AC_BE].retries, wlc_cnt->txretrans); } diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.h b/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.h index d437aa2d146f..467c92f397ad 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.h +++ b/drivers/net/wireless/bcmdhd_100_15/wl_cfgvendor.h @@ -1,7 +1,7 @@ /* * Linux cfg80211 Vendor Extension Code * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_linux_mon.c b/drivers/net/wireless/bcmdhd_100_15/wl_linux_mon.c index 4f5603e0937d..b7cccfd502fd 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_linux_mon.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_linux_mon.c @@ -1,7 +1,7 @@ /* * Broadcom Dongle Host Driver (DHD), Linux monitor network interface * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wl_roam.c b/drivers/net/wireless/bcmdhd_100_15/wl_roam.c index 838c28b5c042..2d4eca3a46f1 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wl_roam.c +++ b/drivers/net/wireless/bcmdhd_100_15/wl_roam.c @@ -1,7 +1,7 @@ /* * Linux roam cache * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wlc_types.h b/drivers/net/wireless/bcmdhd_100_15/wlc_types.h index eae02639abb5..e748ac30c54a 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wlc_types.h +++ b/drivers/net/wireless/bcmdhd_100_15/wlc_types.h @@ -1,7 +1,7 @@ /* * Forward declarations for commonly used wl driver structs * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wldev_common.c b/drivers/net/wireless/bcmdhd_100_15/wldev_common.c index 33213304e1f4..de368dc040fc 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wldev_common.c +++ b/drivers/net/wireless/bcmdhd_100_15/wldev_common.c @@ -1,7 +1,7 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/net/wireless/bcmdhd_100_15/wldev_common.h b/drivers/net/wireless/bcmdhd_100_15/wldev_common.h index c8160888a66e..701455ea26c2 100644 --- a/drivers/net/wireless/bcmdhd_100_15/wldev_common.h +++ b/drivers/net/wireless/bcmdhd_100_15/wldev_common.h @@ -1,7 +1,7 @@ /* * Common function shared by Linux WEXT, cfg80211 and p2p drivers * - * Copyright (C) 1999-2019, Broadcom. + * Copyright (C) 1999-2020, Broadcom. * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 444004818c3c..4f01a72c4633 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -106,7 +107,6 @@ static void dbg(const char *fmt, ...) #define BT_UART_DIVSLOT (3) #define BT_UART_TRACE 1 -#define LOG_BUFFER_SIZE (0xC8000) /* Allocate 800KB of buffer */ #define PROC_DIR "bluetooth/uart" #define BLUETOOTH_UART_PORT_LINE 1 /* macros to change one thing to another */ @@ -126,10 +126,14 @@ EXPORT_SYMBOL_GPL(s3c2410_serial_wake_peer); #define RTS_PINCTRL (1) #define DEFAULT_PINCTRL (0) -struct s3c24xx_uart_port *panic_port; +unsigned char uart_log_buf[256] = {0, }; void s3c24xx_serial_rx_fifo_wait(void); +/* Allocate 800KB of buffer for UART logging */ +#define LOG_BUFFER_SIZE (0xC8000) +struct s3c24xx_uart_port *panic_port; + static int exynos_s3c24xx_panic_handler(struct notifier_block *nb, unsigned long l, void *p) { @@ -202,6 +206,14 @@ static void change_uart_gpio(int value, struct s3c24xx_uart_port *ourport) int status = 0; if (value) { + if (!IS_ERR(ourport->uart_pinctrl_tx_dat)) { + ourport->default_uart_pinctrl->state = NULL; + status = pinctrl_select_state(ourport->default_uart_pinctrl, ourport->uart_pinctrl_tx_dat); + if (status) + dev_err(ourport->port.dev, "Can't set TXD uart pins!!!\n"); + else + udelay(10); + } if (!IS_ERR(ourport->uart_pinctrl_rts)) { ourport->default_uart_pinctrl->state = NULL; status = pinctrl_select_state(ourport->default_uart_pinctrl, ourport->uart_pinctrl_rts); @@ -582,6 +594,9 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id) spin_lock_irqsave(&port->lock, flags); + __set_bit(S3C64XX_UINTM_RXD, portaddrl(port, S3C64XX_UINTM)); + wr_regl(port, S3C64XX_UINTP, S3C64XX_UINTM_RXD_MSK); + while (max_count-- > 0) { /* * Receive all characters known to be in FIFO @@ -590,10 +605,8 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id) if (fifocnt == 0) { ufstat = rd_regl(port, S3C2410_UFSTAT); fifocnt = s3c24xx_serial_rx_fifocnt(ourport, ufstat); - if (fifocnt == 0) { - wr_regl(port, S3C64XX_UINTP, S3C64XX_UINTM_RXD_MSK); + if (fifocnt == 0) break; - } } fifocnt--; @@ -679,12 +692,21 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id) if (ourport->uart_logging && trace_cnt) uart_copy_to_local_buf(1, &ourport->uart_local_buf, trace_buf, trace_cnt); + __clear_bit(S3C64XX_UINTM_RXD, portaddrl(port, S3C64XX_UINTM)); + spin_unlock_irqrestore(&port->lock, flags); tty_insert_flip_string(&port->state->port, insert_buf, insert_cnt); tty_flip_buffer_push(&port->state->port); flush_workqueue(system_unbound_wq); out: + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[0] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } + return IRQ_HANDLED; } @@ -698,6 +720,13 @@ static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id) unsigned char trace_buf[256] = {0, }; int trace_cnt = 0; + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[1] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } + spin_lock_irqsave(&port->lock, flags); if (port->x_char) { @@ -831,6 +860,7 @@ static unsigned int s3c24xx_serial_get_mctrl(struct uart_port *port) static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl) { unsigned int umcon = rd_regl(port, S3C2410_UMCON); + struct s3c24xx_uart_port *ourport = to_ourport(port); if (mctrl & TIOCM_RTS) umcon |= S3C2410_UMCOM_RTS_LOW; @@ -838,6 +868,12 @@ static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl) umcon &= ~S3C2410_UMCOM_RTS_LOW; wr_regl(port, S3C2410_UMCON, umcon); + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[2] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } } static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) @@ -938,6 +974,7 @@ err: static int s3c64xx_serial_startup(struct uart_port *port) { struct s3c24xx_uart_port *ourport = to_ourport(port); + unsigned long flags; int ret; dbg("s3c64xx_serial_startup: port=%p (%08llx,%p)\n", @@ -946,7 +983,9 @@ static int s3c64xx_serial_startup(struct uart_port *port) ourport->cfg->wake_peer[port->line] = s3c2410_serial_wake_peer[port->line]; + spin_lock_irqsave(&port->lock, flags); wr_regl(port, S3C64XX_UINTM, 0xf); + spin_unlock_irqrestore(&port->lock, flags); if (ourport->use_default_irq == 1) ret = devm_request_irq(port->dev, port->irq, s3c64xx_serial_handle_irq, @@ -967,7 +1006,9 @@ static int s3c64xx_serial_startup(struct uart_port *port) ourport->tx_claimed = 1; /* Enable Rx Interrupt */ - __clear_bit(S3C64XX_UINTM_RXD, portaddrl(port, S3C64XX_UINTM)); + spin_lock_irqsave(&port->lock, flags); + __clear_bit(S3C64XX_UINTM_RXD, portaddrl(port, S3C64XX_UINTM)); + spin_unlock_irqrestore(&port->lock, flags); dbg("s3c64xx_serial_startup ok\n"); return ret; } @@ -986,7 +1027,12 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, umcon = rd_regl(port, S3C2410_UMCON); umcon &= ~(S3C2410_UMCOM_AFC | S3C2410_UMCOM_RTS_LOW); wr_regl(port, S3C2410_UMCON, umcon); - pr_err("[tty] s3c24xx_serial_pm change rts to high\n"); + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[3] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } } uart_clock_disable(ourport); @@ -994,7 +1040,12 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, case S3C24XX_UART_PORT_RESUME: uart_clock_enable(ourport); - + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[4] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } exynos_usi_init(port); s3c24xx_serial_resetport(port, s3c24xx_port_to_cfg(port)); break; @@ -1221,8 +1272,6 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, umcon = rd_regl(port, S3C2410_UMCON); if (termios->c_cflag & CRTSCTS) { umcon |= S3C2410_UMCOM_AFC; - /* Disable RTS when RX FIFO contains 63 bytes */ - umcon &= ~S3C2412_UMCON_AFC_8; } else { umcon &= ~S3C2410_UMCOM_AFC; } @@ -1545,6 +1594,7 @@ static void s3c24xx_serial_resetport(struct uart_port *port, struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port); struct s3c24xx_uart_port *ourport = to_ourport(port); unsigned long ucon = rd_regl(port, S3C2410_UCON); + unsigned long umcon = rd_regl(port, S3C2410_UMCON); unsigned int ucon_mask; ucon_mask = info->clksel_mask; @@ -1557,6 +1607,12 @@ static void s3c24xx_serial_resetport(struct uart_port *port, ucon |= S3C2443_UCON_LOOPBACK; } + /* Set rts trigger level */ + umcon &= ~S5PV210_UMCON_RTSTRIG32; + if (ourport->rts_trig_level && info->rts_trig_shift) + umcon |= ourport->rts_trig_level << info->rts_trig_shift; + wr_regl(port, S3C2410_UMCON, umcon); + wr_regl(port, S3C64XX_UINTM, 0xf); /* reset both fifos */ @@ -1745,17 +1801,16 @@ void s3c24xx_serial_rx_fifo_wait(void) fifo_stat = rd_regl(port, S3C2410_UFSTAT); fifo_count = s3c24xx_serial_rx_fifocnt(ourport, fifo_stat); if (fifo_count) { - uart_clock_enable(ourport); __clear_bit(S3C64XX_UINTM_RXD, portaddrl(port, S3C64XX_UINTM)); - uart_clock_disable(ourport); rx_enabled(port) = 1; + + wait_time = jiffies + HZ; + do { + port = &ourport->port; + fifo_stat = rd_regl(port, S3C2410_UFSTAT); + cpu_relax(); + } while (s3c24xx_serial_rx_fifocnt(ourport, fifo_stat) && time_before(jiffies, wait_time)); } - wait_time = jiffies + HZ; - do { - port = &ourport->port; - fifo_stat = rd_regl(port, S3C2410_UFSTAT); - cpu_relax(); - } while (s3c24xx_serial_rx_fifocnt(ourport, fifo_stat) && time_before(jiffies, wait_time)); if (rx_enabled(port)) s3c24xx_serial_stop_rx(port); @@ -1946,7 +2001,14 @@ static int s3c24xx_serial_notifier(struct notifier_block *self, spin_unlock_irqrestore(&port->lock, flags); - if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[5] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } + + if (ourport->rts_control) change_uart_gpio(RTS_PINCTRL, ourport); } s3c24xx_serial_fifo_wait(); @@ -1972,7 +2034,14 @@ static int s3c24xx_serial_notifier(struct notifier_block *self, spin_unlock_irqrestore(&port->lock, flags); - if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) + if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) { + sprintf(uart_log_buf,"[6] UMCON:0x%08x UFSTAT:0x%08x UINTP:0x%08x UCON:0x%08x UMSTAT:0x%08x\n", + rd_regl(port, S3C2410_UMCON), rd_regl(port, S3C2410_UFSTAT), rd_regl(port, S3C2410_UINTP), + rd_regl(port, S3C2410_UCON), rd_regl(port, S3C2410_UMSTAT)); + uart_copy_to_local_buf(2, &ourport->uart_local_buf, uart_log_buf, sizeof(uart_log_buf)); + } + + if (ourport->rts_control) change_uart_gpio(DEFAULT_PINCTRL, ourport); } break; @@ -1995,6 +2064,7 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) int index = probe_index; int ret, fifo_size; int port_index = probe_index; + int rts_trig_level; dbg("s3c24xx_serial_probe(%p) %d\n", pdev, index); @@ -2049,19 +2119,28 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) else ourport->usi_v2 = 0; - ourport->default_uart_pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR(ourport->default_uart_pinctrl)) - dev_err(&pdev->dev, "Can't get uart pinctrl!!!\n"); - else { - ourport->uart_pinctrl_rts = pinctrl_lookup_state(ourport->default_uart_pinctrl, - "rts"); - if (IS_ERR(ourport->uart_pinctrl_rts)) - dev_err(&pdev->dev, "Can't get RTS pinstate!!!\n"); + if (of_get_property(pdev->dev.of_node, "samsung,rts-gpio-control", NULL)) { + ourport->rts_control = 1; + ourport->default_uart_pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR(ourport->default_uart_pinctrl)) + dev_err(&pdev->dev, "Can't get uart pinctrl!!!\n"); + else { + ourport->uart_pinctrl_rts = pinctrl_lookup_state(ourport->default_uart_pinctrl, + "rts"); + if (IS_ERR(ourport->uart_pinctrl_rts)) + dev_err(&pdev->dev, "Can't get RTS pinstate!!!\n"); + ourport->uart_pinctrl_tx_dat = pinctrl_lookup_state(ourport->default_uart_pinctrl, + "tx_dat"); - ourport->uart_pinctrl_default = pinctrl_lookup_state(ourport->default_uart_pinctrl, - "default"); - if (IS_ERR(ourport->uart_pinctrl_default)) - dev_err(&pdev->dev, "Can't get Default pinstate!!!\n"); + ourport->uart_pinctrl_default = pinctrl_lookup_state(ourport->default_uart_pinctrl, + "default"); + if (IS_ERR(ourport->uart_pinctrl_default)) + dev_err(&pdev->dev, "Can't get Default pinstate!!!\n"); + } + } + if (!of_property_read_u32(pdev->dev.of_node, "samsung,rts-trig-level", + &rts_trig_level)) { + ourport->rts_trig_level = rts_trig_level; } if (!of_property_read_u32(pdev->dev.of_node, "samsung,fifo-size", @@ -2273,7 +2352,7 @@ static int s3c24xx_serial_suspend(struct device *dev) * Set Bluetooth RTS line high in case of bluetooth * sends unexpected date while suspending sequence */ - if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) + if (ourport->rts_control) change_uart_gpio(RTS_PINCTRL, ourport); udelay(300);//dealy for sfr update @@ -2308,7 +2387,7 @@ static int s3c24xx_serial_resume(struct device *dev) if (port) { uart_resume_port(&s3c24xx_uart_drv, port); - if (ourport->port.line == BLUETOOTH_UART_PORT_LINE) + if (ourport->rts_control) change_uart_gpio(DEFAULT_PINCTRL, ourport); if (ourport->dbg_mode & UART_DBG_MODE) @@ -2707,6 +2786,7 @@ static struct s3c24xx_serial_drv_data s5pv210_serial_drv_data = { .tx_fifofull = S5PV210_UFSTAT_TXFULL, \ .tx_fifomask = S5PV210_UFSTAT_TXMASK, \ .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, \ + .rts_trig_shift = S5PV210_UMCON_RTSTRIG_SHIFT, \ .def_clk_sel = S3C2410_UCON_CLKSEL0, \ .num_clks = 1, \ .clksel_mask = 0, \ diff --git a/drivers/tty/serial/samsung.h b/drivers/tty/serial/samsung.h index 96e31d2b8c1c..67f736a4c5b2 100644 --- a/drivers/tty/serial/samsung.h +++ b/drivers/tty/serial/samsung.h @@ -31,6 +31,7 @@ struct s3c24xx_uart_info { unsigned long tx_fifomask; unsigned long tx_fifoshift; unsigned long tx_fifofull; + unsigned int rts_trig_shift; unsigned int def_clk_sel; unsigned long num_clks; unsigned long clksel_mask; @@ -79,10 +80,13 @@ struct s3c24xx_uart_port { u32 use_default_irq; unsigned long qos_timeout; unsigned int usi_v2; + unsigned int uart_panic_log; + struct pinctrl_state *uart_pinctrl_tx_dat; struct pinctrl_state *uart_pinctrl_rts; struct pinctrl_state *uart_pinctrl_default; struct pinctrl *default_uart_pinctrl; - unsigned int uart_panic_log; + unsigned int rts_control; + unsigned int rts_trig_level; /* reference to platform data */ struct s3c2410_uartcfg *cfg; diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index 422ce7b20d73..1626abeca8e8 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -191,9 +191,10 @@ int usb_register_dev(struct usb_interface *intf, intf->minor = minor; break; } - up_write(&minor_rwsem); - if (intf->minor < 0) + if (intf->minor < 0) { + up_write(&minor_rwsem); return -EXFULL; + } /* create a usb class device for this usb interface */ snprintf(name, sizeof(name), class_driver->name, minor - minor_base); @@ -201,12 +202,11 @@ int usb_register_dev(struct usb_interface *intf, MKDEV(USB_MAJOR, minor), class_driver, "%s", kbasename(name)); if (IS_ERR(intf->usb_dev)) { - down_write(&minor_rwsem); usb_minors[minor] = NULL; intf->minor = -1; - up_write(&minor_rwsem); retval = PTR_ERR(intf->usb_dev); } + up_write(&minor_rwsem); return retval; } EXPORT_SYMBOL_GPL(usb_register_dev); @@ -232,12 +232,12 @@ void usb_deregister_dev(struct usb_interface *intf, return; dev_dbg(&intf->dev, "removing %d minor\n", intf->minor); + device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); down_write(&minor_rwsem); usb_minors[intf->minor] = NULL; up_write(&minor_rwsem); - device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); intf->usb_dev = NULL; intf->minor = -1; destroy_usb_class(); diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 5e5aaa07974b..282b300ce67b 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -796,6 +796,10 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, unsigned long flags; struct usb_ep *in; u16 cdc_filter; + bool eth_multi_pkt_xfer = 0; + bool eth_supports_multi_frame = 0; + bool eth_is_fixed = 0; + #ifdef CONFIG_USB_RNDIS_MULTIPACKET_WITH_TIMER if (dev->en_timer) { hrtimer_cancel(&dev->tx_timer); @@ -806,6 +810,9 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, if (dev->port_usb) { in = dev->port_usb->in_ep; cdc_filter = dev->port_usb->cdc_filter; + eth_multi_pkt_xfer = dev->port_usb->multi_pkt_xfer; + eth_supports_multi_frame = dev->port_usb->supports_multi_frame; + eth_is_fixed = dev->port_usb->is_fixed; } else { in = NULL; cdc_filter = 0; @@ -819,7 +826,7 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, #if 0 /* Allocate memory for tx_reqs to support multi packet transfer */ - if (dev->port_usb->multi_pkt_xfer && !dev->tx_req_bufsize) + if (eth_multi_pkt_xfer && !dev->tx_req_bufsize) alloc_tx_buffer(dev); #endif @@ -879,7 +886,7 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, /* Multi frame CDC protocols may store the frame for * later which is not a dropped frame. */ - if (dev->port_usb->supports_multi_frame) + if (eth_supports_multi_frame) goto multiframe; goto drop; } @@ -889,10 +896,14 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, dev->tx_skb_hold_count++; spin_unlock_irqrestore(&dev->req_lock, flags); - if (dev->port_usb->multi_pkt_xfer) { + if (eth_multi_pkt_xfer) { /* Add RNDIS Header */ - memcpy(req->buf + req->length, dev->port_usb->header, + if (dev->port_usb) + memcpy(req->buf + req->length, dev->port_usb->header, dev->header_len); + else + goto success; + /* Increment req length by header size */ req->length += dev->header_len; /* Copy received IP data from SKB */ @@ -929,13 +940,22 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, dev->tx_skb_hold_count = 0; spin_unlock_irqrestore(&dev->lock, flags); } else { + if (eth_is_fixed) { /* ncm case */ #ifdef CONFIG_USB_RNDIS_MULTIPACKET_WITH_TIMER - req->length = skb->len; + req->length = skb->len; #else - length = skb->len; + length = skb->len; #endif - req->buf = skb->data; - req->context = skb; + req->buf = skb->data; + req->context = skb; + } else { /* rndis case : multipacket not used */ + req->length = skb->len; + /* copy skb data */ + memcpy(req->buf, skb->data, + skb->len); + dev_kfree_skb_any(skb); + req->context = NULL; + } } #ifdef CONFIG_USB_RNDIS_MULTIPACKET_WITH_TIMER retval = tx_task(dev, req); @@ -986,7 +1006,7 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, #endif if (retval) { - if (!dev->port_usb->multi_pkt_xfer) + if (!eth_multi_pkt_xfer) dev_kfree_skb_any(skb); drop: dev->net->stats.tx_dropped++; diff --git a/fs/sdcardfs/q/dentry.c b/fs/sdcardfs/q/dentry.c index 5ea53a54aea2..f1da0474c8c9 100644 --- a/fs/sdcardfs/q/dentry.c +++ b/fs/sdcardfs/q/dentry.c @@ -147,6 +147,8 @@ static int sdcardfs_d_delete(const struct dentry *d) static void sdcardfs_d_release(struct dentry *dentry) { + if (!dentry || !dentry->d_fsdata) + return; /* release and reset the lower paths */ if (has_graft_path(dentry)) sdcardfs_put_reset_orig_path(dentry); diff --git a/fs/sdcardfs/q/lookup.c b/fs/sdcardfs/q/lookup.c index f85f4d689bdc..67beed096969 100644 --- a/fs/sdcardfs/q/lookup.c +++ b/fs/sdcardfs/q/lookup.c @@ -41,8 +41,6 @@ void sdcardfs_destroy_dentry_cache(void) void free_dentry_private_data(struct dentry *dentry) { - if (!dentry || !dentry->d_fsdata) - return; kmem_cache_free(sdcardfs_dentry_cachep, dentry->d_fsdata); dentry->d_fsdata = NULL; } diff --git a/include/linux/netfilter/xt_domainfilter.h b/include/linux/netfilter/xt_domainfilter.h new file mode 100644 index 000000000000..2590251666b3 --- /dev/null +++ b/include/linux/netfilter/xt_domainfilter.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Domain Filter Module:Implementation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _XT_DOMAINFILTER_MATCH_H +#define _XT_DOMAINFILTER_MATCH_H + +enum { + XT_DOMAINFILTER_WHITE = 1 << 0, + XT_DOMAINFILTER_BLACK = 1 << 1, + + XT_DOMAINFILTER_NAME_LEN = 256, // lenght of a domain name +}; + +struct xt_domainfilter_match_info { + char domain_name[XT_DOMAINFILTER_NAME_LEN]; + __u8 flags; +}; + +#endif //_XT_DOMAINFILTER_MATCH_H diff --git a/include/linux/serial_s3c.h b/include/linux/serial_s3c.h index 73706d194c7d..168a8378e166 100644 --- a/include/linux/serial_s3c.h +++ b/include/linux/serial_s3c.h @@ -40,6 +40,9 @@ #define S3C2410_UERSTAT (0x14) #define S3C2410_UFSTAT (0x18) #define S3C2410_UMSTAT (0x1C) +#define S3C2410_UINTP (0x30) +#define S3C2410_UINTS (0x34) +#define S3C2410_UINTM (0x38) #define S3C2410_UFLT (0x40) #define USI_CON (0xC4) @@ -246,6 +249,16 @@ #define S5PV210_UFCON_RXTRIG128 (6<<4) #define S5PV210_UFCON_RXTRIG256 (7<<4) +#define S5PV210_UMCON_RTSTRIG255 (0<<5) +#define S5PV210_UMCON_RTSTRIG224 (1<<5) +#define S5PV210_UMCON_RTSTRIG192 (2<<5) +#define S5PV210_UMCON_RTSTRIG160 (3<<5) +#define S5PV210_UMCON_RTSTRIG128 (4<<5) +#define S5PV210_UMCON_RTSTRIG96 (5<<5) +#define S5PV210_UMCON_RTSTRIG64 (6<<5) +#define S5PV210_UMCON_RTSTRIG32 (7<<5) +#define S5PV210_UMCON_RTSTRIG_SHIFT (5) + #define S5PV210_UFSTAT_TXFULL (1<<24) #define S5PV210_UFSTAT_RXFULL (1<<8) #define S5PV210_UFSTAT_TXMASK (255<<16) diff --git a/include/media/exynos_tsmux.h b/include/media/exynos_tsmux.h index b70d2fb5f8bc..d8d6ed8d2bef 100644 --- a/include/media/exynos_tsmux.h +++ b/include/media/exynos_tsmux.h @@ -23,6 +23,7 @@ int mfc_encoding_start(int32_t index); int mfc_encoding_end(void); int packetize(struct packetizing_param *param); void set_es_size(unsigned int size); +void tsmux_sfr_dump(void); #else int g2d_blending_start(int32_t index) { @@ -47,6 +48,10 @@ static inline int packetize(struct packetizing_param *param) static inline void set_es_size(unsigned int size) { return; +} +static inline void tsmux_sfr_dump(void) +{ + } #endif diff --git a/include/net/tcp.h b/include/net/tcp.h index b8a5f6fa4c79..32936d2ff090 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1727,6 +1727,8 @@ struct tcp_fastopen_context { struct rcu_head rcu; }; +static inline void tcp_init_send_head(struct sock *sk); + /* write queue abstraction */ static inline void tcp_write_queue_purge(struct sock *sk) { @@ -1734,6 +1736,7 @@ static inline void tcp_write_queue_purge(struct sock *sk) while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) sk_wmem_free_skb(sk, skb); + tcp_init_send_head(sk); sk_mem_reclaim(sk); tcp_clear_all_retrans_hints(tcp_sk(sk)); } diff --git a/include/uapi/linux/netfilter/xt_domainfilter.h b/include/uapi/linux/netfilter/xt_domainfilter.h new file mode 100644 index 000000000000..2590251666b3 --- /dev/null +++ b/include/uapi/linux/netfilter/xt_domainfilter.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Domain Filter Module:Implementation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _XT_DOMAINFILTER_MATCH_H +#define _XT_DOMAINFILTER_MATCH_H + +enum { + XT_DOMAINFILTER_WHITE = 1 << 0, + XT_DOMAINFILTER_BLACK = 1 << 1, + + XT_DOMAINFILTER_NAME_LEN = 256, // lenght of a domain name +}; + +struct xt_domainfilter_match_info { + char domain_name[XT_DOMAINFILTER_NAME_LEN]; + __u8 flags; +}; + +#endif //_XT_DOMAINFILTER_MATCH_H diff --git a/net/key/af_key.c b/net/key/af_key.c index 06501ed01ab8..6bd87c82942b 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c @@ -196,30 +196,22 @@ static int pfkey_release(struct socket *sock) return 0; } -static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2, - gfp_t allocation, struct sock *sk) +static int pfkey_broadcast_one(struct sk_buff *skb, gfp_t allocation, + struct sock *sk) { int err = -ENOBUFS; - sock_hold(sk); - if (*skb2 == NULL) { - if (atomic_read(&skb->users) != 1) { - *skb2 = skb_clone(skb, allocation); - } else { - *skb2 = skb; - atomic_inc(&skb->users); - } + if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf) + return err; + + skb = skb_clone(skb, allocation); + + if (skb) { + skb_set_owner_r(skb, sk); + skb_queue_tail(&sk->sk_receive_queue, skb); + sk->sk_data_ready(sk); + err = 0; } - if (*skb2 != NULL) { - if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) { - skb_set_owner_r(*skb2, sk); - skb_queue_tail(&sk->sk_receive_queue, *skb2); - sk->sk_data_ready(sk); - *skb2 = NULL; - err = 0; - } - } - sock_put(sk); return err; } @@ -234,7 +226,6 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, { struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); struct sock *sk; - struct sk_buff *skb2 = NULL; int err = -ESRCH; /* XXX Do we need something like netlink_overrun? I think @@ -253,7 +244,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, * socket. */ if (pfk->promisc) - pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); + pfkey_broadcast_one(skb, GFP_ATOMIC, sk); /* the exact target will be processed later */ if (sk == one_sk) @@ -268,7 +259,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, continue; } - err2 = pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); + err2 = pfkey_broadcast_one(skb, GFP_ATOMIC, sk); /* Error is cleared after successful sending to at least one * registered KM */ @@ -278,9 +269,8 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, rcu_read_unlock(); if (one_sk != NULL) - err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk); + err = pfkey_broadcast_one(skb, allocation, one_sk); - kfree_skb(skb2); kfree_skb(skb); return err; } diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile index 987452d424e8..4f6c6cb415c8 100644 --- a/net/netfilter/Makefile +++ b/net/netfilter/Makefile @@ -182,6 +182,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o obj-$(CONFIG_NETFILTER_XT_MATCH_TIME) += xt_time.o obj-$(CONFIG_NETFILTER_XT_MATCH_U32) += xt_u32.o +obj-$(CONFIG_KNOX_NCM) += xt_domainfilter.o # ipset obj-$(CONFIG_IP_SET) += ipset/ diff --git a/net/netfilter/xt_domainfilter.c b/net/netfilter/xt_domainfilter.c new file mode 100644 index 000000000000..22e810aba144 --- /dev/null +++ b/net/netfilter/xt_domainfilter.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Domain Filter Module:Implementation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include + +// Below char works as wildcard (*), it can be used as part or whole domain +static const char WILDCARD = '%'; + +/* + * Check if a given string is the ending substring of another. + */ +static bool endsWith(const char *host, const char *rule) { + size_t hostLen = strlen(host); + size_t ruleLen = strlen(rule); + if (hostLen >= ruleLen) { + unsigned int offSet = hostLen - ruleLen; + return strncmp(host + offSet , rule, ruleLen) == 0; + } else { + return false; + } +} + +/* + * Check if a given string is the beginning substring of another. + */ +static bool beginsWith(const char *host, const char *rule) { + size_t hostLen = strlen(host); + size_t ruleLen = strlen(rule); + if (hostLen >= ruleLen) { + return strncmp(host, rule, ruleLen) == 0; + } else { + return false; + } +} + +/* + * Check if the given host matches the provided white/black list rules. + */ +static bool matchHost(const char *rule, const char *host) { + size_t ruleLen = strlen(rule); + if (ruleLen == 1 && rule[0] == WILDCARD) { // rule is *, means all hosts + return true; + } + if (rule[0] == WILDCARD) { // starts with * + if (rule[ruleLen -1] == WILDCARD) { // also ends with * + // get the substring between the '*'s + char substrRule[XT_DOMAINFILTER_NAME_LEN]; + strncpy(substrRule, rule+1, ruleLen-2); + substrRule[ruleLen-2] = '\0'; + if(strstr(host, substrRule) != NULL) { + return true; + } + } else { // only starts with * + // remove * from beginning, so host must end if rule + char substrRule[XT_DOMAINFILTER_NAME_LEN]; + strncpy(substrRule, rule+1, ruleLen-1); + substrRule[ruleLen-1] = '\0'; + if (endsWith(host, substrRule)) + return true; + } + } else if (rule[ruleLen -1] == WILDCARD) { // only ends with '*' + char substrRule[XT_DOMAINFILTER_NAME_LEN]; + strncpy(substrRule, rule, ruleLen-1); + substrRule[ruleLen-1] = '\0'; + if (beginsWith(host, substrRule)) + return true; + } else if (strlen(host) == ruleLen && + strcmp(host, rule) == 0) { // exact match + return true; + } + return false; +} + +static int domainfilter_check(const struct xt_mtchk_param *par) +{ + struct xt_domainfilter_match_info *info = par->matchinfo; + if (!(info->flags & (XT_DOMAINFILTER_WHITE|XT_DOMAINFILTER_BLACK))) { + return -EINVAL; + } + return 0; +} + +static bool +domainfilter_mt(const struct sk_buff *skb, struct xt_action_param *par) +{ + const struct xt_domainfilter_match_info *info = par->matchinfo; + struct sock *sk = skb_to_full_sk(skb); + + if (sk == NULL) { + return false; + } + + // check domain name match + if (sk->domain_name[0] != '\0') { + return matchHost(info->domain_name, sk->domain_name); + } + + // didn't match + return false; +} + +static struct xt_match domainfilter_mt_reg __read_mostly = { + .name = "domainfilter", + .revision = 1, + .family = NFPROTO_UNSPEC, + .checkentry = domainfilter_check, + .match = domainfilter_mt, + .matchsize = sizeof(struct xt_domainfilter_match_info), + .hooks = (1 << NF_INET_LOCAL_OUT) | + (1 << NF_INET_LOCAL_IN), + .me = THIS_MODULE, +}; + +static int __init domainfilter_mt_init(void) +{ + return xt_register_match(&domainfilter_mt_reg); +} + +static void __exit domainfilter_mt_exit(void) +{ + xt_unregister_match(&domainfilter_mt_reg); +} + +module_init(domainfilter_mt_init); +module_exit(domainfilter_mt_exit); +MODULE_AUTHOR("Antonio Junqueira "); +MODULE_DESCRIPTION("Xtables: domain name matching"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("ipt_domainfilter"); +MODULE_ALIAS("ip6t_domainfilter"); diff --git a/security/samsung/defex_lsm/Makefile b/security/samsung/defex_lsm/Makefile index dd6b938b687b..a154faf89a1a 100644 --- a/security/samsung/defex_lsm/Makefile +++ b/security/samsung/defex_lsm/Makefile @@ -4,7 +4,7 @@ # Features to Enable PED_ENABLE=true -PED_BASED_ON_TGID_ENABLE=false +PED_BASED_ON_TGID_ENABLE=true SAFEPLACE_ENABLE=true IMMUTABLE_ENABLE=true LP_ENABLE=true diff --git a/security/samsung/defex_lsm/defex_ht.c b/security/samsung/defex_lsm/defex_ht.c index a88e0c3b787a..706984ad221c 100644 --- a/security/samsung/defex_lsm/defex_ht.c +++ b/security/samsung/defex_lsm/defex_ht.c @@ -20,10 +20,18 @@ DECLARE_HASHTABLE(creds_hash, 15); #endif /* DEFEX_PED_ENABLE */ -struct proc_cred_data { - unsigned int uid, fsuid, egid, p_root; #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE - int tcnt; +struct id_set { + unsigned int uid, fsuid, egid; +}; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + +struct proc_cred_data { + unsigned int uid, fsuid, egid; + unsigned short cred_flags; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + unsigned short tcnt; + struct id_set upd_ids[]; #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ }; @@ -51,55 +59,112 @@ int is_task_creds_ready(void) } #ifdef DEFEX_PED_ENABLE -void get_task_creds(int pid, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned int *p_root_ptr) +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE +void get_task_creds(struct task_struct *p, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned short *cred_flags_ptr) +#else +void get_task_creds(int pid, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned short *cred_flags_ptr) +#endif { struct proc_cred_struct *obj; struct proc_cred_data *cred_data; - unsigned int uid = 0, fsuid = 0, egid = 0, p_root = 1; + unsigned int uid = 0, fsuid = 0, egid = 0; + unsigned short cred_flags = CRED_FLAGS_PROOT; unsigned long flags; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + int tgid = p->tgid, pid = p->pid; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ if (pid <= MAX_PID_32) { spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data = creds_fast_hash[pid]; - if (cred_data != NULL) { - uid = cred_data->uid; - fsuid = cred_data->fsuid; - egid = cred_data->egid; - p_root = cred_data->p_root; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + cred_data = creds_fast_hash[tgid]; + if (cred_data) { + if (tgid == pid) { + if (cred_data->cred_flags & CRED_FLAGS_MAIN_UPDATED) { + GET_CREDS(upd_ids->uid, upd_ids->fsuid, upd_ids->egid, cred_flags); + } else { + GET_CREDS(uid, fsuid, egid, cred_flags); + } + } else { + if ((cred_data->cred_flags & CRED_FLAGS_SUB_UPDATED) && creds_fast_hash[pid]) + cred_data = creds_fast_hash[pid]; + GET_CREDS(uid, fsuid, egid, cred_flags); + } } +#else + cred_data = creds_fast_hash[pid]; + if (cred_data) { + GET_CREDS(uid, fsuid, egid, cred_flags); + } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ spin_unlock_irqrestore(&creds_hash_update_lock, flags); } else { spin_lock_irqsave(&creds_hash_update_lock, flags); - hash_for_each_possible(creds_hash, obj, node, pid) { - uid = obj->cred_data.uid; - fsuid = obj->cred_data.fsuid; - egid = obj->cred_data.egid; - p_root = obj->cred_data.p_root; - break; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + if (tgid == pid) { + hash_for_each_possible(creds_hash, obj, node, tgid) { + if (obj->cred_data.cred_flags & CRED_FLAGS_MAIN_UPDATED) { + GET_CREDS_OBJ(upd_ids->uid, upd_ids->fsuid, upd_ids->egid, cred_flags); + } else { + GET_CREDS_OBJ(uid, fsuid, egid, cred_flags); + } + break; + } + } else { + hash_for_each_possible(creds_hash, obj, node, tgid) { + GET_CREDS_OBJ(uid, fsuid, egid, cred_flags); + break; + } + if (cred_flags & CRED_FLAGS_SUB_UPDATED) { +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + hash_for_each_possible(creds_hash, obj, node, pid) { + GET_CREDS_OBJ(uid, fsuid, egid, cred_flags); + break; + } +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + } } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ spin_unlock_irqrestore(&creds_hash_update_lock, flags); } *uid_ptr = uid; *fsuid_ptr = fsuid; *egid_ptr = egid; - *p_root_ptr = p_root; + *cred_flags_ptr = cred_flags; } -int set_task_creds(int pid, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned int p_root) +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE +int set_task_creds(struct task_struct *p, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned short cred_flags) +#else +int set_task_creds(int pid, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned short cred_flags) +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ { struct proc_cred_struct *obj; struct proc_cred_data *cred_data = NULL, *tmp_data = NULL; unsigned long flags; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + struct proc_cred_struct *tmp_obj = NULL; + int tgid = p->tgid, pid = p->pid; + unsigned short tmp_cred_flags = 0x80; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ alloc_obj:; if (pid <= MAX_PID_32) { +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + if (!creds_fast_hash[tgid]) { +#else if (!creds_fast_hash[pid]) { +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ tmp_data = kmalloc(sizeof(struct proc_cred_data), GFP_ATOMIC); if (!tmp_data) return -1; } spin_lock_irqsave(&creds_hash_update_lock, flags); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + cred_data = creds_fast_hash[tgid]; +#else cred_data = creds_fast_hash[pid]; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ if (!cred_data) { if (!tmp_data) { spin_unlock_irqrestore(&creds_hash_update_lock, flags); @@ -107,15 +172,55 @@ alloc_obj:; } cred_data = tmp_data; #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + cred_data->cred_flags = 0; cred_data->tcnt = 1; -#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + creds_fast_hash[tgid] = cred_data; +#else creds_fast_hash[pid] = cred_data; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ tmp_data = NULL; } - cred_data->uid = uid; - cred_data->fsuid = fsuid; - cred_data->egid = egid; - cred_data->p_root = p_root; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + if (cred_data && cred_data->tcnt >= 2) { + if (tgid == pid) { + if (!(cred_data->cred_flags & CRED_FLAGS_MAIN_UPDATED)) { + cred_data->cred_flags |= CRED_FLAGS_MAIN_UPDATED; + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + tmp_data = kmalloc(sizeof(struct proc_cred_data) + sizeof(struct id_set), GFP_ATOMIC); + if (!tmp_data) { + return -1; + } + spin_lock_irqsave(&creds_hash_update_lock, flags); + *tmp_data = *cred_data; + kfree(cred_data); + cred_data = tmp_data; + creds_fast_hash[tgid] = cred_data; + tmp_data = NULL; + } + SET_CREDS(upd_ids->uid, upd_ids->fsuid, upd_ids->egid, cred_flags); + } else { + cred_data->cred_flags |= CRED_FLAGS_SUB_UPDATED; + cred_data = creds_fast_hash[pid]; + if (!cred_data) { + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + tmp_data = kmalloc(sizeof(struct proc_cred_data), GFP_ATOMIC); + if (!tmp_data) { + return -1; + } + spin_lock_irqsave(&creds_hash_update_lock, flags); + cred_data = tmp_data; + creds_fast_hash[pid] = cred_data; + tmp_data = NULL; + } + cred_data->cred_flags = 0; + SET_CREDS(uid, fsuid, egid, cred_flags); + } + } else { +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + SET_CREDS(uid, fsuid, egid, cred_flags); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ spin_unlock_irqrestore(&creds_hash_update_lock, flags); if (tmp_data) kfree(tmp_data); @@ -123,48 +228,117 @@ alloc_obj:; } spin_lock_irqsave(&creds_hash_update_lock, flags); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + hash_for_each_possible(creds_hash, obj, node, tgid) { + if (obj->cred_data.tcnt >= 2) { + tmp_cred_flags = obj->cred_data.cred_flags; + obj->cred_data.cred_flags |= ((tgid == pid) ? CRED_FLAGS_MAIN_UPDATED : CRED_FLAGS_SUB_UPDATED); + break; + } +#else hash_for_each_possible(creds_hash, obj, node, pid) { - obj->cred_data.uid = uid; - obj->cred_data.fsuid = fsuid; - obj->cred_data.egid = egid; - obj->cred_data.p_root = p_root; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + SET_CREDS_OBJ(uid, fsuid, egid, cred_flags); spin_unlock_irqrestore(&creds_hash_update_lock, flags); return 0; } spin_unlock_irqrestore(&creds_hash_update_lock, flags); - obj = kmalloc(sizeof(struct proc_cred_struct), GFP_ATOMIC); - if (!obj) - return -1; - obj->cred_data.uid = uid; - obj->cred_data.fsuid = fsuid; - obj->cred_data.egid = egid; - obj->cred_data.p_root = p_root; #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE - obj->cred_data.tcnt = 1; + if (tmp_cred_flags == 0x80) { +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + obj = kmalloc(sizeof(struct proc_cred_struct), GFP_ATOMIC); + if (!obj) + return -1; + obj->cred_data.cred_flags = 0; + SET_CREDS_OBJ(uid, fsuid, egid, cred_flags); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + obj->cred_data.tcnt = 1; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + spin_lock_irqsave(&creds_hash_update_lock, flags); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + hash_add(creds_hash, &obj->node, tgid); +#else + hash_add(creds_hash, &obj->node, pid); +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return 0; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + if (tgid == pid) { + if (!(tmp_cred_flags & CRED_FLAGS_MAIN_UPDATED)) { + obj = kmalloc(sizeof(struct proc_cred_struct) + sizeof(struct id_set), GFP_ATOMIC); + if (!obj) + return -1; + spin_lock_irqsave(&creds_hash_update_lock, flags); + hash_for_each_possible(creds_hash, tmp_obj, node, tgid) { + *obj = *tmp_obj; + hash_del(&tmp_obj->node); + kfree(tmp_obj); + break; + } + SET_CREDS_OBJ(upd_ids->uid, upd_ids->fsuid, upd_ids->egid, cred_flags); + hash_add(creds_hash, &obj->node, tgid); + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return 0; + } else { + spin_lock_irqsave(&creds_hash_update_lock, flags); + hash_for_each_possible(creds_hash, obj, node, tgid) { + SET_CREDS_OBJ(upd_ids->uid, upd_ids->fsuid, upd_ids->egid, cred_flags); + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return 0; + } + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return -1; + } + } else { + spin_lock_irqsave(&creds_hash_update_lock, flags); + hash_for_each_possible(creds_hash, obj, node, pid) { + SET_CREDS_OBJ(uid, fsuid, egid, cred_flags); + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return 0; + } + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + obj = kmalloc(sizeof(struct proc_cred_struct), GFP_ATOMIC); + if (!obj) + return -1; + obj->cred_data.cred_flags = 0; + SET_CREDS_OBJ(uid, fsuid, egid, cred_flags); + spin_lock_irqsave(&creds_hash_update_lock, flags); + hash_add(creds_hash, &obj->node, pid); + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return 0; + } #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - hash_add(creds_hash, &obj->node, pid); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - return 0; } #endif /* DEFEX_PED_ENABLE */ #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE -void set_task_creds_tcnt(int tgid, int addition) +void set_task_creds_tcnt(struct task_struct *p, int addition) { - struct proc_cred_struct *obj; - struct proc_cred_data *cred_data = NULL; + struct proc_cred_struct *tgid_obj, *pid_obj; + struct proc_cred_data *tgid_cred_data = NULL, *pid_cred_data = NULL; unsigned long flags; + int tgid = p->tgid, pid = p->pid; - if (tgid <= MAX_PID_32) { + if (pid <= MAX_PID_32) { spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data = creds_fast_hash[tgid]; - if (cred_data) { - cred_data->tcnt += addition; - if (!cred_data->tcnt) { + if (tgid != pid && addition == -1) { + pid_cred_data = creds_fast_hash[pid]; + if (pid_cred_data) { + creds_fast_hash[pid] = NULL; + kfree(pid_cred_data); + } + } + tgid_cred_data = creds_fast_hash[tgid]; + if (tgid_cred_data) { + tgid_cred_data->tcnt += addition; + if (!tgid_cred_data->tcnt) { creds_fast_hash[tgid] = NULL; spin_unlock_irqrestore(&creds_hash_update_lock, flags); - kfree(cred_data); + kfree(tgid_cred_data); return; } } @@ -173,12 +347,19 @@ void set_task_creds_tcnt(int tgid, int addition) } spin_lock_irqsave(&creds_hash_update_lock, flags); - hash_for_each_possible(creds_hash, obj, node, tgid) { - obj->cred_data.tcnt += addition; - if (!obj->cred_data.tcnt) { - hash_del(&obj->node); + if (tgid != pid && addition == -1) { + hash_for_each_possible(creds_hash, pid_obj, node, pid) { + hash_del(&pid_obj->node); + kfree(pid_obj); + break; + } + } + hash_for_each_possible(creds_hash, tgid_obj, node, tgid) { + tgid_obj->cred_data.tcnt += addition; + if (!tgid_obj->cred_data.tcnt) { + hash_del(&tgid_obj->node); spin_unlock_irqrestore(&creds_hash_update_lock, flags); - kfree(obj); + kfree(tgid_obj); return; } break; diff --git a/security/samsung/defex_lsm/defex_priv.c b/security/samsung/defex_lsm/defex_priv.c index c75023ebc143..59cfb77ef11e 100644 --- a/security/samsung/defex_lsm/defex_priv.c +++ b/security/samsung/defex_lsm/defex_priv.c @@ -42,7 +42,12 @@ ssize_t task_defex_privesc_show_status(struct defex_privesc *privesc_obj, ssize_t task_defex_privesc_show_tgid(struct defex_privesc *privesc_obj, struct privesc_attribute *attr, char *buf) { - return snprintf(buf, 3, "%u\n", privesc_obj->tgid); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + unsigned int val = 1; +#else + unsigned int val = 0; +#endif + return snprintf(buf, 3, "%u\n", val); } ssize_t task_defex_privesc_attr_store(struct kobject *kobj, @@ -83,20 +88,6 @@ ssize_t task_defex_privesc_store_status(struct defex_privesc *privesc_obj, return count; } -ssize_t task_defex_privesc_store_tgid(struct defex_privesc *privesc_obj, - struct privesc_attribute *attr, const char *buf, size_t count) -{ - int ret; - unsigned int tgid; - - ret = kstrtouint(buf, 10, &tgid); - if (ret != 0 || tgid > 1) - return -EINVAL; - privesc_obj->tgid = tgid; - - return count; -} - struct defex_privesc *task_defex_create_privesc_obj(struct kset *defex_kset) { struct defex_privesc *privesc; @@ -117,8 +108,6 @@ struct defex_privesc *task_defex_create_privesc_obj(struct kset *defex_kset) /* Initial state of PED feature (0 - disabled, 1 - enabled) */ privesc->status = 0; - /* Initial state of tgid feature (0 - tid-based, 1 - tgid-based) */ - privesc->tgid = 0; return privesc; } @@ -134,7 +123,7 @@ static struct privesc_attribute privesc_status_attribute = __ATTR(status, 0660, task_defex_privesc_show_status, task_defex_privesc_store_status); static struct privesc_attribute privesc_tgid_attribute = - __ATTR(tgid, 0600, task_defex_privesc_show_tgid, task_defex_privesc_store_tgid); + __ATTR(tgid, 0444, task_defex_privesc_show_tgid, NULL); static struct attribute *privesc_default_attrs[] = { &privesc_status_attribute.attr, diff --git a/security/samsung/defex_lsm/defex_procs.c b/security/samsung/defex_lsm/defex_procs.c index dd66f6d0239a..f96310c6f4f2 100644 --- a/security/samsung/defex_lsm/defex_procs.c +++ b/security/samsung/defex_lsm/defex_procs.c @@ -309,7 +309,7 @@ static int at_same_group_gid(unsigned int gid1, unsigned int gid2) #ifdef DEFEX_LP_ENABLE /* Lower Permission feature decision function */ -static int lower_adb_permission(struct task_struct *p, unsigned int p_root) +static int lower_adb_permission(struct task_struct *p, unsigned short cred_flags) { char *parent_file; struct task_struct *parent = NULL; @@ -358,7 +358,7 @@ static int lower_adb_permission(struct task_struct *p, unsigned int p_root) shellcred->fsgid.val = 2000; commit_creds(shellcred); - set_task_creds(p->pid, 2000, 2000, 2000, p_root); + set_task_creds(REF_PID(p), 2000, 2000, 2000, cred_flags); ret = 1; } @@ -374,7 +374,9 @@ out: /* Cred. violation feature decision function */ #define AID_MEDIA_RW 1023 -#define SECUREFD_MEDIA_RW 0xE4E5BF +#define AID_MEDIA_OBB 1059 +#define AID_SYSTEM 1000 + #ifndef DEFEX_DSMS_ENABLE static int task_defex_check_creds(struct task_struct *p) #else @@ -386,7 +388,7 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) unsigned int cur_uid, cur_euid, cur_fsuid, cur_egid; unsigned int ref_uid, ref_fsuid, ref_egid; struct task_struct *parent; - unsigned int p_root; + unsigned short cred_flags; #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE unsigned int g_uid, g_fsuid, g_egid; #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ @@ -395,10 +397,10 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) if (!is_task_creds_ready() || !p->cred) goto out; - get_task_creds(REF_PID(p), &ref_uid, &ref_fsuid, &ref_egid, &p_root); + get_task_creds(REF_PID(p), &ref_uid, &ref_fsuid, &ref_egid, &cred_flags); #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE if (p->tgid != p->pid) { - get_task_creds(p->tgid, &g_uid, &g_fsuid, &g_egid, &p_root); + get_task_creds(p->tgid, &g_uid, &g_fsuid, &g_egid, &cred_flags); } else { g_uid = ref_uid; g_fsuid = ref_fsuid; @@ -428,28 +430,25 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) get_task_struct(parent); read_unlock(&tasklist_lock); if (parent) { - p_root = CHECK_ROOT_CREDS(parent); + if (CHECK_ROOT_CREDS(parent)) + cred_flags |= CRED_FLAGS_PROOT; + put_task_struct(parent); } if (CHECK_ROOT_CREDS(p)) { #ifdef DEFEX_LP_ENABLE - if (!lower_adb_permission(p, p_root)) + if (!lower_adb_permission(p, cred_flags)) #endif /* DEFEX_LP_ENABLE */ { - set_task_creds(REF_PID(p), 1, 1, 1, p_root); + set_task_creds(REF_PID(p), 1, 1, 1, cred_flags); } } else - set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, p_root); + set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, cred_flags); } else if (ref_uid == 1) { - if (!CHECK_ROOT_CREDS(p) -#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE - && (p->tgid == p->pid) -#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ - ) { - set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, p_root); - } + if (!CHECK_ROOT_CREDS(p)) + set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, cred_flags); } else if (ref_uid == dead_uid #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE || g_uid == dead_uid @@ -464,25 +463,38 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) } else { check_deeper = 0; /* temporary allow fsuid changes to "media_rw" */ - if ((cur_uid != ref_uid) || (cur_euid != ref_uid) || !((cur_fsuid == ref_fsuid) || (cur_fsuid == ref_uid) || (cur_fsuid == AID_MEDIA_RW) || (cur_fsuid == SECUREFD_MEDIA_RW)) || (cur_egid != ref_egid)) { + if ( (cur_uid != ref_uid) || + (cur_euid != ref_uid) || + (cur_egid != ref_egid) || + !((cur_fsuid == ref_fsuid) || + (cur_fsuid == ref_uid) || + (cur_fsuid%100000 == AID_SYSTEM) || + (cur_fsuid%100000 == AID_MEDIA_RW) || + (cur_fsuid%100000 == AID_MEDIA_OBB)) ) { check_deeper = 1; -#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE - if (p->tgid == p->pid) -#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ - set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, p_root); + if (CHECK_ROOT_CREDS(p)) + set_task_creds(REF_PID(p), 1, 1, 1, cred_flags); + else + set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, cred_flags); } - if (check_deeper && (!at_same_group(cur_uid, ref_uid) || + if (check_deeper && + (!at_same_group(cur_uid, ref_uid) || !at_same_group(cur_euid, ref_uid) || !at_same_group_gid(cur_egid, ref_egid) || !at_same_group(cur_fsuid, ref_fsuid)) && task_defex_is_secured(p)) { +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + case_num = ((p->tgid == p->pid) ? 1 : 2); +#else case_num = 1; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ goto trigger_violation; } #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE if (p->tgid != p->pid) { - if ((g_uid > 1) && (!at_same_group(cur_uid, g_uid) || + if ((g_uid > 1) && + (!at_same_group(cur_uid, g_uid) || !at_same_group(cur_euid, g_uid) || !at_same_group_gid(cur_egid, g_egid)) && task_defex_is_secured(p)) { @@ -493,13 +505,15 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ } - if (CHECK_ROOT_CREDS(p) && !p_root && task_defex_is_secured(p)) { + if (CHECK_ROOT_CREDS(p) && !(cred_flags & CRED_FLAGS_PROOT) && task_defex_is_secured(p)) { + if ((p->tgid != p->pid) #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE - if ((p->tgid != p->pid) && (g_uid > 1)) { + && (g_uid > 1) +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + ) { case_num = 3; goto trigger_violation; } -#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ case_num = 4; goto trigger_violation; } @@ -508,10 +522,10 @@ out: return DEFEX_ALLOW; trigger_violation: - set_task_creds(REF_PID(p), dead_uid, dead_uid, dead_uid, p_root); + set_task_creds(REF_PID(p), dead_uid, dead_uid, dead_uid, cred_flags); #ifndef DEFEX_PED_BASED_ON_TGID_ENABLE if (p->tgid != p->pid) - set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, p_root); + set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, cred_flags); #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ path = defex_get_filename(p); pr_crit("defex[%d]: credential violation [task=%s, filename=%s, uid=%d, tgid=%u, pid=%u, ppid=%u]\n", diff --git a/security/samsung/defex_lsm/defex_rules.c b/security/samsung/defex_lsm/defex_rules.c index e6a4a5cfc57b..bd842c9dc079 100644 --- a/security/samsung/defex_lsm/defex_rules.c +++ b/security/samsung/defex_lsm/defex_rules.c @@ -13,7 +13,6 @@ const struct static_rule defex_static_rules[] = { {feature_safeplace_status,"1"}, {feature_immutable_status,"1"}, {feature_ped_status,"1"}, - {feature_ped_tgid,"1"}, #ifndef DEFEX_USE_PACKED_RULES {feature_ped_exception,"/system/bin/run-as"}, /* DEFAULT */ {feature_ped_exception,"/system/bin/dumpstate"}, /* DEFAULT */ diff --git a/security/samsung/defex_lsm/defex_sysfs.c b/security/samsung/defex_lsm/defex_sysfs.c index e6acc028c9ba..bbc801f4403a 100644 --- a/security/samsung/defex_lsm/defex_sysfs.c +++ b/security/samsung/defex_lsm/defex_sysfs.c @@ -181,11 +181,6 @@ static void parse_static_rules(const struct static_rule *rules, size_t max_len, #endif /* DEFEX_PERMISSIVE_PED */ task_defex_privesc_store_status(global_privesc_obj, NULL, current_rule, count); break; -#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE - case feature_ped_tgid: - task_defex_privesc_store_tgid(global_privesc_obj, NULL, current_rule, count); - break; -#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ #endif /* DEFEX_PED_ENABLE */ #ifdef DEFEX_SAFEPLACE_ENABLE case feature_safeplace_status: diff --git a/security/samsung/defex_lsm/include/defex_internal.h b/security/samsung/defex_lsm/include/defex_internal.h index 9553c215378d..b0d2a3b800b8 100644 --- a/security/samsung/defex_lsm/include/defex_internal.h +++ b/security/samsung/defex_lsm/include/defex_internal.h @@ -88,15 +88,38 @@ void creds_fast_hash_init(void); #endif /* STRICT_UID_TYPE_CHECKS */ #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE -# define REF_PID(p) ((p)->tgid) +# define REF_PID(p) (p) #else # define REF_PID(p) ((p)->pid) #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ +#define CRED_FLAGS_PROOT (1 << 0) /* parent is root */ +#define CRED_FLAGS_MAIN_UPDATED (1 << 1) /* main thread's permission updated */ +#define CRED_FLAGS_SUB_UPDATED (1 << 2) /* sub thread's permission updated */ + +#define GET_CREDS(x, y, z, w) uid = cred_data->x; \ + fsuid = cred_data->y; \ + egid = cred_data->z; \ + cred_flags = cred_data->w; + +#define GET_CREDS_OBJ(x, y, z, w) uid = obj->cred_data.x; \ + fsuid = obj->cred_data.y; \ + egid = obj->cred_data.z; \ + cred_flags = obj->cred_data.w; + +#define SET_CREDS(x, y, z, w) cred_data->x = uid; \ + cred_data->y = fsuid; \ + cred_data->z = egid; \ + cred_data->w |= cred_flags; + +#define SET_CREDS_OBJ(x, y, z, w) obj->cred_data.x = uid; \ + obj->cred_data.y = fsuid; \ + obj->cred_data.z = egid; \ + obj->cred_data.w |= cred_flags; + struct defex_privesc { struct kobject kobj; unsigned int status; - unsigned int tgid; }; #define to_privesc_obj(obj) container_of(obj, struct defex_privesc, kobj) @@ -112,14 +135,14 @@ void task_defex_destroy_privesc_obj(struct defex_privesc *privesc); extern struct defex_privesc *global_privesc_obj; ssize_t task_defex_privesc_store_status(struct defex_privesc *privesc_obj, struct privesc_attribute *attr, const char *buf, size_t count); -ssize_t task_defex_privesc_store_tgid(struct defex_privesc *privesc_obj, - struct privesc_attribute *attr, const char *buf, size_t count); -void get_task_creds(int pid, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned int *p_root_ptr); -int set_task_creds(int pid, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned int p_root); #ifdef DEFEX_PED_BASED_ON_TGID_ENABLE -void set_task_creds_tcnt(int tgid, int addition); +void get_task_creds(struct task_struct *p, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned short *cred_flags_ptr); +int set_task_creds(struct task_struct *p, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned short cred_flags); +void set_task_creds_tcnt(struct task_struct *p, int addition); #else +void get_task_creds(int pid, unsigned int *uid_ptr, unsigned int *fsuid_ptr, unsigned int *egid_ptr, unsigned short *cred_flags_ptr); +int set_task_creds(int pid, unsigned int uid, unsigned int fsuid, unsigned int egid, unsigned short cred_flags); void delete_task_creds(int pid); #endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ int is_task_creds_ready(void); diff --git a/security/samsung/defex_lsm/include/defex_rules.h b/security/samsung/defex_lsm/include/defex_rules.h index 2fb7cfdb24b5..3d24b81c2389 100644 --- a/security/samsung/defex_lsm/include/defex_rules.h +++ b/security/samsung/defex_lsm/include/defex_rules.h @@ -22,13 +22,12 @@ enum feature_types { feature_ped_path = 4, feature_ped_exception = 8, feature_ped_status = 16, - feature_ped_tgid = 32, - feature_safeplace_path = 64, - feature_safeplace_status = 128, - feature_immutable_path_open = 256, - feature_immutable_path_write = 512, - feature_immutable_src_exception = 1024, - feature_immutable_status = 2048 + feature_safeplace_path = 32, + feature_safeplace_status = 64, + feature_immutable_path_open = 128, + feature_immutable_path_write = 256, + feature_immutable_src_exception = 512, + feature_immutable_status = 1024 }; struct feature_match_entry { diff --git a/sound/core/timer.c b/sound/core/timer.c index 152254193c69..88001d71a08d 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -280,9 +280,10 @@ int snd_timer_open(struct snd_timer_instance **ti, return -ENODEV; } if (!list_empty(&timer->open_list_head)) { - timeri = list_entry(timer->open_list_head.next, + struct snd_timer_instance *t = + list_entry(timer->open_list_head.next, struct snd_timer_instance, open_list); - if (timeri->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) { + if (t->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) { mutex_unlock(®ister_mutex); return -EBUSY; } diff --git a/sound/soc/samsung/abox/abox_rdma.c b/sound/soc/samsung/abox/abox_rdma.c index 31691ee7c928..e345123c353d 100644 --- a/sound/soc/samsung/abox/abox_rdma.c +++ b/sound/soc/samsung/abox/abox_rdma.c @@ -1660,10 +1660,13 @@ static int abox_rdma_mmap(struct snd_pcm_substream *substream, abox_request_cpu_gear_dai(dev, data->abox_data, rtd->cpu_dai, data->abox_data->cpu_gear_min - 1); - return dma_mmap_writecombine(dev, vma, - runtime->dma_area, - runtime->dma_addr, - runtime->dma_bytes); + if (data->buf_type == BUFFER_TYPE_ION) + return dma_buf_mmap(data->ion_buf.dma_buf, vma, 0); + else + return dma_mmap_writecombine(dev, vma, + runtime->dma_area, + runtime->dma_addr, + runtime->dma_bytes); } static int abox_rdma_ack(struct snd_pcm_substream *substream) diff --git a/sound/soc/samsung/abox/abox_wdma.c b/sound/soc/samsung/abox/abox_wdma.c index efac0b4c0042..7011e76023b1 100644 --- a/sound/soc/samsung/abox/abox_wdma.c +++ b/sound/soc/samsung/abox/abox_wdma.c @@ -462,10 +462,13 @@ static int abox_wdma_mmap(struct snd_pcm_substream *substream, abox_request_cpu_gear_dai(dev, data->abox_data, rtd->cpu_dai, data->abox_data->cpu_gear_min - 1); - return dma_mmap_writecombine(dev, vma, - runtime->dma_area, - runtime->dma_addr, - runtime->dma_bytes); + if (data->buf_type == BUFFER_TYPE_ION) + return dma_buf_mmap(data->ion_buf.dma_buf, vma, 0); + else + return dma_mmap_writecombine(dev, vma, + runtime->dma_area, + runtime->dma_addr, + runtime->dma_bytes); } static int abox_wdma_ack(struct snd_pcm_substream *substream)