From 671d649fa8b4699e08697da2e789065db8a973fb Mon Sep 17 00:00:00 2001 From: prashantpaddune Date: Tue, 18 Aug 2020 17:38:19 +0530 Subject: [PATCH] A750FNPUU4CTE3 --- .../exynos/exynos7885-a7y18lte_common.dtsi | 6 +- .../configs/exynos7885-a7y18lte_defconfig | 13 +- drivers/battery_v2/max77865_charger.c | 8 +- drivers/battery_v2/max77865_fuelgauge.c | 2 +- drivers/battery_v2/mfc_charger.c | 2 +- drivers/battery_v2/s2mu004_charger.c | 12 +- drivers/battery_v2/s2mu004_fuelgauge.c | 8 +- drivers/battery_v2/s2mu005_charger.c | 5 +- drivers/battery_v2/s2mu005_fuelgauge.c | 10 +- drivers/battery_v2/s2mu106_charger.c | 8 +- drivers/battery_v2/s2mu106_fuelgauge.c | 12 +- drivers/battery_v2/s2mu205_charger.c | 25 +- drivers/battery_v2/s2mu205_fuelgauge.c | 10 +- drivers/battery_v2/sec_battery.c | 2 +- drivers/ccic/s2mu004-usbpd.c | 15 +- drivers/ccic/s2mu106-usbpd.c | 19 +- drivers/ccic/usbpd.c | 2 + drivers/ccic/usbpd_manager.c | 13 +- drivers/ccic/usbpd_policy.c | 20 +- drivers/fingerprint/gf_common.c | 8 +- drivers/gpu/arm/tMIx/r10p0/build.bp | 95 + drivers/hid/hid-multitouch.c | 4 +- drivers/input/ff-memless.c | 2 +- drivers/input/touchscreen/Makefile | 3 +- .../touchscreen/imagis/ist4050/ist40xx.c | 2 +- .../touchscreen/imagis/ist4050/ist40xx.h | 1 + .../touchscreen/imagis/ist4050/ist40xx_sec.c | 19 + .../input/touchscreen/melfas_mss100/Kconfig | 9 + .../input/touchscreen/melfas_mss100/Makefile | 3 +- .../touchscreen/melfas_mss100/melfas_mss100.c | 8 +- .../touchscreen/melfas_mss100/melfas_mss100.h | 1 + .../melfas_mss100/melfas_mss100_cmd.c | 21 +- drivers/md/dm-verity-target.c | 18 +- .../exynos/fimc-is2/fimc-is-device-ischain.c | 20 +- .../exynos/fimc-is2/fimc-is-interface-wrap.c | 16 +- .../exynos/fimc-is2/fimc-is-interface-wrap.h | 2 +- .../hardware/fimc-is-hw-mcscaler-v2.c | 32 +- .../fimc-is-v6_20_0/fimc-is-hw-chain.h | 15 +- .../actuator/fimc-is-actuator-zc535.c | 12 +- .../module_framework/cis/fimc-is-cis-3l6.c | 5 +- .../fimc-is-device-sensor-peri.c | 64 +- .../fimc-is-device-sensor-peri.h | 1 + .../actuator/fimc-is-actuator-zc535.c | 12 +- .../fimc-is-device-sensor-peri.c | 4 +- drivers/media/radio/s610/fm_low.c | 2 +- drivers/misc/gnss_if/gnss_io_device.c | 2 +- drivers/misc/modem_v1/modem_utils.c | 13 +- drivers/misc/samsung/scsc/scsc_wlbtd.c | 133 +- drivers/misc/samsung/scsc/scsc_wlbtd.h | 3 + drivers/misc/usim_det/usim_detect.c | 51 +- drivers/mmc/host/dw_mmc.c | 2 +- drivers/net/wireless/scsc/cfg80211_ops.c | 85 +- drivers/net/wireless/scsc/dev.h | 13 +- drivers/net/wireless/scsc/fapi.h | 2185 ++----- drivers/net/wireless/scsc/fw_test.c | 12 +- drivers/net/wireless/scsc/ioctl.c | 782 ++- drivers/net/wireless/scsc/mgt.c | 64 +- drivers/net/wireless/scsc/mgt.h | 2 + drivers/net/wireless/scsc/mib.h | 1312 +++- drivers/net/wireless/scsc/mlme.c | 142 +- drivers/net/wireless/scsc/mlme.h | 5 +- drivers/net/wireless/scsc/nl80211_vendor.c | 70 +- .../net/wireless/scsc/nl80211_vendor_nan.c | 260 +- drivers/net/wireless/scsc/rx.c | 42 +- drivers/net/wireless/scsc/sap_ma.c | 26 +- drivers/regulator/core.c | 102 + .../security/samsung/five_tee_driver/Kconfig | 81 + .../security/samsung/five_tee_driver/Makefile | 98 + .../samsung/five_tee_driver/five_ta_uuid.h | 52 + .../samsung/five_tee_driver/five_tee_driver.c | 722 +++ .../include/gp-api/tee_client_api.h | 233 + .../source/gp-api/client/tee_client_api.c | 260 + .../source/gp-api/client/teec_common.h | 50 + .../source/gp-api/client/teec_common_qsee.c | 265 + .../source/gp-api/client/teec_common_tbase.c | 327 + .../gp-api/client/teec_common_teegris_v2.c | 283 + .../source/gp-api/client/teec_operation.h | 28 + .../gp-api/client/teec_operation_qsee.c | 37 + .../gp-api/client/teec_operation_tbase.c | 37 + .../gp-api/client/teec_operation_teegris_v2.c | 37 + .../gp-api/client/teec_operation_teegris_v3.c | 29 + .../source/gp-api/protocol/protocol.h | 87 + .../source/gp-api/protocol/teec_param_utils.c | 168 + .../source/gp-api/protocol/teec_param_utils.h | 29 + drivers/security/samsung/tzic/Kconfig | 42 + drivers/security/samsung/tzic/Makefile | 22 + drivers/security/samsung/tzic/tzic.h | 34 + drivers/security/samsung/tzic/tzic64.c | 381 ++ drivers/security/samsung/tzic/tzic_default.c | 27 + drivers/security/samsung/tzic/tzic_kinibi.c | 58 + drivers/security/samsung/tzic/tzic_mtk_atf.c | 47 + drivers/security/samsung/tzic/tzic_qsee.c | 82 + drivers/security/samsung/tzic/tzic_tzdev.c | 82 + drivers/sensors/Kconfig | 8 + drivers/sensors/gp2ap110s.c | 92 +- drivers/sensors/stk3x3x.c | 8 +- drivers/sensors/yas_mag_kernel.c | 18 +- drivers/staging/samsung/Kconfig | 12 + drivers/staging/samsung/sec_debug.c | 27 + drivers/staging/samsung/sec_param.c | 10 +- drivers/trace/exynos-ss.c | 9 + .../usb/manager/usb_typec_manager_notifier.c | 3 +- .../video/fbdev/exynos/dpu_7885/decon_abd.c | 953 ++- .../video/fbdev/exynos/dpu_7885/decon_abd.h | 175 +- .../video/fbdev/exynos/dpu_7885/decon_board.c | 128 +- .../video/fbdev/exynos/dpu_7885/decon_board.h | 4 + .../fbdev/exynos/dpu_7885/decon_notify.c | 267 +- .../fbdev/exynos/dpu_7885/decon_notify.h | 13 + .../dpu_7885/panels/ea8061s_j7duo_lcd_ctrl.c | 2 +- .../dpu_7885/panels/ea8076_a30_lcd_ctrl.c | 2 +- .../dpu_7885/panels/ea8076_m30_lcd_ctrl.c | 2 +- .../panels/hx8279d_gta3xllte_lcd_ctrl.c | 2 +- .../dpu_7885/panels/hx8279d_wisdom_lcd_ctrl.c | 2 +- .../dpu_7885/panels/hx83102d_a10e_lcd_ctrl.c | 2 +- .../dpu_7885/panels/hx83102d_a20e_lcd_ctrl.c | 2 +- .../dpu_7885/panels/hx83102p_gta4s_lcd_ctrl.c | 10 +- .../dpu_7885/panels/hx83102p_gta4s_param.h | 8 +- .../dpu_7885/panels/hx83112a_m20_lcd_ctrl.c | 2 +- .../panels/s6d7aa0_xcover4s_lcd_ctrl.c | 2 +- .../panels/s6d7at0b_a10_boe_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6d7at0b_a10_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6d7at0b_a20e_lcd_ctrl.c | 2 +- .../panels/s6d7at0b_j7tope_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e3fa7_a7y18_lcd_ctrl.c | 9 +- .../panels/s6e3fa7_jackpot_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e8aa5_a6elte_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e8fc0_a20_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e8fc0_a20_param.h | 6 +- .../dpu_7885/panels/s6e8fc0_a30c_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e8fc0_a40_lcd_ctrl.c | 2 +- .../dpu_7885/panels/s6e8fc0_a40_param.h | 6 +- .../dpu_7885/panels/s6e8fc1_a30s_lcd_ctrl.c | 5 +- .../dpu_7885/panels/td4100_j3tope_lcd_ctrl.c | 2 +- .../panels/td4101_j2corepelte_lcd_ctrl.c | 2 +- firmware/Makefile | 1 + firmware/tsp_himax/hx83112a_m20lte.fw.ihex | 5426 ++++++++--------- fs/file.c | 5 +- fs/fuse/dev.c | 6 +- fs/fuse/dir.c | 2 +- fs/fuse/file.c | 2 +- fs/fuse/fuse_i.h | 30 + fs/proc/Kconfig | 6 +- include/linux/ccic/usbpd.h | 3 +- include/linux/cpuset.h | 1 + include/linux/netfilter/xt_domainfilter.h | 35 + include/linux/regulator/machine.h | 9 + include/linux/sec_ext.h | 4 +- include/linux/usim_det.h | 9 +- include/scsc/scsc_release.h | 2 +- .../uapi/linux/netfilter/xt_domainfilter.h | 35 + kernel/cpu.c | 11 + kernel/cpuset.c | 33 + kernel/power/suspend.c | 4 + kernel/sched/fair.c | 14 +- net/ipv6/ipv6_sockglue.c | 2 + net/key/af_key.c | 40 +- net/netfilter/Makefile | 1 + net/netfilter/xt_domainfilter.c | 152 + security/samsung/defex_lsm/Makefile | 4 + security/samsung/defex_lsm/defex_ht.c | 301 +- security/samsung/defex_lsm/defex_priv.c | 14 + security/samsung/defex_lsm/defex_procs.c | 166 +- .../defex_lsm/include/defex_internal.h | 42 +- security/samsung/five/five_crypto.c | 5 + security/samsung/five/five_main.c | 4 +- sound/core/timer.c | 5 +- sound/soc/samsung/abox/abox.c | 4 +- 167 files changed, 11715 insertions(+), 5949 deletions(-) create mode 100644 drivers/gpu/arm/tMIx/r10p0/build.bp create mode 100644 drivers/security/samsung/five_tee_driver/Kconfig create mode 100644 drivers/security/samsung/five_tee_driver/Makefile create mode 100644 drivers/security/samsung/five_tee_driver/five_ta_uuid.h create mode 100644 drivers/security/samsung/five_tee_driver/five_tee_driver.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/include/gp-api/tee_client_api.h create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/tee_client_api.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common.h create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_qsee.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_tbase.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_teegris_v2.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation.h create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_qsee.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_tbase.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v2.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v3.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/protocol.h create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.c create mode 100644 drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.h create mode 100644 drivers/security/samsung/tzic/Kconfig create mode 100644 drivers/security/samsung/tzic/Makefile create mode 100644 drivers/security/samsung/tzic/tzic.h create mode 100644 drivers/security/samsung/tzic/tzic64.c create mode 100644 drivers/security/samsung/tzic/tzic_default.c create mode 100644 drivers/security/samsung/tzic/tzic_kinibi.c create mode 100644 drivers/security/samsung/tzic/tzic_mtk_atf.c create mode 100644 drivers/security/samsung/tzic/tzic_qsee.c create mode 100644 drivers/security/samsung/tzic/tzic_tzdev.c 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/exynos7885-a7y18lte_common.dtsi b/arch/arm64/boot/dts/exynos/exynos7885-a7y18lte_common.dtsi index 08aa9c695..4c80c8793 100644 --- a/arch/arm64/boot/dts/exynos/exynos7885-a7y18lte_common.dtsi +++ b/arch/arm64/boot/dts/exynos/exynos7885-a7y18lte_common.dtsi @@ -2118,9 +2118,9 @@ status = "okay"; bootc { - bootc,time_spec_user = <50000>; /* user binary user build */ - bootc,time_spec_eng = <80000>; /* user binary eng build */ - bootc,time_spec_fac = <50000>; /* factory binary */ + bootc,time_spec_user = <100000>; /* user binary user build */ + bootc,time_spec_eng = <100000>; /* user binary eng build */ + bootc,time_spec_fac = <100000>; /* factory binary */ }; }; diff --git a/arch/arm64/configs/exynos7885-a7y18lte_defconfig b/arch/arm64/configs/exynos7885-a7y18lte_defconfig index e3671862e..ae60292d3 100644 --- a/arch/arm64/configs/exynos7885-a7y18lte_defconfig +++ b/arch/arm64/configs/exynos7885-a7y18lte_defconfig @@ -115,7 +115,7 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y -CONFIG_LOG_BUF_SHIFT=20 +CONFIG_LOG_BUF_SHIFT=19 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CGROUPS=y @@ -1345,10 +1345,7 @@ CONFIG_SCSC_PLATFORM=y # CONFIG_SCSC_CLK20MHZ is not set CONFIG_SCSC_MMAP=y # CONFIG_SCSC_DBG_SAMPLER is not set -CONFIG_SCSC_DEBUG=y -CONFIG_SCSC_DEBUG_COMPATIBILITY=y -CONFIG_SCSC_STATIC_RING=y -CONFIG_SCSC_STATIC_RING_SIZE=4194304 +# CONFIG_SCSC_DEBUG is not set # CONFIG_SCSC_CHV_SUPPORT is not set # CONFIG_SCSC_GPR4_CON_DEBUG is not set CONFIG_SCSC_BUILD_TYPE="User" @@ -1863,6 +1860,7 @@ CONFIG_TOUCHSCREEN_SEC_TS_GLOVEMODE=y # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_TD4X00_J2CORESPR is not set # CONFIG_TOUCHSCREEN_MELFAS_MMS438 is not set # CONFIG_TOUCHSCREEN_MELFAS_MSS100 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MSS100_A30KOR is not set # CONFIG_TOUCHSCREEN_FTS is not set # CONFIG_TOUCHSCREEN_FTS1BA90A is not set # CONFIG_TOUCHSCREEN_IST30XXC is not set @@ -3936,6 +3934,7 @@ CONFIG_SEC_DEBUG_AVOID_UNNECESSARY_TRAP=y # CONFIG_SEC_PARAM=y CONFIG_CM_OFFSET=7340596 +CONFIG_FMM_LOCK_OFFSET=7340680 CONFIG_SEC_EVENT_LOG=y CONFIG_SEC_BOOTSTAT=y CONFIG_ARGOS=y @@ -3982,6 +3981,7 @@ CONFIG_SEC_GPIO=y # # CONFIG_SEC_VTS_TEST is not set # CONFIG_SEC_PERIPHERAL_SECURE_CHK is not set +# CONFIG_SEC_DEBUG_SNAPSHOT_DISABLE is not set CONFIG_VNSWAP=y CONFIG_SEC_STI=y @@ -4571,6 +4571,7 @@ CONFIG_SENSORS_LSM6DSL_I2C=y # CONFIG_SENSORS_LIS2DS_SPI is not set # CONFIG_SENSORS_K2HH is not set CONFIG_SENSORS_YAS539=y +# CONFIG_SENSORS_YAS539_A20E is not set # CONFIG_SENSORS_GP2AP070S is not set # CONFIG_SENSORS_GP2AP110S is not set # CONFIG_SENSORS_STK3013 is not set @@ -5348,4 +5349,4 @@ CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y # CONFIG_SG_SPLIT is not set CONFIG_ARCH_HAS_SG_CHAIN=y -CONFIG_FPSIMD_CORRUPTION_DETECT=y +# CONFIG_FPSIMD_CORRUPTION_DETECT is not set diff --git a/drivers/battery_v2/max77865_charger.c b/drivers/battery_v2/max77865_charger.c index f9031dcfc..db6e7c982 100644 --- a/drivers/battery_v2/max77865_charger.c +++ b/drivers/battery_v2/max77865_charger.c @@ -647,7 +647,7 @@ static void max77865_set_otg(struct max77865_charger_data *charger, int enable) /* Update CHG_CNFG_11 to 0x00(3.485V) */ max77865_write_reg(charger->i2c, MAX77865_CHG_REG_CNFG_11, 0x00); - mdelay(50); + msleep(50); /* enable charger interrupt */ max77865_write_reg(charger->i2c, @@ -1165,7 +1165,7 @@ static int max77865_chg_set_property(struct power_supply *psy, /* Update CHG_CNFG_11 to 0x00(3.485V) */ max77865_write_reg(charger->i2c, MAX77865_CHG_REG_CNFG_11, 0x00); - mdelay(50); + msleep(50); /* enable charger interrupt */ max77865_write_reg(charger->i2c, @@ -1401,7 +1401,7 @@ static void wpc_detect_work(struct work_struct *work) psy_do_property(charger->pdata->wireless_charger_name, set, POWER_SUPPLY_PROP_STATUS, value); } - mdelay(50); + msleep(50); } while (!wcin_state && !wcin_dtls && wcin_cnt < 2); } @@ -1525,7 +1525,7 @@ static void max77865_aicl_isr_work(struct work_struct *work) reduce_input_current(charger, REDUCE_CURRENT_STEP); aicl_cnt = 0; } - mdelay(50); + msleep(50); max77865_read_reg(charger->i2c, MAX77865_CHG_REG_INT_OK, &aicl_state); if (max77865_get_input_current(charger) <= MINIMUM_INPUT_CURRENT) break; diff --git a/drivers/battery_v2/max77865_fuelgauge.c b/drivers/battery_v2/max77865_fuelgauge.c index 9d27bb309..006fafbfa 100644 --- a/drivers/battery_v2/max77865_fuelgauge.c +++ b/drivers/battery_v2/max77865_fuelgauge.c @@ -871,7 +871,7 @@ int max77865_fg_alert_init(struct max77865_fuelgauge_data *fuelgauge, int soc) pr_err("%s: TALRT_THRESHOLD_REG is not valid (0x%x)\n", __func__, read_data); - /*mdelay(100);*/ + /*msleep(100);*/ /* Enable SOC alerts */ if (max77865_bulk_read(fuelgauge->i2c, CONFIG_REG, diff --git a/drivers/battery_v2/mfc_charger.c b/drivers/battery_v2/mfc_charger.c index 83d6edc9f..b1f7b5401 100644 --- a/drivers/battery_v2/mfc_charger.c +++ b/drivers/battery_v2/mfc_charger.c @@ -2746,7 +2746,7 @@ void mfc_mst_routine(struct mfc_charger_data *charger, u8 *irq_src) mfc_reg_write(charger->client, MFC_INT_A_CLEAR_H_REG, irq_src[1]); // clear int mfc_set_cmd_l_reg(charger, 0x20, MFC_CMD_CLEAR_INT_MASK); // command - mdelay(10); + msleep(10); } } diff --git a/drivers/battery_v2/s2mu004_charger.c b/drivers/battery_v2/s2mu004_charger.c index 401119f5b..644075a84 100644 --- a/drivers/battery_v2/s2mu004_charger.c +++ b/drivers/battery_v2/s2mu004_charger.c @@ -322,7 +322,7 @@ static void s2mu004_enable_charger_switch( /* forced ASYNC */ s2mu004_update_reg(charger->i2c, 0x30, 0x03, 0x03); - mdelay(30); + msleep(30); s2mu004_update_reg(charger->i2c, S2MU004_CHG_CTRL0, CHG_MODE, REG_MODE_MASK); @@ -331,7 +331,7 @@ static void s2mu004_enable_charger_switch( S2MU004_FC_CHG_TIMER_16hr << SET_TIME_CHG_SHIFT, SET_TIME_CHG_MASK); - mdelay(100); + msleep(100); /* Auto SYNC to ASYNC - default */ s2mu004_update_reg(charger->i2c, 0x30, 0x01, 0x03); @@ -347,12 +347,12 @@ static void s2mu004_enable_charger_switch( s2mu004_analog_ivr_switch(charger, DISABLE); } #endif - mdelay(30); + msleep(30); s2mu004_update_reg(charger->i2c, S2MU004_CHG_CTRL0, BUCK_MODE, REG_MODE_MASK); /* async on */ s2mu004_update_reg(charger->i2c, 0x96, 0x01 << 3, 0x01 << 3); - mdelay(100); + msleep(100); } } @@ -375,7 +375,7 @@ static void s2mu004_set_buck(struct s2mu004_charger_data *charger, int enable) /* async on */ s2mu004_update_reg(charger->i2c, 0x96, 0x01 << 3, 0x01 << 3); - mdelay(100); + msleep(100); } } @@ -1538,7 +1538,7 @@ static void s2mu004_ivr_irq_work(struct work_struct *work) reduce_input_current(charger); ivr_cnt = 0; } - mdelay(50); + msleep(50); if (!(ivr_state & IVR_STATUS)) { pr_info("%s: EXIT IVR WORK: check value (0x0D:0x%02x, input current:%d)\n", __func__, diff --git a/drivers/battery_v2/s2mu004_fuelgauge.c b/drivers/battery_v2/s2mu004_fuelgauge.c index a0cf5b862..4a02ba120 100644 --- a/drivers/battery_v2/s2mu004_fuelgauge.c +++ b/drivers/battery_v2/s2mu004_fuelgauge.c @@ -799,7 +799,7 @@ static int s2mu004_get_rawsoc(struct s2mu004_fuelgauge_data *fuelgauge) /* SOC VM Monitoring For debugging SOC error */ s2mu004_read_reg_byte(fuelgauge->i2c, S2MU004_REG_MONOUT_SEL, &r_monoutsel); s2mu004_write_reg_byte(fuelgauge->i2c, S2MU004_REG_MONOUT_SEL, 0x02); - mdelay(10); + msleep(10); if (s2mu004_read_reg(fuelgauge->i2c, S2MU004_REG_MONOUT, mount_data) < 0) return -EINVAL; @@ -1144,7 +1144,7 @@ static int s2mu004_get_monout_avgvbat(struct s2mu004_fuelgauge_data *fuelgauge) s2mu004_write_reg_byte(fuelgauge->i2c, S2MU004_REG_MONOUT_SEL, 0x27); - mdelay(50); + msleep(50); if (s2mu004_read_reg(fuelgauge->i2c, S2MU004_REG_MONOUT, data) < 0) goto err; @@ -1682,7 +1682,7 @@ static int s2mu004_fg_set_property(struct power_supply *psy, temp &= 0xCF; temp |= 0x10; s2mu004_write_reg_byte(fuelgauge->i2c, S2MU004_REG_CTRL0, temp); - mdelay(1000); + msleep(1000); s2mu004_restart_gauging(fuelgauge); s2mu004_fg_reset_capacity_by_jig_connection(fuelgauge); } else if (val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_OFF) { @@ -1694,7 +1694,7 @@ static int s2mu004_fg_set_property(struct power_supply *psy, else temp |= 0x10; s2mu004_write_reg_byte(fuelgauge->i2c, S2MU004_REG_CTRL0, temp); - mdelay(1000); + msleep(1000); s2mu004_restart_gauging(fuelgauge); } s2mu004_read_reg_byte(fuelgauge->i2c, S2MU004_REG_CTRL0, &temp); diff --git a/drivers/battery_v2/s2mu005_charger.c b/drivers/battery_v2/s2mu005_charger.c index feed23266..04f3ae4b2 100755 --- a/drivers/battery_v2/s2mu005_charger.c +++ b/drivers/battery_v2/s2mu005_charger.c @@ -77,7 +77,7 @@ static void s2mu005_test_read(struct i2c_client *i2c) static int reg_list[] = { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x2A, - 0x51, 0x7E, 0x55, 0x5E, 0x7B + 0x51, 0x7E, 0x55, 0x5E, 0x7B, 0x23, 0x26, 0xA7 }; u8 data; char str[1016] = {0,}; @@ -169,7 +169,7 @@ static void s2mu005_charger_otg_control(struct s2mu005_charger_data *charger, s2mu005_update_reg(charger->client, S2MU005_CHG_CTRL0, 5 << REG_MODE_SHIFT, REG_MODE_MASK); - mdelay(150); + msleep(150); pr_info("%s: EVT4 OTG Control for factory mode\n", __func__); /* set mode to Charger mode */ @@ -1804,6 +1804,7 @@ static int s2mu005_charger_probe(struct platform_device *pdev) charger->ivr_on = false; charger->slow_charging = false; charger->input_current = 1000; + charger->cable_type = SEC_BATTERY_CABLE_NONE; charger->pdata = devm_kzalloc(&pdev->dev, sizeof(*(charger->pdata)), GFP_KERNEL); diff --git a/drivers/battery_v2/s2mu005_fuelgauge.c b/drivers/battery_v2/s2mu005_fuelgauge.c index dd310d410..01e42aeca 100644 --- a/drivers/battery_v2/s2mu005_fuelgauge.c +++ b/drivers/battery_v2/s2mu005_fuelgauge.c @@ -1426,7 +1426,7 @@ static int s2mu005_get_monout_avgvbat(struct s2mu005_fuelgauge_data *fuelgauge) s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, S2MU005_REG_MONOUT_SEL, 0x27); } - mdelay(50); + msleep(50); if (s2mu005_read_reg(fuelgauge->i2c, S2MU005_REG_MONOUT, data) < 0) goto err; @@ -2023,7 +2023,7 @@ static int s2mu005_fg_set_property(struct power_supply *psy, if (fuelgauge->revision >= 3) { u8 reg_0x41 = 0, reg_0x27 = 0, reg_0x26 = 0, temp = 0; pr_info("%s, swelling SOC jump issue W/A\n", __func__); - mdelay(250); + msleep(250); s2mu005_read_reg_byte(fuelgauge->i2c, 0x41, ®_0x41); s2mu005_read_reg_byte(fuelgauge->i2c, 0x27, ®_0x27); @@ -2036,7 +2036,7 @@ static int s2mu005_fg_set_property(struct power_supply *psy, s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x27, temp); s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x26, 0xFD); - mdelay(260); + msleep(260); s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x26, reg_0x26); s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x27, reg_0x27); @@ -2098,7 +2098,7 @@ static int s2mu005_fg_set_property(struct power_supply *psy, temp &= 0xCF; temp |= 0x10; s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x25, temp); - mdelay(1000); + msleep(1000); s2mu005_restart_gauging(fuelgauge); s2mu005_fg_reset_capacity_by_jig_connection(fuelgauge); s2mu005_fg_test_read(fuelgauge->i2c); @@ -2109,7 +2109,7 @@ static int s2mu005_fg_set_property(struct power_supply *psy, temp &= 0xCF; temp |= 0x30; s2mu005_write_and_verify_reg_byte(fuelgauge->i2c, 0x25, temp); - mdelay(1000); + msleep(1000); s2mu005_restart_gauging(fuelgauge); s2mu005_fg_test_read(fuelgauge->i2c); pr_info("%s: SEC_BAT_INBAT_FGSRC_SWITCHING_OFF : 0x25 = %x\n", diff --git a/drivers/battery_v2/s2mu106_charger.c b/drivers/battery_v2/s2mu106_charger.c index 4aa0a7913..a6afc3065 100644 --- a/drivers/battery_v2/s2mu106_charger.c +++ b/drivers/battery_v2/s2mu106_charger.c @@ -116,11 +116,11 @@ static int s2mu106_charger_otg_control( msleep(30); /* 5. QBAT On even if BAT OCP occure */ s2mu106_update_reg(charger->i2c, S2MU106_CHG_CTRL9, 0x0, 0x10); - mdelay(10); + msleep(10); /* 6. OTG Enable */ s2mu106_update_reg(charger->i2c, S2MU106_CHG_CTRL0, OTG_BST_MODE, REG_MODE_MASK); - mdelay(20); + msleep(20); /* OTG Fault debounce time set 15ms */ s2mu106_update_reg(charger->i2c, 0x94, 0x0C, 0x0C); @@ -190,10 +190,10 @@ static void s2mu106_set_buck( pr_info("[DEBUG]%s: check input current(%d, %d)\n", __func__, prev_current, charger->input_current); s2mu106_set_input_current_limit(charger, 50); - mdelay(50); + msleep(50); /* async mode */ s2mu106_update_reg(charger->i2c, 0x3A, 0x03, 0x03); - mdelay(50); + msleep(50); s2mu106_update_reg(charger->i2c, S2MU106_CHG_CTRL0, CHARGER_OFF_MODE, REG_MODE_MASK); /* auto async mode */ s2mu106_update_reg(charger->i2c, 0x3A, 0x01, 0x03); diff --git a/drivers/battery_v2/s2mu106_fuelgauge.c b/drivers/battery_v2/s2mu106_fuelgauge.c index 47848187a..ecd3941a3 100644 --- a/drivers/battery_v2/s2mu106_fuelgauge.c +++ b/drivers/battery_v2/s2mu106_fuelgauge.c @@ -266,7 +266,7 @@ static void s2mu106_reset_fg(struct s2mu106_fuelgauge_data *fuelgauge) /* Dumpdone. Re-calculate SOC */ s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, 0x1E, 0x0F); - mdelay(300); + msleep(300); /* If it was voltage mode, recover it */ if (fuelgauge->mode == HIGH_SOC_VOLTAGE_MODE) { @@ -644,7 +644,7 @@ static int s2mu106_get_cycle(struct s2mu106_fuelgauge_data *fuelgauge) s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, S2MU106_REG_MONOUT_SEL, 0x27); - mdelay(50); + msleep(50); if (s2mu106_read_reg(fuelgauge->i2c, S2MU106_REG_MONOUT, data) < 0) goto err; @@ -1114,7 +1114,7 @@ batcap_learn_init: /* Dumpdone. Re-calculate SOC */ s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, 0x1E, 0x0F); - mdelay(300); + msleep(300); s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, 0x24, 0x00); @@ -1321,7 +1321,7 @@ static int s2mu106_get_avgvbat(struct s2mu106_fuelgauge_data *fuelgauge) s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, S2MU106_REG_MONOUT_SEL, 0x16); - mdelay(50); + msleep(50); if (s2mu106_read_reg(fuelgauge->i2c, S2MU106_REG_MONOUT, data) < 0) goto err; @@ -1784,7 +1784,7 @@ static int s2mu106_fg_set_property(struct power_supply *psy, temp &= 0xCF; temp |= 0x10; s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, 0x25, temp); - mdelay(1000); + msleep(1000); if (val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_ON) s2mu106_restart_gauging(fuelgauge); s2mu106_fg_reset_capacity_by_jig_connection(fuelgauge); @@ -1797,7 +1797,7 @@ static int s2mu106_fg_set_property(struct power_supply *psy, temp &= 0xCF; temp |= 0x30; s2mu106_write_and_verify_reg_byte(fuelgauge->i2c, 0x25, temp); - mdelay(1000); + msleep(1000); if (val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_OFF) s2mu106_restart_gauging(fuelgauge); s2mu106_fg_reset_capacity_by_jig_connection(fuelgauge); diff --git a/drivers/battery_v2/s2mu205_charger.c b/drivers/battery_v2/s2mu205_charger.c index 203882880..496dbe2cd 100644 --- a/drivers/battery_v2/s2mu205_charger.c +++ b/drivers/battery_v2/s2mu205_charger.c @@ -28,7 +28,7 @@ #define ENABLE 1 #define DISABLE 0 -#define IVR_WORK_DELAY 50 +#define IVR_WORK_DELAY 150 static char *s2mu205_supplied_to[] = { "battery", @@ -895,6 +895,24 @@ static int s2mu205_chg_set_property(struct power_supply *psy, pr_info("%s: reset fuelgauge when surge occur!\n", __func__); */ break; + case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX: + { + u8 temp = 0; + if (!factory_mode) { + s2mu205_read_reg(charger->i2c, S2MU205_CHG_STATUS3, &temp); + if (temp & IVR_STATUS) { + pr_info("%s: IVR Start\n", __func__); + wake_lock(&charger->ivr_wake_lock); + /* Mask IRQ */ + s2mu205_update_reg(charger->i2c, + S2MU205_CHG_INT2M, 1 << IVR_M_SHIFT, IVR_M_MASK); + queue_delayed_work(charger->charger_wqueue, &charger->ivr_work, + msecs_to_jiffies(IVR_WORK_DELAY)); + } + } + + break; + } case POWER_SUPPLY_PROP_MAX ... POWER_SUPPLY_EXT_PROP_MAX: switch (ext_psp) { case POWER_SUPPLY_EXT_PROP_FACTORY_VOLTAGE_REGULATION: @@ -925,7 +943,7 @@ static int s2mu205_chg_set_property(struct power_supply *psy, s2mu205_write_reg(charger->i2c, 0x70, 0x0); s2mu205_update_reg(charger->i2c, S2MU205_CHG_CTRL0, 0x30, 0x30); - mdelay(100); + msleep(100); /* QBAT off for prevent SMPL when detach cable */ s2mu205_update_reg(charger->i2c, 0x2A, 0xC0, 0xC0); @@ -1207,7 +1225,7 @@ static void s2mu205_ivr_irq_work(struct work_struct *work) reduce_input_current(charger); ivr_cnt = 0; } - mdelay(50); + msleep(50); if (!(ivr_state & IVR_STATUS)) { pr_info("%s: EXIT IVR WORK: check value (0x13:0x%02x, input current:%d)\n", __func__, @@ -1390,6 +1408,7 @@ static int s2mu205_charger_probe(struct platform_device *pdev) charger->otg_on = false; charger->ivr_on = false; charger->slow_charging = false; + charger->cable_type = SEC_BATTERY_CABLE_NONE; charger->dev = &pdev->dev; charger->i2c = s2mu205->i2c; diff --git a/drivers/battery_v2/s2mu205_fuelgauge.c b/drivers/battery_v2/s2mu205_fuelgauge.c index e818fa9bd..cf55c36d8 100644 --- a/drivers/battery_v2/s2mu205_fuelgauge.c +++ b/drivers/battery_v2/s2mu205_fuelgauge.c @@ -289,7 +289,7 @@ static void s2mu205_reset_fg(struct s2mu205_fuelgauge_data *fuelgauge) /* Dumpdone. Re-calculate SOC */ s2mu205_write_and_verify_reg_byte(fuelgauge->i2c, 0x1E, 0x0F); - mdelay(300); + msleep(300); /* If it was voltage mode, recover it */ if (fuelgauge->mode == HIGH_SOC_VOLTAGE_MODE) { @@ -561,7 +561,7 @@ static int s2mu205_get_cycle(struct s2mu205_fuelgauge_data *fuelgauge) mutex_lock(&fuelgauge->fg_lock); s2mu205_write_and_verify_reg_byte(fuelgauge->i2c, S2MU205_REG_MONOUT_SEL, 0x27); - mdelay(50); + msleep(50); if (s2mu205_read_reg(fuelgauge->i2c, S2MU205_REG_MONOUT, data) < 0) goto err; @@ -1055,7 +1055,7 @@ batcap_learn_init: s2mu205_write_and_verify_reg_byte(fuelgauge->i2c, 0x24, 0x01); /* Dumpdone. Re-calculate SOC */ s2mu205_write_and_verify_reg_byte(fuelgauge->i2c, 0x1E, 0x0F); - mdelay(300); + msleep(300); s2mu205_write_and_verify_reg_byte(fuelgauge->i2c, 0x24, 0x00); /* Make report SOC 0% */ @@ -1742,7 +1742,7 @@ static int s2mu205_fg_set_property(struct power_supply *psy, (val->intval == SEC_BAT_FGSRC_SWITCHING_ON)) { /* Get Battery voltage (by I2C control) */ s2mu205_update_reg_byte(fuelgauge->i2c, 0x25, 0x10, 0x30); - mdelay(1000); + msleep(1000); s2mu205_read_reg_byte(fuelgauge->i2c, 0x25, &temp); pr_info("%s: SW Vbat: fgsrc_switching_on: REG25:0x%02x, 0x25[5:4]=0x%x\n", __func__, temp, (temp & 0x30) >> 4); if (val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_ON) @@ -1752,7 +1752,7 @@ static int s2mu205_fg_set_property(struct power_supply *psy, } else if ((val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_OFF) || (val->intval == SEC_BAT_FGSRC_SWITCHING_OFF)) { s2mu205_update_reg_byte(fuelgauge->i2c, 0x25, 0x30, 0x30); - mdelay(1000); + msleep(1000); s2mu205_read_reg_byte(fuelgauge->i2c, 0x25, &temp); pr_info("%s: SW Vsys: fgsrc_switching_off: REG25:0x%02x, 0x25[5:4]=0x%x\n", __func__, temp, (temp & 0x30) >> 4); if (val->intval == SEC_BAT_INBAT_FGSRC_SWITCHING_OFF) diff --git a/drivers/battery_v2/sec_battery.c b/drivers/battery_v2/sec_battery.c index 26498fee5..f50e99b3e 100644 --- a/drivers/battery_v2/sec_battery.c +++ b/drivers/battery_v2/sec_battery.c @@ -4943,7 +4943,7 @@ ssize_t sec_bat_show_attrs(struct device *dev, POWER_SUPPLY_EXT_PROP_INBAT_VOLTAGE_FGSRC_SWITCHING, value); for (j = 0; j < 5; j++) { - mdelay(200); + msleep(200); psy_do_property(battery->pdata->fuelgauge_name, get, POWER_SUPPLY_PROP_VOLTAGE_NOW, value); ocv_data[j] = value.intval; diff --git a/drivers/ccic/s2mu004-usbpd.c b/drivers/ccic/s2mu004-usbpd.c index 6dcab2017..033a9d3d8 100644 --- a/drivers/ccic/s2mu004-usbpd.c +++ b/drivers/ccic/s2mu004-usbpd.c @@ -210,8 +210,12 @@ static void s2mu004_pr_swap(void *_data, int val) struct s2mu004_usbpd_data *pdic_data = data->phy_driver_data; if (val == USBPD_SINK_OFF) { + pd_noti.event = PDIC_NOTIFY_EVENT_PD_PRSWAP_SNKTOSRC; + pd_noti.sink_status.selected_pdo_num = 0; + pd_noti.sink_status.available_pdo_num = 0; + pd_noti.sink_status.current_pdo_num = 0; ccic_event_work(pdic_data, CCIC_NOTIFY_DEV_BATTERY, - CCIC_NOTIFY_ID_ATTACH, 0, 0); + CCIC_NOTIFY_ID_POWER_STATUS, 0, 0); } else if (val == USBPD_SOURCE_ON) { #if defined(CONFIG_DUAL_ROLE_USB_INTF) pdic_data->power_role_dual = DUAL_ROLE_PROP_PR_SRC; @@ -222,8 +226,6 @@ static void s2mu004_pr_swap(void *_data, int val) ccic_event_work(pdic_data, CCIC_NOTIFY_DEV_MUIC, CCIC_NOTIFY_ID_ROLE_SWAP, 1/* source */, 0); } else if (val == USBPD_SOURCE_OFF) { - ccic_event_work(pdic_data, CCIC_NOTIFY_DEV_BATTERY, - CCIC_NOTIFY_ID_ATTACH, 0, 0); #if defined(CONFIG_DUAL_ROLE_USB_INTF) pdic_data->power_role_dual = DUAL_ROLE_PROP_PR_SNK; #elif defined(CONFIG_TYPEC) @@ -1051,14 +1053,17 @@ static int s2mu004_set_power_role(void *_data, int val) if (val == USBPD_SINK) { pdic_data->is_pr_swap = true; + data->is_prswap = true; s2mu004_assert_rd(data); s2mu004_snk(pdic_data->i2c); } else if (val == USBPD_SOURCE) { pdic_data->is_pr_swap = true; + data->is_prswap = true; s2mu004_assert_rp(data); s2mu004_src(pdic_data->i2c); } else if (val == USBPD_DRP) { pdic_data->is_pr_swap = false; + data->is_prswap = false; s2mu004_assert_drp(data); return 0; } else @@ -2445,7 +2450,9 @@ static int s2mu004_check_port_detect(struct s2mu004_usbpd_data *pdic_data) s2mu004_set_vconn_source(pd_data, USBPD_VCONN_ON); - msleep(tTypeCSinkWaitCap); /* dont over 310~620ms(tTypeCSinkWaitCap) */ + s2mu004_assert_rp(pd_data); + msleep(100); /* dont over 310~620ms(tTypeCSinkWaitCap) */ + s2mu004_assert_drp(pd_data); } else { dev_err(dev, "%s, PLUG Error\n", __func__); return -1; diff --git a/drivers/ccic/s2mu106-usbpd.c b/drivers/ccic/s2mu106-usbpd.c index 019b9a9d5..53b65513b 100644 --- a/drivers/ccic/s2mu106-usbpd.c +++ b/drivers/ccic/s2mu106-usbpd.c @@ -129,6 +129,20 @@ static void s2mu106_usbpd_test_read(struct s2mu106_usbpd_data *usbpd_data) data[5], data[6], data[7], data[8]); } +static void s2mu106_usbpd_init_tx_hard_reset(struct s2mu106_usbpd_data *usbpd_data) +{ + struct i2c_client *i2c = usbpd_data->i2c; + + s2mu106_usbpd_write_reg(i2c, S2MU106_REG_MSG_SEND_CON, S2MU106_REG_MSG_SEND_CON_SOP_HardRST + | S2MU106_REG_MSG_SEND_CON_OP_MODE); + + s2mu106_usbpd_write_reg(i2c, S2MU106_REG_MSG_SEND_CON, S2MU106_REG_MSG_SEND_CON_SOP_HardRST + | S2MU106_REG_MSG_SEND_CON_OP_MODE + | S2MU106_REG_MSG_SEND_CON_SEND_MSG_EN); + + pr_info("%s, \n", __func__); +} + void s2mu106_rprd_mode_change(struct s2mu106_usbpd_data *usbpd_data, u8 mode) { u8 data = 0; @@ -1260,7 +1274,8 @@ static int s2mu106_set_power_role(void *_data, int val) struct usbpd_data *data = (struct usbpd_data *) _data; struct s2mu106_usbpd_data *pdic_data = data->phy_driver_data; - pr_info("%s, power_role(%d)\n", __func__, val); + pr_info("%s, power_role(%d->%d)\n", __func__, + pdic_data->power_role, val); if (val == USBPD_SINK) { pdic_data->is_pr_swap = true; @@ -3318,7 +3333,7 @@ static void s2mu106_usbpd_init_configure(struct s2mu106_usbpd_data *_data) s2mu106_set_normal_mode(_data); msleep(25); _data->detach_valid = true; - s2mu106_set_lpm_mode(_data); + s2mu106_usbpd_init_tx_hard_reset(_data); _data->detach_valid = false; s2mu106_usbpd_set_cc_control(_data, USBPD_CC_OFF); _data->lpm_mode = true; diff --git a/drivers/ccic/usbpd.c b/drivers/ccic/usbpd.c index e78f7e700..cdc3821ff 100644 --- a/drivers/ccic/usbpd.c +++ b/drivers/ccic/usbpd.c @@ -596,6 +596,7 @@ void usbpd_reinit(struct device *dev) usbpd_init_manager_val(pd_data); reinit_completion(&pd_data->msg_arrived); pd_data->wait_for_msg_arrived = 0; + pd_data->is_prswap = false; complete(&pd_data->msg_arrived); } @@ -642,6 +643,7 @@ int usbpd_init(struct device *dev, void *phy_driver_data) INIT_WORK(&pd_data->worker, usbpd_policy_work); init_completion(&pd_data->msg_arrived); + pd_data->is_prswap = false; return 0; } diff --git a/drivers/ccic/usbpd_manager.c b/drivers/ccic/usbpd_manager.c index 040e03c75..551082d16 100644 --- a/drivers/ccic/usbpd_manager.c +++ b/drivers/ccic/usbpd_manager.c @@ -910,19 +910,18 @@ void usbpd_manager_acc_detach(struct device *dev) static int usbpd_manager_support_vdm(struct usbpd_data *pd_data, usbpd_manager_command_type command) { - struct policy_data *policy = &pd_data->policy; + struct usbpd_manager_data *manager = &pd_data->manager; + switch (command) { case MANAGER_REQ_VDM_DISCOVER_SVID: - /* Product Type 101b == AMA */ - if (policy->rx_data_obj[1].id_header_vdo.Product_Type == 0x5) { - pr_info("%s, Discover ID == AMA\n", __func__); - return 1; - } - return 0; case MANAGER_REQ_VDM_DISCOVER_MODE: case MANAGER_REQ_VDM_ENTER_MODE: case MANAGER_REQ_VDM_STATUS_UPDATE: case MANAGER_REQ_VDM_DisplayPort_Configure: + if (manager->Vendor_ID == SAMSUNG_VENDOR_ID) { + pr_info("%s, Discover ID, VendorID == SAMSUNG \n", __func__); + return 1; + } #if defined(CONFIG_CCIC_ALTERNATE_MODE) return 1; #else diff --git a/drivers/ccic/usbpd_policy.c b/drivers/ccic/usbpd_policy.c index 2c4605ecb..4a498ace4 100644 --- a/drivers/ccic/usbpd_policy.c +++ b/drivers/ccic/usbpd_policy.c @@ -56,6 +56,7 @@ policy_state usbpd_policy_src_startup(struct policy_data *policy) /* PD Protocol Initialization */ usbpd_init_protocol(pd_data); pd_data->phy_ops.soft_reset(pd_data); + pd_data->phy_ops.set_rp_control(pd_data, PLUG_CTRL_RP80); /* Fro tSrcrecover after PE_SRC_Transition_to_default */ if (policy->txhardresetflag == 1) { @@ -942,6 +943,7 @@ policy_state usbpd_policy_snk_startup(struct policy_data *policy) /* PD Protocol Initialization */ usbpd_init_protocol(pd_data); + pd_data->phy_ops.set_rp_control(pd_data, PLUG_CTRL_RP80); /* Configuration Channel On */ //pd_data->phy_ops.set_cc_control(pd_data, USBPD_CC_ON); @@ -1190,7 +1192,7 @@ policy_state usbpd_policy_snk_select_capability(struct policy_data *policy) policy_state usbpd_policy_snk_transition_sink(struct policy_data *policy) { struct usbpd_data *pd_data = policy_to_usbpd(policy); - struct usbpd_manager_data *manager = &pd_data->manager; + struct usbpd_manager_data *manager = &pd_data->manager; int ret = PE_SNK_Transition_Sink; int ms = 0; bool vbus_short = 0; @@ -2077,7 +2079,7 @@ policy_state usbpd_policy_prs_src_snk_reject_pr_swap(struct policy_data *policy) /* PD State Inform for AP */ dev_info(pd_data->dev, "%s\n", __func__); - + pd_data->phy_ops.get_data_role(pd_data, &data_role); @@ -2222,6 +2224,9 @@ policy_state usbpd_policy_prs_src_snk_transition_to_off(struct policy_data *poli if (ret == PE_PRS_SRC_SNK_Transition_off) return ret; +#if defined CONFIG_CCIC_S2MU004 + pd_data->phy_ops.set_power_role(pd_data, USBPD_SOURCE); +#endif pd_data->phy_ops.pr_swap(pd_data, USBPD_SOURCE_OFF); /* VBUS off */ @@ -2246,6 +2251,10 @@ policy_state usbpd_policy_prs_src_snk_transition_to_off(struct policy_data *poli if (manager->acc_type != CCIC_DOCK_HMT || manager->SVID_0 == 0) msleep(600); #endif +#if defined CONFIG_CCIC_S2MU004 + if (ret == PE_PRS_SRC_SNK_Transition_off) + pd_data->phy_ops.set_power_role(pd_data, USBPD_DRP); +#endif return ret; } @@ -2474,6 +2483,8 @@ policy_state usbpd_policy_prs_snk_src_transition_to_off(struct policy_data *poli while (1) { if (policy->plug_valid == 0) { + pr_info("%s, plug_valid == 0\n", __func__); + pd_data->phy_ops.set_power_role(pd_data, USBPD_DRP); ret = PE_PRS_SNK_SRC_Transition_off; break; } @@ -6122,6 +6133,11 @@ void usbpd_policy_work(struct work_struct *work) dev_info(pd_data->dev, "%s saved state %x next_state %x \n", __func__, saved_state, next_state); } while (saved_state != next_state); +#if defined CONFIG_CCIC_S2MU004 + if (pd_data->is_prswap) + pd_data->phy_ops.set_power_role(pd_data, USBPD_DRP); +#endif + policy->state = next_state; dev_info(pd_data->dev, "%s Finished\n", __func__); } diff --git a/drivers/fingerprint/gf_common.c b/drivers/fingerprint/gf_common.c index 8ffcc985a..e00949685 100644 --- a/drivers/fingerprint/gf_common.c +++ b/drivers/fingerprint/gf_common.c @@ -768,7 +768,7 @@ void gfspi_hw_power_enable(struct gf_device *gf_dev, u8 onoff) exynos_smc(FP_CSMC_HANDLER_ID, FP_HANDLER_MAIN, FP_SET_POWERON_INACTIVE, 0)); #endif if (gf_dev->reset_gpio) { - mdelay(11); + usleep_range(11000, 11050); gpio_set_value(gf_dev->reset_gpio, 1); } gf_dev->ldo_onoff = 1; @@ -787,7 +787,7 @@ void gfspi_hw_power_enable(struct gf_device *gf_dev, u8 onoff) #endif if (gf_dev->reset_gpio) { gpio_set_value(gf_dev->reset_gpio, 0); - mdelay(11); + usleep_range(11000, 11050); } if (gf_dev->pwr_gpio) gpio_set_value(gf_dev->pwr_gpio, 0); @@ -811,9 +811,9 @@ void gfspi_hw_reset(struct gf_device *gf_dev, u8 delay) } gpio_direction_output(gf_dev->reset_gpio, 1); gpio_set_value(gf_dev->reset_gpio, 0); - mdelay(3); + usleep_range(3000, 3050); gpio_set_value(gf_dev->reset_gpio, 1); - mdelay(delay); + usleep_range((delay * 1000), ((delay * 1000) + 50)); gf_dev->reset_count++; } diff --git a/drivers/gpu/arm/tMIx/r10p0/build.bp b/drivers/gpu/arm/tMIx/r10p0/build.bp new file mode 100644 index 000000000..4517b4621 --- /dev/null +++ b/drivers/gpu/arm/tMIx/r10p0/build.bp @@ -0,0 +1,95 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from ARM Limited. + * (C) COPYRIGHT 2017 ARM Limited, ALL RIGHTS RESERVED + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from ARM Limited. + * ---------------------------------------------------------------------------- + */ + +bob_defaults { + name: "mali_kbase_shared_config_defaults", + no_mali: { + kbuild_options: ["CONFIG_MALI_NO_MALI=y"], + }, + mali_corestack: { + kbuild_options: ["CONFIG_MALI_CORESTACK=y"], + }, + mali_devfreq: { + kbuild_options: ["CONFIG_MALI_DEVFREQ=y"], + }, + + defaults: ["kernel_defaults"], +} + +bob_kernel_module { + name: "mali_kbase", + srcs: [ + "*.c", + "*.h", + "Kbuild", + "backend/gpu/*.c", + "backend/gpu/*.h", + "backend/gpu/Kbuild", + "ipa/*.c", + "ipa/*.h", + "ipa/Kbuild", + "platform/*.h", + "platform/*/*.c", + "platform/*/*.h", + "platform/*/Kbuild", + "thirdparty/*.c", + ], + kbuild_options: [ + "CONFIG_MALI_KUTF=n", + "CONFIG_MALI_MIDGARD=m", + "CONFIG_MALI_NO_MALI_DEFAULT_GPU={{.gpu}}", + "CONFIG_MALI_PLATFORM_NAME={{.mali_platform_name}}", + "MALI_KERNEL_TEST_API={{.unit_test_code}}", + "MALI_MOCK_TEST={{.mali_mock_test}}", + "MALI_UNIT_TEST={{.unit_test_code}}", + ], + cinstr_job_dump: { + kbuild_options: ["CONFIG_MALI_JOB_DUMP=y"], + }, + mali_debug: { + kbuild_options: ["CONFIG_MALI_DEBUG=y"], + }, + mali_gator_support: { + kbuild_options: ["CONFIG_MALI_GATOR_SUPPORT=y"], + }, + mali_system_trace: { + kbuild_options: ["CONFIG_MALI_SYSTEM_TRACE=y"], + }, + mali_error_inject: { + kbuild_options: ["CONFIG_MALI_ERROR_INJECT=y"], + }, + mali_error_inject_random: { + kbuild_options: ["CONFIG_MALI_ERROR_INJECT_RANDOM=y"], + }, + mali_trace_timeline: { + kbuild_options: ["CONFIG_MALI_TRACE_TIMELINE=y"], + }, + mali_prfcnt_set_secondary: { + kbuild_options: ["CONFIG_MALI_PRFCNT_SET_SECONDARY=y"], + }, + mali_fpga_bus_logger: { + kbuild_options: ["CONFIG_MALI_FPGA_BUS_LOGGER=y"], + }, + mali_midgard_dvfs: { + kbuild_options: ["CONFIG_MALI_MIDGARD_DVFS=y"], + }, + mali_2mb_alloc: { + kbuild_options: ["CONFIG_MALI_2MB_ALLOC=y"], + }, + mali_mock_test: { + srcs: ["tests/internal/src/mock/mali_kbase_pm_driver_mock.c"], + }, + ump: { + extra_symbols: ["ump"], + }, + defaults: ["mali_kbase_shared_config_defaults"], +} diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 9de379c1b..b8e1b1deb 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -843,7 +843,9 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, if (!td->mtclass.export_all_inputs && field->application != HID_DG_TOUCHSCREEN && field->application != HID_DG_PEN && - field->application != HID_DG_TOUCHPAD) + field->application != HID_DG_TOUCHPAD && + field->application != HID_GD_KEYBOARD && + field->application != HID_CP_CONSUMER_CONTROL) return -1; /* diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index ea3f0f5eb..180808db2 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c @@ -508,7 +508,7 @@ static void ml_ff_destroy(struct ff_device *ff) * do not actually stop the timer, and therefore we should * do it here. */ - del_timer_sync(&ml->timer); + del_timer_sync(&ml->timer); kfree(ml->private); } diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 407db2739..a4bf5d952 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -104,9 +104,10 @@ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_TD4X00_J2CORESPR) += synaptics_td4x00/ obj-$(CONFIG_TOUCHSCREEN_SEC_INCELL_TS) += sec_incell_ts/ obj-$(CONFIG_TOUCHSCREEN_MELFAS_MMS438) += melfas_mms400/ obj-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100) += melfas_mss100/ +obj-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100_A30KOR) += melfas_mss100/ obj-$(CONFIG_TOUCHSCREEN_IST3038H) += imagis_30xxh/ obj-$(CONFIG_TOUCHSCREEN_IST40XX) += imagis_40xx/ obj-$(CONFIG_TOUCHSCREEN_IST4050) += imagis/ist4050/ obj-$(CONFIG_TOUCHSCREEN_NT36xxx) += novatek_nt36xx/ obj-$(CONFIG_TOUCHSCREEN_HIMAX_INCELL) += himax_83xxx/ -obj-$(CONFIG_TOUCHSCREEN_HIMAX_CHIPSET) += himax/himax_83102P/ \ No newline at end of file +obj-$(CONFIG_TOUCHSCREEN_HIMAX_CHIPSET) += himax/himax_83102P/ diff --git a/drivers/input/touchscreen/imagis/ist4050/ist40xx.c b/drivers/input/touchscreen/imagis/ist4050/ist40xx.c index 0bc1baf77..bd9468d0a 100644 --- a/drivers/input/touchscreen/imagis/ist4050/ist40xx.c +++ b/drivers/input/touchscreen/imagis/ist4050/ist40xx.c @@ -1167,7 +1167,7 @@ static int ist40xx_suspend(struct device *dev) #endif mutex_lock(&data->lock); - if (data->lpm_mode) { + if (data->lpm_mode || data->fod_lp_mode) { ist40xx_disable_irq(data); ist40xx_cmd_gesture(data, IST40XX_ENABLE); diff --git a/drivers/input/touchscreen/imagis/ist4050/ist40xx.h b/drivers/input/touchscreen/imagis/ist4050/ist40xx.h index 39d8db7ea..6e9b93fe4 100644 --- a/drivers/input/touchscreen/imagis/ist4050/ist40xx.h +++ b/drivers/input/touchscreen/imagis/ist4050/ist40xx.h @@ -724,6 +724,7 @@ struct ist40xx_data { int report_rate; int idle_rate; u8 lpm_mode; + u8 fod_lp_mode; u16 rect_data[4]; u16 rejectzone_t; u16 rejectzone_b; diff --git a/drivers/input/touchscreen/imagis/ist4050/ist40xx_sec.c b/drivers/input/touchscreen/imagis/ist4050/ist40xx_sec.c index 09c628334..aa327d81b 100644 --- a/drivers/input/touchscreen/imagis/ist4050/ist40xx_sec.c +++ b/drivers/input/touchscreen/imagis/ist4050/ist40xx_sec.c @@ -1154,6 +1154,24 @@ err: (int)strnlen(buf, sizeof(buf))); } +static void fod_lp_mode(void *dev_data) +{ + char buf[32] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct ist40xx_data *data = container_of(sec, struct ist40xx_data, sec); + + sec_cmd_set_default_result(sec); + + data->fod_lp_mode = sec->cmd_param[0]; + + input_info(true, &data->client->dev, "%s: fod_lp_mode %d\n", __func__, data->fod_lp_mode); + + snprintf(buf, sizeof(buf), "%s", "OK"); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_exit(sec); +} + static void get_threshold(void *dev_data) { char buf[16] = { 0 }; @@ -5030,6 +5048,7 @@ struct sec_cmd sec_cmds[] = { {SEC_CMD("get_aod_rect", get_aod_rect),}, {SEC_CMD("singletap_enable", singletap_enable),}, {SEC_CMD("fod_enable", fod_enable),}, + {SEC_CMD_H("fod_lp_mode", fod_lp_mode),}, {SEC_CMD("get_cp_array", get_cp_array),}, {SEC_CMD("get_self_cp_array", get_self_cp_array),}, {SEC_CMD("get_prox_cp_array", get_prox_cp_array),}, diff --git a/drivers/input/touchscreen/melfas_mss100/Kconfig b/drivers/input/touchscreen/melfas_mss100/Kconfig index 9f2e8329f..15f3a76fd 100644 --- a/drivers/input/touchscreen/melfas_mss100/Kconfig +++ b/drivers/input/touchscreen/melfas_mss100/Kconfig @@ -14,5 +14,14 @@ config TOUCHSCREEN_MELFAS_MSS100 # To compile this driver as a module, choose M here: the module will be called mms_ts. +config TOUCHSCREEN_MELFAS_MSS100_A30KOR + tristate "MELFAS MSS100 Touchscreen" + depends on I2C + help + Say Y here if you have a MELFAS MSS100 touchscreen device in your system. + +# If unsure, say N. + +# To compile this driver as a module, choose M here: the module will be called mms_ts. endif diff --git a/drivers/input/touchscreen/melfas_mss100/Makefile b/drivers/input/touchscreen/melfas_mss100/Makefile index 1b961cc52..5f80b061d 100644 --- a/drivers/input/touchscreen/melfas_mss100/Makefile +++ b/drivers/input/touchscreen/melfas_mss100/Makefile @@ -3,10 +3,11 @@ # obj-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100) += melfas_mss100.o melfas_mss100_mod.o melfas_mss100_test.o melfas_mss100_cmd.o melfas_mss100_fw_update.o +obj-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100_A30KOR) += melfas_mss100.o melfas_mss100_mod.o melfas_mss100_test.o melfas_mss100_cmd.o melfas_mss100_fw_update.o #CFLAGS_melfas_mss100.o += -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-label #CFLAGS_melfas_mss100_test.o += -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-label #CFLAGS_melfas_mss100_cmd.o += -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-label #CFLAGS_melfas_mss100_fw_update.o += -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-label -ccflags-$(CONFIG_SAMSUNG_TUI) += -Idrivers/misc/tui \ No newline at end of file +ccflags-$(CONFIG_SAMSUNG_TUI) += -Idrivers/misc/tui diff --git a/drivers/input/touchscreen/melfas_mss100/melfas_mss100.c b/drivers/input/touchscreen/melfas_mss100/melfas_mss100.c index d66165284..b40fa45cc 100644 --- a/drivers/input/touchscreen/melfas_mss100/melfas_mss100.c +++ b/drivers/input/touchscreen/melfas_mss100/melfas_mss100.c @@ -445,7 +445,7 @@ static void mms_input_close(struct input_dev *dev) } #endif - if (info->lowpower_mode) { + if (info->lowpower_mode || info->fod_lp_mode) { mms_lowpower_mode(info, TO_LOWPOWER_MODE); if (device_may_wakeup(&info->client->dev)) enable_irq_wake(info->client->irq); @@ -1695,8 +1695,7 @@ static int mms_suspend(struct device *dev) { struct mms_ts_info *info = dev_get_drvdata(dev); - if (info->lowpower_mode) - reinit_completion(&info->resume_done); + reinit_completion(&info->resume_done); return 0; } @@ -1705,8 +1704,7 @@ static int mms_resume(struct device *dev) { struct mms_ts_info *info = dev_get_drvdata(dev); - if (info->lowpower_mode) - complete_all(&info->resume_done); + complete_all(&info->resume_done); return 0; } diff --git a/drivers/input/touchscreen/melfas_mss100/melfas_mss100.h b/drivers/input/touchscreen/melfas_mss100/melfas_mss100.h index ab7876b0e..24685b376 100644 --- a/drivers/input/touchscreen/melfas_mss100/melfas_mss100.h +++ b/drivers/input/touchscreen/melfas_mss100/melfas_mss100.h @@ -316,6 +316,7 @@ struct mms_ts_info { u8 glove_mode; u8 charger_mode; u8 cover_mode; + u8 fod_lp_mode; u8 esd_cnt; bool disable_esd; diff --git a/drivers/input/touchscreen/melfas_mss100/melfas_mss100_cmd.c b/drivers/input/touchscreen/melfas_mss100/melfas_mss100_cmd.c index bd4805bfd..b02f0385d 100644 --- a/drivers/input/touchscreen/melfas_mss100/melfas_mss100_cmd.c +++ b/drivers/input/touchscreen/melfas_mss100/melfas_mss100_cmd.c @@ -1492,6 +1492,24 @@ err_grip_data: sec_cmd_set_cmd_exit(sec); } +static void fod_lp_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct mms_ts_info *info = container_of(sec, struct mms_ts_info, sec); + char buff[64] = { 0 }; + + sec_cmd_set_default_result(sec); + + info->fod_lp_mode = sec->cmd_param[0]; + + input_info(true, &info->client->dev, "%s: fod_lp_mode %d\n", __func__, info->fod_lp_mode); + + snprintf(buff, sizeof(buff), "%s", "OK"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_exit(sec); +} + static void fod_enable(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; @@ -1964,7 +1982,8 @@ static struct sec_cmd sec_cmds[] = { {SEC_CMD_H("aod_enable", aod_enable),}, {SEC_CMD_H("singletap_enable", singletap_enable),}, {SEC_CMD_H("aot_enable", aot_enable),}, - {SEC_CMD_H("fod_enable", fod_enable),}, + {SEC_CMD("fod_enable", fod_enable),}, + {SEC_CMD_H("fod_lp_mode", fod_lp_mode),}, {SEC_CMD("set_aod_rect", set_aod_rect),}, {SEC_CMD("get_aod_rect", get_aod_rect),}, {SEC_CMD("set_grip_data", set_grip_data),}, diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index b99caa40b..626a0d8f4 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -663,8 +663,22 @@ no_prefetch_cluster: static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io) { + sector_t block = io->block; + unsigned int n_blocks = io->n_blocks; struct dm_verity_prefetch_work *pw; + if (v->validated_blocks) { + while (n_blocks && test_bit(block, v->validated_blocks)) { + block++; + n_blocks--; + } + while (n_blocks && test_bit(block + n_blocks - 1, + v->validated_blocks)) + n_blocks--; + if (!n_blocks) + return; + } + pw = kmalloc(sizeof(struct dm_verity_prefetch_work), GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN); @@ -673,8 +687,8 @@ static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io) INIT_WORK(&pw->work, verity_prefetch_io); pw->v = v; - pw->block = io->block; - pw->n_blocks = io->n_blocks; + pw->block = block; + pw->n_blocks = n_blocks; queue_work(v->verify_wq, &pw->work); } diff --git a/drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.c b/drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.c index 7085cdfa8..1317e346e 100644 --- a/drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.c +++ b/drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.c @@ -4090,7 +4090,7 @@ int fimc_is_ischain_3aa_close(struct fimc_is_device_ischain *device, if (test_bit(FIMC_IS_GROUP_START, &group->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4101,7 +4101,7 @@ int fimc_is_ischain_3aa_close(struct fimc_is_device_ischain *device, if (group->head && test_bit(FIMC_IS_GROUP_START, &group->head->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4382,7 +4382,7 @@ int fimc_is_ischain_isp_close(struct fimc_is_device_ischain *device, if (test_bit(FIMC_IS_GROUP_START, &group->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4393,7 +4393,7 @@ int fimc_is_ischain_isp_close(struct fimc_is_device_ischain *device, if (group->head && test_bit(FIMC_IS_GROUP_START, &group->head->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4676,7 +4676,7 @@ int fimc_is_ischain_dis_close(struct fimc_is_device_ischain *device, if (test_bit(FIMC_IS_GROUP_START, &group->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4687,7 +4687,7 @@ int fimc_is_ischain_dis_close(struct fimc_is_device_ischain *device, if (group->head && test_bit(FIMC_IS_GROUP_START, &group->head->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4970,7 +4970,7 @@ int fimc_is_ischain_mcs_close(struct fimc_is_device_ischain *device, if (test_bit(FIMC_IS_GROUP_START, &group->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -4981,7 +4981,7 @@ int fimc_is_ischain_mcs_close(struct fimc_is_device_ischain *device, if (group->head && test_bit(FIMC_IS_GROUP_START, &group->head->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -5258,7 +5258,7 @@ int fimc_is_ischain_vra_close(struct fimc_is_device_ischain *device, if (test_bit(FIMC_IS_GROUP_START, &group->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); @@ -5269,7 +5269,7 @@ int fimc_is_ischain_vra_close(struct fimc_is_device_ischain *device, if (group->head && test_bit(FIMC_IS_GROUP_START, &group->head->state)) { mgwarn("sudden group close", device, group); if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)) - fimc_is_itf_sudden_stop_wrap(device, device->instance); + fimc_is_itf_sudden_stop_wrap(device, device->instance, group); set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state); if (test_bit(FIMC_IS_HAL_DEBUG_SUDDEN_DEAD_DETECT, &sysfs_debug.hal_debug_mode)) { msleep(sysfs_debug.hal_debug_delay); diff --git a/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.c b/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.c index e11600d8d..aecc25972 100644 --- a/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.c +++ b/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.c @@ -429,7 +429,7 @@ int fimc_is_itf_process_off_wrap(struct fimc_is_device_ischain *device, u32 grou return ret; } -void fimc_is_itf_sudden_stop_wrap(struct fimc_is_device_ischain *device, u32 instance) +void fimc_is_itf_sudden_stop_wrap(struct fimc_is_device_ischain *device, u32 instance, struct fimc_is_group *group) { int ret = 0; struct fimc_is_device_sensor *sensor; @@ -453,6 +453,18 @@ void fimc_is_itf_sudden_stop_wrap(struct fimc_is_device_ischain *device, u32 ins merr("fimc_is_sensor_front_stop is fail(%d)", sensor, ret); } + if (group) { + if (test_bit(FIMC_IS_GROUP_FORCE_STOP, &group->state)) { + ret = fimc_is_itf_force_stop(device, GROUP_ID(group->id)); + if (ret) + mgerr("fimc_is_itf_force_stop is fail(%d)", device, group, ret); + } else { + ret = fimc_is_itf_process_stop(device, GROUP_ID(group->id)); + if (ret) + mgerr("fimc_is_itf_process_stop is fail(%d)", device, group, ret); + } + } + return; } @@ -472,7 +484,7 @@ int fimc_is_itf_power_down_wrap(struct fimc_is_interface *interface, u32 instanc return ret; } - fimc_is_itf_sudden_stop_wrap(&core->ischain[instance], instance); + fimc_is_itf_sudden_stop_wrap(&core->ischain[instance], instance, NULL); #ifdef USE_DDK_SHUT_DOWN_FUNC #ifdef ENABLE_FPSIMD_FOR_USER diff --git a/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.h b/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.h index 4cf34fe27..f312923a4 100644 --- a/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.h +++ b/drivers/media/platform/exynos/fimc-is2/fimc-is-interface-wrap.h @@ -40,7 +40,7 @@ int fimc_is_itf_stream_off_wrap(struct fimc_is_device_ischain *device); int fimc_is_itf_process_on_wrap(struct fimc_is_device_ischain *device, u32 group); int fimc_is_itf_process_off_wrap(struct fimc_is_device_ischain *device, u32 group, u32 fstop); -void fimc_is_itf_sudden_stop_wrap(struct fimc_is_device_ischain *device, u32 instance); +void fimc_is_itf_sudden_stop_wrap(struct fimc_is_device_ischain *device, u32 instance, struct fimc_is_group *group); int fimc_is_itf_power_down_wrap(struct fimc_is_interface *interface, u32 instance); int fimc_is_itf_sys_ctl_wrap(struct fimc_is_device_ischain *device, int cmd, int val); diff --git a/drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.c b/drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.c index 691e51c98..4545b49ba 100644 --- a/drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.c +++ b/drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.c @@ -1571,13 +1571,22 @@ int fimc_is_hw_mcsc_poly_phase(struct fimc_is_hw_ip *hw_ip, struct param_mcs_inp fimc_is_scaler_set_poly_src_size(hw_ip->regs, output_id, src_pos_x, src_pos_y, src_width, src_height); - if ((src_width <= (out_width * MCSC_POLY_RATIO_DOWN)) - && (out_width <= (src_width * MCSC_POLY_RATIO_UP))) { + if (((src_width <= (out_width * MCSC_POLY_QUALITY_RATIO_DOWN)) + && (out_width <= (src_width * MCSC_POLY_RATIO_UP))) + || (output_id == MCSC_OUTPUT3 || output_id == MCSC_OUTPUT4)) { poly_dst_width = out_width; post_en = false; + } else if ((src_width <= (out_width * MCSC_POLY_QUALITY_RATIO_DOWN * MCSC_POST_RATIO_DOWN)) + && ((out_width * MCSC_POLY_QUALITY_RATIO_DOWN) < src_width)) { + poly_dst_width = MCSC_ROUND_UP(src_width / MCSC_POLY_QUALITY_RATIO_DOWN, 2); + if (poly_dst_width > MCSC_POST_MAX_WIDTH) + poly_dst_width = MCSC_POST_MAX_WIDTH; + post_en = true; } else if ((src_width <= (out_width * MCSC_POLY_RATIO_DOWN * MCSC_POST_RATIO_DOWN)) - && ((out_width * MCSC_POLY_RATIO_DOWN) < src_width)) { - poly_dst_width = MCSC_ROUND_UP(src_width / MCSC_POLY_RATIO_DOWN, 2); + && ((out_width * MCSC_POLY_QUALITY_RATIO_DOWN * MCSC_POST_RATIO_DOWN) < src_width)) { + poly_dst_width = MCSC_ROUND_UP(out_width * MCSC_POST_RATIO_DOWN, 2); + if (poly_dst_width > MCSC_POST_MAX_WIDTH) + poly_dst_width = MCSC_POST_MAX_WIDTH; post_en = true; } else { mserr_hw("hw_mcsc_poly_phase: Unsupported H ratio, (%dx%d)->(%dx%d)\n", @@ -1586,16 +1595,21 @@ int fimc_is_hw_mcsc_poly_phase(struct fimc_is_hw_ip *hw_ip, struct param_mcs_inp post_en = true; } - if ((src_height <= (out_height * MCSC_POLY_RATIO_DOWN)) - && (out_height <= (src_height * MCSC_POLY_RATIO_UP))) { + if (((src_height <= (out_height * MCSC_POLY_QUALITY_RATIO_DOWN)) + && (out_height <= (src_height * MCSC_POLY_RATIO_UP))) + || (output_id == MCSC_OUTPUT3 || output_id == MCSC_OUTPUT4)) { poly_dst_height = out_height; post_en = false; + } else if ((src_height <= (out_height * MCSC_POLY_QUALITY_RATIO_DOWN * MCSC_POST_RATIO_DOWN)) + && ((out_height * MCSC_POLY_QUALITY_RATIO_DOWN) < src_height)) { + poly_dst_height = (src_height / MCSC_POLY_QUALITY_RATIO_DOWN); + post_en = true; } else if ((src_height <= (out_height * MCSC_POLY_RATIO_DOWN * MCSC_POST_RATIO_DOWN)) - && ((out_height * MCSC_POLY_RATIO_DOWN) < src_height)) { - poly_dst_height = (src_height / MCSC_POLY_RATIO_DOWN); + && ((out_height * MCSC_POLY_QUALITY_RATIO_DOWN * MCSC_POST_RATIO_DOWN) < src_height)) { + poly_dst_height = (out_height * MCSC_POST_RATIO_DOWN); post_en = true; } else { - mserr_hw("hw_mcsc_poly_phase: Unsupported H ratio, (%dx%d)->(%dx%d)\n", + mserr_hw("hw_mcsc_poly_phase: Unsupported V ratio, (%dx%d)->(%dx%d)\n", instance, hw_ip, src_width, src_height, out_width, out_height); poly_dst_height = (src_height / MCSC_POLY_RATIO_DOWN); post_en = true; diff --git a/drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_20_0/fimc-is-hw-chain.h b/drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_20_0/fimc-is-hw-chain.h index 8b6383e8e..3dd22dd16 100644 --- a/drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_20_0/fimc-is-hw-chain.h +++ b/drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_20_0/fimc-is-hw-chain.h @@ -93,12 +93,15 @@ enum hwip_interrupt_map { /* Specific interrupt map belonged to each IP */ /* MC-Scaler */ -#define MCSC_INTR_MASK (0x00000034) -#define USE_DMA_BUFFER_INDEX (0) /* 0 ~ 7 */ -#define MCSC_PRECISION (20) -#define MCSC_POLY_RATIO_UP (8) -#define MCSC_POLY_RATIO_DOWN (16) -#define MCSC_POST_RATIO_DOWN (16) +#define MCSC_INTR_MASK (0x00000034) +#define USE_DMA_BUFFER_INDEX (0) /* 0 ~ 7 */ +#define MCSC_PRECISION (20) +#define MCSC_POLY_RATIO_UP (8) +#define MCSC_POLY_QUALITY_RATIO_DOWN (4) +#define MCSC_POLY_RATIO_DOWN (16) +#define MCSC_POLY_MAX_RATIO_DOWN (256) +#define MCSC_POST_RATIO_DOWN (16) +#define MCSC_POST_MAX_WIDTH (1344) /* #define MCSC_POST_WA */ #define MCSC_POST_WA_SHIFT (8) /* 256 = 2^8 */ diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc535.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc535.c index 3af6c45d6..04936f8eb 100644 --- a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc535.c +++ b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc535.c @@ -200,6 +200,7 @@ static int sensor_zc535_init_position(struct i2c_client *client, int i; int ret = 0; int init_step = 0; + int init_delay_us = 0; init_step = sensor_zc535_valid_check(client); @@ -209,7 +210,10 @@ static int sensor_zc535_init_position(struct i2c_client *client, if (ret < 0) goto p_err; - mdelay(sysfs_actuator.init_delays[i]); + //mdelay(sysfs_actuator.init_delays[i]); + init_delay_us = sysfs_actuator.init_delays[i] * 1000; + usleep_range(init_delay_us, init_delay_us); + init_delay_us = 0; } actuator->position = sysfs_actuator.init_positions[i]; @@ -221,13 +225,15 @@ static int sensor_zc535_init_position(struct i2c_client *client, if (ret < 0) goto p_err; - mdelay(DEF_ZC535_FIRST_DELAY_MS); + //mdelay(DEF_ZC535_FIRST_DELAY_MS); + usleep_range((DEF_ZC535_FIRST_DELAY_MS*1000), (DEF_ZC535_FIRST_DELAY_MS*1000)); ret = sensor_zc535_write_position(client, DEF_ZC535_SECOND_POSITION); if (ret < 0) goto p_err; - mdelay(DEF_ZC535_SECOND_DELAY_MS); + //mdelay(DEF_ZC535_SECOND_DELAY_MS); + usleep_range((DEF_ZC535_SECOND_DELAY_MS*1000), (DEF_ZC535_SECOND_DELAY_MS*1000)); actuator->position = DEF_ZC535_SECOND_POSITION; diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3l6.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3l6.c index 1b39ac7e4..de908f459 100644 --- a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3l6.c +++ b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3l6.c @@ -1790,10 +1790,13 @@ int sensor_3l6_cis_wait_streamoff(struct v4l2_subdev *subdev) dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n", cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt); } + #if defined(CONFIG_CAMERA_AAS_V20E) + msleep(7); + #endif do_gettimeofday (&t_end); - u_delay = (t_end.tv_sec * 1000000 + t_end.tv_usec) - (t_start.tv_sec * 1000000 + t_start.tv_usec); + u_delay = (t_end.tv_sec * 1000000 + t_end.tv_usec) - (t_start.tv_sec * 1000000 + t_start.tv_usec); info("%s:%d timediff min_delay[%ld] u_delay[%ld][required_sleep[%ld]] sensor_fcount(%d)\n", __func__, __LINE__, min_delay, u_delay, min_delay - u_delay, sensor_fcount); diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c index 5887f2400..3783ec46a 100644 --- a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c +++ b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c @@ -1033,6 +1033,47 @@ void fimc_is_sensor_flash_expire_work(struct work_struct *data) } } +void fimc_is_sensor_flash_muic_ctrl_and_fire(struct work_struct *data) +{ +#if defined(CONFIG_LEDS_S2MU106_FLASH) + struct fimc_is_flash *flash; + struct fimc_is_flash_data *flash_data; + struct fimc_is_device_sensor_peri *sensor_peri; + + FIMC_BUG_VOID(!data); + + flash_data = container_of(data, struct fimc_is_flash_data, + work_flash_muic_ctrl_and_fire); + FIMC_BUG_VOID(!flash_data); + + flash = container_of(flash_data, struct fimc_is_flash, flash_data); + FIMC_BUG_VOID(!flash); + + sensor_peri = flash->sensor_peri; + + /* Pre-flash on */ + if (flash->flash_data.mode == 3) { + muic_afc_set_voltage(5); + pdo_ctrl_by_flash(1); + info("[%s]%d Down Volatge set On \n" ,__func__,__LINE__); + } + + info("[%s] pre-flash mode(%d), pow(%d), time(%d)\n", __func__, + flash->flash_data.mode, + flash->flash_data.intensity, flash->flash_data.firing_time_us); + + /* If pre-flash on failed, set voltage to 9V */ + if (fimc_is_sensor_flash_fire(sensor_peri, flash->flash_data.intensity)) { + err("failed to turn off flash at flash expired handler\n"); + if(flash->flash_data.mode == 3) { + pdo_ctrl_by_flash(0); + muic_afc_set_voltage(9); + info("[%s]%d Down Volatge set Clear \n" ,__func__,__LINE__); + } + } +#endif +} + int fimc_is_sensor_flash_fire(struct fimc_is_device_sensor_peri *device, u32 on) { @@ -1369,27 +1410,12 @@ int fimc_is_sensor_peri_pre_flash_fire(struct v4l2_subdev *subdev, void *arg) flash->flash_data.firing_time_us = flash_uctl->firingTime; #if defined(CONFIG_LEDS_S2MU106_FLASH) - /* Pre-flash on */ - if(flash->flash_data.mode == 3) { - muic_afc_set_voltage(5); - pdo_ctrl_by_flash(1); - info("[%s]%d Down Volatge set On \n" ,__func__,__LINE__); - } -#endif + schedule_work(&sensor_peri->flash->flash_data.work_flash_muic_ctrl_and_fire); +#else info("[%s](%d) pre-flash mode(%d), pow(%d), time(%d)\n", __func__, vsync_count, flash->flash_data.mode, flash->flash_data.intensity, flash->flash_data.firing_time_us); ret = fimc_is_sensor_flash_fire(sensor_peri, flash->flash_data.intensity); -#if defined(CONFIG_LEDS_S2MU106_FLASH) - /* If pre-flash on failed, set voltage to 9V */ - if (ret) { - err("failed to turn off flash at flash expired handler\n"); - if(flash->flash_data.mode == 3) { - pdo_ctrl_by_flash(0); - muic_afc_set_voltage(9); - info("[%s]%d Down Volatge set Clear \n" ,__func__,__LINE__); - } - } #endif } @@ -1617,6 +1643,8 @@ void fimc_is_sensor_peri_init_work(struct fimc_is_device_sensor_peri *sensor_per if (sensor_peri->flash) { INIT_WORK(&sensor_peri->flash->flash_data.flash_fire_work, fimc_is_sensor_flash_fire_work); INIT_WORK(&sensor_peri->flash->flash_data.flash_expire_work, fimc_is_sensor_flash_expire_work); + INIT_WORK(&sensor_peri->flash->flash_data.work_flash_muic_ctrl_and_fire, + fimc_is_sensor_flash_muic_ctrl_and_fire); } INIT_WORK(&sensor_peri->cis.cis_status_dump_work, fimc_is_sensor_cis_status_dump_work); @@ -2382,7 +2410,7 @@ int fimc_is_sensor_peri_actuator_softlanding(struct fimc_is_device_sensor_peri * actuator_itf->hw_pos = soft_landing_table->hw_table[i]; /* The actuator needs a delay time when lens moving for soft landing. */ - mdelay(soft_landing_table->step_delay); + msleep(soft_landing_table->step_delay); ret = fimc_is_sensor_peri_actuator_check_move_done(device); if (ret) { diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h index b6d420da1..626429059 100644 --- a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h +++ b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h @@ -182,6 +182,7 @@ struct fimc_is_flash_data { struct work_struct flash_fire_work; struct timer_list flash_expire_timer; struct work_struct flash_expire_work; + struct work_struct work_flash_muic_ctrl_and_fire; }; struct fimc_is_flash { diff --git a/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/actuator/fimc-is-actuator-zc535.c b/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/actuator/fimc-is-actuator-zc535.c index 3af6c45d6..04936f8eb 100644 --- a/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/actuator/fimc-is-actuator-zc535.c +++ b/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/actuator/fimc-is-actuator-zc535.c @@ -200,6 +200,7 @@ static int sensor_zc535_init_position(struct i2c_client *client, int i; int ret = 0; int init_step = 0; + int init_delay_us = 0; init_step = sensor_zc535_valid_check(client); @@ -209,7 +210,10 @@ static int sensor_zc535_init_position(struct i2c_client *client, if (ret < 0) goto p_err; - mdelay(sysfs_actuator.init_delays[i]); + //mdelay(sysfs_actuator.init_delays[i]); + init_delay_us = sysfs_actuator.init_delays[i] * 1000; + usleep_range(init_delay_us, init_delay_us); + init_delay_us = 0; } actuator->position = sysfs_actuator.init_positions[i]; @@ -221,13 +225,15 @@ static int sensor_zc535_init_position(struct i2c_client *client, if (ret < 0) goto p_err; - mdelay(DEF_ZC535_FIRST_DELAY_MS); + //mdelay(DEF_ZC535_FIRST_DELAY_MS); + usleep_range((DEF_ZC535_FIRST_DELAY_MS*1000), (DEF_ZC535_FIRST_DELAY_MS*1000)); ret = sensor_zc535_write_position(client, DEF_ZC535_SECOND_POSITION); if (ret < 0) goto p_err; - mdelay(DEF_ZC535_SECOND_DELAY_MS); + //mdelay(DEF_ZC535_SECOND_DELAY_MS); + usleep_range((DEF_ZC535_SECOND_DELAY_MS*1000), (DEF_ZC535_SECOND_DELAY_MS*1000)); actuator->position = DEF_ZC535_SECOND_POSITION; diff --git a/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/fimc-is-device-sensor-peri.c b/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/fimc-is-device-sensor-peri.c index 4c8658052..b94a81051 100644 --- a/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/fimc-is-device-sensor-peri.c +++ b/drivers/media/platform/exynos/fimc-legacy/sensor/module_framework/fimc-is-device-sensor-peri.c @@ -1793,6 +1793,8 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device, memset(&sensor_peri->cis.sensor_ctls[i].cur_cam20_sensor_udctrl, 0, sizeof(camera2_sensor_uctl_t)); sensor_peri->cis.sensor_ctls[i].valid_sensor_ctrl = 0; sensor_peri->cis.sensor_ctls[i].force_update = false; + memset(&sensor_peri->cis.sensor_ctls[i].cur_cam20_flash_udctrl, 0, sizeof(camera2_flash_uctl_t)); + sensor_peri->cis.sensor_ctls[i].valid_flash_udctrl = false; } sensor_peri->use_sensor_work = false; } @@ -2300,7 +2302,7 @@ int fimc_is_sensor_peri_actuator_softlanding(struct fimc_is_device_sensor_peri * actuator_itf->hw_pos = soft_landing_table->hw_table[i]; /* The actuator needs a delay time when lens moving for soft landing. */ - mdelay(soft_landing_table->step_delay); + msleep(soft_landing_table->step_delay); ret = fimc_is_sensor_peri_actuator_check_move_done(device); if (ret) { diff --git a/drivers/media/radio/s610/fm_low.c b/drivers/media/radio/s610/fm_low.c index 917bb9d5e..a1fd1b3de 100755 --- a/drivers/media/radio/s610/fm_low.c +++ b/drivers/media/radio/s610/fm_low.c @@ -1675,7 +1675,7 @@ bool fm_aux_pll_initialize(void) void fm_ds_set(u32 data) { fmspeedy_set_reg_field(0xFFF390, 7, (0x0003 << 7), data); - mdelay(10); + msleep(10); dev_info(gradio->v4l2dev.dev, "%s: DS set: 0x%xh, reg val: 0x%xh\n", __func__, data, fmspeedy_get_reg(0xFFF390)); diff --git a/drivers/misc/gnss_if/gnss_io_device.c b/drivers/misc/gnss_if/gnss_io_device.c index 08038ef87..9b3a3d6a2 100644 --- a/drivers/misc/gnss_if/gnss_io_device.c +++ b/drivers/misc/gnss_if/gnss_io_device.c @@ -549,7 +549,7 @@ static long misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) return -EINVAL; } gc->ops.gnss_release_reset(gc); - mdelay(50); + msleep(50); return 0; case GNSS_IOCTL_REQ_FAULT_INFO: diff --git a/drivers/misc/modem_v1/modem_utils.c b/drivers/misc/modem_v1/modem_utils.c index 6e5aa1c37..441a31352 100644 --- a/drivers/misc/modem_v1/modem_utils.c +++ b/drivers/misc/modem_v1/modem_utils.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -1238,7 +1239,17 @@ void mif_set_snapshot(bool enable) { if (!enable) acpm_stop_log(); - exynos_ss_set_enable("log_kevents", enable); + +#ifdef CONFIG_SEC_DEBUG +#ifdef CONFIG_SEC_DEBUG_SNAPSHOT_DISABLE + if (sec_debug_get_debug_level() == 0) + pr_err("%s: log_kevents disabled by debug level\n", __func__); + else +#endif +#endif + { + exynos_ss_set_enable("log_kevents", enable); + } } struct mif_buff_mng *init_mif_buff_mng(unsigned char *buffer_start, diff --git a/drivers/misc/samsung/scsc/scsc_wlbtd.c b/drivers/misc/samsung/scsc/scsc_wlbtd.c index 0e9696ff6..0d8ea761c 100755 --- a/drivers/misc/samsung/scsc/scsc_wlbtd.c +++ b/drivers/misc/samsung/scsc/scsc_wlbtd.c @@ -5,6 +5,7 @@ ****************************************************************************/ #include #include +#include #include "scsc_wlbtd.h" @@ -15,6 +16,8 @@ */ #define MAX_TIMEOUT 18000 /* in milisecounds */ #define WRITE_FILE_TIMEOUT 1000 /* in milisecounds */ +#define MAX_RSP_STRING_SIZE 128 +#define PROP_VALUE_MAX 92 /* completion to indicate when moredump is done */ static DECLARE_COMPLETION(event_done); @@ -30,7 +33,7 @@ static struct wake_lock wlbtd_wakelock; /* module parameter controlling recovery handling */ extern int disable_recovery_handling; -const char *response_code_to_str(int response_code) +const char *response_code_to_str(enum scsc_wlbtd_response_codes response_code) { switch (response_code) { case SCSC_WLBTD_ERR_PARSE_FAILED: @@ -74,35 +77,50 @@ const char *response_code_to_str(int response_code) */ static int msg_from_wlbtd_cb(struct sk_buff *skb, struct genl_info *info) { - int status = 0; + unsigned int status = 0; + int ret_code = 0; - if (info->attrs[1]) - SCSC_TAG_INFO(WLBTD, "ATTR_STR: %s\n", - (char *)nla_data(info->attrs[1])); + if (!info || !info->attrs[1] || !info->attrs[2] || + (nla_len(info->attrs[1]) > MAX_RSP_STRING_SIZE) || + (nla_len(info->attrs[2]) < sizeof(status))) { - if (info->attrs[2]) { - status = *((__u32 *)nla_data(info->attrs[2])); - if (status) - SCSC_TAG_ERR(WLBTD, "ATTR_INT: %u\n", status); + SCSC_TAG_ERR(WLBTD, "Error parsing arguments\n"); + ret_code = -EINVAL; + goto error_complete; } + SCSC_TAG_INFO(WLBTD, "ATTR_STR: %s\n", (char *)nla_data(info->attrs[1])); + + status = nla_get_u32(info->attrs[2]); + if (status) + SCSC_TAG_INFO(WLBTD, "ATTR_INT: %u\n", status); + +error_complete: if (!completion_done(&event_done)) complete(&event_done); - - return 0; + return ret_code; } static int msg_from_wlbtd_sable_cb(struct sk_buff *skb, struct genl_info *info) { - int status = 0; - const char *data = (const char *)nla_data(info->attrs[1]); + unsigned short status; - if (info->attrs[1]) - SCSC_TAG_INFO(WLBTD, "%s\n", data); + if (!info || !info->attrs[1] || !info->attrs[2] || + (nla_len(info->attrs[1]) > MAX_RSP_STRING_SIZE) || + (nla_len(info->attrs[2]) < sizeof(status))) { - if (info->attrs[2]) { - status = nla_get_u16(info->attrs[2]); - SCSC_TAG_ERR(WLBTD, "%s\n", response_code_to_str(status)); + SCSC_TAG_ERR(WLBTD, "Error parsing arguments\n"); + goto error_complete; + } + + SCSC_TAG_INFO(WLBTD, "%s\n", (char *)nla_data(info->attrs[1])); + status = nla_get_u16(info->attrs[2]); + + if ((enum scsc_wlbtd_response_codes)status < SCSC_WLBTD_LAST_RESPONSE_CODE) + SCSC_TAG_ERR(WLBTD, "%s\n", response_code_to_str((enum scsc_wlbtd_response_codes)status)); + else { + SCSC_TAG_INFO(WLBTD, "Received invalid status value"); + goto error_complete; } /* completion cases : @@ -174,35 +192,74 @@ static int msg_from_wlbtd_sable_cb(struct sk_buff *skb, struct genl_info *info) } return 0; + +error_complete: + if (!completion_done(&fw_panic_done)) { + SCSC_TAG_INFO(WLBTD, "completing fw_panic_done\n"); + complete(&fw_panic_done); + } + if (!completion_done(&event_done)) { + SCSC_TAG_INFO(WLBTD, "completing event_done\n"); + complete(&event_done); + } + + return -EINVAL; } static int msg_from_wlbtd_build_type_cb(struct sk_buff *skb, struct genl_info *info) { + char *build_type_str = NULL; + + mutex_lock(&build_type_lock); + if (build_type) { + SCSC_TAG_INFO(WLBTD, "ro.build.type = %s\n", build_type); + mutex_unlock(&build_type_lock); + return 0; + } + + if (!info) { + SCSC_TAG_ERR(WLBTD, "info is NULL\n"); + mutex_unlock(&build_type_lock); + return -EINVAL; + } + if (!info->attrs[1]) { - SCSC_TAG_WARNING(WLBTD, "info->attrs[1] = NULL\n"); - return -1; + SCSC_TAG_ERR(WLBTD, "info->attrs[1] = NULL\n"); + mutex_unlock(&build_type_lock); + return -EINVAL; } if (!nla_len(info->attrs[1])) { - SCSC_TAG_WARNING(WLBTD, "nla_len = 0\n"); - return -1; + SCSC_TAG_ERR(WLBTD, "nla_len = 0\n"); + mutex_unlock(&build_type_lock); + return -EINVAL; } - mutex_lock(&build_type_lock); - if (build_type) { - SCSC_TAG_WARNING(WLBTD, "ro.build.type = %s\n", build_type); + if (nla_len(info->attrs[1]) > PROP_VALUE_MAX) { + SCSC_TAG_ERR(WLBTD, "Received invalid length of data\n"); mutex_unlock(&build_type_lock); - return 0; + return -EINVAL; } + /* nla_len includes trailing zero. Tested.*/ - build_type = kmalloc(info->attrs[1]->nla_len, GFP_KERNEL); + build_type = kmalloc(nla_len(info->attrs[1]), GFP_KERNEL); if (!build_type) { - SCSC_TAG_WARNING(WLBTD, "kmalloc failed: build_type = NULL\n"); + SCSC_TAG_ERR(WLBTD, "kmalloc failed: build_type = NULL\n"); mutex_unlock(&build_type_lock); - return -1; + return -ENOMEM; } - memcpy(build_type, (char *)nla_data(info->attrs[1]), info->attrs[1]->nla_len); - SCSC_TAG_WARNING(WLBTD, "ro.build.type = %s\n", build_type); + + build_type_str = nla_data(info->attrs[1]); + SCSC_TAG_INFO(WLBTD, "build_type_str = %s\n", build_type_str); + + if (!build_type_str) { + SCSC_TAG_ERR(WLBTD, "Failed to retrieve build type attribute\n"); + mutex_unlock(&build_type_lock); + return -EINVAL; + } + + strncpy(build_type, (const char *)build_type_str, PROP_VALUE_MAX); + SCSC_TAG_INFO(WLBTD, "ro.build.type = %s\n", build_type); mutex_unlock(&build_type_lock); return 0; @@ -210,11 +267,19 @@ static int msg_from_wlbtd_build_type_cb(struct sk_buff *skb, struct genl_info *i static int msg_from_wlbtd_write_file_cb(struct sk_buff *skb, struct genl_info *info) { - if (info->attrs[3]) - SCSC_TAG_INFO(WLBTD, "%s\n", (char *)nla_data(info->attrs[3])); + int ret_code = 0; + if (!info || !info->attrs[3] || + (nla_len(info->attrs[3]) > MAX_RSP_STRING_SIZE)){ + ret_code = -EINVAL; + goto error_complete; + } + + SCSC_TAG_INFO(WLBTD, "%s\n", (char *)nla_data(info->attrs[3])); + +error_complete: complete(&write_file_done); - return 0; + return ret_code; } /** diff --git a/drivers/misc/samsung/scsc/scsc_wlbtd.h b/drivers/misc/samsung/scsc/scsc_wlbtd.h index a9fe38515..2b93506eb 100644 --- a/drivers/misc/samsung/scsc/scsc_wlbtd.h +++ b/drivers/misc/samsung/scsc/scsc_wlbtd.h @@ -70,6 +70,9 @@ enum scsc_wlbtd_response_codes { SCSC_WLBTD_OTHER_ERR_SABLE_FILE, SCSC_WLBTD_OTHER_ERR_TAR, SCSC_WLBTD_OTHER_IGNORE_TRIGGER, + + /* Keep this as last entry */ + SCSC_WLBTD_LAST_RESPONSE_CODE, }; static const struct genl_multicast_group scsc_mcgrp[] = { diff --git a/drivers/misc/usim_det/usim_detect.c b/drivers/misc/usim_det/usim_detect.c index 7802808d8..716f4e4e3 100644 --- a/drivers/misc/usim_det/usim_detect.c +++ b/drivers/misc/usim_det/usim_detect.c @@ -87,15 +87,15 @@ static irqreturn_t usim_dt_interrupt0(int irq, void *dev_id) if (value == 0) { /* Check HIGH -> LOW */ flag = 0; - for (i = 0; i < USIM_LOW_DETECT_COUNT; i++) { - msleep_interruptible(100); + for (i = 0; i < udd->usim_low_detect_count; i++) { + msleep_interruptible(udd->usim_check_delay_msec); value = gpio_get_value(udd->gpio_usim_det0); if (value == 0) flag++; else break; } - if (flag == USIM_LOW_DETECT_COUNT) { + if (flag == udd->usim_low_detect_count) { usim_det_set_det0_value(udd, 0); pr_err("%s: USIM0_DET: HIGH -> LOW\n", __func__); } else { @@ -105,15 +105,15 @@ static irqreturn_t usim_dt_interrupt0(int irq, void *dev_id) } else { /* Check LOW -> HIGH */ flag = 0; - for (i = 0; i < USIM_HIGH_DETECT_COUNT; i++) { - msleep_interruptible(100); + for (i = 0; i < udd->usim_high_detect_count; i++) { + msleep_interruptible(udd->usim_check_delay_msec); value = gpio_get_value(udd->gpio_usim_det0); if (value == 1) flag++; else break; } - if (flag == USIM_HIGH_DETECT_COUNT) { + if (flag == udd->usim_high_detect_count) { usim_det_set_det0_value(udd, 1); pr_err("%s: USIM0_DET: LOW -> HIGH\n", __func__); } else { @@ -140,15 +140,15 @@ static irqreturn_t usim_dt_interrupt1(int irq, void *dev_id) if (value == 0) { /* Check HIGH -> LOW */ flag = 0; - for (i = 0; i < USIM_LOW_DETECT_COUNT; i++) { - msleep_interruptible(100); + for (i = 0; i < udd->usim_low_detect_count; i++) { + msleep_interruptible(udd->usim_check_delay_msec); value = gpio_get_value(udd->gpio_usim_det1); if (value == 0) flag++; else break; } - if (flag == USIM_LOW_DETECT_COUNT) { + if (flag == udd->usim_low_detect_count) { usim_det_set_det1_value(udd, 0); pr_err("%s: USIM1_DET: HIGH -> LOW\n", __func__); } else { @@ -157,15 +157,15 @@ static irqreturn_t usim_dt_interrupt1(int irq, void *dev_id) } else { /* Check LOW -> HIGH */ flag = 0; - for (i = 0; i < USIM_HIGH_DETECT_COUNT; i++) { - msleep_interruptible(100); + for (i = 0; i < udd->usim_high_detect_count; i++) { + msleep_interruptible(udd->usim_check_delay_msec); value = gpio_get_value(udd->gpio_usim_det1); if (value == 1) flag++; else break; } - if (flag == USIM_HIGH_DETECT_COUNT) { + if (flag == udd->usim_high_detect_count) { usim_det_set_det1_value(udd, 1); pr_err("%s: USIM1_DET: LOW -> HIGH\n", __func__); } else { @@ -217,6 +217,33 @@ static int usim_detect_probe(struct platform_device *pdev) if (udd->num_of_usim_det == 0 || udd->num_of_usim_det > 2) goto exit_err; + + /* USIM delay check */ + err = of_property_read_u32(dev->of_node, "usim_check_delay_msec", + &udd->usim_check_delay_msec); + if (err) { + udd->usim_check_delay_msec = USIM_CHECK_DELAY_MSEC_DEFAULT; + } + + pr_err("usim_check_delay_msec: %d\n", udd->usim_check_delay_msec); + + /* USIM high detect count */ + err = of_property_read_u32(dev->of_node, "usim_high_detect_count", + &udd->usim_high_detect_count); + if (err) { + udd->usim_high_detect_count = USIM_HIGH_DETECT_COUNT_DEFAULT; + } + + pr_err("usim_high_detect_count: %d\n", udd->usim_high_detect_count); + + /* USIM low detect count */ + err = of_property_read_u32(dev->of_node, "usim_low_detect_count", + &udd->usim_low_detect_count); + if (err) { + udd->usim_low_detect_count = USIM_LOW_DETECT_COUNT_DEFAULT; + } + + pr_err("usim_low_detect_count: %d\n", udd->usim_low_detect_count); /* USIM0_DET */ err = of_property_read_u32(dev->of_node, diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 1062defc4..74585b85d 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -1966,7 +1966,7 @@ static int dw_mci_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios) } out: /* waiting for stable */ - mdelay(10); + msleep(10); ret = mmc_regulator_set_vqmmc(mmc, ios); diff --git a/drivers/net/wireless/scsc/cfg80211_ops.c b/drivers/net/wireless/scsc/cfg80211_ops.c index 68ebee954..34514b05a 100755 --- a/drivers/net/wireless/scsc/cfg80211_ops.c +++ b/drivers/net/wireless/scsc/cfg80211_ops.c @@ -20,6 +20,22 @@ #include "nl80211_vendor.h" #define SLSI_MAX_CHAN_2G_BAND 14 +/* TODO: Remove after FAPI update */ +#define SLSI_SCANTYPE_SINGLE_CHANNEL_SCAN 0x0013 + + +/* Ext capab is decided by firmware. But there are certain bits + * which are set by supplicant. So we set the capab and mask in + * such way so that supplicant sets only the bits our solution supports + */ + +static const u8 slsi_extended_cap[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const u8 slsi_extended_cap_mask[] = { + 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; static uint keep_alive_period = SLSI_P2PGO_KEEP_ALIVE_PERIOD_SEC; module_param(keep_alive_period, uint, S_IRUGO | S_IWUSR); @@ -426,6 +442,8 @@ int slsi_scan(struct wiphy *wiphy, struct net_device *dev, bool strip_p2p = false; struct ieee80211_channel *channels[64]; int i, chan_count = 0; + bool wps_sta = false; + #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION u8 mac_addr_mask[ETH_ALEN] = {0xFF}; #endif @@ -459,7 +477,7 @@ int slsi_scan(struct wiphy *wiphy, struct net_device *dev, int ret = 0; SLSI_NET_DBG3(dev, SLSI_CFG80211, "Scan invokes DRIVER_BCN_ABORT\n"); - ret = slsi_mlme_set_forward_beacon(sdev, dev, FAPI_ACTION_STOP); + ret = slsi_mlme_set_forward_beacon(sdev, dev, FAPI_WIPSACTION_STOP); if (!ret) { ret = slsi_send_forward_beacon_abort_vendor_event(sdev, @@ -474,11 +492,14 @@ int slsi_scan(struct wiphy *wiphy, struct net_device *dev, channels[i] = request->channels[i]; chan_count = request->n_channels; - if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif)) - if (sdev->initial_scan) { + if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif)) { + if (chan_count == 1) + scan_type = SLSI_SCANTYPE_SINGLE_CHANNEL_SCAN; + else if (sdev->initial_scan) { sdev->initial_scan = false; scan_type = FAPI_SCANTYPE_INITIAL_SCAN; } + } /* Update scan timing for P2P social channels scan. */ if ((request->ie) && @@ -502,20 +523,21 @@ int slsi_scan(struct wiphy *wiphy, struct net_device *dev, #endif const u8 *ie; - /* check HS2 related bits in extended capabilties (interworking, WNM,QoS Map, BSS transition) and set in MIB*/ - r = slsi_mlme_set_hs2_ext_cap(sdev, dev, request->ie, request->ie_len); - if (r) - goto exit; - /* Supplicant adds wsc and p2p in Station scan at the end of scan request ie. * for non-wps case remove both wps and p2p IEs * for wps case remove only p2p IE */ ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPS, request->ie, request->ie_len); - if (ie && ie[1] > SLSI_WPS_REQUEST_TYPE_POS && - ie[SLSI_WPS_REQUEST_TYPE_POS] == SLSI_WPS_REQUEST_TYPE_ENROLEE_INFO_ONLY) - strip_wsc = true; + if (ie && ie[1] > SLSI_WPS_REQUEST_TYPE_POS) { + /* Check whether scan is wps_scan or not, if not a wps_scan set strip_wsc to true + * to strip WPS IE else wps_sta to true to disable mac radomization for wps_scan + */ + if (ie[SLSI_WPS_REQUEST_TYPE_POS] == SLSI_WPS_REQUEST_TYPE_ENROLEE_INFO_ONLY) + strip_wsc = true; + else + wps_sta = true; + } ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P, request->ie, request->ie_len); if (ie) @@ -543,17 +565,21 @@ int slsi_scan(struct wiphy *wiphy, struct net_device *dev, #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { - if (sdev->fw_mac_randomization_enabled) { - memcpy(sdev->scan_mac_addr, request->mac_addr, ETH_ALEN); - r = slsi_set_mac_randomisation_mask(sdev, request->mac_addr_mask); - if (!r) - sdev->scan_addr_set = 1; - } else { - SLSI_NET_INFO(dev, "Mac Randomization is not enabled in Firmware\n"); - sdev->scan_addr_set = 0; - } - } else + /* If Supplicant triggers WPS scan on station interface, + * mac radomization for scan should be disbaled to avoid WPS overlap. + * Firmware also disables Mac Randomization for WPS Scan. + */ + if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR && !wps_sta) { + if (sdev->fw_mac_randomization_enabled) { + memcpy(sdev->scan_mac_addr, request->mac_addr, ETH_ALEN); + r = slsi_set_mac_randomisation_mask(sdev, request->mac_addr_mask); + if (!r) + sdev->scan_addr_set = 1; + } else { + SLSI_NET_INFO(dev, "Mac Randomization is not enabled in Firmware\n"); + sdev->scan_addr_set = 0; + } + } else #endif if (sdev->scan_addr_set) { memset(mac_addr_mask, 0xFF, ETH_ALEN); @@ -1042,6 +1068,10 @@ int slsi_connect(struct wiphy *wiphy, struct net_device *dev, netif_carrier_on(dev); ndev_vif->sta.vif_status = SLSI_VIF_STATUS_CONNECTING; + r = slsi_set_ext_cap(sdev, dev, sme->ie, sme->ie_len, slsi_extended_cap_mask); + if (r != 0) + SLSI_NET_ERR(dev, "Failed to set extended capability MIB: %d\n", r); + #ifdef CONFIG_SCSC_WLAN_SAE_CONFIG if (sme->auth_type == NL80211_AUTHTYPE_SAE && (sme->flags & CONNECT_REQ_EXTERNAL_AUTH_SUPPORT)) { const u8 *rsn; @@ -3437,6 +3467,10 @@ struct slsi_dev *slsi_cfg80211_new(struct device *dev) wiphy->cipher_suites = slsi_cipher_suites; wiphy->n_cipher_suites = ARRAY_SIZE(slsi_cipher_suites); + wiphy->extended_capabilities = slsi_extended_cap; + wiphy->extended_capabilities_mask = slsi_extended_cap_mask; + wiphy->extended_capabilities_len = ARRAY_SIZE(slsi_extended_cap); + wiphy->mgmt_stypes = ieee80211_default_mgmt_stypes; /* Driver interface combinations */ @@ -3525,13 +3559,20 @@ void slsi_cfg80211_free(struct slsi_dev *sdev) void slsi_cfg80211_update_wiphy(struct slsi_dev *sdev) { + /* Band 2G probably be disabled by slsi_band_cfg_update() while factory test or NCHO. + * So, we need to make sure that Band 2.4G enabled when initialized. */ + sdev->wiphy->bands[NL80211_BAND_2GHZ] = &slsi_band_2ghz; + sdev->device_config.band_2G = &slsi_band_2ghz; + /* update supported Bands */ if (sdev->band_5g_supported) { sdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &slsi_band_5ghz; sdev->device_config.band_5G = &slsi_band_5ghz; + sdev->device_config.supported_band = SLSI_FREQ_BAND_AUTO; } else { sdev->wiphy->bands[IEEE80211_BAND_5GHZ] = NULL; sdev->device_config.band_5G = NULL; + sdev->device_config.supported_band = SLSI_FREQ_BAND_2GHZ; } /* update HT features */ diff --git a/drivers/net/wireless/scsc/dev.h b/drivers/net/wireless/scsc/dev.h index 1345f64d6..117635b1c 100755 --- a/drivers/net/wireless/scsc/dev.h +++ b/drivers/net/wireless/scsc/dev.h @@ -128,7 +128,7 @@ static const u16 slsi_rates_table[3][2][10] = { #define SLSI_RX_WAKELOCK_TIME (1000) #define MAX_BA_BUFFER_SIZE 64 #define NUM_BA_SESSIONS_PER_PEER 8 -#define MAX_CHANNEL_LIST 20 +#define SLSI_NCHO_MAX_CHANNEL_LIST 20 #define SLSI_MAX_RX_BA_SESSIONS (8) #define SLSI_STA_ACTION_FRAME_BITMAP (SLSI_ACTION_FRAME_PUBLIC | SLSI_ACTION_FRAME_WMM | SLSI_ACTION_FRAME_WNM |\ SLSI_ACTION_FRAME_QOS | SLSI_ACTION_FRAME_PROTECTED_DUAL |\ @@ -840,7 +840,7 @@ struct slsi_apf_capabilities { #ifdef CONFIG_SCSC_WLAN_WES_NCHO struct slsi_wes_mode_roam_scan_channels { int n; - u8 channels[MAX_CHANNEL_LIST]; + u8 channels[SLSI_NCHO_MAX_CHANNEL_LIST]; }; #endif @@ -892,15 +892,16 @@ struct slsi_dev_config { int roam_scan_mode; + int dfs_scan_mode; + + int ncho_mode; + /*WES mode roam scan channels*/ struct slsi_wes_mode_roam_scan_channels wes_roam_scan_list; #endif struct slsi_802_11d_reg_domain domain_info; - int ap_disconnect_ind_timeout; - u8 host_state; - int rssi_boost_5g; int rssi_boost_2g; bool disable_ch12_ch13; @@ -1179,6 +1180,8 @@ struct slsi_dev { #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER bool enhanced_pkt_filter_enabled; #endif + u8 fw_ext_cap_ie[9]; /*extended capability IE length is 9 */ + u32 fw_ext_cap_ie_len; }; /* Compact representation of channels a ESS has been seen on diff --git a/drivers/net/wireless/scsc/fapi.h b/drivers/net/wireless/scsc/fapi.h index 7c8404dcd..838fa3a40 100644 --- a/drivers/net/wireless/scsc/fapi.h +++ b/drivers/net/wireless/scsc/fapi.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2014 - 2019 Samsung Electronics Co., Ltd. All rights reserved + * Copyright (c) 2014 - 2020 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ @@ -17,6 +17,7 @@ extern "C" { #endif +#ifndef CONFIG_SCSC_SMAPPER struct slsi_skb_cb { u32 sig_length; u32 data_length; @@ -36,6 +37,7 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) memset(skb->cb, 0, sizeof(struct slsi_skb_cb)); return slsi_skb_cb_get(skb); } +#endif #define FAPI_SIG_TYPE_MASK 0x0F00 #define FAPI_SIG_TYPE_REQ 0x0000 @@ -49,28 +51,20 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_SAP_TYPE_DEBUG 0x8000 #define FAPI_SAP_TYPE_TEST 0x9000 -#define FAPI_DEBUG_SAP_ENG_VERSION 0x0001 -#define FAPI_DATA_SAP_ENG_VERSION 0x0001 -#define FAPI_CONTROL_SAP_ENG_VERSION 0x000a -#define FAPI_TEST_SAP_ENG_VERSION 0x0010 +#define FAPI_DEBUG_SAP_ENG_VERSION 0x0000 +#define FAPI_DATA_SAP_ENG_VERSION 0x0000 +#define FAPI_TEST_SAP_ENG_VERSION 0x0004 +#define FAPI_CONTROL_SAP_ENG_VERSION 0x0008 #define FAPI_DEBUG_SAP_VERSION 0x0d03 #define FAPI_TEST_SAP_VERSION 0x0e00 -#define FAPI_DATA_SAP_VERSION 0x0e01 -#define FAPI_CONTROL_SAP_VERSION 0x0e03 +#define FAPI_DATA_SAP_VERSION 0x0e00 +#define FAPI_CONTROL_SAP_VERSION 0x0e01 #define FAPI_ACLPOLICY_BLACKLIST 0x0000 #define FAPI_ACLPOLICY_WHITELIST 0x0001 -#define FAPI_ACTION_STOP 0x0000 -#define FAPI_ACTION_START 0x0001 - -#define FAPI_APFFILTERMODE_DISABLED 0x0000 -#define FAPI_APFFILTERMODE_SUSPEND 0x0001 -#define FAPI_APFFILTERMODE_ACTIVE 0x0002 - #define FAPI_AUTHENTICATIONTYPE_OPEN_SYSTEM 0x0000 #define FAPI_AUTHENTICATIONTYPE_SHARED_KEY 0x0001 -#define FAPI_AUTHENTICATIONTYPE_SAE 0x0003 #define FAPI_AUTHENTICATIONTYPE_LEAP 0x0080 #define FAPI_BAND_AUTO 0x0000 @@ -88,10 +82,9 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_BULKDATADESCRIPTOR_INLINE 0x0000 #define FAPI_BULKDATADESCRIPTOR_SMAPPER 0x0001 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ 0x00 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ 0x01 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ 0x02 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ 0x03 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ 0x00 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ 0x01 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ 0x02 #define FAPI_CONNECTIONTYPE_WLAN_INFRASTRUCTURE 0x0000 #define FAPI_CONNECTIONTYPE_P2P_OPERATION 0x0001 @@ -107,661 +100,208 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_CWTYPE_DC 0x0003 #define FAPI_CWTYPE_PRN 0x0004 -#define FAPI_DATARATE_11B20_1MBPS 0x0001 -#define FAPI_DATARATE_11B20_2MBPS 0x0002 -#define FAPI_DATARATE_11B20_5M5BPS 0x0005 -#define FAPI_DATARATE_11B20_11MBPS 0x000b -#define FAPI_DATARATE_11A20_6MBPS 0x2006 -#define FAPI_DATARATE_11A20_9MBPS 0x2009 -#define FAPI_DATARATE_11A20_12MBPS 0x200c -#define FAPI_DATARATE_11A20_18MBPS 0x2012 -#define FAPI_DATARATE_11A20_24MBPS 0x2018 -#define FAPI_DATARATE_11A20_36MBPS 0x2024 -#define FAPI_DATARATE_11A20_48MBPS 0x2030 -#define FAPI_DATARATE_11A20_54MBPS 0x2036 -#define FAPI_DATARATE_11N20_6M5BPS 0x4000 -#define FAPI_DATARATE_11N20_13MBPS 0x4001 -#define FAPI_DATARATE_11N20_19M5BPS 0x4002 -#define FAPI_DATARATE_11N20_26MBPS 0x4003 -#define FAPI_DATARATE_11N20_39MBPS 0x4004 -#define FAPI_DATARATE_11N20_52MBPS 0x4005 -#define FAPI_DATARATE_11N20_58M5BPS 0x4006 -#define FAPI_DATARATE_11N20_65MBPS 0x4007 -#define FAPI_DATARATE_11N20_7M2BPS_SGI 0x4040 -#define FAPI_DATARATE_11N20_14M4BPS_SGI 0x4041 -#define FAPI_DATARATE_11N20_21M7BPS_SGI 0x4042 -#define FAPI_DATARATE_11N20_28M9BPS_SGI 0x4043 -#define FAPI_DATARATE_11N20_43M3BPS_SGI 0x4044 -#define FAPI_DATARATE_11N20_57M8BPS_SGI 0x4045 -#define FAPI_DATARATE_11N20_65MBPS_SGI 0x4046 -#define FAPI_DATARATE_11N20_72M2BPS_SGI 0x4047 -#define FAPI_DATARATE_11N20_13MBPS_NSS2 0x4088 -#define FAPI_DATARATE_11N20_26MBPS_NSS2 0x4089 -#define FAPI_DATARATE_11N20_39MBPS_NSS2 0x408a -#define FAPI_DATARATE_11N20_52MBPS_NSS2 0x408b -#define FAPI_DATARATE_11N20_78MBPS_NSS2 0x408c -#define FAPI_DATARATE_11N20_104MBPS_NSS2 0x408d -#define FAPI_DATARATE_11N20_117MBPS_NSS2 0x408e -#define FAPI_DATARATE_11N20_130MBPS_NSS2 0x408f -#define FAPI_DATARATE_11N20_14M4BPS_SGI_NSS2 0x40c8 -#define FAPI_DATARATE_11N20_28M9BPS_SGI_NSS2 0x40c9 -#define FAPI_DATARATE_11N20_43M3BPS_SGI_NSS2 0x40ca -#define FAPI_DATARATE_11N20_57M8BPS_SGI_NSS2 0x40cb -#define FAPI_DATARATE_11N20_86M7BPS_SGI_NSS2 0x40cc -#define FAPI_DATARATE_11N20_115M6BPS_SGI_NSS2 0x40cd -#define FAPI_DATARATE_11N20_130MBPS_SGI_NSS2 0x40ce -#define FAPI_DATARATE_11N20_144M4BPS_SGI_NSS2 0x40cf -#define FAPI_DATARATE_11N40_13M5BPS 0x4400 -#define FAPI_DATARATE_11N40_27MBPS 0x4401 -#define FAPI_DATARATE_11N40_40M5BPS 0x4402 -#define FAPI_DATARATE_11N40_54MBPS 0x4403 -#define FAPI_DATARATE_11N40_81MBPS 0x4404 -#define FAPI_DATARATE_11N40_108MBPS 0x4405 -#define FAPI_DATARATE_11N40_121M5BPS 0x4406 -#define FAPI_DATARATE_11N40_135MBPS 0x4407 -#define FAPI_DATARATE_11N40_6MBPS 0x4420 -#define FAPI_DATARATE_11N40_15MBPS_SGI 0x4440 -#define FAPI_DATARATE_11N40_30MBPS_SGI 0x4441 -#define FAPI_DATARATE_11N40_45MBPS_SGI 0x4442 -#define FAPI_DATARATE_11N40_60MBPS_SGI 0x4443 -#define FAPI_DATARATE_11N40_90MBPS_SGI 0x4444 -#define FAPI_DATARATE_11N40_120MBPS_SGI 0x4445 -#define FAPI_DATARATE_11N40_135MBPS_SGI 0x4446 -#define FAPI_DATARATE_11N40_150MBPS_SGI 0x4447 -#define FAPI_DATARATE_11N40_6M7BPS_SGI 0x4460 -#define FAPI_DATARATE_11N40_27MBPS_NSS2 0x4488 -#define FAPI_DATARATE_11N40_54MBPS_NSS2 0x4489 -#define FAPI_DATARATE_11N40_81MBPS_NSS2 0x448a -#define FAPI_DATARATE_11N40_108MBPS_NSS2 0x448b -#define FAPI_DATARATE_11N40_162MBPS_NSS2 0x448c -#define FAPI_DATARATE_11N40_216MBPS_NSS2 0x448d -#define FAPI_DATARATE_11N40_243MBPS_NSS2 0x448e -#define FAPI_DATARATE_11N40_270MBPS_NSS2 0x448f -#define FAPI_DATARATE_11N40_30MBPS_SGI_NSS2 0x44c8 -#define FAPI_DATARATE_11N40_60MBPS_SGI_NSS2 0x44c9 -#define FAPI_DATARATE_11N40_90MBPS_SGI_NSS2 0x44ca -#define FAPI_DATARATE_11N40_120MBPS_SGI_NSS2 0x44cb -#define FAPI_DATARATE_11N40_180MBPS_SGI_NSS2 0x44cc -#define FAPI_DATARATE_11N40_240MBPS_SGI_NSS2 0x44cd -#define FAPI_DATARATE_11N40_270MBPS_SGI_NSS2 0x44ce -#define FAPI_DATARATE_11N40_300MBPS_SGI_NSS2 0x44cf -#define FAPI_DATARATE_11AC20_6M5BPS 0x6000 -#define FAPI_DATARATE_11AC20_13MBPS 0x6001 -#define FAPI_DATARATE_11AC20_19M5BPS 0x6002 -#define FAPI_DATARATE_11AC20_26MBPS 0x6003 -#define FAPI_DATARATE_11AC20_39MBPS 0x6004 -#define FAPI_DATARATE_11AC20_52MBPS 0x6005 -#define FAPI_DATARATE_11AC20_58M5BPS 0x6006 -#define FAPI_DATARATE_11AC20_65MBPS 0x6007 -#define FAPI_DATARATE_11AC20_78MBPS 0x6008 -#define FAPI_DATARATE_11AC20_97M5BPS 0x600a -#define FAPI_DATARATE_11AC20_7M2BPS_SGI 0x6040 -#define FAPI_DATARATE_11AC20_14M4BPS_SGI 0x6041 -#define FAPI_DATARATE_11AC20_21M7BPS_SGI 0x6042 -#define FAPI_DATARATE_11AC20_28M9BPS_SGI 0x6043 -#define FAPI_DATARATE_11AC20_43M3BPS_SGI 0x6044 -#define FAPI_DATARATE_11AC20_57M8BPS_SGI 0x6045 -#define FAPI_DATARATE_11AC20_65MBPS_SGI 0x6046 -#define FAPI_DATARATE_11AC20_72M2BPS_SGI 0x6047 -#define FAPI_DATARATE_11AC20_86M7BPS_SGI 0x6048 -#define FAPI_DATARATE_11AC20_108M3BPS_SGI 0x604a -#define FAPI_DATARATE_11AC20_13MBPS_NSS2 0x6080 -#define FAPI_DATARATE_11AC20_26MBPS_NSS2 0x6081 -#define FAPI_DATARATE_11AC20_39MBPS_NSS2 0x6082 -#define FAPI_DATARATE_11AC20_52MBPS_NSS2 0x6083 -#define FAPI_DATARATE_11AC20_78MBPS_NSS2 0x6084 -#define FAPI_DATARATE_11AC20_104MBPS_NSS2 0x6085 -#define FAPI_DATARATE_11AC20_117MBPS_NSS2 0x6086 -#define FAPI_DATARATE_11AC20_130MBPS_NSS2 0x6087 -#define FAPI_DATARATE_11AC20_156MBPS_NSS2 0x6088 -#define FAPI_DATARATE_11AC20_195MBPS_NSS2 0x608a -#define FAPI_DATARATE_11AC20_14M4BPS_SGI_NSS2 0x60c0 -#define FAPI_DATARATE_11AC20_28M9BPS_SGI_NSS2 0x60c1 -#define FAPI_DATARATE_11AC20_43M3BPS_SGI_NSS2 0x60c2 -#define FAPI_DATARATE_11AC20_57M8BPS_SGI_NSS2 0x60c3 -#define FAPI_DATARATE_11AC20_86M7BPS_SGI_NSS2 0x60c4 -#define FAPI_DATARATE_11AC20_115M6BPS_SGI_NSS2 0x60c5 -#define FAPI_DATARATE_11AC20_130MBPS_SGI_NSS2 0x60c6 -#define FAPI_DATARATE_11AC20_144M4BPS_SGI_NSS2 0x60c7 -#define FAPI_DATARATE_11AC20_173M3BPS_SGI_NSS2 0x60c8 -#define FAPI_DATARATE_11AC20_216M7BPS_SGI_NSS2 0x60ca -#define FAPI_DATARATE_11AC40_13M5BPS 0x6400 -#define FAPI_DATARATE_11AC40_27MBPS 0x6401 -#define FAPI_DATARATE_11AC40_40M5BPS 0x6402 -#define FAPI_DATARATE_11AC40_54MBPS 0x6403 -#define FAPI_DATARATE_11AC40_81MBPS 0x6404 -#define FAPI_DATARATE_11AC40_108MBPS 0x6405 -#define FAPI_DATARATE_11AC40_121M5BPS 0x6406 -#define FAPI_DATARATE_11AC40_135MBPS 0x6407 -#define FAPI_DATARATE_11AC40_162MBPS 0x6408 -#define FAPI_DATARATE_11AC40_180MBPS 0x6409 -#define FAPI_DATARATE_11AC40_202M5BPS 0x640a -#define FAPI_DATARATE_11AC40_225MBPS 0x640b -#define FAPI_DATARATE_11AC40_15MBPS_SGI 0x6440 -#define FAPI_DATARATE_11AC40_30MBPS_SGI 0x6441 -#define FAPI_DATARATE_11AC40_45MBPS_SGI 0x6442 -#define FAPI_DATARATE_11AC40_60MBPS_SGI 0x6443 -#define FAPI_DATARATE_11AC40_90MBPS_SGI 0x6444 -#define FAPI_DATARATE_11AC40_120MBPS_SGI 0x6445 -#define FAPI_DATARATE_11AC40_135MBPS_SGI 0x6446 -#define FAPI_DATARATE_11AC40_150MBPS_SGI 0x6447 -#define FAPI_DATARATE_11AC40_180MBPS_SGI 0x6448 -#define FAPI_DATARATE_11AC40_200MBPS_SGI 0x6449 -#define FAPI_DATARATE_11AC40_225MBPS_SGI 0x644a -#define FAPI_DATARATE_11AC40_250MBPS_SGI 0x644b -#define FAPI_DATARATE_11AC40_27MBPS_NSS2 0x6480 -#define FAPI_DATARATE_11AC40_54MBPS_NSS2 0x6481 -#define FAPI_DATARATE_11AC40_81MBPS_NSS2 0x6482 -#define FAPI_DATARATE_11AC40_108MBPS_NSS2 0x6483 -#define FAPI_DATARATE_11AC40_162MBPS_NSS2 0x6484 -#define FAPI_DATARATE_11AC40_216MBPS_NSS2 0x6485 -#define FAPI_DATARATE_11AC40_243MBPS_NSS2 0x6486 -#define FAPI_DATARATE_11AC40_270MBPS_NSS2 0x6487 -#define FAPI_DATARATE_11AC40_324MBPS_NSS2 0x6488 -#define FAPI_DATARATE_11AC40_360MBPS_NSS2 0x6489 -#define FAPI_DATARATE_11AC40_405MBPS_NSS2 0x648a -#define FAPI_DATARATE_11AC40_450MBPS_NSS2 0x648b -#define FAPI_DATARATE_11AC40_30MBPS_SGI_NSS2 0x64c0 -#define FAPI_DATARATE_11AC40_60MBPS_SGI_NSS2 0x64c1 -#define FAPI_DATARATE_11AC40_90MBPS_SGI_NSS2 0x64c2 -#define FAPI_DATARATE_11AC40_120MBPS_SGI_NSS2 0x64c3 -#define FAPI_DATARATE_11AC40_180MBPS_SGI_NSS2 0x64c4 -#define FAPI_DATARATE_11AC40_240MBPS_SGI_NSS2 0x64c5 -#define FAPI_DATARATE_11AC40_270MBPS_SGI_NSS2 0x64c6 -#define FAPI_DATARATE_11AC40_300MBPS_SGI_NSS2 0x64c7 -#define FAPI_DATARATE_11AC40_360MBPS_SGI_NSS2 0x64c8 -#define FAPI_DATARATE_11AC40_400MBPS_SGI_NSS2 0x64c9 -#define FAPI_DATARATE_11AC40_450MBPS_SGI_NSS2 0x64ca -#define FAPI_DATARATE_11AC40_500MBPS_SGI_NSS2 0x64cb -#define FAPI_DATARATE_11AC80_29M3BPS 0x6800 -#define FAPI_DATARATE_11AC80_58M5BPS 0x6801 -#define FAPI_DATARATE_11AC80_87M8BPS 0x6802 -#define FAPI_DATARATE_11AC80_117MBPS 0x6803 -#define FAPI_DATARATE_11AC80_175M5BPS 0x6804 -#define FAPI_DATARATE_11AC80_234MBPS 0x6805 -#define FAPI_DATARATE_11AC80_263M3BPS 0x6806 -#define FAPI_DATARATE_11AC80_292M5BPS 0x6807 -#define FAPI_DATARATE_11AC80_351MBPS 0x6808 -#define FAPI_DATARATE_11AC80_390MBPS 0x6809 -#define FAPI_DATARATE_11AC80_438M8BPS 0x680a -#define FAPI_DATARATE_11AC80_487M5BPS 0x680b -#define FAPI_DATARATE_11AC80_32M5BPS_SGI 0x6840 -#define FAPI_DATARATE_11AC80_65MBPS_SGI 0x6841 -#define FAPI_DATARATE_11AC80_97M5BPS_SGI 0x6842 -#define FAPI_DATARATE_11AC80_130MBPS_SGI 0x6843 -#define FAPI_DATARATE_11AC80_195MBPS_SGI 0x6844 -#define FAPI_DATARATE_11AC80_260MBPS_SGI 0x6845 -#define FAPI_DATARATE_11AC80_292M5BPS_SGI 0x6846 -#define FAPI_DATARATE_11AC80_325MBPS_SGI 0x6847 -#define FAPI_DATARATE_11AC80_390MBPS_SGI 0x6848 -#define FAPI_DATARATE_11AC80_433M3BPS_SGI 0x6849 -#define FAPI_DATARATE_11AC80_487M5BPS_SGI 0x684a -#define FAPI_DATARATE_11AC80_541M7BPS_SGI 0x684b -#define FAPI_DATARATE_11AC80_58M5BPS_NSS2 0x6880 -#define FAPI_DATARATE_11AC80_117MBPS_NSS2 0x6881 -#define FAPI_DATARATE_11AC80_175M5BPS_NSS2 0x6882 -#define FAPI_DATARATE_11AC80_234MBPS_NSS2 0x6883 -#define FAPI_DATARATE_11AC80_351MBPS_NSS2 0x6884 -#define FAPI_DATARATE_11AC80_468MBPS_NSS2 0x6885 -#define FAPI_DATARATE_11AC80_526M5BPS_NSS2 0x6886 -#define FAPI_DATARATE_11AC80_585MBPS_NSS2 0x6887 -#define FAPI_DATARATE_11AC80_702MBPS_NSS2 0x6888 -#define FAPI_DATARATE_11AC80_780MBPS_NSS2 0x6889 -#define FAPI_DATARATE_11AC80_877M5BPS_NSS2 0x688a -#define FAPI_DATARATE_11AC80_975MBPS_NSS2 0x688b -#define FAPI_DATARATE_11AC80_65MBPS_SGI_NSS2 0x68c0 -#define FAPI_DATARATE_11AC80_130MBPS_SGI_NSS2 0x68c1 -#define FAPI_DATARATE_11AC80_195MBPS_SGI_NSS2 0x68c2 -#define FAPI_DATARATE_11AC80_260MBPS_SGI_NSS2 0x68c3 -#define FAPI_DATARATE_11AC80_390MBPS_SGI_NSS2 0x68c4 -#define FAPI_DATARATE_11AC80_520MBPS_SGI_NSS2 0x68c5 -#define FAPI_DATARATE_11AC80_585MBPS_SGI_NSS2 0x68c6 -#define FAPI_DATARATE_11AC80_650MBPS_SGI_NSS2 0x68c7 -#define FAPI_DATARATE_11AC80_780MBPS_SGI_NSS2 0x68c8 -#define FAPI_DATARATE_11AC80_866M7BPS_SGI_NSS2 0x68c9 -#define FAPI_DATARATE_11AC80_975MBPS_SGI_NSS2 0x68ca -#define FAPI_DATARATE_11AC80_1083M3BPS_SGI_NSS2 0x68cb -#define FAPI_DATARATE_11AC160_58M5BPS 0x6c00 -#define FAPI_DATARATE_11AC160_117MBPS 0x6c01 -#define FAPI_DATARATE_11AC160_175M5BPS 0x6c02 -#define FAPI_DATARATE_11AC160_234MBPS 0x6c03 -#define FAPI_DATARATE_11AC160_351MBPS 0x6c04 -#define FAPI_DATARATE_11AC160_468MBPS 0x6c05 -#define FAPI_DATARATE_11AC160_526M5BPS 0x6c06 -#define FAPI_DATARATE_11AC160_585MBPS 0x6c07 -#define FAPI_DATARATE_11AC160_702MBPS 0x6c08 -#define FAPI_DATARATE_11AC160_780MBPS 0x6c09 -#define FAPI_DATARATE_11AC160_877M5BPS 0x6c0a -#define FAPI_DATARATE_11AC160_975MBPS 0x6c0b -#define FAPI_DATARATE_11AC160_65MBPS_SGI 0x6c40 -#define FAPI_DATARATE_11AC160_130MBPS_SGI 0x6c41 -#define FAPI_DATARATE_11AC160_195MBPS_SGI 0x6c42 -#define FAPI_DATARATE_11AC160_260MBPS_SGI 0x6c43 -#define FAPI_DATARATE_11AC160_390MBPS_SGI 0x6c44 -#define FAPI_DATARATE_11AC160_520MBPS_SGI 0x6c45 -#define FAPI_DATARATE_11AC160_585MBPS_SGI 0x6c46 -#define FAPI_DATARATE_11AC160_650MBPS_SGI 0x6c47 -#define FAPI_DATARATE_11AC160_780MBPS_SGI 0x6c48 -#define FAPI_DATARATE_11AC160_866M7BPS_SGI 0x6c49 -#define FAPI_DATARATE_11AC160_975MBPS_SGI 0x6c4a -#define FAPI_DATARATE_11AC160_1083M3BPS_SGI 0x6c4b -#define FAPI_DATARATE_11AC160_117MBPS_NSS2 0x6c80 -#define FAPI_DATARATE_11AC160_234MBPS_NSS2 0x6c81 -#define FAPI_DATARATE_11AC160_351MBPS_NSS2 0x6c82 -#define FAPI_DATARATE_11AC160_468MBPS_NSS2 0x6c83 -#define FAPI_DATARATE_11AC160_702MBPS_NSS2 0x6c84 -#define FAPI_DATARATE_11AC160_936MBPS_NSS2 0x6c85 -#define FAPI_DATARATE_11AC160_1053MBPS_NSS2 0x6c86 -#define FAPI_DATARATE_11AC160_1170MBPS_NSS2 0x6c87 -#define FAPI_DATARATE_11AC160_1404MBPS_NSS2 0x6c88 -#define FAPI_DATARATE_11AC160_1560MBPS_NSS2 0x6c89 -#define FAPI_DATARATE_11AC160_1755MBPS_NSS2 0x6c8a -#define FAPI_DATARATE_11AC160_1950MBPS_NSS2 0x6c8b -#define FAPI_DATARATE_11AC160_130MBPS_SGI_NSS2 0x6cc0 -#define FAPI_DATARATE_11AC160_260MBPS_SGI_NSS2 0x6cc1 -#define FAPI_DATARATE_11AC160_390MBPS_SGI_NSS2 0x6cc2 -#define FAPI_DATARATE_11AC160_520MBPS_SGI_NSS2 0x6cc3 -#define FAPI_DATARATE_11AC160_780MBPS_SGI_NSS2 0x6cc4 -#define FAPI_DATARATE_11AC160_1040MBPS_SGI_NSS2 0x6cc5 -#define FAPI_DATARATE_11AC160_1170MBPS_SGI_NSS2 0x6cc6 -#define FAPI_DATARATE_11AC160_1300MBPS_SGI_NSS2 0x6cc7 -#define FAPI_DATARATE_11AC160_1560MBPS_SGI_NSS2 0x6cc8 -#define FAPI_DATARATE_11AC160_1733M3BPS_SGI_NSS2 0x6cc9 -#define FAPI_DATARATE_11AC160_1950MBPS_SGI_NSS2 0x6cca -#define FAPI_DATARATE_11AC160_2166M7BPS_SGI_NSS2 0x6ccb -#define FAPI_DATARATE_11AX20_8M6BPS_1GI 0x8000 -#define FAPI_DATARATE_11AX20_17M2BPS_1GI 0x8001 -#define FAPI_DATARATE_11AX20_25M8BPS_1GI 0x8002 -#define FAPI_DATARATE_11AX20_34M4BPS_1GI 0x8003 -#define FAPI_DATARATE_11AX20_51M6BPS_1GI 0x8004 -#define FAPI_DATARATE_11AX20_68M8BPS_1GI 0x8005 -#define FAPI_DATARATE_11AX20_77M4BPS_1GI 0x8006 -#define FAPI_DATARATE_11AX20_86MBPS_1GI 0x8007 -#define FAPI_DATARATE_11AX20_103M2BPS_1GI 0x8008 -#define FAPI_DATARATE_11AX20_114M7BPS_1GI 0x8009 -#define FAPI_DATARATE_11AX20_129MBPS_1GI 0x800a -#define FAPI_DATARATE_11AX20_143M4BPS_1GI 0x800b -#define FAPI_DATARATE_11AX20_8M1BPS_2GI 0x8010 -#define FAPI_DATARATE_11AX20_16M3BPS_2GI 0x8011 -#define FAPI_DATARATE_11AX20_24M4BPS_2GI 0x8012 -#define FAPI_DATARATE_11AX20_32M5BPS_2GI 0x8013 -#define FAPI_DATARATE_11AX20_48M8BPS_2GI 0x8014 -#define FAPI_DATARATE_11AX20_65MBPS_2GI 0x8015 -#define FAPI_DATARATE_11AX20_73M1BPS_2GI 0x8016 -#define FAPI_DATARATE_11AX20_81M3BPS_2GI 0x8017 -#define FAPI_DATARATE_11AX20_97M5BPS_2GI 0x8018 -#define FAPI_DATARATE_11AX20_108M3BPS_2GI 0x8019 -#define FAPI_DATARATE_11AX20_121M9BPS_2GI 0x801a -#define FAPI_DATARATE_11AX20_135M4BPS_2GI 0x801b -#define FAPI_DATARATE_11AX20_7M3BPS_4GI 0x8020 -#define FAPI_DATARATE_11AX20_14M6BPS_4GI 0x8021 -#define FAPI_DATARATE_11AX20_21M9BPS_4GI 0x8022 -#define FAPI_DATARATE_11AX20_29M3BPS_4GI 0x8023 -#define FAPI_DATARATE_11AX20_43M9BPS_4GI 0x8024 -#define FAPI_DATARATE_11AX20_58M5BPS_4GI 0x8025 -#define FAPI_DATARATE_11AX20_65M8BPS_4GI 0x8026 -#define FAPI_DATARATE_11AX20_73M1BPS_4GI 0x8027 -#define FAPI_DATARATE_11AX20_87M8BPS_4GI 0x8028 -#define FAPI_DATARATE_11AX20_97M5BPS_4GI 0x8029 -#define FAPI_DATARATE_11AX20_109M7BPS_4GI 0x802a -#define FAPI_DATARATE_11AX20_121M9BPS_4GI 0x802b -#define FAPI_DATARATE_11AX20_4M3BPS_1GI_DCM 0x8040 -#define FAPI_DATARATE_11AX20_8M6BPS_1GI_DCM 0x8041 -#define FAPI_DATARATE_11AX20_17M2BPS_1GI_DCM 0x8043 -#define FAPI_DATARATE_11AX20_25M8BPS_1GI_DCM 0x8044 -#define FAPI_DATARATE_11AX20_4MBPS_2GI_DCM 0x8050 -#define FAPI_DATARATE_11AX20_8M1BPS_2GI_DCM 0x8051 -#define FAPI_DATARATE_11AX20_16M3BPS_2GI_DCM 0x8053 -#define FAPI_DATARATE_11AX20_24M4BPS_2GI_DCM 0x8054 -#define FAPI_DATARATE_11AX20_3M6BPS_4GI_DCM 0x8060 -#define FAPI_DATARATE_11AX20_7M3BPS_4GI_DCM 0x8061 -#define FAPI_DATARATE_11AX20_14M6BPS_4GI_DCM 0x8063 -#define FAPI_DATARATE_11AX20_21M9BPS_4GI_DCM 0x8064 -#define FAPI_DATARATE_11AX20_17M2BPS_1GI_NSS2 0x8080 -#define FAPI_DATARATE_11AX20_34M4BPS_1GI_NSS2 0x8081 -#define FAPI_DATARATE_11AX20_51M6BPS_1GI_NSS2 0x8082 -#define FAPI_DATARATE_11AX20_68M8BPS_1GI_NSS2 0x8083 -#define FAPI_DATARATE_11AX20_103M2BPS_1GI_NSS2 0x8084 -#define FAPI_DATARATE_11AX20_137M6BPS_1GI_NSS2 0x8085 -#define FAPI_DATARATE_11AX20_154M9BPS_1GI_NSS2 0x8086 -#define FAPI_DATARATE_11AX20_172M1BPS_1GI_NSS2 0x8087 -#define FAPI_DATARATE_11AX20_206M5BPS_1GI_NSS2 0x8088 -#define FAPI_DATARATE_11AX20_229M4BPS_1GI_NSS2 0x8089 -#define FAPI_DATARATE_11AX20_258M1BPS_1GI_NSS2 0x808a -#define FAPI_DATARATE_11AX20_286M8BPS_1GI_NSS2 0x808b -#define FAPI_DATARATE_11AX20_16M3BPS_2GI_NSS2 0x8090 -#define FAPI_DATARATE_11AX20_32M5BPS_2GI_NSS2 0x8091 -#define FAPI_DATARATE_11AX20_48M8BPS_2GI_NSS2 0x8092 -#define FAPI_DATARATE_11AX20_65MBPS_2GI_NSS2 0x8093 -#define FAPI_DATARATE_11AX20_97M5BPS_2GI_NSS2 0x8094 -#define FAPI_DATARATE_11AX20_130MBPS_2GI_NSS2 0x8095 -#define FAPI_DATARATE_11AX20_146M3BPS_2GI_NSS2 0x8096 -#define FAPI_DATARATE_11AX20_162M5BPS_2GI_NSS2 0x8097 -#define FAPI_DATARATE_11AX20_195MBPS_2GI_NSS2 0x8098 -#define FAPI_DATARATE_11AX20_216M7BPS_2GI_NSS2 0x8099 -#define FAPI_DATARATE_11AX20_243M8BPS_2GI_NSS2 0x809a -#define FAPI_DATARATE_11AX20_270M8BPS_2GI_NSS2 0x809b -#define FAPI_DATARATE_11AX20_14M6BPS_4GI_NSS2 0x80a0 -#define FAPI_DATARATE_11AX20_29M3BPS_4GI_NSS2 0x80a1 -#define FAPI_DATARATE_11AX20_43M9BPS_4GI_NSS2 0x80a2 -#define FAPI_DATARATE_11AX20_58M5BPS_4GI_NSS2 0x80a3 -#define FAPI_DATARATE_11AX20_87M8BPS_4GI_NSS2 0x80a4 -#define FAPI_DATARATE_11AX20_117MBPS_4GI_NSS2 0x80a5 -#define FAPI_DATARATE_11AX20_131M6BPS_4GI_NSS2 0x80a6 -#define FAPI_DATARATE_11AX20_146M3BPS_4GI_NSS2 0x80a7 -#define FAPI_DATARATE_11AX20_175M5BPS_4GI_NSS2 0x80a8 -#define FAPI_DATARATE_11AX20_195MBPS_4GI_NSS2 0x80a9 -#define FAPI_DATARATE_11AX20_219M4BPS_4GI_NSS2 0x80aa -#define FAPI_DATARATE_11AX20_243M8BPS_4GI_NSS2 0x80ab -#define FAPI_DATARATE_11AX20_8M6BPS_1GI_NSS2_DCM 0x80c0 -#define FAPI_DATARATE_11AX20_17M2BPS_1GI_NSS2_DCM 0x80c1 -#define FAPI_DATARATE_11AX20_34M4BPS_1GI_NSS2_DCM 0x80c3 -#define FAPI_DATARATE_11AX20_51M6BPS_1GI_NSS2_DCM 0x80c4 -#define FAPI_DATARATE_11AX20_8M1BPS_2GI_NSS2_DCM 0x80d0 -#define FAPI_DATARATE_11AX20_16M3BPS_2GI_NSS2_DCM 0x80d1 -#define FAPI_DATARATE_11AX20_32M5BPS_2GI_NSS2_DCM 0x80d3 -#define FAPI_DATARATE_11AX20_48M8BPS_2GI_NSS2_DCM 0x80d4 -#define FAPI_DATARATE_11AX20_7M3BPS_4GI_NSS2_DCM 0x80e0 -#define FAPI_DATARATE_11AX20_14M6BPS_4GI_NSS2_DCM 0x80e1 -#define FAPI_DATARATE_11AX20_29M3BPS_4GI_NSS2_DCM 0x80e3 -#define FAPI_DATARATE_11AX20_43M9BPS_4GI_NSS2_DCM 0x80e4 -#define FAPI_DATARATE_11AX40_17M2BPS_1GI 0x8400 -#define FAPI_DATARATE_11AX40_34M4BPS_1GI 0x8401 -#define FAPI_DATARATE_11AX40_51M6BPS_1GI 0x8402 -#define FAPI_DATARATE_11AX40_68M8BPS_1GI 0x8403 -#define FAPI_DATARATE_11AX40_103M2BPS_1GI 0x8404 -#define FAPI_DATARATE_11AX40_137M6BPS_1GI 0x8405 -#define FAPI_DATARATE_11AX40_154M9BPS_1GI 0x8406 -#define FAPI_DATARATE_11AX40_172M1BPS_1GI 0x8407 -#define FAPI_DATARATE_11AX40_206M5BPS_1GI 0x8408 -#define FAPI_DATARATE_11AX40_229M4BPS_1GI 0x8409 -#define FAPI_DATARATE_11AX40_258M1BPS_1GI 0x840a -#define FAPI_DATARATE_11AX40_286M8BPS_1GI 0x840b -#define FAPI_DATARATE_11AX40_16M3BPS_2GI 0x8410 -#define FAPI_DATARATE_11AX40_32M5BPS_2GI 0x8411 -#define FAPI_DATARATE_11AX40_48M8BPS_2GI 0x8412 -#define FAPI_DATARATE_11AX40_65MBPS_2GI 0x8413 -#define FAPI_DATARATE_11AX40_97M5BPS_2GI 0x8414 -#define FAPI_DATARATE_11AX40_130MBPS_2GI 0x8415 -#define FAPI_DATARATE_11AX40_146M3BPS_2GI 0x8416 -#define FAPI_DATARATE_11AX40_162M5BPS_2GI 0x8417 -#define FAPI_DATARATE_11AX40_195MBPS_2GI 0x8418 -#define FAPI_DATARATE_11AX40_216M7BPS_2GI 0x8419 -#define FAPI_DATARATE_11AX40_243M8BPS_2GI 0x841a -#define FAPI_DATARATE_11AX40_270M8BPS_2GI 0x841b -#define FAPI_DATARATE_11AX40_14M6BPS_4GI 0x8420 -#define FAPI_DATARATE_11AX40_29M3BPS_4GI 0x8421 -#define FAPI_DATARATE_11AX40_43M9BPS_4GI 0x8422 -#define FAPI_DATARATE_11AX40_58M5BPS_4GI 0x8423 -#define FAPI_DATARATE_11AX40_87M8BPS_4GI 0x8424 -#define FAPI_DATARATE_11AX40_117MBPS_4GI 0x8425 -#define FAPI_DATARATE_11AX40_131M6BPS_4GI 0x8426 -#define FAPI_DATARATE_11AX40_146M3BPS_4GI 0x8427 -#define FAPI_DATARATE_11AX40_175M5BPS_4GI 0x8428 -#define FAPI_DATARATE_11AX40_195MBPS_4GI 0x8429 -#define FAPI_DATARATE_11AX40_219M4BPS_4GI 0x842a -#define FAPI_DATARATE_11AX40_243M8BPS_4GI 0x842b -#define FAPI_DATARATE_11AX40_8M6BPS_1GI_DCM 0x8440 -#define FAPI_DATARATE_11AX40_17M2BPS_1GI_DCM 0x8441 -#define FAPI_DATARATE_11AX40_34M4BPS_1GI_DCM 0x8443 -#define FAPI_DATARATE_11AX40_51M6BPS_1GI_DCM 0x8444 -#define FAPI_DATARATE_11AX40_8M1BPS_2GI_DCM 0x8450 -#define FAPI_DATARATE_11AX40_16M3BPS_2GI_DCM 0x8451 -#define FAPI_DATARATE_11AX40_32M5BPS_2GI_DCM 0x8453 -#define FAPI_DATARATE_11AX40_48M8BPS_2GI_DCM 0x8454 -#define FAPI_DATARATE_11AX40_7M3BPS_4GI_DCM 0x8460 -#define FAPI_DATARATE_11AX40_14M6BPS_4GI_DCM 0x8461 -#define FAPI_DATARATE_11AX40_29M3BPS_4GI_DCM 0x8463 -#define FAPI_DATARATE_11AX40_43M9BPS_4GI_DCM 0x8464 -#define FAPI_DATARATE_11AX40_34M4BPS_1GI_NSS2 0x8480 -#define FAPI_DATARATE_11AX40_68M8BPS_1GI_NSS2 0x8481 -#define FAPI_DATARATE_11AX40_103M2BPS_1GI_NSS2 0x8482 -#define FAPI_DATARATE_11AX40_137M6BPS_1GI_NSS2 0x8483 -#define FAPI_DATARATE_11AX40_206M5BPS_1GI_NSS2 0x8484 -#define FAPI_DATARATE_11AX40_275M3BPS_1GI_NSS2 0x8485 -#define FAPI_DATARATE_11AX40_309M7BPS_1GI_NSS2 0x8486 -#define FAPI_DATARATE_11AX40_344M1BPS_1GI_NSS2 0x8487 -#define FAPI_DATARATE_11AX40_412M9BPS_1GI_NSS2 0x8488 -#define FAPI_DATARATE_11AX40_458M8BPS_1GI_NSS2 0x8489 -#define FAPI_DATARATE_11AX40_516M2BPS_1GI_NSS2 0x848a -#define FAPI_DATARATE_11AX40_573M5BPS_1GI_NSS2 0x848b -#define FAPI_DATARATE_11AX40_32M5BPS_2GI_NSS2 0x8490 -#define FAPI_DATARATE_11AX40_65MBPS_2GI_NSS2 0x8491 -#define FAPI_DATARATE_11AX40_97M5BPS_2GI_NSS2 0x8492 -#define FAPI_DATARATE_11AX40_130MBPS_2GI_NSS2 0x8493 -#define FAPI_DATARATE_11AX40_195MBPS_2GI_NSS2 0x8494 -#define FAPI_DATARATE_11AX40_260MBPS_2GI_NSS2 0x8495 -#define FAPI_DATARATE_11AX40_292M5BPS_2GI_NSS2 0x8496 -#define FAPI_DATARATE_11AX40_325MBPS_2GI_NSS2 0x8497 -#define FAPI_DATARATE_11AX40_390MBPS_2GI_NSS2 0x8498 -#define FAPI_DATARATE_11AX40_433M3BPS_2GI_NSS2 0x8499 -#define FAPI_DATARATE_11AX40_487M5BPS_2GI_NSS2 0x849a -#define FAPI_DATARATE_11AX40_541M7BPS_2GI_NSS2 0x849b -#define FAPI_DATARATE_11AX40_29M3BPS_4GI_NSS2 0x84a0 -#define FAPI_DATARATE_11AX40_58M5BPS_4GI_NSS2 0x84a1 -#define FAPI_DATARATE_11AX40_87M8BPS_4GI_NSS2 0x84a2 -#define FAPI_DATARATE_11AX40_117MBPS_4GI_NSS2 0x84a3 -#define FAPI_DATARATE_11AX40_175M5BPS_4GI_NSS2 0x84a4 -#define FAPI_DATARATE_11AX40_234MBPS_4GI_NSS2 0x84a5 -#define FAPI_DATARATE_11AX40_263M3BPS_4GI_NSS2 0x84a6 -#define FAPI_DATARATE_11AX40_292M5BPS_4GI_NSS2 0x84a7 -#define FAPI_DATARATE_11AX40_351MBPS_4GI_NSS2 0x84a8 -#define FAPI_DATARATE_11AX40_390MBPS_4GI_NSS2 0x84a9 -#define FAPI_DATARATE_11AX40_438M8BPS_4GI_NSS2 0x84aa -#define FAPI_DATARATE_11AX40_487M5BPS_4GI_NSS2 0x84ab -#define FAPI_DATARATE_11AX40_17M2BPS_1GI_NSS2_DCM 0x84c0 -#define FAPI_DATARATE_11AX40_34M4BPS_1GI_NSS2_DCM 0x84c1 -#define FAPI_DATARATE_11AX40_68M8BPS_1GI_NSS2_DCM 0x84c3 -#define FAPI_DATARATE_11AX40_103M2BPS_1GI_NSS2_DCM 0x84c4 -#define FAPI_DATARATE_11AX40_16M3BPS_2GI_NSS2_DCM 0x84d0 -#define FAPI_DATARATE_11AX40_32M5BPS_2GI_NSS2_DCM 0x84d1 -#define FAPI_DATARATE_11AX40_65MBPS_2GI_NSS2_DCM 0x84d3 -#define FAPI_DATARATE_11AX40_97M5BPS_2GI_NSS2_DCM 0x84d4 -#define FAPI_DATARATE_11AX40_14M6BPS_4GI_NSS2_DCM 0x84e0 -#define FAPI_DATARATE_11AX40_29M3BPS_4GI_NSS2_DCM 0x84e1 -#define FAPI_DATARATE_11AX40_58M5BPS_4GI_NSS2_DCM 0x84e3 -#define FAPI_DATARATE_11AX40_87M8BPS_4GI_NSS2_DCM 0x84e4 -#define FAPI_DATARATE_11AX80_36MBPS_1GI 0x8800 -#define FAPI_DATARATE_11AX80_72M1BPS_1GI 0x8801 -#define FAPI_DATARATE_11AX80_108M1BPS_1GI 0x8802 -#define FAPI_DATARATE_11AX80_144M1BPS_1GI 0x8803 -#define FAPI_DATARATE_11AX80_216M2BPS_1GI 0x8804 -#define FAPI_DATARATE_11AX80_288M2BPS_1GI 0x8805 -#define FAPI_DATARATE_11AX80_324M3BPS_1GI 0x8806 -#define FAPI_DATARATE_11AX80_360M3BPS_1GI 0x8807 -#define FAPI_DATARATE_11AX80_432M4BPS_1GI 0x8808 -#define FAPI_DATARATE_11AX80_480M4BPS_1GI 0x8809 -#define FAPI_DATARATE_11AX80_540M4BPS_1GI 0x880a -#define FAPI_DATARATE_11AX80_600M4BPS_1GI 0x880b -#define FAPI_DATARATE_11AX80_34MBPS_2GI 0x8810 -#define FAPI_DATARATE_11AX80_68M1BPS_2GI 0x8811 -#define FAPI_DATARATE_11AX80_102M1BPS_2GI 0x8812 -#define FAPI_DATARATE_11AX80_136M1BPS_2GI 0x8813 -#define FAPI_DATARATE_11AX80_204M2BPS_2GI 0x8814 -#define FAPI_DATARATE_11AX80_272M2BPS_2GI 0x8815 -#define FAPI_DATARATE_11AX80_306M3BPS_2GI 0x8816 -#define FAPI_DATARATE_11AX80_340M3BPS_2GI 0x8817 -#define FAPI_DATARATE_11AX80_408M3BPS_2GI 0x8818 -#define FAPI_DATARATE_11AX80_453M7BPS_2GI 0x8819 -#define FAPI_DATARATE_11AX80_510M4BPS_2GI 0x881a -#define FAPI_DATARATE_11AX80_567M1BPS_2GI 0x881b -#define FAPI_DATARATE_11AX80_30M6BPS_4GI 0x8820 -#define FAPI_DATARATE_11AX80_61M3BPS_4GI 0x8821 -#define FAPI_DATARATE_11AX80_91M9BPS_4GI 0x8822 -#define FAPI_DATARATE_11AX80_122M5BPS_4GI 0x8823 -#define FAPI_DATARATE_11AX80_183M8BPS_4GI 0x8824 -#define FAPI_DATARATE_11AX80_245MBPS_4GI 0x8825 -#define FAPI_DATARATE_11AX80_275M6BPS_4GI 0x8826 -#define FAPI_DATARATE_11AX80_306M3BPS_4GI 0x8827 -#define FAPI_DATARATE_11AX80_367M5BPS_4GI 0x8828 -#define FAPI_DATARATE_11AX80_408M3BPS_4GI 0x8829 -#define FAPI_DATARATE_11AX80_459M4BPS_4GI 0x882a -#define FAPI_DATARATE_11AX80_510M4BPS_4GI 0x882b -#define FAPI_DATARATE_11AX80_18MBPS_1GI_DCM 0x8840 -#define FAPI_DATARATE_11AX80_36MBPS_1GI_DCM 0x8841 -#define FAPI_DATARATE_11AX80_72M1BPS_1GI_DCM 0x8843 -#define FAPI_DATARATE_11AX80_108M1BPS_1GI_DCM 0x8844 -#define FAPI_DATARATE_11AX80_17MBPS_2GI_DCM 0x8850 -#define FAPI_DATARATE_11AX80_34MBPS_2GI_DCM 0x8851 -#define FAPI_DATARATE_11AX80_68M1BPS_2GI_DCM 0x8853 -#define FAPI_DATARATE_11AX80_102M1BPS_2GI_DCM 0x8854 -#define FAPI_DATARATE_11AX80_15M3BPS_4GI_DCM 0x8860 -#define FAPI_DATARATE_11AX80_30M6BPS_4GI_DCM 0x8861 -#define FAPI_DATARATE_11AX80_61M3BPS_4GI_DCM 0x8863 -#define FAPI_DATARATE_11AX80_91M9BPS_4GI_DCM 0x8864 -#define FAPI_DATARATE_11AX80_72M1BPS_1GI_NSS2 0x8880 -#define FAPI_DATARATE_11AX80_144M1BPS_1GI_NSS2 0x8881 -#define FAPI_DATARATE_11AX80_216M2BPS_1GI_NSS2 0x8882 -#define FAPI_DATARATE_11AX80_288M2BPS_1GI_NSS2 0x8883 -#define FAPI_DATARATE_11AX80_432M4BPS_1GI_NSS2 0x8884 -#define FAPI_DATARATE_11AX80_576M5BPS_1GI_NSS2 0x8885 -#define FAPI_DATARATE_11AX80_648M5BPS_1GI_NSS2 0x8886 -#define FAPI_DATARATE_11AX80_720M6BPS_1GI_NSS2 0x8887 -#define FAPI_DATARATE_11AX80_864M7BPS_1GI_NSS2 0x8888 -#define FAPI_DATARATE_11AX80_960M7BPS_1GI_NSS2 0x8889 -#define FAPI_DATARATE_11AX80_1080M9BPS_1GI_NSS2 0x888a -#define FAPI_DATARATE_11AX80_1201MBPS_1GI_NSS2 0x888b -#define FAPI_DATARATE_11AX80_68M1BPS_2GI_NSS2 0x8890 -#define FAPI_DATARATE_11AX80_136M1BPS_2GI_NSS2 0x8891 -#define FAPI_DATARATE_11AX80_204M2BPS_2GI_NSS2 0x8892 -#define FAPI_DATARATE_11AX80_272M2BPS_2GI_NSS2 0x8893 -#define FAPI_DATARATE_11AX80_408M3BPS_2GI_NSS2 0x8894 -#define FAPI_DATARATE_11AX80_544M4BPS_2GI_NSS2 0x8895 -#define FAPI_DATARATE_11AX80_612M5BPS_2GI_NSS2 0x8896 -#define FAPI_DATARATE_11AX80_680M6BPS_2GI_NSS2 0x8897 -#define FAPI_DATARATE_11AX80_816M7BPS_2GI_NSS2 0x8898 -#define FAPI_DATARATE_11AX80_907M4BPS_2GI_NSS2 0x8899 -#define FAPI_DATARATE_11AX80_1020M8BPS_2GI_NSS2 0x889a -#define FAPI_DATARATE_11AX80_1134M3BPS_2GI_NSS2 0x889b -#define FAPI_DATARATE_11AX80_61M3BPS_4GI_NSS2 0x88a0 -#define FAPI_DATARATE_11AX80_122M5BPS_4GI_NSS2 0x88a1 -#define FAPI_DATARATE_11AX80_183M8BPS_4GI_NSS2 0x88a2 -#define FAPI_DATARATE_11AX80_245MBPS_4GI_NSS2 0x88a3 -#define FAPI_DATARATE_11AX80_367M5BP_4GI_NSS2 0x88a4 -#define FAPI_DATARATE_11AX80_490MBPS_4GI_NSS2 0x88a5 -#define FAPI_DATARATE_11AX80_551M3BPS_4GI_NSS2 0x88a6 -#define FAPI_DATARATE_11AX80_612M5BPS_4GI_NSS2 0x88a7 -#define FAPI_DATARATE_11AX80_735MBPS_4GI_NSS2 0x88a8 -#define FAPI_DATARATE_11AX80_816M6BPS_4GI_NSS2 0x88a9 -#define FAPI_DATARATE_11AX80_918M8BPS_4GI_NSS2 0x88aa -#define FAPI_DATARATE_11AX80_1020M8BPS_4GI_NSS2 0x88ab -#define FAPI_DATARATE_11AX80_36MBPS_1GI_NSS2_DCM 0x88c0 -#define FAPI_DATARATE_11AX80_72M1BPS_1GI_NSS2_DCM 0x88c1 -#define FAPI_DATARATE_11AX80_144M1BPS_1GI_NSS2_DCM 0x88c3 -#define FAPI_DATARATE_11AX80_216M2BPS_1GI_NSS2_DCM 0x88c4 -#define FAPI_DATARATE_11AX80_34MBPS_2GI_NSS2_DCM 0x88d0 -#define FAPI_DATARATE_11AX80_68M1BPS_2GI_NSS2_DCM 0x88d1 -#define FAPI_DATARATE_11AX80_136M1BPS_2GI_NSS2_DCM 0x88d3 -#define FAPI_DATARATE_11AX80_204M2BPS_2GI_NSS2_DCM 0x88d4 -#define FAPI_DATARATE_11AX80_30M6BPS_4GI_NSS2_DCM 0x88e0 -#define FAPI_DATARATE_11AX80_61M3BPS_4GI_NSS2_DCM 0x88e1 -#define FAPI_DATARATE_11AX80_122M5BPS_4GI_NSS2_DCM 0x88e3 -#define FAPI_DATARATE_11AX80_183M8BPS_4GI_NSS2_DCM 0x88e4 -#define FAPI_DATARATE_11AX160_72M1BPS_1GI 0x8c00 -#define FAPI_DATARATE_11AX160_144M1BPS_1GI 0x8c01 -#define FAPI_DATARATE_11AX160_216M2BPS_1GI 0x8c02 -#define FAPI_DATARATE_11AX160_288M2BPS_1GI 0x8c03 -#define FAPI_DATARATE_11AX160_432M4BPS_1GI 0x8c04 -#define FAPI_DATARATE_11AX160_576M5BPS_1GI 0x8c05 -#define FAPI_DATARATE_11AX160_648M5BPS_1GI 0x8c06 -#define FAPI_DATARATE_11AX160_720M6BPS_1GI 0x8c07 -#define FAPI_DATARATE_11AX160_864M7BPS_1GI 0x8c08 -#define FAPI_DATARATE_11AX160_960M7BPS_1GI 0x8c09 -#define FAPI_DATARATE_11AX160_1080M9BPS_1GI 0x8c0a -#define FAPI_DATARATE_11AX160_1201MBPS_1GI 0x8c0b -#define FAPI_DATARATE_11AX160_68M1BPS_2GI 0x8c10 -#define FAPI_DATARATE_11AX160_136M1BPS_2GI 0x8c11 -#define FAPI_DATARATE_11AX160_204M2BPS_2GI 0x8c12 -#define FAPI_DATARATE_11AX160_272M2BPS_2GI 0x8c13 -#define FAPI_DATARATE_11AX160_408M3BPS_2GI 0x8c14 -#define FAPI_DATARATE_11AX160_544M4BPS_2GI 0x8c15 -#define FAPI_DATARATE_11AX160_612M5BPS_2GI 0x8c16 -#define FAPI_DATARATE_11AX160_680M6BPS_2GI 0x8c17 -#define FAPI_DATARATE_11AX160_816M7BPS_2GI 0x8c18 -#define FAPI_DATARATE_11AX160_907M4BPS_2GI 0x8c19 -#define FAPI_DATARATE_11AX160_1020M8BPS_2GI 0x8c1a -#define FAPI_DATARATE_11AX160_1134M2BPS_2GI 0x8c1b -#define FAPI_DATARATE_11AX160_61M3BPS_4GI 0x8c20 -#define FAPI_DATARATE_11AX160_122M5BPS_4GI 0x8c21 -#define FAPI_DATARATE_11AX160_183M8BPS_4GI 0x8c22 -#define FAPI_DATARATE_11AX160_245MBPS_4GI 0x8c23 -#define FAPI_DATARATE_11AX160_367M5BPS_4GI 0x8c24 -#define FAPI_DATARATE_11AX160_490MBPS_4GI 0x8c25 -#define FAPI_DATARATE_11AX160_551M3BPS_4GI 0x8c26 -#define FAPI_DATARATE_11AX160_612M5BPS_4GI 0x8c27 -#define FAPI_DATARATE_11AX160_735MBPS_4GI 0x8c28 -#define FAPI_DATARATE_11AX160_816M6BPS_4GI 0x8c29 -#define FAPI_DATARATE_11AX160_918M8BPS_4GI 0x8c2a -#define FAPI_DATARATE_11AX160_1020M8BPS_4GI 0x8c2b -#define FAPI_DATARATE_11AX160_36MBPS_1GI_DCM 0x8c40 -#define FAPI_DATARATE_11AX160_72M1BPS_1GI_DCM 0x8c41 -#define FAPI_DATARATE_11AX160_144M1BPS_1GI_DCM 0x8c43 -#define FAPI_DATARATE_11AX160_216M2BPS_1GI_DCM 0x8c44 -#define FAPI_DATARATE_11AX160_34MBPS_2GI_DCM 0x8c50 -#define FAPI_DATARATE_11AX160_68M1BPS_2GI_DCM 0x8c51 -#define FAPI_DATARATE_11AX160_136M1BPS_2GI_DCM 0x8c53 -#define FAPI_DATARATE_11AX160_204M2BPS_2GI_DCM 0x8c54 -#define FAPI_DATARATE_11AX160_30M6BPS_4GI_DCM 0x8c60 -#define FAPI_DATARATE_11AX160_61M3BPS_4GI_DCM 0x8c61 -#define FAPI_DATARATE_11AX160_122M5BPS_4GI_DCM 0x8c63 -#define FAPI_DATARATE_11AX160_183M8BPS_4GI_DCM 0x8c64 -#define FAPI_DATARATE_11AX160_144M1BPS_1GI_NSS2 0x8c80 -#define FAPI_DATARATE_11AX160_288M2BPS_1GI_NSS2 0x8c81 -#define FAPI_DATARATE_11AX160_432M4BPS_1GI_NSS2 0x8c82 -#define FAPI_DATARATE_11AX160_576M5BPS_1GI_NSS2 0x8c83 -#define FAPI_DATARATE_11AX160_864M7BPS_1GI_NSS2 0x8c84 -#define FAPI_DATARATE_11AX160_1152M9BPS_1GI_NSS2 0x8c85 -#define FAPI_DATARATE_11AX160_1297M1BPS_1GI_NSS2 0x8c86 -#define FAPI_DATARATE_11AX160_1441M2BPS_1GI_NSS2 0x8c87 -#define FAPI_DATARATE_11AX160_1729M4BPS_1GI_NSS2 0x8c88 -#define FAPI_DATARATE_11AX160_1921M5BPS_1GI_NSS2 0x8c89 -#define FAPI_DATARATE_11AX160_2161M8BPS_1GI_NSS2 0x8c8a -#define FAPI_DATARATE_11AX160_2401M9BPS_1GI_NSS2 0x8c8b -#define FAPI_DATARATE_11AX160_136M1BPS_2GI_NSS2 0x8c90 -#define FAPI_DATARATE_11AX160_272M2BPS_2GI_NSS2 0x8c91 -#define FAPI_DATARATE_11AX160_408M3BPS_2GI_NSS2 0x8c92 -#define FAPI_DATARATE_11AX160_544M4BPS_2GI_NSS2 0x8c93 -#define FAPI_DATARATE_11AX160_816M7BPS_2GI_NSS2 0x8c94 -#define FAPI_DATARATE_11AX160_1088M9BPS_2GI_NSS2 0x8c95 -#define FAPI_DATARATE_11AX160_1225MBPS_2GI_NSS2 0x8c96 -#define FAPI_DATARATE_11AX160_1361M1BPS_2GI_NSS2 0x8c97 -#define FAPI_DATARATE_11AX160_1633M3BPS_2GI_NSS2 0x8c98 -#define FAPI_DATARATE_11AX160_1814M8BPS_2GI_NSS2 0x8c99 -#define FAPI_DATARATE_11AX160_2041M7BPS_2GI_NSS2 0x8c9a -#define FAPI_DATARATE_11AX160_2268M5BPS_2GI_NSS2 0x8c9b -#define FAPI_DATARATE_11AX160_122M5BPS_4GI_NSS2 0x8ca0 -#define FAPI_DATARATE_11AX160_245MBPS_4GI_NSS2 0x8ca1 -#define FAPI_DATARATE_11AX160_367M5BPS_4GI_NSS2 0x8ca2 -#define FAPI_DATARATE_11AX160_490MBPS_4GI_NSS2 0x8ca3 -#define FAPI_DATARATE_11AX160_735MBPS_4GI_NSS2 0x8ca4 -#define FAPI_DATARATE_11AX160_980MBPS_4GI_NSS2 0x8ca5 -#define FAPI_DATARATE_11AX160_1102M5BPS_4GI_NSS2 0x8ca6 -#define FAPI_DATARATE_11AX160_1225MBPS_4GI_NSS2 0x8ca7 -#define FAPI_DATARATE_11AX160_1470MBPS_4GI_NSS2 0x8ca8 -#define FAPI_DATARATE_11AX160_1633M3BPS_4GI_NSS2 0x8ca9 -#define FAPI_DATARATE_11AX160_1837M5BPS_4GI_NSS2 0x8caa -#define FAPI_DATARATE_11AX160_2041M6BPS_4GI_NSS2 0x8cab -#define FAPI_DATARATE_11AX160_72M1BPS_1GI_NSS2_DCM 0x8cc0 -#define FAPI_DATARATE_11AX160_144M1BPS_1GI_NSS2_DCM 0x8cc1 -#define FAPI_DATARATE_11AX160_288M2BPS_1GI_NSS2_DCM 0x8cc3 -#define FAPI_DATARATE_11AX160_432M4BPS_1GI_NSS2_DCM 0x8cc4 -#define FAPI_DATARATE_11AX160_68M1BPS_2GI_NSS2_DCM 0x8cd0 -#define FAPI_DATARATE_11AX160_136M1BPS_2GI_NSS2_DCM 0x8cd1 -#define FAPI_DATARATE_11AX160_272M2BPS_2GI_NSS2_DCM 0x8cd3 -#define FAPI_DATARATE_11AX160_408M3BPS_2GI_NSS2_DCM 0x8cd4 -#define FAPI_DATARATE_11AX160_61M3BPS_4GI_NSS2_DCM 0x8ce0 -#define FAPI_DATARATE_11AX160_122M5BPS_4GI_NSS2_DCM 0x8ce1 -#define FAPI_DATARATE_11AX160_245MBPS_4GI_NSS2_DCM 0x8ce3 -#define FAPI_DATARATE_11AX160_367M5BPS_4GI_NSS2_DCM 0x8ce4 -#define FAPI_DATARATE_CTR_TOTAL 0xe000 -#define FAPI_DATARATE_CTR_NO_ERROR 0xe001 -#define FAPI_DATARATE_CTR_CRC_ERROR 0xe002 -#define FAPI_DATARATE_CTR_BAD_SIGNAL 0xe003 -#define FAPI_DATARATE_CTR_STBC 0xe004 -#define FAPI_DATARATE_CTR_DUPLICATE 0xe005 -#define FAPI_DATARATE_CTR_ERROR 0xe006 -#define FAPI_DATARATE_CTR_LDPC 0xe007 -#define FAPI_DATARATE_CTR_BEAMFORMED 0xe008 +#define FAPI_DATARATE_11B20_1MBPS 0x0001 +#define FAPI_DATARATE_11B20_2MBPS 0x0002 +#define FAPI_DATARATE_11B20_5M5BPS 0x0005 +#define FAPI_DATARATE_11B20_11MBPS 0x000b +#define FAPI_DATARATE_11A20_6MBPS 0x2006 +#define FAPI_DATARATE_11A20_9MBPS 0x2009 +#define FAPI_DATARATE_11A20_12MBPS 0x200c +#define FAPI_DATARATE_11A20_18MBPS 0x2012 +#define FAPI_DATARATE_11A20_24MBPS 0x2018 +#define FAPI_DATARATE_11A20_36MBPS 0x2024 +#define FAPI_DATARATE_11A20_48MBPS 0x2030 +#define FAPI_DATARATE_11A20_54MBPS 0x2036 +#define FAPI_DATARATE_11N20_6M5BPS 0x4000 +#define FAPI_DATARATE_11N20_13MBPS 0x4001 +#define FAPI_DATARATE_11N20_19M5BPS 0x4002 +#define FAPI_DATARATE_11N20_26MBPS 0x4003 +#define FAPI_DATARATE_11N20_39MBPS 0x4004 +#define FAPI_DATARATE_11N20_52MBPS 0x4005 +#define FAPI_DATARATE_11N20_58M5BPS 0x4006 +#define FAPI_DATARATE_11N20_65MBPS 0x4007 +#define FAPI_DATARATE_11N20_7M2BPS_SGI 0x4040 +#define FAPI_DATARATE_11N20_14M4BPS_SGI 0x4041 +#define FAPI_DATARATE_11N20_21M7BPS_SGI 0x4042 +#define FAPI_DATARATE_11N20_28M9BPS_SGI 0x4043 +#define FAPI_DATARATE_11N20_43M3BPS_SGI 0x4044 +#define FAPI_DATARATE_11N20_57M8BPS_SGI 0x4045 +#define FAPI_DATARATE_11N20_65MBPS_SGI 0x4046 +#define FAPI_DATARATE_11N20_72M2BPS_SGI 0x4047 +#define FAPI_DATARATE_11N20_13MBPS_NSS2 0x4088 +#define FAPI_DATARATE_11N20_26MBPS_NSS2 0x4089 +#define FAPI_DATARATE_11N20_39MBPS_NSS2 0x408a +#define FAPI_DATARATE_11N20_52MBPS_NSS2 0x408b +#define FAPI_DATARATE_11N20_78MBPS_NSS2 0x408c +#define FAPI_DATARATE_11N20_104MBPS_NSS2 0x408d +#define FAPI_DATARATE_11N20_117MBPS_NSS2 0x408e +#define FAPI_DATARATE_11N20_130MBPS_NSS2 0x408f +#define FAPI_DATARATE_11N20_14M4BPS_SGI_NSS2 0x40c8 +#define FAPI_DATARATE_11N20_28M9BPS_SGI_NSS2 0x40c9 +#define FAPI_DATARATE_11N20_43M3BPS_SGI_NSS2 0x40ca +#define FAPI_DATARATE_11N20_57M8BPS_SGI_NSS2 0x40cb +#define FAPI_DATARATE_11N20_86M7BPS_SGI_NSS2 0x40cc +#define FAPI_DATARATE_11N20_115M6BPS_SGI_NSS2 0x40cd +#define FAPI_DATARATE_11N20_130MBPS_SGI_NSS2 0x40ce +#define FAPI_DATARATE_11N20_144M4BPS_SGI_NSS2 0x40cf +#define FAPI_DATARATE_11N40_13M5BPS 0x4400 +#define FAPI_DATARATE_11N40_27MBPS 0x4401 +#define FAPI_DATARATE_11N40_40M5BPS 0x4402 +#define FAPI_DATARATE_11N40_54MBPS 0x4403 +#define FAPI_DATARATE_11N40_81MBPS 0x4404 +#define FAPI_DATARATE_11N40_108MBPS 0x4405 +#define FAPI_DATARATE_11N40_121M5BPS 0x4406 +#define FAPI_DATARATE_11N40_135MBPS 0x4407 +#define FAPI_DATARATE_11N40_6MBPS 0x4420 +#define FAPI_DATARATE_11N40_15MBPS_SGI 0x4440 +#define FAPI_DATARATE_11N40_30MBPS_SGI 0x4441 +#define FAPI_DATARATE_11N40_45MBPS_SGI 0x4442 +#define FAPI_DATARATE_11N40_60MBPS_SGI 0x4443 +#define FAPI_DATARATE_11N40_90MBPS_SGI 0x4444 +#define FAPI_DATARATE_11N40_120MBPS_SGI 0x4445 +#define FAPI_DATARATE_11N40_135MBPS_SGI 0x4446 +#define FAPI_DATARATE_11N40_150MBPS_SGI 0x4447 +#define FAPI_DATARATE_11N40_6M7BPS_SGI 0x4460 +#define FAPI_DATARATE_11N40_27MBPS_NSS2 0x4488 +#define FAPI_DATARATE_11N40_54MBPS_NSS2 0x4489 +#define FAPI_DATARATE_11N40_81MBPS_NSS2 0x448a +#define FAPI_DATARATE_11N40_108MBPS_NSS2 0x448b +#define FAPI_DATARATE_11N40_162MBPS_NSS2 0x448c +#define FAPI_DATARATE_11N40_216MBPS_NSS2 0x448d +#define FAPI_DATARATE_11N40_243MBPS_NSS2 0x448e +#define FAPI_DATARATE_11N40_270MBPS_NSS2 0x448f +#define FAPI_DATARATE_11N40_30MBPS_SGI_NSS2 0x44c8 +#define FAPI_DATARATE_11N40_60MBPS_SGI_NSS2 0x44c9 +#define FAPI_DATARATE_11N40_90MBPS_SGI_NSS2 0x44ca +#define FAPI_DATARATE_11N40_120MBPS_SGI_NSS2 0x44cb +#define FAPI_DATARATE_11N40_180MBPS_SGI_NSS2 0x44cc +#define FAPI_DATARATE_11N40_240MBPS_SGI_NSS2 0x44cd +#define FAPI_DATARATE_11N40_270MBPS_SGI_NSS2 0x44ce +#define FAPI_DATARATE_11N40_300MBPS_SGI_NSS2 0x44cf +#define FAPI_DATARATE_11AC20_6M5BPS 0x6000 +#define FAPI_DATARATE_11AC20_13MBPS 0x6001 +#define FAPI_DATARATE_11AC20_19M5BPS 0x6002 +#define FAPI_DATARATE_11AC20_26MBPS 0x6003 +#define FAPI_DATARATE_11AC20_39MBPS 0x6004 +#define FAPI_DATARATE_11AC20_52MBPS 0x6005 +#define FAPI_DATARATE_11AC20_58M5BPS 0x6006 +#define FAPI_DATARATE_11AC20_65MBPS 0x6007 +#define FAPI_DATARATE_11AC20_78MBPS 0x6008 +#define FAPI_DATARATE_11AC20_7M2BPS_SGI 0x6040 +#define FAPI_DATARATE_11AC20_14M4BPS_SGI 0x6041 +#define FAPI_DATARATE_11AC20_21M7BPS_SGI 0x6042 +#define FAPI_DATARATE_11AC20_28M9BPS_SGI 0x6043 +#define FAPI_DATARATE_11AC20_43M3BPS_SGI 0x6044 +#define FAPI_DATARATE_11AC20_57M8BPS_SGI 0x6045 +#define FAPI_DATARATE_11AC20_65MBPS_SGI 0x6046 +#define FAPI_DATARATE_11AC20_72M2BPS_SGI 0x6047 +#define FAPI_DATARATE_11AC20_86M7BPS_SGI 0x6048 +#define FAPI_DATARATE_11AC20_13MBPS_NSS2 0x6080 +#define FAPI_DATARATE_11AC20_26MBPS_NSS2 0x6081 +#define FAPI_DATARATE_11AC20_39MBPS_NSS2 0x6082 +#define FAPI_DATARATE_11AC20_52MBPS_NSS2 0x6083 +#define FAPI_DATARATE_11AC20_78MBPS_NSS2 0x6084 +#define FAPI_DATARATE_11AC20_104MBPS_NSS2 0x6085 +#define FAPI_DATARATE_11AC20_117MBPS_NSS2 0x6086 +#define FAPI_DATARATE_11AC20_130MBPS_NSS2 0x6087 +#define FAPI_DATARATE_11AC20_156MBPS_NSS2 0x6088 +#define FAPI_DATARATE_11AC20_14M4BPS_SGI_NSS2 0x60c0 +#define FAPI_DATARATE_11AC20_28M9BPS_SGI_NSS2 0x60c1 +#define FAPI_DATARATE_11AC20_43M3BPS_SGI_NSS2 0x60c2 +#define FAPI_DATARATE_11AC20_57M8BPS_SGI_NSS2 0x60c3 +#define FAPI_DATARATE_11AC20_86M7BPS_SGI_NSS2 0x60c4 +#define FAPI_DATARATE_11AC20_115M6BPS_SGI_NSS2 0x60c5 +#define FAPI_DATARATE_11AC20_130MBPS_SGI_NSS2 0x60c6 +#define FAPI_DATARATE_11AC20_144M4BPS_SGI_NSS2 0x60c7 +#define FAPI_DATARATE_11AC20_173M3BPS_SGI_NSS2 0x60c8 +#define FAPI_DATARATE_11AC40_13M5BPS 0x6400 +#define FAPI_DATARATE_11AC40_27MBPS 0x6401 +#define FAPI_DATARATE_11AC40_40M5BPS 0x6402 +#define FAPI_DATARATE_11AC40_54MBPS 0x6403 +#define FAPI_DATARATE_11AC40_81MBPS 0x6404 +#define FAPI_DATARATE_11AC40_108MBPS 0x6405 +#define FAPI_DATARATE_11AC40_121M5BPS 0x6406 +#define FAPI_DATARATE_11AC40_135MBPS 0x6407 +#define FAPI_DATARATE_11AC40_162MBPS 0x6408 +#define FAPI_DATARATE_11AC40_180MBPS 0x6409 +#define FAPI_DATARATE_11AC40_15MBPS_SGI 0x6440 +#define FAPI_DATARATE_11AC40_30MBPS_SGI 0x6441 +#define FAPI_DATARATE_11AC40_45MBPS_SGI 0x6442 +#define FAPI_DATARATE_11AC40_60MBPS_SGI 0x6443 +#define FAPI_DATARATE_11AC40_90MBPS_SGI 0x6444 +#define FAPI_DATARATE_11AC40_120MBPS_SGI 0x6445 +#define FAPI_DATARATE_11AC40_135MBPS_SGI 0x6446 +#define FAPI_DATARATE_11AC40_150MBPS_SGI 0x6447 +#define FAPI_DATARATE_11AC40_180MBPS_SGI 0x6448 +#define FAPI_DATARATE_11AC40_200MBPS_SGI 0x6449 +#define FAPI_DATARATE_11AC40_27MBPS_NSS2 0x6480 +#define FAPI_DATARATE_11AC40_54MBPS_NSS2 0x6481 +#define FAPI_DATARATE_11AC40_81MBPS_NSS2 0x6482 +#define FAPI_DATARATE_11AC40_108MBPS_NSS2 0x6483 +#define FAPI_DATARATE_11AC40_162MBPS_NSS2 0x6484 +#define FAPI_DATARATE_11AC40_216MBPS_NSS2 0x6485 +#define FAPI_DATARATE_11AC40_243MBPS_NSS2 0x6486 +#define FAPI_DATARATE_11AC40_270MBPS_NSS2 0x6487 +#define FAPI_DATARATE_11AC40_324MBPS_NSS2 0x6488 +#define FAPI_DATARATE_11AC40_360MBPS_NSS2 0x6489 +#define FAPI_DATARATE_11AC40_30MBPS_SGI_NSS2 0x64c0 +#define FAPI_DATARATE_11AC40_60MBPS_SGI_NSS2 0x64c1 +#define FAPI_DATARATE_11AC40_90MBPS_SGI_NSS2 0x64c2 +#define FAPI_DATARATE_11AC40_120MBPS_SGI_NSS2 0x64c3 +#define FAPI_DATARATE_11AC40_180MBPS_SGI_NSS2 0x64c4 +#define FAPI_DATARATE_11AC40_240MBPS_SGI_NSS2 0x64c5 +#define FAPI_DATARATE_11AC40_270MBPS_SGI_NSS2 0x64c6 +#define FAPI_DATARATE_11AC40_300MBPS_SGI_NSS2 0x64c7 +#define FAPI_DATARATE_11AC40_360MBPS_SGI_NSS2 0x64c8 +#define FAPI_DATARATE_11AC40_400MBPS_SGI_NSS2 0x64c9 +#define FAPI_DATARATE_11AC80_29M3BPS 0x6800 +#define FAPI_DATARATE_11AC80_58M5BPS 0x6801 +#define FAPI_DATARATE_11AC80_87M8BPS 0x6802 +#define FAPI_DATARATE_11AC80_117MBPS 0x6803 +#define FAPI_DATARATE_11AC80_175M5BPS 0x6804 +#define FAPI_DATARATE_11AC80_234MBPS 0x6805 +#define FAPI_DATARATE_11AC80_263M3BPS 0x6806 +#define FAPI_DATARATE_11AC80_292M5BPS 0x6807 +#define FAPI_DATARATE_11AC80_351MBPS 0x6808 +#define FAPI_DATARATE_11AC80_390MBPS 0x6809 +#define FAPI_DATARATE_11AC80_32M5BPS_SGI 0x6840 +#define FAPI_DATARATE_11AC80_65MBPS_SGI 0x6841 +#define FAPI_DATARATE_11AC80_97M5BPS_SGI 0x6842 +#define FAPI_DATARATE_11AC80_130MBPS_SGI 0x6843 +#define FAPI_DATARATE_11AC80_195MBPS_SGI 0x6844 +#define FAPI_DATARATE_11AC80_260MBPS_SGI 0x6845 +#define FAPI_DATARATE_11AC80_292M5BPS_SGI 0x6846 +#define FAPI_DATARATE_11AC80_325MBPS_SGI 0x6847 +#define FAPI_DATARATE_11AC80_390MBPS_SGI 0x6848 +#define FAPI_DATARATE_11AC80_433M3BPS_SGI 0x6849 +#define FAPI_DATARATE_11AC80_58M5BPS_NSS2 0x6880 +#define FAPI_DATARATE_11AC80_117MBPS_NSS2 0x6881 +#define FAPI_DATARATE_11AC80_175M5BPS_NSS2 0x6882 +#define FAPI_DATARATE_11AC80_234MBPS_NSS2 0x6883 +#define FAPI_DATARATE_11AC80_351MBPS_NSS2 0x6884 +#define FAPI_DATARATE_11AC80_468MBPS_NSS2 0x6885 +#define FAPI_DATARATE_11AC80_526M5BPS_NSS2 0x6886 +#define FAPI_DATARATE_11AC80_585MBPS_NSS2 0x6887 +#define FAPI_DATARATE_11AC80_702MBPS_NSS2 0x6888 +#define FAPI_DATARATE_11AC80_780MBPS_NSS2 0x6889 +#define FAPI_DATARATE_11AC80_65MBPS_SGI_NSS2 0x68c0 +#define FAPI_DATARATE_11AC80_130MBPS_SGI_NSS2 0x68c1 +#define FAPI_DATARATE_11AC80_195MBPS_SGI_NSS2 0x68c2 +#define FAPI_DATARATE_11AC80_260MBPS_SGI_NSS2 0x68c3 +#define FAPI_DATARATE_11AC80_390MBPS_SGI_NSS2 0x68c4 +#define FAPI_DATARATE_11AC80_520MBPS_SGI_NSS2 0x68c5 +#define FAPI_DATARATE_11AC80_585MBPS_SGI_NSS2 0x68c6 +#define FAPI_DATARATE_11AC80_650MBPS_SGI_NSS2 0x68c7 +#define FAPI_DATARATE_11AC80_780MBPS_SGI_NSS2 0x68c8 +#define FAPI_DATARATE_11AC80_866M7BPS_SGI_NSS2 0x68c9 +#define FAPI_DATARATE_CTR_TOTAL 0xe000 +#define FAPI_DATARATE_CTR_NO_ERROR 0xe001 +#define FAPI_DATARATE_CTR_CRC_ERROR 0xe002 +#define FAPI_DATARATE_CTR_BAD_SIGNAL 0xe003 +#define FAPI_DATARATE_CTR_STBC 0xe004 +#define FAPI_DATARATE_CTR_DUPLICATE 0xe005 +#define FAPI_DATARATE_CTR_ERROR 0xe006 +#define FAPI_DATARATE_CTR_LDPC 0xe007 #define FAPI_DATAUNITDESCRIPTOR_IEEE802_11_FRAME 0x0000 #define FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME 0x0001 @@ -789,6 +329,7 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_DIRECTION_TRANSMIT 0x0000 #define FAPI_DIRECTION_RECEIVE 0x0001 +#define FAPI_DIRECTION_ANY 0x0003 #define FAPI_ENDPOINT_HOSTIO 0x0001 #define FAPI_ENDPOINT_DPLP 0x0002 @@ -874,12 +415,10 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_HT_HT_RATE 0x2 #define FAPI_HT_VHT_RATE 0x3 -#define FAPI_KEYTYPE_GROUP 0x0000 -#define FAPI_KEYTYPE_PAIRWISE 0x0001 -#define FAPI_KEYTYPE_WEP 0x0002 -#define FAPI_KEYTYPE_IGTK 0x0003 -#define FAPI_KEYTYPE_PMK 0x0004 -#define FAPI_KEYTYPE_FIRST_ILLEGAL 0x0005 +#define FAPI_KEYTYPE_GROUP 0x0000 +#define FAPI_KEYTYPE_PAIRWISE 0x0001 +#define FAPI_KEYTYPE_WEP 0x0002 +#define FAPI_KEYTYPE_IGTK 0x0003 #define FAPI_MESSAGETYPE_EAP_MESSAGE 0x0001 #define FAPI_MESSAGETYPE_EAPOL_KEY_M123 0x0002 @@ -888,9 +427,8 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_MESSAGETYPE_DHCP 0x0005 #define FAPI_MESSAGETYPE_NEIGHBOR_DISCOVERY 0x0006 #define FAPI_MESSAGETYPE_WAI_MESSAGE 0x0007 -#define FAPI_MESSAGETYPE_ANY_OTHER 0x0008 +#define FAPI_MESSAGETYPE_PERIODIC_OFFLOAD 0x0008 #define FAPI_MESSAGETYPE_IEEE80211_ACTION 0x0010 -#define FAPI_MESSAGETYPE_IEEE80211_MGMT 0x0011 #define FAPI_MODE_SOURCE 0x0001 #define FAPI_MODE_SINK 0x0002 @@ -900,15 +438,16 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_NANAVAILABILITYDURATION_32MS 0x01 #define FAPI_NANAVAILABILITYDURATION_64MS 0x02 +#define FAPI_NANOPERATIONCONTROL_CLUSTER_SDF 0x0001 #define FAPI_NANOPERATIONCONTROL_MAC_ADDRESS_EVENT 0x0002 #define FAPI_NANOPERATIONCONTROL_START_CLUSTER_EVENT 0x0004 #define FAPI_NANOPERATIONCONTROL_JOINED_CLUSTER_EVENT 0x0008 -#define FAPI_NANSDFCONTROL_PUBLISH_END_EVENT 0x0001 -#define FAPI_NANSDFCONTROL_SUBSCRIBE_END_EVENT 0x0002 -#define FAPI_NANSDFCONTROL_MATCH_EXPIRED_EVENT 0x0004 -#define FAPI_NANSDFCONTROL_RECEIVED_FOLLOWUP_EVENT 0x0008 -#define FAPI_NANSDFCONTROL_FOLLOWUP_TRANSMIT_STATUS 0x0010 +#define FAPI_NANSDFCONTROL_PUBLISH_END_EVENT 0x0001 +#define FAPI_NANSDFCONTROL_SUBSCRIBE_END_EVENT 0x0002 +#define FAPI_NANSDFCONTROL_MATCH_EXPIRED_EVENT 0x0004 +#define FAPI_NANSDFCONTROL_RECEIVED_FOLLOWUP_EVENT 0x0008 +#define FAPI_NANSDFCONTROL_DISABLE_RESPONSES_AFTER_FOLLOWUP 0x0010 #define FAPI_PACKETFILTERMODE_OPT_OUT 0x01 #define FAPI_PACKETFILTERMODE_OPT_IN 0x02 @@ -964,57 +503,51 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RADIOBITMAP_RADIO_0 0x0001 #define FAPI_RADIOBITMAP_RADIO_1 0x0002 -#define FAPI_RANGINGINDTYPE_CONTINUOUS_INDICATION 0x0001 -#define FAPI_RANGINGINDTYPE_INGRESS 0x0002 -#define FAPI_RANGINGINDTYPE_EGRESS 0x0004 +#define FAPI_REASONCODE_RESERVED 0x0000 +#define FAPI_REASONCODE_UNSPECIFIED_REASON 0x0001 +#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_AUTHENTICATION 0x0002 +#define FAPI_REASONCODE_DEAUTHENTICATED_LEAVING_ESS 0x0003 +#define FAPI_REASONCODE_DEAUTHENTICATED_INACTIVITY 0x0004 +#define FAPI_REASONCODE_DEAUTHENTICATED_NO_MORE_STATIONS 0x0005 +#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_CLASS_2_FRAME 0x0006 +#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_CLASS_3_FRAME 0x0007 +#define FAPI_REASONCODE_DEAUTHENTICATED_UNACCEPTABLE_POWER_CAPABILITY 0x000a +#define FAPI_REASONCODE_DEAUTHENTICATED_4_WAY_HANDSHAKE_TIMEOUT 0x000f +#define FAPI_REASONCODE_DEAUTHENTICATED_GROUP_HANDSHAKE_TIMEOUT 0x0010 +#define FAPI_REASONCODE_DEAUTHENTICATED_HANDSHAKE_ELEMENT_MISMATCH 0x0011 +#define FAPI_REASONCODE_DEAUTHENTICATED_REASON_INVALID_RSNE 0x0014 +#define FAPI_REASONCODE_DEAUTHENTICATED_802_1_X_AUTH_FAILED 0x0017 +#define FAPI_REASONCODE_TDLS_PEER_UNREACHABLE 0x0019 +#define FAPI_REASONCODE_TDLS_TEARDOWN_UNSPECIFIED_REASON 0x001a +#define FAPI_REASONCODE_QOS_UNSPECIFIED_REASON 0x0020 +#define FAPI_REASONCODE_QOS_EXCESSIVE_NOT_ACK 0x0022 +#define FAPI_REASONCODE_QOS_TXOP_LIMIT_EXCEEDED 0x0023 +#define FAPI_REASONCODE_QSTA_LEAVING 0x0024 +#define FAPI_REASONCODE_END 0x0025 +#define FAPI_REASONCODE_UNKNOWN 0x0026 +#define FAPI_REASONCODE_TIMEOUT 0x0027 +#define FAPI_REASONCODE_KEEP_ALIVE_FAILURE 0x0028 +#define FAPI_REASONCODE_START 0x0029 +#define FAPI_REASONCODE_SYNCHRONISATION_LOSS 0x8003 +#define FAPI_REASONCODE_SECURITY_REQUIRED 0x8004 +#define FAPI_REASONCODE_ROAMING_FAILURE_LINK_LOSS_NO_CANDIDATE 0x8005 +#define FAPI_REASONCODE_HOTSPOT_MAX_CLIENT_REACHED 0x8006 +#define FAPI_REASONCODE_REPORTING_ABORTED_SCANNING 0x8008 +#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_TIMEOUT 0x9001 +#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_USER_REQUEST 0x9002 +#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_COUNT_REACHED 0x9003 +#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_DISCOVERY_SHUTDOWN 0x9004 +#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_POST_DISCOVERY_EXPIRED 0x9005 +#define FAPI_REASONCODE_NAN_TRANSMIT_FOLLOWUP_SUCCESS 0x9006 +#define FAPI_REASONCODE_NAN_TRANSMIT_FOLLOWUP_FAILURE 0x9007 -#define FAPI_REASONCODE_RESERVED 0x0000 -#define FAPI_REASONCODE_UNSPECIFIED_REASON 0x0001 -#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_AUTHENTICATION 0x0002 -#define FAPI_REASONCODE_DEAUTHENTICATED_LEAVING 0x0003 -#define FAPI_REASONCODE_DEAUTHENTICATED_NO_MORE_STATIONS 0x0005 -#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_CLASS_2_FRAME 0x0006 -#define FAPI_REASONCODE_DEAUTHENTICATED_INVALID_CLASS_3_FRAME 0x0007 -#define FAPI_REASONCODE_DEAUTHENTICATED_REASON_INVALID_IE 0x000d -#define FAPI_REASONCODE_DEAUTHENTICATED_4_WAY_HANDSHAKE_TIMEOUT 0x000f -#define FAPI_REASONCODE_DEAUTHENTICATED_GROUP_HANDSHAKE_TIMEOUT 0x0010 -#define FAPI_REASONCODE_DEAUTHENTICATED_HANDSHAKE_ELEMENT_MISMATCH 0x0011 -#define FAPI_REASONCODE_DEAUTHENTICATED_REASON_INVALID_RSNE 0x0014 -#define FAPI_REASONCODE_DEAUTHENTICATED_802_1_X_AUTH_FAILED 0x0017 -#define FAPI_REASONCODE_TDLS_PEER_UNREACHABLE 0x0019 -#define FAPI_REASONCODE_TDLS_TEARDOWN_UNSPECIFIED_REASON 0x001a -#define FAPI_REASONCODE_QOS_UNSPECIFIED_REASON 0x0020 -#define FAPI_REASONCODE_QOS_EXCESSIVE_NOT_ACK 0x0022 -#define FAPI_REASONCODE_QOS_TXOP_LIMIT_EXCEEDED 0x0023 -#define FAPI_REASONCODE_QSTA_LEAVING 0x0024 -#define FAPI_REASONCODE_END 0x0025 -#define FAPI_REASONCODE_UNKNOWN 0x0026 -#define FAPI_REASONCODE_TIMEOUT 0x0027 -#define FAPI_REASONCODE_KEEP_ALIVE_FAILURE 0x0028 -#define FAPI_REASONCODE_START 0x0029 -#define FAPI_REASONCODE_DEAUTHENTICATED_REASON_INVALID_PMKID 0x0031 -#define FAPI_REASONCODE_INVALID_PMKID 0x0049 -#define FAPI_REASONCODE_SYNCHRONISATION_LOSS 0x8003 -#define FAPI_REASONCODE_SECURITY_REQUIRED 0x8004 -#define FAPI_REASONCODE_ROAMING_FAILURE_LINK_LOSS_NO_CANDIDATE 0x8005 -#define FAPI_REASONCODE_HOTSPOT_MAX_CLIENT_REACHED 0x8006 -#define FAPI_REASONCODE_CHANNEL_SWITCH_FAILURE 0x8007 -#define FAPI_REASONCODE_REPORTING_ABORTED_SCANNING 0x8008 -#define FAPI_REASONCODE_REPORTING_ABORTED_ROAMING 0x8009 -#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_TIMEOUT 0x9001 -#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_USER_REQUEST 0x9002 -#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_COUNT_REACHED 0x9003 -#define FAPI_REASONCODE_NAN_SERVICE_TERMINATED_DISCOVERY_SHUTDOWN 0x9004 -#define FAPI_REASONCODE_NAN_TRANSMIT_FOLLOWUP_SUCCESS 0x9006 -#define FAPI_REASONCODE_NAN_TRANSMIT_FOLLOWUP_FAILURE 0x9007 -#define FAPI_REASONCODE_NDP_ACCEPTED 0x9008 -#define FAPI_REASONCODE_NDP_REJECTED 0x9009 - -#define FAPI_REPORTMODE_RESERVED 0x0001 +#define FAPI_REPORTMODE_BUFFER_FULL 0x0001 #define FAPI_REPORTMODE_END_OF_SCAN_CYCLE 0x0002 #define FAPI_REPORTMODE_REAL_TIME 0x0004 #define FAPI_REPORTMODE_NO_BATCH 0x0008 +#define FAPI_REQUESTTYPE_SMAPPER_RX_CONFIG 0x0000 + #define FAPI_RESULTCODE_SUCCESS 0x0000 #define FAPI_RESULTCODE_UNSPECIFIED_FAILURE 0x0001 #define FAPI_RESULTCODE_INVALID_PARAMETERS 0x0026 @@ -1022,14 +555,17 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RESULTCODE_NOT_ALLOWED 0x0030 #define FAPI_RESULTCODE_NOT_PRESENT 0x0031 #define FAPI_RESULTCODE_TRANSMISSION_FAILURE 0x004f +#define FAPI_RESULTCODE_TIMEOUT 0x8000 #define FAPI_RESULTCODE_TOO_MANY_SIMULTANEOUS_REQUESTS 0x8001 #define FAPI_RESULTCODE_BSS_ALREADY_STARTED_OR_JOINED 0x8002 #define FAPI_RESULTCODE_NOT_SUPPORTED 0x8003 #define FAPI_RESULTCODE_INVALID_STATE 0x8004 #define FAPI_RESULTCODE_INSUFFICIENT_RESOURCE 0x8006 +#define FAPI_RESULTCODE_MISSING_INFORMATION_ELEMENT 0x8007 #define FAPI_RESULTCODE_INVALID_VIRTUAL_INTERFACE_INDEX 0x800a #define FAPI_RESULTCODE_HOST_REQUEST_SUCCESS 0x800b #define FAPI_RESULTCODE_HOST_REQUEST_FAILED 0x800c +#define FAPI_RESULTCODE_COMEBACK_TIME_RUNNING 0x800d #define FAPI_RESULTCODE_INVALID_FREQUENCY 0x800e #define FAPI_RESULTCODE_PROBE_TIMEOUT 0x800f #define FAPI_RESULTCODE_AUTH_TIMEOUT 0x8010 @@ -1037,22 +573,10 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RESULTCODE_ASSOC_ABORT 0x8012 #define FAPI_RESULTCODE_AUTH_NO_ACK 0x8013 #define FAPI_RESULTCODE_ASSOC_NO_ACK 0x8014 -#define FAPI_RESULTCODE_AUTH_FAILED_CODE 0x8100 -#define FAPI_RESULTCODE_ASSOC_FAILED_CODE 0x8200 #define FAPI_RESULTCODE_INVALID_TLV_VALUE 0x9000 #define FAPI_RESULTCODE_NAN_PROTOCOL_FAILURE 0x9001 -#define FAPI_RESULTCODE_NAN_INVALID_SESSION_ID 0x9002 +#define FAPI_RESULTCODE_NAN_INVALID_PUBLISH_SUBSCRIBE_ID 0x9002 #define FAPI_RESULTCODE_NAN_INVALID_REQUESTOR_INSTANCE_ID 0x9003 -#define FAPI_RESULTCODE_UNSUPPORTED_CONCURRENCY 0x9004 -#define FAPI_RESULTCODE_NAN_INVALID_NDP_ID 0x9005 -#define FAPI_RESULTCODE_NAN_INVALID_MATCH_ID 0x9006 -#define FAPI_RESULTCODE_NAN_NO_OTA_ACK 0x9007 -#define FAPI_RESULTCODE_NAN_INVALID_AVAILABILITY 0x9008 -#define FAPI_RESULTCODE_NAN_IMMUTABLE_UNACCEPTABLE 0x9009 -#define FAPI_RESULTCODE_NAN_REJECTED_SECURITY_POLICY 0x900a -#define FAPI_RESULTCODE_NDP_REJECTED 0x900b -#define FAPI_RESULTCODE_NDL_UNACCEPTABLE 0x900c -#define FAPI_RESULTCODE_NDL_FAILED_SCHEDULE 0x900d #define FAPI_ROAMINGTYPE_LEGACY 0x0000 #define FAPI_ROAMINGTYPE_NCHO 0x0001 @@ -1062,6 +586,13 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RTTBANDWIDTH_80MHZ 0x0010 #define FAPI_RTTBANDWIDTH_160MHZ 0x0020 +#define FAPI_RTTPEERTYPE_UNKNOWN 0x0000 +#define FAPI_RTTPEERTYPE_AP 0x0001 +#define FAPI_RTTPEERTYPE_STA 0x0002 +#define FAPI_RTTPEERTYPE_P2P_GO 0x0003 +#define FAPI_RTTPEERTYPE_P2P_CLIENT 0x0004 +#define FAPI_RTTPEERTYPE_NAN_DEVICE 0x0005 + #define FAPI_RTTPREAMBLE_LEGACY 0x0001 #define FAPI_RTTPREAMBLE_HT 0x0002 #define FAPI_RTTPREAMBLE_VHT 0x0004 @@ -1074,7 +605,7 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RTTSTATUS_FAIL_TIMEOUT 0x0005 #define FAPI_RTTSTATUS_FAIL_INCORRECT_CHANNEL 0x0006 #define FAPI_RTTSTATUS_FAIL_FTM_NOT_SUPPORTED 0x0007 -#define FAPI_RTTSTATUS_FAIL_MEASUREMENT_ABORTED 0x0008 +#define FAPI_RTTSTATUS_MEASUREMENT_ABORTED 0x0008 #define FAPI_RTTSTATUS_FAIL_INVALID_TIME_STAMP 0x0009 #define FAPI_RTTSTATUS_FAIL_NO_FTM_RECEIVED 0x000a #define FAPI_RTTSTATUS_FAIL_BURST_NOT_SCHEDULED 0x000b @@ -1082,23 +613,15 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_RTTSTATUS_FAIL_INVALID_REQUEST 0x000d #define FAPI_RTTSTATUS_FAIL_FTM_PARAMETER_OVERRIDE 0x000f -#define FAPI_RTTTYPE_ONE_SIDED 0x0001 -#define FAPI_RTTTYPE_TWO_SIDED 0x0002 +#define FAPI_RTTTYPE_ONE_SIDED 0x0000 +#define FAPI_RTTTYPE_TWO_SIDED 0x0001 -#define FAPI_RULEFLAG_NO_IR 0x0001 -#define FAPI_RULEFLAG_DFS 0x0002 -#define FAPI_RULEFLAG_NO_OFDM 0x0004 -#define FAPI_RULEFLAG_NO_INDOOR 0x0008 -#define FAPI_RULEFLAG_NO_OUTDOOR 0x0010 - -#define FAPI_RXSTARTFLAGS_NONE 0x0000 -#define FAPI_RXSTARTFLAGS_SCAN_CHANNEL 0x0001 -#define FAPI_RXSTARTFLAGS_FILTERING 0x0002 -#define FAPI_RXSTARTFLAGS_BEAMFORMING 0x0004 -#define FAPI_RXSTARTFLAGS_ACK 0x0008 -#define FAPI_RXSTARTFLAGS_LP_MODE 0x0010 -#define FAPI_RXSTARTFLAGS_CHAN_RSSI 0x0020 -#define FAPI_RXSTARTFLAGS_DISABLE_EXTERNAL_LNA 0x0040 +#define FAPI_RXSTARTFLAGS_NONE 0x0000 +#define FAPI_RXSTARTFLAGS_SCAN_CHANNEL 0x0001 +#define FAPI_RXSTARTFLAGS_FILTERING 0x0002 +#define FAPI_RXSTARTFLAGS_PERIODIC 0x0004 +#define FAPI_RXSTARTFLAGS_ACK 0x0008 +#define FAPI_RXSTARTFLAGS_LP_MODE 0x0010 #define FAPI_SCANPOLICY_PASSIVE 0x01 #define FAPI_SCANPOLICY_TEST_MODE 0x02 @@ -1109,23 +632,24 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_SCANPOLICY_DFS 0x40 #define FAPI_SCANPOLICY_ON_CHANNEL 0x80 -#define FAPI_SCANTYPE_INITIAL_SCAN 0x0001 -#define FAPI_SCANTYPE_FULL_SCAN 0x0002 -#define FAPI_SCANTYPE_SCHEDULED_SCAN 0x0003 -#define FAPI_SCANTYPE_P2P_SCAN_FULL 0x0004 -#define FAPI_SCANTYPE_P2P_SCAN_SOCIAL 0x0005 -#define FAPI_SCANTYPE_OBSS_SCAN 0x0006 -#define FAPI_SCANTYPE_AP_AUTO_CHANNEL_SELECTION 0x0007 -#define FAPI_SCANTYPE_GSCAN 0x0009 -#define FAPI_SCANTYPE_MEASUREMENT_SCAN 0x000a -#define FAPI_SCANTYPE_SOFT_CACHED_ROAMING_SCAN 0x000b -#define FAPI_SCANTYPE_SOFT_ALL_ROAMING_SCAN 0x000c -#define FAPI_SCANTYPE_HARD_CACHED_ROAMING_SCAN 0x000d -#define FAPI_SCANTYPE_HARD_ALL_ROAMING_SCAN 0x000e -#define FAPI_SCANTYPE_OBSS_SCAN_INTERNAL 0x000f -#define FAPI_SCANTYPE_NAN_SCAN 0x0010 -#define FAPI_SCANTYPE_FTM_NEIGHBOUR_SCAN 0x0011 -#define FAPI_SCANTYPE_FIRST_ILLEGAL 0x0012 +#define FAPI_SCANTYPE_INITIAL_SCAN 0x0001 +#define FAPI_SCANTYPE_FULL_SCAN 0x0002 +#define FAPI_SCANTYPE_SCHEDULED_SCAN 0x0003 +#define FAPI_SCANTYPE_P2P_SCAN_FULL 0x0004 +#define FAPI_SCANTYPE_P2P_SCAN_SOCIAL 0x0005 +#define FAPI_SCANTYPE_OBSS_SCAN 0x0006 +#define FAPI_SCANTYPE_AP_AUTO_CHANNEL_SELECTION 0x0007 +#define FAPI_SCANTYPE_GSCAN 0x0009 +#define FAPI_SCANTYPE_MEASUREMENT_SCAN 0x000a +#define FAPI_SCANTYPE_SOFT_NEIGHBOUR_ROAMING_SCAN 0x000b +#define FAPI_SCANTYPE_SOFT_CACHED_ROAMING_SCAN 0x000c +#define FAPI_SCANTYPE_SOFT_ALL_ROAMING_SCAN 0x000d +#define FAPI_SCANTYPE_HARD_NEIGHBOUR_ROAMING_SCAN 0x000e +#define FAPI_SCANTYPE_HARD_CACHED_ROAMING_SCAN 0x000f +#define FAPI_SCANTYPE_HARD_ALL_ROAMING_SCAN 0x0010 +#define FAPI_SCANTYPE_OBSS_SCAN_INTERNAL 0x0011 +#define FAPI_SCANTYPE_NAN_SCAN 0x0012 +#define FAPI_SCANTYPE_FIRST_ILLEGAL 0x0013 #define FAPI_STATSSTOPBITMAP_STATS_RADIO 0x0001 #define FAPI_STATSSTOPBITMAP_STATS_RADIO_CCA 0x0002 @@ -1136,9 +660,10 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_STATSSTOPBITMAP_STATS_IFACE_AC 0x0040 #define FAPI_STATSSTOPBITMAP_STATS_IFACE_CONTENSION 0x0080 -#define FAPI_TDLSACTION_DISCOVERY 0x0000 -#define FAPI_TDLSACTION_SETUP 0x0001 -#define FAPI_TDLSACTION_TEARDOWN 0x0002 +#define FAPI_TDLSACTION_DISCOVERY 0x0000 +#define FAPI_TDLSACTION_SETUP 0x0001 +#define FAPI_TDLSACTION_TEARDOWN 0x0002 +#define FAPI_TDLSACTION_CHANNEL_SWITCH 0x0003 #define FAPI_TDLSEVENT_CONNECTED 0x0001 #define FAPI_TDLSEVENT_DISCONNECTED 0x0002 @@ -1159,23 +684,20 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_TXREADFLAGS_FRAME_COUNTING 0x0001 #define FAPI_TXREADFLAGS_THERMAL_CUTOUT 0x0002 -#define FAPI_TXSETPARAMSFLAGS_NONE 0x0000 -#define FAPI_TXSETPARAMSFLAGS_ACK 0x0001 -#define FAPI_TXSETPARAMSFLAGS_DUPLICATE_80 0x0002 -#define FAPI_TXSETPARAMSFLAGS_DUPLICATE_40 0x0004 -#define FAPI_TXSETPARAMSFLAGS_DEAFEN_RX 0x0008 -#define FAPI_TXSETPARAMSFLAGS_CS 0x0010 -#define FAPI_TXSETPARAMSFLAGS_SCAN_CHANNEL 0x0020 -#define FAPI_TXSETPARAMSFLAGS_SHORT_PREAMBLE 0x0040 -#define FAPI_TXSETPARAMSFLAGS_DISABLE_SCRAMBLER 0x0080 -#define FAPI_TXSETPARAMSFLAGS_LDPC 0x0100 -#define FAPI_TXSETPARAMSFLAGS_STBC 0x0200 -#define FAPI_TXSETPARAMSFLAGS_DISABLE_SPREADER 0x0400 -#define FAPI_TXSETPARAMSFLAGS_GREENFIELD_PREAMBLE 0x0800 -#define FAPI_TXSETPARAMSFLAGS_RX_LOW_POWER 0x1000 -#define FAPI_TXSETPARAMSFLAGS_IBSS_FRAMES 0x2000 -#define FAPI_TXSETPARAMSFLAGS_BEAMFORMING 0x4000 -#define FAPI_TXSETPARAMSFLAGS_DISABLE_EXTERNAL_LNA 0x8000 +#define FAPI_TXSETPARAMSFLAGS_NONE 0x0000 +#define FAPI_TXSETPARAMSFLAGS_ACK 0x0001 +#define FAPI_TXSETPARAMSFLAGS_DUPLICATE_80 0x0002 +#define FAPI_TXSETPARAMSFLAGS_DUPLICATE_40 0x0004 +#define FAPI_TXSETPARAMSFLAGS_THERMAL_DUTY_CYCLE 0x0008 +#define FAPI_TXSETPARAMSFLAGS_CS 0x0010 +#define FAPI_TXSETPARAMSFLAGS_SCAN_CHANNEL 0x0020 +#define FAPI_TXSETPARAMSFLAGS_SHORT_PREAMBLE 0x0040 +#define FAPI_TXSETPARAMSFLAGS_DISABLE_SCRAMBLER 0x0080 +#define FAPI_TXSETPARAMSFLAGS_LDPC 0x0100 +#define FAPI_TXSETPARAMSFLAGS_DISABLE_SPREADER 0x0400 +#define FAPI_TXSETPARAMSFLAGS_GREENFIELD_PREAMBLE 0x0800 +#define FAPI_TXSETPARAMSFLAGS_RX_LOW_POWER 0x1000 +#define FAPI_TXSETPARAMSFLAGS_IBSS_FRAMES 0x2000 #define FAPI_TYPEOFAIRPOWER_EIRP 0x00 #define FAPI_TYPEOFAIRPOWER_TPO 0x01 @@ -1184,86 +706,61 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define FAPI_USAGE_NO_USE 0x0 #define FAPI_USAGE_USE 0x1 -#define FAPI_VIFRANGE_VIF_INDEX_MIN 0x0001 -#define FAPI_VIFRANGE_VIF_INDEX_MAX 0x000f - #define FAPI_VIFTYPE_UNSYNCHRONISED 0x0000 #define FAPI_VIFTYPE_STATION 0x0002 #define FAPI_VIFTYPE_AP 0x0003 #define FAPI_VIFTYPE_WLANLITE 0x0004 #define FAPI_VIFTYPE_NAN 0x0005 -#define FAPI_VIFTYPE_DISCOVERY 0x0006 -#define FAPI_VIFTYPE_PRECONNECT 0x0007 -#define FAPI_VIFTYPE_MONITOR 0x0010 -#define FAPI_VIFTYPE_SCAN 0x0020 -#define FAPI_VIFTYPE_OFFCHANNEL 0x0021 -#define FAPI_VIFTYPE_RANGE 0x0022 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P0 0x0000 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P1 0x0001 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P2 0x0002 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P3 0x0003 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P4 0x0004 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P5 0x0005 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P6 0x0006 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P7 0x0007 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0008 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P0 0x0100 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P1 0x0101 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P2 0x0102 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P3 0x0103 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P4 0x0104 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P5 0x0105 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P6 0x0106 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P7 0x0107 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0108 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P0 0x0200 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P1 0x0201 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P2 0x0202 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P3 0x0203 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P4 0x0204 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P5 0x0205 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P6 0x0206 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P7 0x0207 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0208 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P0 0x0300 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P1 0x0301 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P2 0x0302 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P3 0x0303 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P4 0x0304 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P5 0x0305 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P6 0x0306 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_P7 0x0307 -#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_160MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0308 +#define FAPI_WIPSACTION_STOP 0x0000 +#define FAPI_WIPSACTION_START 0x0001 + +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P0 0x0000 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P1 0x0001 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P2 0x0002 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P3 0x0003 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P4 0x0004 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P5 0x0005 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P6 0x0006 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_P7 0x0007 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_20MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0008 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P0 0x0100 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P1 0x0101 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P2 0x0102 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P3 0x0103 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P4 0x0104 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P5 0x0105 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P6 0x0106 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_P7 0x0107 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_40MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0108 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P0 0x0200 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P1 0x0201 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P2 0x0202 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P3 0x0203 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P4 0x0204 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P5 0x0205 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P6 0x0206 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_P7 0x0207 +#define FAPI_CHANNELBANDWIDTH_BANDWIDTH_80MHZ_PRIMARYCHANNELPOSITION_NOT_APPLICABLE 0x0208 #define MA_UNITDATA_REQ 0x1000 -#define MA_SPARE_1_REQ 0x1002 -#define MA_SPARE_2_REQ 0x1003 -#define MA_SPARE_3_REQ 0x1004 -#define MA_SPARE_SIGNAL_1_REQ 0x1005 -#define MA_SPARE_SIGNAL_2_REQ 0x1006 -#define MA_SPARE_SIGNAL_3_REQ 0x1007 +#define MA_CONTROL_REQ 0x1001 +#define MA_SPARE_SIGNAL_1_REQ 0x1002 +#define MA_SPARE_SIGNAL_2_REQ 0x1003 +#define MA_SPARE_SIGNAL_3_REQ 0x1004 #define MA_UNITDATA_CFM 0x1100 -#define MA_SPARE_1_CFM 0x1102 -#define MA_SPARE_2_CFM 0x1103 -#define MA_SPARE_3_CFM 0x1104 -#define MA_SPARE_SIGNAL_1_CFM 0x1105 -#define MA_SPARE_SIGNAL_2_CFM 0x1106 -#define MA_SPARE_SIGNAL_3_CFM 0x1107 -#define MA_SPARE_1_RES 0x1200 -#define MA_SPARE_2_RES 0x1201 -#define MA_SPARE_3_RES 0x1202 -#define MA_SPARE_SIGNAL_1_RES 0x1203 -#define MA_SPARE_SIGNAL_2_RES 0x1204 -#define MA_SPARE_SIGNAL_3_RES 0x1205 +#define MA_CONTROL_CFM 0x1101 +#define MA_SPARE_SIGNAL_1_CFM 0x1102 +#define MA_SPARE_SIGNAL_2_CFM 0x1103 +#define MA_SPARE_SIGNAL_3_CFM 0x1104 +#define MA_SPARE_SIGNAL_1_RES 0x1200 +#define MA_SPARE_SIGNAL_2_RES 0x1201 +#define MA_SPARE_SIGNAL_3_RES 0x1202 #define MA_UNITDATA_IND 0x1300 #define MA_BLOCKACK_IND 0x1301 -#define MA_SPARE_1_IND 0x1302 -#define MA_SPARE_2_IND 0x1303 -#define MA_SPARE_3_IND 0x1304 -#define MA_SPARE_SIGNAL_1_IND 0x1305 -#define MA_SPARE_SIGNAL_2_IND 0x1306 -#define MA_SPARE_SIGNAL_3_IND 0x1307 +#define MA_SPARE_SIGNAL_1_IND 0x1302 +#define MA_SPARE_SIGNAL_2_IND 0x1303 +#define MA_SPARE_SIGNAL_3_IND 0x1304 #define MLME_GET_REQ 0x2001 #define MLME_SET_REQ 0x2002 #define MLME_POWERMGT_REQ 0x2003 @@ -1296,6 +793,7 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_MONITOR_RSSI_REQ 0x2023 #define MLME_START_LINK_STATISTICS_REQ 0x2024 #define MLME_STOP_LINK_STATISTICS_REQ 0x2025 +#define MLME_SET_BSSID_HOTLIST_REQ 0x2026 #define MLME_SET_PNO_LIST_REQ 0x2027 #define MLME_HOST_STATE_REQ 0x2028 #define MLME_ADD_RANGE_REQ 0x2029 @@ -1307,24 +805,13 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_NAN_PUBLISH_REQ 0x202f #define MLME_NAN_SUBSCRIBE_REQ 0x2030 #define MLME_NAN_FOLLOWUP_REQ 0x2031 -#define MLME_UNSET_CHANNEL_REQ 0x2032 -#define MLME_SET_COUNTRY_REQ 0x2033 #define MLME_FORWARD_BEACON_REQ 0x2034 -#define MLME_NDP_REQUEST_REQ 0x2035 -#define MLME_NDP_RESPONSE_REQ 0x2036 -#define MLME_NDP_TERMINATE_REQ 0x2037 -#define MLME_SPARE_4_REQ 0x203a -#define MLME_SPARE_5_REQ 0x203b -#define MLME_SPARE_6_REQ 0x203c -#define MLME_INSTALL_APF_REQ 0x203d -#define MLME_READ_APF_REQ 0x203e -#define MLME_SET_NUM_ANTENNAS_REQ 0x203f -#define MLME_ARP_DETECT_REQ 0x2040 #define MLME_SET_ROAMING_TYPE_REQ 0x2041 #define MLME_SET_BAND_REQ 0x2042 -#define MLME_SPARE_SIGNAL_1_REQ 0x2043 -#define MLME_SPARE_SIGNAL_2_REQ 0x2044 -#define MLME_SPARE_SIGNAL_3_REQ 0x2045 +#define MLME_SET_ROAMING_PARAMETERS_REQ 0x2043 +#define MLME_SPARE_SIGNAL_1_REQ 0x2044 +#define MLME_SPARE_SIGNAL_2_REQ 0x2045 +#define MLME_SPARE_SIGNAL_3_REQ 0x2046 #define MLME_GET_CFM 0x2101 #define MLME_SET_CFM 0x2102 #define MLME_POWERMGT_CFM 0x2103 @@ -1357,6 +844,7 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_MONITOR_RSSI_CFM 0x2123 #define MLME_START_LINK_STATISTICS_CFM 0x2124 #define MLME_STOP_LINK_STATISTICS_CFM 0x2125 +#define MLME_SET_BSSID_HOTLIST_CFM 0x2126 #define MLME_SET_PNO_LIST_CFM 0x2127 #define MLME_HOST_STATE_CFM 0x2128 #define MLME_ADD_RANGE_CFM 0x2129 @@ -1368,36 +856,21 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_NAN_PUBLISH_CFM 0x212f #define MLME_NAN_SUBSCRIBE_CFM 0x2130 #define MLME_NAN_FOLLOWUP_CFM 0x2131 -#define MLME_UNSET_CHANNEL_CFM 0x2132 -#define MLME_SET_COUNTRY_CFM 0x2133 #define MLME_FORWARD_BEACON_CFM 0x2134 -#define MLME_NDP_REQUEST_CFM 0x2135 -#define MLME_NDP_RESPONSE_CFM 0x2136 -#define MLME_NDP_TERMINATE_CFM 0x2137 -#define MLME_SPARE_4_CFM 0x213a -#define MLME_SPARE_5_CFM 0x213b -#define MLME_SPARE_6_CFM 0x213c -#define MLME_INSTALL_APF_CFM 0x213d -#define MLME_READ_APF_CFM 0x213e -#define MLME_SET_NUM_ANTENNAS_CFM 0x213f -#define MLME_ARP_DETECT_CFM 0x2140 #define MLME_SET_ROAMING_TYPE_CFM 0x2141 #define MLME_SET_BAND_CFM 0x2142 -#define MLME_SPARE_SIGNAL_1_CFM 0x2143 -#define MLME_SPARE_SIGNAL_2_CFM 0x2144 -#define MLME_SPARE_SIGNAL_3_CFM 0x2145 +#define MLME_SET_ROAMING_PARAMETERS_CFM 0x2143 +#define MLME_SPARE_SIGNAL_1_CFM 0x2144 +#define MLME_SPARE_SIGNAL_2_CFM 0x2145 +#define MLME_SPARE_SIGNAL_3_CFM 0x2146 #define MLME_CONNECT_RES 0x2200 #define MLME_CONNECTED_RES 0x2201 #define MLME_REASSOCIATE_RES 0x2202 #define MLME_ROAMED_RES 0x2203 #define MLME_TDLS_PEER_RES 0x2204 -#define MLME_SYNCHRONISED_RES 0x2205 -#define MLME_SPARE_2_RES 0x2206 -#define MLME_SPARE_3_RES 0x2207 -#define MLME_SPARE_4_RES 0x2208 -#define MLME_SPARE_SIGNAL_1_RES 0x2209 -#define MLME_SPARE_SIGNAL_2_RES 0x220a -#define MLME_SPARE_SIGNAL_3_RES 0x220b +#define MLME_SPARE_SIGNAL_1_RES 0x2205 +#define MLME_SPARE_SIGNAL_2_RES 0x2206 +#define MLME_SPARE_SIGNAL_3_RES 0x2207 #define MLME_SCAN_IND 0x2300 #define MLME_SCAN_DONE_IND 0x2301 #define MLME_LISTEN_END_IND 0x2302 @@ -1413,6 +886,8 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_FRAME_TRANSMISSION_IND 0x230c #define MLME_RECEIVED_FRAME_IND 0x230d #define MLME_TDLS_PEER_IND 0x230f +#define MLME_AP_LOSS_IND 0x2310 +#define MLME_SIGNIFICANT_CHANGE_IND 0x2311 #define MLME_RSSI_REPORT_IND 0x2312 #define MLME_AC_PRIORITY_UPDATE_IND 0x2313 #define MLME_RANGE_IND 0x2314 @@ -1422,46 +897,24 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define MLME_NAN_SERVICE_IND 0x2318 #define MLME_NAN_FOLLOWUP_IND 0x2319 #define MLME_CHANNEL_SWITCHED_IND 0x231a -#define MLME_SYNCHRONISED_IND 0x231b #define MLME_BEACON_REPORTING_EVENT_IND 0x231c -#define MLME_SPARE_3_IND 0x231d -#define MLME_SPARE_4_IND 0x231e -#define MLME_NDP_REQUEST_IND 0x231f -#define MLME_NDP_REQUESTED_IND 0x2320 -#define MLME_NDP_RESPONSE_IND 0x2321 -#define MLME_NDP_TERMINATE_IND 0x2322 -#define MLME_NDP_TERMINATED_IND 0x2323 -#define MLME_SPARE_5_IND 0x2324 -#define MLME_SPARE_SIGNAL_1_IND 0x2325 -#define MLME_SPARE_SIGNAL_2_IND 0x2326 -#define MLME_SPARE_SIGNAL_3_IND 0x2327 -#define DEBUG_SPARE_1_REQ 0x8000 -#define DEBUG_SPARE_2_REQ 0x8001 -#define DEBUG_SPARE_3_REQ 0x8002 -#define DEBUG_SPARE_SIGNAL_1_REQ 0x8003 -#define DEBUG_SPARE_SIGNAL_2_REQ 0x8004 -#define DEBUG_SPARE_SIGNAL_3_REQ 0x8005 -#define DEBUG_SPARE_1_CFM 0x8100 -#define DEBUG_SPARE_2_CFM 0x8101 -#define DEBUG_SPARE_3_CFM 0x8102 -#define DEBUG_SPARE_SIGNAL_1_CFM 0x8103 -#define DEBUG_SPARE_SIGNAL_2_CFM 0x8104 -#define DEBUG_SPARE_SIGNAL_3_CFM 0x8105 -#define DEBUG_SPARE_1_RES 0x8200 -#define DEBUG_SPARE_2_RES 0x8201 -#define DEBUG_SPARE_3_RES 0x8202 -#define DEBUG_SPARE_SIGNAL_1_RES 0x8203 -#define DEBUG_SPARE_SIGNAL_2_RES 0x8204 -#define DEBUG_SPARE_SIGNAL_3_RES 0x8205 +#define MLME_SPARE_SIGNAL_1_IND 0x231d +#define MLME_SPARE_SIGNAL_2_IND 0x231e +#define MLME_SPARE_SIGNAL_3_IND 0x231f +#define DEBUG_SPARE_SIGNAL_1_REQ 0x8000 +#define DEBUG_SPARE_SIGNAL_2_REQ 0x8001 +#define DEBUG_SPARE_SIGNAL_3_REQ 0x8002 +#define DEBUG_SPARE_SIGNAL_1_CFM 0x8100 +#define DEBUG_SPARE_SIGNAL_2_CFM 0x8101 +#define DEBUG_SPARE_SIGNAL_3_CFM 0x8102 +#define DEBUG_SPARE_SIGNAL_1_RES 0x8200 +#define DEBUG_SPARE_SIGNAL_2_RES 0x8201 +#define DEBUG_SPARE_SIGNAL_3_RES 0x8202 #define DEBUG_WORD12IND 0x8301 #define DEBUG_FAULT_IND 0x8302 -#define DEBUG_WORDS_IND 0x8303 -#define DEBUG_SPARE_2_IND 0x8304 -#define DEBUG_SPARE_3_IND 0x8305 -#define DEBUG_SPARE_4_IND 0x8306 -#define DEBUG_SPARE_SIGNAL_1_IND 0x8307 -#define DEBUG_SPARE_SIGNAL_2_IND 0x8308 -#define DEBUG_SPARE_SIGNAL_3_IND 0x8309 +#define DEBUG_SPARE_SIGNAL_1_IND 0x8303 +#define DEBUG_SPARE_SIGNAL_2_IND 0x8304 +#define DEBUG_SPARE_SIGNAL_3_IND 0x8305 #define TEST_BLOCK_REQUESTS_REQ 0x9000 #define TEST_PANIC_REQ 0x9001 #define TEST_SUSPEND_REQ 0x9002 @@ -1478,7 +931,8 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define WLANLITE_RX_STOP_REQ 0x900d #define WLANLITE_STATUS_REQ 0x900e #define TEST_PMALLOC_REQ 0x900f -#define TEST_CONFIGURE_MONITOR_MODE_REQ 0x9010 +#define TEST_SA_QUERY_REQ 0x9010 +#define TEST_CHANNEL_SWITCH_REQ 0x9011 #define TEST_CHECK_FW_ALIVE_REQ 0x9012 #define DEBUG_GENERIC_REQ 0x9013 #define DEBUG_PKT_SINK_START_REQ 0x9014 @@ -1493,12 +947,9 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define TEST_HIP_TESTER_SET_PARAMS_REQ 0x901d #define TEST_HIP_TESTER_REPORT_REQ 0x901e #define TEST_BIST_GET_TX_GAIN_REQ 0x901f -#define TEST_SPARE_1_REQ 0x9020 -#define TEST_SPARE_2_REQ 0x9021 -#define TEST_SPARE_3_REQ 0x9022 -#define TEST_SPARE_SIGNAL_1_REQ 0x9023 -#define TEST_SPARE_SIGNAL_2_REQ 0x9024 -#define TEST_SPARE_SIGNAL_3_REQ 0x9025 +#define TEST_SPARE_SIGNAL_1_REQ 0x9020 +#define TEST_SPARE_SIGNAL_2_REQ 0x9021 +#define TEST_SPARE_SIGNAL_3_REQ 0x9022 #define RADIO_LOGGING_CFM 0x9100 #define WLANLITE_CW_START_CFM 0x9101 #define WLANLITE_TX_SET_PARAMS_CFM 0x9102 @@ -1511,7 +962,8 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define WLANLITE_RX_STOP_CFM 0x9109 #define WLANLITE_STATUS_CFM 0x910a #define TEST_PMALLOC_CFM 0x910b -#define TEST_CONFIGURE_MONITOR_MODE_CFM 0x910c +#define TEST_SA_QUERY_CFM 0x910c +#define TEST_CHANNEL_SWITCH_CFM 0x910d #define TEST_CHECK_FW_ALIVE_CFM 0x910e #define TEST_SUSPEND_CFM 0x910f #define TEST_RESUME_CFM 0x9110 @@ -1521,29 +973,20 @@ static inline struct slsi_skb_cb *slsi_skb_cb_init(struct sk_buff *skb) #define TEST_HIP_TESTER_STOP_CFM 0x9114 #define TEST_HIP_TESTER_SET_PARAMS_CFM 0x9115 #define TEST_BIST_GET_TX_GAIN_CFM 0x9116 -#define TEST_SPARE_1_CFM 0x9117 -#define TEST_SPARE_2_CFM 0x9118 -#define TEST_SPARE_3_CFM 0x9119 -#define TEST_SPARE_SIGNAL_1_CFM 0x911a -#define TEST_SPARE_SIGNAL_2_CFM 0x911b -#define TEST_SPARE_SIGNAL_3_CFM 0x911c -#define TEST_SPARE_1_RES 0x9200 -#define TEST_SPARE_2_RES 0x9201 -#define TEST_SPARE_3_RES 0x9202 -#define TEST_SPARE_SIGNAL_1_RES 0x9203 -#define TEST_SPARE_SIGNAL_2_RES 0x9204 -#define TEST_SPARE_SIGNAL_3_RES 0x9205 +#define TEST_SPARE_SIGNAL_1_CFM 0x9117 +#define TEST_SPARE_SIGNAL_2_CFM 0x9118 +#define TEST_SPARE_SIGNAL_3_CFM 0x9119 +#define TEST_SPARE_SIGNAL_1_RES 0x9200 +#define TEST_SPARE_SIGNAL_2_RES 0x9201 +#define TEST_SPARE_SIGNAL_3_RES 0x9202 #define RADIO_LOGGING_IND 0x9300 #define DEBUG_GENERIC_IND 0x9301 #define DEBUG_PKT_SINK_REPORT_IND 0x9302 #define DEBUG_PKT_GEN_REPORT_IND 0x9303 #define TEST_HIP_TESTER_REPORT_IND 0x9304 -#define TEST_SPARE_1_IND 0x9305 -#define TEST_SPARE_2_IND 0x9306 -#define TEST_SPARE_3_IND 0x9307 -#define TEST_SPARE_SIGNAL_1_IND 0x9308 -#define TEST_SPARE_SIGNAL_2_IND 0x9309 -#define TEST_SPARE_SIGNAL_3_IND 0x930a +#define TEST_SPARE_SIGNAL_1_IND 0x9305 +#define TEST_SPARE_SIGNAL_2_IND 0x9306 +#define TEST_SPARE_SIGNAL_3_IND 0x9307 struct fapi_signal_header { __le16 id; @@ -1581,25 +1024,12 @@ struct fapi_signal { } __packed ma_unitdata_req; struct { __le16 vif; + __le16 control_request_type; __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; - } __packed ma_spare_1_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_2_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_3_req; + } __packed ma_control_req; struct { __le16 vif; __le32 spare_1; @@ -1639,23 +1069,7 @@ struct fapi_signal { __le32 spare_2; __le32 spare_3; u8 dr[0]; - } __packed ma_spare_1_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_2_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_3_cfm; + } __packed ma_control_cfm; struct { __le16 vif; __le16 result_code; @@ -1680,27 +1094,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed ma_spare_signal_3_cfm; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_1_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_2_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_3_res; struct { __le16 vif; __le32 spare_1; @@ -1747,27 +1140,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed ma_blockack_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_1_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_2_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed ma_spare_3_ind; struct { __le16 vif; __le32 spare_1; @@ -2079,6 +1451,13 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_stop_link_statistics_req; + struct { + __le16 vif; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_set_bssid_hotlist_req; struct { __le16 vif; __le32 spare_1; @@ -2097,7 +1476,6 @@ struct fapi_signal { struct { __le16 vif; __le16 rtt_id; - u8 device_address[ETH_ALEN]; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -2133,6 +1511,8 @@ struct fapi_signal { } __packed mlme_set_ctwindow_req; struct { __le16 vif; + __le16 cluster_low; + __le16 cluster_high; __le16 nan_operation_control_flags; __le32 spare_1; __le32 spare_2; @@ -2149,7 +1529,7 @@ struct fapi_signal { } __packed mlme_nan_config_req; struct { __le16 vif; - __le16 session_id; + __le16 publish_id; __le16 nan_sdf_flags; __le32 spare_1; __le32 spare_2; @@ -2158,7 +1538,7 @@ struct fapi_signal { } __packed mlme_nan_publish_req; struct { __le16 vif; - __le16 session_id; + __le16 subscribe_id; __le16 nan_sdf_flags; __le32 spare_1; __le32 spare_2; @@ -2167,119 +1547,22 @@ struct fapi_signal { } __packed mlme_nan_subscribe_req; struct { __le16 vif; - __le16 session_id; - __le16 match_id; + __le16 publish_subscribe_id; + __le16 requestor_instance_id; __le16 nan_sdf_flags; __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; } __packed mlme_nan_followup_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_unset_channel_req; - struct { - __le16 vif; - __le16 country_code; - __le16 dfs_regulatory_domain; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_set_country_req; struct { __le16 vif; __le16 wips_action; - __le16 spare_1; + __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; } __packed mlme_forward_beacon_req; - struct { - __le16 vif; - __le16 ndl_vif_index; - __le16 match_id; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_request_req; - struct { - __le16 vif; - __le16 request_id; - __le16 ndl_vif_index; - __le16 reason_code; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_response_req; - struct { - __le16 vif; - __le16 ndl_vif_index; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_terminate_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_4_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_5_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_6_req; - struct { - __le16 vif; - __le16 filter_mode; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_install_apf_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_read_apf_req; - struct { - __le16 vif; - __le16 number_of_antennas; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_set_num_antennas_req; - struct { - __le16 vif; - __le16 arp_detect_action; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_arp_detect_req; struct { __le16 vif; __le16 roaming_type; @@ -2296,6 +1579,13 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_set_band_req; + struct { + __le16 vif; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_set_roaming_parameters_req; struct { __le16 vif; __le32 spare_1; @@ -2575,6 +1865,14 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_stop_link_statistics_cfm; + struct { + __le16 vif; + __le16 result_code; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_set_bssid_hotlist_cfm; struct { __le16 vif; __le16 result_code; @@ -2665,22 +1963,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_nan_followup_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_unset_channel_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_set_country_cfm; struct { __le16 vif; __le16 result_code; @@ -2689,86 +1971,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_forward_beacon_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_request_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_response_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_terminate_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_4_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_5_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_6_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_install_apf_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_read_apf_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_set_num_antennas_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_arp_detect_cfm; struct { __le16 vif; __le16 result_code; @@ -2785,6 +1987,14 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_set_band_cfm; + struct { + __le16 vif; + __le16 result_code; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_set_roaming_parameters_cfm; struct { __le16 vif; __le16 result_code; @@ -2818,7 +2028,7 @@ struct fapi_signal { } __packed mlme_connect_res; struct { __le16 vif; - __le16 association_identifier; + __le16 peer_index; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -2847,34 +2057,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_tdls_peer_res; - struct { - __le16 vif; - __le16 result_code; - u8 bssid[ETH_ALEN]; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_synchronised_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_2_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_3_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_4_res; struct { __le16 vif; __le32 spare_1; @@ -2935,7 +2117,7 @@ struct fapi_signal { } __packed mlme_connect_ind; struct { __le16 vif; - __le16 association_identifier; + __le16 peer_index; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -2985,7 +2167,7 @@ struct fapi_signal { struct { __le16 vif; __le16 procedure_type; - __le16 association_identifier; + __le16 peer_index; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -3031,6 +2213,23 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_tdls_peer_ind; + struct { + __le16 vif; + __le16 entries; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_ap_loss_ind; + struct { + __le16 vif; + __le16 number_of_results; + __le16 number_of_rssi_entries; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed mlme_significant_change_ind; struct { __le16 vif; u8 bssid[ETH_ALEN]; @@ -3087,10 +2286,8 @@ struct fapi_signal { } __packed mlme_nan_event_ind; struct { __le16 vif; - __le16 session_id; - __le16 match_id; - __le32 ranging_measurement; - __le16 rangingindicationtype; + __le16 publish_subscribe_id; + __le16 requestor_instance_id; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -3098,9 +2295,8 @@ struct fapi_signal { } __packed mlme_nan_service_ind; struct { __le16 vif; - __le16 session_id; - __le16 match_id; - u8 peer_nan_management_interface_address[ETH_ALEN]; + __le16 publish_subscribe_id; + __le16 requestor_instance_id; __le32 spare_1; __le32 spare_2; __le32 spare_3; @@ -3115,94 +2311,14 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_channel_switched_ind; - struct { - __le16 vif; - __le16 rssi; - __le16 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_synchronised_ind; struct { __le16 vif; __le16 abort_reason; - __le16 spare_1; + __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; } __packed mlme_beacon_reporting_event_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_3_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_4_ind; - struct { - __le16 vif; - __le16 ndl_vif_index; - u8 peer_ndp_interface_address[ETH_ALEN]; - __le16 result_code; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_request_ind; - struct { - __le16 vif; - __le16 session_id; - __le16 request_id; - u8 peer_nan_management_interface_address[ETH_ALEN]; - __le16 security_required; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_requested_ind; - struct { - __le16 vif; - __le16 ndl_vif_index; - u8 peer_ndp_interface_address[ETH_ALEN]; - __le16 result_code; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_response_ind; - struct { - __le16 vif; - __le16 ndl_vif_index; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_terminate_ind; - struct { - __le16 vif; - __le16 ndl_vif_index; - u8 local_ndp_interface_address[ETH_ALEN]; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_ndp_terminated_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed mlme_spare_5_ind; struct { __le16 vif; __le32 spare_1; @@ -3224,27 +2340,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed mlme_spare_signal_3_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_1_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_2_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_3_req; struct { __le16 vif; __le32 spare_1; @@ -3266,30 +2361,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed debug_spare_signal_3_req; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_1_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_2_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_3_cfm; struct { __le16 vif; __le16 result_code; @@ -3314,27 +2385,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed debug_spare_signal_3_cfm; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_1_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_2_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_3_res; struct { __le16 vif; __le32 spare_1; @@ -3381,38 +2431,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed debug_fault_ind; - struct { - __le16 vif; - __le16 module_id; - __le16 module_sub_id; - __le32 timestamp; - __le16 sequence_number; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_words_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_2_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_3_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed debug_spare_4_ind; struct { __le16 vif; __le32 spare_1; @@ -3465,7 +2483,6 @@ struct fapi_signal { struct { __le32 logging_source; __le32 logging_frequency; - __le32 capture_stream; __le32 trigger_mode; __le32 delay; __le32 buffer_size; @@ -3502,7 +2519,7 @@ struct fapi_signal { __le16 length; __le32 interval; __le16 flags; - __le16 aid; + __le16 channel_description_index; __le16 distance_to_band_edge_half_mhz; __le16 regulatory_domain; __le16 spare_0; @@ -3541,8 +2558,8 @@ struct fapi_signal { __le16 channel_information; __le16 flags; u8 mac_addr[ETH_ALEN]; - u8 bssid[ETH_ALEN]; - __le16 aid; + __le32 on_duration; + __le32 off_duration; __le16 num_mpdus_per_ampdu; __le32 spare_1; __le32 spare_2; @@ -3576,11 +2593,21 @@ struct fapi_signal { } __packed test_pmalloc_req; struct { __le16 vif; + __le16 sa_query_rsp_enabled; __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; - } __packed test_configure_monitor_mode_req; + } __packed test_sa_query_req; + struct { + __le16 vif; + __le16 channel_frequency; + __le16 count; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed test_channel_switch_req; struct { __le32 spare_1; __le32 spare_2; @@ -3713,27 +2740,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed test_bist_get_tx_gain_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_1_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_2_req; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_3_req; struct { __le16 vif; __le32 spare_1; @@ -3827,14 +2833,10 @@ struct fapi_signal { __le16 result_code; __le32 freq_offset_cur; __le32 freq_offset_avg; - __le16 rssi_cur; - __le16 rssi_avg; - __le16 rssi_min; - __le16 rssi_max; - __le16 snr_cur; - __le16 snr_avg; - __le16 snr_min; - __le16 snr_max; + __le32 rssi_cur; + __le32 rssi_avg; + __le32 snr_cur; + __le32 snr_avg; __le32 interval; __le32 spare_1; __le32 spare_2; @@ -3863,13 +2865,19 @@ struct fapi_signal { u8 dr[0]; } __packed test_pmalloc_cfm; struct { - __le16 vif; __le16 result_code; __le32 spare_1; __le32 spare_2; __le32 spare_3; u8 dr[0]; - } __packed test_configure_monitor_mode_cfm; + } __packed test_sa_query_cfm; + struct { + __le16 result_code; + __le32 spare_1; + __le32 spare_2; + __le32 spare_3; + u8 dr[0]; + } __packed test_channel_switch_cfm; struct { __le32 spare_1; __le32 spare_2; @@ -3947,30 +2955,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed test_bist_get_tx_gain_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_1_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_2_cfm; - struct { - __le16 vif; - __le16 result_code; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_3_cfm; struct { __le16 vif; __le16 result_code; @@ -3995,27 +2979,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed test_spare_signal_3_cfm; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_1_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_2_res; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_3_res; struct { __le16 vif; __le32 spare_1; @@ -4103,27 +3066,6 @@ struct fapi_signal { __le32 spare_3; u8 dr[0]; } __packed test_hip_tester_report_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_1_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_2_ind; - struct { - __le16 vif; - __le32 spare_1; - __le32 spare_2; - __le32 spare_3; - u8 dr[0]; - } __packed test_spare_3_ind; struct { __le16 vif; __le32 spare_1; @@ -4295,10 +3237,7 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) { static const u16 fapi_ma_req_size_table[] = { fapi_sig_size(ma_unitdata_req), - 0, - fapi_sig_size(ma_spare_1_req), - fapi_sig_size(ma_spare_2_req), - fapi_sig_size(ma_spare_3_req), + fapi_sig_size(ma_control_req), fapi_sig_size(ma_spare_signal_1_req), fapi_sig_size(ma_spare_signal_2_req), fapi_sig_size(ma_spare_signal_3_req), @@ -4342,7 +3281,7 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_monitor_rssi_req), fapi_sig_size(mlme_start_link_statistics_req), fapi_sig_size(mlme_stop_link_statistics_req), - 0, + fapi_sig_size(mlme_set_bssid_hotlist_req), fapi_sig_size(mlme_set_pno_list_req), fapi_sig_size(mlme_host_state_req), fapi_sig_size(mlme_add_range_req), @@ -4354,32 +3293,30 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_nan_publish_req), fapi_sig_size(mlme_nan_subscribe_req), fapi_sig_size(mlme_nan_followup_req), - fapi_sig_size(mlme_unset_channel_req), - fapi_sig_size(mlme_set_country_req), + 0, + 0, fapi_sig_size(mlme_forward_beacon_req), - fapi_sig_size(mlme_ndp_request_req), - fapi_sig_size(mlme_ndp_response_req), - fapi_sig_size(mlme_ndp_terminate_req), 0, 0, - fapi_sig_size(mlme_spare_4_req), - fapi_sig_size(mlme_spare_5_req), - fapi_sig_size(mlme_spare_6_req), - fapi_sig_size(mlme_install_apf_req), - fapi_sig_size(mlme_read_apf_req), - fapi_sig_size(mlme_set_num_antennas_req), - fapi_sig_size(mlme_arp_detect_req), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, fapi_sig_size(mlme_set_roaming_type_req), fapi_sig_size(mlme_set_band_req), + fapi_sig_size(mlme_set_roaming_parameters_req), fapi_sig_size(mlme_spare_signal_1_req), fapi_sig_size(mlme_spare_signal_2_req), fapi_sig_size(mlme_spare_signal_3_req), }; static const u16 fapi_debug_req_size_table[] = { - fapi_sig_size(debug_spare_1_req), - fapi_sig_size(debug_spare_2_req), - fapi_sig_size(debug_spare_3_req), fapi_sig_size(debug_spare_signal_1_req), fapi_sig_size(debug_spare_signal_2_req), fapi_sig_size(debug_spare_signal_3_req), @@ -4402,8 +3339,8 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(wlanlite_rx_stop_req), fapi_sig_size(wlanlite_status_req), fapi_sig_size(test_pmalloc_req), - fapi_sig_size(test_configure_monitor_mode_req), - 0, + fapi_sig_size(test_sa_query_req), + fapi_sig_size(test_channel_switch_req), fapi_sig_size(test_check_fw_alive_req), fapi_sig_size(debug_generic_req), fapi_sig_size(debug_pkt_sink_start_req), @@ -4418,9 +3355,6 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(test_hip_tester_set_params_req), fapi_sig_size(test_hip_tester_report_req), fapi_sig_size(test_bist_get_tx_gain_req), - fapi_sig_size(test_spare_1_req), - fapi_sig_size(test_spare_2_req), - fapi_sig_size(test_spare_3_req), fapi_sig_size(test_spare_signal_1_req), fapi_sig_size(test_spare_signal_2_req), fapi_sig_size(test_spare_signal_3_req), @@ -4428,10 +3362,7 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) static const u16 fapi_ma_cfm_size_table[] = { fapi_sig_size(ma_unitdata_cfm), - 0, - fapi_sig_size(ma_spare_1_cfm), - fapi_sig_size(ma_spare_2_cfm), - fapi_sig_size(ma_spare_3_cfm), + fapi_sig_size(ma_control_cfm), fapi_sig_size(ma_spare_signal_1_cfm), fapi_sig_size(ma_spare_signal_2_cfm), fapi_sig_size(ma_spare_signal_3_cfm), @@ -4475,7 +3406,7 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_monitor_rssi_cfm), fapi_sig_size(mlme_start_link_statistics_cfm), fapi_sig_size(mlme_stop_link_statistics_cfm), - 0, + fapi_sig_size(mlme_set_bssid_hotlist_cfm), fapi_sig_size(mlme_set_pno_list_cfm), fapi_sig_size(mlme_host_state_cfm), fapi_sig_size(mlme_add_range_cfm), @@ -4487,32 +3418,30 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_nan_publish_cfm), fapi_sig_size(mlme_nan_subscribe_cfm), fapi_sig_size(mlme_nan_followup_cfm), - fapi_sig_size(mlme_unset_channel_cfm), - fapi_sig_size(mlme_set_country_cfm), + 0, + 0, fapi_sig_size(mlme_forward_beacon_cfm), - fapi_sig_size(mlme_ndp_request_cfm), - fapi_sig_size(mlme_ndp_response_cfm), - fapi_sig_size(mlme_ndp_terminate_cfm), 0, 0, - fapi_sig_size(mlme_spare_4_cfm), - fapi_sig_size(mlme_spare_5_cfm), - fapi_sig_size(mlme_spare_6_cfm), - fapi_sig_size(mlme_install_apf_cfm), - fapi_sig_size(mlme_read_apf_cfm), - fapi_sig_size(mlme_set_num_antennas_cfm), - fapi_sig_size(mlme_arp_detect_cfm), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, fapi_sig_size(mlme_set_roaming_type_cfm), fapi_sig_size(mlme_set_band_cfm), + fapi_sig_size(mlme_set_roaming_parameters_cfm), fapi_sig_size(mlme_spare_signal_1_cfm), fapi_sig_size(mlme_spare_signal_2_cfm), fapi_sig_size(mlme_spare_signal_3_cfm), }; static const u16 fapi_debug_cfm_size_table[] = { - fapi_sig_size(debug_spare_1_cfm), - fapi_sig_size(debug_spare_2_cfm), - fapi_sig_size(debug_spare_3_cfm), fapi_sig_size(debug_spare_signal_1_cfm), fapi_sig_size(debug_spare_signal_2_cfm), fapi_sig_size(debug_spare_signal_3_cfm), @@ -4531,8 +3460,8 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(wlanlite_rx_stop_cfm), fapi_sig_size(wlanlite_status_cfm), fapi_sig_size(test_pmalloc_cfm), - fapi_sig_size(test_configure_monitor_mode_cfm), - 0, + fapi_sig_size(test_sa_query_cfm), + fapi_sig_size(test_channel_switch_cfm), fapi_sig_size(test_check_fw_alive_cfm), fapi_sig_size(test_suspend_cfm), fapi_sig_size(test_resume_cfm), @@ -4542,9 +3471,6 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(test_hip_tester_stop_cfm), fapi_sig_size(test_hip_tester_set_params_cfm), fapi_sig_size(test_bist_get_tx_gain_cfm), - fapi_sig_size(test_spare_1_cfm), - fapi_sig_size(test_spare_2_cfm), - fapi_sig_size(test_spare_3_cfm), fapi_sig_size(test_spare_signal_1_cfm), fapi_sig_size(test_spare_signal_2_cfm), fapi_sig_size(test_spare_signal_3_cfm), @@ -4553,9 +3479,6 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) static const u16 fapi_ma_ind_size_table[] = { fapi_sig_size(ma_unitdata_ind), fapi_sig_size(ma_blockack_ind), - fapi_sig_size(ma_spare_1_ind), - fapi_sig_size(ma_spare_2_ind), - fapi_sig_size(ma_spare_3_ind), fapi_sig_size(ma_spare_signal_1_ind), fapi_sig_size(ma_spare_signal_2_ind), fapi_sig_size(ma_spare_signal_3_ind), @@ -4578,8 +3501,8 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_received_frame_ind), 0, fapi_sig_size(mlme_tdls_peer_ind), - 0, - 0, + fapi_sig_size(mlme_ap_loss_ind), + fapi_sig_size(mlme_significant_change_ind), fapi_sig_size(mlme_rssi_report_ind), fapi_sig_size(mlme_ac_priority_update_ind), fapi_sig_size(mlme_range_ind), @@ -4589,16 +3512,8 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_nan_service_ind), fapi_sig_size(mlme_nan_followup_ind), fapi_sig_size(mlme_channel_switched_ind), - fapi_sig_size(mlme_synchronised_ind), + 0, fapi_sig_size(mlme_beacon_reporting_event_ind), - fapi_sig_size(mlme_spare_3_ind), - fapi_sig_size(mlme_spare_4_ind), - fapi_sig_size(mlme_ndp_request_ind), - fapi_sig_size(mlme_ndp_requested_ind), - fapi_sig_size(mlme_ndp_response_ind), - fapi_sig_size(mlme_ndp_terminate_ind), - fapi_sig_size(mlme_ndp_terminated_ind), - fapi_sig_size(mlme_spare_5_ind), fapi_sig_size(mlme_spare_signal_1_ind), fapi_sig_size(mlme_spare_signal_2_ind), fapi_sig_size(mlme_spare_signal_3_ind), @@ -4607,10 +3522,6 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) static const u16 fapi_debug_ind_size_table[] = { fapi_sig_size(debug_word12_ind), fapi_sig_size(debug_fault_ind), - fapi_sig_size(debug_words_ind), - fapi_sig_size(debug_spare_2_ind), - fapi_sig_size(debug_spare_3_ind), - fapi_sig_size(debug_spare_4_ind), fapi_sig_size(debug_spare_signal_1_ind), fapi_sig_size(debug_spare_signal_2_ind), fapi_sig_size(debug_spare_signal_3_ind), @@ -4622,9 +3533,6 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(debug_pkt_sink_report_ind), fapi_sig_size(debug_pkt_gen_report_ind), fapi_sig_size(test_hip_tester_report_ind), - fapi_sig_size(test_spare_1_ind), - fapi_sig_size(test_spare_2_ind), - fapi_sig_size(test_spare_3_ind), fapi_sig_size(test_spare_signal_1_ind), fapi_sig_size(test_spare_signal_2_ind), fapi_sig_size(test_spare_signal_3_ind), @@ -4636,37 +3544,24 @@ static inline u16 fapi_get_expected_size(struct sk_buff *skb) fapi_sig_size(mlme_reassociate_res), fapi_sig_size(mlme_roamed_res), fapi_sig_size(mlme_tdls_peer_res), - fapi_sig_size(mlme_synchronised_res), - fapi_sig_size(mlme_spare_2_res), - fapi_sig_size(mlme_spare_3_res), - fapi_sig_size(mlme_spare_4_res), fapi_sig_size(mlme_spare_signal_1_res), fapi_sig_size(mlme_spare_signal_2_res), fapi_sig_size(mlme_spare_signal_3_res), }; static const u16 fapi_ma_res_size_table[] = { - fapi_sig_size(ma_spare_1_res), - fapi_sig_size(ma_spare_2_res), - fapi_sig_size(ma_spare_3_res), fapi_sig_size(ma_spare_signal_1_res), fapi_sig_size(ma_spare_signal_2_res), fapi_sig_size(ma_spare_signal_3_res), }; static const u16 fapi_debug_res_size_table[] = { - fapi_sig_size(debug_spare_1_res), - fapi_sig_size(debug_spare_2_res), - fapi_sig_size(debug_spare_3_res), fapi_sig_size(debug_spare_signal_1_res), fapi_sig_size(debug_spare_signal_2_res), fapi_sig_size(debug_spare_signal_3_res), }; static const u16 fapi_test_res_size_table[] = { - fapi_sig_size(test_spare_1_res), - fapi_sig_size(test_spare_2_res), - fapi_sig_size(test_spare_3_res), fapi_sig_size(test_spare_signal_1_res), fapi_sig_size(test_spare_signal_2_res), fapi_sig_size(test_spare_signal_3_res), diff --git a/drivers/net/wireless/scsc/fw_test.c b/drivers/net/wireless/scsc/fw_test.c index 373a1d5f7..36130edf5 100755 --- a/drivers/net/wireless/scsc/fw_test.c +++ b/drivers/net/wireless/scsc/fw_test.c @@ -349,7 +349,7 @@ static void slsi_fw_test_connect_start_ap(struct slsi_dev *sdev, struct net_devi if (WARN_ON(!ieee80211_is_assoc_req(mgmt->frame_control) && !ieee80211_is_reassoc_req(mgmt->frame_control))) return; - peer_index = fapi_get_u16(skb, u.mlme_procedure_started_ind.association_identifier); + peer_index = fapi_get_u16(skb, u.mlme_procedure_started_ind.peer_index); peer = slsi_peer_add(sdev, dev, mgmt->sa, peer_index); if (WARN_ON(!peer)) @@ -363,23 +363,23 @@ static void slsi_fw_test_connected_network(struct slsi_dev *sdev, struct net_dev { struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_peer *peer = NULL; - u16 aid = fapi_get_u16(skb, u.mlme_connected_ind.association_identifier); + u16 peer_index = fapi_get_u16(skb, u.mlme_connected_ind.peer_index); SLSI_UNUSED_PARAMETER(fwtest); WARN_ON(!SLSI_MUTEX_IS_LOCKED(ndev_vif->vif_mutex)); - SLSI_NET_DBG1(dev, SLSI_FW_TEST, "Network Peer Connect(vif:%d, aid:%d)\n", ndev_vif->ifnum, aid); + SLSI_NET_DBG1(dev, SLSI_FW_TEST, "Network Peer Connect(vif:%d, peer_index:%d)\n", ndev_vif->ifnum, peer_index); WARN(!ndev_vif->is_fw_test, "!is_fw_test"); if (WARN(!ndev_vif->activated, "Not Activated")) return; - if (WARN_ON(aid > SLSI_PEER_INDEX_MAX)) + if (WARN_ON(peer_index > SLSI_PEER_INDEX_MAX)) return; - peer = slsi_get_peer_from_qs(sdev, dev, aid - 1); - if (WARN(!peer, "Peer(aid:%d) Not Found", aid)) + peer = slsi_get_peer_from_qs(sdev, dev, peer_index - 1); + if (WARN(!peer, "Peer(peer_index:%d) Not Found", peer_index)) return; slsi_ps_port_control(sdev, dev, peer, SLSI_STA_CONN_STATE_CONNECTED); diff --git a/drivers/net/wireless/scsc/ioctl.c b/drivers/net/wireless/scsc/ioctl.c index 17049a9d0..33222e40f 100755 --- a/drivers/net/wireless/scsc/ioctl.c +++ b/drivers/net/wireless/scsc/ioctl.c @@ -61,7 +61,12 @@ #define CMD_REASSOC "REASSOC" #define CMD_SETROAMSCANCHANNELS "SETROAMSCANCHANNELS" #define CMD_GETROAMSCANCHANNELS "GETROAMSCANCHANNELS" +#define CMD_ADDROAMSCANCHANNELS "ADDROAMSCANCHANNELS" #define CMD_SENDACTIONFRAME "SENDACTIONFRAME" +#define CMD_GETNCHOMODE "GETNCHOMODE" +#define CMD_SETNCHOMODE "SETNCHOMODE" +#define CMD_GETDFSSCANMODE "GETDFSSCANMODE" +#define CMD_SETDFSSCANMODE "SETDFSSCANMODE" #define CMD_HAPD_MAX_NUM_STA "HAPD_MAX_NUM_STA" #define CMD_COUNTRY "COUNTRY" #define CMD_SEND_GK "SEND_GK" @@ -773,6 +778,7 @@ static ssize_t slsi_get_indoor_channels(struct net_device *dev, char *command, i return len; } #endif + static ssize_t slsi_set_country_rev(struct net_device *dev, char *country_code) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -807,16 +813,134 @@ static ssize_t slsi_get_country_rev(struct net_device *dev, char *command, int b return len; } +static ssize_t slsi_freq_band_write(struct net_device *dev, uint band) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; +#ifdef CONFIG_SCSC_WLAN_WES_NCHO + struct sk_buff *req; + struct sk_buff *cfm; + int ret = 0; +#endif + + if (slsi_is_test_mode_enabled()) { + slsi_band_update(sdev, band); + /* Convert to correct Mib value (intra_band:1, all_band:2) */ + return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_BAND, (band == SLSI_FREQ_BAND_AUTO) ? 2 : 1); + } + +#ifdef CONFIG_SCSC_WLAN_WES_NCHO + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + if (band < 0 || band > 2) { + SLSI_ERR(sdev, "Invalid Band: Must be 0/1/2 Not '%c'\n", band); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + if (sdev->device_config.supported_band == band) { + SLSI_DBG1_NODEV(SLSI_MLME, "band is already %d\n", band); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return ret; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + + SLSI_DBG1_NODEV(SLSI_MLME, "mlme_set_band_req(vif:%u band:%u)\n", ndev_vif->ifnum, band); + + req = fapi_alloc(mlme_set_band_req, MLME_SET_BAND_REQ, ndev_vif->ifnum, 0); + fapi_set_u16(req, u.mlme_set_band_req.vif, ndev_vif->ifnum); + fapi_set_u16(req, u.mlme_set_band_req.band, band); + cfm = slsi_mlme_req_cfm(sdev, dev, req, MLME_SET_BAND_CFM); + if (!cfm) { + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return -EIO; + } + + if (fapi_get_u16(cfm, u.mlme_set_band_cfm.result_code) != FAPI_RESULTCODE_SUCCESS) { + SLSI_NET_ERR(dev, "mlme_set_band_cfm(result:0x%04x) ERROR\n", + fapi_get_u16(cfm, u.mlme_set_band_cfm.result_code)); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + ret = -EINVAL; + } + + slsi_kfree_skb(cfm); + + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + sdev->device_config.supported_band = band; + slsi_band_cfg_update(sdev, band); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + return ret; +#else + SLSI_ERR(sdev, "NCHO is not supported\n"); + + return -EINVAL; +#endif +} + +static ssize_t slsi_freq_band_read(struct net_device *dev, char *command, int buf_len) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + char buf[128]; + int pos = 0; + const size_t bufsz = sizeof(buf); + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (slsi_is_test_mode_enabled()) + goto read_band; + +#ifdef CONFIG_SCSC_WLAN_WES_NCHO + if (sdev->device_config.ncho_mode) + goto read_band; +#endif + + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + pos = -EINVAL; + goto exit; + +read_band: + memset(buf, '\0', 128); + pos += scnprintf(buf + pos, bufsz - pos, "Band %d", sdev->device_config.supported_band); + buf[pos] = '\0'; + memcpy(command, buf, pos + 1); + +exit: + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return pos; +} + #ifdef CONFIG_SCSC_WLAN_WES_NCHO static ssize_t slsi_roam_scan_trigger_write(struct net_device *dev, char *command, int buf_len) { struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + int ret = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); slsi_str_to_int(command, &mib_value); - - return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_RSSI_ROAM_SCAN_TRIGGER, mib_value); + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + ret = slsi_mlme_set_roaming_parameters(sdev, dev, SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_TRIGGER, mib_value, 1); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return ret; } static ssize_t slsi_roam_scan_trigger_read(struct net_device *dev, char *command, int buf_len) @@ -826,7 +950,15 @@ static ssize_t slsi_roam_scan_trigger_read(struct net_device *dev, char *command int mib_value = 0; int res; - res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_RSSI_ROAM_SCAN_TRIGGER, &mib_value); + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_TRIGGER, &mib_value); if (res) return res; res = snprintf(command, buf_len, "%s %d", CMD_GETROAMTRIGGER, mib_value); @@ -838,10 +970,21 @@ static ssize_t slsi_roam_delta_trigger_write(struct net_device *dev, char *comma struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + int ret = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); slsi_str_to_int(command, &mib_value); - - return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_DELTA_TRIGGER, mib_value); + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + ret = slsi_mlme_set_roaming_parameters(sdev, dev, SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_DELDA, mib_value, 1); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return ret; } static ssize_t slsi_roam_delta_trigger_read(struct net_device *dev, char *command, int buf_len) @@ -851,7 +994,15 @@ static ssize_t slsi_roam_delta_trigger_read(struct net_device *dev, char *comman int mib_value = 0; int res; - res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_DELTA_TRIGGER, &mib_value); + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_DELDA, &mib_value); if (res) return res; @@ -859,14 +1010,71 @@ static ssize_t slsi_roam_delta_trigger_read(struct net_device *dev, char *comman return res; } +static ssize_t slsi_reassoc_write(struct net_device *dev, char *command, int buf_len) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + u8 bssid[6] = { 0 }; + int channel; + int freq; + enum nl80211_band band = NL80211_BAND_2GHZ; + int r = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + if (command[17] != ' ') { + SLSI_ERR(sdev, "Invalid Format '%s' '%c'\n", command, command[17]); + return -EINVAL; + } + + command[17] = '\0'; + + slsi_machexstring_to_macarray(command, bssid); + + if (!slsi_str_to_int(&command[18], &channel)) { + SLSI_ERR(sdev, "Invalid channel string: '%s'\n", &command[18]); + return -EINVAL; + } + + if (channel > 14) + band = NL80211_BAND_5GHZ; + freq = (u16)ieee80211_channel_to_frequency(channel, band); + + ndev_vif = netdev_priv(dev); + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + + r = slsi_mlme_roam(sdev, dev, bssid, freq); + + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return r; +} + static ssize_t slsi_cached_channel_scan_period_write(struct net_device *dev, char *command, int buf_len) { struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + int ret = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); slsi_str_to_int(command, &mib_value); - return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_CACHED_CHANNEL_SCAN_PERIOD, mib_value * 1000000); + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + ret = slsi_mlme_set_roaming_parameters(sdev, dev, SLSI_PSID_UNIFI_NCHO_CACHED_SCAN_PERIOD, mib_value * 1000000, 4); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return ret; } static ssize_t slsi_cached_channel_scan_period_read(struct net_device *dev, char *command, int buf_len) @@ -876,7 +1084,15 @@ static ssize_t slsi_cached_channel_scan_period_read(struct net_device *dev, char int mib_value = 0; int res; - res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_CACHED_CHANNEL_SCAN_PERIOD, &mib_value); + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_NCHO_CACHED_SCAN_PERIOD, &mib_value); if (res) return res; @@ -890,10 +1106,21 @@ static ssize_t slsi_full_roam_scan_period_write(struct net_device *dev, char *co struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + int ret = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); slsi_str_to_int(command, &mib_value); - - return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_FULL_ROAM_SCAN_PERIOD, mib_value * 1000000); + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + ret = slsi_mlme_set_roaming_parameters(sdev, dev, SLSI_PSID_UNIFI_ROAM_NCHO_FULL_SCAN_PERIOD, mib_value * 1000000, 4); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return ret; } static ssize_t slsi_full_roam_scan_period_read(struct net_device *dev, char *command, int buf_len) @@ -903,7 +1130,15 @@ static ssize_t slsi_full_roam_scan_period_read(struct net_device *dev, char *com int mib_value = 0; int res; - res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_FULL_ROAM_SCAN_PERIOD, &mib_value); + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_NCHO_FULL_SCAN_PERIOD, &mib_value); if (res) return res; @@ -918,6 +1153,14 @@ static ssize_t slsi_roam_scan_max_active_channel_time_write(struct net_device *d struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + slsi_str_to_int(command, &mib_value); return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_MAX_ACTIVE_CHANNEL_TIME, mib_value); @@ -930,6 +1173,14 @@ static ssize_t slsi_roam_scan_max_active_channel_time_read(struct net_device *de int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_MAX_ACTIVE_CHANNEL_TIME, &mib_value); if (res) return res; @@ -945,6 +1196,14 @@ static ssize_t slsi_roam_scan_probe_interval_write(struct net_device *dev, char struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + slsi_str_to_int(command, &mib_value); return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_NPROBE, mib_value); } @@ -956,6 +1215,14 @@ static ssize_t slsi_roam_scan_probe_interval_read(struct net_device *dev, char * int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_NPROBE, &mib_value); if (res) return res; @@ -971,6 +1238,14 @@ static ssize_t slsi_roam_mode_write(struct net_device *dev, char *command, int b struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + if (slsi_is_rf_test_mode_enabled()) { SLSI_DBG1_NODEV(SLSI_MLME, "SLSI_PSID_UNIFI_ROAM_MODE is not supported because of rf test mode.\n"); return -ENOTSUPP; @@ -988,6 +1263,14 @@ static ssize_t slsi_roam_mode_read(struct net_device *dev, char *command, int bu int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_MODE, &mib_value); if (res) return res; @@ -1053,6 +1336,14 @@ static ssize_t slsi_roam_scan_band_write(struct net_device *dev, char *command, struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + slsi_str_to_int(command, &mib_value); return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_BAND, mib_value); } @@ -1064,6 +1355,14 @@ static ssize_t slsi_roam_scan_band_read(struct net_device *dev, char *command, i int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_BAND, &mib_value); if (res) return res; @@ -1073,33 +1372,6 @@ static ssize_t slsi_roam_scan_band_read(struct net_device *dev, char *command, i return res; } -static ssize_t slsi_freq_band_write(struct net_device *dev, uint band) -{ - struct netdev_vif *ndev_vif = netdev_priv(dev); - struct slsi_dev *sdev = ndev_vif->sdev; - - slsi_band_update(sdev, band); - /* Convert to correct Mib value (intra_band:1, all_band:2) */ - return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_BAND, (band == SLSI_FREQ_BAND_AUTO) ? 2 : 1); -} - -static ssize_t slsi_freq_band_read(struct net_device *dev, char *command, int buf_len) -{ - struct netdev_vif *ndev_vif = netdev_priv(dev); - struct slsi_dev *sdev = ndev_vif->sdev; - char buf[128]; - int pos = 0; - const size_t bufsz = sizeof(buf); - - memset(buf, '\0', 128); - pos += scnprintf(buf + pos, bufsz - pos, "Band %d", sdev->device_config.supported_band); - - buf[pos] = '\0'; - memcpy(command, buf, pos + 1); - - return pos; -} - static ssize_t slsi_roam_scan_control_write(struct net_device *dev, int mode) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -1107,6 +1379,12 @@ static ssize_t slsi_roam_scan_control_write(struct net_device *dev, int mode) SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + if (mode == 0 || mode == 1) { sdev->device_config.roam_scan_mode = mode; } else { @@ -1126,6 +1404,14 @@ static ssize_t slsi_roam_scan_control_read(struct net_device *dev, char *command int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_CONTROL, &mib_value); if (res) return res; @@ -1141,6 +1427,14 @@ static ssize_t slsi_roam_scan_home_time_write(struct net_device *dev, char *comm struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + slsi_str_to_int(command, &mib_value); return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_HOME_TIME, mib_value); @@ -1153,6 +1447,14 @@ static ssize_t slsi_roam_scan_home_time_read(struct net_device *dev, char *comma int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_HOME_TIME, &mib_value); if (res) return res; @@ -1168,6 +1470,14 @@ static ssize_t slsi_roam_scan_home_away_time_write(struct net_device *dev, char struct slsi_dev *sdev = ndev_vif->sdev; int mib_value = 0; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + slsi_str_to_int(command, &mib_value); return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_HOME_AWAY_TIME, mib_value); } @@ -1179,6 +1489,14 @@ static ssize_t slsi_roam_scan_home_away_time_read(struct net_device *dev, char * int mib_value = 0; int res; + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_SCAN_HOME_AWAY_TIME, &mib_value); if (res) return res; @@ -1196,18 +1514,28 @@ static ssize_t slsi_roam_scan_channels_write(struct net_device *dev, char *comma int i, channel_count = 0; int offset = 0; int readbyte = 0; - int channels[MAX_CHANNEL_LIST]; + int channels[SLSI_NCHO_MAX_CHANNEL_LIST]; + int ret = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } readbyte = slsi_str_to_int(command, &channel_count); if (!readbyte) { SLSI_ERR(sdev, "channel count: failed to read a numeric value"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); return -EINVAL; } - SLSI_MUTEX_LOCK(sdev->device_config_mutex); - if (channel_count > MAX_CHANNEL_LIST) - channel_count = MAX_CHANNEL_LIST; + if (channel_count > SLSI_NCHO_MAX_CHANNEL_LIST) + channel_count = SLSI_NCHO_MAX_CHANNEL_LIST; + sdev->device_config.wes_roam_scan_list.n = channel_count; for (i = 0; i < channel_count; i++) { @@ -1221,6 +1549,17 @@ static ssize_t slsi_roam_scan_channels_write(struct net_device *dev, char *comma sdev->device_config.wes_roam_scan_list.channels[i] = channels[i]; } + + if (!sdev->device_config.roam_scan_mode) { + ret = slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_SCAN_CONTROL, 1); + if (ret != SLSI_MIB_STATUS_SUCCESS) { + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } else { + sdev->device_config.roam_scan_mode = 1; + } + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); @@ -1240,6 +1579,13 @@ static ssize_t slsi_roam_scan_channels_read(struct net_device *dev, char *comman int channel_count = 0; SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + channel_count = sdev->device_config.wes_roam_scan_list.n; pos = scnprintf(channel_buf, sizeof(channel_buf), "%s %d", CMD_GETROAMSCANCHANNELS, channel_count); for (i = 0; i < channel_count; i++) @@ -1253,12 +1599,95 @@ static ssize_t slsi_roam_scan_channels_read(struct net_device *dev, char *comman return pos; } +static ssize_t slsi_roam_add_scan_channels(struct net_device *dev, char *command, int buf_len) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + int result = 0; + int i, j, new_channel_count = 0; + int offset = 0; + int readbyte = 0; + int new_channels[SLSI_NCHO_MAX_CHANNEL_LIST]; + int curr_channel_count = 0; + int found = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + if (sdev->device_config.roam_scan_mode) { + SLSI_ERR(sdev, "ROAM Scan Control must be 0, roam mode = %d\n", sdev->device_config.roam_scan_mode); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + if (sdev->device_config.wes_roam_scan_list.n == SLSI_NCHO_MAX_CHANNEL_LIST) { + SLSI_ERR(sdev, "Roam scan list is already full\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + readbyte = slsi_str_to_int(command, &new_channel_count); + + if (!readbyte) { + SLSI_ERR(sdev, "channel count: failed to read a numeric value\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + curr_channel_count = sdev->device_config.wes_roam_scan_list.n; + + for (i = 0; i < new_channel_count; i++) { + offset = offset + readbyte + 1; + readbyte = slsi_str_to_int(&command[offset], &new_channels[i]); + if (!readbyte) { + SLSI_ERR(sdev, "failed to read a numeric value\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + for (j = 0; j < curr_channel_count; j++) { + found = 0; + if (sdev->device_config.wes_roam_scan_list.channels[j] == new_channels[i]) { + found = 1; + break; + } + } + if (!found) { + sdev->device_config.wes_roam_scan_list.channels[curr_channel_count] = new_channels[i]; + curr_channel_count++; + } + if (curr_channel_count > SLSI_NCHO_MAX_CHANNEL_LIST) { + curr_channel_count = SLSI_NCHO_MAX_CHANNEL_LIST; + break; + } + } + + sdev->device_config.wes_roam_scan_list.n = curr_channel_count; + + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + result = slsi_mlme_set_cached_channels(sdev, dev, curr_channel_count, sdev->device_config.wes_roam_scan_list.channels); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + + return result; +} + static ssize_t slsi_okc_mode_write(struct net_device *dev, int mode) { struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_dev *sdev = ndev_vif->sdev; SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } if (mode == 0 || mode == 1) { sdev->device_config.okc_mode = mode; @@ -1280,6 +1709,12 @@ static ssize_t slsi_okc_mode_read(struct net_device *dev, char *command, int buf int res; SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + okc_mode = sdev->device_config.okc_mode; SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); @@ -1297,6 +1732,12 @@ static ssize_t slsi_wes_mode_write(struct net_device *dev, int mode) SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + if (mode == 0 || mode == 1) { sdev->device_config.wes_mode = mode; } else { @@ -1328,6 +1769,12 @@ static ssize_t slsi_wes_mode_read(struct net_device *dev, char *command, int buf int res; SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + wes_mode = sdev->device_config.wes_mode; SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); @@ -1335,6 +1782,128 @@ static ssize_t slsi_wes_mode_read(struct net_device *dev, char *command, int buf return res; } + +static ssize_t slsi_set_ncho_mode(struct net_device *dev, int mode) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + struct sk_buff *req; + struct sk_buff *cfm; + int ret = 0; + + if (mode != 0 && mode != 1) { + SLSI_ERR(sdev, "Invalid NCHO Mode: Must be 0 or 1, mode = %d\n", mode); + return -EINVAL; + } + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (sdev->device_config.ncho_mode == mode) { + SLSI_INFO(sdev, "ncho_mode is already %d\n", mode); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return ret; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); + + if (ndev_vif->sta.vif_status != SLSI_VIF_STATUS_CONNECTED) { + SLSI_NET_ERR(dev, "sta is not in connected state\n"); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return -EPERM; + } + + SLSI_DBG1_NODEV(SLSI_MLME, "mlme_set_roaming_type_req(vif:%u mode:%u)\n", ndev_vif->ifnum, mode); + + req = fapi_alloc(mlme_set_roaming_type_req, MLME_SET_ROAMING_TYPE_REQ, ndev_vif->ifnum, 0); + fapi_set_u16(req, u.mlme_set_roaming_type_req.vif, ndev_vif->ifnum); + fapi_set_u16(req, u.mlme_set_roaming_type_req.roaming_type, mode); + cfm = slsi_mlme_req_cfm(sdev, dev, req, MLME_SET_ROAMING_TYPE_CFM); + if (!cfm) { + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + return -EIO; + } + + if (fapi_get_u16(cfm, u.mlme_set_roaming_type_cfm.result_code) != FAPI_RESULTCODE_SUCCESS) { + SLSI_NET_ERR(dev, "mlme_set_roaming_type_cfm(result:0x%04x) ERROR\n", + fapi_get_u16(cfm, u.mlme_set_roaming_type_cfm.result_code)); + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + ret = -EINVAL; + } + + slsi_kfree_skb(cfm); + + SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + sdev->device_config.ncho_mode = mode; + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + return ret; +} + +static ssize_t slsi_get_ncho_mode(struct net_device *dev, char *command, int buf_len) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + int ret; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + ret = snprintf(command, buf_len, "%s %d", CMD_GETNCHOMODE, sdev->device_config.ncho_mode); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + return ret; +} + +static ssize_t slsi_set_dfs_scan_mode(struct net_device *dev, int mode) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + if (mode > 0 || mode <= 2) { + sdev->device_config.dfs_scan_mode = mode; + } else { + SLSI_ERR(sdev, "Invalid dfs scan mode: Must be 0/1 or 2, Not '%c'\n", mode); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAM_DFS_SCAN_MODE, sdev->device_config.dfs_scan_mode); +} + +static ssize_t slsi_get_dfs_scan_mode(struct net_device *dev, char *command, int buf_len) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct slsi_dev *sdev = ndev_vif->sdev; + int mib_value = 0; + int res; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + if (!sdev->device_config.ncho_mode) { + SLSI_INFO(sdev, "Command not allowed, NCHO is disabled\n"); + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + return -EINVAL; + } + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + res = slsi_get_mib_roam(sdev, SLSI_PSID_UNIFI_ROAM_DFS_SCAN_MODE, &mib_value); + if (res) + return res; + + res = snprintf(command, buf_len, "%s %d", CMD_GETDFSSCANMODE, mib_value); + + return res; +} + #endif static ssize_t slsi_set_pmk(struct net_device *dev, char *command, int buf_len) @@ -1440,43 +2009,6 @@ if ((ndev_sta_vif->activated) && (ndev_sta_vif->vif_type == FAPI_VIFTYPE_STATION return slsi_auto_chan_select_scan(sdev, count_channels, channels); } -static ssize_t slsi_reassoc_write(struct net_device *dev, char *command, int buf_len) -{ - struct netdev_vif *ndev_vif = netdev_priv(dev); - struct slsi_dev *sdev = ndev_vif->sdev; - u8 bssid[6] = { 0 }; - int channel; - int freq; - enum ieee80211_band band = IEEE80211_BAND_2GHZ; - int r = 0; - - if (command[17] != ' ') { - SLSI_ERR(sdev, "Invalid Format '%s' '%c'\n", command, command[17]); - return -EINVAL; - } - - command[17] = '\0'; - - slsi_machexstring_to_macarray(command, bssid); - - if (!slsi_str_to_int(&command[18], &channel)) { - SLSI_ERR(sdev, "Invalid channel string: '%s'\n", &command[18]); - return -EINVAL; - } - - if (channel > 14) - band = IEEE80211_BAND_5GHZ; - freq = (u16)ieee80211_channel_to_frequency(channel, band); - - ndev_vif = netdev_priv(dev); - SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); - - r = slsi_mlme_roam(sdev, dev, bssid, freq); - - SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); - return r; -} - static ssize_t slsi_send_action_frame(struct net_device *dev, char *command, int buf_len) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -1508,29 +2040,36 @@ static ssize_t slsi_send_action_frame(struct net_device *dev, char *command, int } SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); - command[17] = '\0'; + if (buf_len < 17) + return -EINVAL; slsi_machexstring_to_macarray(command, bssid); - command[17] = ' '; pos = strchr(command, ' '); - if (pos == NULL) + if (!pos) return -EINVAL; - *pos++ = '\0'; + buf_len = buf_len - (pos - command + 1); + if (buf_len <= 0) + return -EINVAL; + pos++; if (!slsi_str_to_int(pos, &channel)) { SLSI_ERR(sdev, "Invalid channel string: '%s'\n", pos); return -EINVAL; } - pos++; if (channel > 14) band = IEEE80211_BAND_5GHZ; freq = (u16)ieee80211_channel_to_frequency(channel, band); + if (!freq) + return -EINVAL; pos = strchr(pos, ' '); - if (pos == NULL) + if (!pos) return -EINVAL; - *pos++ = '\0'; + buf_len = buf_len - (pos - command + 1); + if (buf_len <= 0) + return -EINVAL; + pos++; if (!slsi_str_to_int(pos, &dwell_time)) { SLSI_ERR(sdev, "Invalid dwell time string: '%s'\n", pos); @@ -1538,7 +2077,10 @@ static ssize_t slsi_send_action_frame(struct net_device *dev, char *command, int } pos = strchr(pos, ' '); - if (pos == NULL) + if (!pos) + return -EINVAL; + buf_len = buf_len - (pos - command + 1); + if (buf_len <= 0) return -EINVAL; pos++; @@ -1552,7 +2094,7 @@ static ssize_t slsi_send_action_frame(struct net_device *dev, char *command, int return -EINVAL; buf = kmalloc((len + 1) / 2, GFP_KERNEL); - if (buf == NULL) { + if (!buf) { SLSI_ERR(sdev, "Malloc failed\n"); return -ENOMEM; } @@ -1569,7 +2111,7 @@ static ssize_t slsi_send_action_frame(struct net_device *dev, char *command, int final_length = len + IEEE80211_HEADER_SIZE; final_buf = kmalloc(final_length, GFP_KERNEL); - if (final_buf == NULL) { + if (!final_buf) { SLSI_ERR(sdev, "Malloc failed\n"); kfree(buf); return -ENOMEM; @@ -1640,9 +2182,9 @@ static ssize_t slsi_forward_beacon(struct net_device *dev, char *action) int ret = 0; if (strncasecmp(action, "stop", 4) == 0) { - intended_action = FAPI_ACTION_STOP; + intended_action = FAPI_WIPSACTION_STOP; } else if (strncasecmp(action, "start", 5) == 0) { - intended_action = FAPI_ACTION_START; + intended_action = FAPI_WIPSACTION_START; } else { SLSI_NET_ERR(dev, "BEACON_RECV should be used with start or stop\n"); return -EINVAL; @@ -1658,8 +2200,8 @@ static ssize_t slsi_forward_beacon(struct net_device *dev, char *action) goto exit_vif_mutex; } - if (((intended_action == FAPI_ACTION_START) && netdev_vif->is_wips_running) || - ((intended_action == FAPI_ACTION_STOP) && !netdev_vif->is_wips_running)) { + if (((intended_action == FAPI_WIPSACTION_START) && netdev_vif->is_wips_running) || + ((intended_action == FAPI_WIPSACTION_STOP) && !netdev_vif->is_wips_running)) { SLSI_NET_INFO(dev, "Forwarding beacon is already %s!!\n", netdev_vif->is_wips_running ? "running" : "stopped"); ret = 0; @@ -1667,7 +2209,7 @@ static ssize_t slsi_forward_beacon(struct net_device *dev, char *action) } SLSI_MUTEX_LOCK(netdev_vif->scan_mutex); - if (intended_action == FAPI_ACTION_START && + if (intended_action == FAPI_WIPSACTION_START && (netdev_vif->scan[SLSI_SCAN_HW_ID].scan_req || netdev_vif->sta.roam_in_progress)) { SLSI_NET_ERR(dev, "Rejecting BEACON_RECV start as scan/roam is running\n"); ret = -EBUSY; @@ -2500,6 +3042,16 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ret = slsi_set_country_rev(dev, country_code); } else if (strncasecmp(command, CMD_GETCOUNTRYREV, strlen(CMD_GETCOUNTRYREV)) == 0) { ret = slsi_get_country_rev(dev, command, priv_cmd.total_len); + } else if (strncasecmp(command, CMD_SETROAMBAND, strlen(CMD_SETROAMBAND)) == 0) { + uint band = *(command + strlen(CMD_SETROAMBAND) + 1) - '0'; + + ret = slsi_freq_band_write(dev, band); + } else if (strncasecmp(command, CMD_SETBAND, strlen(CMD_SETBAND)) == 0) { + uint band = *(command + strlen(CMD_SETBAND) + 1) - '0'; + + ret = slsi_freq_band_write(dev, band); + } else if ((strncasecmp(command, CMD_GETROAMBAND, strlen(CMD_GETROAMBAND)) == 0) || (strncasecmp(command, CMD_GETBAND, strlen(CMD_GETBAND)) == 0)) { + ret = slsi_freq_band_read(dev, command, priv_cmd.total_len); #ifdef CONFIG_SCSC_WLAN_WES_NCHO } else if (strncasecmp(command, CMD_SETROAMTRIGGER, strlen(CMD_SETROAMTRIGGER)) == 0) { int skip = strlen(CMD_SETROAMTRIGGER) + 1; @@ -2557,16 +3109,6 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) priv_cmd.total_len - skip); } else if (strncasecmp(command, CMD_GETROAMINTRABAND, strlen(CMD_GETROAMINTRABAND)) == 0) { ret = slsi_roam_scan_band_read(dev, command, priv_cmd.total_len); - } else if (strncasecmp(command, CMD_SETROAMBAND, strlen(CMD_SETROAMBAND)) == 0) { - uint band = *(command + strlen(CMD_SETROAMBAND) + 1) - '0'; - - ret = slsi_freq_band_write(dev, band); - } else if (strncasecmp(command, CMD_SETBAND, strlen(CMD_SETBAND)) == 0) { - uint band = *(command + strlen(CMD_SETBAND) + 1) - '0'; - - ret = slsi_freq_band_write(dev, band); - } else if ((strncasecmp(command, CMD_GETROAMBAND, strlen(CMD_GETROAMBAND)) == 0) || (strncasecmp(command, CMD_GETBAND, strlen(CMD_GETBAND)) == 0)) { - ret = slsi_freq_band_read(dev, command, priv_cmd.total_len); } else if (strncasecmp(command, CMD_SETROAMSCANCONTROL, strlen(CMD_SETROAMSCANCONTROL)) == 0) { int mode = *(command + strlen(CMD_SETROAMSCANCONTROL) + 1) - '0'; @@ -2607,6 +3149,27 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) } } else if (strncasecmp(command, CMD_GETROAMSCANCHANNELS, strlen(CMD_GETROAMSCANCHANNELS)) == 0) { ret = slsi_roam_scan_channels_read(dev, command, priv_cmd.total_len); + } else if (strncasecmp(command, CMD_ADDROAMSCANCHANNELS, strlen(CMD_ADDROAMSCANCHANNELS)) == 0) { + u8 skip = strlen(CMD_ADDROAMSCANCHANNELS) + 1; + if (skip <= priv_cmd.total_len) { + ret = slsi_roam_add_scan_channels(dev, command + skip, + priv_cmd.total_len - skip); + } + } else if (strncasecmp(command, CMD_GETNCHOMODE, strlen(CMD_GETNCHOMODE)) == 0) { + ret = slsi_get_ncho_mode(dev, command, priv_cmd.total_len); + } else if (strncasecmp(command, CMD_SETNCHOMODE, strlen(CMD_SETNCHOMODE)) == 0) { + int mode = *(command + strlen(CMD_SETNCHOMODE) + 1) - '0'; + ret = slsi_set_ncho_mode(dev, mode); + } else if (strncasecmp(command, CMD_SETDFSSCANMODE, strlen(CMD_SETDFSSCANMODE)) == 0) { + int mode = *(command + strlen(CMD_SETDFSSCANMODE) + 1) - '0'; + + ret = slsi_set_dfs_scan_mode(dev, mode); + } else if (strncasecmp(command, CMD_GETDFSSCANMODE, strlen(CMD_GETDFSSCANMODE)) == 0) { + ret = slsi_get_dfs_scan_mode(dev, command, priv_cmd.total_len); + } else if (strncasecmp(command, CMD_REASSOC, strlen(CMD_REASSOC)) == 0) { + int skip = strlen(CMD_REASSOC) + 1; + ret = slsi_reassoc_write(dev, command + skip, + priv_cmd.total_len - skip); #endif } else if (strncasecmp(command, CMD_SET_PMK, strlen(CMD_SET_PMK)) == 0) { ret = slsi_set_pmk(dev, command, priv_cmd.total_len); @@ -2617,16 +3180,13 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (skip <= priv_cmd.total_len) { ret = slsi_auto_chan_write(dev, command + skip); } - } else if (strncasecmp(command, CMD_REASSOC, strlen(CMD_REASSOC)) == 0) { - int skip = strlen(CMD_REASSOC) + 1; - - ret = slsi_reassoc_write(dev, command + skip, - priv_cmd.total_len - skip); } else if (strncasecmp(command, CMD_SENDACTIONFRAME, strlen(CMD_SENDACTIONFRAME)) == 0) { int skip = strlen(CMD_SENDACTIONFRAME) + 1; - ret = slsi_send_action_frame(dev, command + skip, - priv_cmd.total_len - skip); + if (skip < priv_cmd.total_len) + ret = slsi_send_action_frame(dev, command + skip, priv_cmd.total_len - skip); + else + ret = -EINVAL; } else if (strncasecmp(command, CMD_HAPD_MAX_NUM_STA, strlen(CMD_HAPD_MAX_NUM_STA)) == 0) { int sta_num; u8 *max_sta = command + strlen(CMD_HAPD_MAX_NUM_STA) + 1; diff --git a/drivers/net/wireless/scsc/mgt.c b/drivers/net/wireless/scsc/mgt.c index dafbd18f8..4d1f3530f 100755 --- a/drivers/net/wireless/scsc/mgt.c +++ b/drivers/net/wireless/scsc/mgt.c @@ -1361,7 +1361,7 @@ static int slsi_mib_initial_get(struct slsi_dev *sdev) { SLSI_PSID_UNIFI_HARDWARE_PLATFORM, {0, 0} }, { SLSI_PSID_UNIFI_REG_DOM_VERSION, {0, 0} }, - { SLSI_PSID_UNIFI_NAN_ENABLED, {0, 0} }, + { SLSI_PSID_UNIFI_NAN_ACTIVATED, {0, 0} }, { SLSI_PSID_UNIFI_DEFAULT_DWELL_TIME, {0, 0} }, #ifdef CONFIG_SCSC_WLAN_WIFI_SHARING { SLSI_PSID_UNIFI_WI_FI_SHARING5_GHZ_CHANNEL, {0, 0} }, @@ -1377,15 +1377,18 @@ static int slsi_mib_initial_get(struct slsi_dev *sdev) #ifdef CONFIG_SCSC_WLAN_STA_ENHANCED_ARP_DETECT { SLSI_PSID_UNIFI_ARP_DETECT_ACTIVATED, {0, 0} }, #endif - { SLSI_PSID_UNIFI_APF_ENABLED, {0, 0} }, - { SLSI_PSID_UNIFI_SOFT_AP40_MHZ_ON24G, {0, 0} } +#ifdef CONFIG_SCSC_WLAN_STA_APF + { SLSI_PSID_UNIFI_APF_ACTIVATED, {0, 0} }, +#endif + { SLSI_PSID_UNIFI_SOFT_AP40_MHZ_ON24G, {0, 0} }, + { SLSI_PSID_UNIFI_EXTENDED_CAPABILITIES, {0, 0} }, };/*Check the mibrsp.dataLength when a new mib is added*/ r = slsi_mib_encode_get_list(&mibreq, sizeof(get_values) / sizeof(struct slsi_mib_get_entry), get_values); if (r != SLSI_MIB_STATUS_SUCCESS) return -ENOMEM; - mibrsp.dataLength = 194; + mibrsp.dataLength = 204; mibrsp.data = kmalloc(mibrsp.dataLength, GFP_KERNEL); if (!mibrsp.data) { kfree(mibreq.data); @@ -1576,15 +1579,23 @@ static int slsi_mib_initial_get(struct slsi_dev *sdev) else SLSI_DBG2(sdev, SLSI_MLME, "Enhanced Arp Detect is disabled!\n"); #endif +#ifdef CONFIG_SCSC_WLAN_STA_APF if (values[++mib_index].type != SLSI_MIB_TYPE_NONE) /* APF Support */ sdev->device_config.fw_apf_supported = values[mib_index].u.boolValue; else SLSI_DBG2(sdev, SLSI_MLME, "APF Support is disabled!\n"); - +#endif if (values[++mib_index].type != SLSI_MIB_TYPE_NONE) /* 40MHz for Soft AP */ sdev->fw_SoftAp_2g_40mhz_enabled = values[mib_index].u.boolValue; else SLSI_DBG2(sdev, SLSI_MLME, "40MHz for Soft AP is disabled!\n"); + if (values[++mib_index].type != SLSI_MIB_TYPE_NONE) { + sdev->fw_ext_cap_ie_len = values[mib_index].u.octetValue.dataLength; + memset(sdev->fw_ext_cap_ie, 0, sizeof(sdev->fw_ext_cap_ie)); + memcpy(sdev->fw_ext_cap_ie, values[mib_index].u.octetValue.data, + sdev->fw_ext_cap_ie_len); + } else + SLSI_DBG2(sdev, SLSI_MLME, "Failed to read Extended capabilities\n"); kfree(values); } @@ -1769,6 +1780,7 @@ int slsi_mib_get_gscan_cap(struct slsi_dev *sdev, struct slsi_nl_gscan_capabilit } #endif +#ifdef CONFIG_SCSC_WLAN_STA_APF int slsi_mib_get_apf_cap(struct slsi_dev *sdev, struct net_device *dev) { struct slsi_mib_data mibreq = { 0, NULL }; @@ -1826,6 +1838,7 @@ int slsi_mib_get_apf_cap(struct slsi_dev *sdev, struct net_device *dev) kfree(values); return r; } +#endif int slsi_mib_get_rtt_cap(struct slsi_dev *sdev, struct net_device *dev, struct slsi_rtt_capabilities *cap) { @@ -2138,6 +2151,32 @@ int slsi_test_send_hanged_vendor_event(struct net_device *dev) } #endif +int slsi_set_ext_cap(struct slsi_dev *sdev, struct net_device *dev, const u8 *ies, int ie_len, const u8 *ext_cap_mask) +{ + const u8 *ext_capab_ie; + int r = 0; + + ext_capab_ie = cfg80211_find_ie(WLAN_EID_EXT_CAPABILITY, ies, ie_len); + if (ext_capab_ie) { + u8 ext_cap_ie_len = ext_capab_ie[1]; + int i = 0; + bool set_ext_cap = false; + + ext_capab_ie += 2; /* skip the EID and length*/ + for (i = 0; i < ext_cap_ie_len; i++) { + /* Checking Supplicant's extended capability BITS with driver advertised mask. + */ + if ((~ext_cap_mask[i] & ext_capab_ie[i]) && !(~ext_cap_mask[i] & sdev->fw_ext_cap_ie[i])) { + set_ext_cap = true; + sdev->fw_ext_cap_ie[i] = sdev->fw_ext_cap_ie[i] | ext_capab_ie[i]; + } + } + if (set_ext_cap) + r = slsi_mlme_set_ext_capab(sdev, dev, sdev->fw_ext_cap_ie, sdev->fw_ext_cap_ie_len); + } + return r; +} + static bool slsi_search_ies_for_qos_indicators(struct slsi_dev *sdev, u8 *ies, int ies_len) { SLSI_UNUSED_PARAMETER_NOT_DEBUG(sdev); @@ -2854,6 +2893,15 @@ int slsi_handle_disconnect(struct slsi_dev *sdev, struct net_device *dev, u8 *pe memset(&ndev_vif->enhanced_arp_stats, 0, sizeof(ndev_vif->enhanced_arp_stats)); ndev_vif->enhanced_arp_detect_enabled = false; #endif + +#ifdef CONFIG_SCSC_WLAN_WES_NCHO + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + sdev->device_config.ncho_mode = 0; + sdev->device_config.roam_scan_mode = 0; + sdev->device_config.dfs_scan_mode = 0; + sdev->device_config.dfs_scan_mode = 0; + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); +#endif slsi_mlme_del_vif(sdev, dev); slsi_vif_deactivated(sdev, dev); break; @@ -2868,10 +2916,12 @@ int slsi_handle_disconnect(struct slsi_dev *sdev, struct net_device *dev, u8 *pe goto exit; } - SLSI_NET_DBG3(dev, SLSI_MLME, "MAC:%pM\n", peer_address); + SLSI_NET_DBG3(dev, SLSI_MLME, "MAC:%pM is_wps:%d Peer State = %d\n", peer_address, peer->is_wps, peer->connected_state); slsi_fill_last_disconnected_sta_info(sdev, dev, peer_address, reason); slsi_ps_port_control(sdev, dev, peer, SLSI_STA_CONN_STATE_DISCONNECTED); - if ((peer->connected_state == SLSI_STA_CONN_STATE_CONNECTED) || (peer->connected_state == SLSI_STA_CONN_STATE_DOING_KEY_CONFIG)) + if (((peer->connected_state == SLSI_STA_CONN_STATE_CONNECTED) || + (peer->connected_state == SLSI_STA_CONN_STATE_DOING_KEY_CONFIG)) && + !(peer->is_wps)) cfg80211_del_sta(dev, peer->address, GFP_KERNEL); slsi_spinlock_lock(&ndev_vif->peer_lock); diff --git a/drivers/net/wireless/scsc/mgt.h b/drivers/net/wireless/scsc/mgt.h index c30998162..0429d5ff1 100755 --- a/drivers/net/wireless/scsc/mgt.h +++ b/drivers/net/wireless/scsc/mgt.h @@ -466,6 +466,7 @@ void slsi_vif_deactivated(struct slsi_dev *sdev, struct net_device *dev); int slsi_handle_disconnect(struct slsi_dev *sdev, struct net_device *dev, u8 *peer_address, u16 reason, u8 *disassoc_rsp_ie, u32 disassoc_rsp_ie_len); int slsi_band_update(struct slsi_dev *sdev, int band); +void slsi_band_cfg_update(struct slsi_dev *sdev, int band); int slsi_ip_address_changed(struct slsi_dev *sdev, struct net_device *dev, __be32 ipaddress); int slsi_send_gratuitous_arp(struct slsi_dev *sdev, struct net_device *dev); struct ieee80211_channel *slsi_find_scan_channel(struct slsi_dev *sdev, struct ieee80211_mgmt *mgmt, size_t mgmt_len, u16 freq); @@ -556,6 +557,7 @@ void slsi_vif_cleanup(struct slsi_dev *sdev, struct net_device *dev, bool hw_ava void slsi_scan_cleanup(struct slsi_dev *sdev, struct net_device *dev); void slsi_dump_stats(struct net_device *dev); int slsi_send_hanged_vendor_event(struct slsi_dev *sdev, u16 scsc_panic_code); +int slsi_set_ext_cap(struct slsi_dev *sdev, struct net_device *dev, const u8 *ies, int ie_len, const u8 *ext_cap_mask); void slsi_update_supported_channels_regd_flags(struct slsi_dev *sdev); #ifdef CONFIG_SCSC_WLAN_HANG_TEST int slsi_test_send_hanged_vendor_event(struct net_device *dev); diff --git a/drivers/net/wireless/scsc/mib.h b/drivers/net/wireless/scsc/mib.h index 5004b6e6a..a1cf0c5f2 100755 --- a/drivers/net/wireless/scsc/mib.h +++ b/drivers/net/wireless/scsc/mib.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2014 - 2019 Samsung Electronics Co., Ltd. All rights reserved + * Copyright (c) 2014 - 2020 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ @@ -416,9 +416,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DESCRIPTION : * This counter shall increment when a frame is received with the WEP * subfield of the Frame Control field set to one and the WEPOn value for - * the key mapped to the transmitter's MAC address indicates that the - * frame should not have been encrypted or that frame is discarded due to - * the receiving STA not implementing the privacy option. + * the key mapped to the transmitter's MAC address indicates that the frame + * should not have been encrypted or that frame is discarded due to the + * receiving STA not implementing the privacy option. *******************************************************************************/ #define SLSI_PSID_DOT11_WEP_UNDECRYPTABLE_COUNT 0x0099 @@ -431,8 +431,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 300 * DEFAULT : * DESCRIPTION : - * Printable string used to identify the manufacturer's product version - * of the resource. + * Printable string used to identify the manufacturer's product version of + * the resource. *******************************************************************************/ #define SLSI_PSID_DOT11_MANUFACTURER_PRODUCT_VERSION 0x00B7 @@ -770,6 +770,55 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_FIRMWARE_PATCH_BUILD_ID 0x07E7 +/******************************************************************************* + * NAME : UnifiMaxNumAntennaToUse + * PSID : 2025 (0x07E9) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 0X0202 + * DESCRIPTION : + * Specify the maximum number of antenna that will be used for each band. + * Lower 8 bits = 2GHz, Higher 8 bits = 5Ghz. Limited by maximum supported + * by underlying hardware. WARNING: Changing this value after system + * start-up will have no effect. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_MAX_NUM_ANTENNA_TO_USE 0x07E9 + +/******************************************************************************* + * NAME : UnifiHtCapabilities5g + * PSID : 2026 (0x07EA) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 21 + * MAX : 21 + * DEFAULT : { 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00 } + * DESCRIPTION : + * This should only be set to 0. It is only required if 5G and 2G require + * different capabilities. Has the same format as unifiHtCapabilities. Any + * non-zero values must be set in HTF files only. HT capabilities of the + * chip. See SC-503520-SP for further details. NOTE: Greenfield has been + * disabled due to interoperability issues wuth SGI. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_HT_CAPABILITIES5G 0x07EA + +/******************************************************************************* + * NAME : UnifiVhtCapabilities5g + * PSID : 2027 (0x07EB) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 12 + * MAX : 12 + * DEFAULT : { 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00 } + * DESCRIPTION : + * This should only be set to 0. It is only required if 5G and 2G require + * different capabilities. Has the same format as unifiVhtCapabilities. Any + * non-zero values must be set in HTF files only. VHT capabilities of the + * chip. see SC-503520-SP. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_VHT_CAPABILITIES5G 0x07EB + /******************************************************************************* * NAME : UnifiHtCapabilitiesSoftAp * PSID : 2028 (0x07EC) @@ -804,7 +853,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : 0X0730 + * DEFAULT : 0X1730 * DESCRIPTION : * The 16-bit field follows the coding of IEEE 802.11 Capability * Information. @@ -818,7 +867,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint8 * MIN : 9 * MAX : 9 - * DEFAULT : { 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X80 } + * DEFAULT : { 0X01, 0X00, 0X08, 0X00, 0X00, 0X00, 0X00, 0X40, 0X80 } * DESCRIPTION : * Extended capabilities. Bit field definition and coding follows IEEE * 802.11 Extended Capability Information Element, with spare subfields for @@ -835,8 +884,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 21 * DEFAULT : { 0XEF, 0X0A, 0X17, 0XFF, 0XFF, 0X00, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00 } * DESCRIPTION : - * HT capabilities of the chip. See SC-503520-SP for further details. NOTE: - * Greenfield has been disabled due to interoperability issues wuth SGI. + * Only applies to 2G connections. HT capabilities of the chip. See + * SC-503520-SP for further details. NOTE: Greenfield has been disabled due + * to interoperability issues wuth SGI. *******************************************************************************/ #define SLSI_PSID_UNIFI_HT_CAPABILITIES 0x07F0 @@ -917,7 +967,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint8 * MIN : 5 * MAX : 5 - * DEFAULT : { 0X71, 0X00, 0X00, 0X00, 0X04 } + * DEFAULT : { 0X73, 0X00, 0X00, 0X00, 0X04 } * DESCRIPTION : * RM Enabled capabilities of the chip. See SC-503520-SP for further * details. @@ -933,7 +983,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enables VHT mode. + * Activate VHT mode. *******************************************************************************/ #define SLSI_PSID_UNIFI_VHT_ACTIVATED 0x07FD @@ -946,7 +996,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enables HT mode. + * Activate HT mode. *******************************************************************************/ #define SLSI_PSID_UNIFI_HT_ACTIVATED 0x07FE @@ -965,7 +1015,22 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ENABLE_TWO_SIMULTANEOUS_PASSIVE_SCANS_SAME_BAND 0x07FF /******************************************************************************* - * NAME : UnifiRoamingEnabled + * NAME : UnifiRoamNchoCachedScanPeriod + * PSID : 2292 (0x08F4) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * MIN : 1 + * MAX : 4294967295 + * DEFAULT : 10000000 + * DESCRIPTION : + * Activate Roaming functionality + *******************************************************************************/ +/* TODO Autogen */ +#define SLSI_PSID_UNIFI_NCHO_CACHED_SCAN_PERIOD 0x08F4 + +/******************************************************************************* + + * NAME : UnifiRoamingActivated * PSID : 2049 (0x0801) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -973,25 +1038,26 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enable Roaming functionality + * Activate Roaming functionality *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAMING_ENABLED 0x0801 +#define SLSI_PSID_UNIFI_ROAMING_ACTIVATED 0x0801 /******************************************************************************* - * NAME : UnifiRssiRoamScanTrigger + * NAME : UnifiRoamRssiScanTrigger * PSID : 2050 (0x0802) * PER INTERFACE?: NO * TYPE : SlsiInt16 + * UNITS : dbm * MIN : -128 * MAX : 127 * DEFAULT : -75 * DESCRIPTION : * The RSSI value, in dBm, below which roaming scan shall start. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RSSI_ROAM_SCAN_TRIGGER 0x0802 +#define SLSI_PSID_UNIFI_ROAM_RSSI_SCAN_TRIGGER 0x0802 /******************************************************************************* - * NAME : UnifiRoamDeltaTrigger + * NAME : UnifiRoamCuScanTriggerHysteresis * PSID : 2051 (0x0803) * PER INTERFACE?: NO * TYPE : SlsiUint16 @@ -999,38 +1065,38 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 255 * DEFAULT : 10 * DESCRIPTION : - * Hysteresis value, in dBm, for UnifiRssiRoamScanTrigger and - * unifiCURoamScanTrigger. i.e.: If the current AP RSSI is greater than - * UnifiRssiRoamScanTrigger+ UnifiRssiRoamDeltaTrigger, soft roaming scan - * can be terminated. + * Hysteresis value that subtracted from unifiRoamCUScanTrigger will result + * in the CU value that will stop eventual CU scans. This is an SCSC + * addition to ensure scans are not started/ stopped in an excessive manner. *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_DELTA_TRIGGER 0x0803 +#define SLSI_PSID_UNIFI_ROAM_CU_SCAN_TRIGGER_HYSTERESIS 0x0803 /******************************************************************************* - * NAME : UnifiRoamCachedChannelScanPeriod + * NAME : UnifiRoamBackgroundScanPeriod * PSID : 2052 (0x0804) * PER INTERFACE?: NO - * TYPE : SlsiUint32 + * TYPE : SlsiUint16 + * UNITS : seconds * MIN : 1 - * MAX : 4294967295 - * DEFAULT : 20000000 + * MAX : 65535 + * DEFAULT : 120 * DESCRIPTION : - * The scan period for cached channels background roaming (microseconds) + * The background scan period for cached channels. *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_CACHED_CHANNEL_SCAN_PERIOD 0x0804 +#define SLSI_PSID_UNIFI_ROAM_BACKGROUND_SCAN_PERIOD 0x0804 /******************************************************************************* - * NAME : UnifiFullRoamScanPeriod + * NAME : UnifiRoamNchoFullScanPeriod * PSID : 2053 (0x0805) * PER INTERFACE?: NO * TYPE : SlsiUint32 * MIN : 1 * MAX : 4294967295 - * DEFAULT : 30000000 + * DEFAULT : 120000000 * DESCRIPTION : * NCHO: For certification and Host use only. *******************************************************************************/ -#define SLSI_PSID_UNIFI_FULL_ROAM_SCAN_PERIOD 0x0805 +#define SLSI_PSID_UNIFI_ROAM_NCHO_FULL_SCAN_PERIOD 0x0805 /******************************************************************************* * NAME : UnifiRoamSoftRoamingEnabled @@ -1039,10 +1105,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiBool * MIN : 0 * MAX : 1 - * DEFAULT : TRUE + * DEFAULT : * DESCRIPTION : - * Enables CASE_1 and CASE_2 scans. Host writes to the key, firmware reads - * it. See MFW-183 for details. + * Deprecated *******************************************************************************/ #define SLSI_PSID_UNIFI_ROAM_SOFT_ROAMING_ENABLED 0x0806 @@ -1060,6 +1125,22 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_ROAM_SCAN_BAND 0x0807 +/******************************************************************************* + * NAME : UnifiRoamCuRssiScanTriggerHysteresis + * PSID : 2056 (0x0808) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : dbm + * MIN : 1 + * MAX : 255 + * DEFAULT : 5 + * DESCRIPTION : + * Hysteresis value that added to unifiRoamCURssiScanTrigger will result in + * the RSSI value that will stop eventual CU scans. This is an SCSC addition + * to ensure scans are not started/ stopped in an excessive manner. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_CU_RSSI_SCAN_TRIGGER_HYSTERESIS 0x0808 + /******************************************************************************* * NAME : UnifiRoamScanMaxActiveChannelTime * PSID : 2057 (0x0809) @@ -1074,17 +1155,32 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_SCAN_MAX_ACTIVE_CHANNEL_TIME 0x0809 /******************************************************************************* - * NAME : UnifiRoamFullChannelScanFrequency + * NAME : UnifiRoamReScanPeriod * PSID : 2058 (0x080A) * PER INTERFACE?: NO * TYPE : SlsiUint16 + * UNITS : seconds * MIN : 1 * MAX : 65535 - * DEFAULT : 9 + * DEFAULT : 10 * DESCRIPTION : - * Every how many cached channel scans run a full channel scan. + * The scan period for re-scanning cached channels. *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_FULL_CHANNEL_SCAN_FREQUENCY 0x080A +#define SLSI_PSID_UNIFI_ROAM_RE_SCAN_PERIOD 0x080A + +/******************************************************************************* + * NAME : UnifiRoamInactiveScanPeriod + * PSID : 2059 (0x080B) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : seconds + * MIN : 1 + * MAX : 65535 + * DEFAULT : 10 + * DESCRIPTION : + * The scan period for the inactive scan. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_INACTIVE_SCAN_PERIOD 0x080B /******************************************************************************* * NAME : UnifiRoamMode @@ -1102,18 +1198,65 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_MODE 0x080C /******************************************************************************* - * NAME : UnifiRssiRoamScanNoCandidateDeltaTrigger - * PSID : 2064 (0x0810) + * NAME : UnifiRoamRssiScanTriggerReset + * PSID : 2061 (0x080D) + * PER INTERFACE?: NO + * TYPE : SlsiInt16 + * UNITS : dbm + * MIN : -128 + * MAX : 127 + * DEFAULT : -70 + * DESCRIPTION : + * The current channel Averaged RSSI value above which a RSSI triggered + * roaming scan shall stop, and the RSSI trigger shall be reset at its + * initial value. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_RSSI_SCAN_TRIGGER_RESET 0x080D + +/******************************************************************************* + * NAME : UnifiRoamRssiScanTriggerStep + * PSID : 2062 (0x080E) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * MIN : 1 - * MAX : 255 - * DEFAULT : 10 + * UNITS : dbm + * MIN : 0 + * MAX : 10 + * DEFAULT : 5 * DESCRIPTION : - * The value, in dBm, by which unifiRssiRoamScanTrigger is lowered when no - * roaming candidates are found. + * The delta to apply to unifiRoamRssiScanTrigger when no eligible candidate + * is found. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RSSI_ROAM_SCAN_NO_CANDIDATE_DELTA_TRIGGER 0x0810 +#define SLSI_PSID_UNIFI_ROAM_RSSI_SCAN_TRIGGER_STEP 0x080E + +/******************************************************************************* + * NAME : UnifiRoamIdleVariationRssi + * PSID : 2063 (0x080F) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : dBm + * MIN : 0 + * MAX : 100 + * DEFAULT : 5 + * DESCRIPTION : + * Defines the maximum RSSI variation of the current link allowed during + * idle roam. This parameter ensures the device is stationary. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_VARIATION_RSSI 0x080F + +/******************************************************************************* + * NAME : UnifiRoamIdleMinRssi + * PSID : 2064 (0x0810) + * PER INTERFACE?: NO + * TYPE : SlsiInt16 + * UNITS : dBm + * MIN : -127 + * MAX : 0 + * DEFAULT : -60 + * DESCRIPTION : + * Defines the minimum RSSI of the current link required to perform an idle + * roam. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_MIN_RSSI 0x0810 /******************************************************************************* * NAME : UnifiRoamEapTimeout @@ -1129,6 +1272,21 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_ROAM_EAP_TIMEOUT 0x0811 +/******************************************************************************* + * NAME : UnifiRoamIdleInactiveTime + * PSID : 2066 (0x0812) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : seconds + * MIN : 0 + * MAX : 100 + * DEFAULT : 10 + * DESCRIPTION : + * Defines the time interval during which the link needs to remain idle to + * perform an idle roam. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_INACTIVE_TIME 0x0812 + /******************************************************************************* * NAME : UnifiRoamScanControl * PSID : 2067 (0x0813) @@ -1181,6 +1339,20 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_ROAM_SCAN_HOME_AWAY_TIME 0x0816 +/******************************************************************************* + * NAME : UnifiRoamIdleInactiveCount + * PSID : 2071 (0x0817) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : number_of_packets + * MIN : 0 + * MAX : 100 + * DEFAULT : 5 + * DESCRIPTION : + * The number of packets over which the link is considered not idle. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_INACTIVE_COUNT 0x0817 + /******************************************************************************* * NAME : UnifiRoamScanNProbe * PSID : 2072 (0x0818) @@ -1195,6 +1367,51 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_SCAN_NPROBE 0x0818 /******************************************************************************* + * NAME : UnifiRoamIdleBand + * PSID : 2073 (0x0819) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 3 + * DEFAULT : 1 + * DESCRIPTION : + * Specifies when connected on which band to run the Idle Roaming algorithm. + * 0 for None. 1 for 2.4GHz. 2 for 5GHz. 3 for All. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_BAND 0x0819 + +/******************************************************************************* + * NAME : UnifiRoamIdleApSelectDeltaFactor + * PSID : 2074 (0x081A) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 100 + * DEFAULT : 1 + * DESCRIPTION : + * Delta value applied to the score of the currently connected AP to + * determine candidates' eligibility threshold for Idle period triggered + * roaming scans. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_IDLE_AP_SELECT_DELTA_FACTOR 0x081A + +/******************************************************************************* + * NAME : UnifiRoamNchoRssiDelta + * PSID : 2075 (0x081B) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 127 + * DEFAULT : 10 + * DESCRIPTION : + * Delta value applied to the score of the currently connected AP to + * determine candidates' eligibility threshold for Idle period triggered + * roaming scans. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_DELDA 0x081B + + /******************************************************************************* + * NAME : UnifiApOlbcDuration * PSID : 2076 (0x081C) * PER INTERFACE?: NO @@ -1226,7 +1443,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_AP_OLBC_INTERVAL 0x081D /******************************************************************************* - * NAME : UnifiMlmednsSupportEnabled + * NAME : UnifiDnsSupportActivated * PSID : 2078 (0x081E) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -1234,9 +1451,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * This MIB enables support for transmitting DNS frame via MLME. + * This MIB activates support for transmitting DNS frame via MLME. *******************************************************************************/ -#define SLSI_PSID_UNIFI_MLMEDNS_SUPPORT_ENABLED 0x081E +#define SLSI_PSID_UNIFI_DNS_SUPPORT_ACTIVATED 0x081E /******************************************************************************* * NAME : UnifiOffchannelScheduleTimeout @@ -1261,8 +1478,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 500 * DEFAULT : 200 * DESCRIPTION : - * Timeout, in TU, to wait for a frame(Auth, Assoc, ReAssoc) after Rame - * replies to a send frame request + * Timeout, in TU, to wait for a frame(Auth, Assoc, ReAssoc) after TX Cfm + * trasnmission_status == Successful. *******************************************************************************/ #define SLSI_PSID_UNIFI_FRAME_RESPONSE_TIMEOUT 0x0820 @@ -1318,10 +1535,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : 10 + * DEFAULT : * DESCRIPTION : - * Timeout, in TU, to wait to retry a frame (Auth, Assoc, ReAssoc) after TX - * Cfm trasnmission_status = TxLifetime. + * Deprecated *******************************************************************************/ #define SLSI_PSID_UNIFI_FRAME_RESPONSE_CFM_TX_LIFETIME_TIMEOUT 0x0824 @@ -1334,8 +1550,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 65535 * DEFAULT : 40 * DESCRIPTION : - * Timeout, in TU, to wait to retry a frame (Auth, Assoc, ReAssoc) after TX - * Cfm trasnmission_status != Successful | TxLifetime. + * Timeout, in TU, to wait to retry a frame after TX Cfm trasnmission_status + * != Successful. *******************************************************************************/ #define SLSI_PSID_UNIFI_FRAME_RESPONSE_CFM_FAILURE_TIMEOUT 0x0825 @@ -1408,6 +1624,20 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_HOST_NUM_ANTENNA_CONTROL_ACTIVATED 0x082B /******************************************************************************* + * NAME : UnifiRoamNchoRssiTrigger + * PSID : 2092 (0x082C) + * PER INTERFACE?: NO + * TYPE : SlsiInt16 + * MIN : -128 + * MAX : 127 + * DEFAULT : -75 + * DESCRIPTION : + * Host has a control of number of antenna to use + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_NCHO_RSSI_TRIGGER 0x082C + + /******************************************************************************* + * NAME : UnifiPeerBandwidth * PSID : 2094 (0x082E) * PER INTERFACE?: NO @@ -1429,7 +1659,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 65535 * DEFAULT : * DESCRIPTION : - * The number of spatial streams used with peer station prior it disconnects + * The number of spatial streams used with peer station prior it + * disconnects: BIG DATA *******************************************************************************/ #define SLSI_PSID_UNIFI_CURRENT_PEER_NSS 0x082F @@ -1536,22 +1767,6 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_UART_PIOS 0x083F -/******************************************************************************* - * NAME : UnifiClockFrequency - * PSID : 2140 (0x085C) - * PER INTERFACE?: NO - * TYPE : SlsiUint16 - * UNITS : kHz - * MIN : 0 - * MAX : 65535 - * DEFAULT : - * DESCRIPTION : - * Query the nominal frequency of the external clock source or crystal - * oscillator used by UniFi. The clock frequency is a system parameter and - * can not be modified by key. - *******************************************************************************/ -#define SLSI_PSID_UNIFI_CLOCK_FREQUENCY 0x085C - /******************************************************************************* * NAME : UnifiCrystalFrequencyTrim * PSID : 2141 (0x085D) @@ -1562,9 +1777,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : 31 * DESCRIPTION : * The IEEE 802.11 standard requires a frequency accuracy of either +/- 20 - * ppm or +/- 25 ppm depending on the physical layer being used. If - * UniFi's frequency reference is a crystal then this attribute should - * be used to tweak the oscillating frequency to compensate for design- or + * ppm or +/- 25 ppm depending on the physical layer being used. If UniFi's + * frequency reference is a crystal then this attribute should be used to + * tweak the oscillating frequency to compensate for design- or * device-specific variations. Each step change trims the frequency by * approximately 2 ppm. *******************************************************************************/ @@ -1676,7 +1891,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * To enable / disable, override STA edca config parameters with + * Activate override of STA edca config parameters with * unifiOverrideEDCAParam. default: True - for volcano, and False - for * others *******************************************************************************/ @@ -1691,7 +1906,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 255 * DEFAULT : * DESCRIPTION : - * EDCA Parameters to be used if unifiOverrideEDCAParamEnable is true, + * EDCA Parameters to be used if unifiOverrideEDCAParamActivated is true, * indexed by unifiAccessClassIndex octet 0 - AIFSN octet 1 - [7:4] ECW MAX * [3:0] ECW MIN octet 2 ~ 3 - TXOP[7:0] TXOP[15:8] in 32 usec units for * both non-HT and HT connections. @@ -1765,13 +1980,13 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : * DESCRIPTION : * Running average of the Received Signal Strength Indication (RSSI) for - * packets received by UniFi's radio. The value should only be treated - * as an indication of the signal strength; it is not an accurate - * measurement. The result is only meaningful if the unifiRxExternalGain - * attribute is set to the correct calibration value. If UniFi is part of a - * BSS, only frames originating from devices in the BSS are reported (so far - * as this can be determined). The average is reset when UniFi joins or - * starts a BSS or is reset. + * packets received by UniFi's radio. The value should only be treated as an + * indication of the signal strength; it is not an accurate measurement. The + * result is only meaningful if the unifiRxExternalGain attribute is set to + * the correct calibration value. If UniFi is part of a BSS, only frames + * originating from devices in the BSS are reported (so far as this can be + * determined). The average is reset when UniFi joins or starts a BSS or is + * reset. *******************************************************************************/ #define SLSI_PSID_UNIFI_RSSI 0x0898 @@ -1798,7 +2013,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : * DESCRIPTION : * Provides a running average of the Signal to Noise Ratio (dB) for packets - * received by UniFi's radio. + * received by UniFi's radio. *******************************************************************************/ #define SLSI_PSID_UNIFI_SNR 0x089A @@ -2246,7 +2461,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enables Vendor VHT IE for 256-QAM mode on 2.4GHz. + * Activate Vendor VHT IE for 256-QAM mode on 2.4GHz. *******************************************************************************/ #define SLSI_PSID_UNIFI_TQAM_ACTIVATED 0x08BB @@ -2330,7 +2545,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enable feature support for Enhanced ARP Detect. This is required by + * Activate feature support for Enhanced ARP Detect. This is required by * Volcano. *******************************************************************************/ #define SLSI_PSID_UNIFI_ARP_DETECT_ACTIVATED 0x08C6 @@ -2561,7 +2776,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2270 (0x08DE) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 128 @@ -2571,6 +2786,35 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_MAC_BEACON_TIMEOUT 0x08DE +/******************************************************************************* + * NAME : UnifiMifOffAllowed + * PSID : 2271 (0x08DF) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : TRUE + * DESCRIPTION : + * Allow MIF to be turned off. If set to TRUE, it will prevent MIF to be + * turned off while WLAN is running. Disabling the mib will prevent to enter + * idle mode lite or idle mode medium + *******************************************************************************/ +#define SLSI_PSID_UNIFI_MIF_OFF_ALLOWED 0x08DF + +/******************************************************************************* + * NAME : UnifiBlockScanAfterNumSchedVif + * PSID : 2272 (0x08E0) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : + * DESCRIPTION : + * Block Scan requests from having medium time after a specified amount of + * sync VIFs are schedulable. A value of 0 disables the functionality. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_BLOCK_SCAN_AFTER_NUM_SCHED_VIF 0x08E0 + /******************************************************************************* * NAME : UnifiStaUsesOneAntennaWhenIdle * PSID : 2274 (0x08E2) @@ -2701,45 +2945,20 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_DEAUTH_REASON 0x08F6 /******************************************************************************* - * NAME : UnifiCuRoamfactor + * NAME : UnifiRoamCuFactor * PSID : 2295 (0x08F7) * PER INTERFACE?: NO - * TYPE : SlsiUint16 + * TYPE : SlsiUint8 * MIN : 0 * MAX : 65535 * DEFAULT : * DESCRIPTION : - * Table allocating CUfactor to Channel Utilisation values range. + * Bi dimensional octet string table for allocating CUfactor to CU values. + * First index is the radio band, and the second will be CU table entry. The + * tables define the maximum CU value to which the values do apply(MAX CU), + * an OFFSET and an A value for the equation: CUfactor = OFFSET - A*(CU)/10 *******************************************************************************/ -#define SLSI_PSID_UNIFI_CU_ROAMFACTOR 0x08F7 - -/******************************************************************************* - * NAME : UnifiRoamCuHighLowPoints - * PSID : 2296 (0x08F8) - * PER INTERFACE?: NO - * TYPE : SlsiUint16 - * MIN : 0 - * MAX : 65535 - * DEFAULT : - * DESCRIPTION : - * Table allocating the high and low points for computing the linear - * CUfactor. - *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_CU_HIGH_LOW_POINTS 0x08F8 - -/******************************************************************************* - * NAME : UnifiRoamRssiHighLowPoints - * PSID : 2297 (0x08F9) - * PER INTERFACE?: NO - * TYPE : SlsiInt16 - * MIN : -32768 - * MAX : 32767 - * DEFAULT : - * DESCRIPTION : - * Table allocating the high and low points for computing the linear RSSI - * factor. - *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_RSSI_HIGH_LOW_POINTS 0x08F9 +#define SLSI_PSID_UNIFI_ROAM_CU_FACTOR 0x08F7 /******************************************************************************* * NAME : UnifiRoamRssiBoost @@ -2755,17 +2974,18 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_RSSI_BOOST 0x08FA /******************************************************************************* - * NAME : UnifiRoamTrackingScanPeriod + * NAME : UnifiRoamTargetRssiBeaconLost * PSID : 2299 (0x08FB) * PER INTERFACE?: NO - * TYPE : SlsiUint32 - * MIN : 1 - * MAX : 4294967295 - * DEFAULT : 5000000 + * TYPE : SlsiInt16 + * MIN : -127 + * MAX : 32767 + * DEFAULT : -70 * DESCRIPTION : - * The scan period for tracking not yet suitable candidate(s)(microseconds) + * RSSI threshold under which candidate APs are not deemed eligible for + * Beacon Lost scans. *******************************************************************************/ -#define SLSI_PSID_UNIFI_ROAM_TRACKING_SCAN_PERIOD 0x08FB +#define SLSI_PSID_UNIFI_ROAM_TARGET_RSSI_BEACON_LOST 0x08FB /******************************************************************************* * NAME : UnifiRoamCuLocal @@ -2782,19 +3002,18 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_CU_LOCAL 0x08FC /******************************************************************************* - * NAME : UnifiCuRoamScanNoCandidateDeltaTrigger + * NAME : UnifiRoamTargetRssiEmergency * PSID : 2301 (0x08FD) * PER INTERFACE?: NO - * TYPE : SlsiUint16 - * MIN : 0 - * MAX : 100 - * DEFAULT : 15 + * TYPE : SlsiInt16 + * MIN : -127 + * MAX : 32767 + * DEFAULT : -70 * DESCRIPTION : - * The delta, in percentage points, to apply to unifiCuRoamScanTrigger when - * no candidate found during first cycle of cached channel soft scan, - * triggered by channel utilization. + * RSSI threshold under which candidate APs are not deemed eligible for + * emergency roaming scans. *******************************************************************************/ -#define SLSI_PSID_UNIFI_CU_ROAM_SCAN_NO_CANDIDATE_DELTA_TRIGGER 0x08FD +#define SLSI_PSID_UNIFI_ROAM_TARGET_RSSI_EMERGENCY 0x08FD /******************************************************************************* * NAME : UnifiRoamApSelectDeltaFactor @@ -2812,46 +3031,61 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_ROAM_AP_SELECT_DELTA_FACTOR 0x08FE /******************************************************************************* - * NAME : UnifiCuRoamweight + * NAME : UnifiRoamCuWeight * PSID : 2303 (0x08FF) * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 * MAX : 100 - * DEFAULT : 30 + * DEFAULT : 35 * DESCRIPTION : * Weight of CUfactor, in percentage points, in AP selection algorithm. *******************************************************************************/ -#define SLSI_PSID_UNIFI_CU_ROAMWEIGHT 0x08FF +#define SLSI_PSID_UNIFI_ROAM_CU_WEIGHT 0x08FF /******************************************************************************* - * NAME : UnifiRssiRoamweight + * NAME : UnifiRoamBtmApSelectDeltaFactor + * PSID : 2304 (0x0900) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 100 + * DEFAULT : + * DESCRIPTION : + * Delta value applied to the score of the currently connected AP to + * determine candidates' eligibility threshold for BTM triggered roaming + * scans + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ROAM_BTM_AP_SELECT_DELTA_FACTOR 0x0900 + +/******************************************************************************* + * NAME : UnifiRoamRssiweight * PSID : 2305 (0x0901) * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 * MAX : 100 - * DEFAULT : 70 + * DEFAULT : 65 * DESCRIPTION : * Weight of RSSI factor, in percentage points, in AP selection algorithm. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RSSI_ROAMWEIGHT 0x0901 +#define SLSI_PSID_UNIFI_ROAM_RSSIWEIGHT 0x0901 /******************************************************************************* - * NAME : UnifiRssiRoamfactor + * NAME : UnifiRoamRssiFactor * PSID : 2306 (0x0902) * PER INTERFACE?: NO - * TYPE : SlsiUint16 + * TYPE : SlsiUint8 * MIN : 0 * MAX : 65535 * DEFAULT : * DESCRIPTION : * Table allocating RSSIfactor to RSSI values range. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RSSI_ROAMFACTOR 0x0902 +#define SLSI_PSID_UNIFI_ROAM_RSSI_FACTOR 0x0902 /******************************************************************************* - * NAME : UnifiRssicuRoamScanTrigger + * NAME : UnifiRoamCuRssiScanTrigger * PSID : 2307 (0x0903) * PER INTERFACE?: NO * TYPE : SlsiInt16 @@ -2861,12 +3095,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DESCRIPTION : * The current channel Averaged RSSI value below which a soft roaming scan * shall initially start, providing high channel utilisation (see - * unifiCURoamScanTrigger). This is a table indexed by frequency band. + * unifiRoamCUScanTrigger). This is a table indexed by frequency band. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RSSICU_ROAM_SCAN_TRIGGER 0x0903 +#define SLSI_PSID_UNIFI_ROAM_CU_RSSI_SCAN_TRIGGER 0x0903 /******************************************************************************* - * NAME : UnifiCuRoamScanTrigger + * NAME : UnifiRoamCuScanTrigger * PSID : 2308 (0x0904) * PER INTERFACE?: NO * TYPE : SlsiUint16 @@ -2874,10 +3108,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 65535 * DEFAULT : * DESCRIPTION : - * BSS Load / Channel Utilisation doesn't need to be monitored more than - * every 10th Beacons. This is a table indexed by frequency band. + * BSS Load / Channel Utilisation trigger above which a soft roaming scan + * shall initially start. This is a table indexed by frequency band. *******************************************************************************/ -#define SLSI_PSID_UNIFI_CU_ROAM_SCAN_TRIGGER 0x0904 +#define SLSI_PSID_UNIFI_ROAM_CU_SCAN_TRIGGER 0x0904 /******************************************************************************* * NAME : UnifiRoamBssLoadMonitoringFrequency @@ -2885,10 +3119,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 - * MAX : 100 - * DEFAULT : 10 + * MAX : 1000 + * DEFAULT : 100 * DESCRIPTION : - * How often, in reveived beacons, should the BSS load be monitored? - used + * How often, in received beacons, should the BSS load be monitored? - used * for roaming *******************************************************************************/ #define SLSI_PSID_UNIFI_ROAM_BSS_LOAD_MONITORING_FREQUENCY 0x0905 @@ -2929,8 +3163,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 255 * DEFAULT : * DESCRIPTION : - * specifies current AP antenna mode: 0 = SISO, 1 = MIMO (2x2), 2 = MIMO - * (3x3), 3 = MIMO (4x4) + * Specifies current AP antenna mode: BIG DATA 0 = SISO, 1 = MIMO (2x2), 2 = + * MIMO (3x3), 3 = MIMO (4x4) *******************************************************************************/ #define SLSI_PSID_UNIFI_CURRENT_BSS_NSS 0x0908 @@ -3043,13 +3277,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enable reporting of the fate of the TX packets sent by the host.This mib - * value will be updated if "unifiRameUpdateMibs" mib is toggled + * Enable reporting of the fate of the TX packets sent by the host. *******************************************************************************/ #define SLSI_PSID_UNIFI_MA_PACKET_FATE_ENABLED 0x0911 /******************************************************************************* - * NAME : unifiStaVifLinkNss + * NAME : UnifiStaVifLinkNss * PSID : 2324 (0x0914) * PER INTERFACE?: NO * TYPE : unifiAntennaMode @@ -3057,11 +3290,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 255 * DEFAULT : * DESCRIPTION : - * Sta Vif (Not P2P) while connected to an AP. - * Specifies the max number of NSS that the link can use : 0 = SISO, 1 = MIMO (2x2), 2 = MIMO - * (3x3), 3 = MIMO (4x4) + * STA Vif (Not P2P) while connected to an AP and does not apply to TDLS + * links. Specifies the max number of NSS that the link can use 0 = SISO, 1 + * = MIMO (2x2), 2 = MIMO (3x3), 3 = MIMO (4x4) *******************************************************************************/ -/* TODO : MIB autogen */ #define SLSI_PSID_UNIFI_STA_VIF_LINK_NSS 0x0914 /******************************************************************************* @@ -3269,6 +3501,22 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_LAA_PROTECTION_CONFIG_OVERRIDE 0x0934 +/******************************************************************************* + * NAME : UnifiLaaSpeculationMaxTime + * PSID : 2357 (0x0935) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 5000 + * DESCRIPTION : + * For Link Adaptation Algorithm. It defines the maximum time interval (in + * milliseconds) between speculating. So if the interval is being scaled due + * to not being scheduled all the time, the speculation interval will not + * exceed this value, even when backing off. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LAA_SPECULATION_MAX_TIME 0x0935 + /******************************************************************************* * NAME : UnifiRateStatsRtsErrorCount * PSID : 2358 (0x0936) @@ -3287,7 +3535,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2362 (0x093A) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 12 @@ -3395,9 +3643,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * Test only: Force channel bandwidth to specified value. This can also be * used to allow emulator/silicon back to back connection to communicate at * bandwidth other than default (20 MHz) Setting it to 0 uses the default - * bandwidth as selected by firmware channel_bw_20_mhz = 20, - * channel_bw_40_mhz = 40, channel_bw_80_mhz = 80 This mib value will be - * updated if "unifiRameUpdateMibs" mib is toggled + * bandwidth as selected by firmware. The change will be applied at next + * radio state change opportunity channel_bw_20_mhz = 20, channel_bw_40_mhz + * = 40, channel_bw_80_mhz = 80 *******************************************************************************/ #define SLSI_PSID_UNIFI_FORCE_CHANNEL_BW 0x0942 @@ -3572,19 +3820,18 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_LTE_ENABLE_LTE_COEX 0x0983 /******************************************************************************* - * NAME : UnifiLteBand40PowerBackoffChannelMask + * NAME : UnifiLteBand40PowerBackoffChannels * PSID : 2436 (0x0984) * PER INTERFACE?: NO - * TYPE : SlsiUint16 - * MIN : 0 - * MAX : 65535 - * DEFAULT : 3 + * TYPE : SlsiUint8 + * MIN : 2 + * MAX : 2 + * DEFAULT : { 0X01, 0X02 } * DESCRIPTION : - * Channel Mask defining channels on which to apply power backoff when LTE - * operating on Band40. Defined as a 16 bit bitmask, as only 2G4 channels - * are impacted by this feature. + * Defines channels to which power backoff shall be applied when LTE + * operating on Band40. *******************************************************************************/ -#define SLSI_PSID_UNIFI_LTE_BAND40_POWER_BACKOFF_CHANNEL_MASK 0x0984 +#define SLSI_PSID_UNIFI_LTE_BAND40_POWER_BACKOFF_CHANNELS 0x0984 /******************************************************************************* * NAME : UnifiLteBand40PowerBackoffRsrpLow @@ -3672,6 +3919,98 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_LTE_SET_TDD_DEBUG_MODE 0x098A +/******************************************************************************* + * NAME : UnifiLteBand40AvoidChannels + * PSID : 2443 (0x098B) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 2 + * MAX : 2 + * DEFAULT : { 0X01, 0X05 } + * DESCRIPTION : + * MIB to define WLAN channels to avoid when LTE Band 40 in use. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND40_AVOID_CHANNELS 0x098B + +/******************************************************************************* + * NAME : UnifiLteBand41AvoidChannels + * PSID : 2444 (0x098C) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 2 + * MAX : 2 + * DEFAULT : { 0X04, 0X0D } + * DESCRIPTION : + * MIB to define WLAN channels to avoid when LTE Band 41 in use. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND41_AVOID_CHANNELS 0x098C + +/******************************************************************************* + * NAME : UnifiLteBand7AvoidChannels + * PSID : 2445 (0x098D) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 2 + * MAX : 2 + * DEFAULT : { 0X09, 0X0D } + * DESCRIPTION : + * MIB to define WLAN channels to avoid when LTE Band 7 in use. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND7_AVOID_CHANNELS 0x098D + +/******************************************************************************* + * NAME : UnifiLteBand40FreqThreshold + * PSID : 2446 (0x098E) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 2350 + * MAX : 2400 + * DEFAULT : 2380 + * DESCRIPTION : + * MIB describing the Band 40 Frequency Threshold + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND40_FREQ_THRESHOLD 0x098E + +/******************************************************************************* + * NAME : UnifiLteBand41FreqThreshold + * PSID : 2447 (0x098F) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 2496 + * MAX : 2546 + * DEFAULT : 2500 + * DESCRIPTION : + * MIB describing the Band 41 Frequency Threshold + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND41_FREQ_THRESHOLD 0x098F + +/******************************************************************************* + * NAME : UnifiLteBand79FreqThreshold + * PSID : 2448 (0x0990) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 4950 + * MAX : 5000 + * DEFAULT : 5000 + * DESCRIPTION : + * MIB describing the Band 79 Frequency Threshold + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND79_FREQ_THRESHOLD 0x0990 + +/******************************************************************************* + * NAME : UnifiLteBand41PowerBackoffChannels + * PSID : 2449 (0x0991) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 2 + * MAX : 2 + * DEFAULT : { 0X0C, 0X02 } + * DESCRIPTION : + * Defines channels to which power backoff shall be applied when LTE + * operating on Band41. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LTE_BAND41_POWER_BACKOFF_CHANNELS 0x0991 + /******************************************************************************* * NAME : UnifiApScanAbsenceDuration * PSID : 2480 (0x09B0) @@ -3680,7 +4019,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * UNITS : beacon intervals * MIN : 0 * MAX : 65535 - * DEFAULT : 7 + * DEFAULT : 1 * DESCRIPTION : * Duration of the Absence time to use when protecting AP VIFs from scan * operations. A value of 0 disables the feature. @@ -3695,7 +4034,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * UNITS : beacon intervals * MIN : 0 * MAX : 65535 - * DEFAULT : 14 + * DEFAULT : 4 * DESCRIPTION : * Period of the Absence/Presence times cycles to use when protecting AP * VIFs from scan operations. @@ -3759,6 +4098,42 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_BSS_MAX_IDLE_PERIOD 0x09B8 +/******************************************************************************* + * NAME : UnifiStaIdleModeEnabled + * PSID : 2493 (0x09BD) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : TRUE + * DESCRIPTION : + * Enables STA Idle mode, if single vif station is active and there has been + * no activity for a time. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_STA_IDLE_MODE_ENABLED 0x09BD + +/******************************************************************************* + * NAME : UnifiFastPowerSaveTimeoutAggressive + * PSID : 2494 (0x09BE) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * UNITS : µs + * MIN : 0 + * MAX : 2147483647 + * DEFAULT : 20000 + * DESCRIPTION : + * UniFi implements a proprietary power management mode called Fast Power + * Save that balances network performance against power consumption. In this + * mode UniFi delays entering power save mode until it detects that there + * has been no exchange of data for the duration of time specified. The + * unifiFastPowerSaveTimeOutAggressive aims to improve the power consumption + * by setting a aggressive time when channel is not busy for the Fast Power + * Save Timeout. If set with a value above unifiFastPowerSaveTimeOut it will + * default to unifiFastPowerSaveTimeOut. Setting it to zero disables the + * feature + *******************************************************************************/ +#define SLSI_PSID_UNIFI_FAST_POWER_SAVE_TIMEOUT_AGGRESSIVE 0x09BE + /******************************************************************************* * NAME : UnifiIdlemodeListenIntervalSkippingDtim * PSID : 2495 (0x09BF) @@ -3813,8 +4188,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * Enables AP Idle mode which can transmit beacons in MIFLess mode, if * softAP is active, and there has been no activity for a time. This mib has * priority over unifiIdleModeLiteEnabled. If unifiAPIdleEnabled is enabled, - * Idle Mode Lite won't be activated. This mib value will be runtime - * (post-wlan enable) applied only if "unifiRameUpdateMibs" mib is toggled + * Idle Mode Lite won't be activated. *******************************************************************************/ #define SLSI_PSID_UNIFI_AP_IDLE_MODE_ENABLED 0x09C1 @@ -3823,7 +4197,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2500 (0x09C4) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 400000 @@ -3841,10 +4215,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2501 (0x09C5) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 - * DEFAULT : 200000 + * DEFAULT : 50000 * DESCRIPTION : * UniFi implements a proprietary power management mode called Fast Power * Save that balances network performance against power consumption. In this @@ -3934,7 +4308,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2507 (0x09CB) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 0XFFFF @@ -3952,7 +4326,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_AP_BEACON_MAX_DRIFT 0x09CB /******************************************************************************* - * NAME : UnifiBssMaxIdlePeriodEnabled + * NAME : UnifiBssMaxIdlePeriodActivated * PSID : 2508 (0x09CC) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -3963,7 +4337,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * If set STA will configure keep-alive with options specified in a received * BSS max idle period IE *******************************************************************************/ -#define SLSI_PSID_UNIFI_BSS_MAX_IDLE_PERIOD_ENABLED 0x09CC +#define SLSI_PSID_UNIFI_BSS_MAX_IDLE_PERIOD_ACTIVATED 0x09CC /******************************************************************************* * NAME : UnifiVifIdleMonitorTime @@ -4034,7 +4408,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_STATION_ACTIVITY_IDLE_TIME 0x09D0 /******************************************************************************* - * NAME : UnifiDmsEnabled + * NAME : UnifiDmsActivated * PSID : 2513 (0x09D1) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -4042,16 +4416,16 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enables Directed Multicast Service (DMS) + * Activate Directed Multicast Service (DMS) *******************************************************************************/ -#define SLSI_PSID_UNIFI_DMS_ENABLED 0x09D1 +#define SLSI_PSID_UNIFI_DMS_ACTIVATED 0x09D1 /******************************************************************************* * NAME : UnifiPowerManagementDelayTimeout * PSID : 2514 (0x09D2) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 30000 @@ -4074,7 +4448,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2515 (0x09D3) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 20000 @@ -4098,7 +4472,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2516 (0x09D4) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 10000 @@ -4173,7 +4547,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2520 (0x09D8) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 15000 @@ -4252,7 +4626,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2524 (0x09DC) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : @@ -4282,8 +4656,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DESCRIPTION : * Enables Idle Mode Lite, if softAP is active, and there has been no * activity for a time. Idle mode lite should not be active if host has sent - * a command to change key. This mib value will be runtime (post-wlan - * enable) applied only if "unifiRameUpdateMibs" mib is toggled + * a command to change key. *******************************************************************************/ #define SLSI_PSID_UNIFI_IDLE_MODE_LITE_ENABLED 0x09DE @@ -4297,8 +4670,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : FALSE * DESCRIPTION : * Enables Idle Mode, if single vif station is active or there is no vif, - * and there has been no activity for a time. This mib value will be runtime - * (post-wlan enable) applied if only "unifiRameUpdateMibs" mib is toggled + * and there has been no activity for a time. *******************************************************************************/ #define SLSI_PSID_UNIFI_IDLE_MODE_ENABLED 0x09DF @@ -4307,7 +4679,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 2529 (0x09E1) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : 50000 @@ -4315,12 +4687,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * If UniFi is in power save and receives a Traffic Indication Map from its * associated access point with a DTIM indication, it will wait a maximum * time given by this attribute for succeeding broadcast or multicast - * traffic, or until it receives such traffic with the 'more data' - * flag clear. Any reception of broadcast or multicast traffic with the - * 'more data' flag set, or any reception of unicast data, resets - * the timeout. The timeout can be turned off by setting the value to zero; - * in that case UniFi will remain awake indefinitely waiting for broadcast - * or multicast data. Otherwise, the value should be larger than that of + * traffic, or until it receives such traffic with the 'more data' flag + * clear. Any reception of broadcast or multicast traffic with the 'more + * data' flag set, or any reception of unicast data, resets the timeout. The + * timeout can be turned off by setting the value to zero; in that case + * UniFi will remain awake indefinitely waiting for broadcast or multicast + * data. Otherwise, the value should be larger than that of * unifiPowerSaveExtraListenTime. *******************************************************************************/ #define SLSI_PSID_UNIFI_DTIM_WAIT_TIMEOUT 0x09E1 @@ -4486,7 +4858,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 12 * DEFAULT : { 0XB1, 0X7A, 0X11, 0X03, 0XFA, 0XFF, 0X00, 0X00, 0XFA, 0XFF, 0X00, 0X00 } * DESCRIPTION : - * VHT capabilities of the chip. see SC-503520-SP. + * Only applies to 2G connections. VHT capabilities of the chip. see + * SC-503520-SP. *******************************************************************************/ #define SLSI_PSID_UNIFI_VHT_CAPABILITIES 0x09EC @@ -4589,10 +4962,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiBool * MIN : 0 * MAX : 1 - * DEFAULT : FALSE + * DEFAULT : * DESCRIPTION : - * When this mib is called/toggled MACRAME mibs will be read and compared - * with mib values in ramedata.mibs and updated if the value changes + * Deprecated *******************************************************************************/ #define SLSI_PSID_UNIFI_RAME_UPDATE_MIBS 0x09F3 @@ -4604,7 +4976,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * UNITS : beacon intervals * MIN : 0 * MAX : 65535 - * DEFAULT : 7 + * DEFAULT : 1 * DESCRIPTION : * Duration of the Absence time to use when protecting P2PGO VIFs from scan * operations. A value of 0 disables the feature. @@ -4619,7 +4991,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * UNITS : beacon intervals * MIN : 0 * MAX : 65535 - * DEFAULT : 14 + * DEFAULT : 4 * DESCRIPTION : * Period of the Absence/Presence times cycles to use when protecting P2PGO * VIFs from scan operations. @@ -4648,7 +5020,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enable TDLS in P2P. + * Activate TDLS in P2P. *******************************************************************************/ #define SLSI_PSID_UNIFI_TDLS_IN_P2P_ACTIVATED 0x09FC @@ -4661,7 +5033,8 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Golden Certification MIB don't delete, change PSID or name: Enable TDLS. + * Golden Certification MIB don't delete, change PSID or name: Activate + * TDLS. *******************************************************************************/ #define SLSI_PSID_UNIFI_TDLS_ACTIVATED 0x09FE @@ -4842,7 +5215,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_TDLS_TEARDOWN_FRAME_TX_TIMEOUT 0x0A12 /******************************************************************************* - * NAME : UnifiWifiSharingEnabled + * NAME : UnifiWifiSharingActivated * PSID : 2580 (0x0A14) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -4850,9 +5223,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enables WiFi Sharing feature + * Activate WiFi Sharing feature *******************************************************************************/ -#define SLSI_PSID_UNIFI_WIFI_SHARING_ENABLED 0x0A14 +#define SLSI_PSID_UNIFI_WIFI_SHARING_ACTIVATED 0x0A14 /******************************************************************************* * NAME : UnifiWiFiSharing5GHzChannel @@ -4936,7 +5309,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enable TDLS peer U-APSD. + * Activate TDLS peer U-APSD. *******************************************************************************/ #define SLSI_PSID_DOT11_TDLS_PEER_UAPSD_BUFFER_STA_ACTIVATED 0x0A1B @@ -4963,7 +5336,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : FALSE * DESCRIPTION : * Golden Certification MIB don't delete, change PSID or name: ChanelSwitch: - * Enable waiting for a slow AP. + * Activate waiting for a slow AP. *******************************************************************************/ #define SLSI_PSID_UNIFI_STA_CHANNEL_SWITCH_SLOW_AP_ACTIVATED 0x0A29 @@ -5020,17 +5393,17 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_MLME_SCAN_MAX_AERIALS 0x0A2F /******************************************************************************* - * NAME : UnifiApfEnabled + * NAME : UnifiApfActivated * PSID : 2650 (0x0A5A) * PER INTERFACE?: NO * TYPE : SlsiBool * MIN : 0 * MAX : 1 - * DEFAULT : TRUE + * DEFAULT : FALSE * DESCRIPTION : * It is used to enable or disable Android Packet Filter(APF). *******************************************************************************/ -#define SLSI_PSID_UNIFI_APF_ENABLED 0x0A5A +#define SLSI_PSID_UNIFI_APF_ACTIVATED 0x0A5A /******************************************************************************* * NAME : UnifiApfVersion @@ -5051,7 +5424,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 - * MAX : 2048 + * MAX : 65535 * DEFAULT : 1024 * DESCRIPTION : * Max size in bytes supported by FW per VIF. Includes both program len and @@ -5060,7 +5433,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_APF_MAX_SIZE 0x0A5C /******************************************************************************* - * NAME : UnifiApfActiveMode + * NAME : UnifiApfActiveModeEnabled * PSID : 2653 (0x0A5D) * PER INTERFACE?: NO * TYPE : SlsiUint16 @@ -5071,7 +5444,21 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * Indicates if APF is supported in host active mode. Applicable to only * group addressed frames. *******************************************************************************/ -#define SLSI_PSID_UNIFI_APF_ACTIVE_MODE 0x0A5D +#define SLSI_PSID_UNIFI_APF_ACTIVE_MODE_ENABLED 0x0A5D + +/******************************************************************************* + * NAME : UnifiFrameResponseNdmTimeout + * PSID : 2654 (0x0A5E) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 1024 + * DESCRIPTION : + * Timeout, in TU, to wait to retry a frame after after TX Cfm + * trasnmission_status == Successful. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_FRAME_RESPONSE_NDM_TIMEOUT 0x0A5E /******************************************************************************* * NAME : UnifiCsrOnlyMibShield @@ -5086,17 +5473,16 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * may be applied when the element is accessed by the host. For most * elements the constants are derived from their MAX-ACCESS clauses. * unifiCSROnlyMIBShield controls the access mechanism. If this entry is set - * to 'warn', when the host makes an inappropriate access to a MIB - * variable (e.g., writing to a 'read-only' entry) then the - * firmware attempts to send a warning message to the host, but access is - * allowed to the MIB variable. If this entry is set to 'guard' - * then inappropriate accesses from the host are prevented. If this entry is - * set to 'alarm' then inappropriate accesses from the host are - * prevented and the firmware attempts to send warning messages to the host. - * If this entry is set to 'open' then no access constraints are - * applied and now warnings issued. Note that certain MIB entries have - * further protection schemes. In particular, the MIB prevents the host from - * reading some security keys (WEP keys, etc.). + * to 'warn', when the host makes an inappropriate access to a MIB variable + * (e.g., writing to a 'read-only' entry) then the firmware attempts to send + * a warning message to the host, but access is allowed to the MIB variable. + * If this entry is set to 'guard' then inappropriate accesses from the host + * are prevented. If this entry is set to 'alarm' then inappropriate + * accesses from the host are prevented and the firmware attempts to send + * warning messages to the host. If this entry is set to 'open' then no + * access constraints are applied and now warnings issued. Note that certain + * MIB entries have further protection schemes. In particular, the MIB + * prevents the host from reading some security keys (WEP keys, etc.). *******************************************************************************/ #define SLSI_PSID_UNIFI_CSR_ONLY_MIB_SHIELD 0x0FA1 @@ -5110,9 +5496,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * DEFAULT : 0X17 * DESCRIPTION : * entry is written directly to the BBB_TX_FILTER_CONFIG register. Only the - * lower eight bits of this register are implemented . Bits 0-3 are the - * 'Tx Gain', bits 6-8 are the 'Tx Delay'. This register - * should only be changed by an expert. + * lower eight bits of this register are implemented . Bits 0-3 are the 'Tx + * Gain', bits 6-8 are the 'Tx Delay'. This register should only be changed + * by an expert. *******************************************************************************/ #define SLSI_PSID_UNIFI_PRIVATE_BBB_TX_FILTER_CONFIG 0x0FE7 @@ -5160,7 +5546,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 4078 (0x0FEE) * PER INTERFACE?: NO * TYPE : SlsiUint16 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 65535 * DEFAULT : @@ -5206,7 +5592,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_RX_AGC_CONTROL 0x0FEF /******************************************************************************* - * NAME : UnifiWapiQosMask + * NAME : deprecated_unifiWapiQosMask * PSID : 4130 (0x1022) * PER INTERFACE?: NO * TYPE : SlsiUint16 @@ -5214,10 +5600,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 65535 * DEFAULT : 15 * DESCRIPTION : - * Forces the WAPI encryption hardware use the QoS mask specified.This mib - * value will be updated if "unifiRameUpdateMibs" mib is toggled + * Forces the WAPI encryption hardware use the QoS mask specified. *******************************************************************************/ -#define SLSI_PSID_UNIFI_WAPI_QOS_MASK 0x1022 +#define SLSI_PSID_DEPRECATED_UNIFI_WAPI_QOS_MASK 0x1022 /******************************************************************************* * NAME : UnifiWmmStallEnable @@ -5241,7 +5626,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint32 * MIN : 0 * MAX : 4294967295 - * DEFAULT : 16385 + * DEFAULT : * DESCRIPTION : * Fixed TX rate set by Host. Ideally this should be done by the driver. 0 * means "host did not specified any rate". @@ -5327,12 +5712,64 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_THROUGHPUT_DEBUG_REPORT_INTERVAL 0x1039 +/******************************************************************************* + * NAME : UnifiDplaneTest1 + * PSID : 4154 (0x103A) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * MIN : 0 + * MAX : 4294967295 + * DEFAULT : + * DESCRIPTION : + * Dplane test mib to read and write uint32 + *******************************************************************************/ +#define SLSI_PSID_UNIFI_DPLANE_TEST1 0x103A + +/******************************************************************************* + * NAME : UnifiDplaneTest2 + * PSID : 4155 (0x103B) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * MIN : 0 + * MAX : 4294967295 + * DEFAULT : + * DESCRIPTION : + * Dplane test mib to read and write uint32 + *******************************************************************************/ +#define SLSI_PSID_UNIFI_DPLANE_TEST2 0x103B + +/******************************************************************************* + * NAME : UnifiDplaneTest3 + * PSID : 4156 (0x103C) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * MIN : 0 + * MAX : 4294967295 + * DEFAULT : + * DESCRIPTION : + * Dplane test mib to read and write uint32 + *******************************************************************************/ +#define SLSI_PSID_UNIFI_DPLANE_TEST3 0x103C + +/******************************************************************************* + * NAME : UnifiDplaneTest4 + * PSID : 4157 (0x103D) + * PER INTERFACE?: NO + * TYPE : SlsiUint32 + * MIN : 0 + * MAX : 4294967295 + * DEFAULT : + * DESCRIPTION : + * Dplane test mib to read and write uint32 + *******************************************************************************/ +#define SLSI_PSID_UNIFI_DPLANE_TEST4 0x103D + /******************************************************************************* * NAME : UnifiPreEbrtWindow * PSID : 4171 (0x104B) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 100 @@ -5351,7 +5788,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 4173 (0x104D) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 2000 @@ -5471,13 +5908,11 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 5023 (0x139F) * PER INTERFACE?: NO * TYPE : SlsiUint8 - * MIN : 4 - * MAX : 4 - * DEFAULT : { 0X03, 0XA4, 0X00, 0X00 } + * MIN : 0 + * MAX : 65535 + * DEFAULT : * DESCRIPTION : - * Override the BE EDCA parameters. octet 0 - AIFS octet 1 - [7:4] ECW MAX - * [3:0] ECW MIN octet 2 ~ 3 - TXOP[7:0] TXOP[15:8] in 32 usec units for - * both non-HT and HT connections. + * Deprecated *******************************************************************************/ #define SLSI_PSID_UNIFI_OVERRIDE_EDCA_PARAM_BE 0x139F @@ -5488,10 +5923,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiBool * MIN : 0 * MAX : 1 - * DEFAULT : FALSE + * DEFAULT : * DESCRIPTION : - * override STA - BE EDCA using the values in unifiOverrideEDCAParamBE for - * certification. + * Deprecated *******************************************************************************/ #define SLSI_PSID_UNIFI_OVERRIDE_EDCA_PARAM_BE_ENABLE 0x13A0 @@ -5579,7 +6013,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_DEBUG_MODULE_CONTROL 0x13A5 /******************************************************************************* - * NAME : UnifiTxUsingLdpcEnabled + * NAME : UnifiTxUsingLdpcActivated * PSID : 5030 (0x13A6) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5592,7 +6026,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * reception of LDPC coded packets,enable bit 0 of unifiHtCapabilities, and * bit 4 of unifiVhtCapabilities. *******************************************************************************/ -#define SLSI_PSID_UNIFI_TX_USING_LDPC_ENABLED 0x13A6 +#define SLSI_PSID_UNIFI_TX_USING_LDPC_ACTIVATED 0x13A6 /******************************************************************************* * NAME : UnifiTxSettings @@ -5702,7 +6136,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_RX_EXTERNAL_GAIN 0x13AE /******************************************************************************* - * NAME : UnifiTxSgI20Enabled + * NAME : UnifiTxSgI20Activated * PSID : 5040 (0x13B0) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5715,10 +6149,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * advertise reception of SGI 20MHz packets, enable bit 5 of * unifiHtCapabilities. *******************************************************************************/ -#define SLSI_PSID_UNIFI_TX_SG_I20_ENABLED 0x13B0 +#define SLSI_PSID_UNIFI_TX_SG_I20_ACTIVATED 0x13B0 /******************************************************************************* - * NAME : UnifiTxSgI40Enabled + * NAME : UnifiTxSgI40Activated * PSID : 5041 (0x13B1) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5731,10 +6165,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * advertise reception of SGI 40MHz packets, enable bit 6 of * unifiHtCapabilities. *******************************************************************************/ -#define SLSI_PSID_UNIFI_TX_SG_I40_ENABLED 0x13B1 +#define SLSI_PSID_UNIFI_TX_SG_I40_ACTIVATED 0x13B1 /******************************************************************************* - * NAME : UnifiTxSgI80Enabled + * NAME : UnifiTxSgI80Activated * PSID : 5042 (0x13B2) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5747,10 +6181,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * advertise reception of SGI 80MHz packets, enable bit 5 of * unifiVhtCapabilities. *******************************************************************************/ -#define SLSI_PSID_UNIFI_TX_SG_I80_ENABLED 0x13B2 +#define SLSI_PSID_UNIFI_TX_SG_I80_ACTIVATED 0x13B2 /******************************************************************************* - * NAME : UnifiTxSgI160Enabled + * NAME : UnifiTxSgI160Activated * PSID : 5043 (0x13B3) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5763,7 +6197,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * supports it. To advertise reception of SGI 160/80+80MHz packets, enable * bit 6 of unifiVhtCapabilities. *******************************************************************************/ -#define SLSI_PSID_UNIFI_TX_SG_I160_ENABLED 0x13B3 +#define SLSI_PSID_UNIFI_TX_SG_I160_ACTIVATED 0x13B3 /******************************************************************************* * NAME : UnifiMacAddressRandomisation @@ -5803,12 +6237,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enables Wips. + * Activate Wips. *******************************************************************************/ #define SLSI_PSID_UNIFI_WIPS_ACTIVATED 0x13BA /******************************************************************************* - * NAME : UnifiRfTestModeEnabled + * NAME : UnifiRfTestModeActivated * PSID : 5054 (0x13BE) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -5819,7 +6253,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * Test only: Set to true when running in RF Test mode. Setting this MIB key * to true prevents setting mandatory HT MCS Rates. *******************************************************************************/ -#define SLSI_PSID_UNIFI_RF_TEST_MODE_ENABLED 0x13BE +#define SLSI_PSID_UNIFI_RF_TEST_MODE_ACTIVATED 0x13BE /******************************************************************************* * NAME : UnifiTxPowerDetectorResponse @@ -5993,7 +6427,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PER INTERFACE?: NO * TYPE : SlsiUint8 * MIN : 25 - * MAX : 25 + * MAX : 26 * DEFAULT : * DESCRIPTION : * Hardware specific transmitter power trim settings @@ -6454,6 +6888,82 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_DISABLE_DPD_SUB_ITERATION 0x13FA +/******************************************************************************* + * NAME : UnifiRxRssiAdjustments + * PSID : 5115 (0x13FB) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 4 + * MAX : 4 + * DEFAULT : + * DESCRIPTION : + * Provides platform dependent rssi adjustments. Octet string (length 4), + * each octet represents a signed 8 bit value in units of quarter dB. + * octet[0] = always_adjust (applied unconditionally in all cases) octet[1] + * = low_power_adjust (applied in low_power mode only) octet[2] = + * ext_lna_on_adjust (applied only if we have a FEM and the external LNA is + * enabled) octet[3] = ext_lna_off_adjust (applied only if we have a FEM and + * the external LNA is disabled) + *******************************************************************************/ +#define SLSI_PSID_UNIFI_RX_RSSI_ADJUSTMENTS 0x13FB + +/******************************************************************************* + * NAME : UnifiFleximacCcaEdEnable + * PSID : 5116 (0x13FC) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : + * DESCRIPTION : + * Enable/disable CCA-ED in Fleximac. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_FLEXIMAC_CCA_ED_ENABLE 0x13FC + +/******************************************************************************* + * NAME : UnifiRadioTxIqDelay + * PSID : 5117 (0x13FD) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 0 + * MAX : 255 + * DEFAULT : + * DESCRIPTION : + * The differential delay applied between I and Q paths in Tx. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_RADIO_TX_IQ_DELAY 0x13FD + +/******************************************************************************* + * NAME : UnifiDisableLnaBypass + * PSID : 5118 (0x13FE) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : + * DESCRIPTION : + * Prevents the use of the LNA bypass. Can be set at any time, but takes + * effect the next time the radio is turned on from off. Set a bit to 1 to + * disable the LNA bypass in that configuration. B0 2.4G Radio 0 B1 2.4G + * Radio 1 B2 2.4G Radio 2 B3 2.4G Radio 3 B4 5G Radio 0 B5 5G Radio 1 B6 5G + * Radio 2 B7 5G Radio 3 + *******************************************************************************/ +#define SLSI_PSID_UNIFI_DISABLE_LNA_BYPASS 0x13FE + +/******************************************************************************* + * NAME : UnifiEnableFlexiMacWatchdog + * PSID : 5200 (0x1450) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 0X0000 + * DESCRIPTION : + * Bitmap controlling watchdog configuration for fleximac. Setting bit to 1 + * will enable watchdog for MAC represented by bit position + *******************************************************************************/ +#define SLSI_PSID_UNIFI_ENABLE_FLEXI_MAC_WATCHDOG 0x1450 + /******************************************************************************* * NAME : UnifiRttCapabilities * PSID : 5300 (0x14B4) @@ -6523,7 +7033,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_FTM_NUM_OF_BURSTS_EXPONENT 0x14B8 /******************************************************************************* - * NAME : UnifiFtmAsapModeEnabled + * NAME : UnifiFtmAsapModeActivated * PSID : 5305 (0x14B9) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -6531,12 +7041,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enable support for ASAP mode in FTM + * Activate support for ASAP mode in FTM *******************************************************************************/ -#define SLSI_PSID_UNIFI_FTM_ASAP_MODE_ENABLED 0x14B9 +#define SLSI_PSID_UNIFI_FTM_ASAP_MODE_ACTIVATED 0x14B9 /******************************************************************************* - * NAME : UnifiFtmResponderEnabled + * NAME : UnifiFtmResponderActivated * PSID : 5306 (0x14BA) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -6544,9 +7054,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : FALSE * DESCRIPTION : - * Enable support for FTM Responder + * Activate support for FTM Responder *******************************************************************************/ -#define SLSI_PSID_UNIFI_FTM_RESPONDER_ENABLED 0x14BA +#define SLSI_PSID_UNIFI_FTM_RESPONDER_ACTIVATED 0x14BA /******************************************************************************* * NAME : UnifiFtmDefaultSessionEstablishmentTimeout @@ -6667,6 +7177,32 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_FTM_INITIAL_RESPONSE_TIMEOUT 0x14C3 +/******************************************************************************* + * NAME : UnifiFtmUseRequestParameters + * PSID : 5321 (0x14C9) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : FALSE + * DESCRIPTION : + * Use certain burst params from user while sending FTM req + *******************************************************************************/ +#define SLSI_PSID_UNIFI_FTM_USE_REQUEST_PARAMETERS 0x14C9 + +/******************************************************************************* + * NAME : UnifiFtmMeanAroundCluster + * PSID : 5322 (0x14CA) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : FALSE + * DESCRIPTION : + * Whether to get simple mean or mean around cluster + *******************************************************************************/ +#define SLSI_PSID_UNIFI_FTM_MEAN_AROUND_CLUSTER 0x14CA + /******************************************************************************* * NAME : UnifiMlmeScanContinueIfMoreThanXAps * PSID : 5410 (0x1522) @@ -6695,7 +7231,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_MLME_SCAN_STOP_IF_LESS_THAN_XNEW_APS 0x1523 /******************************************************************************* - * NAME : UnifiMlmeScanMultiVifEnabled + * NAME : UnifiScanMultiVifActivated * PSID : 5412 (0x1524) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -6703,12 +7239,12 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : 1 * DESCRIPTION : - * Part of Scan Algorithm: Enable support for Multi Vif channel times. + * Part of Scan Algorithm: Activate support for Multi Vif channel times. *******************************************************************************/ -#define SLSI_PSID_UNIFI_MLME_SCAN_MULTI_VIF_ENABLED 0x1524 +#define SLSI_PSID_UNIFI_SCAN_MULTI_VIF_ACTIVATED 0x1524 /******************************************************************************* - * NAME : UnifiMlmeScanNewAlgorithmEnabled + * NAME : UnifiScanNewAlgorithmActivated * PSID : 5413 (0x1525) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -6716,9 +7252,22 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : 1 * DESCRIPTION : - * Part of Scan Algorithm: Enable support for the new algorithm. + * Part of Scan Algorithm: Activate support for the new algorithm. *******************************************************************************/ -#define SLSI_PSID_UNIFI_MLME_SCAN_NEW_ALGORITHM_ENABLED 0x1525 +#define SLSI_PSID_UNIFI_SCAN_NEW_ALGORITHM_ACTIVATED 0x1525 + +/******************************************************************************* + * NAME : UnifiUnsyncVifLnaEnabled + * PSID : 6010 (0x177A) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : FALSE + * DESCRIPTION : + * Enable or disable use of the LNA for unsynchronised VIFs. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_UNSYNC_VIF_LNA_ENABLED 0x177A /******************************************************************************* * NAME : UnifiTpcMinPower2Gmimo @@ -6759,7 +7308,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enable dynamic switching of the LNA based on RSSI. + * Enable dynamic switching of the LNA based on RSSI for synchronised VIFs. *******************************************************************************/ #define SLSI_PSID_UNIFI_LNA_CONTROL_ENABLED 0x177D @@ -6808,6 +7357,21 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf *******************************************************************************/ #define SLSI_PSID_UNIFI_POWER_IS_GRIP 0x1780 +/******************************************************************************* + * NAME : UnifiLowPowerRxConfig + * PSID : 6018 (0x1782) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 3 + * DESCRIPTION : + * Enables low power radio RX for idle STA and AP VIFs respectively. + * Setting/clearing bit 0 enables/disabled LP RX for (all) STA/Cli VIFs. + * Setting/clearing bit 1 enables/disabled LP RX for AP/GO VIFs. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_LOW_POWER_RX_CONFIG 0x1782 + /******************************************************************************* * NAME : UnifiTpcEnabled * PSID : 6019 (0x1783) @@ -7101,17 +7665,56 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint32 * MIN : 0 * MAX : 4294967295 - * DEFAULT : 0X03 + * DEFAULT : 0X203 * DESCRIPTION : * Bit mask for turning on individual debug entities in the data_plane that * if enabled effect throughput. See DPLP_DEBUG_ENTITIES_T in - * dplane_dplp_debug.h for bits. Default of 0x3 means dplp and ampdu logs - * are enabled. + * dplane_dplp_debug.h for bits. Default of 0x203 means dplp, ampdu and + * metadata logs are enabled. *******************************************************************************/ #define SLSI_PSID_UNIFI_DPLANE_DEBUG 0x17B9 /******************************************************************************* - * NAME : UnifiNanEnabled + * NAME : UnifiNanMaxQueuedFollowups + * PSID : 6077 (0x17BD) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 4 + * DESCRIPTION : + * Maximum number of NAN Followup instances which can be queued in FW. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_MAX_QUEUED_FOLLOWUPS 0x17BD + +/******************************************************************************* + * NAME : UnifiNanMaxSdaTxRetryCount + * PSID : 6078 (0x17BE) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : 3 + * DESCRIPTION : + * Maximum number of reties to send SDA to a peer. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_MAX_SDA_TX_RETRY_COUNT 0x17BE + +/******************************************************************************* + * NAME : UnifiNanSupportedCipherSuites + * PSID : 6079 (0x17BF) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * MIN : 0 + * MAX : 65535 + * DEFAULT : + * DESCRIPTION : + * Set of supported cipher suites. NanCipherSuiteType bit field format. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_SUPPORTED_CIPHER_SUITES 0x17BF + +/******************************************************************************* + * NAME : UnifiNanActivated * PSID : 6080 (0x17C0) * PER INTERFACE?: NO * TYPE : SlsiBool @@ -7119,9 +7722,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 1 * DEFAULT : TRUE * DESCRIPTION : - * Enables Neighbour Aware Networking (NAN) + * Activate Neighbour Aware Networking (NAN) *******************************************************************************/ -#define SLSI_PSID_UNIFI_NAN_ENABLED 0x17C0 +#define SLSI_PSID_UNIFI_NAN_ACTIVATED 0x17C0 /******************************************************************************* * NAME : UnifiNanBeaconCapabilities @@ -7130,7 +7733,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : 0X0720 + * DEFAULT : 0X0620 * DESCRIPTION : * The 16-bit field follows the coding of IEEE 802.11 Capability * Information. @@ -7229,30 +7832,30 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf #define SLSI_PSID_UNIFI_NAN_MAX_SERVICE_SPECIFIC_INFO_LENGTH 0x17C8 /******************************************************************************* - * NAME : UnifiNanMaxVsaDataLength + * NAME : UnifiNanMaxExtendedServiceSpecificInfoLen * PSID : 6089 (0x17C9) * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 2048 * DESCRIPTION : - * Maximum Vendor Specific Attribute Data Length. + * Maximum Extended Service Specific Info Length. *******************************************************************************/ -#define SLSI_PSID_UNIFI_NAN_MAX_VSA_DATA_LENGTH 0x17C9 +#define SLSI_PSID_UNIFI_NAN_MAX_EXTENDED_SERVICE_SPECIFIC_INFO_LEN 0x17C9 /******************************************************************************* - * NAME : UnifiNanMaxMeshDataLength + * NAME : UnifiNanMaxSubscribeInterfaceAddresses * PSID : 6090 (0x17CA) * PER INTERFACE?: NO * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 8 * DESCRIPTION : - * Maximum Mesh Data Length. + * Maximum number interface addresses in subscribe filter list. *******************************************************************************/ -#define SLSI_PSID_UNIFI_NAN_MAX_MESH_DATA_LENGTH 0x17CA +#define SLSI_PSID_UNIFI_NAN_MAX_SUBSCRIBE_INTERFACE_ADDRESSES 0x17CA /******************************************************************************* * NAME : UnifiNanMaxNdiInterfaces @@ -7261,9 +7864,10 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 1 * DESCRIPTION : - * Maximum NDI Interfaces. + * Maximum NDI Interfaces. Note: This does not affect number of NDL Vifs + * supported by FW as they are hard coded. *******************************************************************************/ #define SLSI_PSID_UNIFI_NAN_MAX_NDI_INTERFACES 0x17CB @@ -7274,7 +7878,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 1 * DESCRIPTION : * Maximum NDP Sessions. *******************************************************************************/ @@ -7287,27 +7891,98 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 2048 * DESCRIPTION : * Maximum App Info Length. *******************************************************************************/ #define SLSI_PSID_UNIFI_NAN_MAX_APP_INFO_LENGTH 0x17CD /******************************************************************************* - * NAME : ReservedForNan + * NAME : UnifiNanMatchExpirationTime * PSID : 6094 (0x17CE) * PER INTERFACE?: NO * TYPE : SlsiUint16 + * UNITS : seconds * MIN : 0 * MAX : 65535 - * DEFAULT : 3 + * DEFAULT : 60 * DESCRIPTION : - * Enables low power radio RX for idle STA and AP VIFs respectively. - * Setting/clearing bit 0 enables/disabled LP RX for (all) STA/Cli VIFs. - * Setting/clearing bit 1 enables/disabled LP RX for AP/GO VIFs.This mib - * value will be updated if "unifiRameUpdateMibs" mib is toggled + * Time limit in which Mlme will expire a match for discovered service. *******************************************************************************/ -#define SLSI_PSID_RESERVED_FOR_NAN 0x17CE +#define SLSI_PSID_UNIFI_NAN_MATCH_EXPIRATION_TIME 0x17CE + +/******************************************************************************* + * NAME : UnifiNanPermittedChannels + * PSID : 6095 (0x17CF) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 8 + * MAX : 8 + * DEFAULT : { 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X00, 0X00, 0X00 } + * DESCRIPTION : + * Applicable Primary Channels mask. Defined in a uint64 represented by the + * octet string. Mapping defined in ChannelisationRules; i.e. Bit 14 maps to + * channel 36. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_PERMITTED_CHANNELS 0x17CF + +/******************************************************************************* + * NAME : UnifiNanDefaultScanPeriod + * PSID : 6096 (0x17D0) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : seconds + * MIN : 0 + * MAX : 65535 + * DEFAULT : 20 + * DESCRIPTION : + * The default value of scan period in seconds. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_DEFAULT_SCAN_PERIOD 0x17D0 + +/******************************************************************************* + * NAME : UnifiNanMaxChannelSwitchTime + * PSID : 6097 (0x17D1) + * PER INTERFACE?: NO + * TYPE : SlsiUint16 + * UNITS : microseconds + * MIN : 0 + * MAX : 65535 + * DEFAULT : 5000 + * DESCRIPTION : + * Maximum Channel Switch Time. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_MAX_CHANNEL_SWITCH_TIME 0x17D1 + +/******************************************************************************* + * NAME : UnifiNanMacRandomisationActivated + * PSID : 6098 (0x17D2) + * PER INTERFACE?: NO + * TYPE : SlsiBool + * MIN : 0 + * MAX : 1 + * DEFAULT : TRUE + * DESCRIPTION : + * Enabling Mac Address Randomisation for NMI address. + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_MAC_RANDOMISATION_ACTIVATED 0x17D2 + +/******************************************************************************* + * NAME : UnifiNanDefaultSchedule + * PSID : 6099 (0x17D3) + * PER INTERFACE?: NO + * TYPE : SlsiUint8 + * MIN : 11 + * MAX : 11 + * DEFAULT : + * DESCRIPTION : + * Default Schedule to be proposed for NDL. Values must match with NAN Spec + * Time BitMap Control field values. Octet 0 ~ 1 : Ordered ChannelList[2] + * from most to least prefered channel, stated as channel number. Zero means + * not in used. Octet 2 : Bit Duration in TUs. Octet 3 ~ 4 : Period in TUs. + * Octet 5 ~ 6 : Start Offset in TUs. Octet 7 ~ 10 : TimeBitMap[4] + *******************************************************************************/ +#define SLSI_PSID_UNIFI_NAN_DEFAULT_SCHEDULE 0x17D3 /******************************************************************************* * NAME : hutsReadWriteDataElementInt32 @@ -7438,7 +8113,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * PSID : 6110 (0x17DE) * PER INTERFACE?: NO * TYPE : SlsiUint32 - * UNITS : microseconds + * UNITS : µs * MIN : 0 * MAX : 2147483647 * DEFAULT : 30000 @@ -7667,8 +8342,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * MAX : 20 * DEFAULT : {0X01,0X0D,0X24,0X04,0X34,0X04,0X64,0X0C,0X95,0X05} * DESCRIPTION : - * Supported 20MHz channel centre frequency grouped in sub-bands. For each - * sub-band: starting channel number, followed by number of channels + * For Test Only. Supported 20MHz channel primary frequency grouped in + * sub-bands. For each sub-band: starting channel number, followed by number + * of channels. *******************************************************************************/ #define SLSI_PSID_UNIFI_SUPPORTED_CHANNELS 0x1F4C @@ -7679,9 +8355,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint8 * MIN : 3 * MAX : 3 - * DEFAULT : {0X30, 0X30, 0X20} + * DEFAULT : * DESCRIPTION : - * Hosts sets the Default Code. + * Host set Default Code. *******************************************************************************/ #define SLSI_PSID_UNIFI_DEFAULT_COUNTRY 0x1F4D @@ -7762,7 +8438,7 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf * TYPE : SlsiUint16 * MIN : 0 * MAX : 65535 - * DEFAULT : + * DEFAULT : 0X0107 * DESCRIPTION : * Regulatory domain version encoded into 2 bytes, major version as MSB and * minor version as LSB diff --git a/drivers/net/wireless/scsc/mlme.c b/drivers/net/wireless/scsc/mlme.c index 9dba596a4..e11cbd5a6 100755 --- a/drivers/net/wireless/scsc/mlme.c +++ b/drivers/net/wireless/scsc/mlme.c @@ -888,6 +888,53 @@ int slsi_mlme_set_forward_beacon(struct slsi_dev *sdev, struct net_device *dev, } #endif +int slsi_mlme_set_roaming_parameters(struct slsi_dev *sdev, struct net_device *dev, u16 psid, int mib_value, int mib_length) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + struct sk_buff *req; + struct sk_buff *cfm; + int ret = 0; + + SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_set_roaming_parameters_req(vif:%d value:%d)\n", ndev_vif->ifnum, mib_value); + req = fapi_alloc(mlme_set_roaming_parameters_req, MLME_SET_ROAMING_PARAMETERS_REQ, ndev_vif->ifnum, 0); + if (!req) { + SLSI_NET_ERR(dev, "fapi alloc failure\n"); + return -ENOMEM; + } + fapi_set_u16(req, u.mlme_set_roaming_parameters_req.vif, ndev_vif->ifnum); + fapi_append_data_u16(req, psid); + fapi_append_data_u16(req, mib_length); + + switch (mib_length) { + case 1: + fapi_append_data_u8(req, mib_value); + break; + case 2: + fapi_append_data_u16(req, mib_value); + break; + case 4: + fapi_append_data_u32(req, mib_value); + break; + default: + slsi_kfree_skb(req); + return -EINVAL; + } + + cfm = slsi_mlme_req_cfm(sdev, dev, req, MLME_SET_ROAMING_PARAMETERS_CFM); + if (!cfm) { + SLSI_NET_ERR(dev, "mlme_set_roaming_parameters_cfm failure\n"); + return -EIO; + } + if (fapi_get_u16(cfm, u.mlme_set_roaming_parameters_cfm.result_code) != FAPI_RESULTCODE_SUCCESS) { + SLSI_NET_ERR(dev, "mlme_set_roaming_parameters_cfm(result:0x%04x) ERROR\n", + fapi_get_u16(cfm, u.mlme_set_roaming_type_cfm.result_code)); + ret = -EINVAL; + } + + slsi_kfree_skb(cfm); + return ret; +} + int slsi_mlme_set_channel(struct slsi_dev *sdev, struct net_device *dev, struct ieee80211_channel *chan, u16 duration, u16 interval, u16 count) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -2198,7 +2245,7 @@ void slsi_mlme_connected_resp(struct slsi_dev *sdev, struct net_device *dev, u16 return; } - fapi_set_u16(req, u.mlme_connected_res.association_identifier, peer_index); + fapi_set_u16(req, u.mlme_connected_res.peer_index, peer_index); slsi_mlme_req_no_cfm(sdev, dev, req); } @@ -3496,12 +3543,12 @@ int slsi_mlme_del_traffic_parameters(struct slsi_dev *sdev, struct net_device *d return r; } -int slsi_mlme_set_ext_capab(struct slsi_dev *sdev, struct net_device *dev, struct slsi_mib_value *mib_val) +int slsi_mlme_set_ext_capab(struct slsi_dev *sdev, struct net_device *dev, u8 *data, int datalength) { struct slsi_mib_data mib_data = { 0, NULL }; int error = 0; - error = slsi_mib_encode_octet(&mib_data, SLSI_PSID_UNIFI_EXTENDED_CAPABILITIES, mib_val->u.octetValue.dataLength, mib_val->u.octetValue.data, 0); + error = slsi_mib_encode_octet(&mib_data, SLSI_PSID_UNIFI_EXTENDED_CAPABILITIES, datalength, data, 0); if (error != SLSI_MIB_STATUS_SUCCESS) { error = -ENOMEM; goto exit; @@ -3523,88 +3570,6 @@ exit: return error; } -int slsi_mlme_set_hs2_ext_cap(struct slsi_dev *sdev, struct net_device *dev, const u8 *ies, int ie_len) -{ - struct slsi_mib_entry mib_entry; - struct slsi_mib_data mibreq = { 0, NULL }; - struct slsi_mib_data mibrsp = { 0, NULL }; - const u8 *ext_capab_ie; - int r = 0; - int rx_length = 0; - int len = 0; - - slsi_mib_encode_get(&mibreq, SLSI_PSID_UNIFI_EXTENDED_CAPABILITIES, 0); - - /* 5 (header) + 9 (data) + 2 (mlme expects 16 (??))*/ - mibrsp.dataLength = 16; - mibrsp.data = kmalloc(mibrsp.dataLength, GFP_KERNEL); - - if (!mibrsp.data) { - SLSI_ERR(sdev, "Failed to alloc for Mib response\n"); - kfree(mibreq.data); - return -ENOMEM; - } - - r = slsi_mlme_get(sdev, NULL, mibreq.data, mibreq.dataLength, - mibrsp.data, mibrsp.dataLength, &rx_length); - kfree(mibreq.data); - - if (r == 0) { - mibrsp.dataLength = rx_length; - len = slsi_mib_decode(&mibrsp, &mib_entry); - if (len == 0) { - SLSI_ERR(sdev, "Mib decode error\n"); - r = -EINVAL; - goto exit; - } - } else { - SLSI_NET_DBG1(dev, SLSI_MLME, "Mib read failed (error: %d)\n", r); - goto exit; - } - - ext_capab_ie = cfg80211_find_ie(WLAN_EID_EXT_CAPABILITY, ies, ie_len); - - if (ext_capab_ie) { - u8 ext_capab_ie_len = ext_capab_ie[1]; - - ext_capab_ie += 2; /* skip the EID and length*/ - - /*BSS Transition bit is bit 19 ,ie length must be >= 3 */ - if ((ext_capab_ie_len >= 3) && (ext_capab_ie[2] & SLSI_WLAN_EXT_CAPA2_BSS_TRANSISITION_ENABLED)) - mib_entry.value.u.octetValue.data[2] |= SLSI_WLAN_EXT_CAPA2_BSS_TRANSISITION_ENABLED; - else - mib_entry.value.u.octetValue.data[2] &= ~SLSI_WLAN_EXT_CAPA2_BSS_TRANSISITION_ENABLED; - - /*interworking bit is bit 31 ,ie length must be >= 4 */ - if ((ext_capab_ie_len >= 4) && (ext_capab_ie[3] & SLSI_WLAN_EXT_CAPA3_INTERWORKING_ENABLED)) - mib_entry.value.u.octetValue.data[3] |= SLSI_WLAN_EXT_CAPA3_INTERWORKING_ENABLED; - else - mib_entry.value.u.octetValue.data[3] &= ~SLSI_WLAN_EXT_CAPA3_INTERWORKING_ENABLED; - - /*QoS MAP is bit 32 ,ie length must be >= 5 */ - if ((ext_capab_ie_len >= 5) && (ext_capab_ie[4] & SLSI_WLAN_EXT_CAPA4_QOS_MAP_ENABLED)) - mib_entry.value.u.octetValue.data[4] |= SLSI_WLAN_EXT_CAPA4_QOS_MAP_ENABLED; - else - mib_entry.value.u.octetValue.data[4] &= ~SLSI_WLAN_EXT_CAPA4_QOS_MAP_ENABLED; - - /*WNM- Notification bit is bit 46 ,ie length must be >= 6 */ - if ((ext_capab_ie_len >= 6) && (ext_capab_ie[5] & SLSI_WLAN_EXT_CAPA5_WNM_NOTIF_ENABLED)) - mib_entry.value.u.octetValue.data[5] |= SLSI_WLAN_EXT_CAPA5_WNM_NOTIF_ENABLED; - else - mib_entry.value.u.octetValue.data[5] &= ~SLSI_WLAN_EXT_CAPA5_WNM_NOTIF_ENABLED; - } else { - mib_entry.value.u.octetValue.data[2] &= ~SLSI_WLAN_EXT_CAPA2_BSS_TRANSISITION_ENABLED; - mib_entry.value.u.octetValue.data[3] &= ~SLSI_WLAN_EXT_CAPA3_INTERWORKING_ENABLED; - mib_entry.value.u.octetValue.data[4] &= ~SLSI_WLAN_EXT_CAPA4_QOS_MAP_ENABLED; - mib_entry.value.u.octetValue.data[5] &= ~SLSI_WLAN_EXT_CAPA5_WNM_NOTIF_ENABLED; - } - - r = slsi_mlme_set_ext_capab(sdev, dev, &mib_entry.value); -exit: - kfree(mibrsp.data); - return r; -} - int slsi_mlme_tdls_peer_resp(struct slsi_dev *sdev, struct net_device *dev, u16 pid, u16 tdls_event) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -3718,7 +3683,7 @@ int slsi_mlme_add_range_req(struct slsi_dev *sdev, u8 count, struct sk_buff *rx; int r = 0, i; size_t alloc_data_size = 0; - u8 fapi_ie_generic[] = { 0xdd, 0x1c, 0x00, 0x16, 0x32, 0x0a, 0x01 }; + u8 fapi_ie_generic[] = { 0xdd, 0x24, 0x00, 0x16, 0x32, 0x0a, 0x01 }; /* calculate data size */ alloc_data_size += count * (fapi_ie_generic[1] + 2); @@ -3732,12 +3697,13 @@ int slsi_mlme_add_range_req(struct slsi_dev *sdev, u8 count, /*fill the data */ fapi_set_u16(req, u.mlme_add_range_req.vif, vif_idx); fapi_set_u16(req, u.mlme_add_range_req.rtt_id, rtt_id); - fapi_set_memcpy(req, u.mlme_add_range_req.device_address, source_addr); for (i = 0; i < count; i++) { fapi_append_data(req, fapi_ie_generic, sizeof(fapi_ie_generic)); + fapi_append_data(req, source_addr, ETH_ALEN); fapi_append_data(req, nl_rtt_params[i].peer_addr, ETH_ALEN); fapi_append_data(req, (u8 *)&nl_rtt_params[i].type, 2); fapi_append_data(req, (u8 *)&nl_rtt_params[i].channel_freq, 2); + fapi_append_data(req, (u8 *)&nl_rtt_params[i].channel_info, 2); fapi_append_data(req, (u8 *)&nl_rtt_params[i].burst_period, 1); fapi_append_data(req, (u8 *)&nl_rtt_params[i].num_burst, 1); fapi_append_data(req, (u8 *)&nl_rtt_params[i].num_frames_per_burst, 1); @@ -4166,6 +4132,7 @@ int slsi_mlme_set_host_state(struct slsi_dev *sdev, struct net_device *dev, u8 h return r; } +#ifdef CONFIG_SCSC_WLAN_STA_APF int slsi_mlme_read_apf_request(struct slsi_dev *sdev, struct net_device *dev, u8 **host_dst, int *datalen) { struct netdev_vif *ndev_vif = netdev_priv(dev); @@ -4264,6 +4231,7 @@ exit: SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); return r; } +#endif #ifdef CONFIG_SCSC_WLAN_STA_ENHANCED_ARP_DETECT int slsi_mlme_arp_detect_request(struct slsi_dev *sdev, struct net_device *dev, u16 action, u8 *target_ipaddr) diff --git a/drivers/net/wireless/scsc/mlme.h b/drivers/net/wireless/scsc/mlme.h index 4424b8036..4c89c3573 100755 --- a/drivers/net/wireless/scsc/mlme.h +++ b/drivers/net/wireless/scsc/mlme.h @@ -257,8 +257,7 @@ int slsi_mlme_ndp_terminate(struct slsi_dev *sdev, struct net_device *dev, u16 n #endif #endif -int slsi_mlme_set_ext_capab(struct slsi_dev *sdev, struct net_device *dev, struct slsi_mib_value *mib_val); -int slsi_mlme_set_hs2_ext_cap(struct slsi_dev *sdev, struct net_device *dev, const u8 *ies, int ie_len); +int slsi_mlme_set_ext_capab(struct slsi_dev *sdev, struct net_device *dev, u8 *data, int datalength); int slsi_mlme_reassociate(struct slsi_dev *sdev, struct net_device *dev); void slsi_mlme_reassociate_resp(struct slsi_dev *sdev, struct net_device *dev); int slsi_modify_ies(struct net_device *dev, u8 eid, u8 *ies, int ies_len, u8 ie_index, u8 ie_value); @@ -278,4 +277,6 @@ void slsi_decode_fw_rate(u16 fw_rate, struct rate_info *rate, unsigned long *dat int slsi_test_sap_configure_monitor_mode(struct slsi_dev *sdev, struct net_device *dev, struct cfg80211_chan_def *chandef); struct sk_buff *slsi_mlme_req_cfm(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb, u16 cfm_id); +int slsi_mlme_set_roaming_parameters(struct slsi_dev *sdev, struct net_device *dev, u16 psid, int mib_value, int mib_length); + #endif /*__SLSI_MLME_H__*/ diff --git a/drivers/net/wireless/scsc/nl80211_vendor.c b/drivers/net/wireless/scsc/nl80211_vendor.c index 7c12384fa..c37175366 100755 --- a/drivers/net/wireless/scsc/nl80211_vendor.c +++ b/drivers/net/wireless/scsc/nl80211_vendor.c @@ -1029,7 +1029,7 @@ static int slsi_gscan_add_mlme(struct slsi_dev *sdev, struct slsi_nl_gscan_param if (gscan_param.bucket->report_events & SLSI_REPORT_EVENTS_NO_BATCH) report_mode |= FAPI_REPORTMODE_NO_BATCH; } else { - report_mode = FAPI_REPORTMODE_RESERVED; + report_mode = FAPI_REPORTMODE_BUFFER_FULL; } if (report_mode == 0) { @@ -1428,6 +1428,10 @@ static int slsi_set_bssid_blacklist(struct wiphy *wiphy, struct wireless_dev *wd goto exit; } + if (nla_len(attr) < ETH_ALEN) { + ret = -EINVAL; + goto exit; + } bssid = (u8 *)nla_data(attr); SLSI_ETHER_COPY(acl_data->mac_addrs[i].addr, bssid); @@ -1515,6 +1519,10 @@ static int slsi_start_keepalive_offload(struct wiphy *wiphy, struct wireless_dev break; case MKEEP_ALIVE_ATTRIBUTE_IP_PKT: + if (nla_len(attr) < ip_pkt_len) { + r = -EINVAL; + goto exit; + } ip_pkt = (u8 *)nla_data(attr); break; @@ -1526,10 +1534,18 @@ static int slsi_start_keepalive_offload(struct wiphy *wiphy, struct wireless_dev break; case MKEEP_ALIVE_ATTRIBUTE_DST_MAC_ADDR: + if (nla_len(attr) < ETH_ALEN) { + r = -EINVAL; + goto exit; + } dst_mac_addr = (u8 *)nla_data(attr); break; case MKEEP_ALIVE_ATTRIBUTE_SRC_MAC_ADDR: + if (nla_len(attr) < ETH_ALEN) { + r = -EINVAL; + goto exit; + } src_mac_addr = (u8 *)nla_data(attr); break; @@ -1556,7 +1572,7 @@ static int slsi_start_keepalive_offload(struct wiphy *wiphy, struct wireless_dev */ slsi_mlme_send_frame_mgmt(sdev, net_dev, NULL, 0, FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME, - FAPI_MESSAGETYPE_ANY_OTHER, + FAPI_MESSAGETYPE_PERIODIC_OFFLOAD, ndev_vif->sta.keepalive_host_tag[index - 1], 0, 0, 0); skb = slsi_alloc_skb(sizeof(struct ethhdr) + ip_pkt_len, GFP_KERNEL); @@ -1595,7 +1611,7 @@ static int slsi_start_keepalive_offload(struct wiphy *wiphy, struct wireless_dev ip_send_check(ip_hdr(skb)); host_tag = slsi_tx_mgmt_host_tag(sdev); - r = slsi_mlme_send_frame_data(sdev, net_dev, skb, FAPI_MESSAGETYPE_ANY_OTHER, host_tag, + r = slsi_mlme_send_frame_data(sdev, net_dev, skb, FAPI_MESSAGETYPE_PERIODIC_OFFLOAD, host_tag, 0, (period * 1000)); if (r == 0) ndev_vif->sta.keepalive_host_tag[index - 1] = host_tag; @@ -1669,7 +1685,7 @@ static int slsi_stop_keepalive_offload(struct wiphy *wiphy, struct wireless_dev } r = slsi_mlme_send_frame_mgmt(sdev, net_dev, NULL, 0, FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME, - FAPI_MESSAGETYPE_ANY_OTHER, ndev_vif->sta.keepalive_host_tag[index - 1], 0, 0, 0); + FAPI_MESSAGETYPE_PERIODIC_OFFLOAD, ndev_vif->sta.keepalive_host_tag[index - 1], 0, 0, 0); ndev_vif->sta.keepalive_host_tag[index - 1] = 0; exit: @@ -1761,25 +1777,46 @@ static int slsi_set_epno_ssid(struct wiphy *wiphy, type = nla_type(iter); switch (type) { case SLSI_ATTRIBUTE_EPNO_MINIMUM_5G_RSSI: - slsi_util_nla_get_u16(iter, &epno_params->min_5g_rssi); + if (slsi_util_nla_get_u16(iter, &epno_params->min_5g_rssi)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_MINIMUM_2G_RSSI: - slsi_util_nla_get_u16(iter, &epno_params->min_2g_rssi); + if (slsi_util_nla_get_u16(iter, &epno_params->min_2g_rssi)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_INITIAL_SCORE_MAX: - slsi_util_nla_get_u16(iter, &epno_params->initial_score_max); + if (slsi_util_nla_get_u16(iter, &epno_params->initial_score_max)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_CUR_CONN_BONUS: - slsi_util_nla_get_u8(iter, &epno_params->current_connection_bonus); + if (slsi_util_nla_get_u8(iter, &epno_params->current_connection_bonus)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_SAME_NETWORK_BONUS: - slsi_util_nla_get_u8(iter, &epno_params->same_network_bonus); + if (slsi_util_nla_get_u8(iter, &epno_params->same_network_bonus)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_SECURE_BONUS: - slsi_util_nla_get_u8(iter, &epno_params->secure_bonus); + if (slsi_util_nla_get_u8(iter, &epno_params->secure_bonus)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_5G_BONUS: - slsi_util_nla_get_u8(iter, &epno_params->band_5g_bonus); + if (slsi_util_nla_get_u8(iter, &epno_params->band_5g_bonus)) { + r = -EINVAL; + goto exit; + } break; case SLSI_ATTRIBUTE_EPNO_SSID_LIST: nla_for_each_nested(outer, iter, tmp) { @@ -1792,7 +1829,10 @@ static int slsi_set_epno_ssid(struct wiphy *wiphy, } break; case SLSI_ATTRIBUTE_EPNO_SSID_NUM: - slsi_util_nla_get_u8(iter, &val); + if (slsi_util_nla_get_u8(iter, &val)) { + r = -EINVAL; + goto exit; + } num = (int)val; if (num > SLSI_GSCAN_MAX_EPNO_SSIDS) { SLSI_ERR(sdev, "Cannot support %d SSIDs. max %d\n", num, SLSI_GSCAN_MAX_EPNO_SSIDS); @@ -2778,6 +2818,7 @@ static int slsi_set_country_code(struct wiphy *wiphy, struct wireless_dev *wdev, return ret; } +#ifdef CONFIG_SCSC_WLAN_STA_APF static int slsi_apf_read_filter(struct wiphy *wiphy, struct wireless_dev *wdev, const void *data, int len) { int ret = 0; @@ -2932,6 +2973,7 @@ exit: SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); return ret; } +#endif static int slsi_rtt_get_capabilities(struct wiphy *wiphy, struct wireless_dev *wdev, const void *data, int len) { @@ -3581,7 +3623,7 @@ static int slsi_set_roaming_state(struct wiphy *wiphy, struct wireless_dev *wdev } SLSI_DBG1_NODEV(SLSI_GSCAN, "SUBCMD_SET_ROAMING_STATE roam_state = %d\n", roam_state); - ret = slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAMING_ENABLED, roam_state); + ret = slsi_set_mib_roam(sdev, NULL, SLSI_PSID_UNIFI_ROAMING_ACTIVATED, roam_state); if (ret < 0) SLSI_ERR_NODEV("Failed to set roaming state\n"); @@ -5603,6 +5645,7 @@ static const struct wiphy_vendor_command slsi_vendor_cmd[] = { .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV, .doit = slsi_acs_init }, +#ifdef CONFIG_SCSC_WLAN_STA_APF { { .vendor_id = OUI_GOOGLE, @@ -5627,6 +5670,7 @@ static const struct wiphy_vendor_command slsi_vendor_cmd[] = { .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV, .doit = slsi_apf_read_filter }, +#endif { { .vendor_id = OUI_GOOGLE, diff --git a/drivers/net/wireless/scsc/nl80211_vendor_nan.c b/drivers/net/wireless/scsc/nl80211_vendor_nan.c index 039149cca..ec22b177e 100755 --- a/drivers/net/wireless/scsc/nl80211_vendor_nan.c +++ b/drivers/net/wireless/scsc/nl80211_vendor_nan.c @@ -219,23 +219,28 @@ static int slsi_nan_get_sdea_params_nl(struct slsi_dev *sdev, struct slsi_nan_sd { switch (nl_attr_id) { case NAN_REQ_ATTR_SDEA_PARAM_NDP_TYPE: - sdea_params->ndp_type = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sdea_params->ndp_type))) + return -EINVAL; sdea_params->config_nan_data_path = 1; break; case NAN_REQ_ATTR_SDEA_PARAM_SECURITY_CFG: - sdea_params->security_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sdea_params->security_cfg))) + return -EINVAL; sdea_params->config_nan_data_path = 1; break; case NAN_REQ_ATTR_SDEA_PARAM_RANGING_STATE: - sdea_params->ranging_state = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sdea_params->ranging_state))) + return -EINVAL; sdea_params->config_nan_data_path = 1; break; case NAN_REQ_ATTR_SDEA_PARAM_RANGE_REPORT: - sdea_params->range_report = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sdea_params->range_report))) + return -EINVAL; sdea_params->config_nan_data_path = 1; break; case NAN_REQ_ATTR_SDEA_PARAM_QOS_CFG: - sdea_params->qos_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sdea_params->qos_cfg))) + return -EINVAL; sdea_params->config_nan_data_path = 1; break; default: @@ -249,16 +254,20 @@ static int slsi_nan_get_ranging_cfg_nl(struct slsi_dev *sdev, struct slsi_nan_ra { switch (nl_attr_id) { case NAN_REQ_ATTR_RANGING_CFG_INTERVAL: - ranging_cfg->ranging_interval_msec = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(ranging_cfg->ranging_interval_msec))) + return -EINVAL; break; case NAN_REQ_ATTR_RANGING_CFG_INDICATION: - ranging_cfg->config_ranging_indications = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(ranging_cfg->config_ranging_indications))) + return -EINVAL; break; case NAN_REQ_ATTR_RANGING_CFG_INGRESS_MM: - ranging_cfg->distance_ingress_mm = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(ranging_cfg->distance_ingress_mm))) + return -EINVAL; break; case NAN_REQ_ATTR_RANGING_CFG_EGRESS_MM: - ranging_cfg->distance_egress_mm = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(ranging_cfg->distance_egress_mm))) + return -EINVAL; break; default: return -EINVAL; @@ -273,32 +282,41 @@ static int slsi_nan_get_security_info_nl(struct slsi_dev *sdev, struct slsi_nan_ switch (nl_attr_id) { case NAN_REQ_ATTR_CIPHER_TYPE: - sec_info->cipher_type = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(sec_info->cipher_type))) + return -EINVAL; break; case NAN_REQ_ATTR_SECURITY_KEY_TYPE: - sec_info->key_info.key_type = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(sec_info->key_info.key_type))) + return -EINVAL; break; case NAN_REQ_ATTR_SECURITY_PMK_LEN: - len = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &len)) + return -EINVAL; sec_info->key_info.body.pmk_info.pmk_len = len; break; case NAN_REQ_ATTR_SECURITY_PMK: - memcpy(sec_info->key_info.body.pmk_info.pmk, nla_data(iter), len); + if (slsi_util_nla_get_data(iter, sec_info->key_info.body.pmk_info.pmk_len, sec_info->key_info.body.pmk_info.pmk)) + return -EINVAL; break; case NAN_REQ_ATTR_SECURITY_PASSPHRASE_LEN: - len = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &len)) + return -EINVAL; sec_info->key_info.body.passphrase_info.passphrase_len = len; break; case NAN_REQ_ATTR_SECURITY_PASSPHRASE: - memcpy(sec_info->key_info.body.passphrase_info.passphrase, nla_data(iter), len); + if (slsi_util_nla_get_data(iter, sec_info->key_info.body.passphrase_info.passphrase_len, + sec_info->key_info.body.passphrase_info.passphrase)) + return -EINVAL; break; case NAN_REQ_ATTR_SCID_LEN: - sec_info->scid_len = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(sec_info->scid_len))) + return -EINVAL; break; case NAN_REQ_ATTR_SCID: if (sec_info->scid_len > sizeof(sec_info->scid)) sec_info->scid_len = sizeof(sec_info->scid); - memcpy(sec_info->scid, nla_data(iter), sec_info->scid_len); + if (slsi_util_nla_get_data(iter, sec_info->scid_len, sec_info->scid)) + return -EINVAL; break; default: return -EINVAL; @@ -311,19 +329,23 @@ static int slsi_nan_get_range_resp_cfg_nl(struct slsi_dev *sdev, struct slsi_nan { switch (nl_attr_id) { case NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PUBLISH_ID: - cfg->publish_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(cfg->publish_id))) + return -EINVAL; break; case NAN_REQ_ATTR_RANGE_RESPONSE_CFG_REQUESTOR_ID: - cfg->requestor_instance_id = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(cfg->requestor_instance_id))) + return -EINVAL; break; case NAN_REQ_ATTR_RANGE_RESPONSE_CFG_PEER_ADDR: - memcpy(cfg->peer_addr, nla_data(iter), ETH_ALEN); + if (slsi_util_nla_get_data(iter, ETH_ALEN, cfg->peer_addr)) + return -EINVAL; break; case NAN_REQ_ATTR_RANGE_RESPONSE_CFG_RANGING_RESPONSE: - cfg->ranging_response = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(cfg->ranging_response))) + return -EINVAL; break; default: @@ -505,30 +527,38 @@ static int slsi_nan_enable_get_nl_params(struct slsi_dev *sdev, struct slsi_hal_ break; case NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL: - hal_req->subscribe_sid_beacon_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->subscribe_sid_beacon_val = (u32)val; hal_req->config_subscribe_sid_beacon = 1; break; case NAN_REQ_ATTR_DW_2G4_INTERVAL: - hal_req->dw_2dot4g_interval_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->dw_2dot4g_interval_val = (u32)val; /* valid range for 2.4G is 1-5 */ if (hal_req->dw_2dot4g_interval_val > 0 && hal_req->dw_2dot4g_interval_val < 5) hal_req->config_2dot4g_dw_band = 1; break; case NAN_REQ_ATTR_DW_5G_INTERVAL: - hal_req->dw_5g_interval_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->dw_5g_interval_val = (u32)val; /* valid range for 5g is 0-5 */ if (hal_req->dw_5g_interval_val < 5) hal_req->config_5g_dw_band = 1; break; case NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL: - hal_req->disc_mac_addr_rand_interval_sec = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(hal_req->disc_mac_addr_rand_interval_sec))) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -632,7 +662,8 @@ int slsi_nan_disable(struct wiphy *wiphy, struct wireless_dev *wdev, const void type = nla_type(iter); switch (type) { case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(transaction_id))) + return -EINVAL; break; default: break; @@ -774,20 +805,23 @@ static int slsi_nan_publish_get_nl_params(struct slsi_dev *sdev, struct slsi_hal break; case NAN_REQ_ATTR_PUBLISH_SDEA_LEN: - hal_req->sdea_service_specific_info_len = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->sdea_service_specific_info_len))) + return -EINVAL; break; case NAN_REQ_ATTR_PUBLISH_SDEA: - memcpy(hal_req->sdea_service_specific_info, nla_data(iter), - hal_req->sdea_service_specific_info_len); + if (slsi_util_nla_get_data(iter, hal_req->sdea_service_specific_info_len, hal_req->sdea_service_specific_info)) + return -EINVAL; break; case NAN_REQ_ATTR_RANGING_AUTO_RESPONSE: - hal_req->ranging_auto_response = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ranging_auto_response))) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -907,7 +941,8 @@ int slsi_nan_publish_cancel(struct wiphy *wiphy, struct wireless_dev *wdev, return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(transaction_id))) + return -EINVAL; break; default: @@ -1065,20 +1100,24 @@ static int slsi_nan_subscribe_get_nl_params(struct slsi_dev *sdev, struct slsi_h break; case NAN_REQ_ATTR_PUBLISH_SDEA_LEN: - hal_req->sdea_service_specific_info_len = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->sdea_service_specific_info_len))) + return -EINVAL; break; case NAN_REQ_ATTR_PUBLISH_SDEA: - memcpy(hal_req->sdea_service_specific_info, nla_data(iter), - hal_req->sdea_service_specific_info_len); + if (slsi_util_nla_get_data(iter, hal_req->sdea_service_specific_info_len, + hal_req->sdea_service_specific_info)) + return -EINVAL; break; case NAN_REQ_ATTR_RANGING_AUTO_RESPONSE: - hal_req->ranging_auto_response = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ranging_auto_response))) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -1190,7 +1229,10 @@ int slsi_nan_subscribe_cancel(struct wiphy *wiphy, struct wireless_dev *wdev, co } break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(transaction_id))) { + reply_status = SLSI_HAL_NAN_STATUS_INVALID_PARAM; + goto exit; + } break; default: SLSI_ERR(sdev, "Unexpected NAN subscribecancel attribute TYPE:%d\n", type); @@ -1274,16 +1316,19 @@ static int slsi_nan_followup_get_nl_params(struct slsi_dev *sdev, struct slsi_ha break; case NAN_REQ_ATTR_PUBLISH_SDEA_LEN: - hal_req->sdea_service_specific_info_len = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->sdea_service_specific_info_len))) + return -EINVAL; break; case NAN_REQ_ATTR_PUBLISH_SDEA: - memcpy(hal_req->sdea_service_specific_info, nla_data(iter), - hal_req->sdea_service_specific_info_len); + if (slsi_util_nla_get_data(iter, hal_req->sdea_service_specific_info_len, + hal_req->sdea_service_specific_info)) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -1590,30 +1635,39 @@ static int slsi_nan_config_get_nl_params(struct slsi_dev *sdev, struct slsi_hal_ break; case NAN_REQ_ATTR_SUBSCRIBE_SID_BEACON_VAL: - hal_req->subscribe_sid_beacon_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->subscribe_sid_beacon_val = (u32)val; hal_req->config_subscribe_sid_beacon = 1; break; case NAN_REQ_ATTR_DW_2G4_INTERVAL: - hal_req->dw_2dot4g_interval_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->dw_2dot4g_interval_val = (u32)val; /* valid range for 2.4G is 1-5 */ if (hal_req->dw_2dot4g_interval_val > 0 && hal_req->dw_2dot4g_interval_val < 6) hal_req->config_2dot4g_dw_band = 1; break; case NAN_REQ_ATTR_DW_5G_INTERVAL: - hal_req->dw_5g_interval_val = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->dw_5g_interval_val = (u32)val; /* valid range for 5g is 0-5 */ if (hal_req->dw_5g_interval_val < 6) hal_req->config_5g_dw_band = 1; break; case NAN_REQ_ATTR_DISC_MAC_ADDR_RANDOM_INTERVAL: - hal_req->disc_mac_addr_rand_interval_sec = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->disc_mac_addr_rand_interval_sec = (u32)val; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -1715,7 +1769,8 @@ int slsi_nan_get_capabilities(struct wiphy *wiphy, struct wireless_dev *wdev, co type = nla_type(iter); switch (type) { case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(transaction_id))) + return -EINVAL; break; default: break; @@ -1800,10 +1855,16 @@ int slsi_nan_data_iface_create(struct wiphy *wiphy, struct wireless_dev *wdev, c nla_for_each_attr(iter, data, len, tmp) { type = nla_type(iter); - if (type == NAN_REQ_ATTR_DATA_INTERFACE_NAME) + if (type == NAN_REQ_ATTR_DATA_INTERFACE_NAME) { + /* 16 is the interface length from net_device + * structure. + */ + if (nla_len(iter) > IFNAMSIZ) + return -EINVAL; iface_name = nla_data(iter); - else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) - transaction_id = nla_get_u16(iter); + } else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) + if (slsi_util_nla_get_u16(iter, &(transaction_id))) + return -EINVAL; } if (!iface_name) { SLSI_ERR(sdev, "No NAN data interface name\n"); @@ -1869,10 +1930,16 @@ int slsi_nan_data_iface_delete(struct wiphy *wiphy, struct wireless_dev *wdev, c nla_for_each_attr(iter, data, len, tmp) { type = nla_type(iter); - if (type == NAN_REQ_ATTR_DATA_INTERFACE_NAME) + if (type == NAN_REQ_ATTR_DATA_INTERFACE_NAME) { + /* 16 is the interface length from net_device + * structure. + */ + if (nla_len(iter) > IFNAMSIZ) + return -EINVAL; iface_name = nla_data(iter); - else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) - transaction_id = nla_get_u16(iter); + } else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) + if (slsi_util_nla_get_u16(iter, &(transaction_id))) + return -EINVAL; } if (!iface_name) { SLSI_ERR(sdev, "No NAN data interface name\n"); @@ -1911,54 +1978,67 @@ int slsi_nan_ndp_initiate_get_nl_params(struct slsi_dev *sdev, struct slsi_hal_n type = nla_type(iter); switch (type) { case NAN_REQ_ATTR_REQ_INSTANCE_ID: - hal_req->requestor_instance_id = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(hal_req->requestor_instance_id))) + return -EINVAL; break; case NAN_REQ_ATTR_CHAN_REQ_TYPE: - hal_req->channel_request_type = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->channel_request_type))) + return -EINVAL; break; case NAN_REQ_ATTR_CHAN: - hal_req->channel = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(hal_req->channel))) + return -EINVAL; break; case NAN_REQ_ATTR_MAC_ADDR_VAL: + if (nla_len(iter) < ETH_ALEN) + return -EINVAL; ether_addr_copy(hal_req->peer_disc_mac_addr, nla_data(iter)); break; case NAN_REQ_ATTR_DATA_INTERFACE_NAME: - memcpy(hal_req->ndp_iface, nla_data(iter), IFNAMSIZ); + if (slsi_util_nla_get_data(iter, IFNAMSIZ, hal_req->ndp_iface)) + return -EINVAL; break; case NAN_REQ_ATTR_DATA_INTERFACE_NAME_LEN: break; case NAN_REQ_ATTR_SDEA_PARAM_SECURITY_CFG: - hal_req->ndp_cfg.security_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ndp_cfg.security_cfg))) + return -EINVAL; break; case NAN_REQ_ATTR_SDEA_PARAM_QOS_CFG: - hal_req->ndp_cfg.qos_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ndp_cfg.qos_cfg))) + return -EINVAL; break; case NAN_REQ_ATTR_APP_INFO_LEN: - hal_req->app_info.ndp_app_info_len = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->app_info.ndp_app_info_len))) + return -EINVAL; break; case NAN_REQ_ATTR_APP_INFO: - memcpy(hal_req->app_info.ndp_app_info, nla_data(iter), hal_req->app_info.ndp_app_info_len); + if (slsi_util_nla_get_data(iter, hal_req->app_info.ndp_app_info_len, hal_req->app_info.ndp_app_info)) + return -EINVAL; break; case NAN_REQ_ATTR_SERVICE_NAME_LEN: - hal_req->service_name_len = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(hal_req->service_name_len))) + return -EINVAL; break; case NAN_REQ_ATTR_SERVICE_NAME: - memcpy(hal_req->service_name, nla_data(iter), hal_req->service_name_len); + if (slsi_util_nla_get_data(iter, hal_req->service_name_len, hal_req->service_name)) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -2047,51 +2127,65 @@ int slsi_nan_ndp_respond_get_nl_param(struct slsi_dev *sdev, struct slsi_hal_nan { int type, tmp, r; const struct nlattr *iter; + u8 val = 0; + u32 value = 0; memset(hal_req, 0, sizeof(*hal_req)); nla_for_each_attr(iter, data, len, tmp) { type = nla_type(iter); switch (type) { case NAN_REQ_ATTR_NDP_INSTANCE_ID: - hal_req->ndp_instance_id = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &(hal_req->ndp_instance_id))) + return -EINVAL; break; case NAN_REQ_ATTR_DATA_INTERFACE_NAME: - memcpy(hal_req->ndp_iface, nla_data(iter), IFNAMSIZ); + if (slsi_util_nla_get_data(iter, IFNAMSIZ, hal_req->ndp_iface)) + return -EINVAL; break; case NAN_REQ_ATTR_DATA_INTERFACE_NAME_LEN: break; case NAN_REQ_ATTR_SDEA_PARAM_SECURITY_CFG: - hal_req->ndp_cfg.security_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ndp_cfg.security_cfg))) + return -EINVAL; break; case NAN_REQ_ATTR_SDEA_PARAM_QOS_CFG: - hal_req->ndp_cfg.qos_cfg = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &(hal_req->ndp_cfg.qos_cfg))) + return -EINVAL; break; case NAN_REQ_ATTR_APP_INFO_LEN: - hal_req->app_info.ndp_app_info_len = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->app_info.ndp_app_info_len))) + return -EINVAL; break; case NAN_REQ_ATTR_APP_INFO: - memcpy(hal_req->app_info.ndp_app_info, nla_data(iter), hal_req->app_info.ndp_app_info_len); + if (slsi_util_nla_get_data(iter, hal_req->app_info.ndp_app_info_len, hal_req->app_info.ndp_app_info)) + return -EINVAL; break; case NAN_REQ_ATTR_NDP_RESPONSE_CODE: - hal_req->rsp_code = nla_get_u8(iter); + if (slsi_util_nla_get_u8(iter, &val)) + return -EINVAL; + hal_req->rsp_code = (u32)val; break; case NAN_REQ_ATTR_SERVICE_NAME_LEN: - hal_req->service_name_len = nla_get_u32(iter); + if (slsi_util_nla_get_u32(iter, &value)) + return -EINVAL; + hal_req->service_name_len = (u8)value; break; case NAN_REQ_ATTR_SERVICE_NAME: - memcpy(hal_req->service_name, nla_data(iter), hal_req->service_name_len); + if (slsi_util_nla_get_data(iter, hal_req->service_name_len, hal_req->service_name)) + return -EINVAL; break; case NAN_REQ_ATTR_HAL_TRANSACTION_ID: - hal_req->transaction_id = nla_get_u16(iter); + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; break; default: @@ -2167,14 +2261,18 @@ int slsi_nan_ndp_end_get_nl_params(struct slsi_dev *sdev, struct slsi_hal_nan_da { int type, tmp; const struct nlattr *iter; - + u32 val = 0; memset(hal_req, 0, sizeof(*hal_req)); nla_for_each_attr(iter, data, len, tmp) { type = nla_type(iter); - if (type == NAN_REQ_ATTR_NDP_INSTANCE_ID && hal_req->num_ndp_instances < SLSI_NAN_MAX_NDP_INSTANCES) - hal_req->ndp_instance_id[hal_req->num_ndp_instances++] = nla_get_u32(iter); - else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) - hal_req->transaction_id = nla_get_u16(iter); + if (type == NAN_REQ_ATTR_NDP_INSTANCE_ID && hal_req->num_ndp_instances < SLSI_NAN_MAX_NDP_INSTANCES) { + if (slsi_util_nla_get_u32(iter, &val)) + return -EINVAL; + hal_req->ndp_instance_id[hal_req->num_ndp_instances++] = val; + } else if (type == NAN_REQ_ATTR_HAL_TRANSACTION_ID) { + if (slsi_util_nla_get_u16(iter, &(hal_req->transaction_id))) + return -EINVAL; + } } return SLSI_HAL_NAN_STATUS_SUCCESS; } diff --git a/drivers/net/wireless/scsc/rx.c b/drivers/net/wireless/scsc/rx.c index a47ba042d..cdca3e2bd 100755 --- a/drivers/net/wireless/scsc/rx.c +++ b/drivers/net/wireless/scsc/rx.c @@ -1020,12 +1020,12 @@ struct slsi_acs_chan_info *slsi_acs_scan_results(struct slsi_dev *sdev, struct n ies_len); idx = slsi_find_chan_idx(scan_channel->hw_value, ndev_vif->scan[SLSI_SCAN_HW_ID].acs_request->hw_mode); - SLSI_DBG3(sdev, SLSI_MLME, "chan_idx:%d chan_value: %d\n", idx, ch_info[idx].chan); - if (idx < 0) { SLSI_DBG3(sdev, SLSI_MLME, "idx is not in range idx=%d\n", idx); goto next_scan; } + SLSI_DBG3(sdev, SLSI_MLME, "chan_idx:%d chan_value: %d\n", idx, ch_info[idx].chan); + if (ch_info[idx].chan) { ch_info[idx].num_ap += 1; ie = cfg80211_find_ie(WLAN_EID_QBSS_LOAD, mgmt->u.beacon.variable, ies_len); @@ -1783,15 +1783,15 @@ void slsi_rx_connected_ind(struct slsi_dev *sdev, struct net_device *dev, struct { struct netdev_vif *ndev_vif = netdev_priv(dev); struct slsi_peer *peer = NULL; - u16 aid = fapi_get_u16(skb, u.mlme_connected_ind.association_identifier); + u16 peer_index = fapi_get_u16(skb, u.mlme_connected_ind.peer_index); - /* For AP mode, peer_index value is equivalent to aid(association_index) value */ + /* For AP mode, peer_index value is equivalent to peer_index value */ SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_connected_ind(vif:%d, peer_index:%d)\n", fapi_get_vif(skb), - aid); + peer_index); SLSI_INFO(sdev, "Received Association Response\n"); if (!ndev_vif->activated) { @@ -1805,14 +1805,14 @@ void slsi_rx_connected_ind(struct slsi_dev *sdev, struct net_device *dev, struct switch (ndev_vif->vif_type) { case FAPI_VIFTYPE_AP: { - if (aid < SLSI_PEER_INDEX_MIN || aid > SLSI_PEER_INDEX_MAX) { - SLSI_NET_ERR(dev, "Received incorrect peer_index: %d\n", aid); + if (peer_index < SLSI_PEER_INDEX_MIN || peer_index > SLSI_PEER_INDEX_MAX) { + SLSI_NET_ERR(dev, "Received incorrect peer_index: %d\n", peer_index); goto exit_with_lock; } - peer = slsi_get_peer_from_qs(sdev, dev, aid - 1); + peer = slsi_get_peer_from_qs(sdev, dev, peer_index - 1); if (!peer) { - SLSI_NET_ERR(dev, "Peer (aid:%d) Not Found - Disconnect peer\n", aid); + SLSI_NET_ERR(dev, "Peer (peer_index:%d) Not Found - Disconnect peer\n", peer_index); goto exit_with_lock; } @@ -1823,7 +1823,7 @@ void slsi_rx_connected_ind(struct slsi_dev *sdev, struct net_device *dev, struct slsi_ps_port_control(sdev, dev, peer, SLSI_STA_CONN_STATE_DOING_KEY_CONFIG); } else { peer->connected_state = SLSI_STA_CONN_STATE_CONNECTED; - slsi_mlme_connected_resp(sdev, dev, aid); + slsi_mlme_connected_resp(sdev, dev, peer_index); slsi_ps_port_control(sdev, dev, peer, SLSI_STA_CONN_STATE_CONNECTED); } slsi_rx_buffered_frames(sdev, dev, peer); @@ -1994,12 +1994,12 @@ void slsi_rx_connect_ind(struct slsi_dev *sdev, struct net_device *dev, struct s SLSI_INFO(sdev, "Connect failed,Result code:AUTH_NO_ACK\n"); } else if (fw_result_code == FAPI_RESULTCODE_ASSOC_NO_ACK) { SLSI_INFO(sdev, "Connect failed,Result code:ASSOC_NO_ACK\n"); - } else if (fw_result_code >= FAPI_RESULTCODE_AUTH_FAILED_CODE && fw_result_code <= 0x81FF) { - if (fw_result_code != FAPI_RESULTCODE_AUTH_FAILED_CODE) + } else if (fw_result_code >= 0x8100 && fw_result_code <= 0x81FF) { + if (fw_result_code != 0x8100) fw_result_code = fw_result_code & 0x00FF; SLSI_INFO(sdev, "Connect failed(Auth failure), Result code:0x%04x\n", fw_result_code); - } else if (fw_result_code >= FAPI_RESULTCODE_ASSOC_FAILED_CODE && fw_result_code <= 0x82FF) { - if (fw_result_code != FAPI_RESULTCODE_ASSOC_FAILED_CODE) + } else if (fw_result_code >= 0x8200 && fw_result_code <= 0x82FF) { + if (fw_result_code != 0x8200) fw_result_code = fw_result_code & 0x00FF; SLSI_INFO(sdev, "Connect failed(Assoc Failure), Result code:0x%04x\n", fw_result_code); if (fapi_get_datalen(skb)) { @@ -2305,10 +2305,10 @@ void slsi_rx_procedure_started_ind(struct slsi_dev *sdev, struct net_device *dev SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); - SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_procedure_started_ind(vif:%d, type:%d, aid:%d)\n", + SLSI_NET_DBG1(dev, SLSI_MLME, "mlme_procedure_started_ind(vif:%d, type:%d, peer_index:%d)\n", fapi_get_vif(skb), fapi_get_u16(skb, u.mlme_procedure_started_ind.procedure_type), - fapi_get_u16(skb, u.mlme_procedure_started_ind.association_identifier)); + fapi_get_u16(skb, u.mlme_procedure_started_ind.peer_index)); SLSI_INFO(sdev, "Send Association Request\n"); if (!ndev_vif->activated) { @@ -2321,20 +2321,20 @@ void slsi_rx_procedure_started_ind(struct slsi_dev *sdev, struct net_device *dev switch (ndev_vif->vif_type) { case FAPI_VIFTYPE_AP: { - u16 aid = fapi_get_u16(skb, u.mlme_procedure_started_ind.association_identifier); + u16 peer_index = fapi_get_u16(skb, u.mlme_procedure_started_ind.peer_index); /* Check for MAX client */ if ((ndev_vif->peer_sta_records + 1) > SLSI_AP_PEER_CONNECTIONS_MAX) { - SLSI_NET_ERR(dev, "MAX Station limit reached. Ignore ind for aid:%d\n", aid); + SLSI_NET_ERR(dev, "MAX Station limit reached. Ignore ind for peer_index:%d\n", peer_index); goto exit_with_lock; } - if (aid < SLSI_PEER_INDEX_MIN || aid > SLSI_PEER_INDEX_MAX) { - SLSI_NET_ERR(dev, "Received incorrect aid: %d\n", aid); + if (peer_index < SLSI_PEER_INDEX_MIN || peer_index > SLSI_PEER_INDEX_MAX) { + SLSI_NET_ERR(dev, "Received incorrect peer_index: %d\n", peer_index); goto exit_with_lock; } - peer = slsi_peer_add(sdev, dev, (fapi_get_mgmt(skb))->sa, aid); + peer = slsi_peer_add(sdev, dev, (fapi_get_mgmt(skb))->sa, peer_index); if (!peer) { SLSI_NET_ERR(dev, "Peer NOT Created\n"); goto exit_with_lock; diff --git a/drivers/net/wireless/scsc/sap_ma.c b/drivers/net/wireless/scsc/sap_ma.c index 04daa8d79..bb64c08db 100755 --- a/drivers/net/wireless/scsc/sap_ma.c +++ b/drivers/net/wireless/scsc/sap_ma.c @@ -103,14 +103,23 @@ static int slsi_rx_amsdu_deaggregate(struct net_device *dev, struct sk_buff *skb msdu_len = (skb->data[ETH_ALEN * 2] << 8) | skb->data[(ETH_ALEN * 2) + 1]; /* check if the length of sub-frame is valid */ - if (msdu_len > skb->len) { + if (!msdu_len || msdu_len >= skb->len) { SLSI_NET_ERR(dev, "invalid MSDU length %d, SKB length = %d\n", msdu_len, skb->len); + __skb_queue_purge(msdu_list); slsi_kfree_skb(skb); return -EINVAL; } subframe_len = msdu_len + (2 * ETH_ALEN) + 2; + /* check if the length of sub-frame is valid */ + if (subframe_len > skb->len) { + SLSI_NET_ERR(dev, "invalid subframe length %d, SKB length = %d\n", subframe_len, skb->len); + __skb_queue_purge(msdu_list); + slsi_kfree_skb(skb); + return -EINVAL; + } + /* For the last subframe skb length and subframe length will be same */ if (skb->len == subframe_len) { /* Use the original skb for the last subframe */ @@ -122,6 +131,7 @@ static int slsi_rx_amsdu_deaggregate(struct net_device *dev, struct sk_buff *skb /* Clone the skb for the subframe */ subframe = slsi_skb_clone(skb, GFP_ATOMIC); if (!subframe) { + __skb_queue_purge(msdu_list); slsi_kfree_skb(skb); SLSI_NET_ERR(dev, "Failed to clone the SKB for A-MSDU subframe\n"); return -ENOMEM; @@ -157,8 +167,18 @@ static int slsi_rx_amsdu_deaggregate(struct net_device *dev, struct sk_buff *skb } /* If this is not the last subframe then move to the next subframe */ - if (skb != subframe) - skb_pull(skb, (subframe_len + padding)); + if (skb != subframe) { + /* If A-MSDU is not formed correctly (e.g when skb->len < subframe_len + padding), + * skb_pull() will return NULL without any manipulation in skb. + * It can lead to infinite loop. + */ + if (!skb_pull(skb, (subframe_len + padding))) { + SLSI_NET_ERR(dev, "Invalid subframe + padding length=%d, SKB length=%d\n", subframe_len + padding, skb->len); + __skb_queue_purge(msdu_list); + slsi_kfree_skb(skb); + return -EINVAL; + } + } /* If this frame has been filtered out, free the clone and continue */ if (skip_frame) { diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index caa58b58f..0850cc95f 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -4052,6 +4052,108 @@ void regulator_unregister(struct regulator_dev *rdev) device_unregister(&rdev->dev); } EXPORT_SYMBOL_GPL(regulator_unregister); +#ifdef CONFIG_SEC_PM_DEBUG +struct rdev_check_data { + struct regulator_dev *parent; + int level; +}; + +static void regulator_show_enabled_subtree(struct regulator_dev *rdev, + int level); + +static int regulator_show_enabled_children(struct device *dev, void *data) +{ + struct regulator_dev *rdev = dev_to_rdev(dev); + struct rdev_check_data *check_data = data; + + if (rdev->supply && rdev->supply->rdev == check_data->parent) + regulator_show_enabled_subtree(rdev, check_data->level + 1); + + return 0; +} + +static void regulator_show_enabled_subtree(struct regulator_dev *rdev, + int level) +{ + struct regulation_constraints *c; + struct rdev_check_data check_data; + + if (!rdev) + return; + + if (rdev->use_count <= 0) + goto out; + + pr_cont("%*s%-*s %3d %4d ", + level * 3 + 1, "", + 30 - level * 3, rdev_get_name(rdev), + rdev->use_count, rdev->constraints->initial_mode); + + c = rdev->constraints; + if (c) { + switch (rdev->desc->type) { + case REGULATOR_VOLTAGE: + pr_cont("%5dmV %5dmV\n", + c->min_uV / 1000, c->max_uV / 1000); + break; + case REGULATOR_CURRENT: + pr_cont("%5dmA %5dmA\n", + c->min_uA / 1000, c->max_uA / 1000); + break; + } + } +#if 0 + struct regulator *consumer; + + list_for_each_entry(consumer, &rdev->consumer_list, list) { + if (consumer->dev && consumer->dev->class == ®ulator_class) + continue; + + pr_cont("%*s%-*s ", + (level + 1) * 3 + 1, "", + 30 - (level + 1) * 3, + consumer->dev ? dev_name(consumer->dev) : "deviceless"); + + switch (rdev->desc->type) { + case REGULATOR_VOLTAGE: + pr_cont("%14dmV %5dmV\n", + consumer->voltage[PM_SUSPEND_ON].min_uV / 1000, + consumer->voltage[PM_SUSPEND_ON].max_uV / 1000); + break; + case REGULATOR_CURRENT: + pr_cont("\n"); + break; + } + } +#endif +out: + check_data.level = level; + check_data.parent = rdev; + + class_for_each_device(®ulator_class, NULL, &check_data, + regulator_show_enabled_children); +} + +static int _regulator_show_enabled(struct device *dev, void *data) +{ + struct regulator_dev *rdev = dev_to_rdev(dev); + + if (!rdev->supply) + regulator_show_enabled_subtree(rdev, 0); + + return 0; +} + +int regulator_show_enabled(void) +{ + pr_info(" regulator use mode min max\n"); + pr_info("--------------------------------------------------------\n"); + + return class_for_each_device(®ulator_class, NULL, NULL, + _regulator_show_enabled); +} +EXPORT_SYMBOL_GPL(regulator_show_enabled); +#endif /* CONFIG_SEC_PM_DEBUG */ static int _regulator_suspend_prepare(struct device *dev, void *data) { diff --git a/drivers/security/samsung/five_tee_driver/Kconfig b/drivers/security/samsung/five_tee_driver/Kconfig new file mode 100644 index 000000000..57d33d33b --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/Kconfig @@ -0,0 +1,81 @@ +# +# TEE Driver configuration +# + +config FIVE_TEE_DRIVER + bool "Integrity TEE Driver" + depends on FIVE + default y + ---help--- + Enable Integrity Trusted Execution Environment support + +choice + prompt "FIVE Secure OS" + depends on FIVE_TEE_DRIVER + default FIVE_USE_TZDEV if TZDEV + default FIVE_USE_QSEE if QSEECOM + default FIVE_USE_TRUSTONIC + ---help--- + Select Secure OS for FIVE TEE Driver + + config FIVE_USE_TRUSTONIC + bool "Integrity TEE Driver based on Trustonic Secure OS" + depends on TRUSTONIC_TEE || TRUSTONIC_TEE_SUPPORT + ---help--- + Use Trustonic as base Trusted Execution Environment + + config FIVE_USE_TZDEV + bool "Integrity TEE Driver based on TEEgris Secure OS" + depends on TZDEV + ---help--- + Use TEEgris as base Trusted Execution Environment + + config FIVE_USE_QSEE + bool "Integrity TEE Driver based on QSEE Secure OS" + depends on QSEECOM + ---help--- + Use QSEE as base Trusted Execution Environment + +endchoice + +config TEE_DRIVER_DEBUG + bool "Integrity TEE Driver Debug mode" + depends on FIVE_TEE_DRIVER + default n + ---help--- + Enable Debug mode in TEE Driver + +config FIVE_TRUSTLET_PATH + string "FIVE trustlet" + depends on FIVE_TEE_DRIVER && FIVE_USE_TRUSTONIC && FIRMWARE_IN_KERNEL + default "five/ffffffff000000000000000000000072.tlbin" + ---help--- + This option defines FIVE trustlet path which will be built-in kernel + +config FIVE_EARLY_LOAD_TRUSTED_APP + bool "Load trusted application in early boot" + depends on FIVE_TEE_DRIVER + default y if FIVE_USE_QSEE + default n + help + Enable the load of trusted application on during initialization of driver + +config FIVE_SIGN_TA + bool "Sign FIVE TA during build" + depends on FIVE_TEE_DRIVER && FIVE_USE_QSEE + default n + help + FIVE TA will be signed during build. Otherwise pre-signed TA will be used. + +config FIVE_SIGNCLIENT_PATH + string "Path to signclient.jar" + depends on FIVE_SIGN_TA + help + Path to signclient.jar for signing FIVE TA + +config FIVE_PILSPLITTER_PATH + string "Path to pil_splitter.py" + depends on FIVE_SIGN_TA + help + Path to pil_splitter.py for preparaing TA to signing + diff --git a/drivers/security/samsung/five_tee_driver/Makefile b/drivers/security/samsung/five_tee_driver/Makefile new file mode 100644 index 000000000..0d4428725 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/Makefile @@ -0,0 +1,98 @@ +# +# Integrity TEE Driver +# +TEEC_CLIENT_PATH := multibuild/source/gp-api/client +PROTOCOL_PATH := multibuild/source/gp-api/protocol +FIVE_TEE_DRIVER_PATH := drivers/security/samsung/five_tee_driver + +obj-$(CONFIG_FIVE_TEE_DRIVER) += itee_driver.o + +itee_driver-objs += five_tee_driver.o + +ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Isecurity/samsung/five \ + -I$(FIVE_TEE_DRIVER_PATH)/$(PROTOCOL_PATH) \ + -I$(FIVE_TEE_DRIVER_PATH)/$(TEEC_CLIENT_PATH) + +ccflags-$(CONFIG_FIVE_USE_TRUSTONIC) += -DCONFIG_TRUSTONIC +ccflags-$(CONFIG_FIVE_USE_TZDEV) += -DCONFIG_TEEGRIS +ccflags-$(CONFIG_FIVE_USE_QSEE) += -DCONFIG_QSEE + +# Trustonic +obj-$(CONFIG_FIVE_USE_TRUSTONIC) += $(TEEC_CLIENT_PATH)/tee_client_api.o \ + $(PROTOCOL_PATH)/teec_param_utils.o \ + $(TEEC_CLIENT_PATH)/teec_common_tbase.o \ + $(TEEC_CLIENT_PATH)/teec_operation_tbase.o \ + $(TEEC_CLIENT_PATH)/tee_client_api.o + +ccflags-$(CONFIG_FIVE_USE_TRUSTONIC) += -I$(FIVE_TEE_DRIVER_PATH)/multibuild/include/gp-api +ifeq ($(CONFIG_FIVE_USE_TRUSTONIC), y) + ifeq ($(CONFIG_SOC_EXYNOS7570), y) + PLATFORM := exynos7570 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_SOC_EXYNOS7870), y) + PLATFORM := exynos7870 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_SOC_EXYNOS7885), y) + PLATFORM := exynos7885 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_SOC_EXYNOS9810), y) + PLATFORM := exynos9810 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_SOC_EXYNOS9820), y) + PLATFORM := exynos9820 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_SOC_EXYNOS9610), y) + PLATFORM := exynos9610 + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/gud/gud-$(PLATFORM)/MobiCoreDriver/public + else ifeq ($(CONFIG_MACH_MT6768), y) + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/misc/mediatek/gud/410/MobiCoreDriver + ccflags-$(CONFIG_FIVE_TEE_DRIVER) += -Idrivers/misc/mediatek/gud/410/MobiCoreDriver/public + else + $(error "Unknown SoC") + endif +endif + +# QSEE +obj-$(CONFIG_FIVE_USE_QSEE) += $(TEEC_CLIENT_PATH)/tee_client_api.o \ + $(PROTOCOL_PATH)/teec_param_utils.o \ + $(TEEC_CLIENT_PATH)/teec_common_qsee.o \ + $(TEEC_CLIENT_PATH)/teec_operation_qsee.o + +ccflags-$(CONFIG_FIVE_USE_QSEE) += -I$(FIVE_TEE_DRIVER_PATH)/multibuild/include/gp-api \ + -Idrivers/misc +aflags-$(CONFIG_FIVE_USE_QSEE) += -I$(srctree) + +# Teegris +ifeq ($(CONFIG_SOC_EXYNOS7570), y) + use_teegris_v2 := y +endif + +ifeq ($(CONFIG_SOC_EXYNOS7870), y) + use_teegris_v2 := y +endif + +ifeq ($(CONFIG_SOC_EXYNOS7885), y) + ifeq ($(CONFIG_TEEGRIS_VERSION), 3) + ccflags-$(CONFIG_FIVE_USE_TZDEV) += -Idrivers/misc/tzdev/3.0/include/tzdev + else + use_teegris_v2 := y + endif +endif + +ifeq ($(use_teegris_v2), y) + obj-$(CONFIG_FIVE_USE_TZDEV) += $(TEEC_CLIENT_PATH)/teec_common_teegris_v2.o \ + $(TEEC_CLIENT_PATH)/tee_client_api.o \ + $(PROTOCOL_PATH)/teec_param_utils.o \ + $(TEEC_CLIENT_PATH)/teec_operation_teegris_v2.o + ccflags-$(CONFIG_FIVE_USE_TZDEV) += -Idrivers/misc/tzdev/include \ + -I$(FIVE_TEE_DRIVER_PATH)/multibuild/include/gp-api +else + obj-$(CONFIG_FIVE_USE_TZDEV) += $(TEEC_CLIENT_PATH)/teec_operation_teegris_v3.o + ccflags-$(CONFIG_FIVE_USE_TZDEV) += -Idrivers/misc/tzdev/include/tzdev +endif diff --git a/drivers/security/samsung/five_tee_driver/five_ta_uuid.h b/drivers/security/samsung/five_tee_driver/five_ta_uuid.h new file mode 100644 index 000000000..e26152c0b --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/five_ta_uuid.h @@ -0,0 +1,52 @@ +/* + * TEE UUID + * + * Copyright (C) 2017 Samsung Electronics, Inc. + * Egor Uleyskiy, + * + * 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 __FIVE_TEE_UUID_H__ +#define __FIVE_TEE_UUID_H__ + +#if defined(CONFIG_TEEGRIS) +static const TEEC_UUID five_ta_uuid = { + .timeLow = 0x00000000, + .timeMid = 0x0000, + .timeHiAndVersion = 0x0000, + .clockSeqAndNode = {0x00, 0x00, 0x00, 0x00, 0x46, 0x49, 0x56, 0x45}, +}; +#elif defined(CONFIG_QSEECOM) +#ifdef CONFIG_ARCH_MSM8917 +static const TEEC_UUID five_ta_uuid = { + .timeLow = 0x6d736d38, + .timeMid = 0x3931, + .timeHiAndVersion = 0x372f, + .clockSeqAndNode = {0x66, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00}, +}; +#else +static const TEEC_UUID five_ta_uuid = { + .timeLow = 0x66697665, + .timeMid = 0x0000, + .timeHiAndVersion = 0x0000, + .clockSeqAndNode = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +}; +#endif // CONFIG_ARCH_MSM8917 +#elif defined(CONFIG_TRUSTONIC) +static const TEEC_UUID five_ta_uuid = { + .timeLow = 0xffffffff, + .timeMid = 0x0000, + .timeHiAndVersion = 0x0000, + .clockSeqAndNode = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72}, +}; +#endif + +#endif /* __FIVE_TEE_UUID_H__ */ diff --git a/drivers/security/samsung/five_tee_driver/five_tee_driver.c b/drivers/security/samsung/five_tee_driver/five_tee_driver.c new file mode 100644 index 000000000..a77854f71 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/five_tee_driver.c @@ -0,0 +1,722 @@ +/* + * TEE Driver + * + * Copyright (C) 2016 Samsung Electronics, Inc. + * Egor Uleyskiy, + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include "tee_client_api.h" +#include "five_ta_uuid.h" +#include "five_audit.h" +#include "teec_operation.h" + +#ifdef CONFIG_TEE_DRIVER_DEBUG +#include +#endif + +static DEFINE_MUTEX(itee_driver_lock); +static char is_initialized; +static TEEC_Context *context; +static TEEC_Session *session; +static DEFINE_SPINLOCK(tee_msg_lock); +static LIST_HEAD(tee_msg_queue); +struct task_struct *tee_msg_task; + +#define MAX_HASH_LEN 64 + +struct tci_msg { + uint8_t hash_algo; + uint8_t hash[MAX_HASH_LEN]; + uint8_t signature[MAX_HASH_LEN]; + uint16_t label_len; + uint8_t label[0]; +} __attribute__((packed)); + +#define CMD_SIGN 1 +#define CMD_VERIFY 2 + +#define SEND_CMD_RETRY 1 + +static int load_trusted_app(void); +static void unload_trusted_app(void); +static int send_cmd(unsigned int cmd, + enum hash_algo algo, + const void *hash, + size_t hash_len, + const void *label, + size_t label_len, + void *signature, + size_t *signature_len); +static int send_cmd_with_retry(unsigned int cmd, + enum hash_algo algo, + const void *hash, + size_t hash_len, + const void *label, + size_t label_len, + void *signature, + size_t *signature_len); + +struct tee_msg { + struct completion *comp; + unsigned int cmd; + enum hash_algo algo; + const void *hash; + size_t hash_len; + const void *label; + size_t label_len; + void *signature; + size_t *signature_len; + int rc; + struct list_head queue; +}; + +static int tee_msg_thread(void *arg) +{ + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (kthread_should_stop()) { + set_current_state(TASK_RUNNING); + break; + } + if (list_empty(&tee_msg_queue)) + schedule(); + set_current_state(TASK_RUNNING); + + spin_lock(&tee_msg_lock); + while (!list_empty(&tee_msg_queue)) { + struct tee_msg *send_cmd_args; + int rc; + + send_cmd_args = list_entry(tee_msg_queue.next, + struct tee_msg, queue); + list_del_init(&send_cmd_args->queue); + spin_unlock(&tee_msg_lock); + + rc = send_cmd_with_retry(send_cmd_args->cmd, + send_cmd_args->algo, + send_cmd_args->hash, + send_cmd_args->hash_len, + send_cmd_args->label, + send_cmd_args->label_len, + send_cmd_args->signature, + send_cmd_args->signature_len); + send_cmd_args->rc = rc; + // when processing tee_iovec comp is not NULL + // only for last cmd in array + if (send_cmd_args->comp) + complete(send_cmd_args->comp); + spin_lock(&tee_msg_lock); + } + spin_unlock(&tee_msg_lock); + } + mutex_lock(&itee_driver_lock); + unload_trusted_app(); + mutex_unlock(&itee_driver_lock); + + return 0; +} + +static int send_cmd(unsigned int cmd, + enum hash_algo algo, + const void *hash, + size_t hash_len, + const void *label, + size_t label_len, + void *signature, + size_t *signature_len) +{ + TEEC_Operation operation = {}; + TEEC_SharedMemory shmem = {0}; + TEEC_Result rc; + uint32_t origin; + struct tci_msg *msg = NULL; + size_t msg_len; + size_t sig_len; + const bool inout_direction = cmd == CMD_SIGN ? true : false; + + if (!hash || !hash_len || + !signature || !signature_len || !(*signature_len)) + return -EINVAL; + + msg_len = sizeof(*msg) + label_len; + if (label_len > PAGE_SIZE || msg_len > PAGE_SIZE) + return -EINVAL; + + switch (algo) { + case HASH_ALGO_SHA1: + if (hash_len != SHA1_DIGEST_SIZE) + return -EINVAL; + sig_len = SHA1_DIGEST_SIZE; + break; + case HASH_ALGO_SHA256: + if (hash_len != SHA256_DIGEST_SIZE) + return -EINVAL; + sig_len = SHA256_DIGEST_SIZE; + break; + case HASH_ALGO_SHA512: + if (hash_len != SHA512_DIGEST_SIZE) + return -EINVAL; + sig_len = SHA512_DIGEST_SIZE; + break; + default: + return -EINVAL; + } + + if (cmd == CMD_SIGN && sig_len > *signature_len) + return -EINVAL; + if (cmd == CMD_VERIFY && sig_len != *signature_len) + return -EINVAL; + + mutex_lock(&itee_driver_lock); + if (!is_initialized) { + rc = load_trusted_app(); + pr_info("FIVE: Initialize trusted app, ret: %d\n", rc); + if (rc) { + mutex_unlock(&itee_driver_lock); + rc = -EIO; + goto out; + } + } + + shmem.buffer = NULL; + shmem.size = msg_len; + shmem.flags = TEEC_MEM_INPUT; + if (inout_direction) + shmem.flags |= TEEC_MEM_OUTPUT; + + rc = TEEC_AllocateSharedMemory(context, &shmem); + if (rc != TEEC_SUCCESS || shmem.buffer == NULL) { + mutex_unlock(&itee_driver_lock); + five_audit_tee_msg("send_cmd", + "TEEC_AllocateSharedMemory is failed", rc, 0); + rc = -ENOMEM; + goto out; + } + + msg = (struct tci_msg *)shmem.buffer; + + msg->hash_algo = algo; + memcpy(msg->hash, hash, hash_len); + msg->label_len = label_len; + if (label_len) + memcpy(msg->label, label, label_len); + + if (cmd == CMD_VERIFY) + memcpy(msg->signature, signature, sig_len); + + FillOperationSharedMem(&shmem, &operation, inout_direction); + + rc = TEEC_InvokeCommand(session, cmd, &operation, &origin); + + mutex_unlock(&itee_driver_lock); + + if (rc == TEEC_SUCCESS) { + if (origin != TEEC_ORIGIN_TRUSTED_APP) { + rc = -EIO; + five_audit_tee_msg("send_cmd", + "TEEC_InvokeCommand is failed", rc, origin); + } + } else { + five_audit_tee_msg("send_cmd", "TEEC_InvokeCommand is failed.", + rc, origin); + } + + if (rc == TEEC_SUCCESS && cmd == CMD_SIGN) { + memcpy(signature, msg->signature, sig_len); + *signature_len = sig_len; + } + + TEEC_ReleaseSharedMemory(&shmem); +out: + return rc; +} + +static int send_cmd_kthread(unsigned int cmd, + enum hash_algo algo, + const void *hash, + size_t hash_len, + const void *label, + size_t label_len, + void *signature, + size_t *signature_len) +{ + struct completion cmd_sent; + struct tee_msg cmd_msg; + + init_completion(&cmd_sent); + + cmd_msg.comp = &cmd_sent; + cmd_msg.cmd = cmd; + cmd_msg.algo = algo; + cmd_msg.hash = hash; + cmd_msg.hash_len = hash_len; + cmd_msg.label = label; + cmd_msg.label_len = label_len; + cmd_msg.signature = signature; + cmd_msg.signature_len = signature_len; + cmd_msg.rc = -EBADMSG; + + spin_lock(&tee_msg_lock); + list_add_tail(&cmd_msg.queue, &tee_msg_queue); + spin_unlock(&tee_msg_lock); + wake_up_process(tee_msg_task); + wait_for_completion(&cmd_sent); + return cmd_msg.rc; +} + +static int send_cmd_with_retry(unsigned int cmd, + enum hash_algo algo, + const void *hash, + size_t hash_len, + const void *label, + size_t label_len, + void *signature, + size_t *signature_len) +{ + int rc; + unsigned int retry_num = SEND_CMD_RETRY; + + do { + bool need_retry = false; + + rc = send_cmd(cmd, algo, + hash, hash_len, label, label_len, + signature, signature_len); + + need_retry = (rc == TEEC_ERROR_COMMUNICATION || + rc == TEEC_ERROR_TARGET_DEAD); + if (need_retry && retry_num) { + pr_err("FIVE: TA got the fatal error rc=%d. Try again\n", + rc); + mutex_lock(&itee_driver_lock); + unload_trusted_app(); + mutex_unlock(&itee_driver_lock); + } else { + break; + } + } while (retry_num--); + + if (rc == TEEC_ERROR_ACCESS_DENIED) { + five_audit_tee_msg("send_cmd_with_retry", + "TA got TEEC_ERROR_ACCESS_DENIED", rc, 0); + } + + return rc; +} + +static int send_cmd_kthread_vec(struct tee_msg *cmd_iovec, const size_t iovcnt) +{ + int rc = 0; + struct completion cmd_sent; + size_t i; + + init_completion(&cmd_sent); + cmd_iovec[iovcnt - 1].comp = &cmd_sent; + + for (i = 0; i < iovcnt; ++i) { + spin_lock(&tee_msg_lock); + list_add_tail(&cmd_iovec[i].queue, &tee_msg_queue); + spin_unlock(&tee_msg_lock); + } + + wake_up_process(tee_msg_task); + wait_for_completion(&cmd_sent); + + return rc; +} + +static int verify_hmac(const struct tee_iovec *verify_args) +{ + return send_cmd_kthread(CMD_VERIFY, verify_args->algo, + verify_args->hash, verify_args->hash_len, + verify_args->label, verify_args->label_len, + verify_args->signature, + (size_t *)&verify_args->signature_len); +} + +static int verify_hmac_vec(struct tee_iovec *verify_iovec, + const size_t verify_iovcnt) +{ + int rc = 0; + struct tee_msg *cmd_vec; + size_t i; + + cmd_vec = kcalloc(verify_iovcnt, sizeof(*cmd_vec), GFP_KERNEL); + if (!cmd_vec) + return -ENOMEM; + + for (i = 0; i < verify_iovcnt; ++i) { + cmd_vec[i].cmd = CMD_VERIFY; + cmd_vec[i].algo = verify_iovec[i].algo; + cmd_vec[i].hash = verify_iovec[i].hash; + cmd_vec[i].hash_len = verify_iovec[i].hash_len; + cmd_vec[i].label = verify_iovec[i].label; + cmd_vec[i].label_len = verify_iovec[i].label_len; + cmd_vec[i].signature = (void *)verify_iovec[i].signature; + cmd_vec[i].signature_len = + (size_t *)&verify_iovec[i].signature_len; + cmd_vec[i].rc = -EBADMSG; + } + + rc = send_cmd_kthread_vec(cmd_vec, verify_iovcnt); + + for (i = 0; i < verify_iovcnt; ++i) + verify_iovec[i].rc = cmd_vec[i].rc; + + kfree(cmd_vec); + return rc; +} + +static int sign_hmac(struct tee_iovec *sign_args) +{ + return send_cmd_kthread(CMD_SIGN, sign_args->algo, + sign_args->hash, sign_args->hash_len, + sign_args->label, sign_args->label_len, + sign_args->signature, + &sign_args->signature_len); +} + +static int sign_hmac_vec(struct tee_iovec *sign_iovec, + const size_t iovcnt) +{ + int rc = 0; + struct tee_msg *cmd_vec; + size_t i; + + cmd_vec = kcalloc(iovcnt, sizeof(*cmd_vec), GFP_KERNEL); + if (!cmd_vec) + return -ENOMEM; + + for (i = 0; i < iovcnt; ++i) { + cmd_vec[i].cmd = CMD_SIGN; + cmd_vec[i].algo = sign_iovec[i].algo; + cmd_vec[i].hash = sign_iovec[i].hash; + cmd_vec[i].hash_len = sign_iovec[i].hash_len; + cmd_vec[i].label = sign_iovec[i].label; + cmd_vec[i].label_len = sign_iovec[i].label_len; + cmd_vec[i].signature = sign_iovec[i].signature; + cmd_vec[i].signature_len = &sign_iovec[i].signature_len; + cmd_vec[i].rc = -EBADMSG; + } + + rc = send_cmd_kthread_vec(cmd_vec, iovcnt); + + for (i = 0; i < iovcnt; ++i) + sign_iovec[i].rc = cmd_vec[i].rc; + + kfree(cmd_vec); + return rc; +} + +static int load_trusted_app(void) +{ + TEEC_Result rc; + uint32_t origin; + + context = kzalloc(sizeof(*context), GFP_KERNEL); + if (!context) { + pr_err("FIVE: Can't allocate context\n"); + goto error; + } + + rc = TEEC_InitializeContext(NULL, context); + if (rc) { + five_audit_tee_msg("load_trusted_app", "Can't initialize context", + rc, 0); + goto error; + } + + session = kzalloc(sizeof(*session), GFP_KERNEL); + if (!session) { + pr_err("FIVE: Can't allocate session\n"); + goto error; + } + + rc = TEEC_OpenSession(context, session, + &five_ta_uuid, 0, NULL, NULL, &origin); + if (rc) { + five_audit_tee_msg("load_trusted_app", "Can't open session", + rc, origin); + goto error; + } + + is_initialized = 1; + + return 0; +error: + TEEC_FinalizeContext(context); + kfree(session); + kfree(context); + session = NULL; + context = NULL; + + return -1; +} + +static int register_tee_driver(void) +{ + struct five_tee_driver_fns fn = { + .verify_hmac = verify_hmac, + .verify_hmac_vec = verify_hmac_vec, + .sign_hmac = sign_hmac, + .sign_hmac_vec = sign_hmac_vec, + }; + + return register_five_tee_driver(&fn); +} + +static void unregister_tee_driver(void) +{ + unregister_five_tee_driver(); + /* Don't close session with TA when */ + /* tee_integrity_driver has been unloaded */ +} + +static void unload_trusted_app(void) +{ + is_initialized = 0; + TEEC_CloseSession(session); + TEEC_FinalizeContext(context); + kfree(session); + kfree(context); + session = NULL; + context = NULL; +} + +#ifdef CONFIG_TEE_DRIVER_DEBUG + +static int sign_hmac_vec_test(void) +{ + uint8_t hash[SHA1_DIGEST_SIZE][3]; + uint8_t signature[SHA1_DIGEST_SIZE][3]; + size_t signature_len[3] = { + SHA1_DIGEST_SIZE, + SHA1_DIGEST_SIZE, + SHA1_DIGEST_SIZE + }; + struct tee_iovec sign_iovec[] = { + { + .algo = HASH_ALGO_SHA1, + .hash = hash[0], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[0], + .signature_len = signature_len[0], + .label_len = sizeof("label 1"), + .label = "label 1", + }, + { + .algo = HASH_ALGO_SHA1, + .hash = hash[1], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[1], + .signature_len = signature_len[1], + .label_len = sizeof("label 2 xxxxx"), + .label = "label 2 xxxxx", + }, + { + .algo = HASH_ALGO_SHA1, + .hash = hash[2], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[2], + .signature_len = signature_len[2], + .label_len = sizeof("label 3 zxzxzzzz"), + .label = "label 3 zxzxzzzz", + }, + }; + + return sign_hmac_vec(sign_iovec, ARRAY_SIZE(sign_iovec)); +} + +static int verify_hmac_vec_test(void) +{ + uint8_t hash[SHA1_DIGEST_SIZE][3]; + uint8_t signature[SHA1_DIGEST_SIZE][3]; + size_t signature_len[3] = { + SHA1_DIGEST_SIZE, + SHA1_DIGEST_SIZE, + SHA1_DIGEST_SIZE + }; + struct tee_iovec verify_iovec[] = { + { + .algo = HASH_ALGO_SHA1, + .hash = hash[0], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[0], + .signature_len = signature_len[0], + .label_len = sizeof("label 1"), + .label = "label 1", + }, + { + .algo = HASH_ALGO_SHA1, + .hash = hash[1], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[1], + .signature_len = signature_len[1], + .label_len = sizeof("label 2 xxxxx"), + .label = "label 2 xxxxx", + }, + { + .algo = HASH_ALGO_SHA1, + .hash = hash[2], + .hash_len = SHA1_DIGEST_SIZE, + .signature = signature[2], + .signature_len = signature_len[2], + .label_len = sizeof("label 3 zxzxzzzz"), + .label = "label 3 zxzxzzzz", + }, + }; + + return verify_hmac_vec(verify_iovec, ARRAY_SIZE(verify_iovec)); +} + +static ssize_t tee_driver_write( + struct file *file, const char __user *buf, + size_t count, loff_t *pos) +{ + uint8_t hash[SHA1_DIGEST_SIZE] = {}; + uint8_t signature[SHA1_DIGEST_SIZE] = {}; + char command; + size_t signature_len = sizeof(signature); + + if (get_user(command, buf)) + return -EFAULT; + + switch (command) { + case '1': + pr_info("register_tee_driver: %d\n", register_tee_driver()); + break; + case '2': { + struct tee_iovec sign_args = { + .algo = HASH_ALGO_SHA1, + .hash = hash, + .hash_len = sizeof(hash), + .signature = signature, + .signature_len = signature_len, + .label_len = sizeof("label"), + .label = "label" + }; + + pr_info("sign_hmac: %d\n", sign_hmac(&sign_args)); + break; + } + case '3': { + struct tee_iovec verify_args = { + .algo = HASH_ALGO_SHA1, + .hash = hash, + .hash_len = sizeof(hash), + .signature = signature, + .signature_len = signature_len, + .label_len = sizeof("label"), + .label = "label" + }; + + pr_info("verify_hmac: %d\n", verify_hmac(&verify_args)); + break; + } + case '4': + pr_info("unregister_tee_driver\n"); + unregister_tee_driver(); + mutex_lock(&itee_driver_lock); + unload_trusted_app(); + mutex_unlock(&itee_driver_lock); + break; + case '5': + pr_info("sign_hmac_vec: %d\n", sign_hmac_vec_test()); + break; + case '6': + pr_info("verify_hmac_vec: %d\n", verify_hmac_vec_test()); + break; + default: + pr_err("FIVE: %s: unknown cmd: %hhx\n", __func__, command); + return -EINVAL; + } + + return count; +} + +static const struct file_operations tee_driver_fops = { + .owner = THIS_MODULE, + .write = tee_driver_write +}; + +static int __init init_fs(void) +{ + struct dentry *debug_file = NULL; + umode_t umode = + (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + + debug_file = debugfs_create_file( + "integrity_tee_driver", umode, NULL, NULL, + &tee_driver_fops); + if (IS_ERR_OR_NULL(debug_file)) + goto error; + + return 0; +error: + if (debug_file) + return -PTR_ERR(debug_file); + + return -EEXIST; +} +#else +static inline int __init init_fs(void) +{ + return 0; +} +#endif + +static int __init tee_driver_init(void) +{ + int rc = 0; + + mutex_init(&itee_driver_lock); + +#ifdef CONFIG_FIVE_EARLY_LOAD_TRUSTED_APP + rc = load_trusted_app(); + pr_info("FIVE: Initialize trusted app in early boot ret: %d\n", rc); +#endif + + tee_msg_task = kthread_run(tee_msg_thread, NULL, "five_tee_msg_thread"); + if (IS_ERR(tee_msg_task)) { + rc = PTR_ERR(tee_msg_task); + pr_err("FIVE: Can't create tee_msg_task: %d\n", rc); + goto out; + } + rc = register_tee_driver(); + if (rc) { + pr_err("FIVE: Can't register tee_driver\n"); + goto out; + } + rc = init_fs(); + if (rc) { + pr_err("FIVE: Can't initialize debug FS\n"); + goto out; + } + +out: + return rc; +} + +static void __exit tee_driver_exit(void) +{ + unregister_tee_driver(); + kthread_stop(tee_msg_task); +} + +module_init(tee_driver_init); +module_exit(tee_driver_exit); diff --git a/drivers/security/samsung/five_tee_driver/multibuild/include/gp-api/tee_client_api.h b/drivers/security/samsung/five_tee_driver/multibuild/include/gp-api/tee_client_api.h new file mode 100644 index 000000000..766c0c41d --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/include/gp-api/tee_client_api.h @@ -0,0 +1,233 @@ +/* + * tee_client_api.h + * + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + * + * TEE client library + */ + +#ifndef __TEE_CLIENT_API_H__ +#define __TEE_CLIENT_API_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* TEE Client API types and constants definitions */ +#ifndef __TEEC_ERROR_CODES__ +#define __TEEC_ERROR_CODES__ +// The operation was successful +#define TEEC_SUCCESS 0x00000000 +// Non-specific cause +#define TEEC_ERROR_GENERIC 0xFFFF0000 +// Access privileges are not sufficient +#define TEEC_ERROR_ACCESS_DENIED 0xFFFF0001 +// The operation was cancelled +#define TEEC_ERROR_CANCEL 0xFFFF0002 +// Concurrent accesses caused conflict +#define TEEC_ERROR_ACCESS_CONFLICT 0xFFFF0003 +// Too much data for the requested operation was passed +#define TEEC_ERROR_EXCESS_DATA 0xFFFF0004 +// Input data was of invalid format +#define TEEC_ERROR_BAD_FORMAT 0xFFFF0005 +// Input parameters were invalid +#define TEEC_ERROR_BAD_PARAMETERS 0xFFFF0006 +// Operation is not valid in the current state +#define TEEC_ERROR_BAD_STATE 0xFFFF0007 +// The requested data item is not found +#define TEEC_ERROR_ITEM_NOT_FOUND 0xFFFF0008 +// The requested operation should exist but is not yet implemented +#define TEEC_ERROR_NOT_IMPLEMENTED 0xFFFF0009 +// The requested operation is valid but is not supported in this Implementation +#define TEEC_ERROR_NOT_SUPPORTED 0xFFFF000A +// Expected data was missing +#define TEEC_ERROR_NO_DATA 0xFFFF000B +// System ran out of resources +#define TEEC_ERROR_OUT_OF_MEMORY 0xFFFF000C +// The system is busy working on something else. +#define TEEC_ERROR_BUSY 0xFFFF000D +// Communication with a remote party failed. +#define TEEC_ERROR_COMMUNICATION 0xFFFF000E +// A security fault was detected. +#define TEEC_ERROR_SECURITY 0xFFFF000F +// The supplied buffer is too short for the generated output. +#define TEEC_ERROR_SHORT_BUFFER 0xFFFF0010 + +#define TEEC_ERROR_TARGET_DEAD 0xFFFF3024 // Targed TA panic'ed +#define TEEC_ERROR_CORRUPT_OBJECT 0xF0100001 +#define TEEC_ERROR_STORAGE_NOT_AVAILABLE 0xF0100003 +#define TEEC_ERROR_SIGNATURE_INVALID 0xFFFF3072 // Invalid TA signature +#define TEEC_IMP_MAX 0xFFFEFFFF +#define TEEC_RFU_MIN 0xFFFF0011 +#define TEEC_RFU_MAX 0xFFFFFFFF + +/* Implementation defined error codes */ +#define TEEC_IMP_MIN 0x00000001 +// Requested FIPS on/off state failed +#define TEEC_ERROR_BAD_FIPS_MODE 0x80000004 +#define TEEC_ERROR_TA_AUTHORITY_UNKNOWN 0x80000005 // TA AUthority is unknown. +#define TEEC_ERROR_DEVICE_ACCESS_DENIED 0x80000007 + +#endif + +#define TEEC_ORIGIN_API 0x1 +#define TEEC_ORIGIN_COMMS 0x2 +#define TEEC_ORIGIN_TEE 0x3 +#define TEEC_ORIGIN_TRUSTED_APP 0x4 + +typedef uint32_t TEEC_Result; + +#ifndef __TEEC_UUID__ +#define __TEEC_UUID__ +/* + * Althought this structure is not traveling between worlds, but it used in + * tzdaemon, so try to keep TEE_UUID and TEEC_UUID identical. + */ +typedef struct { + uint32_t timeLow; + uint16_t timeMid; + uint16_t timeHiAndVersion; + uint8_t clockSeqAndNode[8]; +} __attribute__((packed)) TEEC_UUID; +#endif + +typedef struct { + void *imp; +} TEEC_Context; + +typedef struct { + void *imp; +} TEEC_Session; + +#define TEEC_CONFIG_SHAREDMEM_MAX_SIZE 0x040000 + +#define TEEC_MEM_INPUT (1 << 0) +#define TEEC_MEM_OUTPUT (1 << 1) + +#define TEEC_NONE 0x00000000 +#define TEEC_VALUE_INPUT 0x00000001 +#define TEEC_VALUE_OUTPUT 0x00000002 +#define TEEC_VALUE_INOUT 0x00000003 +#define TEEC_MEMREF_TEMP_INPUT 0x00000005 +#define TEEC_MEMREF_TEMP_OUTPUT 0x00000006 +#define TEEC_MEMREF_TEMP_INOUT 0x00000007 + +#define TEEC_SHMEM_IMP_NONE 0x00000000 +#define TEEC_SHMEM_IMP_ALLOCED 0x00000001 + +typedef struct { + TEEC_Context *context; + uint32_t flags; +} TEEC_SharedMemoryImp; + +typedef struct { + void *buffer; + size_t size; + uint32_t flags; + TEEC_SharedMemoryImp imp; /* See above */ +} TEEC_SharedMemory; + +typedef struct { + void *buffer; + size_t size; +} TEEC_TempMemoryReference; + +typedef struct { + TEEC_SharedMemory *parent; + size_t size; + size_t offset; +} TEEC_RegisteredMemoryReference; + +typedef struct { + uint32_t a; + uint32_t b; +} TEEC_Value; + +typedef union { + TEEC_TempMemoryReference tmpref; + TEEC_RegisteredMemoryReference memref; + TEEC_Value value; +} TEEC_Parameter; + +#define TEEC_LOGIN_PUBLIC 0x00000000 +#define TEEC_LOGIN_USER 0x00000001 +#define TEEC_LOGIN_GROUP 0x00000002 +#define TEEC_LOGIN_APPLICATION 0x00000004 +#define TEEC_LOGIN_USER_APPLICATION 0x00000005 +#define TEEC_LOGIN_GROUP_APPLICATION 0x00000006 +#define TEEC_LOGIN_IMP_MIN 0x80000000 +#define TEEC_LOGIN_IMP_MAX 0xEFFFFFFF + +typedef struct { + uint32_t started; + uint32_t paramTypes; + TEEC_Parameter params[4]; + void *imp; +} TEEC_Operation; + +/* This is protection from already implemented GP interface: */ +#define TEEC_InitializeContext MultibuildInternal_TEEC_InitializeContext +#define TEEC_FinalizeContext MultibuildInternal_TEEC_FinalizeContext +#define TEEC_OpenSession MultibuildInternal_TEEC_OpenSession +#define TEEC_CloseSession MultibuildInternal_TEEC_CloseSession +#define TEEC_InvokeCommand MultibuildInternal_TEEC_InvokeCommand +#define TEEC_RegisterSharedMemory MultibuildInternal_TEEC_RegisterSharedMemory +#define TEEC_AllocateSharedMemory MultibuildInternal_TEEC_AllocateSharedMemory +#define TEEC_ReleaseSharedMemory MultibuildInternal_TEEC_ReleaseSharedMemory + +/* TEE Client API functions and macros definitions */ + +TEEC_Result TEEC_InitializeContext(const char *name, + TEEC_Context *context); + +void TEEC_FinalizeContext(TEEC_Context *context); + +TEEC_Result TEEC_RegisterSharedMemory(TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + +TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *context, + TEEC_SharedMemory *sharedMem); + +void TEEC_ReleaseSharedMemory(TEEC_SharedMemory *sharedMem); + +TEEC_Result TEEC_OpenSession(TEEC_Context *context, + TEEC_Session *session, + const TEEC_UUID *destination, + uint32_t connectionMethod, + const void *connectionData, + TEEC_Operation *operation, + uint32_t *returnOrigin); + +void TEEC_CloseSession(TEEC_Session *session); + +TEEC_Result TEEC_InvokeCommand(TEEC_Session *session, + uint32_t commandID, + TEEC_Operation *operation, + uint32_t *returnOrigin); + +#define TEEC_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \ + (uint32_t)(((param0Type) & 0xf) | \ + (((param1Type) & 0xf) << 4) | \ + (((param2Type) & 0xf) << 8) | \ + (((param3Type) & 0xf) << 12)) + +#ifdef __cplusplus +} +#endif + +#endif /* __TEE_CLIENT_API_H__ */ diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/tee_client_api.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/tee_client_api.c new file mode 100644 index 000000000..de6a67afc --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/tee_client_api.c @@ -0,0 +1,260 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#include +#include +#include +#include "tee_client_api.h" +#include "protocol.h" +#include "teec_common.h" + +#define CONTEXT_INITIALIZED 0xA7A6A5A4 +#define MEM_SLOTS_NUM 4 + +typedef struct TeecContextStruct { + uint32_t initialized; + TEEC_SharedMemory *allocated_shmem[MEM_SLOTS_NUM]; +} TeecContext; + +TEEC_Result TEEC_InvokeCommand(TEEC_Session *session, + uint32_t commandID, + TEEC_Operation *operation, + uint32_t *returnOrigin) +{ + TEEC_Result ret = TEEC_ERROR_BAD_PARAMETERS; + PlatformClientImpl *client_impl = GetPlatformClientImpl(); + + if (!session || !session->imp) + goto exit; + + if (returnOrigin) + *returnOrigin = TEEC_ORIGIN_API; + + if (!client_impl || !client_impl->SendCommand) { + ret = TEEC_ERROR_NOT_IMPLEMENTED; + goto exit; + } + + ret = client_impl->SendCommand(session->imp, + commandID, operation, returnOrigin, + MB_INFINITE_TIMEOUT); + +exit: + return ret; +} + +TEEC_Result TEEC_InitializeContext(const char *name, TEEC_Context *context) +{ + TEEC_Result res = TEEC_ERROR_BAD_PARAMETERS; + + (void) name; + if (context) { + TeecContext *teec_ctx = kzalloc(sizeof(TeecContext), + GFP_KERNEL); + if (teec_ctx) { + teec_ctx->initialized = CONTEXT_INITIALIZED; + context->imp = (void *)teec_ctx; + res = TEEC_SUCCESS; + } + } + + return res; +} + +void TEEC_FinalizeContext(TEEC_Context *context) +{ + if (context) { + TeecContext *teec_ctx = (TeecContext *)context->imp; + + if (teec_ctx) { + teec_ctx->initialized = 0; + kfree(context->imp); + context->imp = NULL; + } + } +} + +TEEC_Result TEEC_OpenSession(TEEC_Context *context, + TEEC_Session *session, + const TEEC_UUID *destination, + uint32_t connectionMethod, + const void *connectionData, + TEEC_Operation *operation, + uint32_t *returnOrigin) +{ + TEEC_Result ret = TEEC_ERROR_BAD_PARAMETERS; + PlatformClientImpl *client_impl = GetPlatformClientImpl(); + /* Fixed waiting initialization of DCI thread in TBase driver */ + const uint32_t kNumTries = 5; + const int32_t kTimeoutMs = 1000; + uint32_t elapsed_tries = 0; + + if (!context || !context->imp || + ((TeecContext *)(context->imp))->initialized != CONTEXT_INITIALIZED + || !session || !destination) { + goto exit; + } + + if (returnOrigin) + *returnOrigin = TEEC_ORIGIN_API; + + if (!client_impl || !client_impl->SendCommand || !client_impl->LoadTA) { + ret = TEEC_ERROR_NOT_IMPLEMENTED; + goto exit; + } + + session->imp = kzalloc(GetPlatformClientImplSize(), GFP_KERNEL); + + if (!session->imp) { + ret = TEEC_ERROR_OUT_OF_MEMORY; + goto exit; + } + + ret = client_impl->LoadTA(session->imp, destination); + + if (ret != TEEC_SUCCESS) + goto cleanup; + + do { + ret = client_impl->SendCommand(session->imp, + PROTOCOL_COMMAND_LOAD, operation, returnOrigin, + kTimeoutMs); + + if (TEEC_SUCCESS != ret) { + pr_debug( + "Try to send %u of %u command in driver: 0x%x.\n", + elapsed_tries + 1, kNumTries, ret); + } + } while ((ret != TEEC_SUCCESS) && (++elapsed_tries < kNumTries)); + + if (TEEC_SUCCESS != ret) { + pr_debug("Could not send %d commands in driver: 0x%x.\n", + kNumTries, ret); + client_impl->SendCommand(session->imp, PROTOCOL_COMMAND_UNLOAD, + NULL, returnOrigin, MB_INFINITE_TIMEOUT); + client_impl->UnloadTA(session->imp); + } + +cleanup: + if (ret != TEEC_SUCCESS) { + kfree(session->imp); + session->imp = NULL; + } + +exit: + return ret; +} + +void TEEC_CloseSession(TEEC_Session *session) +{ + uint32_t return_origin; + PlatformClientImpl *client_impl = GetPlatformClientImpl(); + + if (session && session->imp) { + if (client_impl && + client_impl->SendCommand && client_impl->UnloadTA) { + client_impl->SendCommand(session->imp, + PROTOCOL_COMMAND_UNLOAD, NULL, &return_origin, + MB_INFINITE_TIMEOUT); + client_impl->UnloadTA(session->imp); + } + kfree(session->imp); + session->imp = NULL; + } +} + +TEEC_Result TEEC_RegisterSharedMemory(TEEC_Context *context, + TEEC_SharedMemory *sharedMem) +{ + TEEC_Result result = TEEC_ERROR_BAD_PARAMETERS; + + if (!context || !sharedMem || !sharedMem->buffer) + goto exit; + + if (sharedMem->size > TEEC_CONFIG_SHAREDMEM_MAX_SIZE) { + result = TEEC_ERROR_OUT_OF_MEMORY; + goto exit; + } + + sharedMem->imp.context = context; + result = TEEC_SUCCESS; +exit: + return result; +} + +static inline int GetShmemSlotIndex(TeecContext *ctx, TEEC_SharedMemory *mem) +{ + int ret = -1; + int i = 0; + + for (i = 0; i < MEM_SLOTS_NUM; i++) { + if (ctx->allocated_shmem[i] == mem) { + ret = i; + break; + } + } + return ret; +} + +TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *context, + TEEC_SharedMemory *sharedMem) +{ + TEEC_Result result = TEEC_ERROR_BAD_PARAMETERS; + int ctx_shmem_index = -1; + + if (!context || !context->imp || !sharedMem || + ((TeecContext *)(context->imp))->initialized != CONTEXT_INITIALIZED) { + goto exit; + } + + ctx_shmem_index = + GetShmemSlotIndex((TeecContext *)(context->imp), NULL); + + result = TEEC_ERROR_OUT_OF_MEMORY; + if (sharedMem->size > TEEC_CONFIG_SHAREDMEM_MAX_SIZE || + ctx_shmem_index < 0) { + goto exit; + } + + sharedMem->buffer = kzalloc(sharedMem->size, GFP_KERNEL); + if (!sharedMem->buffer) + goto exit; + + sharedMem->imp.context = context; + ((TeecContext *)(context->imp))->allocated_shmem[ctx_shmem_index] + = sharedMem; + result = TEEC_SUCCESS; + +exit: + return result; +} + +void TEEC_ReleaseSharedMemory(TEEC_SharedMemory *sharedMem) +{ + if (sharedMem && + sharedMem->imp.context && sharedMem->imp.context->imp) { + int ctx_shmem_index = GetShmemSlotIndex( + (TeecContext *)(sharedMem->imp.context->imp), + sharedMem); + + if (ctx_shmem_index >= 0) { + ((TeecContext *)(sharedMem->imp.context->imp))-> + allocated_shmem[ctx_shmem_index] = NULL; + kzfree(sharedMem->buffer); + } + } +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common.h b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common.h new file mode 100644 index 000000000..6e19a9647 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common.h @@ -0,0 +1,50 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#ifndef TEEC_COMMON_H_ +#define TEEC_COMMON_H_ + +#include "tee_client_api.h" +#include + +#define MB_INFINITE_TIMEOUT (-1) + +typedef TEEC_Result (*ClientImplLoadTA)(void *session, const TEEC_UUID *uuid); +typedef TEEC_Result (*ClientImplSendCommand)(void *session, + uint32_t command_id, + TEEC_Operation *operation, uint32_t *return_origin, int timeout); + +typedef TEEC_Result (*ClientImplUnloadTA)(void *session); +typedef void *(*ClientImplAllocateForSession)(void *session, size_t size); +typedef void (*ClientImplFreeForSession)(void *session, void *ptr); +typedef int (*ClientImplSessionCanRelease)(void *session, void *ptr); + +typedef uint32_t (*ClientMapBuffer)(void *session, void *ptr, size_t size); + +typedef struct PlatformClientImplStruct { + ClientImplLoadTA LoadTA; + ClientImplUnloadTA UnloadTA; + ClientImplSendCommand SendCommand; + ClientMapBuffer MapBuffer; + ClientImplAllocateForSession AllocateBuffer; + ClientImplFreeForSession FreeBuffer; + ClientImplSessionCanRelease CanRelease; +} PlatformClientImpl; + +PlatformClientImpl *GetPlatformClientImpl(void); +size_t GetPlatformClientImplSize(void); +#endif /* TEEC_COMMON_H_ */ diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_qsee.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_qsee.c new file mode 100644 index 000000000..0ef1aed5d --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_qsee.c @@ -0,0 +1,265 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#include +#include +#include + +#include "teec_common.h" + +#include "protocol.h" +#include "qseecom_kernel.h" +#include "teec_param_utils.h" +#include "linux/errno.h" + +#define MAX_QSEE_UUID_LEN (MAX_APP_NAME_SIZE) // usually 64 bytes +#define QSEE_SUCCESS 0 + +/* 1. Actually we don't use the response buffer. But RBUF_LEN can't be zero. + * 2. The size which is passed to qseecom_start_app must be RBUF_LEN + SBUF_LEN. + * 3. There is difference between user space and kernel QSEECOM_ALIGN + * implementation. User space one always adds 0x40 to the passed size if + * it's already aligned by 0x40 but kernel macro doesn't do it. + * QSEECOM_ALIGN_SIZE is 0x40. That's why we add QSEECOM_ALIGN_SIZE + * in RBUF_LEN. + */ +#define SBUF_LEN (sizeof(ProtocolCmd) + MAX_SHAREDMEM_SIZE) +#define RBUF_LEN (QSEECOM_ALIGN(SBUF_LEN) - SBUF_LEN + QSEECOM_ALIGN_SIZE) + +typedef struct QseeSessionStruct { + struct qseecom_handle *qsee_com_handle; + struct qseecom_handle *listener_handle; + void *parent_context; + TEEC_UUID uuid; +} QseeSession; + +static TEEC_Result TeecUuidToQseeUuid(const TEEC_UUID *uuid, char *qsee_uuid) +{ + uint32_t i = 0; + uint32_t j = 0; + TEEC_Result res = TEEC_SUCCESS; + + if (!uuid || !qsee_uuid) { + res = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + qsee_uuid[i++] = (uuid->timeLow & 0xFF000000) >> 24; + qsee_uuid[i++] = (uuid->timeLow & 0xFF0000) >> 16; + qsee_uuid[i++] = (uuid->timeLow & 0xFF00) >> 8; + qsee_uuid[i++] = (uuid->timeLow & 0xFF); + + qsee_uuid[i++] = (uuid->timeMid & 0xFF00) >> 8; + qsee_uuid[i++] = (uuid->timeMid & 0xFF); + + qsee_uuid[i++] = (uuid->timeHiAndVersion & 0xFF00) >> 8; + qsee_uuid[i++] = (uuid->timeHiAndVersion & 0xFF); + + for (j = 0; j < (uint32_t)sizeof(uuid->clockSeqAndNode); j++) + qsee_uuid[i++] = uuid->clockSeqAndNode[j]; + +exit: + return res; +} + +TEEC_Result QseeUnloadTA(void *ta_session) +{ + TEEC_Result status = TEEC_ERROR_GENERIC; + int qsee_res; + QseeSession *qsee_session = (QseeSession *)ta_session; + + if (qsee_session->qsee_com_handle == NULL) + goto exit; + + qsee_res = qseecom_shutdown_app(&qsee_session->qsee_com_handle); + if (qsee_res != QSEE_SUCCESS) + goto exit; + + qsee_session->qsee_com_handle = NULL; + + status = TEEC_SUCCESS; +exit: + return status; +} + +TEEC_Result QseeLoadTA(void *ta_session, const TEEC_UUID *uuid) +{ + TEEC_Result status = TEEC_SUCCESS; + int qsee_res; + char ta_name[MAX_QSEE_UUID_LEN] = "five/"; + char qsee_uuid[MAX_QSEE_UUID_LEN] = {0}; + QseeSession *qsee_session = (QseeSession *)ta_session; + + if (!ta_session || !uuid || + TEEC_SUCCESS != TeecUuidToQseeUuid(uuid, qsee_uuid)) { + status = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + if (strlcat(ta_name, qsee_uuid, sizeof(ta_name)) >= sizeof(ta_name)) { + status = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + memcpy(&qsee_session->uuid, uuid, sizeof(TEEC_UUID)); + + BUILD_BUG_ON((SBUF_LEN + RBUF_LEN) & QSEECOM_ALIGN_MASK); + + qsee_res = qseecom_start_app(&qsee_session->qsee_com_handle, + ta_name, + SBUF_LEN + RBUF_LEN); + if (qsee_res != QSEE_SUCCESS) { + status = qsee_res == -EINVAL ? TEEC_ERROR_TARGET_DEAD : + TEEC_ERROR_GENERIC; + } + +exit: + return status; +} + +TEEC_Result QseeSendCommand(void *ta_session, + uint32_t command_id, + TEEC_Operation *operation, + uint32_t *return_origin, + int32_t timeout) +{ + int32_t qsee_res = QSEE_SUCCESS; + QseeSession *qsee_session = (QseeSession *)ta_session; + ProtocolCmd *command = NULL; + TEEC_Result ret = TEEC_ERROR_BAD_PARAMETERS; + + (void)timeout; + + if (!qsee_session) + goto exit; + + command = (ProtocolCmd *)qsee_session->qsee_com_handle->sbuf; + + /* + * Return origin: "COMMS" by default because of possible + * communication errors. + */ + command->return_origin = TEEC_ORIGIN_COMMS; + + command->cmd_id = command_id; + command->param_types = 0; + + if (operation) { + command->param_types = operation->paramTypes; + ret = FillCommandArgs(command, operation, ta_session); + + if (ret != TEEC_SUCCESS) { + command->return_origin = TEEC_ORIGIN_API; + goto exit; + } + } + + /* Call */ + qsee_res = qseecom_set_bandwidth(qsee_session->qsee_com_handle, true); + + if (qsee_res != QSEE_SUCCESS) { + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + /* Prepare for silent TA death */ + command->cmd_ret = TEEC_ERROR_TARGET_DEAD; + + /* Send command to TA + * Passing zero as response size isn't allowed + * that's why it's used QSEECOM_ALIGN_SIZE instead + */ + qsee_res = qseecom_send_command(qsee_session->qsee_com_handle, + qsee_session->qsee_com_handle->sbuf, + SBUF_LEN, + qsee_session->qsee_com_handle->sbuf, + RBUF_LEN); + + if (qsee_res != QSEE_SUCCESS) { + if (qsee_res != -EPERM) + ret = qsee_res == -EINVAL ? TEEC_ERROR_TARGET_DEAD : + TEEC_ERROR_COMMUNICATION; + else + ret = TEEC_ERROR_ACCESS_DENIED; + goto exit; + } + + qsee_res = qseecom_set_bandwidth(qsee_session->qsee_com_handle, false); + + if (qsee_res != QSEE_SUCCESS) { + ret = (qsee_res == -EINVAL ? TEEC_ERROR_TARGET_DEAD : + TEEC_ERROR_COMMUNICATION); + goto exit; + } + + /* + * Return origin: + * "TEE" or "TRUSTED_APP" after communication with TEE. + */ + ret = command->cmd_ret; + + if (ret == TEEC_SUCCESS && operation) { + ret = FillOperationArgs(operation, command); + if (ret != TEEC_SUCCESS) + command->return_origin = TEEC_ORIGIN_API; + } + +exit: + if (return_origin && command) + *return_origin = command->return_origin; + + return ret; +} + +PlatformClientImpl g_qsee_platform_impl = { + QseeLoadTA, + QseeUnloadTA, + QseeSendCommand, + NULL, + NULL, + NULL, + NULL, +}; + +PlatformClientImpl *GetPlatformClientImpl(void) +{ + return &g_qsee_platform_impl; +} + +size_t GetPlatformClientImplSize(void) +{ + return sizeof(QseeSession); +} + +void ClientImplSetParentContext(void *session, void *context) +{ + QseeSession *qsee_session = (QseeSession *)session; + + if (qsee_session) + qsee_session->parent_context = context; +} + +void *ClientImplGetParentContext(void *session) +{ + void *ret = NULL; + QseeSession *qsee_session = (QseeSession *)session; + + if (qsee_session) + ret = qsee_session->parent_context; + + return ret; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_tbase.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_tbase.c new file mode 100644 index 000000000..979158a07 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_tbase.c @@ -0,0 +1,327 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#include +#include +#include +#include + +#include "teec_common.h" +#include "protocol.h" +#include "teec_param_utils.h" + +#define DEVICE_ID MC_DEVICE_ID_DEFAULT +#define MC_SPID_SYSTEM 0xFFFFFFFE + +typedef struct TbaseSessionMapInfoStruct { + void *src_address; + struct mc_bulk_map map_info; +} TbaseSessionMapInfo; + +typedef struct TbaseSessionStruct { + struct mc_session_handle ta_session; + ProtocolCmd *tci_buffer; + PersObjectCmd *persistent_object; + TbaseSessionMapInfo maps[PARAMS_NUM]; + void *parent_context; +} TbaseSession; + +static TEEC_Result ReadPersistentObjectFromFS(TbaseSession *session, + const uint8_t *id, + uint8_t *data, + uint32_t *data_len) +{ + TEEC_Result result = TEEC_ERROR_NOT_SUPPORTED; + return result; +} + +static TEEC_Result WritePersistentObjectToFS(TbaseSession *session, + const uint8_t *id, + const uint8_t *data, + uint32_t data_len) +{ + TEEC_Result result = TEEC_ERROR_NOT_SUPPORTED; + return result; +} + +static void TbaseInitSessionMaps(TbaseSession *session) +{ + if (session) + memset(session->maps, 0x00, sizeof(session->maps)); +} + +static void TbaseCleanSessionMaps(TbaseSession *session) +{ + int i = 0; + + if (session) { + for (i = 0; i < PARAMS_NUM; i++) { + if (session->maps[i].src_address) { + mc_unmap(&(session->ta_session), + session->maps[i].src_address, + &(session->maps[i].map_info)); + } + } + memset(session->maps, 0x00, sizeof(session->maps)); + } +} + +TEEC_Result TbaseSendCommand(void *ta_session, + uint32_t command_id, + TEEC_Operation *operation, + uint32_t *return_origin, + int32_t timeout) +{ + enum mc_result mc_res = MC_DRV_OK; + TEEC_Result ret = TEEC_ERROR_BAD_PARAMETERS; + TbaseSession *tbase_session = (TbaseSession *)ta_session; + + if (!tbase_session) + goto exit; + + /* tci_buffer is supposed to be not NULL */ + tbase_session->tci_buffer->return_origin = TEEC_ORIGIN_API; + + tbase_session->tci_buffer->cmd_id = command_id; + tbase_session->tci_buffer->param_types = 0; + tbase_session->tci_buffer->cmd_ret = TEEC_ERROR_COMMUNICATION; + + TbaseInitSessionMaps(tbase_session); + + if (operation) { + tbase_session->tci_buffer->param_types = operation->paramTypes; + ret = FillCommandArgs(tbase_session->tci_buffer, + operation, tbase_session); + + if (ret != TEEC_SUCCESS) + goto exit; + } + + do { + /* Clear PO command! */ + tbase_session->persistent_object->cmd_id = 0x00; + + /* Call */ + mc_res = mc_notify(&tbase_session->ta_session); + + /* Return origin: "COMMS" to handle several conditions below */ + tbase_session->tci_buffer->return_origin = TEEC_ORIGIN_COMMS; + + if (mc_res != MC_DRV_OK) { + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + mc_res = mc_wait_notification(&tbase_session->ta_session, + timeout); + + if (mc_res != MC_DRV_OK) { + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + /* Return origin: "TRUSTED_APP" to handle PO command emulation */ + tbase_session->tci_buffer->return_origin = + TEEC_ORIGIN_TRUSTED_APP; + + if (tbase_session->persistent_object->cmd_id) { + switch (tbase_session->persistent_object->cmd_id) { + case PROTOCOL_COMMAND_READF: { + uint32_t cmd_ret; + + cmd_ret = ReadPersistentObjectFromFS( + tbase_session, + tbase_session->persistent_object->id, + tbase_session->persistent_object->data, + &tbase_session->persistent_object->data_len); + + tbase_session->tci_buffer->cmd_ret = cmd_ret; + break; + } + case PROTOCOL_COMMAND_WRITEF: { + uint32_t cmd_ret; + + cmd_ret = WritePersistentObjectToFS( + tbase_session, + tbase_session->persistent_object->id, + tbase_session->persistent_object->data, + tbase_session->persistent_object->data_len); + + tbase_session->tci_buffer->cmd_ret = cmd_ret; + break; + } + default: { + uint32_t cmd_ret = TEEC_ERROR_NOT_SUPPORTED; + + tbase_session->tci_buffer->cmd_ret = cmd_ret; + break; + } + } + } + + } while (tbase_session->persistent_object->cmd_id); + + /* Return origin: "TEE" or "TRUSTED_APP" after communication with TEE. */ + + /* On Success: */ + if (return_origin) + *return_origin = TEEC_ORIGIN_TRUSTED_APP; + + ret = tbase_session->tci_buffer->cmd_ret; + + if (ret == TEEC_SUCCESS && operation) { + ret = FillOperationArgs(operation, tbase_session->tci_buffer); + if (ret != TEEC_SUCCESS) + tbase_session->tci_buffer->return_origin = + TEEC_ORIGIN_API; + } + +exit: + if (return_origin && tbase_session) { + /* tci_buffer is supposed to be not NULL */ + *return_origin = tbase_session->tci_buffer->return_origin; + } + + TbaseCleanSessionMaps(tbase_session); + return ret; +} + +TEEC_Result TbaseUnloadTA(void *ta_session) +{ + enum mc_result mc_res; + TEEC_Result status = TEEC_SUCCESS; + TbaseSession *session = (TbaseSession *)ta_session; + + mc_res = mc_close_session(&(session->ta_session)); + + if (mc_res != MC_DRV_OK) + status = TEEC_ERROR_GENERIC; + + if (session->tci_buffer != NULL) { + mc_res = mc_free_wsm(DEVICE_ID, (uint8_t *)session->tci_buffer); + if (mc_res != MC_DRV_OK) + status = TEEC_ERROR_GENERIC; + + session->tci_buffer = NULL; + session->persistent_object = NULL; + } + + return status; +} + +TEEC_Result TbaseLoadTA(void *ta_session, const TEEC_UUID *uuid) +{ + enum mc_result mc_res; + TEEC_Result status = TEEC_SUCCESS; + TbaseSession *session = (TbaseSession *)ta_session; + void *po_cmd; + const struct firmware *fw = NULL; + + if (!ta_session || !uuid) { + status = TEEC_ERROR_BAD_PARAMETERS; + goto error; + } + + session->tci_buffer = NULL; + mc_res = mc_open_device(DEVICE_ID); + + if (mc_res != MC_DRV_OK) { + status = TEEC_ERROR_GENERIC; + goto error; + } + + mc_res = mc_malloc_wsm(DEVICE_ID, 0, + sizeof(ProtocolCmd) + sizeof(PersObjectCmd), + (uint8_t **)&session->tci_buffer, 0); + if (mc_res != MC_DRV_OK) { + status = TEEC_ERROR_OUT_OF_MEMORY; + goto error_close; + } + + po_cmd = (void *)((uint8_t *)session->tci_buffer + sizeof(ProtocolCmd)); + session->persistent_object = (PersObjectCmd *)po_cmd; + + if (request_firmware_direct(&fw, CONFIG_FIVE_TRUSTLET_PATH, NULL)) { + status = TEEC_ERROR_NO_DATA; + goto error_free; + } + + mc_res = mc_open_trustlet(&(session->ta_session), +#if MCDRVMODULEAPI_VERSION_MAJOR < 8 + MC_SPID_SYSTEM, +#endif + (u8 *)fw->data, + fw->size, + (u8 *)session->tci_buffer, + sizeof(ProtocolCmd) + sizeof(PersObjectCmd)); + + if (mc_res != MC_DRV_OK) { + status = TEEC_ERROR_GENERIC; + goto error_free; + } + + release_firmware(fw); + + return status; + +error_free: + release_firmware(fw); + mc_free_wsm(DEVICE_ID, (uint8_t *)session->tci_buffer); +error_close: + mc_close_device(DEVICE_ID); +error: + return status; +} + +PlatformClientImpl g_tbase_platform_impl = { + TbaseLoadTA, + TbaseUnloadTA, + TbaseSendCommand, + NULL, + NULL, + NULL, + NULL +}; + +PlatformClientImpl *GetPlatformClientImpl(void) +{ + return &g_tbase_platform_impl; +} + +size_t GetPlatformClientImplSize(void) +{ + return sizeof(TbaseSession); +} + +void ClientImplSetParentContext(void *session, void *context) +{ + TbaseSession *tbase_session = (TbaseSession *)session; + + if (tbase_session) + tbase_session->parent_context = context; +} + +void *ClientImplGetParentContext(void *session) +{ + void *ret = NULL; + TbaseSession *tbase_session = (TbaseSession *)session; + + if (tbase_session) + ret = tbase_session->parent_context; + + return ret; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_teegris_v2.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_teegris_v2.c new file mode 100644 index 000000000..ae39383c0 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_common_teegris_v2.c @@ -0,0 +1,283 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#include +#include +#include +#include +#include +#include + +#include "teec_common.h" +#include "protocol.h" +#include "teec_param_utils.h" + +/* Timeout in seconds */ +#define FIVE_IWNOTIFY_TIMEOUT 3 +#define FIVE_IWNOTIFICATION TZ_IWNOTIFY_OEM_NOTIFICATION_FLAG_13 + +static DECLARE_COMPLETION(kcmd_event); + +static int __kcmd_notifier(struct notifier_block *nb, unsigned long action, + void *data) +{ + complete(&kcmd_event); + return 0; +} + +static struct notifier_block kcmd_notifier = { + .notifier_call = __kcmd_notifier, +}; + +static volatile uint8_t g_buffer[ALIGN(sizeof(ProtocolCmd), PAGE_SIZE)] + __aligned(PAGE_SIZE) = {0}; + +typedef struct TeegrisSessionStruct { + int client_id; + ProtocolCmd *tci_buffer; + void *parent_context; + uint32_t shmem_id; + struct page *shmem_page; + size_t tci_size; +} TeegrisSession; + +static TEEC_Result TeegrisSendCommand(void *ta_session, + uint32_t command_id, + TEEC_Operation *operation, + uint32_t *return_origin, + int32_t timeout) +{ + int res = 0; + TEEC_Result ret = TEEC_ERROR_BAD_PARAMETERS; + TeegrisSession *session = (TeegrisSession *)ta_session; + ProtocolParam cmd; + + if (!session) + goto exit; + + /* tci_buffer is supposed to be not NULL */ + session->tci_buffer->return_origin = TEEC_ORIGIN_API; + + session->tci_buffer->cmd_id = command_id; + session->tci_buffer->param_types = 0; + session->tci_buffer->cmd_ret = TEEC_ERROR_COMMUNICATION; + + if (operation) { + session->tci_buffer->param_types = operation->paramTypes; + ret = FillCommandArgs(session->tci_buffer, + operation, session); + + if (ret != TEEC_SUCCESS) + goto exit; + } + + /* Return origin: "COMMS" to handle several conditions below */ + session->tci_buffer->return_origin = TEEC_ORIGIN_COMMS; + + /* Call */ + cmd.memref.buffer = session->shmem_id; + cmd.memref.size = (uint32_t)session->tci_size; + res = tzdev_kapi_send(session->client_id, &cmd, sizeof(cmd)); + if (res < 0) { + pr_err("FIVE: Can't send command tzdev_kapi: %d\n", res); + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + res = wait_for_completion_timeout(&kcmd_event, + FIVE_IWNOTIFY_TIMEOUT * HZ); + if (res <= 0) { + pr_err("FIVE: Timeout expired on waiting for tzdev_kapi: %d\n", + res); + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + res = tzdev_kapi_recv(session->client_id, NULL, 0); + if (res < 0) { + pr_err("FIVE: Can't receive answer from tzdev_kapi: %d\n", res); + ret = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + /* Return origin: "TEE" or "TRUSTED_APP" after communication with TEE. */ + session->tci_buffer->return_origin = TEEC_ORIGIN_TRUSTED_APP; + + /* On Success: */ + if (return_origin) + *return_origin = TEEC_ORIGIN_TRUSTED_APP; + + ret = session->tci_buffer->cmd_ret; + + if (ret == TEEC_SUCCESS && operation) { + ret = FillOperationArgs(operation, session->tci_buffer); + if (ret != TEEC_SUCCESS) + session->tci_buffer->return_origin = TEEC_ORIGIN_API; + } + +exit: + if (return_origin && session) { + /* tci_buffer is supposed to be not NULL */ + *return_origin = session->tci_buffer->return_origin; + } + + return ret; +} + +static TEEC_Result TeegrisUnloadTA(void *ta_session) +{ + int res; + TEEC_Result status = TEEC_SUCCESS; + TeegrisSession *session = (TeegrisSession *)ta_session; + + res = tzdev_kapi_mem_revoke(session->client_id, session->shmem_id); + if (res) + status = TEEC_ERROR_GENERIC; + + res = tzdev_kapi_mem_release(session->shmem_id); + if (res) + status = TEEC_ERROR_GENERIC; + + res = tzdev_kapi_close(session->client_id); + if (res) + status = TEEC_ERROR_GENERIC; + + res = tz_iwnotify_chain_unregister(FIVE_IWNOTIFICATION, &kcmd_notifier); + if (res < 0) + status = TEEC_ERROR_GENERIC; + + if (session->tci_buffer != NULL) { + session->tci_buffer = NULL; + session->shmem_page = NULL; + } + + return status; +} + +static TEEC_Result TeegrisLoadTA(void *ta_session, const TEEC_UUID *uuid) +{ + int res; + TEEC_Result status = TEEC_SUCCESS; + TeegrisSession *session = (TeegrisSession *)ta_session; + + if (!ta_session || !uuid) { + status = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + session->shmem_page = virt_to_page(g_buffer); + if (!session->shmem_page) { + status = TEEC_ERROR_OUT_OF_MEMORY; + goto exit; + } + + if (!tzdev_is_up()) + panic("FIVE: tzdev is not ready\n"); + + init_completion(&kcmd_event); + res = tz_iwnotify_chain_register(FIVE_IWNOTIFICATION, &kcmd_notifier); + if (res < 0) { + pr_err("FIVE: Can't register iwnotify tzdev: %d\n", res); + status = TEEC_ERROR_COMMUNICATION; + goto exit; + } + + session->tci_buffer = (ProtocolCmd *)g_buffer; + session->tci_size = ALIGN(sizeof(ProtocolCmd), PAGE_SIZE); + + (void)BUILD_BUG_ON_ZERO((sizeof(struct tz_uuid) != sizeof(TEEC_UUID))); + res = tzdev_kapi_open((const struct tz_uuid *)uuid); + if (res < 0) { + pr_err("FIVE: Can't open tzdev_kapi: %d\n", res); + status = TEEC_ERROR_GENERIC; + goto error_chain; + } + + session->client_id = res; + + res = tzdev_kapi_mem_register(session->tci_buffer, + session->tci_size, 1); + if (res < 0) { + pr_err("FIVE: Can't register tzdev_kapi_mem: %d\n", res); + status = TEEC_ERROR_GENERIC; + goto error_close; + } + + session->shmem_id = res; + + res = tzdev_kapi_mem_grant(session->client_id, session->shmem_id); + if (res) { + pr_err("FIVE: Can't grant memory tzdev_kapi_mem: %d\n", res); + status = TEEC_ERROR_GENERIC; + goto error_mem; + } + + return status; + +error_chain: + res = tz_iwnotify_chain_unregister(FIVE_IWNOTIFICATION, &kcmd_notifier); + if (res < 0) + pr_err("FIVE: Can't unregister iwnotify tzdev: %d\n", res); + +error_mem: + tzdev_kapi_mem_release(session->shmem_id); + +error_close: + tzdev_kapi_close(session->client_id); + +exit: + return status; +} + +static PlatformClientImpl g_teegris_platform_impl = { + TeegrisLoadTA, + TeegrisUnloadTA, + TeegrisSendCommand, + NULL, + NULL, + NULL, + NULL +}; + +PlatformClientImpl *GetPlatformClientImpl(void) +{ + return &g_teegris_platform_impl; +} + +size_t GetPlatformClientImplSize(void) +{ + return sizeof(TeegrisSession); +} + +void ClientImplSetParentContext(void *ta_session, void *context) +{ + TeegrisSession *session = (TeegrisSession *)ta_session; + + if (session) + session->parent_context = context; +} + +void *ClientImplGetParentContext(void *ta_session) +{ + void *ret = NULL; + TeegrisSession *session = (TeegrisSession *)ta_session; + + if (session) + ret = session->parent_context; + + return ret; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation.h b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation.h new file mode 100644 index 000000000..7077bc108 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation.h @@ -0,0 +1,28 @@ +/* + * Set option shared memory and operations for TEE access + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * + * Egor Uleyskiy, + * Viacheslav Vovchenko + * Yevgen Kopylov + * + * 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 __LINUX_TEEC_OPERATION_H +#define __LINUX_TEEC_OPERATION_H + +#include "tee_client_api.h" + +void FillOperationSharedMem(TEEC_SharedMemory *sharedMem, + TEEC_Operation *operation, bool inout_direction); + +#endif // __LINUX_TEEC_OPERATION_H diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_qsee.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_qsee.c new file mode 100644 index 000000000..5abe632df --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_qsee.c @@ -0,0 +1,37 @@ +/* + * Set option shared memory and operations for TEE access + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * + * Egor Uleyskiy, + * Viacheslav Vovchenko + * Yevgen Kopylov + * + * 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. + */ + +#include "teec_operation.h" + +void FillOperationSharedMem(TEEC_SharedMemory *sharedMem, + TEEC_Operation *operation, bool inout_direction) +{ + if (inout_direction) { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } else { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } + + operation->params[0].tmpref.buffer = sharedMem->buffer; + operation->params[0].tmpref.size = sharedMem->size; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_tbase.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_tbase.c new file mode 100644 index 000000000..5abe632df --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_tbase.c @@ -0,0 +1,37 @@ +/* + * Set option shared memory and operations for TEE access + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * + * Egor Uleyskiy, + * Viacheslav Vovchenko + * Yevgen Kopylov + * + * 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. + */ + +#include "teec_operation.h" + +void FillOperationSharedMem(TEEC_SharedMemory *sharedMem, + TEEC_Operation *operation, bool inout_direction) +{ + if (inout_direction) { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } else { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } + + operation->params[0].tmpref.buffer = sharedMem->buffer; + operation->params[0].tmpref.size = sharedMem->size; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v2.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v2.c new file mode 100644 index 000000000..5abe632df --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v2.c @@ -0,0 +1,37 @@ +/* + * Set option shared memory and operations for TEE access + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * + * Egor Uleyskiy, + * Viacheslav Vovchenko + * Yevgen Kopylov + * + * 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. + */ + +#include "teec_operation.h" + +void FillOperationSharedMem(TEEC_SharedMemory *sharedMem, + TEEC_Operation *operation, bool inout_direction) +{ + if (inout_direction) { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } else { + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, + TEEC_NONE, + TEEC_NONE, TEEC_NONE); + } + + operation->params[0].tmpref.buffer = sharedMem->buffer; + operation->params[0].tmpref.size = sharedMem->size; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v3.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v3.c new file mode 100644 index 000000000..a13fb4d61 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/client/teec_operation_teegris_v3.c @@ -0,0 +1,29 @@ +/* + * Set option shared memory and operations for TEE access + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * + * Egor Uleyskiy, + * Viacheslav Vovchenko + * Yevgen Kopylov + * + * 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. + */ + +#include "teec_operation.h" + +void FillOperationSharedMem(TEEC_SharedMemory *sharedMem, + TEEC_Operation *operation, bool inout_direction) +{ + operation->paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_WHOLE, TEEC_NONE, + TEEC_NONE, TEEC_NONE); + + operation->params[0].memref.parent = sharedMem; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/protocol.h b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/protocol.h new file mode 100644 index 000000000..d0bffc6e7 --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/protocol.h @@ -0,0 +1,87 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#ifndef PROTOCOL_H_ +#define PROTOCOL_H_ + +#include + +#define PROTOCOL_COMMAND_UNLOAD 0xFF01 +#define PROTOCOL_COMMAND_LOAD 0xFF02 +#define PROTOCOL_COMMAND_READF 0xFF03 +#define PROTOCOL_COMMAND_WRITEF 0xFF04 + +/* + * Size of command buffer in Linux kernel for the case of kinibi must be less + * than 32 KBytes (8 pages): + * | struct ProcolCmd | struct PersObjectCmd | + * | 20544 bytes | 4180 bytes | = 24724 bytes (7 pages) + * + * The size of persistent object data should be comparable to the size of one + * command parameter. + */ +#define PROTOCOL_MAX_PARAM_DATA_LEN (4096 + 1024) +#define PARAMS_NUM 4 +#define MAX_SHAREDMEM_SIZE (PARAMS_NUM * PROTOCOL_MAX_PARAM_DATA_LEN) + +#define MAX_PERSISTENT_OBJECT_DATA_LEN 4096 +#define MAX_PERSISTENT_OBJECT_ID_LEN 64 + +/* + * All structures which travels across IW boundary must be packed + */ +#define IW_STRUCTURE __attribute__((packed)) + +//TEE_Result is the type used for return codes from the APIs. +typedef uint32_t TEE_Result; + +typedef union { + struct { + uint32_t buffer; + uint32_t size; + } IW_STRUCTURE memref; + struct { + uint32_t a, b; + } IW_STRUCTURE value; +} IW_STRUCTURE ProtocolParam; + +/* + * Size of ProtocolCmdStruct should be aligned to size_t, so we added + * dummy field to keep alignment + */ +typedef struct ProtocolCmdStruct { + uint32_t cmd_id; + uint32_t cmd_ret_origin; + uint32_t param_types; + ProtocolParam params[PARAMS_NUM]; + uint8_t param_buffers[PARAMS_NUM][PROTOCOL_MAX_PARAM_DATA_LEN]; + TEE_Result cmd_ret; + uint32_t return_origin; + uint32_t dummy; + uint64_t teec_oper; +} IW_STRUCTURE ProtocolCmd; + +typedef struct PersObjectCmdStruct { + uint32_t cmd_id; + uint32_t data_len; + uint32_t id_len; + uint8_t id[MAX_PERSISTENT_OBJECT_ID_LEN]; + uint8_t data[MAX_PERSISTENT_OBJECT_DATA_LEN]; + uint64_t teec_oper; +} IW_STRUCTURE PersObjectCmd; + +#endif /* !PROTOCOL_H */ diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.c b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.c new file mode 100644 index 000000000..1ac8152ca --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.c @@ -0,0 +1,168 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#include +#include +#include +#include "teec_param_utils.h" +#include "teec_common.h" +#include "protocol.h" + +static inline uint32_t GetParamTypeByFlags(uint32_t flags) +{ + uint32_t param_type = 0; + + if ((flags & TEEC_MEM_INPUT) && (flags & TEEC_MEM_OUTPUT)) + param_type = TEEC_MEMREF_TEMP_INOUT; + else if (flags & TEEC_MEM_INPUT) + param_type = TEEC_MEMREF_TEMP_INPUT; + else if (flags & TEEC_MEM_OUTPUT) + param_type = TEEC_MEMREF_TEMP_OUTPUT; + + return param_type; +} + +inline uint32_t GetParamType(uint32_t param_index, uint32_t param_types) +{ + uint32_t mask = 0xF << (param_index * 4); + + return (param_types & mask) >> (param_index * 4); +} + +static inline void SetParamType(uint32_t param_index, + uint32_t *param_types, uint32_t param_type) +{ + uint32_t mask = param_type << (param_index * 4); + *param_types &= ~(0xF << (param_index * 4)); + *param_types |= mask; +} + +TEEC_Result FillCommandArgs(ProtocolCmd *command, + TEEC_Operation *operation, void *ta_session) +{ + TEEC_Result ret = TEEC_SUCCESS; + uint32_t i = 0; + + if (!command || !operation) { + ret = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + for (i = 0; i < PARAMS_NUM; i++) { + switch (GetParamType(i, operation->paramTypes)) { + case TEEC_VALUE_INPUT: + case TEEC_VALUE_INOUT: { + command->params[i].value.a = + operation->params[i].value.a; + command->params[i].value.b = + operation->params[i].value.b; + break; + } + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_MEMREF_TEMP_INOUT: { + if (operation->params[i].tmpref.size > UINT_MAX || + operation->params[i].tmpref.size > + sizeof(command->param_buffers[i])) { + ret = TEEC_ERROR_EXCESS_DATA; + goto exit; + } + + command->params[i].memref.buffer = 0; + memcpy((void *)command->param_buffers[i], + operation->params[i].tmpref.buffer, + operation->params[i].tmpref.size); + + command->params[i].memref.size = + (uint32_t)operation->params[i].tmpref.size; + break; + } + case TEEC_MEMREF_TEMP_OUTPUT: { + if (operation->params[i].tmpref.size > UINT_MAX || + operation->params[i].tmpref.size > + sizeof(command->param_buffers[i])) { + ret = TEEC_ERROR_EXCESS_DATA; + goto exit; + } + command->params[i].memref.buffer = 0; + command->params[i].memref.size = + (uint32_t)operation->params[i].tmpref.size; + break; + } + case TEEC_NONE: + case TEEC_VALUE_OUTPUT: { + break; + } + default: { + ret = TEEC_ERROR_NOT_SUPPORTED; + goto exit; + } + } + } + +exit: + return ret; +} + +TEEC_Result FillOperationArgs(TEEC_Operation *operation, ProtocolCmd *command) +{ + TEEC_Result ret = TEEC_SUCCESS; + uint32_t i = 0; + + if (!operation || !command) { + ret = TEEC_ERROR_BAD_PARAMETERS; + goto exit; + } + + for (i = 0; i < PARAMS_NUM; i++) { + switch (GetParamType(i, operation->paramTypes)) { + case TEEC_VALUE_OUTPUT: + case TEEC_VALUE_INOUT: { + operation->params[i].value.a = + command->params[i].value.a; + operation->params[i].value.b = + command->params[i].value.b; + break; + } + case TEEC_MEMREF_TEMP_OUTPUT: + case TEEC_MEMREF_TEMP_INOUT: { + if (command->params[i].memref.size <= + operation->params[i].tmpref.size) { + memcpy(operation->params[i].tmpref.buffer, + command->param_buffers[i], + command->params[i].memref.size); + } else { + ret = TEEC_ERROR_SHORT_BUFFER; + } + operation->params[i].tmpref.size = + command->params[i].memref.size; + break; + } + case TEEC_NONE: + case TEEC_MEMREF_TEMP_INPUT: + case TEEC_VALUE_INPUT: { + break; + } + default: { + ret = TEEC_ERROR_NOT_SUPPORTED; + goto exit; + } + } + } + +exit: + return ret; +} diff --git a/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.h b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.h new file mode 100644 index 000000000..9c91f48bb --- /dev/null +++ b/drivers/security/samsung/five_tee_driver/multibuild/source/gp-api/protocol/teec_param_utils.h @@ -0,0 +1,29 @@ +/* + * 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. + * + * This code is originated from Samsung Electronics proprietary sources. + * Author: Iaroslav Makarchuk (i.makarchuk@samsung.com) + * Created: 12 Oct 2016 + * + * Copyright (C) 2016 Samsung Electronics, Inc. + */ + +#ifndef TEEC_PARAM_UTILS_H_ +#define TEEC_PARAM_UTILS_H_ + +#include "tee_client_api.h" +#include "protocol.h" + +inline uint32_t GetParamType(uint32_t param_index, uint32_t param_types); +TEEC_Result FillCommandArgs(ProtocolCmd *command, + TEEC_Operation *operation, void *ta_session); +TEEC_Result FillOperationArgs(TEEC_Operation *operation, ProtocolCmd *command); + +#endif /* TEEC_PARAM_UTILS_H_ */ diff --git a/drivers/security/samsung/tzic/Kconfig b/drivers/security/samsung/tzic/Kconfig new file mode 100644 index 000000000..1bfa20da2 --- /dev/null +++ b/drivers/security/samsung/tzic/Kconfig @@ -0,0 +1,42 @@ +# +# TZIC configuration +# + +config TZIC + bool "TZIC Driver" + default y + ---help--- + Enable TZIC Driver support. + +choice + prompt "IC Secure OS" + depends on TZIC + default TZIC_USE_QSEECOM if QSEECOM + default TZIC_USE_TZDEV if TZDEV + default TZIC_USE_TRUSTONIC if TRUSTONIC_TEE + default TZIC_DEFAULT + ---help--- + Select Secure OS for TZIC + + config TZIC_USE_TRUSTONIC + bool "TZIC based on Trustonic Secure OS" + depends on TRUSTONIC_TEE + ---help--- + Use Trustonic as base Trusted Execution Environment + + config TZIC_USE_TZDEV + bool "TZIC based on TEEgris Secure OS" + depends on TZDEV + ---help--- + Use TEEgris as base Trusted Execution Environment + + config TZIC_USE_QSEECOM + bool "TZIC based on Qualcomm Secure OS" + depends on QSEECOM + ---help--- + Use Qualcomm as base Trusted Execution Environment + config TZIC_DEFAULT + bool "TZIC Disabled" + ---help--- + TZIC disabled +endchoice diff --git a/drivers/security/samsung/tzic/Makefile b/drivers/security/samsung/tzic/Makefile new file mode 100644 index 000000000..69313772e --- /dev/null +++ b/drivers/security/samsung/tzic/Makefile @@ -0,0 +1,22 @@ +# +# TZIC Driver +# + +ccflags-$(CONFIG_TZDEV) += -I$(srctree)/drivers/misc/tzdev/include +MTK_PLATFORM := $(subst ",,$(CONFIG_MTK_PLATFORM)) +obj-$(CONFIG_TZIC) += tzic64.o + +EXTRA_CFLAGS += -I$(src) +obj-$(CONFIG_TZIC_USE_QSEECOM) += tzic_qsee.o +obj-$(CONFIG_TZIC_USE_TZDEV) += tzic_tzdev.o +ifneq ($(CONFIG_TZIC_EXYNOS7885),) +ccflags-$(CONFIG_TZIC_USE_TZDEV) += -Idrivers/misc/tzdev/3.0 +else +ccflags-$(CONFIG_TZIC_USE_TZDEV) += -Idrivers/misc/tzdev +endif +ifeq ($(MTK_PLATFORM),mt6768) + obj-y += tzic_mtk_atf.o +else + obj-$(CONFIG_TZIC_USE_TRUSTONIC) += tzic_kinibi.o + obj-$(CONFIG_TZIC_DEFAULT) += tzic_default.o +endif diff --git a/drivers/security/samsung/tzic/tzic.h b/drivers/security/samsung/tzic/tzic.h new file mode 100644 index 000000000..0261b9fba --- /dev/null +++ b/drivers/security/samsung/tzic/tzic.h @@ -0,0 +1,34 @@ +/* + * Get/Set OEM flags + * + * Copyright (C) 2017 Samsung Electronics, Inc. + * Nguyen Hoang Thai Kiet, + * Jonghun Song, + * + * 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 __OEM_FLAG_H +#define __OEM_FLAG_H + +enum oemflag_id { + OEMFLAG_NONE = 0, + OEMFLAG_MIN_FLAG = 2, + OEMFLAG_TZ_DRM, + OEMFLAG_FIDO, + OEMFLAG_CC, + OEMFLAG_ETC, + OEMFLAG_CUSTOM_KERNEL, + OEMFLAG_NUM_OF_FLAG, +}; + +int tzic_oem_flags_set(enum oemflag_id flag); +int tzic_oem_flags_get(enum oemflag_id flag); +#endif diff --git a/drivers/security/samsung/tzic/tzic64.c b/drivers/security/samsung/tzic/tzic64.c new file mode 100644 index 000000000..1b8105eb2 --- /dev/null +++ b/drivers/security/samsung/tzic/tzic64.c @@ -0,0 +1,381 @@ +/* + * Samsung TZIC 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 and + * only 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. + */ +#define KMSG_COMPONENT "TZIC" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tzic.h" + +#ifdef CONFIG_TZDEV +#include +#include +#include +#include +#if defined(CONFIG_TEEGRIS_VERSION) && (CONFIG_TEEGRIS_VERSION >= 4) +#include "extensions/irs.h" +#else +#include "tzirs.h" +#endif +#endif /* CONFIG_TZDEV */ + +#define TZIC_DEV "tzic" + +#define TZIC_IOC_MAGIC 0x9E +#define TZIC_IOCTL_GET_FUSE_REQ _IO(TZIC_IOC_MAGIC, 0) +#define TZIC_IOCTL_SET_FUSE_REQ _IO(TZIC_IOC_MAGIC, 1) +#define TZIC_IOCTL_SET_FUSE_REQ_DEFAULT _IO(TZIC_IOC_MAGIC, 2) +#define TZIC_IOCTL_GET_FUSE_REQ_NEW _IO(TZIC_IOC_MAGIC, 10) +#define TZIC_IOCTL_SET_FUSE_REQ_NEW _IO(TZIC_IOC_MAGIC, 11) + +#ifndef LOG +#define LOG printk +#endif + +#ifdef CONFIG_TZIC_USE_QSEECOM +#define HLOS_IMG_TAMPER_FUSE 0 +#endif /* CONFIG_TZIC_USE_QSEECOM */ + +#ifndef CONFIG_TZDEV +// TZ_IRS_CMD +enum { + IRS_SET_FLAG_CMD = 1, + IRS_SET_FLAG_VALUE_CMD, + IRS_INC_FLAG_CMD, + IRS_GET_FLAG_VAL_CMD, + IRS_ADD_FLAG_CMD, + IRS_DEL_FLAG_CMD +}; +#endif //CONFIG_TZDEV + +#if defined(CONFIG_TZIC_USE_TZDEV) || defined(CONFIG_TZIC_USE_TRUSTONIC) +static int gotoCpu0(void); +static int gotoAllCpu(void) __attribute__ ((unused)); +#endif + +struct t_flag { + uint32_t name; + uint32_t func_cmd; + uint32_t value; +}; + +static DEFINE_MUTEX(tzic_mutex); +static struct class *driver_class; +static dev_t tzic_device_no; +static struct cdev tzic_cdev; + +/* +General set flag function, it call function from tzic64_[secureOs].c +*/ +int tzic_flags_set(enum oemflag_id index) +{ + int ret = 0; + uint32_t name = index; + + if (name > OEMFLAG_MIN_FLAG && name < OEMFLAG_NUM_OF_FLAG) { + ret = tzic_oem_flags_get(name); + if (ret) { + LOG(KERN_INFO "[oemflag]flag is already set. %u\n", name); + return 0; + } + + LOG(KERN_INFO "[oemflag]set_fuse_name : %u\n", name); + + ret = tzic_oem_flags_set(name); + if (ret) { + LOG(KERN_INFO "set_tamper_fuse error: ret=%d\n", ret); + return 1; + } + ret = tzic_oem_flags_get(name); + if (!ret) { + LOG(KERN_INFO "get_tamper_fuse error: ret=%d\n", ret); + return 1; + } + } else { + LOG(KERN_INFO "[oemflag]param name is wrong\n"); + ret = -EINVAL; + } + return 0; +} + +/* +General get flag function, it call function from tzic64_[secureOs].c +*/ +int tzic_flags_get(enum oemflag_id index) +{ + int ret = 0; + uint32_t name = index; + + LOG(KERN_INFO "[oemflag]get_fuse_name : %u\n", name); + + if (name > OEMFLAG_MIN_FLAG && name < OEMFLAG_NUM_OF_FLAG) { + ret = tzic_oem_flags_get(name); + } else { + LOG(KERN_INFO "[oemflag]param name is wrong\n"); + ret = -EINVAL; + } + return ret; +} + +static long tzic_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = 0; + int i; + struct t_flag param = { 0, 0, 0 }; + +#ifdef CONFIG_TZDEV + if (_IOC_TYPE(cmd) != IOC_MAGIC && _IOC_TYPE(cmd) != TZIC_IOC_MAGIC) { + LOG(KERN_INFO "[oemflag]INVALID CMD = %d\n", cmd); + return -ENOTTY; + } +#endif /* CONFIG_TZDEV */ + +#if defined(CONFIG_TZIC_USE_TZDEV) || defined(CONFIG_TZIC_USE_TRUSTONIC) + ret = gotoCpu0(); + if (ret != 0) { + LOG(KERN_INFO "[oemflag]changing core failed!\n"); + return -1; + } +#endif + + switch (cmd) { + +#ifdef CONFIG_TZDEV + case IOCTL_IRS_CMD: + /* get flag id */ + ret = copy_from_user(¶m, (void *)arg, sizeof(param)); + if (ret != 0) { + LOG(KERN_INFO "[oemflag]copy_from_user failed, ret = 0x%08x\n", ret); + break; + } + + if(param.func_cmd==IRS_SET_FLAG_VALUE_CMD) { + ret = tzic_flags_set(param.name); + } else { + ret = tzic_flags_get(param.name); + } + + break; +#endif /* CONFIG_TZDEV */ + +#ifdef CONFIG_TZIC_USE_QSEECOM + case TZIC_IOCTL_GET_FUSE_REQ: + ret = tzic_flags_get(HLOS_IMG_TAMPER_FUSE); + LOG(KERN_INFO "[oemflag]tamper_fuse value = %x\n", ret); + break; + + case TZIC_IOCTL_SET_FUSE_REQ: + ret = tzic_flags_get(HLOS_IMG_TAMPER_FUSE); + LOG(KERN_INFO "[oemflag]tamper_fuse before = %x\n", ret); + mutex_lock(&tzic_mutex); + ret = tzic_flags_set(HLOS_IMG_TAMPER_FUSE); + mutex_unlock(&tzic_mutex); + if (ret) + LOG(KERN_INFO "[oemflag]failed tzic_set_fuse_cmd: %d\n", ret); + LOG(KERN_INFO "[oemflag]tamper_fuse after = %x\n", tzic_flags_get(HLOS_IMG_TAMPER_FUSE)); + break; +#endif //CONFIG_TZIC_USE_QSEECOM + + case TZIC_IOCTL_SET_FUSE_REQ_DEFAULT: //SET ALL OEM FLAG EXCEPT 0 + LOG(KERN_INFO "[oemflag]set_fuse_default\n"); + ret = copy_from_user(¶m, (void *)arg, sizeof(param)); + if (ret) { + LOG(KERN_INFO "[oemflag]ERROR copy from user\n"); + return ret; + } + for (i = OEMFLAG_MIN_FLAG+1; i < OEMFLAG_NUM_OF_FLAG; i++) { + param.name = i; + ret = tzic_flags_get(param.name); + LOG(KERN_INFO "[oemflag]tamper_fuse before = %x\n", ret); + mutex_lock(&tzic_mutex); + ret = tzic_flags_set(param.name); + mutex_unlock(&tzic_mutex); + if (ret) + LOG(KERN_INFO "[oemflag]failed tzic_set_fuse_cmd: %d\n", ret); + ret = tzic_flags_get(param.name); + LOG(KERN_INFO "[oemflag]tamper_fuse after = %x\n", ret); + } + break; + + case TZIC_IOCTL_SET_FUSE_REQ_NEW: + ret = copy_from_user(¶m, (void *)arg, sizeof(param)); + if (ret) { + LOG(KERN_INFO "[oemflag]ERROR copy from user\n"); + break; + } + if ((param.name > OEMFLAG_MIN_FLAG) && (param.name < OEMFLAG_NUM_OF_FLAG)) { + ret = tzic_flags_set(param.name); + } else { + LOG(KERN_INFO "[oemflag]command error\n"); + ret = -1; + } + break; + + case TZIC_IOCTL_GET_FUSE_REQ_NEW: + LOG(KERN_INFO "[oemflag]get_fuse_new\n"); + ret = copy_from_user(¶m, (void *)arg, sizeof(param)); + if (ret) { + LOG(KERN_INFO "[oemflag]ERROR copy from user\n"); + break; + } + if ((param.name > OEMFLAG_MIN_FLAG) && (param.name < OEMFLAG_NUM_OF_FLAG)) { + ret = tzic_flags_get(param.name); + LOG(KERN_INFO "[oemflag]get_oemflag_value : %u\n", ret); + } else { + LOG(KERN_INFO "[oemflag]command error\n"); + ret = -1; + } + break; + + default: + LOG(KERN_INFO "[oemflag]default\n"); + ret = copy_from_user(¶m, (void *)arg, sizeof(param)); + if (param.func_cmd == IRS_SET_FLAG_VALUE_CMD) { + if (ret) { + LOG(KERN_INFO "[oemflag]ERROR copy from user\n"); + break; + } + if ((param.name > OEMFLAG_MIN_FLAG) && (param.name < OEMFLAG_NUM_OF_FLAG)) { + ret = tzic_flags_set(param.name); + } else { + LOG(KERN_INFO "[oemflag]command error\n"); + ret = -1; + } + } else if (param.func_cmd == IRS_GET_FLAG_VAL_CMD) { + LOG(KERN_INFO "[oemflag]get_fuse_new\n"); + if (ret) { + LOG(KERN_INFO "[oemflag]ERROR copy from user\n"); + break; + } + if ((param.name > OEMFLAG_MIN_FLAG) && (param.name < OEMFLAG_NUM_OF_FLAG)) { + ret = tzic_flags_get(param.name); + LOG(KERN_INFO "[oemflag]get_oemflag_value : %u\n", ret); + } else { + LOG(KERN_INFO "[oemflag]command error\n"); + ret = -1; + } + } else { + LOG(KERN_INFO "[oemflag]command error\n"); + ret = -1; + } + } + +#if defined(CONFIG_TZIC_USE_TZDEV) || defined(CONFIG_TZIC_USE_TRUSTONIC) + gotoAllCpu(); +#endif + return ret; +} + +static const struct file_operations tzic_fops = { + .owner = THIS_MODULE, + .compat_ioctl = tzic_ioctl, + .unlocked_ioctl = tzic_ioctl, +}; + +static int __init tzic_init(void) +{ + int rc; + struct device *class_dev; + + rc = alloc_chrdev_region(&tzic_device_no, 0, 1, TZIC_DEV); + if (rc < 0) { + LOG(KERN_INFO "alloc_chrdev_region failed %d\n", rc); + return rc; + } + + driver_class = class_create(THIS_MODULE, TZIC_DEV); + if (IS_ERR(driver_class)) { + rc = -ENOMEM; + LOG(KERN_INFO "class_create failed %d\n", rc); + goto unregister_chrdev_region; + } + + class_dev = device_create(driver_class, NULL, tzic_device_no, NULL, + TZIC_DEV); + if (!class_dev) { + LOG(KERN_INFO "class_device_create failed %d\n", rc); + rc = -ENOMEM; + goto class_destroy; + } + + cdev_init(&tzic_cdev, &tzic_fops); + tzic_cdev.owner = THIS_MODULE; + + rc = cdev_add(&tzic_cdev, MKDEV(MAJOR(tzic_device_no), 0), 1); + if (rc < 0) { + LOG(KERN_INFO "cdev_add failed %d\n", rc); + goto class_device_destroy; + } + + return 0; + + class_device_destroy: + device_destroy(driver_class, tzic_device_no); + class_destroy: + class_destroy(driver_class); + unregister_chrdev_region: + unregister_chrdev_region(tzic_device_no, 1); + return rc; +} + +static void __exit tzic_exit(void) +{ + device_destroy(driver_class, tzic_device_no); + class_destroy(driver_class); + unregister_chrdev_region(tzic_device_no, 1); +} + +#if defined(CONFIG_TZIC_USE_TZDEV) || defined(CONFIG_TZIC_USE_TRUSTONIC) +static int gotoCpu0(void) +{ + int ret = 0; + struct cpumask mask = CPU_MASK_CPU0; + + ret = set_cpus_allowed_ptr(current, &mask); + + if (ret != 0) + LOG(KERN_INFO "set_cpus_allowed_ptr=%d.\n", ret); + return ret; +} + +static int gotoAllCpu(void) +{ + int ret = 0; + struct cpumask mask = CPU_MASK_ALL; + + ret = set_cpus_allowed_ptr(current, &mask); + + if (ret != 0) + LOG(KERN_INFO "set_cpus_allowed_ptr=%d.\n", ret); + return ret; +} +#endif + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Samsung TZIC Driver"); +MODULE_VERSION("1.00"); + +module_init(tzic_init); +module_exit(tzic_exit); \ No newline at end of file diff --git a/drivers/security/samsung/tzic/tzic_default.c b/drivers/security/samsung/tzic/tzic_default.c new file mode 100644 index 000000000..971926cbf --- /dev/null +++ b/drivers/security/samsung/tzic/tzic_default.c @@ -0,0 +1,27 @@ +/* + * Set OEM flags + * + * Copyright (C) 2018 Samsung Electronics, Inc. + * Nguyen Hoang Thai Kiet, + * Jonghun Song, + * + * 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. + */ +#include "tzic.h" + +int tzic_oem_flags_set(enum oemflag_id index) +{ + return 0; +} + +int tzic_oem_flags_get(enum oemflag_id index) +{ + return 0; +} diff --git a/drivers/security/samsung/tzic/tzic_kinibi.c b/drivers/security/samsung/tzic/tzic_kinibi.c new file mode 100644 index 000000000..2821e8a76 --- /dev/null +++ b/drivers/security/samsung/tzic/tzic_kinibi.c @@ -0,0 +1,58 @@ +/* + * Set OEM flags + * + * Copyright (C) 2018 Samsung Electronics, Inc. + * Jonghun Song, + * Egor Ulesykiy, + * Nguyen Hoang Thai Kiet, + * + * 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. + */ + +#include +#include +#include "tzic.h" + +#define SMC_SET_FUSE 0x83000004 +#define SMC_GET_FUSE 0x83000003 + +static uint32_t run_cmd_kinibi(uint32_t cmd, uint32_t arg1, + uint32_t arg2, uint32_t arg3) +{ + register u64 reg0 __asm__("x0") = cmd; + register u64 reg1 __asm__("x1") = arg1; + register u64 reg2 __asm__("x2") = arg2; + register u64 reg3 __asm__("x3") = arg3; + + __asm__ volatile ( + "dsb sy\n" + "smc 0\n" + : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) + + ); + + return reg1; +} + +int tzic_oem_flags_set(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]kinibi cmd\n"); + ret = run_cmd_kinibi(SMC_SET_FUSE, 0, index, 0); + return ret; +} + +int tzic_oem_flags_get(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]kinibi cmd\n"); + ret = run_cmd_kinibi(SMC_GET_FUSE, 1, index, 0); + return ret; +} diff --git a/drivers/security/samsung/tzic/tzic_mtk_atf.c b/drivers/security/samsung/tzic/tzic_mtk_atf.c new file mode 100644 index 000000000..efc2fc215 --- /dev/null +++ b/drivers/security/samsung/tzic/tzic_mtk_atf.c @@ -0,0 +1,47 @@ +/* + * Set OEM flags + * + * Copyright (C) 2018 Samsung Electronics, Inc. + * Nguyen Hoang Thai Kiet, + * Phung Xuan Chien, + * + * 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. + */ + +#include +#include +#include +#include "tzic.h" + +/* +Note: res.a0 = func_cmd, res.a1 = name, res.a2 = value +*/ +static uint32_t run_cmd_mtk_atf(uint32_t cmd, uint32_t index) +{ + struct arm_smccc_res res; + arm_smccc_smc(cmd, index, 0, 0, 0, 0, 0, 0, &res); + return res.a2; +} + +int tzic_oem_flags_set(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]MTK ATF cmd\n"); + ret = run_cmd_mtk_atf(MTK_SIP_OEM_FLAG_WRITE, index); + return (ret == 1) ? 0 : ret; +} + +int tzic_oem_flags_get(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]MTK ATF cmd\n"); + ret = run_cmd_mtk_atf(MTK_SIP_OEM_FLAG_READ, index); + return ret; +} diff --git a/drivers/security/samsung/tzic/tzic_qsee.c b/drivers/security/samsung/tzic/tzic_qsee.c new file mode 100644 index 000000000..739ab614e --- /dev/null +++ b/drivers/security/samsung/tzic/tzic_qsee.c @@ -0,0 +1,82 @@ +/* + * Set OEM flags + * + * Copyright (C) 2018 Samsung Electronics, Inc. + * Jonghun Song, + * Egor Ulesykiy, + * Nguyen Hoang Thai Kiet, + * + * 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. + */ + +#include +#include +#include +#include "tzic.h" + +#ifndef SCM_SVC_FUSE +#define SCM_SVC_FUSE 0x08 +#endif +#define SCM_BLOW_SW_FUSE_ID 0x01 +#define SMC_FUSE 0x83000004 +#define SCM_IS_SW_FUSE_BLOWN_ID 0x02 + +static int set_tamper_fuse_qsee(uint32_t index) +{ + struct scm_desc desc = {0}; + uint32_t fuse_id; + + desc.args[0] = fuse_id = index; + desc.arginfo = SCM_ARGS(1); + + return scm_call2(SCM_SIP_FNID(SCM_SVC_FUSE, SCM_BLOW_SW_FUSE_ID), + &desc); +} + +static int get_tamper_fuse_qsee(uint32_t index) +{ + int ret; + uint32_t fuse_id; + uint8_t resp_buf; + size_t resp_len; + struct scm_desc desc = {0}; + + resp_len = sizeof(resp_buf); + + desc.args[0] = fuse_id = index; + desc.arginfo = SCM_ARGS(1); + + ret = scm_call2(SCM_SIP_FNID(SCM_SVC_FUSE, SCM_IS_SW_FUSE_BLOWN_ID), + &desc); + resp_buf = desc.ret[0]; + + if (ret) { + pr_info("scm_call/2 returned %d", ret); + resp_buf = 0xff; + } + + return resp_buf; +} + +int tzic_oem_flags_set(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]qsee cmd\n"); + ret = set_tamper_fuse_qsee(index); + return ret; +} + +int tzic_oem_flags_get(enum oemflag_id index) +{ + int ret; + pr_info("[oemflag]qsee cmd\n"); + ret = get_tamper_fuse_qsee(index); + return ret; +} diff --git a/drivers/security/samsung/tzic/tzic_tzdev.c b/drivers/security/samsung/tzic/tzic_tzdev.c new file mode 100644 index 000000000..6837c0719 --- /dev/null +++ b/drivers/security/samsung/tzic/tzic_tzdev.c @@ -0,0 +1,82 @@ +/* + * Set OEM flags + * + * Copyright (C) 2018 Samsung Electronics, Inc. + * Jonghun Song, + * Egor Ulesykiy, + * Nguyen Hoang Thai Kiet, + * + * 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. + */ + +#include +#include +#include +#if defined(CONFIG_TEEGRIS_VERSION) && (CONFIG_TEEGRIS_VERSION >= 4) +#include "extensions/irs.h" +#else +#include "tzirs.h" +#endif +#include "tzic.h" + +static uint32_t run_cmd_teegris(uint32_t cmd, uint32_t arg1, + uint32_t arg2, uint32_t arg3) +{ + int ret = 0; + unsigned long p1, p2, p3; + + pr_info("[oemflag]tzirs cmd\n"); + + p1 = arg2; // param.name + p2 = arg3; // param.value + p3 = cmd; // param.func_cmd + + pr_info("[oemflag]before: id = 0x%lx, value = 0x%lx, cmd = 0x%lx\n", + (unsigned long)p1, (unsigned long)p2, (unsigned long)p3); + + ret = tzirs_smc(&p1, &p2, &p3); + + pr_info("[oemflag]after: id = 0x%lx, value = 0x%lx, cmd = 0x%lx\n", + (unsigned long)p1, (unsigned long)p2, (unsigned long)p3); + + if (ret) { + pr_info("[oemflag]Unable to send IRS_CMD : id = 0x%lx, ret = %d\n", + (unsigned long)p1, ret); + return -EFAULT; + } + + arg2 = p1; + arg3 = p2; + cmd = p3; + if(arg1) { + return p2; + } + else { + return ret; + } +} + +int tzic_oem_flags_set(enum oemflag_id index) +{ + int ret; + + ret = run_cmd_teegris(IRS_SET_FLAG_VALUE_CMD, 0, index, 1); + + return ret; +} + +int tzic_oem_flags_get(enum oemflag_id index) +{ + int ret; + + ret = run_cmd_teegris(IRS_GET_FLAG_VAL_CMD, 1, index, 0); + + return ret; +} diff --git a/drivers/sensors/Kconfig b/drivers/sensors/Kconfig index 85638fe2b..a63918cbe 100644 --- a/drivers/sensors/Kconfig +++ b/drivers/sensors/Kconfig @@ -85,6 +85,14 @@ config SENSORS_YAS539 If you say yes here you get support for YAMAHA YAS539 Geomagnitor Sensor. +config SENSORS_YAS539_A20E + tristate "YAS539 Sensor Driver" + depends on I2C + default n + help + If you say yes here you get support for YAMAHA + YAS539 Geomagnitor Sensor. + config SENSORS_GP2AP070S depends on I2C tristate "GP2AP070S driver" diff --git a/drivers/sensors/gp2ap110s.c b/drivers/sensors/gp2ap110s.c index d28bd6214..aea6c5462 100755 --- a/drivers/sensors/gp2ap110s.c +++ b/drivers/sensors/gp2ap110s.c @@ -239,7 +239,7 @@ static void gp2ap_StopMeasurement(struct gp2ap_data *data) gp2ap_i2c_write(REG_COM2, wdata, data->client); } -static uint32_t gp2ap_get_proximity_adc(struct gp2ap_data *data) +static int gp2ap_get_proximity_adc(struct gp2ap_data *data) { u8 value[2]; int ret; @@ -257,7 +257,7 @@ static void gp2ap_InitData(struct gp2ap_data *data) { u8 wdata; u8 offset; - uint32_t adc = 0; + int adc = 0; gp2ap_i2c_read(REG_DYNAMIC_CAL_RESULT, &offset, sizeof(offset), data->client); SENSOR_INFO("offset=%d\n", offset); @@ -272,6 +272,10 @@ static void gp2ap_InitData(struct gp2ap_data *data) if (offset >= OFFSET_TUNE_ADC && data->tune_adc_count < MAX_RETRY_TUNE_ADC_COUNT) { adc = gp2ap_get_proximity_adc(data); + if(adc < 0) { + data->tune_adc_count++; + return; + } wdata = (adc+ 1280)/256; SENSOR_INFO("Tune ADC: adc %d, wdata 0x%x\n", adc, wdata); if(wdata > 0x0D) @@ -286,7 +290,7 @@ static void gp2ap_InitData(struct gp2ap_data *data) } wdata = 0x00; gp2ap_i2c_write(0x81, wdata, data->client); - wdata = 0x00; gp2ap_i2c_write(0x82, wdata, data->client); + wdata = 0x02; gp2ap_i2c_write(0x82, wdata, data->client); wdata = 0x13; gp2ap_i2c_write(0x83, wdata, data->client); wdata = 0x10; gp2ap_i2c_write(0x85, wdata, data->client); wdata = data->led_reg_val; gp2ap_i2c_write(0x86, wdata, data->client); @@ -306,11 +310,10 @@ static void gp2ap_InitDataDynamicCalibration(struct gp2ap_data *data) { u8 wdata; - SENSOR_INFO("\n"); SENSOR_INFO("led_reg_val=%d", data->led_reg_val); wdata = 0x00; gp2ap_i2c_write(0x81, wdata, data->client); - wdata = 0x10; gp2ap_i2c_write(0x82, wdata, data->client); + wdata = 0x12; gp2ap_i2c_write(0x82, wdata, data->client); wdata = 0x10; gp2ap_i2c_write(0x83, wdata, data->client); wdata = 0x10; gp2ap_i2c_write(0x85, wdata, data->client); wdata = data->led_reg_val; gp2ap_i2c_write(0x86, wdata, data->client); @@ -334,7 +337,7 @@ static ssize_t ps_enable_show(struct device *dev, struct gp2ap_data *data = dev_get_drvdata(dev); int enabled; - SENSOR_INFO("ps_enable_show\n"); + SENSOR_INFO("ps_enable_show: %d\n", data->ps_enabled); enabled = data->ps_enabled; return sprintf(buf, "%d", enabled); } @@ -383,7 +386,7 @@ static void gp2ap_ps_setting(struct gp2ap_data *data) static int gp2ap_ps_onoff(u8 onoff, struct gp2ap_data *data) { - SENSOR_INFO("proximity_sensor onoff = %d\n", onoff); + SENSOR_INFO("onoff= %d\n", onoff); if (onoff) { gp2ap_ps_setting(data); @@ -395,22 +398,18 @@ static int gp2ap_ps_onoff(u8 onoff, struct gp2ap_data *data) msleep(50); - SENSOR_INFO("dynamic calibration done\n"); data->dynamic_calib_done = 1; + SENSOR_INFO("dynamic calibration done\n"); + if(data->zero_detect) data->zero_detect = 0; - gp2ap_InitData(data); - enable_irq_wake(data->ps_irq); - enable_irq(data->ps_irq); + gp2ap_InitData(data); } else { gp2ap_InitData(data); } gp2ap_StartMeasurement(data); } else { - disable_irq_wake(data->ps_irq); - disable_irq(data->ps_irq); - gp2ap_StopMeasurement(data); } @@ -423,8 +422,6 @@ static ssize_t gp2ap_ps_enable_store(struct device *dev, struct gp2ap_data *data = dev_get_drvdata(dev); bool new_value; - SENSOR_INFO("data=%s\n", buf); - if (sysfs_streq(buf, "1")) new_value = true; else if (sysfs_streq(buf, "0")) @@ -436,7 +433,7 @@ static ssize_t gp2ap_ps_enable_store(struct device *dev, mutex_lock(&data->mutex_enable); - SENSOR_INFO("new_value = %d, ps_enabled = %d\n", + SENSOR_INFO("new= %d, ps_enabled= %d\n", new_value, data->ps_enabled); if (!data->ps_enabled && new_value) { @@ -459,10 +456,15 @@ static ssize_t gp2ap_ps_enable_store(struct device *dev, mutex_unlock(&data->mutex_ps_onoff); } + enable_irq_wake(data->ps_irq); + enable_irq(data->ps_irq); schedule_delayed_work(&data->offset_work, msecs_to_jiffies(OFFSET_TUNE_DELAY)); SENSOR_INFO("proximity_sensor enable!! \n"); } else if (data->ps_enabled && !new_value) { + disable_irq_wake(data->ps_irq); + disable_irq(data->ps_irq); + cancel_delayed_work_sync(&data->offset_work); mutex_lock(&data->mutex_ps_onoff); gp2ap_ps_onoff(0, data); @@ -559,9 +561,10 @@ irqreturn_t gp2ap_ps_irq_handler(int irq, void *id_data) val = gpio_get_value(data->p_out); - SENSOR_INFO("val:%d\n", val); - - schedule_work(&data->ps_int_work); + /*1: Far, 0: Near */ + SENSOR_INFO("val:%d en:%d\n", val, data->ps_enabled); + if(data->ps_enabled) + schedule_work(&data->ps_int_work); return IRQ_HANDLED; } @@ -580,15 +583,12 @@ static void gp2ap_ps_work_int_func(struct work_struct *work) return; mutex_lock(&data->mutex_interrupt); - gp2ap_i2c_read(REG_DYNAMIC_CAL_RESULT, &offset, sizeof(offset), data->client); - - // 0 : proximity, 1 : away gp2ap_i2c_read(0x81, &rdata, sizeof(rdata), data->client); if ((rdata & 0x08) == 0x08) - distance = 0; + distance = 0; // Near else - distance = 1; + distance = 1; // Far if (data->ps_distance != distance) { data->ps_distance = distance; } @@ -601,20 +601,23 @@ static void gp2ap_ps_work_int_func(struct work_struct *work) else if (data->ps_count < data->ps_low_th && (data->high_offset + offset < data->min_close_offset && data->ps_count != 0)) near_far = 1; - SENSOR_INFO("ps_distance:%d, near_far:%d, ps_count:%d\n", data->ps_distance, near_far, data->ps_count); - if (near_far == 0) { data->zero_detect = 0; } - SENSOR_INFO("zero_detect=%d\n", data->zero_detect); + SENSOR_INFO("dis:%d near_far:%d count:%d zero:%d\n", + data->ps_distance, near_far, data->ps_count,data->zero_detect); if ((near_far == 1) && (data->ps_count == 0) && (data->zero_detect == 0)) { SENSOR_INFO("zero detection!!!\n"); data->zero_detect = 1; mutex_lock(&data->mutex_ps_onoff); + disable_irq_wake(data->ps_irq); + disable_irq(data->ps_irq); gp2ap_ps_onoff(0, data); gp2ap_ps_onoff(1, data); + enable_irq_wake(data->ps_irq); + enable_irq(data->ps_irq); mutex_unlock(&data->mutex_ps_onoff); if(!offset) { @@ -652,9 +655,9 @@ static int gp2ap_setup_irq(struct gp2ap_data *gp2ap) } gp2ap->ps_irq = gpio_to_irq(gp2ap->p_out); - ret = request_irq(gp2ap->ps_irq, gp2ap_ps_irq_handler, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "proximity_int", gp2ap); - + ret = request_irq(gp2ap->ps_irq, gp2ap_ps_irq_handler, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "proximity_int", gp2ap); + if (ret < 0) { SENSOR_ERR("request_irq(%d) failed for gpio %d (%d)\n", gp2ap->ps_irq, gp2ap->p_out, ret); @@ -1004,22 +1007,26 @@ static void gp2ap_offset_work_func(struct work_struct *work) struct gp2ap_data *data = container_of((struct delayed_work *)work, struct gp2ap_data, offset_work); - uint32_t ps_data; + int ps_data; u8 offset; - ps_data = gp2ap_get_proximity_adc(data); + if(!data->ps_enabled) return; - SENSOR_INFO("ps_data_offset_work=%d\n", ps_data); + ps_data = gp2ap_get_proximity_adc(data); + SENSOR_INFO("offset=%d\n", ps_data); if (ps_data > 0) data->zero_detect = 0; - - if (ps_data == 0 && data->zero_detect == 0) { + else if (ps_data == 0 && data->zero_detect == 0) { SENSOR_INFO(" zero detection\n"); data->zero_detect = 1; mutex_lock(&data->mutex_ps_onoff); + disable_irq_wake(data->ps_irq); + disable_irq(data->ps_irq); gp2ap_ps_onoff(0, data); gp2ap_ps_onoff(1, data); + enable_irq_wake(data->ps_irq); + enable_irq(data->ps_irq); mutex_unlock(&data->mutex_ps_onoff); gp2ap_i2c_read(REG_DYNAMIC_CAL_RESULT, &offset, sizeof(offset), data->client); @@ -1043,7 +1050,7 @@ static ssize_t proximity_state_show(struct device *dev, struct device_attribute *attr, char *buf) { struct gp2ap_data *data = dev_get_drvdata(dev); - uint32_t ps_data; + int ps_data; ps_data = gp2ap_get_proximity_adc(data); @@ -1153,11 +1160,12 @@ static void proximity_get_avg_val(struct gp2ap_data *data) { int min = 0, max = 0, avg = 0; int i; - u16 ps_data; + int ps_data; for (i = 0; i < PROX_READ_NUM; i++) { msleep(40); ps_data = gp2ap_get_proximity_adc(data); + if(ps_data < 0) continue; avg += ps_data; if (!i) min = ps_data; @@ -1454,8 +1462,10 @@ static int gp2ap_suspend(struct device *pdev) SENSOR_INFO("is called.\n"); - if (data->ps_enabled) + if (data->ps_enabled) { disable_irq(data->ps_irq); + cancel_delayed_work_sync(&data->offset_work); + } return 0; } @@ -1466,8 +1476,10 @@ static int gp2ap_resume(struct device *pdev) SENSOR_INFO("is called.\n"); - if (data->ps_enabled) + if (data->ps_enabled) { enable_irq(data->ps_irq); + schedule_delayed_work(&data->offset_work, msecs_to_jiffies(OFFSET_TUNE_DELAY)); + } return 0; } diff --git a/drivers/sensors/stk3x3x.c b/drivers/sensors/stk3x3x.c index 1a2565bf8..7ef4bebc3 100644 --- a/drivers/sensors/stk3x3x.c +++ b/drivers/sensors/stk3x3x.c @@ -457,8 +457,8 @@ static void stk3x3x_prox_cal(struct stk3x3x_data *ps_data) , sunlight_protection_mode); goto exit; } else if ((ps_data->cal_status == STK3X3X_CAL_ONGOING) - && (read_value > ps_data->prox_thd_l - 10)) { - SENSOR_ERR("cal failed ps_data = %d, thd l %u\n", read_value, ps_data->prox_thd_l); + && (read_value > ps_data->prox_default_thd_l - 20)) { + SENSOR_ERR("cal failed ps_data = %d, thd l %u\n", read_value, ps_data->prox_default_thd_l); goto exit; } else if (!ps_data->first_limit_skip && (ps_data->cal_status == STK3X3X_FIRST_CAL) && read_value > ps_data->first_cal_adc_limit) { @@ -555,7 +555,7 @@ static void stk3x3x_work_func_pocket_read(struct work_struct *work) if(ret < 0) SENSOR_ERR("WAIT_REG failed %d\n", ret); - mdelay(10); + usleep_range(10000, 10000); // check sunlight mode ret = STK3X3X_REG_READ(ps_data, STK3X3X_SUNLIGHT_CHECK_REG); @@ -586,7 +586,7 @@ static void stk3x3x_work_func_pocket_read(struct work_struct *work) } } if (i < POCKET_DATA_NUM - 1) - mdelay(10); + usleep_range(10000, 10000); } read_adc = read_adc / POCKET_DATA_NUM; diff --git a/drivers/sensors/yas_mag_kernel.c b/drivers/sensors/yas_mag_kernel.c index 4c42b0149..cd625a574 100755 --- a/drivers/sensors/yas_mag_kernel.c +++ b/drivers/sensors/yas_mag_kernel.c @@ -257,7 +257,9 @@ static ssize_t yas_self_test_show(struct device *dev, struct yas_state *data = i2c_get_clientdata(this_client); struct yas539_self_test_result r; s8 err[7] = { 0, }; - +#ifdef CONFIG_SENSORS_YAS539_A20E + int vector_sum; +#endif int ret; mutex_lock(&data->lock); @@ -284,12 +286,26 @@ static ssize_t yas_self_test_show(struct device *dev, err[5] = -2; if (unlikely(r.sxy1y2[2] > 16251 || r.sxy1y2[2] < 15584)) err[5] = -4; +#ifdef CONFIG_SENSORS_YAS539_A20E + if (unlikely(r.xyz[0] < -1500 || r.xyz[0] > 1500)) + err[6] = -1; + if (unlikely(r.xyz[1] < -1500 || r.xyz[1] > 1500)) + err[6] = -1; + if (unlikely(r.xyz[2] < -1500 || r.xyz[2] > 1500)) + err[6] = -1; + vector_sum = r.xyz[0] * r.xyz[0] + r.xyz[1] * r.xyz[1] + r.xyz[2] * r.xyz[2]; + if (unlikely(vector_sum >= 2250000)) { + err[6] = -1; + pr_info("[SENSOR] Fail vetor_sum^2= %d\n", vector_sum); + } +#else if (unlikely(r.xyz[0] < -1000 || r.xyz[0] > 1000)) err[6] = -1; if (unlikely(r.xyz[1] < -1000 || r.xyz[1] > 1000)) err[6] = -1; if (unlikely(r.xyz[2] < -1000 || r.xyz[2] > 1000)) err[6] = -1; +#endif pr_info("[SENSOR] %s\n" "[SENSOR] Test1 - err = %d, id = %d\n" diff --git a/drivers/staging/samsung/Kconfig b/drivers/staging/samsung/Kconfig index de5a72afd..0c53741c0 100644 --- a/drivers/staging/samsung/Kconfig +++ b/drivers/staging/samsung/Kconfig @@ -117,6 +117,13 @@ config CM_OFFSET help set Charging Mode Offset when you enable SEC_PARAM. +config FMM_LOCK_OFFSET + int "FMM lock Offset" + default 0 + depends on SEC_PARAM + help + set FMM lock Offset when you enable SEC_PARAM. + config SEC_EVENT_LOG bool "Enable Event log parser" depends on SEC_EXT @@ -302,3 +309,8 @@ config SEC_PERIPHERAL_SECURE_CHK help This option supports secure check +config SEC_DEBUG_SNAPSHOT_DISABLE + bool "Disable EXYNOS SNAPSHOT logging" + default n + help + This option blocks exynos snapshot logging diff --git a/drivers/staging/samsung/sec_debug.c b/drivers/staging/samsung/sec_debug.c index a26fb0a64..1e9fea131 100644 --- a/drivers/staging/samsung/sec_debug.c +++ b/drivers/staging/samsung/sec_debug.c @@ -268,6 +268,30 @@ out: } __setup("androidboot.recovery_offset=", sec_debug_recovery_cause_setup); +static unsigned long fmm_lock_offset; + +static int __init sec_debug_fmm_lock_offset(char *arg) +{ + fmm_lock_offset = simple_strtoul(arg, NULL, 10); + return 0; +} + +early_param("sec_debug.fmm_lock_offset", sec_debug_fmm_lock_offset); + +static ssize_t store_FMM_lock(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + char lock; + + sscanf(buf, "%c", &lock); + pr_info("%s: store %c in FMM_lock\n", __func__, lock); + sec_set_param(fmm_lock_offset, lock); + + return count; +} + +static DEVICE_ATTR(FMM_lock, 0220, NULL, store_FMM_lock); + static int __init sec_debug_recovery_cause_init(void) { struct device *dev; @@ -282,6 +306,9 @@ static int __init sec_debug_recovery_cause_init(void) if (device_create_file(dev, &dev_attr_recovery_cause) < 0) pr_err("%s: Failed to create device file\n", __func__); + if (device_create_file(dev, &dev_attr_FMM_lock) < 0) + pr_err("%s: Failed to create device file\n", __func__); + return 0; } late_initcall(sec_debug_recovery_cause_init); diff --git a/drivers/staging/samsung/sec_param.c b/drivers/staging/samsung/sec_param.c index 00229097b..5067037f8 100644 --- a/drivers/staging/samsung/sec_param.c +++ b/drivers/staging/samsung/sec_param.c @@ -126,8 +126,14 @@ int sec_set_param(unsigned long offset, char val) mutex_lock(&sec_param_mutex); - if ((offset < CM_OFFSET) || (offset > CM_OFFSET + CM_OFFSET_LIMIT)) - goto unlock_out; + switch (offset) { + case CM_OFFSET ... CM_OFFSET_LIMIT: + break; + default: + if (offset != FMM_LOCK_OFFSET) + goto unlock_out; + break; + } switch (val) { case PARAM_OFF: diff --git a/drivers/trace/exynos-ss.c b/drivers/trace/exynos-ss.c index 8f49d7f71..96fcfe38d 100644 --- a/drivers/trace/exynos-ss.c +++ b/drivers/trace/exynos-ss.c @@ -2584,6 +2584,15 @@ static int __init exynos_ss_init(void) #endif register_reboot_notifier(&nb_reboot_block); atomic_notifier_chain_register(&panic_notifier_list, &nb_panic_block); + +#ifdef CONFIG_SEC_DEBUG +#ifdef CONFIG_SEC_DEBUG_SNAPSHOT_DISABLE + if (sec_debug_get_debug_level() == 0) { + exynos_ss_set_enable("log_kevents", false); + pr_err("%s: disabled by debug level\n", __func__); + } +#endif +#endif } else pr_err("exynos-snapshot: %s failed\n", __func__); diff --git a/drivers/usb/manager/usb_typec_manager_notifier.c b/drivers/usb/manager/usb_typec_manager_notifier.c index 009b9cb40..827286a68 100644 --- a/drivers/usb/manager/usb_typec_manager_notifier.c +++ b/drivers/usb/manager/usb_typec_manager_notifier.c @@ -295,9 +295,10 @@ static int manager_external_notifier_notification(struct notifier_block *nb, switch (action) { case EXTERNAL_NOTIFY_DEVICEADD: pr_info("%s EXTERNAL_NOTIFY_DEVICEADD, enable=%d\n", __func__, enable); + pr_info("drp_state %d, pdic_attach_state %d, muic_attach_state %d\n", + typec_manager.ccic_drp_state, typec_manager.ccic_attach_state, typec_manager.muic_action); if (enable && typec_manager.ccic_drp_state == USB_STATUS_NOTIFY_ATTACH_DFP && - typec_manager.ccic_attach_state == CCIC_NOTIFY_ATTACH && typec_manager.muic_action != MUIC_NOTIFY_CMD_DETACH) { pr_info("%s: a usb device is added in host mode\n", __func__); /* USB cable Type */ diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_abd.c b/drivers/video/fbdev/exynos/dpu_7885/decon_abd.c index 4c3f07e67..f7f0c8eec 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_abd.c +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_abd.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -6,33 +7,57 @@ * published by the Free Software Foundation. */ -#include -#include #include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../../../kernel/irq/internals.h" +#if defined(CONFIG_ARCH_EXYNOS) +#include +#endif +#if defined(CONFIG_CAL_IF) +#include +#endif +#if defined(CONFIG_SOC_EXYNOS7885) +#include +#endif +#if defined(CONFIG_SOC_EXYNOS9610) +#include +#endif +#if defined(CONFIG_SOC_EXYNOS9810) +#include +#endif #if defined(CONFIG_SEC_DEBUG) #include #endif -#include "../../../../../kernel/irq/internals.h" +#if defined(CONFIG_ARCH_EXYNOS) #include "decon.h" -#include "decon_board.h" -#include "decon_notify.h" #include "dpp.h" #include "dsim.h" +#endif + +#include "decon_abd.h" +#include "decon_board.h" +#include "decon_notify.h" + +#define dbg_info(fmt, ...) pr_info(pr_fmt("decon: "fmt), ##__VA_ARGS__) #define abd_printf(m, ...) \ -{ if (m) seq_printf(m, __VA_ARGS__); else decon_info(__VA_ARGS__); } \ +{ if (m) seq_printf(m, __VA_ARGS__); else dbg_info(__VA_ARGS__); } \ -#if defined(CONFIG_LOGGING_BIGDATA_BUG) +#if defined(CONFIG_ARCH_EXYNOS) && defined(CONFIG_LOGGING_BIGDATA_BUG) /* Gen Big Data Error for Decon's Bug * * return value @@ -41,7 +66,7 @@ * 3. 23 ~ 16 : dsim underrun count * 4. 15 ~ 8 : 0x0e panel register * 5. 7 ~ 0 : 0x0a panel register - * */ + */ static unsigned int gen_decon_bug_bigdata(struct decon_device *decon) { @@ -61,7 +86,7 @@ static unsigned int gen_decon_bug_bigdata(struct decon_device *decon) if (dsim != NULL) { underrun_cnt = dsim->total_underrun_cnt; if (underrun_cnt > 0xff) { - decon_info("%s:dsim underrun exceed 1byte : %d\n", + dbg_info("%s: underrun exceed 1byte: %d\n", __func__, underrun_cnt); underrun_cnt = 0xff; } @@ -73,7 +98,7 @@ static unsigned int gen_decon_bug_bigdata(struct decon_device *decon) value |= panel_value & 0xffff; } - decon_info("%s:big data : %x\n", __func__, value); + dbg_info("%s: big data: %x\n", __func__, value); return value; } @@ -88,17 +113,116 @@ void log_decon_bigdata(struct decon_device *decon) } #endif -void decon_abd_save_str(struct abd_protect *abd, const char *print) +#if defined(CONFIG_ARCH_EXYNOS) +struct platform_device *of_find_abd_dt_parent_platform_device(void) { - unsigned int idx = atomic_inc_return(&abd->event.log_idx) % ABD_EVENT_LOG_MAX; - - abd->event.log[idx].stamp = local_clock(); - abd->event.log[idx].print = print; + return of_find_dsim_platform_device(); } -static void _decon_abd_print_bit(struct seq_file *m, struct abd_log *log) +struct platform_device *of_find_abd_container_platform_device(void) +{ + return of_find_decon_platform_device(); +} + +static struct decon_device *find_container(void) +{ + struct platform_device *pdev = NULL; + struct decon_device *container = NULL; + + pdev = of_find_abd_container_platform_device(); + if (!pdev) { + dbg_info("%s: of_find_device_by_node fail\n", __func__); + return NULL; + } + + container = platform_get_drvdata(pdev); + if (!container) { + dbg_info("%s: platform_get_drvdata fail\n", __func__); + return NULL; + } + + return container; +} + +static inline struct decon_device *get_abd_container_of(struct abd_protect *abd) +{ + struct decon_device *container = container_of(abd, struct decon_device, abd); + + return container; +} + +static void set_frame_update_bypass(struct abd_protect *abd, unsigned int bypass) +{ + struct decon_device *container = get_abd_container_of(abd); + + dbg_info("%s: %d\n", __func__, bypass); + +#if defined(CONFIG_SOC_EXYNOS9810) + atomic_set(&container->bypass, bypass); +#else + container->ignore_vsync = bypass; +#endif +} + +static int get_frame_update_bypass(struct abd_protect *abd) +{ + struct decon_device *container = get_abd_container_of(abd); + +#if defined(CONFIG_SOC_EXYNOS9810) + return decon_is_bypass(container); +#else + return container->ignore_vsync; +#endif +} + +static void set_lcdconnected(struct abd_protect *abd, unsigned int flag) +{ + struct decon_device *container = get_abd_container_of(abd); + struct dsim_device *dsim = v4l2_get_subdevdata(container->out_sd[0]); + + dsim->priv.lcdconnected = flag; +} + +static int get_lcdconnected(struct abd_protect *abd) +{ + struct decon_device *container = get_abd_container_of(abd); + struct dsim_device *dsim = v4l2_get_subdevdata(container->out_sd[0]); + + return dsim->priv.lcdconnected; +} + +static struct fb_info *get_fbinfo(struct abd_protect *abd) +{ + struct decon_device *container = get_abd_container_of(abd); + + return container->win[container->dt.dft_win]->fbinfo; +} +#endif + +void decon_abd_save_str(struct abd_protect *abd, const char *print) +{ + struct abd_str *event = NULL; + struct str_log *event_log = NULL; + + if (!abd || !abd->init_done) + return; + + event = &abd->s_event; + event_log = &event->log[(event->count % ABD_LOG_MAX)]; + + event_log->stamp = local_clock(); + event_log->ktime = ktime_get_real_seconds(); + event_log->print = print; + + event->count++; + + abd_printf(NULL, "%s\n", print); +} + +static void _decon_abd_print_bit(struct seq_file *m, struct bit_log *log) { struct timeval tv; + struct rtc_time tm; unsigned int bit = 0; char print_buf[200] = {0, }; struct seq_file p = { @@ -110,7 +234,10 @@ static void _decon_abd_print_bit(struct seq_file *m, struct abd_log *log) seq_puts(&p, "decon_abd: "); tv = ns_to_timeval(log->stamp); - seq_printf(&p, "time: %lu.%06lu, 0x%0*X, ", (unsigned long)tv.tv_sec, tv.tv_usec, log->size >> 2, log->value); + rtc_time_to_tm(log->ktime, &tm); + seq_printf(&p, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / 0x%0*X, ", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + (unsigned long)tv.tv_sec, tv.tv_usec, log->size >> 2, log->value); for (bit = 0; bit < log->size; bit++) { if (log->print[bit]) { @@ -124,21 +251,31 @@ static void _decon_abd_print_bit(struct seq_file *m, struct abd_log *log) void decon_abd_save_bit(struct abd_protect *abd, unsigned int size, unsigned int value, char **print) { - struct abd_trace *first = &abd->b_first; - struct abd_trace *event = &abd->b_event; + struct abd_bit *first = NULL; + struct abd_bit *event = NULL; - struct abd_log *first_log = &first->log[(first->count % ABD_LOG_MAX)]; - struct abd_log *event_log = &event->log[(event->count % ABD_LOG_MAX)]; + struct bit_log *first_log = NULL; + struct bit_log *event_log = NULL; - memset(event_log, 0, sizeof(struct abd_log)); + if (!abd || !abd->init_done) + return; + + first = &abd->b_first; + event = &abd->b_event; + + first_log = &first->log[(first->count % ABD_LOG_MAX)]; + event_log = &event->log[(event->count % ABD_LOG_MAX)]; + + memset(event_log, 0, sizeof(struct bit_log)); event_log->stamp = local_clock(); + event_log->ktime = ktime_get_real_seconds(); event_log->value = value; event_log->size = size; memcpy(&event_log->print, print, sizeof(char *) * size); if (!first->count) { - memset(first_log, 0, sizeof(struct abd_log)); - memcpy(first_log, event_log, sizeof(struct abd_log)); + memset(first_log, 0, sizeof(struct bit_log)); + memcpy(first_log, event_log, sizeof(struct bit_log)); first->count++; } @@ -147,29 +284,47 @@ void decon_abd_save_bit(struct abd_protect *abd, unsigned int size, unsigned int event->count++; } -void decon_abd_save_fto(struct abd_protect *abd, struct sync_fence *fence) +void decon_abd_save_fto(struct abd_protect *abd, void *fence) { - struct abd_trace *first = &abd->f_first; - struct abd_trace *lcdon = &abd->f_lcdon; - struct abd_trace *event = &abd->f_event; + struct abd_fto *first = NULL; + struct abd_fto *lcdon = NULL; + struct abd_fto *event = NULL; - struct abd_log *first_log = &first->log[(first->count % ABD_LOG_MAX)]; - struct abd_log *lcdon_log = &lcdon->log[(lcdon->count % ABD_LOG_MAX)]; - struct abd_log *event_log = &event->log[(event->count % ABD_LOG_MAX)]; + struct fto_log *first_log = NULL; + struct fto_log *lcdon_log = NULL; + struct fto_log *event_log = NULL; - memset(event_log, 0, sizeof(struct abd_log)); + if (!abd || !abd->init_done) + return; + + first = &abd->f_first; + lcdon = &abd->f_lcdon; + event = &abd->f_event; + + first_log = &first->log[(first->count % ABD_LOG_MAX)]; + lcdon_log = &lcdon->log[(lcdon->count % ABD_LOG_MAX)]; + event_log = &event->log[(event->count % ABD_LOG_MAX)]; + + memset(event_log, 0, sizeof(struct fto_log)); event_log->stamp = local_clock(); + event_log->ktime = ktime_get_real_seconds(); +#if defined(CONFIG_SOC_EXYNOS7885) memcpy(&event_log->fence, fence, sizeof(struct sync_fence)); +#elif defined(CONFIG_SOC_EXYNOS9810) + memcpy(&event_log->fence, fence, sizeof(struct sync_file)); +#else + memcpy(&event_log->fence, fence, sizeof(struct dma_fence)); +#endif if (!first->count) { - memset(first_log, 0, sizeof(struct abd_log)); - memcpy(first_log, event_log, sizeof(struct abd_log)); + memset(first_log, 0, sizeof(struct fto_log)); + memcpy(first_log, event_log, sizeof(struct fto_log)); first->count++; } if (!lcdon->lcdon_flag) { - memset(lcdon_log, 0, sizeof(struct abd_log)); - memcpy(lcdon_log, event_log, sizeof(struct abd_log)); + memset(lcdon_log, 0, sizeof(struct fto_log)); + memcpy(lcdon_log, event_log, sizeof(struct fto_log)); lcdon->count++; lcdon->lcdon_flag++; } @@ -179,25 +334,43 @@ void decon_abd_save_fto(struct abd_protect *abd, struct sync_fence *fence) void decon_abd_save_udr(struct abd_protect *abd, unsigned long mif, unsigned long iint, unsigned long disp) { - struct decon_device *decon = container_of(abd, struct decon_device, abd); - struct abd_trace *first = &abd->u_first; - struct abd_trace *lcdon = &abd->u_lcdon; - struct abd_trace *event = &abd->u_event; + struct decon_device *decon = NULL; + struct abd_udr *first = NULL; + struct abd_udr *lcdon = NULL; + struct abd_udr *event = NULL; - struct abd_log *first_log = &first->log[(first->count) % ABD_LOG_MAX]; - struct abd_log *lcdon_log = &lcdon->log[(lcdon->count) % ABD_LOG_MAX]; - struct abd_log *event_log = &event->log[(event->count) % ABD_LOG_MAX]; + struct udr_log *first_log = NULL; + struct udr_log *lcdon_log = NULL; + struct udr_log *event_log = NULL; + + if (!abd || !abd->init_done) + return; + + if (!mif | !iint | !disp) { + mif = cal_dfs_get_rate(ACPM_DVFS_MIF); + iint = cal_dfs_get_rate(ACPM_DVFS_INT); + disp = cal_dfs_get_rate(ACPM_DVFS_DISP); + } + + decon = get_abd_container_of(abd); + first = &abd->u_first; + lcdon = &abd->u_lcdon; + event = &abd->u_event; + + first_log = &first->log[(first->count) % ABD_LOG_MAX]; + lcdon_log = &lcdon->log[(lcdon->count) % ABD_LOG_MAX]; + event_log = &event->log[(event->count) % ABD_LOG_MAX]; event_log->stamp = local_clock(); - event_log->frm_status = decon->frm_status; + event_log->ktime = ktime_get_real_seconds(); event_log->mif = mif; event_log->iint = iint; event_log->disp = disp; + event_log->aclk = decon->prev_aclk_khz; memcpy(event_log->bts, &decon->bts, sizeof(struct decon_bts)); if (!first->count) { first_log->stamp = event_log->stamp; - first_log->frm_status = event_log->frm_status; first_log->mif = event_log->mif; first_log->iint = event_log->iint; first_log->disp = event_log->disp; @@ -208,7 +381,6 @@ void decon_abd_save_udr(struct abd_protect *abd, unsigned long mif, unsigned lon if (!lcdon->lcdon_flag) { lcdon_log->stamp = event_log->stamp; - lcdon_log->frm_status = event_log->frm_status; lcdon_log->mif = event_log->mif; lcdon_log->iint = event_log->iint; lcdon_log->disp = event_log->disp; @@ -221,21 +393,32 @@ void decon_abd_save_udr(struct abd_protect *abd, unsigned long mif, unsigned lon event->count++; } -static void decon_abd_save_pin(struct decon_device *decon, struct abd_pin *pin, struct abd_trace *trace, bool on) +static void decon_abd_save_pin(struct abd_protect *abd, struct abd_pin_info *pin, struct abd_pin *trace, bool on) { - struct abd_trace *first = &pin->p_first; + struct decon_device *decon = NULL; + struct abd_pin *first = NULL; - struct abd_log *first_log = &first->log[(first->count) % ABD_LOG_MAX]; - struct abd_log *trace_log = &trace->log[(trace->count) % ABD_LOG_MAX]; + struct pin_log *first_log = NULL; + struct pin_log *trace_log = NULL; + + if (!abd || !abd->init_done) + return; + + decon = get_abd_container_of(abd); + first = &pin->p_first; + + first_log = &first->log[(first->count) % ABD_LOG_MAX]; + trace_log = &trace->log[(trace->count) % ABD_LOG_MAX]; trace_log->stamp = local_clock(); + trace_log->ktime = ktime_get_real_seconds(); trace_log->level = pin->level; trace_log->state = decon->state; trace_log->onoff = on; if (!first->count) { - memset(first_log, 0, sizeof(struct abd_log)); - memcpy(first_log, trace_log, sizeof(struct abd_log)); + memset(first_log, 0, sizeof(struct pin_log)); + memcpy(first_log, trace_log, sizeof(struct pin_log)); first->count++; } @@ -253,78 +436,107 @@ static void decon_abd_pin_clear_pending_bit(int irq) } } -static void decon_abd_pin_enable_interrupt(struct decon_device *decon, struct abd_pin *pin, bool on) +static void decon_abd_pin_enable_irq(int irq, unsigned int on) { - struct abd_trace *trace = &pin->p_lcdon; + if (on) { + decon_abd_pin_clear_pending_bit(irq); + enable_irq(irq); + } else { + decon_abd_pin_clear_pending_bit(irq); + disable_irq_nosync(irq); + } +} - if (!pin || !pin->irq) +static struct abd_pin_info *decon_abd_find_pin_info(struct abd_protect *abd, unsigned int gpio) +{ + unsigned int i = 0; + + for (i = 0; i < ABD_PIN_MAX; i++) { + if (abd->pin[i].gpio == gpio) + return &abd->pin[i]; + } + + return NULL; +} + +static void _decon_abd_pin_enable(struct abd_protect *abd, struct abd_pin_info *pin, bool on) +{ + struct abd_pin *trace = &pin->p_lcdon; + unsigned int state = 0; + + if (!abd || !abd->init_done || !pin) return; + if (!pin->gpio && !pin->irq) + return; + + if (pin->enable == on) + return; + + pin->enable = on; + pin->level = gpio_get_value(pin->gpio); if (pin->level == pin->active_level) - decon_abd_save_pin(decon, pin, trace, on); + decon_abd_save_pin(abd, pin, trace, on); - decon_info("%s: on: %d, %s(%d,%d) level: %d, count: %d, state: %d, %s\n", __func__, - on, pin->name, pin->irq, pin->desc->depth, pin->level, trace->count, decon->state, (pin->level == pin->active_level) ? "abnormal" : "normal"); + dbg_info("%s: on: %d, %s(%3d,%d) level: %d, count: %d, state: %d, %s\n", __func__, + on, pin->name, pin->irq, pin->desc->depth, pin->level, trace->count, state, (pin->level == pin->active_level) ? "abnormal" : "normal"); - if (pin->name && !strcmp(pin->name, "pcd")) { - decon->ignore_vsync = (pin->level == pin->active_level) ? 1 : 0; - decon_info("%s: ignore_vsync: %d\n", __func__, decon->ignore_vsync); - } + if (pin->name && !strcmp(pin->name, "pcd")) + set_frame_update_bypass(abd, (pin->level == pin->active_level) ? 1 : 0); - if (on) { - decon_abd_pin_clear_pending_bit(pin->irq); - enable_irq(pin->irq); - } else - disable_irq_nosync(pin->irq); + if (pin->irq) + decon_abd_pin_enable_irq(pin->irq, on); } -void decon_abd_pin_enable(struct decon_device *decon, int enable) +int decon_abd_pin_enable(struct abd_protect *abd, unsigned int gpio, bool on) +{ + struct abd_pin_info *pin = NULL; + + pin = decon_abd_find_pin_info(abd, gpio); + if (!pin) + return -EINVAL; + + _decon_abd_pin_enable(abd, pin, on); + + return 0; +} + +void decon_abd_enable(struct abd_protect *abd, unsigned int enable) { - struct abd_protect *abd = &decon->abd; - struct dsim_device *dsim = v4l2_get_subdevdata(decon->out_sd[0]); unsigned int i = 0; if (!abd) return; - if (enable) { - if (abd->irq_enable == 1) { - decon_info("%s: already enabled irq_enable: %d\n", __func__, abd->irq_enable); - return; - } + if (abd->enable == enable) + dbg_info("%s: already %s\n", __func__, enable ? "enabled" : "disabled"); + if (abd->enable != enable) + dbg_info("%s: lcdconnected: %d\n", __func__, get_lcdconnected(abd)); + + if (!abd->enable && enable) { /* off -> on */ abd->f_lcdon.lcdon_flag = 0; abd->u_lcdon.lcdon_flag = 0; - - abd->irq_enable = 1; - } else { - if (abd->irq_enable == 0) { - decon_info("%s: already disabled irq_enable: %d\n", __func__, abd->irq_enable); - return; - } - - abd->irq_enable = 0; } - if (dsim && !dsim->priv.lcdconnected) - decon_info("%s: lcdconnected: %d\n", __func__, dsim->priv.lcdconnected); + abd->enable = enable; for (i = 0; i < ABD_PIN_MAX; i++) - decon_abd_pin_enable_interrupt(decon, &abd->pin[i], enable); + _decon_abd_pin_enable(abd, &abd->pin[i], enable); } irqreturn_t decon_abd_handler(int irq, void *dev_id) { - struct decon_device *decon = (struct decon_device *)dev_id; - struct abd_protect *abd = &decon->abd; - struct abd_pin *pin = NULL; - struct abd_trace *trace = NULL; + struct abd_protect *abd = (struct abd_protect *)dev_id; + struct decon_device *decon = get_abd_container_of(abd); + struct abd_pin_info *pin = NULL; + struct abd_pin *trace = NULL; struct adb_pin_handler *pin_handler = NULL; - unsigned int i = 0; + unsigned int i = 0, state = 0; - spin_lock(&decon->abd.slock); + spin_lock(&abd->slock); for (i = 0; i < ABD_PIN_MAX; i++) { pin = &abd->pin[i]; @@ -334,24 +546,23 @@ irqreturn_t decon_abd_handler(int irq, void *dev_id) } if (i == ABD_PIN_MAX) { - decon_info("%s: irq(%d) is not in abd\n", __func__, irq); + dbg_info("%s: irq(%d) is not in abd\n", __func__, irq); goto exit; } pin->level = gpio_get_value(pin->gpio); + state = decon->state; - decon_abd_save_pin(decon, pin, trace, 1); + decon_abd_save_pin(abd, pin, trace, 1); - decon_info("%s: %s(%d) level: %d, count: %d, state: %d, %s\n", __func__, - pin->name, pin->irq, pin->level, trace->count, decon->state, (pin->level == pin->active_level) ? "abnormal" : "normal"); + dbg_info("%s: %s(%d) level: %d, count: %d, state: %d, %s\n", __func__, + pin->name, pin->irq, pin->level, trace->count, state, (pin->level == pin->active_level) ? "abnormal" : "normal"); if (pin->active_level != pin->level) goto exit; - if (i == ABD_PIN_PCD) { - decon->ignore_vsync = 1; - decon_info("%s: ignore_vsync: %d\n", __func__, decon->ignore_vsync); - } + if (i == ABD_PIN_PCD) + set_frame_update_bypass(abd, 1); list_for_each_entry(pin_handler, &pin->handler_list, node) { if (pin_handler && pin_handler->handler) @@ -359,65 +570,104 @@ irqreturn_t decon_abd_handler(int irq, void *dev_id) } exit: - spin_unlock(&decon->abd.slock); + spin_unlock(&abd->slock); return IRQ_HANDLED; } -int decon_abd_pin_register_handler(int irq, irq_handler_t handler, void *dev_id) +int decon_abd_pin_register_handler(struct abd_protect *abd, int irq, irq_handler_t handler, void *dev_id) { - struct decon_device *decon = get_decon_drvdata(0); - struct abd_protect *abd = &decon->abd; - struct abd_pin *pin = NULL; - struct adb_pin_handler *pin_handler = NULL; + struct abd_pin_info *pin = NULL; + struct adb_pin_handler *pin_handler = NULL, *tmp = NULL; unsigned int i = 0; if (!irq) { - decon_info("%s: irq(%d) invalid\n", __func__, irq); + dbg_info("%s: irq(%d) invalid\n", __func__, irq); return -EINVAL; } if (!handler) { - decon_info("%s: handler invalid\n", __func__); + dbg_info("%s: handler invalid\n", __func__); return -EINVAL; } for (i = 0; i < ABD_PIN_MAX; i++) { pin = &abd->pin[i]; if (pin && irq == pin->irq) { - decon_info("%s: find irq(%d) for %s pin\n", __func__, irq, pin->name); + dbg_info("%s: find irq(%d) for %s pin\n", __func__, irq, pin->name); - list_for_each_entry(pin_handler, &pin->handler_list, node) { - WARN(pin_handler->handler == handler && pin_handler->dev_id == dev_id, \ + list_for_each_entry_safe(pin_handler, tmp, &pin->handler_list, node) { + WARN(pin_handler->handler == handler && pin_handler->dev_id == dev_id, "%s: already registered handler\n", __func__); } pin_handler = kzalloc(sizeof(struct adb_pin_handler), GFP_KERNEL); if (!pin_handler) { - decon_info("%s: handler kzalloc faile\n", __func__); + dbg_info("%s: handler kzalloc fail\n", __func__); break; } pin_handler->handler = handler; pin_handler->dev_id = dev_id; list_add_tail(&pin_handler->node, &pin->handler_list); - decon_info("%s: handler is registered\n", __func__); + dbg_info("%s: handler is registered\n", __func__); break; } } if (i == ABD_PIN_MAX) { - decon_info("%s: irq(%d) is not in abd\n", __func__, irq); + dbg_info("%s: irq(%d) is not in abd\n", __func__, irq); return -EINVAL; } return 0; } -static void _decon_abd_print_pin(struct seq_file *m, struct abd_trace *trace) +int decon_abd_pin_unregister_handler(struct abd_protect *abd, int irq, irq_handler_t handler, void *dev_id) +{ + struct abd_pin_info *pin = NULL; + struct adb_pin_handler *pin_handler = NULL, *tmp = NULL; + unsigned int i = 0; + + if (!irq) { + dbg_info("%s: irq(%d) invalid\n", __func__, irq); + return -EINVAL; + } + + if (!handler) { + dbg_info("%s: handler invalid\n", __func__); + return -EINVAL; + } + + for (i = 0; i < ABD_PIN_MAX; i++) { + pin = &abd->pin[i]; + if (pin && irq == pin->irq) { + dbg_info("%s: find irq(%d) for %s pin\n", __func__, irq, pin->name); + + list_for_each_entry_safe(pin_handler, tmp, &pin->handler_list, node) { + if (pin_handler->handler == handler && pin_handler->dev_id == dev_id) + list_del(&pin->handler_list); + kfree(pin_handler); + } + + dbg_info("%s: handler is unregistered\n", __func__); + break; + } + } + + if (i == ABD_PIN_MAX) { + dbg_info("%s: irq(%d) is not in abd\n", __func__, irq); + return -EINVAL; + } + + return 0; +} + +static void _decon_abd_print_pin(struct seq_file *m, struct abd_pin *trace) { struct timeval tv; - struct abd_log *log; + struct rtc_time tm; + struct pin_log *log; unsigned int i = 0; if (!trace->count) @@ -428,15 +678,18 @@ static void _decon_abd_print_pin(struct seq_file *m, struct abd_trace *trace) log = &trace->log[i]; if (!log->stamp) continue; + tv = ns_to_timeval(log->stamp); - abd_printf(m, "time: %lu.%06lu level: %d onoff: %d state: %d\n", + rtc_time_to_tm(log->ktime, &tm); + abd_printf(m, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / level: %d onoff: %d state: %d\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (unsigned long)tv.tv_sec, tv.tv_usec, log->level, log->onoff, log->state); } } -static void decon_abd_print_pin(struct seq_file *m, struct abd_pin *pin) +static void decon_abd_print_pin(struct seq_file *m, struct abd_pin_info *pin) { - if (!pin->irq) + if (!pin->irq && !pin->gpio) return; if (!pin->p_first.count) @@ -451,19 +704,20 @@ static void decon_abd_print_pin(struct seq_file *m, struct abd_pin *pin) static const char *sync_status_str(int status) { - if (status == 0) - return "signaled"; + if (status < 0) + return "error"; if (status > 0) - return "active"; + return "signaled"; - return "error"; + return "active"; } -static void decon_abd_print_fto(struct seq_file *m, struct abd_trace *trace) +static void decon_abd_print_fto(struct seq_file *m, struct abd_fto *trace) { struct timeval tv; - struct abd_log *log; + struct rtc_time tm; + struct fto_log *log; unsigned int i = 0; if (!trace->count) @@ -475,15 +729,29 @@ static void decon_abd_print_fto(struct seq_file *m, struct abd_trace *trace) if (!log->stamp) continue; tv = ns_to_timeval(log->stamp); - abd_printf(m, "time: %lu.%06lu, %d, %s: %s\n", + rtc_time_to_tm(log->ktime, &tm); + +#if defined(CONFIG_SOC_EXYNOS7885) + abd_printf(m, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / winid: %d, %s:%s\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (unsigned long)tv.tv_sec, tv.tv_usec, log->winid, log->fence.name, sync_status_str(atomic_read(&log->fence.status))); +#elif defined(CONFIG_SOC_EXYNOS9810) + abd_printf(m, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / winid: %d, %s\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + (unsigned long)tv.tv_sec, tv.tv_usec, log->winid, log->fence.name, sync_status_str(fence_get_status(log->fence.fence))); +#else + abd_printf(m, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / winid: %d, %s\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + (unsigned long)tv.tv_sec, tv.tv_usec, log->winid, sync_status_str(dma_fence_get_status_locked(&log->fence))); +#endif } } -static void decon_abd_print_udr(struct seq_file *m, struct abd_trace *trace) +static void decon_abd_print_udr(struct seq_file *m, struct abd_udr *trace) { struct timeval tv; - struct abd_log *log; + struct rtc_time tm; + struct udr_log *log; struct decon_bts *bts; struct bts_decon_info *bts_info; unsigned int i = 0, idx; @@ -497,14 +765,15 @@ static void decon_abd_print_udr(struct seq_file *m, struct abd_trace *trace) if (!log->stamp) continue; tv = ns_to_timeval(log->stamp); - abd_printf(m, "time: %lu.%06lu, frm: %d\n", - (unsigned long)tv.tv_sec, tv.tv_usec, log->frm_status); - - abd_printf(m, "MIF(%lu), INT(%lu), DISP(%lu)\n", log->mif, log->iint, log->disp); + rtc_time_to_tm(log->ktime, &tm); + abd_printf(m, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + (unsigned long)tv.tv_sec, tv.tv_usec); bts = (struct decon_bts *)log->bts; bts_info = &bts->bts_info; - abd_printf(m, "total(%u %u), max(%u %u), peak(%u)\n", + abd_printf(m, "MIF(%lu), INT(%lu), DISP(%lu), ACLK(%lu) / total(%u %u), max(%u %u), peak(%u)\n", + log->mif, log->iint, log->disp, log->aclk, bts->prev_total_bw, bts->total_bw, bts->prev_max_disp_freq, @@ -515,20 +784,29 @@ static void decon_abd_print_udr(struct seq_file *m, struct abd_trace *trace) if (!bts_info->dpp[idx].used) continue; +#if defined(CONFIG_SOC_EXYNOS7885) abd_printf(m, "DPP[%d] (%d) b(%d) s(%4d %4d) d(%4d %4d %4d %4d)\n", idx, bts_info->dpp[idx].idma_type, bts_info->dpp[idx].bpp, bts_info->dpp[idx].src_w, bts_info->dpp[idx].src_h, bts_info->dpp[idx].dst.x1, bts_info->dpp[idx].dst.x2, bts_info->dpp[idx].dst.y1, bts_info->dpp[idx].dst.y2); +#else + abd_printf(m, "DPP[%d] b(%d) s(%4d %4d) d(%4d %4d %4d %4d) r(%d)\n", + idx, bts_info->dpp[idx].bpp, + bts_info->dpp[idx].src_w, bts_info->dpp[idx].src_h, + bts_info->dpp[idx].dst.x1, bts_info->dpp[idx].dst.x2, + bts_info->dpp[idx].dst.y1, bts_info->dpp[idx].dst.y2, + bts_info->dpp[idx].rotation); +#endif } } } -static void decon_abd_print_ss_log(struct seq_file *m) +static void decon_abd_print_ss_log(struct abd_protect *abd, struct seq_file *m) { unsigned int log_max = 200, i, idx; struct timeval tv; - struct decon_device *decon = m ? m->private : get_decon_drvdata(0); + struct decon_device *decon = get_abd_container_of(abd); int start = atomic_read(&decon->d.event_log_idx); struct dpu_log *log; @@ -549,13 +827,13 @@ static void decon_abd_print_ss_log(struct seq_file *m) abd_printf(m, "\n"); } -static void decon_abd_print_str(struct seq_file *m) +static void decon_abd_print_str(struct seq_file *m, struct abd_str *trace) { - unsigned int log_max = ABD_EVENT_LOG_MAX, i, idx; + unsigned int log_max = ABD_LOG_MAX, i, idx; struct timeval tv; - struct decon_device *decon = m ? m->private : get_decon_drvdata(0); - int start = atomic_read(&decon->abd.event.log_idx); - struct abd_event_log *log; + struct rtc_time tm; + int start = trace->count - 1; + struct str_log *log; char print_buf[200] = {0, }; struct seq_file p = { .buf = print_buf, @@ -570,26 +848,29 @@ static void decon_abd_print_str(struct seq_file *m) start = (start > log_max) ? start - log_max + 1 : 0; for (i = 0; i < log_max; i++) { - idx = (start + i) % ABD_EVENT_LOG_MAX; - log = &decon->abd.event.log[idx]; + idx = (start + i) % ABD_LOG_MAX; + log = &trace->log[idx]; if (!log->stamp) continue; tv = ns_to_timeval(log->stamp); + rtc_time_to_tm(log->ktime, &tm); if (i && !(i % 2)) { abd_printf(m, "%s\n", p.buf); p.count = 0; memset(print_buf, 0, sizeof(print_buf)); } - seq_printf(&p, "%lu.%06lu %-20s ", (unsigned long)tv.tv_sec, tv.tv_usec, log->print); + seq_printf(&p, "%d-%02d-%02d %02d:%02d:%02d / %lu.%06lu / %-20s ", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + (unsigned long)tv.tv_sec, tv.tv_usec, log->print); } abd_printf(m, "%s\n", p.count ? p.buf : ""); } -static void decon_abd_print_bit(struct seq_file *m, struct abd_trace *trace) +static void decon_abd_print_bit(struct seq_file *m, struct abd_bit *trace) { - struct abd_log *log; + struct bit_log *log; unsigned int i = 0; if (!trace->count) @@ -606,13 +887,13 @@ static void decon_abd_print_bit(struct seq_file *m, struct abd_trace *trace) static int decon_abd_show(struct seq_file *m, void *unused) { - struct decon_device *decon = m ? m->private : get_decon_drvdata(0); - struct abd_protect *abd = &decon->abd; + struct abd_protect *abd = m->private; + struct decon_device *decon = get_abd_container_of(abd); struct dsim_device *dsim = v4l2_get_subdevdata(decon->out_sd[0]); unsigned int i = 0; abd_printf(m, "==========_DECON_ABD_==========\n"); - abd_printf(m, "isync: %d, lcdconnected: %d, lcdtype: %6X\n", decon->ignore_vsync, dsim->priv.lcdconnected, lcdtype); + abd_printf(m, "bypass: %d, lcdconnected: %d, lcdtype: %6X\n", get_frame_update_bypass(abd), get_lcdconnected(abd), lcdtype); for (i = 0; i < ABD_PIN_MAX; i++) { if (abd->pin[i].p_first.count) { @@ -644,10 +925,10 @@ static int decon_abd_show(struct seq_file *m, void *unused) decon_abd_print_udr(m, &abd->u_event); } - decon_abd_print_str(m); + decon_abd_print_str(m, &abd->s_event); abd_printf(m, "==========_RAM_DEBUG_==========\n"); - decon_abd_print_ss_log(m); + decon_abd_print_ss_log(abd, m); return 0; } @@ -668,17 +949,15 @@ static int decon_abd_reboot_notifier(struct notifier_block *this, unsigned long code, void *unused) { struct abd_protect *abd = container_of(this, struct abd_protect, reboot_notifier); - struct decon_device *decon = container_of(abd, struct decon_device, abd); - struct dsim_device *dsim = v4l2_get_subdevdata(decon->out_sd[0]); unsigned int i = 0; struct seq_file *m = NULL; - decon_info("++ %s: %lu\n", __func__, code); + dbg_info("++ %s: %lu\n", __func__, code); - decon_abd_pin_enable(decon, 0); + decon_abd_enable(abd, 0); abd_printf(m, "==========_DECON_ABD_==========\n"); - abd_printf(m, "isync: %d, lcdconnected: %d, lcdtype: %6X\n", decon->ignore_vsync, dsim->priv.lcdconnected, lcdtype); + abd_printf(m, "bypass: %d, lcdconnected: %d, lcdtype: %6X\n", get_frame_update_bypass(abd), get_lcdconnected(abd), lcdtype); for (i = 0; i < ABD_PIN_MAX; i++) { if (abd->pin[i].p_first.count) { @@ -709,34 +988,35 @@ static int decon_abd_reboot_notifier(struct notifier_block *this, decon_abd_print_udr(m, &abd->u_event); } - decon_abd_print_str(m); + decon_abd_print_str(m, &abd->s_event); - decon_info("-- %s: %lu\n", __func__, code); + dbg_info("-- %s: %lu\n", __func__, code); return NOTIFY_DONE; } -static int decon_abd_pin_register_function(struct decon_device *decon, struct abd_pin *pin, char *keyword, +static int decon_abd_pin_register_function(struct abd_protect *abd, struct abd_pin_info *pin, char *keyword, irqreturn_t func(int irq, void *dev_id)) { int ret = 0, gpio = 0; enum of_gpio_flags flags; struct device_node *np = NULL; struct platform_device *pdev = NULL; - struct device *dev = decon->dev; + struct device *dev = NULL; unsigned int irqf_type = IRQF_TRIGGER_RISING; - struct abd_trace *trace = &pin->p_lcdon; + struct abd_pin *trace = &pin->p_lcdon; char *prefix_gpio = "gpio_"; char dts_name[10] = {0, }; if (strlen(keyword) + strlen(prefix_gpio) >= sizeof(dts_name)) { - decon_warn("%s: %s is too log(%zu)\n", __func__, keyword, strlen(keyword)); + dbg_info("%s: %s is too log(%zu)\n", __func__, keyword, strlen(keyword)); goto exit; } scnprintf(dts_name, sizeof(dts_name), "%s%s", prefix_gpio, keyword); - pdev = of_find_dsim_platform_device(); + pdev = of_find_abd_dt_parent_platform_device(); + dev = &pdev->dev; np = of_find_decon_board(pdev ? &pdev->dev : NULL); @@ -745,109 +1025,148 @@ static int decon_abd_pin_register_function(struct decon_device *decon, struct ab gpio = of_get_named_gpio_flags(np, dts_name, 0, &flags); if (!gpio_is_valid(gpio)) { - decon_info("%s: gpio_is_valid fail, gpio: %s, %d\n", __func__, dts_name, gpio); + dbg_info("%s: gpio_is_valid fail, gpio: %s, %d\n", __func__, dts_name, gpio); goto exit; } - decon_info("%s: found %s(%d) success\n", __func__, dts_name, gpio); + dbg_info("%s: found %s(%d) success\n", __func__, dts_name, gpio); if (gpio_to_irq(gpio) > 0) { pin->gpio = gpio; pin->irq = gpio_to_irq(gpio); pin->desc = irq_to_desc(pin->irq); } else { - decon_info("%s: gpio_to_irq fail, gpio: %d, irq: %d\n", __func__, gpio, gpio_to_irq(gpio)); - pin->gpio = 0; + dbg_info("%s: gpio_to_irq fail, gpio: %d, irq: %d\n", __func__, gpio, gpio_to_irq(gpio)); + pin->gpio = gpio; pin->irq = 0; - goto exit; + pin->desc = kzalloc(sizeof(struct irq_desc), GFP_KERNEL); } pin->active_level = !(flags & OF_GPIO_ACTIVE_LOW); irqf_type = (flags & OF_GPIO_ACTIVE_LOW) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; - decon_info("%s: %s is active %s, %s\n", __func__, keyword, pin->active_level ? "high" : "low", - (irqf_type == IRQF_TRIGGER_RISING) ? "rising" : "falling"); + dbg_info("%s: %s is active %s%s\n", __func__, keyword, pin->active_level ? "high" : "low", + (pin->irq) ? ((irqf_type == IRQF_TRIGGER_RISING) ? ", rising" : ", falling") : ""); pin->name = keyword; pin->p_first.name = "first"; pin->p_lcdon.name = "lcdon"; pin->p_event.name = "event"; - irq_set_irq_type(pin->irq, irqf_type); - irq_set_status_flags(pin->irq, _IRQ_NOAUTOEN); - decon_abd_pin_clear_pending_bit(pin->irq); - - if (devm_request_irq(dev, pin->irq, func, irqf_type, keyword, decon)) { - decon_err("%s: failed to request irq for %s\n", __func__, keyword); - pin->gpio = 0; - pin->irq = 0; - goto exit; - } - - INIT_LIST_HEAD(&pin->handler_list); - pin->level = gpio_get_value(pin->gpio); if (pin->level == pin->active_level) { - decon_info("%s: %s(%d) is already %s(%d)\n", __func__, keyword, pin->gpio, + dbg_info("%s: %s(%d) is already %s(%d)\n", __func__, keyword, pin->gpio, (pin->active_level) ? "high" : "low", pin->level); - decon_abd_save_pin(decon, pin, trace, 1); + decon_abd_save_pin(abd, pin, trace, 1); - if (pin->name && !strcmp(pin->name, "pcd")) { - decon->ignore_vsync = 1; - decon_info("%s: ignore_vsync: %d\n", __func__, decon->ignore_vsync); + if (pin->name && !strcmp(pin->name, "pcd")) + set_frame_update_bypass(abd, 1); + } + + if (pin->irq) { + irq_set_irq_type(pin->irq, irqf_type); + irq_set_status_flags(pin->irq, _IRQ_NOAUTOEN); + decon_abd_pin_clear_pending_bit(pin->irq); + + if (devm_request_irq(dev, pin->irq, func, irqf_type, keyword, abd)) { + dbg_info("%s: failed to request irq for %s\n", __func__, keyword); + /* pin->gpio = 0; */ + pin->irq = 0; + goto exit; } + + INIT_LIST_HEAD(&pin->handler_list); } exit: return ret; } -static int decon_abd_con_fb_blank(struct decon_device *decon) +#if defined(CONFIG_ARCH_EXYNOS) +static int _decon_abd_fb_blank(struct fb_info *info, int blank) { - struct fb_info *info = decon->win[decon->dt.dft_win]->fbinfo; - struct dsim_device *dsim = v4l2_get_subdevdata(decon->out_sd[0]); - struct fb_event v; - int blank = 0; + int ret = 0; if (!lock_fb_info(info)) { - decon_warn("%s: fblock is failed\n", __func__); - return 0; + dbg_info("%s: fblock is failed\n", __func__); + return ret; } - decon_info("%s\n", __func__); - - dsim->priv.lcdconnected = 0; - - blank = FB_BLANK_POWERDOWN; - v.info = info; - v.data = ␣ + dbg_info("+ %s\n", __func__); info->flags |= FBINFO_MISC_USEREVENT; - fb_blank(info, FB_BLANK_POWERDOWN); + ret = fb_blank(info, blank); info->flags &= ~FBINFO_MISC_USEREVENT; - unlock_fb_info(info); + dbg_info("- %s\n", __func__); + + return 0; +} + +static int decon_abd_con_set_dummy_blank(struct abd_protect *abd, struct fb_info *fbinfo, unsigned int dummy) +{ + int ret = NOTIFY_DONE; + + if (dummy) { + fbinfo->fbops->fb_blank = NULL; + ret = NOTIFY_STOP_MASK; + } else { + _decon_abd_pin_enable(abd, &abd->pin[ABD_PIN_CON], 0); + fbinfo->fbops->fb_blank = abd->fbops.fb_blank; + set_frame_update_bypass(abd, 0); + abd->con_blank = 0; + ret = NOTIFY_DONE; + } + + return ret; +} + +static void decon_abd_con_prepare_dummy_info(struct abd_protect *abd) +{ + struct fb_info *fbinfo = get_fbinfo(abd); + struct fb_ops *fbops = fbinfo->fbops; + + memcpy(&abd->fbops, fbops, sizeof(struct fb_ops)); +} +#endif + +static int decon_abd_con_fb_blank(struct abd_protect *abd) +{ + struct fb_info *fbinfo = get_fbinfo(abd); + + dbg_info("%s\n", __func__); + + set_lcdconnected(abd, 0); + + _decon_abd_fb_blank(fbinfo, FB_BLANK_POWERDOWN); + + decon_abd_con_set_dummy_blank(abd, fbinfo, 1); + + //_decon_abd_pin_enable(abd, &abd->pin[ABD_PIN_CON], 1); + return 0; } static void decon_abd_con_work(struct work_struct *work) { struct abd_protect *abd = container_of(work, struct abd_protect, con_work); - struct decon_device *decon = container_of(abd, struct decon_device, abd); - decon_info("%s\n", __func__); + dbg_info("%s\n", __func__); - decon_abd_con_fb_blank(decon); + decon_abd_con_fb_blank(abd); } irqreturn_t decon_abd_con_handler(int irq, void *dev_id) { - struct decon_device *decon = (struct decon_device *)dev_id; + struct abd_protect *abd = (struct abd_protect *)dev_id; - decon_info("%s\n", __func__); + dbg_info("%s: %d\n", __func__, abd->con_blank); - queue_work(decon->abd.con_workqueue, &decon->abd.con_work); + if (!abd->con_blank) + queue_work(abd->con_workqueue, &abd->con_work); + + abd->con_blank = 1; return IRQ_HANDLED; } @@ -856,7 +1175,6 @@ static int decon_abd_con_fb_notifier_callback(struct notifier_block *this, unsigned long event, void *data) { struct abd_protect *abd = container_of(this, struct abd_protect, con_fb_notifier); - struct decon_device *decon = container_of(abd, struct decon_device, abd); struct fb_event *evdata = data; int fb_blank; @@ -872,28 +1190,26 @@ static int decon_abd_con_fb_notifier_callback(struct notifier_block *this, if (evdata->info->node) return NOTIFY_DONE; - if (decon->state == DECON_STATE_INIT) + if (!abd->init_done) { + abd->init_done = 1; return NOTIFY_DONE; + } if (fb_blank == FB_BLANK_UNBLANK && event == FB_EARLY_EVENT_BLANK) { int gpio_active = of_gpio_get_active("gpio_con"); flush_workqueue(abd->con_workqueue); - decon_info("%s: %s\n", __func__, gpio_active ? "disconnected" : "connected"); - if (gpio_active > 0) { - evdata->info->fbops->fb_blank = NULL; - return NOTIFY_STOP_MASK; - } - - evdata->info->fbops->fb_blank = decon->abd.decon_fbops.fb_blank; - decon->ignore_vsync = 0; - decon_info("%s: ignore_vsync: %d\n", __func__, decon->ignore_vsync); + dbg_info("%s: %s\n", __func__, gpio_active ? "disconnected" : "connected"); + if (gpio_active > 0) + return decon_abd_con_set_dummy_blank(abd, evdata->info, 1); + else + return decon_abd_con_set_dummy_blank(abd, evdata->info, 0); } return NOTIFY_DONE; } -static int decon_abd_con_pin_register_hander(struct decon_device *decon) +static int decon_abd_con_pin_register_hanlder(struct abd_protect *abd) { int ret = 0, gpio = 0; enum of_gpio_flags flags; @@ -903,37 +1219,37 @@ static int decon_abd_con_pin_register_hander(struct decon_device *decon) char *prefix_gpio = "gpio_"; char dts_name[10] = {0, }; char *keyword = "con"; - struct abd_pin pin = {0, }; + struct abd_pin_info pin = {0, }; if (strlen(keyword) + strlen(prefix_gpio) >= sizeof(dts_name)) { - decon_warn("%s: %s is too log(%zu)\n", __func__, keyword, strlen(keyword)); + dbg_info("%s: %s is too log(%zu)\n", __func__, keyword, strlen(keyword)); goto exit; } scnprintf(dts_name, sizeof(dts_name), "%s%s", prefix_gpio, keyword); - pdev = of_find_dsim_platform_device(); + pdev = of_find_abd_dt_parent_platform_device(); np = of_find_decon_board(pdev ? &pdev->dev : NULL); if (!of_find_property(np, dts_name, NULL)) { - decon_info("%s: %s not exist\n", __func__, dts_name); + dbg_info("%s: %s not exist\n", __func__, dts_name); goto exit; } gpio = of_get_named_gpio_flags(np, dts_name, 0, &flags); if (!gpio_is_valid(gpio)) { - decon_info("%s: gpio_is_valid fail, gpio: %s, %d\n", __func__, dts_name, gpio); + dbg_info("%s: gpio_is_valid fail, gpio: %s, %d\n", __func__, dts_name, gpio); goto exit; } - decon_info("%s: found %s(%d) success\n", __func__, dts_name, gpio); + dbg_info("%s: found %s(%d) success\n", __func__, dts_name, gpio); if (gpio_to_irq(gpio) > 0) { pin.gpio = gpio; pin.irq = gpio_to_irq(gpio); } else { - decon_info("%s: gpio_to_irq fail, gpio: %d, irq: %d\n", __func__, gpio, gpio_to_irq(gpio)); + dbg_info("%s: gpio_to_irq fail, gpio: %d, irq: %d\n", __func__, gpio, gpio_to_irq(gpio)); pin.gpio = 0; pin.irq = 0; goto exit; @@ -941,63 +1257,76 @@ static int decon_abd_con_pin_register_hander(struct decon_device *decon) pin.active_level = !(flags & OF_GPIO_ACTIVE_LOW); irqf_type = (flags & OF_GPIO_ACTIVE_LOW) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; - decon_info("%s: %s is active %s, %s\n", __func__, keyword, pin.active_level ? "high" : "low", + dbg_info("%s: %s is active %s, %s\n", __func__, keyword, pin.active_level ? "high" : "low", (irqf_type == IRQF_TRIGGER_RISING) ? "rising" : "falling"); pin.level = gpio_get_value(pin.gpio); if (pin.level != pin.active_level) - decon_abd_pin_register_handler(pin.irq, decon_abd_con_handler, decon); + decon_abd_pin_register_handler(abd, pin.irq, decon_abd_con_handler, abd); exit: return ret; } -int decon_abd_con_register(struct decon_device *decon) +int decon_abd_con_register(struct abd_protect *abd) { struct platform_device *pdev = NULL; - struct device *dev = NULL; struct device_node *np = NULL; - if (!IS_ENABLED(CONFIG_SEC_FACTORY)) - goto exit; - - if (!decon || !decon->dev) - decon_warn("%s: decon does not exist\n", __func__); - else - dev = decon->dev; - - pdev = of_find_dsim_platform_device(); + pdev = of_find_abd_dt_parent_platform_device(); np = of_find_decon_board(pdev ? &pdev->dev : NULL); if (!of_find_property(np, "gpio_con", NULL)) goto exit; - memcpy(&decon->abd.decon_fbops, decon->win[decon->dt.dft_win]->fbinfo->fbops, sizeof(struct fb_ops)); + decon_abd_con_prepare_dummy_info(abd); - INIT_WORK(&decon->abd.con_work, decon_abd_con_work); + INIT_WORK(&abd->con_work, decon_abd_con_work); - decon->abd.con_workqueue = create_singlethread_workqueue("abd_conn_workqueue"); - if (!decon->abd.con_workqueue) { - decon_info("%s: create_singlethread_workqueue fail\n", __func__); + abd->con_workqueue = create_singlethread_workqueue("abd_conn_workqueue"); + if (!abd->con_workqueue) { + dbg_info("%s: create_singlethread_workqueue fail\n", __func__); goto exit; } - decon->abd.con_fb_notifier.priority = INT_MAX; - decon->abd.con_fb_notifier.notifier_call = decon_abd_con_fb_notifier_callback; - decon_register_notifier(&decon->abd.con_fb_notifier); + abd->con_fb_notifier.priority = INT_MAX; + abd->con_fb_notifier.notifier_call = decon_abd_con_fb_notifier_callback; + decon_register_notifier(&abd->con_fb_notifier); - decon_abd_con_pin_register_hander(decon); + decon_abd_con_pin_register_hanlder(abd); exit: return 0; } +static void decon_pm_wake(struct abd_protect *abd, unsigned int wake_lock) +{ + struct device *fbdev = NULL; + + if (!abd->fbdev) + return; + + fbdev = abd->fbdev; + + if (abd->wake_lock_enable == wake_lock) + return; + + if (wake_lock) { + pm_stay_awake(fbdev); + dbg_info("%s: pm_stay_awake", __func__); + } else if (!wake_lock) { + pm_relax(fbdev); + dbg_info("%s: pm_relax", __func__); + } + + abd->wake_lock_enable = wake_lock; +} + static int decon_abd_pin_early_notifier_callback(struct notifier_block *this, unsigned long event, void *data) { struct abd_protect *abd = container_of(this, struct abd_protect, pin_early_notifier); - struct decon_device *decon = container_of(abd, struct decon_device, abd); struct fb_event *evdata = data; int fb_blank; @@ -1015,7 +1344,10 @@ static int decon_abd_pin_early_notifier_callback(struct notifier_block *this, return NOTIFY_DONE; if (IS_EARLY(event) && fb_blank == FB_BLANK_POWERDOWN) - decon_abd_pin_enable(decon, 0); + decon_abd_enable(abd, 0); + + if (IS_EARLY(event) && fb_blank == FB_BLANK_UNBLANK) + decon_pm_wake(abd, 1); return NOTIFY_DONE; } @@ -1024,9 +1356,8 @@ static int decon_abd_pin_after_notifier_callback(struct notifier_block *this, unsigned long event, void *data) { struct abd_protect *abd = container_of(this, struct abd_protect, pin_after_notifier); - struct decon_device *decon = container_of(abd, struct decon_device, abd); struct fb_event *evdata = data; - struct abd_pin *pin = NULL; + struct abd_pin_info *pin = NULL; unsigned int i = 0; int fb_blank; @@ -1044,7 +1375,7 @@ static int decon_abd_pin_after_notifier_callback(struct notifier_block *this, return NOTIFY_DONE; if (IS_AFTER(event) && fb_blank == FB_BLANK_UNBLANK) - decon_abd_pin_enable(decon, 1); + decon_abd_enable(abd, 1); else if (IS_AFTER(event) && fb_blank == FB_BLANK_POWERDOWN) { for (i = 0; i < ABD_PIN_MAX; i++) { pin = &abd->pin[i]; @@ -1053,19 +1384,20 @@ static int decon_abd_pin_after_notifier_callback(struct notifier_block *this, } } + if (IS_AFTER(event) && fb_blank == FB_BLANK_POWERDOWN) + decon_pm_wake(abd, 0); + return NOTIFY_DONE; } -static void decon_abd_pin_register(struct decon_device *decon) +static void decon_abd_pin_register(struct abd_protect *abd) { - struct abd_protect *abd = &decon->abd; + spin_lock_init(&abd->slock); - spin_lock_init(&decon->abd.slock); - - decon_abd_pin_register_function(decon, &abd->pin[ABD_PIN_PCD], "pcd", decon_abd_handler); - decon_abd_pin_register_function(decon, &abd->pin[ABD_PIN_DET], "det", decon_abd_handler); - decon_abd_pin_register_function(decon, &abd->pin[ABD_PIN_ERR], "err", decon_abd_handler); - decon_abd_pin_register_function(decon, &abd->pin[ABD_PIN_CON], "con", decon_abd_handler); + decon_abd_pin_register_function(abd, &abd->pin[ABD_PIN_PCD], "pcd", decon_abd_handler); + decon_abd_pin_register_function(abd, &abd->pin[ABD_PIN_DET], "det", decon_abd_handler); + decon_abd_pin_register_function(abd, &abd->pin[ABD_PIN_ERR], "err", decon_abd_handler); + decon_abd_pin_register_function(abd, &abd->pin[ABD_PIN_CON], "con", decon_abd_handler); abd->pin_early_notifier.notifier_call = decon_abd_pin_early_notifier_callback; abd->pin_early_notifier.priority = decon_nb_priority_max.priority - 1; @@ -1076,18 +1408,22 @@ static void decon_abd_pin_register(struct decon_device *decon) decon_register_notifier(&abd->pin_after_notifier); } -static void decon_abd_register(struct decon_device *decon) +static void decon_abd_register(struct abd_protect *abd) { - struct abd_protect *abd = &decon->abd; + struct decon_device *decon = get_abd_container_of(abd); + struct dentry *abd_debugfs_root = decon->d.debug_root; unsigned int i = 0; - decon_info("%s: ++\n", __func__); + dbg_info("%s: ++\n", __func__); - atomic_set(&decon->abd.event.log_idx, -1); + if (!abd_debugfs_root) + abd_debugfs_root = debugfs_create_dir("panel", NULL); + + abd->debugfs_root = abd_debugfs_root; abd->u_first.name = abd->f_first.name = abd->b_first.name = "first"; abd->u_lcdon.name = abd->f_lcdon.name = "lcdon"; - abd->u_event.name = abd->f_event.name = abd->b_event.name = "event"; + abd->u_event.name = abd->f_event.name = abd->b_event.name = abd->s_event.name = "event"; for (i = 0; i < ABD_LOG_MAX; i++) { abd->u_first.log[i].bts = kzalloc(sizeof(struct decon_bts), GFP_KERNEL); @@ -1095,56 +1431,53 @@ static void decon_abd_register(struct decon_device *decon) abd->u_event.log[i].bts = kzalloc(sizeof(struct decon_bts), GFP_KERNEL); } - debugfs_create_file("debug", 0444, decon->d.debug_root, decon, &decon_abd_fops); + debugfs_create_file("debug", 0444, abd_debugfs_root, abd, &decon_abd_fops); abd->reboot_notifier.notifier_call = decon_abd_reboot_notifier; register_reboot_notifier(&abd->reboot_notifier); - decon_info("%s: -- entity was registered\n", __func__); -} - -static struct decon_device *find_decon_device(void) -{ - struct platform_device *pdev = NULL; - struct decon_device *decon = NULL; - - pdev = of_find_decon_platform_device(); - if (!pdev) { - decon_info("%s: of_find_device_by_node fail\n", __func__); - return NULL; - } - - decon = platform_get_drvdata(pdev); - if (!decon) { - decon_info("%s: platform_get_drvdata fail\n", __func__); - return NULL; - } - - return decon; + dbg_info("%s: -- entity was registered\n", __func__); } static int __init decon_abd_init(void) { - struct decon_device *decon = find_decon_device(); + struct decon_device *container = find_container(); + struct abd_protect *abd = NULL; + struct fb_info *fbinfo = NULL; - if (!decon) { - decon_info("find_decon_device fail\n"); + if (!container) { + dbg_info("find_container fail\n"); return 0; } - if (decon->dt.out_type == DECON_OUT_DSI) { - decon->ignore_vsync = lcdtype ? 0 : 1; - decon_info("%s: lcdtype: %6X\n", __func__, lcdtype); + abd = &container->abd; - decon_abd_register(decon); - if (lcdtype) { - decon_abd_pin_register(decon); - decon_abd_pin_enable(decon, 1); - } + set_frame_update_bypass(abd, lcdtype ? 0 : 1); + dbg_info("%s: lcdtype: %6X\n", __func__, lcdtype); + + decon_abd_register(abd); + abd->init_done = 1; + + if (lcdtype) + decon_abd_pin_register(abd); + + decon_abd_enable(abd, 1); + + if (IS_ENABLED(CONFIG_ARCH_EXYNOS)) + return 0; + + if (IS_ENABLED(CONFIG_MEDIATEK_SOLUTION)) + return 0; + + fbinfo = get_fbinfo(abd); + abd->fbdev = fbinfo->dev; + + if (abd->fbdev) { + device_init_wakeup(abd->fbdev, true); + dbg_info("%s: device_init_wakeup\n", __func__); } return 0; } - late_initcall(decon_abd_init); diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_abd.h b/drivers/video/fbdev/exynos/dpu_7885/decon_abd.h index 8c46ba051..9f4d2c84c 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_abd.h +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_abd.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -9,49 +10,61 @@ #ifndef __DECON_ABD_H__ #define __DECON_ABD_H__ -#define ABD_EVENT_LOG_MAX 50 -#define ABD_LOG_MAX 10 +#include +#include -struct abd_event_log { +#define ABD_LOG_MAX 50 + +struct fb_ops; + +struct str_log { u64 stamp; + u64 ktime; + + /* string */ const char *print; }; -struct abd_event { - struct abd_event_log log[ABD_EVENT_LOG_MAX]; - atomic_t log_idx; +struct abd_str { + const char *name; + unsigned int count; + unsigned int lcdon_flag; + + struct str_log log[ABD_LOG_MAX]; }; -struct abd_log { +struct pin_log { u64 stamp; + u64 ktime; /* pin */ unsigned int level; unsigned int state; unsigned int onoff; - - /* fence */ - unsigned int winid; - struct sync_fence fence; - - /* underrun */ - unsigned int frm_status; - unsigned long mif; - unsigned long iint; - unsigned long disp; - void *bts; - - /* bit error */ - unsigned int size; - unsigned int value; - char *print[32]; /* max: 32 bit */ }; -struct abd_trace { +struct abd_pin { const char *name; unsigned int count; unsigned int lcdon_flag; - struct abd_log log[ABD_LOG_MAX]; + + struct pin_log log[ABD_LOG_MAX]; +}; + +struct abd_pin_info { + const char *name; + unsigned int irq; + struct irq_desc *desc; + int gpio; + int level; + int active_level; + unsigned int enable; + + struct abd_pin p_first; + struct abd_pin p_lcdon; + struct abd_pin p_event; + + struct list_head handler_list; }; struct adb_pin_handler { @@ -60,19 +73,65 @@ struct adb_pin_handler { void *dev_id; }; -struct abd_pin { +struct fto_log { + u64 stamp; + u64 ktime; + + /* fence */ + unsigned int winid; +#if defined(CONFIG_SOC_EXYNOS7885) + struct sync_fence fence; +#elif defined(CONFIG_SOC_EXYNOS9810) + struct sync_file fence; +#else + struct dma_fence fence; +#endif +}; + +struct abd_fto { const char *name; - unsigned int irq; - struct irq_desc *desc; - int gpio; - int level; - int active_level; + unsigned int count; + unsigned int lcdon_flag; - struct abd_trace p_first; - struct abd_trace p_lcdon; - struct abd_trace p_event; + struct fto_log log[ABD_LOG_MAX]; +}; - struct list_head handler_list; +struct udr_log { + u64 stamp; + u64 ktime; + + /* underrun */ + unsigned long mif; + unsigned long iint; + unsigned long disp; + unsigned long aclk; + void *bts; +}; + +struct abd_udr { + const char *name; + unsigned int count; + unsigned int lcdon_flag; + + struct udr_log log[ABD_LOG_MAX]; +}; + +struct bit_log { + u64 stamp; + u64 ktime; + + /* bit error */ + unsigned int size; + unsigned int value; + char *print[32]; /* max: 32 bit */ +}; + +struct abd_bit { + const char *name; + unsigned int count; + unsigned int lcdon_flag; + + struct bit_log log[ABD_LOG_MAX]; }; enum { @@ -84,45 +143,57 @@ enum { }; struct abd_protect { - struct abd_pin pin[ABD_PIN_MAX]; - struct abd_event event; + struct abd_pin_info pin[ABD_PIN_MAX]; - struct abd_trace f_first; - struct abd_trace f_lcdon; - struct abd_trace f_event; + struct abd_fto f_first; + struct abd_fto f_lcdon; + struct abd_fto f_event; - struct abd_trace u_first; - struct abd_trace u_lcdon; - struct abd_trace u_event; + struct abd_udr u_first; + struct abd_udr u_lcdon; + struct abd_udr u_event; - struct abd_trace b_first; - struct abd_trace b_event; + struct abd_bit b_first; + struct abd_bit b_event; + + struct abd_str s_event; struct notifier_block pin_early_notifier; struct notifier_block pin_after_notifier; - unsigned int irq_enable; + unsigned int enable; struct notifier_block reboot_notifier; spinlock_t slock; struct workqueue_struct *con_workqueue; struct work_struct con_work; unsigned int con_irq; + unsigned int con_blank; struct notifier_block con_fb_notifier; - struct fb_ops decon_fbops; + struct fb_ops fbops; + + struct device *fbdev; + unsigned int wake_lock_enable; + + struct dentry *debugfs_root; + unsigned int init_done; }; extern unsigned int lcdtype; -struct decon_device; -extern void decon_abd_save_fto(struct abd_protect *abd, struct sync_fence *fence); +extern void decon_abd_save_fto(struct abd_protect *abd, void *fence); extern void decon_abd_save_udr(struct abd_protect *abd, unsigned long mif, unsigned long iint, unsigned long disp); extern void decon_abd_save_str(struct abd_protect *abd, const char *print); extern void decon_abd_save_bit(struct abd_protect *abd, unsigned int size, unsigned int value, char **print); -extern void decon_abd_pin_enable(struct decon_device *decon, int enable); -extern int decon_abd_pin_register_handler(int irq, irq_handler_t handler, void *dev_id); -extern int decon_abd_con_register(struct decon_device *decon); +extern void decon_abd_enable(struct abd_protect *abd, unsigned int enable); +extern int decon_abd_pin_enable(struct abd_protect *abd, unsigned int gpio, bool on); +extern int decon_abd_pin_register_handler(struct abd_protect *abd, int irq, irq_handler_t handler, void *dev_id); +extern int decon_abd_pin_unregister_handler(struct abd_protect *abd, int irq, irq_handler_t handler, void *dev_id); +extern int decon_abd_con_register(struct abd_protect *abd); +extern struct platform_device *of_find_abd_dt_parent_platform_device(void); +extern struct platform_device *of_find_abd_container_platform_device(void); +struct decon_device; #if defined(CONFIG_LOGGING_BIGDATA_BUG) extern void log_decon_bigdata(struct decon_device *decon); #else diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_board.c b/drivers/video/fbdev/exynos/dpu_7885/decon_board.c index be8ff9446..b3bc5206d 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_board.c +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_board.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -15,6 +16,7 @@ #include #include #include +#include #include "../../../../pinctrl/core.h" #include "decon_board.h" @@ -97,16 +99,16 @@ run_list(dev, "subnode_4"); pre-configured lcd_pin pinctrl at subnode_1 will be /* #define CONFIG_BOARD_DEBUG */ -#define DECON_BOARD_DTS_NAME "decon_board" -#define LCD_INFO_DTS_NAME "lcd_info" +#define BOARD_DTS_NAME "decon_board" +#define PANEL_DTS_NAME "lcd_info" #if defined(CONFIG_BOARD_DEBUG) -#define dbg_dbg(fmt, ...) pr_debug(pr_fmt("%s: %3d: %s: " fmt), DECON_BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) +#define dbg_dbg(fmt, ...) pr_debug(pr_fmt("%s: %3d: %s: " fmt), BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) #else #define dbg_dbg(fmt, ...) #endif -#define dbg_info(fmt, ...) pr_info(pr_fmt("%s: %3d: %s: " fmt), DECON_BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) -#define dbg_warn(fmt, ...) pr_warn(pr_fmt("%s: %3d: %s: " fmt), DECON_BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) +#define dbg_info(fmt, ...) pr_info(pr_fmt("%s: %3d: %s: " fmt), BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) +#define dbg_warn(fmt, ...) pr_warn(pr_fmt("%s: %3d: %s: " fmt), BOARD_DTS_NAME, __LINE__, __func__, ##__VA_ARGS__) #define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) #define STRNEQ(a, b) (strncmp((a), (b), (strlen(a))) == 0) @@ -411,7 +413,7 @@ static int decide_subinfo(struct device_node *np, struct action_info *action) goto exit; } - ret = sscanf(subinfo, "%8d %8d", &action->delay[0], &action->delay[1]); + ret = sscanf(subinfo, "%8u %8u", &action->delay[0], &action->delay[1]); if (ret < 0) { dbg_warn("sscanf for delay fail %d %s\n", ret, subinfo); ret = -EINVAL; @@ -457,7 +459,7 @@ static int decide_subinfo(struct device_node *np, struct action_info *action) break; case ACTION_TIMER_START: timer_name = kzalloc(strlen(subinfo) + 1, GFP_KERNEL); - ret = sscanf(subinfo, "%s %8d\n", timer_name, &delay); + ret = sscanf(subinfo, "%s %8u\n", timer_name, &delay); if (ret != 2) { dbg_warn("timer start parameter invalid %d %s\n", ret, subinfo); ret = -EINVAL; @@ -488,45 +490,81 @@ exit: return ret; } +static bool of_node_is_recommend(const struct device_node *np) +{ + struct property *pp; + + if (!np) + return false; + + pp = of_find_property(np, "recommend", NULL); + + return pp ? true : false; +} + static struct device_node *of_find_lcd_info(struct device *dev) { struct device_node *parent = NULL; struct device_node *np = NULL; parent = (dev && dev->of_node) ? dev->of_node : NULL; - parent = of_find_node_with_property(np, LCD_INFO_DTS_NAME); + parent = of_find_node_with_property(np, PANEL_DTS_NAME); if (parent) - dbg_dbg("%s property is in %s\n", LCD_INFO_DTS_NAME, of_node_full_name(parent)); - else { - /* search again if dev exists but not accurate */ - parent = of_find_node_with_property(NULL, LCD_INFO_DTS_NAME); - if (parent) - dbg_dbg("%s property is in %s\n", LCD_INFO_DTS_NAME, of_node_full_name(parent)); - else - dbg_warn("%s of_find_node_with_property fail\n", LCD_INFO_DTS_NAME); - } + dbg_dbg("%s property is in %s\n", PANEL_DTS_NAME, of_node_full_name(parent)); - np = of_parse_phandle(parent, LCD_INFO_DTS_NAME, 0); + np = of_parse_phandle(parent, PANEL_DTS_NAME, 0); if (np) - dbg_info("%s property in %s has %s\n", LCD_INFO_DTS_NAME, of_node_full_name(parent), of_node_full_name(np)); + dbg_info("%s property in %s has %s\n", PANEL_DTS_NAME, of_node_full_name(parent), of_node_full_name(np)); else - dbg_warn("%s of_parse_phandle fail\n", LCD_INFO_DTS_NAME); + dbg_warn("%s of_parse_phandle skip\n", PANEL_DTS_NAME); return np; } +struct device_node *of_find_recommend_lcd_info(struct device *dev) +{ + struct device_node *parent = NULL; + struct device_node *np = NULL; + int count = 0, i; + + np = of_find_lcd_info(dev); + if (of_node_is_recommend(np)) { + dbg_dbg("%s is recommended\n", of_node_full_name(np)); + return np; + } + + for_each_node_with_property(parent, PANEL_DTS_NAME) { + count = of_count_phandle_with_args(parent, PANEL_DTS_NAME, NULL); + for (i = 0; i < count; i++) { + np = of_parse_phandle(parent, PANEL_DTS_NAME, i); + if (of_node_is_recommend(np)) { + dbg_dbg("%s is recommended\n", of_node_full_name(np)); + return np; + } + } + } + + np = of_find_lcd_info(dev); /* if fail to find recommend, just return 1st lcd_info */ + if (np) + return np; + + return NULL; +} + struct device_node *of_find_decon_board(struct device *dev) { struct device_node *parent = NULL; struct device_node *np = NULL; - parent = of_find_lcd_info(dev); + parent = of_find_recommend_lcd_info(dev); + if (!parent) + parent = of_find_node_with_property(NULL, BOARD_DTS_NAME); - np = of_parse_phandle(parent, DECON_BOARD_DTS_NAME, 0); + np = of_parse_phandle(parent, BOARD_DTS_NAME, 0); if (np) - dbg_info("%s property in %s has %s\n", DECON_BOARD_DTS_NAME, of_node_full_name(parent), of_node_full_name(np)); + dbg_info("%s property in %s has %s\n", BOARD_DTS_NAME, of_node_full_name(parent), of_node_full_name(np)); else - dbg_warn("%s of_parse_phandle fail\n", DECON_BOARD_DTS_NAME); + dbg_warn("%s of_parse_phandle skip\n", BOARD_DTS_NAME); return np; } @@ -543,7 +581,7 @@ static int make_list(struct device *dev, struct list_head *lh, const char *name) np = of_find_node_by_name(np, name); if (!np) { - dbg_info("%s node does not exist in %s so create dummy\n", name, DECON_BOARD_DTS_NAME); + dbg_info("%s node does not exist in %s so create dummy\n", name, BOARD_DTS_NAME); action = kzalloc(sizeof(struct action_info), GFP_KERNEL); list_add_tail(&action->node, lh); return 0; @@ -835,7 +873,7 @@ exit: return ret; } -static struct platform_device *of_find_device_by_path(const char *name) +struct platform_device *of_find_device_by_path(const char *name) { struct device_node *np = NULL; struct platform_device *pdev = NULL; @@ -918,9 +956,8 @@ int of_update_phandle_property_list(struct device_node *from, const char *phandl goto exit; } - while (node_names[count]) { + while (node_names[count]) count++; - } if (count < 1 || count > 10) { dbg_info("node_names count invalid(%d)\n", count); @@ -1066,3 +1103,38 @@ int of_update_phandle_by_index(struct device_node *from, const char *phandle_nam return of_update_phandle_property(from, phandle_name, np->name); } +static int __of_update_recommend(struct device_node *np, unsigned int recommend) +{ + struct property *prop_new = NULL; + int ret = 0; + + if (recommend) { + prop_new = kzalloc(sizeof(struct property), GFP_KERNEL); + if (!prop_new) + return -ENOMEM; + prop_new->name = "recommend"; + prop_new->value = "ok"; + prop_new->length = sizeof("ok"); + + ret = of_update_property(np, prop_new); + } else { + struct property *prop = NULL; + + prop = of_find_property(np, "recommend", NULL); + if (prop) + ret = of_remove_property(np, prop); + } + + return ret; +} + +int of_update_recommend(struct device_node *np) +{ + if (!np) { + dbg_warn("device node invalid\n"); + return -EINVAL; + } + + return __of_update_recommend(np, 1); +} + diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_board.h b/drivers/video/fbdev/exynos/dpu_7885/decon_board.h index 14633b776..92a3532a0 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_board.h +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_board.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -21,9 +22,12 @@ extern int of_get_gpio_with_name(const char *gpioname); extern struct platform_device *of_find_dsim_platform_device(void); extern struct platform_device *of_find_decon_platform_device(void); +extern struct platform_device *of_find_device_by_path(const char *name); extern struct device_node *of_find_decon_board(struct device *dev); +extern struct device_node *of_find_recommend_lcd_info(struct device *dev); extern int of_update_phandle_property(struct device_node *from, const char *phandle_name, const char *node_name); extern int of_update_phandle_property_list(struct device_node *from, const char *phandle_name, const char **node_names); +extern int of_update_recommend(struct device_node *np); #endif diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_notify.c b/drivers/video/fbdev/exynos/dpu_7885/decon_notify.c index c269f9119..9a064d91f 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_notify.c +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_notify.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -9,9 +10,39 @@ #include #include #include +#include #include "decon_notify.h" +#define dbg_none(fmt, ...) pr_debug(pr_fmt("decon: "fmt), ##__VA_ARGS__) +#define dbg_info(fmt, ...) pr_info(pr_fmt("decon: "fmt), ##__VA_ARGS__) +#define NSEC_TO_MSEC(ns) (div_u64(ns, NSEC_PER_MSEC)) + +#define __XX(a) #a, +const char *EVENT_NAME[] = { EVENT_LIST }; +const char *STATE_NAME[] = { STATE_LIST }; +#undef __XX + +enum { + CHAIN_START, + CHAIN_END, + CHAIN_MAX, +}; + +u32 EVENT_NAME_LEN; +u32 STATE_NAME_LEN; +u64 STAMP_TIME[STAMP_MAX][CHAIN_MAX]; + +static u32 EVENT_TO_STAMP[EVENT_MAX] = { + [FB_EVENT_BLANK] = DECON_STAMP_AFTER, + [FB_EARLY_EVENT_BLANK] = DECON_STAMP_EARLY, + [DECON_EVENT_DOZE] = DECON_STAMP_AFTER, + [DECON_EARLY_EVENT_DOZE] = DECON_STAMP_EARLY, + [DECON_EVENT_FRAME] = DECON_STAMP_FRAME, + [DECON_EVENT_FRAME_SEND] = DECON_STAMP_FRAME_SEND, + [DECON_EVENT_FRAME_DONE] = DECON_STAMP_FRAME_DONE, +}; + static BLOCKING_NOTIFIER_HEAD(decon_notifier_list); int decon_register_notifier(struct notifier_block *nb) @@ -28,7 +59,59 @@ EXPORT_SYMBOL(decon_unregister_notifier); int decon_notifier_call_chain(unsigned long val, void *v) { - return blocking_notifier_call_chain(&decon_notifier_list, val, v); + int state = 0, ret = 0; + struct fb_event *evdata = NULL; + u64 blank_delta = 0, extra_delta = 0, total_delta = 0, frame_delta = 0; + u64 current_clock = 0; + u32 current_index = 0, current_first = 0; + + evdata = v; + + if (!evdata || !evdata->info || !evdata->data) + return NOTIFY_DONE; + + if (evdata->info->node) + return NOTIFY_DONE; + + state = *(int *)evdata->data; + + current_index = EVENT_TO_STAMP[val]; + + WARN_ON(!current_index); + + STAMP_TIME[current_index][CHAIN_START] = current_clock = local_clock(); + STAMP_TIME[DECON_STAMP_BLANK][CHAIN_END] = (val == DECON_EVENT_DOZE) ? current_clock : STAMP_TIME[DECON_STAMP_BLANK][CHAIN_END]; + + if (IS_EARLY(val)) { + dbg_info("decon_notifier: blank_mode: %d, %02lx, + %-*s, %-*s\n", + state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val]); + } + + ret = blocking_notifier_call_chain(&decon_notifier_list, val, v); + + current_first = (STAMP_TIME[DECON_STAMP_AFTER][CHAIN_END] > STAMP_TIME[current_index][CHAIN_END]) ? 1 : 0; + + STAMP_TIME[current_index][CHAIN_END] = current_clock = local_clock(); + STAMP_TIME[DECON_STAMP_BLANK][CHAIN_START] = (val == DECON_EARLY_EVENT_DOZE) ? current_clock : STAMP_TIME[DECON_STAMP_BLANK][CHAIN_START]; + + blank_delta += STAMP_TIME[DECON_STAMP_EARLY][CHAIN_END] - STAMP_TIME[DECON_STAMP_EARLY][CHAIN_START]; + blank_delta += STAMP_TIME[DECON_STAMP_BLANK][CHAIN_END] - STAMP_TIME[DECON_STAMP_BLANK][CHAIN_START]; + blank_delta += STAMP_TIME[DECON_STAMP_AFTER][CHAIN_END] - STAMP_TIME[DECON_STAMP_AFTER][CHAIN_START]; + + extra_delta = current_clock - STAMP_TIME[DECON_STAMP_BLANK][CHAIN_END]; + frame_delta = current_clock - STAMP_TIME[current_index - 1][CHAIN_END]; + + total_delta = blank_delta + extra_delta; + + if (IS_AFTER(val)) { + dbg_info("decon_notifier: blank_mode: %d, %02lx, - %-*s, %-*s, %lld\n", + state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val], NSEC_TO_MSEC(blank_delta)); + } else if (current_first && IS_FRAME(val)) { + dbg_info("decon_notifier: blank_mode: %d, %02lx, * %-*s, %-*s, %lld(%lld)\n", + state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val], NSEC_TO_MSEC(frame_delta), NSEC_TO_MSEC(total_delta)); + } + + return ret; } EXPORT_SYMBOL(decon_notifier_call_chain); @@ -41,107 +124,18 @@ int decon_simple_notifier_call_chain(unsigned long val, int blank) v.info = fbinfo; v.data = &fb_blank; - return blocking_notifier_call_chain(&decon_notifier_list, val, &v); + return decon_notifier_call_chain(val, &v); } EXPORT_SYMBOL(decon_simple_notifier_call_chain); -#define __XX(a) #a, -const char *EVENT_NAME[] = { EVENT_LIST }; -const char *STATE_NAME[] = { STATE_LIST }; -#undef __XX - -u32 EVENT_NAME_LEN; -u32 STATE_NAME_LEN; -u64 EVENT_TIME[STATE_MAX][EVENT_MAX]; - -static int decon_notifier_timestamp_early(struct notifier_block *this, - unsigned long val, void *v) -{ - struct fb_event *evdata = NULL; - int state = 0; - - switch (val) { - case FB_EARLY_EVENT_BLANK: - case DECON_EARLY_EVENT_DOZE: - break; - default: - return NOTIFY_DONE; - } - - evdata = v; - - if (!evdata || !evdata->info || evdata->info->node || !evdata->data) - return NOTIFY_DONE; - - state = *(int *)evdata->data; - - EVENT_TIME[state][val] = local_clock(); - - pr_info("decon: decon_notifier: blank_mode: %d, %02lx, + %-*s, %-*s\n", - state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val]); - - return NOTIFY_DONE; -} - struct notifier_block decon_nb_priority_max = { - .notifier_call = decon_notifier_timestamp_early, .priority = INT_MAX, }; -static int decon_notifier_timestamp_after(struct notifier_block *this, - unsigned long val, void *v) -{ - struct fb_event *evdata = NULL; - int state = 0; - u64 early_delta = 0, after_delta = 0, frame_delta = 0; - - switch (val) { - case FB_EVENT_BLANK: - case DECON_EVENT_DOZE: - case DECON_EVENT_FRAME: - case DECON_EVENT_FRAME_SEND: - break; - default: - return NOTIFY_DONE; - } - - evdata = v; - - if (!evdata || !evdata->info || evdata->info->node || !evdata->data) - return NOTIFY_DONE; - - state = *(int *)evdata->data; - - EVENT_TIME[state][val] = local_clock(); - - early_delta = max(EVENT_TIME[state][FB_EARLY_EVENT_BLANK], EVENT_TIME[state][DECON_EARLY_EVENT_DOZE]); - early_delta = div_u64(EVENT_TIME[state][val] - early_delta, NSEC_PER_MSEC); - - after_delta = max(EVENT_TIME[state][FB_EVENT_BLANK], EVENT_TIME[state][DECON_EVENT_DOZE]); - after_delta = div_u64(EVENT_TIME[state][val] - after_delta, NSEC_PER_MSEC); - - frame_delta = max3(EVENT_TIME[state][FB_EVENT_BLANK], EVENT_TIME[state][DECON_EVENT_DOZE], EVENT_TIME[state][DECON_EVENT_FRAME]); - frame_delta = div_u64(EVENT_TIME[state][val] - frame_delta, NSEC_PER_MSEC); - - if (val == DECON_EVENT_FRAME) - pr_info("decon: decon_notifier: blank_mode: %d, %02lx, * %-*s, %-*s, %lld(%lld)\n", - state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val], after_delta, early_delta); - else if (val == DECON_EVENT_FRAME_SEND) - pr_info("decon: decon_notifier: blank_mode: %d, %02lx, * %-*s, %-*s, %lld(%lld)\n", - state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val], frame_delta, early_delta); - else - pr_info("decon: decon_notifier: blank_mode: %d, %02lx, - %-*s, %-*s, %lld\n", - state, val, STATE_NAME_LEN, STATE_NAME[state], EVENT_NAME_LEN, EVENT_NAME[val], early_delta); - - return NOTIFY_DONE; -} - struct notifier_block decon_nb_priority_min = { - .notifier_call = decon_notifier_timestamp_after, .priority = INT_MIN, }; -/* this is for fb_notifier_call_chain from outside */ static int decon_fb_notifier_event(struct notifier_block *this, unsigned long val, void *v) { @@ -158,13 +152,16 @@ static int decon_fb_notifier_event(struct notifier_block *this, evdata = v; - if (!evdata || !evdata->info || evdata->info->node || !evdata->data) + if (!evdata || !evdata->info || !evdata->data) + return NOTIFY_DONE; + + if (evdata->info->node) return NOTIFY_DONE; state = *(int *)evdata->data; if (val >= EVENT_MAX || state >= STATE_MAX) { - pr_info("decon: invalid notifier info: %d, %02lx\n", state, val); + dbg_info("invalid notifier info: %d, %02lx\n", state, val); return NOTIFY_DONE; } @@ -177,27 +174,93 @@ static struct notifier_block decon_fb_notifier = { .notifier_call = decon_fb_notifier_event, }; -static void __exit decon_notifier_exit(void) +static int decon_fb_notifier_blank_early(struct notifier_block *this, + unsigned long val, void *v) { - decon_unregister_notifier(&decon_nb_priority_min); - decon_unregister_notifier(&decon_nb_priority_max); + struct fb_event *evdata = NULL; + int state = 0; - fb_unregister_client(&decon_fb_notifier); + switch (val) { + case FB_EARLY_EVENT_BLANK: + break; + default: + return NOTIFY_DONE; + } + + evdata = v; + + if (!evdata || !evdata->info || !evdata->data) + return NOTIFY_DONE; + + if (evdata->info->node) + return NOTIFY_DONE; + + state = *(int *)evdata->data; + + if (val >= EVENT_MAX || state >= STATE_MAX) { + dbg_info("invalid notifier info: %d, %02lx\n", state, val); + return NOTIFY_DONE; + } + + STAMP_TIME[DECON_STAMP_BLANK][CHAIN_START] = local_clock(); + + return NOTIFY_DONE; } +static int decon_fb_notifier_blank_after(struct notifier_block *this, + unsigned long val, void *v) +{ + struct fb_event *evdata = NULL; + int state = 0; + + switch (val) { + case FB_EVENT_BLANK: + break; + default: + return NOTIFY_DONE; + } + + evdata = v; + + if (!evdata || !evdata->info || !evdata->data) + return NOTIFY_DONE; + + if (evdata->info->node) + return NOTIFY_DONE; + + state = *(int *)evdata->data; + + if (val >= EVENT_MAX || state >= STATE_MAX) { + dbg_info("invalid notifier info: %d, %02lx\n", state, val); + return NOTIFY_DONE; + } + + STAMP_TIME[DECON_STAMP_BLANK][CHAIN_END] = local_clock(); + + return NOTIFY_DONE; +} + +static struct notifier_block decon_fb_notifier_blank_min = { + .notifier_call = decon_fb_notifier_blank_early, + .priority = INT_MIN, +}; + +static struct notifier_block decon_fb_notifier_blank_max = { + .notifier_call = decon_fb_notifier_blank_after, + .priority = INT_MAX, +}; + static int __init decon_notifier_init(void) { EVENT_NAME_LEN = EVENT_NAME[FB_EARLY_EVENT_BLANK] ? min_t(size_t, MAX_INPUT, strlen(EVENT_NAME[FB_EARLY_EVENT_BLANK])) : EVENT_NAME_LEN; STATE_NAME_LEN = STATE_NAME[FB_BLANK_POWERDOWN] ? min_t(size_t, MAX_INPUT, strlen(STATE_NAME[FB_BLANK_POWERDOWN])) : STATE_NAME_LEN; + fb_register_client(&decon_fb_notifier_blank_min); fb_register_client(&decon_fb_notifier); - - decon_register_notifier(&decon_nb_priority_max); - decon_register_notifier(&decon_nb_priority_min); + fb_register_client(&decon_fb_notifier_blank_max); return 0; } -late_initcall(decon_notifier_init); -module_exit(decon_notifier_exit); +core_initcall(decon_notifier_init); diff --git a/drivers/video/fbdev/exynos/dpu_7885/decon_notify.h b/drivers/video/fbdev/exynos/dpu_7885/decon_notify.h index ed806e941..cf1b6aa9e 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/decon_notify.h +++ b/drivers/video/fbdev/exynos/dpu_7885/decon_notify.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) Samsung Electronics Co., Ltd. * @@ -35,6 +36,7 @@ __XX(EVENT_DOZE) \ __XX(EARLY_EVENT_DOZE) \ __XX(EVENT_FRAME) \ __XX(EVENT_FRAME_SEND) \ +__XX(EVENT_FRAME_DONE) \ #define STATE_LIST \ __XX(UNBLANK) \ @@ -43,13 +45,24 @@ __XX(VSYNC_SUSPEND) \ __XX(HSYNC_SUSPEND) \ __XX(POWERDOWN) \ +#define STAMP_LIST \ +__XX(STAMP_NONE) \ +__XX(STAMP_EARLY) \ +__XX(STAMP_BLANK) \ +__XX(STAMP_AFTER) \ +__XX(STAMP_FRAME) \ +__XX(STAMP_FRAME_SEND) \ +__XX(STAMP_FRAME_DONE) \ + #define __XX(a) DECON_##a, enum { EVENT_LIST EVENT_MAX }; enum { STATE_LIST STATE_MAX }; +enum { STAMP_LIST STAMP_MAX }; #undef __XX #define IS_EARLY(event) (event == FB_EARLY_EVENT_BLANK || event == DECON_EARLY_EVENT_DOZE) #define IS_AFTER(event) (event == FB_EVENT_BLANK || event == DECON_EVENT_DOZE) +#define IS_FRAME(event) (event == DECON_EVENT_FRAME || event == DECON_EVENT_FRAME_SEND || event == DECON_EVENT_FRAME_DONE) extern struct notifier_block decon_nb_priority_max; extern struct notifier_block decon_nb_priority_min; diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8061s_j7duo_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8061s_j7duo_lcd_ctrl.c index 25fa72c28..0d4b0e36b 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8061s_j7duo_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8061s_j7duo_lcd_ctrl.c @@ -601,7 +601,7 @@ static int ea8061s_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_a30_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_a30_lcd_ctrl.c index 97f4c212b..a17fdb0a9 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_a30_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_a30_lcd_ctrl.c @@ -389,7 +389,7 @@ static int ea8076_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_m30_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_m30_lcd_ctrl.c index ca2c98c98..584bfc695 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_m30_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/ea8076_m30_lcd_ctrl.c @@ -389,7 +389,7 @@ static int ea8076_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_gta3xllte_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_gta3xllte_lcd_ctrl.c index a52a01e83..3c907e76b 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_gta3xllte_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_gta3xllte_lcd_ctrl.c @@ -246,7 +246,7 @@ stop: priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX8279D_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_wisdom_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_wisdom_lcd_ctrl.c index 87056b831..f990a2ab5 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_wisdom_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx8279d_wisdom_lcd_ctrl.c @@ -246,7 +246,7 @@ stop: priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX8279D_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a10e_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a10e_lcd_ctrl.c index de660568a..dfd73654e 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a10e_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a10e_lcd_ctrl.c @@ -259,7 +259,7 @@ static int hx83102d_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX83102D_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a20e_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a20e_lcd_ctrl.c index 822aacfdb..6686ac2eb 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a20e_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102d_a20e_lcd_ctrl.c @@ -259,7 +259,7 @@ static int hx83102d_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX83102D_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_lcd_ctrl.c index cb4fe06b6..c8ea3c125 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_lcd_ctrl.c @@ -221,7 +221,7 @@ static int hx83102p_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX83102P_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } @@ -239,9 +239,8 @@ static int hx83102p_displayon_late(struct lcd_info *lcd) DSI_WRITE(SEQ_SET_B9_PW, ARRAY_SIZE(SEQ_SET_B9_PW)); DSI_WRITE(SEQ_DISPLAY_ON, ARRAY_SIZE(SEQ_DISPLAY_ON)); - usleep_range(1000, 2000); DSI_WRITE(SEQ_SET_B9_CLOSE_PW, ARRAY_SIZE(SEQ_SET_B9_CLOSE_PW)); - usleep_range(1000, 2000); + msleep(30); /* > 20 ms */ return ret; } @@ -260,7 +259,7 @@ static int hx83102p_exit(struct lcd_info *lcd) usleep_range(1000, 2000); DSI_WRITE(SEQ_SLEEP_IN, ARRAY_SIZE(SEQ_SLEEP_IN)); DSI_WRITE(SEQ_SET_B9_CLOSE_PW, ARRAY_SIZE(SEQ_SET_B9_CLOSE_PW)); - msleep(34); /* > 2 frame */ + msleep(45); /* > 40 ms*/ return ret; } @@ -716,6 +715,7 @@ static DEVICE_ATTR(conn_det, 0644, conn_det_show, conn_det_store); static void panel_conn_register(struct lcd_info *lcd) { struct decon_device *decon = get_decon_drvdata(0); + struct abd_protect *abd = &decon->abd; int gpio = 0, gpio_active = 0; if (!decon) { @@ -753,7 +753,7 @@ static void panel_conn_register(struct lcd_info *lcd) return; } - decon_abd_pin_register_handler(gpio_to_irq(gpio), panel_conn_det_handler, lcd); + decon_abd_pin_register_handler(abd, gpio_to_irq(gpio), panel_conn_det_handler, lcd); } static int match_dev_name(struct device *dev, void *data) diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_param.h b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_param.h index 9c105041c..220411b88 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_param.h +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83102p_gta4s_param.h @@ -98,7 +98,7 @@ static const unsigned char SEQ_SET_D3_GIP0[] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x08, 0x08, 0x27, 0x27, 0x22, 0x2F, 0x11, 0x11, 0x04, 0x04, 0x32, 0x10, 0x0F, 0x00, 0x0F, 0x32, 0x10, - 0x0D, 0x00, 0x02, 0x32, 0x17, 0x9B, 0x00, 0x10, + 0x0D, 0x00, 0x0D, 0x32, 0x17, 0x9B, 0x07, 0x9B, 0x00, 0x00, 0x21, 0x2F, 0x01, 0x00, 0x21, 0x38, 0x01, 0x55, }; @@ -200,14 +200,14 @@ static const unsigned char SEQ_SET_BD_BANK03[] = { static const unsigned char SEQ_SET_E7_TOUCH_BANK0[] = { 0xE7, - 0x12, 0x13, 0x02, 0x02, 0x33, 0x00, 0x0E, 0x0E, - 0x00, 0x1C, 0x28, 0x79, 0x1A, 0x78, 0x01, 0x01, + 0x12, 0x13, 0x02, 0x02, 0x2B, 0x2B, 0x0E, 0x0E, + 0x00, 0x14, 0x28, 0x79, 0x1A, 0x78, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, }; static const unsigned char SEQ_SET_E7_TOUCH_BANK1[] = { 0xE7, - 0x02, 0x4C, 0x01, 0x8B, 0x0D, 0xBA, 0x0E, + 0x02, 0x24, 0x01, 0x8F, 0x0D, 0xB2, 0x0E, }; static const unsigned char SEQ_SET_E7_TOUCH_BANK2[] = { diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83112a_m20_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83112a_m20_lcd_ctrl.c index 0b2ace1ce..d18ac8bd4 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/hx83112a_m20_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/hx83112a_m20_lcd_ctrl.c @@ -244,7 +244,7 @@ static int hx83112a_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * HX83112A_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7aa0_xcover4s_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7aa0_xcover4s_lcd_ctrl.c index 8cb80b262..acf80ff5d 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7aa0_xcover4s_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7aa0_xcover4s_lcd_ctrl.c @@ -265,7 +265,7 @@ static int s6d7aa0_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * S6D7AA0_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_boe_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_boe_lcd_ctrl.c index aca2238b0..8767ca6d9 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_boe_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_boe_lcd_ctrl.c @@ -268,7 +268,7 @@ static int s6d7at0b_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * S6D7AT0B_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_lcd_ctrl.c index 9d3745465..a5d19ce99 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a10_lcd_ctrl.c @@ -268,7 +268,7 @@ static int s6d7at0b_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * S6D7AT0B_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a20e_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a20e_lcd_ctrl.c index 7224e676c..f54385a88 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a20e_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_a20e_lcd_ctrl.c @@ -276,7 +276,7 @@ static int s6d7at0b_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * S6D7AT0B_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_j7tope_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_j7tope_lcd_ctrl.c index 1c9be5ce1..85e34c0ef 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_j7tope_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6d7at0b_j7tope_lcd_ctrl.c @@ -270,7 +270,7 @@ static int s6d7at0b_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * S6D7AT0B_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_a7y18_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_a7y18_lcd_ctrl.c index 049e0ef50..e7def574e 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_a7y18_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_a7y18_lcd_ctrl.c @@ -793,7 +793,7 @@ static int s6e3fa7_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } @@ -2580,6 +2580,11 @@ static ssize_t poc_mca_show(struct device *dev, struct lcd_info *lcd = dev_get_drvdata(dev); int ret = 0; unsigned int i = 0; + struct seq_file m = { + .buf = buf, + .size = PAGE_SIZE - 1, + .count = 0, + }; if (lcd->state != PANEL_STATE_RESUMED) { dev_info(&lcd->ld->dev, "%s: state is %d\n", __func__, lcd->state); @@ -2592,7 +2597,7 @@ static ssize_t poc_mca_show(struct device *dev, for (i = 0 ; i < LDI_LEN_POC_EC ; i++) { dev_info(&lcd->ld->dev, "%s EC[%d]: 0x%02x\n", __func__, i, lcd->poc_ec[i]); - snprintf(buf, PAGE_SIZE, "%s%02X ", buf, lcd->poc_ec[i]); + seq_printf(&m, "%02X ", lcd->poc_ec[i]); } return strlen(buf); diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_jackpot_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_jackpot_lcd_ctrl.c index 60fde1928..3f1b5b8cb 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_jackpot_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e3fa7_jackpot_lcd_ctrl.c @@ -770,7 +770,7 @@ static int s6e3fa7_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8aa5_a6elte_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8aa5_a6elte_lcd_ctrl.c index a0bc73f5d..bee595cd3 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8aa5_a6elte_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8aa5_a6elte_lcd_ctrl.c @@ -615,7 +615,7 @@ static int s6e8aa5_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_lcd_ctrl.c index 0234af723..8ee200136 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_lcd_ctrl.c @@ -367,7 +367,7 @@ static int s6e8fc0_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_param.h b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_param.h index f63605eb8..cade037e4 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_param.h +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a20_param.h @@ -189,7 +189,7 @@ static unsigned char SEQ_ACL_OPR_OFF[] = { 0x61, 0x28, /* 13th~14th para ACL 15% */ 0x4A, 0x41, 0xFC, /* 16th~17th para Start step 50% */ - 0x00 + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OPR_08P[] = { @@ -200,7 +200,7 @@ static unsigned char SEQ_ACL_OPR_08P[] = { 0x60, 0x98, /* 13th~14th para ACL 8% */ 0x4A, 0x42, 0x64, /* 16th~17th para Start step 60% */ - 0x00 + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OPR_15P[] = { @@ -211,7 +211,7 @@ static unsigned char SEQ_ACL_OPR_15P[] = { 0x61, 0x28, /* 13th~14th para ACL 15% */ 0x4A, 0x41, 0xFC, /* 16th~17th para Start step 50% */ - 0x00 + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OFF[] = { diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a30c_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a30c_lcd_ctrl.c index 3fef02e81..806685f27 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a30c_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a30c_lcd_ctrl.c @@ -367,7 +367,7 @@ static int s6e8fc0_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_lcd_ctrl.c index 294e786fe..4b68acc94 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_lcd_ctrl.c @@ -367,7 +367,7 @@ static int s6e8fc0_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_param.h b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_param.h index e95c61202..882ca1cf3 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_param.h +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc0_a40_param.h @@ -238,7 +238,7 @@ static unsigned char SEQ_ACL_OPR_OFF[] = { 0x61, 0x28, /* C1h 13th ~ 14th Para: 0x61,0x28 = ACL 15% */ 0x4A, 0x42, 0x64, /* C1h 16th ~ 17th Para: 0x42, 0x64 = ACL start step 60% */ - 0x00, + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OPR_08P[] = { @@ -249,7 +249,7 @@ static unsigned char SEQ_ACL_OPR_08P[] = { 0x60, 0x98, /* C1h 13th ~ 14th Para: 0x60, 0x98 = ACL 8% */ 0x4A, 0x41, 0xFC, /* C1h 16th ~ 17th Para: 0x41,0xFC = ACL start step 50% */ - 0x00, + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OPR_15P[] = { @@ -260,7 +260,7 @@ static unsigned char SEQ_ACL_OPR_15P[] = { 0x61, 0x28, /* C1h 13th ~ 14th Para: 0x61,0x28 = ACL 15% */ 0x4A, 0x41, 0xFC, /* C1h 16th ~ 17th Para: 0x41,0xFC = ACL start step 50% */ - 0x00, + 0x20 /* 18th para Dimming 32 frame */ }; static unsigned char SEQ_ACL_OFF[] = { diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc1_a30s_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc1_a30s_lcd_ctrl.c index b38723c65..ccd85b5f3 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc1_a30s_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/s6e8fc1_a30s_lcd_ctrl.c @@ -408,7 +408,7 @@ static int s6e8fc1_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * LDI_LEN_ID, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } @@ -1667,6 +1667,7 @@ static DEVICE_ATTR(conn_det, 0644, conn_det_show, conn_det_store); static void panel_conn_register(struct lcd_info *lcd) { struct decon_device *decon = get_decon_drvdata(0); + struct abd_protect *abd = &decon->abd; int gpio = 0, gpio_active = 0; if (!decon) { @@ -1704,7 +1705,7 @@ static void panel_conn_register(struct lcd_info *lcd) return; } - decon_abd_pin_register_handler(gpio_to_irq(gpio), panel_conn_det_handler, lcd); + decon_abd_pin_register_handler(abd, gpio_to_irq(gpio), panel_conn_det_handler, lcd); } static int match_dev_name(struct device *dev, void *data) diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/td4100_j3tope_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/td4100_j3tope_lcd_ctrl.c index d1ef65f21..9c6dc52e1 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/td4100_j3tope_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/td4100_j3tope_lcd_ctrl.c @@ -268,7 +268,7 @@ static int td4100_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * TD4100_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/drivers/video/fbdev/exynos/dpu_7885/panels/td4101_j2corepelte_lcd_ctrl.c b/drivers/video/fbdev/exynos/dpu_7885/panels/td4101_j2corepelte_lcd_ctrl.c index 02ee3e8a1..730f53c45 100644 --- a/drivers/video/fbdev/exynos/dpu_7885/panels/td4101_j2corepelte_lcd_ctrl.c +++ b/drivers/video/fbdev/exynos/dpu_7885/panels/td4101_j2corepelte_lcd_ctrl.c @@ -273,7 +273,7 @@ static int td4101_read_id(struct lcd_info *lcd) priv->lcdconnected = lcd->connected = 0; dev_info(&lcd->ld->dev, "%s: connected lcd is invalid\n", __func__); - if (!lcdtype && decon) + if (lcdtype && decon) decon_abd_save_bit(&decon->abd, BITS_PER_BYTE * TD4101_ID_LEN, cpu_to_be32(lcd->id_info.value), LDI_BIT_DESC_ID); } diff --git a/firmware/Makefile b/firmware/Makefile index da9d38681..9d4473070 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -152,6 +152,7 @@ fw-shipped-$(CONFIG_TOUCHSCREEN_FTS) += tsp_stm/fts6ct108_view2.fw fw-shipped-$(CONFIG_TOUCHSCREEN_FTS1BA90A) += tsp_stm/fts1ba90a_gta3_00.fw tsp_stm/fts1ba90a_gta3.fw fw-shipped-$(CONFIG_TOUCHSCREEN_MELFAS_MMS449) += tsp_melfas/mms449_s5neo.fw fw-shipped-$(CONFIG_TOUCHSCREEN_MELFAS_MMS438) += tsp_melfas/mms438_j7duo.fw +fw-shipped-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100_A30KOR) += tsp_melfas/mss100_a30.fw tsp_melfas/mss100_a30_old.fw fw-shipped-$(CONFIG_TOUCHSCREEN_MELFAS_MSS100) += tsp_melfas/mss100_m30_00.fw tsp_melfas/mss100_m30.fw tsp_melfas/mss100_m30_old.fw \ tsp_melfas/mss100_a30.fw tsp_melfas/mss100_a30_old.fw tsp_melfas/mss100_a30_jpn.fw fw-shipped-$(CONFIG_TOUCHSCREEN_MMS144) += tsp_melfas/DIABLO_CoreV54_V35_master.fw diff --git a/firmware/tsp_himax/hx83112a_m20lte.fw.ihex b/firmware/tsp_himax/hx83112a_m20lte.fw.ihex index b2f569fe1..19d6eea8f 100644 --- a/firmware/tsp_himax/hx83112a_m20lte.fw.ihex +++ b/firmware/tsp_himax/hx83112a_m20lte.fw.ihex @@ -1,36 +1,36 @@ -:1000000048000194480000304800002E4800002CB1 +:1000000048005168480000304800002E4800002C8D :100010004800002A4800004948000069480000895B :10002000480000A9480000DE480001384800013AB5 :100030004800013C4800013E4800012C4800013EB8 -:100040005003004050030040500300408E03004026 -:10005000960300409E030040A4030040AC03004010 -:10006000B2030040D5003A0F943C3AFFEFBC422E59 +:10004000F8A20040F8A20040F8A200402EA3004011 +:1000500036A300403EA3004044A300404CA3004010 +:1000600052A30040D5003A0F943C3AFFEFBC422E19 :1000700080203A2F883C640200026412A4026422A9 :1000800004023A0F883C9E026402000364000008E8 -:10009000805FEFFC43FF8809B65F46F4000058F725 -:1000A00083504A003C00D5003A0F943C3AFFEFBC25 +:10009000805FEFFC43FF8809B65F46F4000A58F71B +:1000A00082F84A003C00D5003A0F943C3AFFEFBC7E :1000B000422E80203A2F883C640200026412A4027F :1000C000642204023A0F883C9E026402000364002A :1000D0000008805FEFFC43FF8809B65F840546F4A3 -:1000E000000058F783504A003C00D5003A0F943C7A +:1000E000000A58F782F84A003C00D5003A0F943CC9 :1000F0003AFFEFBC422E80203A2F883C6402000277 :100100006412A402642204023A0F883C9E02640234 :10011000000364000008805FEFFC43FF8809B65FBE -:10012000840646F4000058F783504A003C00D5008E +:10012000840646F4000A58F782F84A003C00D500DD :100130003A0F943C3AFFEFBC422E80203A2F883C85 :10014000640200026412A402642204023A0F883C92 :100150009E026402000364000008805FEFFC43FF1E -:100160008809B65F840746F4000058F783504A00B8 +:100160008809B65F840746F4000A58F782F84A0007 :100170003C003A1FA43C3AFFEFBC426E80203A6F2D :10018000983C646200026472A4029DFC64820402D2 :100190003A6FA03C9FB2646200036400000880DFF5 -:1001A000EFFC43FF8809B6DF46F4000058F78350A0 +:1001A000EFFC43FF8809B6DF46F4000A58F782F8EF :1001B0004BE03C0105FF80003A6FA004646200033D :1001C000640000086472A403648204033A6F980414 :1001D000426E80213AFFEF843A1FA40464000004B9 :1001E0003A0F943C3AFFEFBC422E80203A2F883CD5 -:1001F000805FEFFC43FF8809B65F8400461400006F -:100200005810838EDD2105FF80003A2F8804422E8E +:1001F000805FEFFC43FF8809B65F84004614000A65 +:100200005810832EDD2105FF80003A2F8804422EEE :1002100080213AFFEF843A0F9404640000043A1FEF :10022000943C3AFFEFBC422E80203A2F883C641267 :1002300000026422A402643204023A1F8C3C9E4AEB @@ -45,2704 +45,2704 @@ :1002C000422E80203A2F883C640200026412A4026D :1002D000642204023A0F883C9E0264020003640018 :1002E0000008805FEFFC43FF8809B65F840F461467 -:1002F000000058108350DD2105FF80003A0F88046C +:1002F000000A581082F8DD2105FF80003A0F8804BB :1003000064020003640000086412A403642204036E :100310003A2F8804422E80213AFFEF843A0F94044A -:10032000640000044000000947D4000A59DE8A0036 -:100330003E0FF334420E00213FC800003FF8160084 -:100340004900001E4900001849001527D5009200F9 -:10035000D50084006405E403460400005800000052 -:1003600064022403640200026600000664020003C3 -:10037000EA74DD9EFC0049FFFFEEFC8046040000AD -:1003800058000000EA516404C003EA74DD9EFC00DA -:100390004900420DFC80FC00490047A0FC80400061 -:1003A0000009DD9EFC004900423EFC80400000093F -:1003B000DD9EFC0049004501FC80000080A0949176 -:1003C000880292001A128001D8FEDD9E80A0806211 -:1003D000968F8A62C206880218128001D8FE8A02AD -:1003E000C306880288033A128424D8FEDD9E80A2C8 -:1003F0008060960F8A60C0088802284280011840F9 -:100400008001D8FC8A02C308880288033A4290041B -:100410003A409024D8FCDD9EFC01F081F001C0053B -:10042000EA3EC003EB4FD5FBFC81FC0184CEF0819A -:10043000F0018EC1DD5597B08405DD4FCEFAFC8109 -:10044000803F3E0806449A085CF0003DE8053C1FEA -:10045000FEBD8401DD9E3E0816008A013C1DFEBDE6 -:10046000E220E8033C0FFEBD8400DD9EFC60EB153E -:100470005A180803F8035A180604480000BD2E97BE -:10048000F9DB4E930009DD51C806DD4BC8043C2D55 -:10049000FEC5CA715A180704480000992EA7FA4CE5 -:1004A0002E17FC6B3C03FD33862041208000860321 -:1004B00044C001B046B1000258B584E8EB81580051 -:1004C0000B14453000D88111802B421830738440C2 -:1004D00050108A244278CC2442584C244EA2000565 -:1004E0000240FAF0D5030240F8680A3080019B9C74 -:1004F000E0D2E811E283E80F4E93000E4EA2000C0A -:1005000098FA38300D01992A384011019261403132 -:10051000903CD523993A38601101E266E90D99AA19 -:1005200038D0110138F0190140F6BC06E80D38400A -:100530001901E264D50F99AA38F0110138D01901D8 -:1005400040F6BC06E90438301101D50738401901DE -:10055000E283E905383019011230FFFF8C415A2837 -:10056000D8BF5B1801043E87F9DD8D818DA15B0842 -:1005700006ADD5345A10072B452001B04671000056 -:1005800058738B14446000D847310002593984E80D -:100590009C8343104824842043001824FEB4403830 -:1005A000040038438D0198D138538D019281403831 -:1005B000842088734042143C8C211241879A5A1837 -:1005C000D8F08C015A00030BD5E4EABC46110003B5 -:1005D000EA8D46210000EA7CDD482E07FA423E07FC -:1005E000FA494621000558210F90EA2FEB84581054 -:1005F0008DE0D508EA2F46110003EA8D4621000060 -:10060000EA7CDD488400DD5ADD4D5A0008165A00A8 -:10061000061484A08005EB62EA71DD5750128F3416 -:100620008823A4488CA2E621880F9601DAF85CF0B2 -:1006300000D9E902D500FCE0FC413FCFFAC88400B4 -:100640003E07F9CC490048C93E07F9D98420F18119 -:100650004E0200B5EB65025080004410A55A467169 -:100660000000587380004C5080AAEB650250800057 -:100670004410A33A4C5080A39E41E627E9045A084F -:100680000914D50684213E17F9CC5A08010EB8008A -:100690005A0008075A000605EB5FEAB9D503EB5C80 -:1006A000EADDF081D50E541000F75A180205EB5F11 -:1006B000EA78D5F85A180304B81CD5F45A0008FE95 -:1006C000B0413E0FF9D949000863F5014611000415 -:1006D0005810885C84C1D107501085F040628403B3 -:1006E0005C630001EAC3EAE88420FE84EB815800E1 -:1006F00000049491DD42B8005A080808EA2FEB651F -:10070000EB38F201DD48D5465A0006FA8400F101C3 -:10071000490007ACC8F4F101B81C4C10400E4691DA -:10072000000458948E4CF0018029844049003DD645 -:10073000149F8001D509EB5FEA784C103FF28401E9 -:1007400049000794C8ED2F37FC092F17FC08500308 -:10075000001294414260987394828400052F8001B6 -:100760004098840895B180A080809C6CE2934103FE -:100770008400E81098C688728420E231E80738A126 -:10078000850138A805098C21D5F98C8188A98802B2 -:10079000D5EDEAC3EB4B4201042488418C024003AF -:1007A000802084209491DD42EA5E540000F75A08CC -:1007B00001044900012C49004878FCC1FC00DD52CD -:1007C0009604C021EA67DD40C0038400EACFEA3E18 -:1007D000C01B2E07FB71C818EA67DD40C011EA5E36 -:1007E000C80FEA6244000258DD4FEA3E5A0801068B -:1007F000EA8FDD4FEA80D5FA8401EA62D505490027 -:100800004726D502EA61FC802E17F9E1FE0C96011D -:10081000DD9EFC60EA350470003F92F896785A102D -:10082000AA065A10CC045A18DD480460003F400361 -:10083000400954A000FF96314090200997B0EA503B -:100840005A70CC195A70DD285A78AA2D84E046C116 -:10085000000758C60F809638E206E82450B380019E -:10086000800A802940258013DD4E38061C0880EB65 -:10087000D5F3844046B1000758B58F809610E20644 -:10088000E8119DD138358800800A96B98029DD4C61 -:100890008047D5F5EB6F00300F808029800A8046B5 -:1008A000DD4CEA378381B83F462BB000400020087A -:1008B00040010115B8BFFCE0FC00DD44EA258420BE -:1008C00084418462DD4C4E0049378442DD4C4E0049 -:1008D00049338443DD4CF818DD4C840ADD4F4E006B -:1008E000492B8444DD4CF81DDD4E3E07F9DF4E00F8 -:1008F00049238441DD4C4E004913FA64DD4C4E001F -:10090000491B8443DD4C8420844444300080EA2524 -:1009100083FFDD4C840ADD4F4E00490E8444DD4CDC -:1009200084208445EA2583FFDD4E3E07F9C4FC8020 -:10093000FC20840EDD40C820FA02DD40C81DFA0606 -:10094000DD40C81A840ADD40C817FA0ADD40C81421 -:10095000FA13DD40C811FA0EDD40C80EFA18DD406A -:10096000C80BFA1CDD40C808DD46DD40C805DD586F -:10097000DD408423C0028424EA530201009C02610A -:10098000000A84EA9B864400065CFF84840E406370 -:100990001CD64063040DDD40C820FA02DD40C81DAE -:1009A000FA06DD40C81A8007DD40C817FA0ADD40A4 -:1009B000C814FA13DD40C811FA0EDD40C80EFA184B -:1009C000DD40C80BFA1CDD40C808DD46DD40C80527 -:1009D000DD58DD40C80292C18006FCA09C419221F6 -:1009E000C113FA8F8E81C410403004778861926100 -:1009F000E261E8039A8BD5029A99E642E9038023E3 -:100A0000D5F28003DD9E8001DD9EFC403FCFFAC819 -:100A1000EB5C0030055CC304EB5C1030055DBD137E -:100A20005A5805068400EB7B1000855D2E27FA13CB -:100A3000EA72444003E844102710FE244201047384 -:100A4000BA0E96D98802844A42028873EB6B9601EB -:100A5000120287A22E67FA36EB6F00000080445026 -:100A60000064FE14420314732E57FA198805960188 -:100A7000EB6B120287A3EB56EB37EB6B120287A5E9 -:100A8000EB5902000230EB6B9201120287A6EB5980 -:100A900002000236EB6B9201120287A7EA3FEB6B72 -:100AA000120287A8B81BEB6B9601120287A93C03C0 -:100AB000FD96EB6B120287AAEAFAEB6B120287AB88 -:100AC000EB40EB6B120287AC4400029AEB6B120214 -:100AD00087B0EB6F123007B2EABB46310007120154 -:100AE00087B33C03FD3946310007120187B42E3726 -:100AF000FA3D3C03FD344201847346310007960100 -:100B0000120187B52E37FA40DD4BFE24420188736F -:100B1000EB759601120107B63C03FDB6EB751201A9 -:100B200007B73C03FDB4EB75120107B8EADAFE44DF -:100B3000EB6F9649121007B92E17FA20EB0342000B -:100B40009073EB869601120087BA3C03FD53EB8647 -:100B5000120087BB2E07F9E8EB86120087BCEB86F4 -:100B60003C03FD78EB1C3C03FD30EB1CEADBEB1C8B -:100B70003C03FD6EEB86120087BFEB56020004A714 -:100B8000EB86120081D82E0FFB9C4E0500222E070B -:100B9000FC5D92074E0200952E17FC09EAE84671AB -:100BA000000058738000FE44EB7558210F448C22DE -:100BB000EB5540138420DD482E67FC09EAE88CC120 -:100BC000FF848CC24063982084E04800006D840E4E -:100BD000DD40C8DEFA02DD40C8DBFA06DD40C8D8D9 -:100BE000840ADD40C8D5FA0ADD40C8D2FA13DD40D8 -:100BF000C8CFFA0EDD40C8CCFA18DD40C8C9FA1CCF -:100C0000DD40C8C6DD46DD404E03FFC3DD58DD4094 -:100C10004E03FFBFB8145A00010448FFFFBA2E6705 -:100C2000FC08B80046410000584200005A08080C71 -:100C30002E37FC09422198249C528A4640120420F7 -:100C40008C42D5092E07FC5D9637FE348C0240128B -:100C50000020988640620820EB55EB7558210F4420 -:100C6000DD484697FFFF8026EB55EB75582103B012 -:100C7000DD4884C050948FFF46A1000058A50004B1 -:100C8000EB14E2C04EF2FF85EAAA407024004273E2 -:100C90000073800640751C20490026438CC1AC3887 -:100CA00097B0D5EFEB14E2E0E80B80075093000219 -:100CB000490026378CE1AC3097F880C9D5F4FCC0E8 -:100CC000FC6084074611000710008B0E46110007D8 -:100CD00010008B224600000C000000005A00A50402 -:100CE0004800019DEB6F045003C0EB1797694C500F -:100CF00000EEEB7E000007ACEB8910008B6CEB7E06 -:100D0000000007AFEB8910008B6FEB7E000007B08F -:100D1000EB8910008B70EB7E000007B1EB891000AF -:100D20008B71EB7E000007B2EB8910008B72EB7EBB -:100D3000000007B3EB8910008B73EB7E020003C940 -:100D4000EB89120085A9EB7E020003CAEB89120031 -:100D500085AAEB7E020003CBEB89120085ABEB7E0C -:100D6000040001D5EB89140082C5EB7E020003C7A5 -:100D7000EB89120085A7EB7E020003C8EB89120005 -:100D800085A8EB7E0000093CEB8910008CFCEB7E13 -:100D90000000093FEB8910008CFFEB7E000009404A -:100DA000EB8910008D00EB7E00000941EB891000FB -:100DB0008D01EB7E00000942EB8910008D02EB7E75 -:100DC00000000943EB8910008D03EB7E02000491C3 -:100DD000EB8912008671EB7E02000492EB8912000F -:100DE0008672EB7E02000493EB8912008673EB7E21 -:100DF00004000239EB8914008329EB7E0200048F82 -:100E0000EB891200866FEB7E02000490EB891200E2 -:100E100086704420C000440000804611000758102E -:100E20008000DD484400018046110007581080868C -:100E30004420C100DD48FA1A4611000758108266A6 -:100E40004420C2E0DD484400003846110007581035 -:100E500083484420CA48DD48FA0846110007581064 -:100E600082064420C280DD48FA0846110007581067 -:100E700082364420C2B0DD48FA08461100075810F7 -:100E8000821E4420C298DD48FA0846110007581017 -:100E9000824E4420C2C8DD48FA144611000758109B -:100EA00083244420CA24DD48FA1446110007581050 -:100EB00083004420CA00DD484600000C040000CF37 -:100EC00046110007140080A5D504EB6F040000A5AF -:100ED0003C0FFEC6FA174611000710008002FA0008 -:100EE00046110007100080034621000758210086A4 -:100EF00044000180EA52DD48EAE7EA75EB4B8801DD -:100F00003E17FD202E27FC0A84A03E07FD29450040 -:100F1000E000EB6F3E27FD23145000B18045449064 -:100F2000FFFF815044B0004846C1000758C6050085 -:100F30004440006C8623452000D844DFFF944530B0 -:100F40000510380814014C04803280CC42612C73A7 -:100F5000846040E5140038170D0195D99E09414081 -:100F60001296408A46965CF08145408A0013E80557 -:100F7000420434739601D511520082884010101635 -:100F80005000006C96014E830007501A0002420088 -:100F9000C873D5055A800204420448738C61380333 -:100FA0001C095A3824DA8C419691505280484C5989 -:100FB000FFCA4600000C040002C3461100071400DB -:100FC00083F74600000C0200058546110007120059 -:100FD00087ED4600000C0200058446110007120050 -:100FE00087EC4600000C040002C146110007140003 -:100FF00083F54600000C040002C0461100071400EF -:1010000083F446110007FA01140083FEEAA24400AB -:1010100072C046110007140080B0FCE0FC21466954 -:101020000008447035CA12730008EA50C8261273CB -:1010300000084610000C00108103EA6EC116F08112 -:1010400049FFFC3C4600000C00100106F0015A1854 -:10105000020DEB6F02000040C8044400EC00D50311 -:101060004400E80049003753442035CA46190008B7 -:10107000122080089600D503440000F0FCA1FC007B -:10108000EB1B441035CA12100008EAC402010072BA -:1010900042300C0BCB33021100724200900BC8306F -:1010A00002110072EADCC92D2E17FB9B4200880B4F -:1010B000C803EB36D506490037FA440000F1D521C4 -:1010C000B4029616C0FEEB1B442035CA122000085D -:1010D00042208C0B8020CA04EAC4EB36D5064900B6 -:1010E00037EF440000F2D50DB402920C960F5A0867 -:1010F00003FD440035CA120080088400D502800335 -:10110000FC800000FC005CF000354EF201703EFFF8 -:10111000671C3807810140F03C00DD0F6A00700059 -:101120007A0084008E009800A200B400BE00C800BF -:10113000D200E400EE00F80002010E0118012201C5 -:101140002E013A0144014E015801660170017A01F5 -:1011500084019C01A601B001BA01D001CE02DA01DE -:10116000E401EE010402CE020E021A0224023E0243 -:10117000480252025C026A0274027E0288029E02E7 -:10118000A802B202C002EB6FEA26F85EEB6FEA2615 -:10119000500076F7F859EB6FDD43440F6667F8CAE5 -:1011A000EB6FEA2650007EFFF84FEB6FEA26500007 -:1011B0007E6FF84AEB6FDD43440F6E6FF8BB84041B -:1011C000DD4080C0C00485E1480001128405F87349 -:1011D000EB6FEA2650005DDEF837EB6FEA26500031 -:1011E0005BDCF832EB6FDD43440FBBBCF8A3840734 -:1011F000DD40C8EA8408DD4080C08409CEE5F85BA4 -:10120000EB6FDD43440F5556F895EB6FDD43440F0C -:101210005354F890EB6FDD43440F3334F88B840C58 -:10122000DD4080C0840DCED0F846EB6FEA2650003A -:101230006EEFF80AEB6FEA2650006CEDF805EB6FE5 -:10124000EA2650004CCD480000C9FA00DD4080C0BD -:10125000C8BBFA01F830EB6FDD43440F8889F86AA8 -:10126000EB6FDD43440F8788F865EB6FDD43440F78 -:101270007778F860FA04DD4080C04E03FFA6FA05D7 -:10128000F81AEB6FDD43440FAAABF854EB6FDD4364 -:10129000440FA9AAF84FEB6FDD43440F999AF84A1F -:1012A000FA07DD404E03FF91FA08DD4080C04E038F -:1012B000FF8CFA0948000050EB6FDD43440FAEAFDE -:1012C000F839EB6FDD43440FAE9FF834EB6FDD432D -:1012D000440F9E9FF82FFA0BDD404E03FF76FA0C69 -:1012E000DD4080C04E03FF71FA0DD535EB6FDD4355 -:1012F000440FAFB0F81FEB6FDD43440FAFA0F81AF7 -:10130000EB6FDD43440F9FA0F815FA0FDD404E034D -:10131000FF5CFA11DD4080C04E03FF57FA12D51B67 -:10132000EB6FDD43440FADAEF805EB6FDD43440FCB -:10133000AD9E48000052EB6FDD43440F9D9ED54C9F -:10134000FA14DD404E03FF41FA16DD4080C04E0323 -:10135000FF3CFA17DD40E2C0D54AEB6FDD43440F96 -:10136000ACADD53AEB6FDD43440FAC9DD535EB6F9B -:10137000DD43440F9C9DD530FA1ADD4080C04E03FA -:10138000FF24FA1BD5E8EB6FDD43440F4445D52419 -:10139000EB6FDD43440F4041D51FEB6FDD43440F3E -:1013A0000001D51AFA1DDD404E03FF0FFA1EDD4085 -:1013B00080C04E03FF0AFA1FD5CEEB6FDD43440F0A -:1013C0004F50D50AEB6FDD43440F4F10D505EB6F3F -:1013D000DD43440F0F108801E601D509EACBDD405B -:1013E00080C04E03FEF2EA67D5B685E0800FFC8030 -:1013F0009200FC008400DD404E030052840BDD406F -:10140000C0054400ACAC4800004D840FDD40C00472 -:1014100044001313D546FA03DD40C0044400787835 -:10142000D5408407DD40C00444002222D53AFA07A3 -:10143000DD40C00444005555D534FA0BDD40C004EE -:1014400044005151D52EFA0FDD40C00444005050E5 -:10145000D528FA14DD40C00444005252D522FA19AE -:10146000DD40C00444005363D51CFA1DDD4080C03C -:10147000C0044400BBBBD51544000031DD40C009A9 -:101480004400B0F046110007EA2D3E67FA05D50C7E -:101490008403DD40C00444000191D50344000909E0 -:1014A00046110007EA2DFC80FC003FCFFAF0EB81EB -:1014B000580006048420DD57DD428400EA9384202E -:1014C000B9804631000746272C80142180B23E1790 -:1014D000FA073E07FA34B80A441072C8405040096F -:1014E000D9079601B88A84013E07FA07D509441046 -:1014F0007F0CD9069601B88A84013E07FA34B80AEF -:101500004410FFFE8E01E220E8038401B88A840EB5 -:10151000DD40C006DD5296373E07FB9BD522FA021E -:10152000DD40C8F9FA06DD40C8F6840ADD40C8F39C -:10153000FA0ADD40C8F0FA13DD40C8EDFA0EDD40CE -:10154000C8EAFA18DD40C8E7FA1CDD40C8E4DD4609 -:10155000DD40C8E1DD58DD40C8DEB80A5A0801DCCC -:10156000DD46DD40C00BEB59EA228420DD57EAB5A9 -:10157000EB5FEA78843FDD57EAB5DD58DD40C00611 -:1015800084003E07FBC43E07FBC5FC80EA3F8C019C -:101590009600EB0BEA3F2E17FC06E201560780018E -:1015A000EABEEA3F46110007120087A5DD9EFC0057 -:1015B000840EDD40C007840CDD40C00B4400CCCC61 -:1015C000D513FA02DD40C8F8FA06DD40C8F5D51299 -:1015D000FA00DD40C00444003333D506FA04DD4090 -:1015E000C0434400888846110007EA2D8401DD5A73 -:1015F000D53B840ADD40C00444004444D532FA0A95 -:10160000DD40C00444006666D52CFA0EDD40C004FF -:1016100044006161D526FA13DD40C00444006060D7 -:10162000D520FA18DD40C00444006262D51AFA1CC5 -:10163000DD40C00444006363D514DD46DD40C003D3 -:10164000EA32D50FDD58DD40C0044400F0F0D50982 -:101650008406DD40C00444009191D503440099996B -:1016600046110007EA2DFC80C0045A000118D52657 -:10167000FC00FA1380C1DD40C007EB59EA224C6040 -:1016800040048401D51DFA18DD40C01AEB625831C0 -:1016900089FC40030C03EB43D5134621000358217A -:1016A000041C4C11000F500175E04C10000B502130 -:1016B00070D040008803EB43DD9E8400DD9EFC80FB -:1016C0008401DD9EEA5200008070001080718C0160 -:1016D0004200807396012E37FA079E86EB655810FC -:1016E0008000EAC9463100079E8502318164EAC95B -:1016F00046210007042103F29EC4969138208D09EB -:101700009E833C33FD78EAC99E823C33FD8CEAC956 -:1017100046210007042103C19EC1969192483820BA -:101720008D0946210007042103C1969038208109C4 -:10173000DD9E441022B850007C18FE0C441186A097 -:1017400040000416500000569601DD9EFC00FA028F -:10175000DD40C0052E17FCD1EA21D50EFA06DD408A -:10176000C00F4900403AEB335A080C052E07FCD352 -:10177000D5032E07FCD2FE0C49FFFFDDD50349FF40 -:10178000F8D946110007140083F2FC80FC00A60083 -:1017900080C15A080A0E840EDD40C807FA02DD40F7 -:1017A000C804FA06DD40C034EB5FEA78D5305A0849 -:1017B0000B0BFA06DD40C005EB59EA22B606EAD566 -:1017C000DD46D5F15A080C1FFA06DD40C005EB597D -:1017D000EA6BB606EAD5FA0ADD40C005EB59EA2203 -:1017E000B606D50AFA13DD40C8FAFA0EDD40C8F78E -:1017F000FA18DD40C8F4DD46DD40C00AEB59EA22A4 -:10180000D5065A080F06EB8158000604B606FC8080 -:10181000FC0084A09729E281E810A5183861150121 -:101820005A080106E28640433C1BD5034242180198 -:101830001A4180018CA1D5EFFC80FC202F17FA34CF -:101840008460FB94EA6FE262E8224271C024844023 -:101850002E47FD20E244E818995740609420224327 -:101860000000385015114F12000A4332000342F2B3 -:101870008003E1EF4042BC1BD503424290008C4103 -:10188000AD309690D5E68C6196D8D5DDFCA0FC00F5 -:101890003FCFFAC8B814B90AE220E810B8005A00DD -:1018A00008045A080605EB5CEADDD505EAFFC80620 -:1018B000EB5FEAB9EB65EAA1EAE5B80AB914E2011F -:1018C000E8048C01B88AD502EA6DFC80FC003C0D6E -:1018D000FEC63C2DFEBCE240E819EB6F040000B2EE -:1018E0009681E241E81396499210EB4E46110007AB -:1018F000140080B2EAFF5A08010AEABCEB65EAA1CB -:101900004621000358210E3CDD48FC80463800305B -:10191000A698EB2E9690CAFDFA6C102081B4AECC3E -:10192000100080C484051020801810208118100039 -:10193000800C8401EB09DD9EFC633FCFFAC081205F -:10194000B1813E0FF9603B004C0480E180263B00F2 -:10195000CC24A400AC082E87FCCD814240040010AA -:1019600085814E04000444C0FFFFDD5C0200809CC2 -:101970000230800A40B00C01840EDD4040B5A4085E -:101980008460C8095444007F44500064FF2C4246E0 -:10199000102496E3886BBB803C0DFEB0FE02B88637 -:1019A000840449FFFFB5B90646210000EA7C80099E -:1019B00049003EED84064264807340250013840094 -:1019C0004641000058420B14443001B03813000067 -:1019D000812742908C7338520901385489099970D3 -:1019E000A76981275011006C42928C73390205015E -:1019F000502100248C023904850996915A0806E882 -:101A0000FCE346100080DD454E0040684610018032 -:101A10008C3414100161441400001410016246104B -:101A200000C08C2814100163461001408C30141043 -:101A30000164FA2814100165842014100166141042 -:101A4000016714100168DD9EFC60EEE03E2FF97422 -:101A500080E0509F80303E0FF998B1833B016000D9 -:101A600084203B036020442000F03B0048008009B4 -:101A70003B0FC820DD42FA4240238837846080094A -:101A80009648A8C1A8C2A8C3815FF38C9449840476 -:101A9000860546BF0000E622E8093853040084406A -:101AA0004058140C808280E2D51BE62AE80838737F -:101AB0000400844040781C0C8082D509E63AE8098D -:101AC0003843040084404048100C80E280A2D508CE -:101AD0003823040084804028080C80E480A48060BF -:101AE000862088AB392546025131800289C53924C8 -:101AF0008E0A51218001552900FF3874CA0A5121EC -:101B00008003552900FF553980FF8C648DA138442E -:101B1000CE0A96D83824CA0A5B1803E68C0C8C21AE -:101B2000960096495A081CB98400463200004014B9 -:101B300080005A00740A9883B481B682B4A2B4813A -:101B4000DCFC8C04D5F5ED20FCE0FC002E17F9E957 -:101B50002E07FBD3FE0C3C0FFECB84003C0FFEC5D2 -:101B6000490026D6FC80FC402E47FBA18420FF04C0 -:101B70002F27FD212F37FD208041840180A14510B2 -:101B800000484701000059080604449000644C597D -:101B9000001980F04272C47384609798E2D3E80E13 -:101BA00038638D1142F32424E08FE8048C21964899 -:101BB0008400422308008C61D5F18CA19768D5E898 -:101BC00096914631000712218799964946210007D0 -:101BD0001211079AFCC046110007042080B2EB33B3 -:101BE00096D1FECC2E47FBAE2E17FBA7FE64FE0C53 -:101BF000E203E80484218400D503842084019691C3 -:101C00004631000712218799964946210007121193 -:101C1000079ADD9EFC4244008787461100071400A6 -:101C200083C63C2DFECE8400120F8007120F800366 -:101C3000120F8002120F8001841F120F8006120FF4 -:101C40008005120F8004EB6F00700F1CEB6F0060BB -:101C50000F1DEB6F00000F2097F897B0549000FF16 -:101C600084A0441005109815A4009601120F800757 -:101C7000EA2E023F8001E260EA2EE8059601120F8B -:101C80008001D51F023F8002E260E80AEA29EAD615 -:101C90004C300007EA2E9601120F8002D512EA2E70 -:101CA000023F8003E260E80DEA29EAD64C30000AE0 -:101CB000EA29EAD74C300006EA2E9601120F80037B -:101CC000EA29EA97E260E806EA2E9601120F8004FC -:101CD000D51FEA29EAF1E260E80AEA29EA974C30DE -:101CE0000007EA2E9601120F8005D512EA29020F8D -:101CF0008006E260E80DEA29EA974C30000AEA29FA -:101D0000EAF14C300006EA2E9601120F80068CA2F2 -:101D1000D9AB8420FA44EB6F58000F24DD4249FF11 -:101D2000F609FFC4EB33407384F7022F800197F963 -:101D3000E2E2E909FF84022F8004406304D797B1EF -:101D4000E246E807EB6FEAF046110007EA51EAECD9 -:101D5000EAFFC005800949FFFF40D504800949FF1B -:101D6000FF04C807EB6FEAF046110007EB18EAEC36 -:101D7000EB6FEAF0C806440FAAAA46110007EAEC86 -:101D8000EAD646110007960112008793EAD746115A -:101D90000007960112008794020F80034611000786 -:101DA000960112008795EA974611000796011200E6 -:101DB0008796EAF146110007960112008797020FF5 -:101DC000800646110007960112008798840046118C -:101DD00000071200879B4400A66A46110007140002 -:101DE00083C6FCC24608002046100BD250200038A3 -:101DF00050108404B622B4224210D408B622EAAEAF -:101E00004E0039764E00397A844F4619006810200A -:101E100089040210001E844258108001EA48021012 -:101E2000001EEABDEA488420EAD3EB31EA37EB4DE5 -:101E3000FA241210009ADD9EFC2046680020100350 -:101E4000004C0503000E467FFE3F840750738FFF52 -:101E5000FE4640781C02838640738644BF8EB90ECE -:101E6000FE866610803840208864BA8E1233009C4B -:101E70001243008A1253000AFCA0FC00F896844624 -:101E8000F898EA520040812C840AFF04001081393E -:101E90008064EA214230807380A496D9FA018427B5 -:101EA000F8ACFC80FC00DD5C0220801E4400FF7F5B -:101EB000FE161200801EEA520040812D840AFF04A3 -:101EC0000030813A80A4EA210020812F42518073A2 -:101ED0000000812E96E94011100980A4969FF88D8C -:101EE000FC80FC018420F081460900681010090480 -:101EF000840EDD40C034840EDD40C038DD45EAAEDE -:101F00004410FFDF4E0038FC0220001E4E0038F067 -:101F10004410FDFF4E0038F40220001E4E0038EE43 -:101F200051C00038B97F2E27FCB766108F00969FEE -:101F300040108904B9FF441000321210009A842125 -:101F4000EAD3B45C461FFE3FEA69FE56B63CB43C99 -:101F50006610803858108008B63CD517FA02DD406C -:101F6000C8CBFA06DD40C8C8D515FA02DD40C00668 -:101F7000F808F00149FFFF83D508FA06DD40C005E7 -:101F800049FFFF32F001F8BAF00149FFFD3CEA24B5 -:101F9000F8F9DD46DD40DD5CC00284011000806898 -:101FA0001000806CFC81FC00DD5C0200801E83FF61 -:101FB000580000801200801E83FFEB6F000000803D -:101FC000E6032E47FCCA2E17FCD3E9072E27FCC9CF -:101FD000F8062E07FCC8D50C2E27FCCC8405FF0480 -:101FE000EA2180644230807383FF2E07FCCB4011CE -:101FF000100996D9969F80A449FFFF20FC80FC2001 -:1020000084A08225452005104100940099D599852A -:10201000848038381101393391018A7396DB42315B -:10202000C400383311098C815A48D8F5505281B018 -:102030004C597FECFCA0FC0080C05A08010CDD4527 -:102040008422EA688423EA58EA24C804EA3BE601C9 -:10205000EA42FA06DD409E714E02005D9608E606F1 -:10206000E816840340108016EACC9600E6524EF241 -:10207000008D94919690EB68EAA38463E266884FA2 -:102080009690F86E5A600603F81BD52A50037FF825 -:102090009640E6264EF2008A842340100416EACCCD -:1020A0009600E6524EF2007A94919690EB68EAA37D -:1020B000846AE266884F9690F8535A600D0448008F -:1020C0000075EA245A08230DEB5FEA78501075E09A -:1020D000502070D049FFFF95DD5F9600DD5AEA245D -:1020E0008C019600EA935A081205DD4D49FFFF5D09 -:1020F000EA245EF00024E906DD4D49FFFED58400A8 -:10210000EA93EA248420E612E902FA228A01960080 -:10211000D5399608E606E811844340108816E24651 -:10212000EACC96004027882046110003EA8D96905D -:10213000F8175A68063BD51E50037FF89640E626EE -:10214000E834842340100416844A2E17FA1AE24613 -:1021500040278420960046110003EA8D969049FF9F -:10216000FBED5A680D23EA245A081105DD5F96003D -:10217000DD5AEA248C019600E612E9028400EA9313 -:10218000EA2449FFFC63D5118E5294919690EB6836 -:10219000581084EC48FFFF738E5294919690EB6830 -:1021A000581084EC48FFFF86FC80FC008407DD406B -:1021B000C021DD4D5A00070566100002C90449FF21 -:1021C000FCC6D51F2E17FCD7EA6EC10E5A00060DAD -:1021D000DD4584261410016D84201410016E441F07 -:1021E000FC784E003C8D4400242446110007EA2D63 -:1021F000D5088408DD40C00449FFFB4BD502F96ACD -:10220000FC805A0001045A0804062E17F9DDE62165 -:10221000EA429E419688E646E814FC00844380C06A -:1022200040108816EB65EA439600EA555A600304AD -:102230005A680607DD5F9600DD5A49FFF2ECFC8024 -:10224000DD9EEA319604C009FC0049002F42C8FE19 -:1022500049002F24C8FEFC80DD9EFC00FA13DD40FF -:10226000C00FEB5C580008C03C0FFECE84218408F0 -:10227000F8108401EAF4EA8E8400EB4AD50BFA18D0 -:10228000DD40C8F0EB59EAE63C0FFECE840784211E -:10229000EA73FC80EA319604C009FC0049002F076C -:1022A000C8FE49002F0DC8FEFC80DD9EFC00EA52EE -:1022B000A60B58000010AE0B4E00240C4611000770 -:1022C000140083C4F8BEFC80FC0080C0FA08DD4026 -:1022D000C00DEA31EA4DC00A40031009DD5C12006E -:1022E00082B850000064120080B6FA11DD40C00CC4 -:1022F000EA31EA4DC00992C1DD45126002B850636F -:102300000064126000B6FC80FC00EB68EAA3EABC43 -:1023100050208A20DD48FC80FC003FCFFAC8FA0735 -:10232000DD40C005EA7A44005656D521FA08DD4062 -:10233000C018B8005A080730B814B90AE220E808F3 -:1023400049FFFFE4EB5FEAB9EB65EAA1EAE5B80A09 -:10235000B914E201E8048C01B88AD51DEB08D51147 -:10236000FA0BDD40C008EA7A4400516146110007CB -:10237000EA2DD511FA0CDD40C006B8005A08070C4A -:10238000EA6DD509FA0DDD40C0FCB8005A08070413 -:1023900049FFFFBCFC80FC00EB68EAA3EA2F502059 -:1023A0008A20DD48FC80FC003FCFFAC8FA0FDD40F0 -:1023B000C005EA7A44005060D524FA11DD40C01B04 -:1023C000B8005A080833B814B90AE220E80A49FFED -:1023D000FFE4490023B1EB5CEADDEB65EAA1EAE545 -:1023E000B80AB914E201E8038C01B88ABD0AD91D04 -:1023F000EB08D511FA14DD40C008EA7A44005262B5 -:1024000046110007EA2DD511FA16DD40C006B800C6 -:102410005A08080CEA6DD509FA17DD40C0FCB8006F -:102420005A08080449FFFFB9FC80FC00EA52A60BD9 -:1024300066000010AE0B840046110007140083C430 -:1024400049FFFF01F847FC80FC003FCFFAC8FA1DA6 -:10245000DD40C00BEA319604C002EA7A4400BFBFF7 -:1024600046110007EA2DD531FA1EDD40C02DEA31B4 -:102470009604C004B8005A080729B814B90AE22023 -:10248000E81884014410028846210000EA7CEB62CF -:10249000583189FC49FFF9BE840044100288462166 -:1024A0000000EA7C463100035831841C49FFF9B230 -:1024B000B80AB914E201E8048C01B88AD506EA31F9 -:1024C0009604C002EB08EA6DFC80FC00840EDD403F -:1024D000C003EA6DF80CFA02DD40C8FCFA06DD40E4 -:1024E000C8F9840ADD40C00549FFFE614800003A92 -:1024F000FA0ADD40C00449FFFF11D533FA0EDD4072 -:10250000C8FBFA13DD40C00449FFFF4FD52AFA1873 -:10251000DD40C8FBFA1CDD40C00449FFFF88D5211F -:10252000DD46DD40C00449FFFF91D51B8406DD4038 -:10253000C00BEA77660000083E07FB9A8400EAF4C5 -:1025400084003C0FFECB49FFF9A4EB6F045003C697 -:1025500044006AA6D8068402DD40C00349FFFB5C44 -:10256000FC80FC018400EB058402EB05DD58DD40B6 -:102570004E0201002E07FA05E60C4EF200FB9644CF -:102580004E1300F8E602E904EA91E622E826001F6D -:102590008003EA6FEB62EA7188229021F87AEA926E -:1025A000001F8003EA3DFA9688229021F872F874A1 -:1025B000F87B8C21E022E911EA3A9648101F800549 -:1025C000002F8005EA3A8C21E022E905F87DEA39FE -:1025D0008C21D5F4F885D5ED661000088E22E62210 -:1025E000E819001F8003EA6FEB62EA71F850EA9283 -:1025F000001F8003EA3DF84AF84FF856F861E90AEF -:10260000EA3AF858E905F860EA398C21D5FBF86810 -:10261000D5F59E44E622E904EA91E622E823001F6C -:102620008003EA6FEB62EA71F832EA92001F8003DE -:10263000EA3DFA9688228443FE54445007D0F82895 -:10264000101F8007EA899648EAD1F82EF839E90A7E -:10265000EA3AF830E905F838EA398C21D5FBF84038 -:10266000D5F59E46E622E904EA91E622E83F001FFE -:102670008003EA6FEB62EA7188228443FE54F80813 -:10268000101F8006001F8003EA3DFA9688229022E0 -:102690008E22964883FF101F8007EA89445007D096 -:1026A0009648EAD183FFEB35EA8983FFF809E91EF2 -:1026B000EA3A9648101F8005002F8005EA3A8C22DE -:1026C000E02283FFE90DEB35EA3942111073401126 -:1026D0008420125094B283FFEA398C21D5EBEB0DA4 -:1026E0008C219648EAD183FFD5DF8E08E604E841C5 -:1026F000000F8003EAEE88018423FE0CEA3D90027D -:102700008E029600100F8006000F8003FA76880272 -:10271000FE44EB78582104E84E00FFBB101F8007F1 -:10272000000F8006444007D09600EB04EB0D000F2D -:1027300080068C02E001E91DEAAB9600100F8005CF -:10274000EA39EAAB8C02E001E90EEB0D000F8005DF -:1027500042008C7340010020124014B2000F80052B -:102760008C01D5EC000F80048C019600EB04D5DFC2 -:10277000FC81FC00DD529604C014EA3EC0072E071F -:10278000FB712E17FBE9E201E9048400EACFD50BC7 -:102790008C01EACF2E07FB708C013E07FB70D5033E -:1027A0008402EA61FC80FC40DD5D84249D828E0110 -:1027B0004000041646900FFF88C097B084E0509404 -:1027C0008FFFC6125A6801095273FE0397F940043D -:1027D0009F04DD55D506841F507383FCDD5597F9A2 -:1027E0008EC197B0D5EF3E67F9DEFCC0FC6280C0B9 -:1027F0003CCDFED12E07F9ECF0813CADFEC0EA8263 -:102800009600F0823C0DFEC8C003EA9DC0042E97DE -:10281000FA39D5028120EB6FEA40DD54DD53D8034D -:102820002E97FA2085A08106816DEB4CDD5DE3607B -:10283000E859EB6FEB519600C01B2E07FCB1C01896 -:10284000B4E84C708016E6E9E9075CF3891BE905FA -:102850004470091BD50284E804E400015CF7000918 -:10286000E90B5CF7042FE90944E0042FD506B4E82E -:1028700004E40001D50285C82E57FC0C4047001324 -:102880004252880B4037001396B99639C50E404224 -:10289000200897614021200840528D1596D14001B3 -:1028A000811540028200D50D4021200840422008B9 -:1028B000969197214001011540420D1540001200EC -:1028C000F183DD55977840729D1C88ED4073B91CEB -:1028D000540700FF88E040D380138D618D0CF10315 -:1028E000D5A60003002000230014001300084000B8 -:1028F00040084000090088010013002CEA9EDD55C5 -:10290000840ADD4FDD5DE605E91200030050002377 -:1029100000440013003840004008400009008801CE -:102920000013005CEA9EDD55840ADD4FDD5DE6099B -:10293000E90A001300740003006840000500DD553B -:10294000840ADD4FDD5D8420844CE220E80B806644 -:10295000423088738C210071800888ED40D3801349 -:10296000D5F5EA57EA4DC017EA4ADD4BF202940565 -:1029700040B00864F00140B58424E20C8F434085E8 -:10298000BC04E74140F43C444097A48412930048BF -:102990003E17FA2F02230048001300929610581099 -:1029A00080F04071200940008100969040001E0098 -:1029B00088E288E188ED40001F01DD55FCE2FC0063 -:1029C000EA67DD40C835EA665A0801044900252D4A -:1029D0004900252680C0EA66C007EA665A08010A4F -:1029E000EA655A0801073C03FD308C013C0BFD30C1 -:1029F000EA5EC81BEA66C007EA665A080117EA657C -:102A00005A080114EA3EC81184013E07F9C649FF7D -:102A1000FEB2EA9DC005800649FFFEEAD5052E07F5 -:102A2000FB72C003EAB4EACEEA9D3E07FB72FC806B -:102A3000FC403FCFFAC880C049FFFE9DEA3E81209E -:102A4000490037174E0200EB5C9480014E9200085B -:102A50002E07F9DEC004EAB4480000E1EA5EC04B8C -:102A6000EAA0C8494E920048DD529604C802EA61C5 -:102A70002E07F9C74410A55AEB4EEAF6EA9EDD553B -:102A80002E67F9C7442FA55A4410003D8846EA5ED8 -:102A9000FF8C402101008CC2EB8158000000406097 -:102AA0001820969180A65003007A0A12800188416E -:102AB0009691D8FCFE92407140088540A4305AA8F7 -:102AC0001E058CC28807D505A4718CC44000060081 -:102AD000DD558D41FA0EDD4F5AA81FF22E07F9C7BA -:102AE0008C019600EB252E17F9D3E201E92784002B -:102AF000EB25D524002300924E23007D2E17FB9C4E -:102B0000EA6EC10B2E57FA362E07FA2FD006B900FF -:102B10008E27E6224EF2006FEA65C810B816C80587 -:102B2000EAA04E030078D50A4E920004EAB4D50616 -:102B3000EAA0C80484013E07F9DEEAA04E02006F55 -:102B40004E92006DDD529604C802EA612E07F9C864 -:102B50008C019600EB262E17F9CEE220E8038401C3 -:102B6000EB262E07F9C82E77F9D29E4192E1FFCCD1 -:102B7000EB65EB3840709C202E17F9F8C11144101A -:102B8000A33AEB4EEAF6EA9EDD552E17F9C8440F3C -:102B9000A33A8801EAF6400005009601D5074600F1 -:102BA000403050000201DD55840A2E27F9D28420DE -:102BB0009241E222E807383385018C21880396018F -:102BC000D5F9FE024060400885202E17F9D28C22EC -:102BD0009022E321E8238E21A4384C90C0058CE29A -:102BE0008806D505A4798CE440000600DD558D21CA -:102BF000D5ED5A90010448FFFFA2EA654E03FF9FFE -:102C0000B816C0034E22FF94800649FFFDF148FF2D -:102C1000FF964E92FF9448FFFF8BFCC0FC2080E0A3 -:102C200080C14900204BDD4D842049002262EAC367 -:102C30003E27FD2184003E07FA05EB073E07F9D643 -:102C4000EB6510008601FA003E07F9C3FA14FA306A -:102C50004900350F2E27FD238425FE8C96905401C4 -:102C60000003C8038C44D5028C489690662100036B -:102C70005221007A96903E27F9D22E47FD212E3719 -:102C8000FD202E17FD2942120C7392414020881717 -:102C90009690C0028C413E27F9CE8401EB26442059 -:102CA000003D402088379690C1028C413E27F9D3E1 -:102CB0008400EB252E17FBA73E17F9E13E07F9DE4E -:102CC0002E07FC0E2E27FC0F402101043C2FFF464F -:102CD0002E07FC102E17FC11401081043C1FFF47EB -:102CE00040210C57401090373E27FD2A3E17FD2B00 -:102CF0008C823E47F9D88C623E37F9C584003C0B84 -:102D0000FD2ECF1FEB6F147003F1DD529604C0054A -:102D10008401EA628402EA61EB6F58000F44842068 -:102D2000EAE4DD42CE07EB6F580003B08026EAE408 -:102D3000DD42EB6F58000F80842044200040DD42CC -:102D400046190008A40896013C0BFD2992013C0B92 -:102D5000FD2AA40A3C0BFD284900058984003E0792 -:102D6000F9CD84203C1BFD303C1BFD2B3E17F9C2E6 -:102D7000EB273E07F9CB2E37FBD2FA4EFE9C2E37BF -:102D8000FBD3FE9C3C2FFEB73C1BFD273E07F9CA38 -:102D90003E07F9E0FCA0FC6146010007DD47461153 -:102DA00000079601DD5EEA51DD4946010007045047 -:102DB00003F04400A11A92B0D803490029984900B1 -:102DC00035BE46010007DD47461100079601DD5E6E -:102DD000EB16DD4949002E8CC8FE46010007DD4791 -:102DE000461100079601DD5E58000003DD494900E9 -:102DF00035EE49FFF115C002960146110007120099 -:102E000087A146010007DD47461100079601DD5EF8 -:102E1000EB18DD498448440000BA84208461DD4C0D -:102E200049FFEF5046010007DD47461100079601B4 -:102E3000DD5E58000005DD498401441001F484453D -:102E40004430025849002E0480C0C8F784458401EC -:102E50004410008049002E3946010007021007A0E7 -:102E60009649661080FF58108006121007A049FF8F -:102E7000F2C249FFF31B4E002CE08006EA6EEA9492 -:102E80008421EB81126000008041440000E7DD4EA8 -:102E9000960146110007120087AF46010007DD4783 -:102EA000461100079601DD5E58000007DD49FA0A69 -:102EB000DD40C80CFA0EDD40C809FA13DD40C80633 -:102EC000FA18DD40C80349FFF0DC49001EDB490069 -:102ED000361E46010007DD47461100079601DD5EFC -:102EE00058000008DD498400DD5A84C03C6FFEBAFA -:102EF00046010007022007A0467800209691EB01CA -:102F000058210009122007A08401100F8000100F23 -:102F10008001100F8002EB05EB043A0F840049009A -:102F200028F8800684264900349946000ED05000C7 -:102F300000404410C0064900348CEA30B4014430EB -:102F400000F566000040B60146010007022007A018 -:102F500080269691EB015821000A122007A0440018 -:102F600000B2844DDD4C46990000440000BA802632 -:102F70008448FA6150A384F4DD4C509480E846B94B -:102F800000905073834084074900271F8C05461129 -:102F90000007140083F9B409920C960F5A08031223 -:102FA0004400005684208441DD4EC00B84208441BF -:102FB000EA25DD4E5430007F8420EA258441DD4C33 -:102FC000EA3B4E0200F6EA8046010007DD47461163 -:102FD00000079601DD5E5800000BDD49840EDD40E0 -:102FE000C0048400DD5AD50CFA02DD40C8FBFA06A5 -:102FF000DD40C8F8DD46DD40C8F549FFEA39490043 -:103000000332C81E46010007DD474611000796013E -:10301000DD5E5800000CDD49840EDD40C00449FF30 -:10302000F2B7F80CFA02DD40C8FBFA06DD40C8F83A -:10303000DD46DD40C8F54900025C480000B0840070 -:103040003E07F9C03E07F9C646010007DD474611B5 -:1030500000079601DD5E5800000DDD49840EDD405D -:103060004E03003EFA02DD404E03003AFA06DD4010 -:103070004E030036DD46DD40C832F80A5A08010426 -:1030800049001DB6DD4D5A0008235A000621EA28E2 -:103090005A080106F86BC80349002327EAFCC81B3D -:1030A000F865C804DD4D490022F149000E3649009B -:1030B00025502E07F9E5C80F2E07F9C2C80C3C03AE -:1030C000FD2BC8094900202F80C0D50549001D34BB -:1030D00049001CF2EAFCC8034900028E49FFF9F7D7 -:1030E00049FFEAAC84013E07F9C0800649FFFCA213 -:1030F000EA9D490021B0EA65C802EACEEA67DD40F0 -:10310000C00A2E07FA058C019600E60CE90284003D -:103110003E07FA05490001C5840EDD404E03003F1D -:10312000FA02DD404E03003BFA06DD40C837840A50 -:10313000DD40C834FA0ADD40C831FA13DD40C82E3C -:10314000FA0EDD40C82BFA18DD40C828FA1CDD4015 -:10315000C825DD46DD40C822DD58DD40C81F3C0DD6 -:10316000FEC65A08011CEAFCC81749001D9F5A08F0 -:103170000109000500009604C80449001C22D50A74 -:1031800000050000960EC806EADBE602E9034900E6 -:103190001BBF49001D8D4900244E46010007DD4735 -:1031A000461100079601DD5E5800000EDD49DD4D39 -:1031B0005A080706A7782E17F9D0D5055A08081619 -:1031C000A778EAF5D912EAF55A1801065A08080450 -:1031D00049002DDADD4D5A08080700058000C8FEB9 -:1031E00049002CD049002DA0840EDD40C816FA02FB -:1031F000DD40C813FA06DD40C810840ADD40C80D62 -:10320000FA0ADD40C80AFA13DD40C807DD46DD4092 -:10321000C804DD58DD40C0058401F805C8FEF80685 -:103220002E07F9CF49002812C8FC48FFFEAEFC006B -:10323000EB5FEAB98420DD57DD4246010004580007 -:10324000034C8420DD57DD424601000458000E4C3B -:103250008420442005F0DD42EB56EA448420DD570B -:10326000DD4284C03C6FFECD3C6BFD5B3C6BFD578B -:103270008026EA70DD50DD42EB5658000C30802687 -:10328000DD50DD42EA798026DD50DD42EB56580004 -:103290000A808026DD50DD42DD4D5A08060CEA2FFB -:1032A000461100015810856046210001582108C0D0 -:1032B000DD48FC80FC203FCFFAC8B8005A00080562 -:1032C00084C35A08060384C1B91B2E27F9F22E07BE -:1032D000FA088802E2204EF2005BB91BC905EB56E2 -:1032E000EA44DD57DD42B91B2E07F9F28480E22063 -:1032F000E82D2E37FBA22E07FBD7441000D888609C -:10330000FE74BD1C94DA462100055821043C40128D -:103310008420848045006D604510DAC0D117020119 -:103320006FF0A5E88A07960197C342738003E0E334 -:10333000E804A5D08807AC102A0100018810960186 -:10334000E3A0E80284818CA2D5EAB81B8C01B89B6B -:103350005A48011E442000D8FEB4BD1C4631000569 -:103360005831843C402288208480D20FA5E8B81BC5 -:1033700022118000960340008016880796011A02E9 -:1033800080011A418001D5F28400B89BB91B2E47F9 -:10339000F9F22E07FA088804E220E9338440BA9B48 -:1033A000BD1C440000D842130024463100055831AA -:1033B000843C40128420D10D22018000A5A8400049 -:1033C0001016880696011A0280011A218001D5F490 -:1033D000B8005A0802172E07F9E82E17FC68E220F9 -:1033E000E8058401B8928400D50A2E2FFB9B4E2459 -:1033F00000092E27FA19C205C1048C013E07F9E81D -:10340000FCA0FC203C1DFECEEA3F2E37FA35E2033D -:10341000E844EB125A08012B2E57FA0F9E19D826B2 -:103420002E77FC0284A047010002590804E844609A -:10343000051050228F34990D8850A42003110000EC -:10344000E3A0E804A420A490D503A410A4A08A02B9 -:10345000E0E0E8048400EB48D5038CA2DEEBEB123D -:103460005A0801053E37FA0DD51AEB12C818DD4D82 -:103470009E82E647E8148401EB0F54200025CA061B -:1034800054000050C00CEA2FD502EABC46210003CC -:103490005821041CDD48D50349FFFF0EFCA0FC00A9 -:1034A000EA4CC0252E07FA162E17FBD6E201E919C1 -:1034B000840084C03E07FA023C6FFECD2E07FA0E50 -:1034C0003E07F9F2DD578026EB56EA44DD428026BE -:1034D000EA70DD50DD42EA798026DD50DD42D50715 -:1034E0003C1DFEC5C9048C013E07FA16FC80FC0099 -:1034F0003FCFFAC82E17FA0F2E07FA0DE220E90582 -:103500008401EABE840AD5038400EABE3E07FA08B5 -:103510002E07F9F8C0298401EB238401EB488402CB -:10352000EB21BE005A6802182E07FA305A0801141F -:10353000DD4BE6013EF7FA4C80068026EA733E67D3 -:10354000FA30DD4BC004EB59EA22D503EB59EA6BA4 -:10355000B89CD53584003E07FA282E07FA0B8C015B -:103560003E07FA0BD51249FFFF4EEA72C809B800B0 -:103570005A000607EA3F2E17FA354900206E2E073B -:10358000FA288C013E07FA28EB8102500301EB1761 -:10359000D0092E0FFB9A4E040006B8008E07E602F3 -:1035A000E806EA3F8C019600EB0BD509EB810000A1 -:1035B0000601EB658C01960010008601FC80FC2062 -:1035C0003C7DFECE84A046610002586304E884631B -:1035D000DD57987D50028F34A5088806A40042026A -:1035E0000C738CA290029601AC08DAF484033C0FB1 -:1035F000FEC4FCA0FC003FCFFAC8B8005A00080483 -:103600005A080605EB56EB37D5073CFDFEC5E90623 -:10361000EA4AC905EAB7E601D50285E03EF7FA199C -:10362000EA77EAB2C00F2E07FA19C00CB8125A0096 -:10363000020A49FFFE4184003E07F9F08400EAA631 -:10364000D51084C0BE9B8026EB56EA44DD57DD4290 -:10365000B8125A08020549FFFFB4D5033E67F9E8DE -:10366000FC802E07F9F8DD9EFC603D3DFF472E975C -:10367000FC822E47FB9D9284EB134E4200F23F1FCB -:10368000FE54383880005A38011444400030FF049A -:103690004430FFFF99CCA1BE4C61C00BA17BDE087A -:1036A000383090024C32C00584603838800844407D -:1036B000003042301024EB0299CBB4A78E418FE149 -:1036C000DC545041800C8881B5844D02804F5121DB -:1036D000801889C1B4D24C628049A0E14018040826 -:1036E000E0260409000195D9E90BE0E0E81940184B -:1036F0001801FE5C9A83401088368830D5028420F9 -:10370000E0E0B624E8048400A821F82D9A184218B5 -:10371000002440534001400094169958D5239972D3 -:10372000E0A141104C00E90FE1A74EF2009A405889 -:1037300018014011CC01FE6C9B4340109436883038 -:10374000B624D502B644E1A7E80415320001F80B0F -:10375000405808019A18FE2C40534001405014B6BE -:1037600088A3A9614800007DEB72584201244042C1 -:103770000020A7215A40FE0D2E47FA38CC71EB02EB -:10378000D46FA1BB4C62006DA1BE4C62406A8C6CD0 -:1037900038B880008861B58305218001A0794EB3D7 -:1037A00000604068040840332401E06540390408A3 -:1037B000E9104041A401E081E81B4028140142299E -:1037C00008244040C801402110568850A8BED503A7 -:1037D00014B380068A69E061E93C4039040142384B -:1037E0000C248AB04021945640590800D530992ABB -:1037F0008A89E08640A0CC00E90640452401E083A8 -:10380000E904D52EA8BED5114068140140494C01E9 -:10381000FF344060C8014042189688904E4500042D -:10382000A93ED50314B3800640952401E123E804A2 -:1038300015338007D5124038080140290401FE9C49 -:103840008AB0405114B688B24E550004A97FD50500 -:10385000501380188440A889842138188008FCE01F -:103860003E1FFE5438008000DD9EFC203FCFFAF85A -:103870003E6FFD38841F84E01203004412030045AC -:10388000842050030060844C127300421273004382 -:10389000DD428006EB4C44200060DD42500300789E -:1038A0008420844CDD42461141415003006C50108D -:1038B0008414844CDD424601000758000266A6408D -:1038C000A681EA3CB981A642A683EA3CB98EA64508 -:1038D000A686EA3CB980A647EB1FEA3CB9940010E3 -:1038E000000A0020000BEA3CB9960010000C0020F2 -:1038F000000DEA3CB9980010000F00200010EA3CCF -:10390000B98C001000110000001240000504B885B9 -:103910003C7BFD4CFCA03C3DFEC584283E0FFDF4E5 -:10392000EB02EB1FC208CB0410300008D5048E4117 -:1039300010200008EB1FCA03B680A9018E2196480B -:103940008C0CC9F0DD9EFC21EB1D80804601000738 -:103950000060027D460100070070027E46010007FC -:1039600080A10100027A3E1FFDF4846884000020DB -:103970008008C214B441E282E8038A44D5029AA2C4 -:10398000E246E80CA089E2A2E8038A45D5029AAA99 -:10399000E247E8041100800884018E6196D88C2CDF -:1039A000CBE7FCA1FC01EB1D80C080012E17FA3F84 -:1039B000C104842184A2D503842284A13E4FFD3812 -:1039C00038320B02E266E8039AF3D5028A66466152 -:1039D00000070063027FFF74E2A3E90D4032086034 -:1039E000A099E240E8039A82D5028A40FE74400022 -:1039F0008806D5028401FC81FC0084003C0BFD4656 -:103A00003C0BFD523C0BFD50EA5AEA4746210007A9 -:103A1000141103CE045103CE461A11AA5010811A74 -:103A2000D106EB3E045103CEEB24D93784003E0788 -:103A3000FA3F440000963C0BFD4FEACB3C0BFD5196 -:103A4000460100070000026A3C0BFD4A46010007E0 -:103A50000000026F3C0BFD4E46010007000002749F -:103A6000EAE046010007000002793C0BFD4D4601EB -:103A70000007000002823C0BFD47460100070000E2 -:103A8000028394013C0BFD494601000700000288B7 -:103A90003C0BFD4B8400D52984213E17FA3F3C0B9B -:103AA000FD4F3C0BFD513C0BFD4A3C0BFD4E4611BE -:103AB0000007041083FE92385A18110E46010007C1 -:103AC000EB5192109600EAE046010007EB51920894 -:103AD0009600D502EAE03C0BFD4D84003C0BFD470F -:103AE0003C0BFD493C0BFD4B3C0BFD48FC8046115B -:103AF00000025810810C380080003E1FFDC44010A9 -:103B00008040A60AA64B8A019601DD9E461100025E -:103B10005810810C382080003E1FFDC440008840B2 -:103B2000A60138108A008A019601DD9E4000040E2D -:103B30009604DD9E84414011040CA480FE57AC40E5 -:103B4000DD9E442EFFFF4011040CA4804011061E90 -:103B5000AC40DD9EFC203E7FFD3880C0FA249838C2 -:103B6000EAF2500380848026F80C50038086802679 -:103B7000F8085003808A8026F80450038088802645 -:103B8000EA38FCA0FC623FCFFB482E17FC0C421029 -:103B9000980B4E1201A9F08184C049FFFEBE3E9FE2 -:103BA000FD3849FFFF2B508F80083EDFFE843EEF3B -:103BB000FEB4DD5DE2C04EF20148DD4604BF800187 -:103BC00042B30073EA328D6CB4EB54C300FF4C7007 -:103BD0004026EA7D00000078C806400498603874EA -:103BE0009B0AA9C1EA7D8420EA5FFA24EAF2802CCC -:103BF0003E0FFDC0EAF3802C3E0FFDC2EAF3802C9D -:103C00003E0FFDBCEA38802C3E0FFDBEEA383E0F69 -:103C1000FA98802CEA38480001143B05C4002E179E -:103C2000FA3F460100073B04442081510000027C1A -:103C3000C907E207E80FB9749A08E2E0D506E21175 -:103C4000E809B9759A08E3A0E8053E0FFDC0802C8D -:103C5000EA38F78214AF8003EB4949FFFE769630CD -:103C6000B61F3C03FEDFB43FEA4BC009EB49B45F2B -:103C700049FFFE9AC004B41F49FFFF6E3C03FEE1FA -:103C8000B43FEA4BC0463C0DFEBF38769909E207C7 -:103C900038A71909E8093C0DFECCE2E0E8053C0331 -:103CA000FD4AE340E9263C0DFEBEE207E80AB80003 -:103CB000E2E0E8073C13FD4EB8758A01E20AE91913 -:103CC000B802E20AE808B804E340E8053C03FD4511 -:103CD000E2E0E90F3C0DFECAE20AE8173C0DFEC324 -:103CE000E340E8133C13FD4DB8748A01E207E80D88 -:103CF00040049860B6E014A00001B43F3E0FFDBC44 -:103D0000EAF3EA7D8420EA5F3E0FFDC2B43FEA3861 -:103D10003C03FEDEB43FEA4BC01A3C03FEDFB43F77 -:103D2000EA4BC81540149800000080605A00FF0557 -:103D30008C01100080603C13FD45E227E808B87450 -:103D40008A01E2E0E804B41F49FFFF063C03FD4C92 -:103D5000B43FEA4BC00AEB49B45F49FFFE25C005FA -:103D60003E0FFA98B43FEA38EA7D0010006CE63462 -:103D7000E85C8C2146210007964800310287EAF270 -:103D80000000006094B3E203E83A5A30FF39384447 -:103D90009B01BF7440048800A4C29A7CBD759649FB -:103DA0009A2BE2819601E808E283E806E280E804C3 -:103DB000860039049B0AE224E808E223E806E220B0 -:103DC000E8048EE138749B0AE264E80AE261E808DC -:103DD000E260E80640748800860015038001E20472 -:103DE000E809E201E807E203E805400488008EA143 -:103DF000A9418849B4E204A10001D51188493834A9 -:103E00009B02A0918AE340050801FFCCFE0CFA84D6 -:103E1000407390F640A0115688E38942EA7D843FC2 -:103E2000B6EB14A58001EA5F3C03FEDEB43FEA4B2B -:103E3000C007EA32802BB60BA8098400A80A8CC1FF -:103E400097B148FFFEB8840049FFFE5346110007B2 -:103E5000120081DF840049FFFE5B4611000712005B -:103E600081E0EB590010010CEB5958000398380021 -:103E7000060146110007120081E13C43FEDE4611B7 -:103E800000073C33FEDF8400120081E24611000788 -:103E9000120081E384AA84258401462100070221BF -:103EA00001E297A4422018734661000796911223FD -:103EB00001E246210007979C022101E3422018738A -:103EC0008E21FE2C9691466100079649122301E34C -:103ED000928192619601C9E22E07FD984611000772 -:103EE000120081E4FCE2FC6080C0840EDD404E03E1 -:103EF000009CFA02DD404E030098FA06DD404E03B6 -:103F00000094840ADD404E030090FA0ADD404E031F -:103F1000008CFA13DD404E030088FA0EDD404E039C -:103F20000084FA18DD404E030080FA1CDD404E0389 -:103F3000007CDD46DD404E030078DD58DD40C8746E -:103F40003C1DFEC65A180171470100075908024E70 -:103F5000472100075929021E2E97FD2346710002B2 -:103F6000587381DC9C748150EB3F4711000759184E -:103F70008236817247310007593982069680E249BC -:103F8000E8530450FFFFD64DB4414C23004B40335F -:103F900080603853830AA8992E27FC0C4221100B0D -:103FA000C21E84413889090196D0E3058182E80563 -:103FB0008C415A280CF9846B8E6196D838498D0152 -:103FC0003829B10138358D018A448AA3FEAC4054AA -:103FD0000C01405114B788A41450FFFF2E27FC0C8D -:103FE0004221140BC21EB46184A138281501972800 -:103FF000E2438185E8058CA15A580CF9848B8E81A7 -:10400000972038851101385891014041A001383876 -:10401000B1018A488A65FEE4402188578845B64147 -:104020008C018C2CD5ACFCE03C1DFEC05A1802075C -:104030002E37FA232E47FA3BD5052E37FA292E477D -:10404000F9E22E27FA13C8125A2801222E17FB7400 -:104050008C219648E2243E17FB74E9193E07FA13B7 -:104060003E07FB743E07FB73D5125A080111CA0FB5 -:104070002E17FB738C219648E2233E17FB73E9074A -:104080003E07FA133E27FB743E27FB732E57FA13A5 -:10409000D80684003E07FB743E07FB73DD9EFC6977 -:1040A0003FCFFB142E77FA13B8008EE1E6025C7363 -:1040B000800184C0E9049F81FF8492C1508F803CBD -:1040C00080088420844CDD4246D1000258D68458B2 -:1040D0008560465100025852838046A1000258A5CF -:1040E00003C8812D806B818585DF473100025939F6 -:1040F0008398B800E260E86938140C00510180012F -:10410000C93E3D13FD434121840880904148840805 -:10411000415914004C4000344172040840265C00B0 -:10412000001A8001A6918A22421080039648E62C4C -:10413000E805FE4C556080FFD503456000793826C0 -:10414000480038165C009A51421080039648E62CCD -:10415000E804FE4C9648D50344100079883696480A -:10416000E3A1E90738E40C0884E138E41008D50538 -:1041700040FA0407E8028D618C81D5CD2E07FBC77C -:1041800038198E02E220E9108049806AA052A01AF4 -:104190008801A812B429B40A8801B609A051A0194F -:1041A0008801A811D50E9618153F8003F582150FCA -:1041B0008001EAE3050F8001F502053F8003C8E5B1 -:1041C00080708D2C8D4CD5964CB3400384E08007D5 -:1041D00049FFFF2CBF00CF053E77F9FA3E77FA1171 -:1041E0003C9DFF46EAAAF0863CADFF47EB14F08702 -:1041F0005004FFFFF08150057FFFF0822E07FC0C7A -:10420000468100025884013C9644EA4DF08A2E070C -:10421000FA2CF08B2E67FC83F188540300F0F083B6 -:1042200040050001F08C95B42E07F9FA97B0F0859F -:1042300040049801F08D2E17FA3C2E07FA11F189EF -:10424000F084856081884CB38073B40D04E68002ED -:10425000F206846042002469EA96804E8460EA9601 -:10426000F206402488579241C904C905E240E80398 -:104270008A02D5028400B60804068001F207846031 -:1042800042002869EA96804E8460EA96F20740254B -:1042900008579241C904C905E240E8038A02D502E1 -:1042A000840014040001B408E209E903F001B6082F -:1042B00004040001E20AE904F00214040001F00819 -:1042C000C005B408F1019A08B608B408F1094621FE -:1042D0000002582102484010043738112C08F10A16 -:1042E000C1068068A059F2029A51A859041400012D -:1042F000F20B463100025831823C40208857382169 -:10430000AC08F203E241E806F20CE222E803842161 -:10431000F185E2C0E806F10DE201E8038401F084D2 -:104320008D618D0850D6800C48FFFF8F001F8014D0 -:104330003E17F9FA001F80103E17FA11EB590200E0 -:10434000009E46110007120087ADEB59020000A045 -:1043500046110007120087AEEA32E6ECE808401684 -:104360001C6038061F0AA8098CE1D5F8FCE9463123 -:1043700000025831838040418020EA3DA7218E41D0 -:10438000E6829690EAEEE90CE244E90A38018100FF -:10439000E602E9068E21964840008006DD9E8401F3 -:1043A000DD9EFC203FCFFB002E07FA2DC0058400C8 -:1043B000B885480000A8BE0F4E630057B9058E218E -:1043C000E6234EF20052EA28BF005A080112800686 -:1043D000EAE3C0042E07FBAFD50DEA2C2E07FBAE97 -:1043E000C1099E7AE622E8068E0A9601D5032E07B9 -:1043F000FBB25A700307EA605A100104EA2CC105A7 -:104400002E17FBB088019601DD4A80C0EAB1C009D1 -:104410008400EAE32E67FC4CC00392C1D50297B139 -:1044200046010007EA40DD54DD53D8162E07FA2076 -:104430005A080113B8005A0002054460012CD50344 -:10444000446000968400EAE3C0074003080996012F -:104450004060183C97B1EB59040001189201E20644 -:10446000E8038400B8854611000204108118B805DD -:10447000922149FFEA2DB805E602E944B90FE2208E -:10448000E8413C63FD44EAB1C80440130409D50384 -:1044900094719649DD51C803DD4BC0092E07FBAC72 -:1044A000DD4A80C02E07FBADDD4A8020EA82C00ACB -:1044B0002E07FC59DD4A80C02E07FC59DD4A9401C5 -:1044C0009641EAB75A0801084063183C4010843C02 -:1044D00097B19649B80FBB05848C465100025852DB -:1044E0008458E203E80F804542201073E602A09250 -:1044F00080E1924140733C1BE2474EF3FF5B8C012D -:10450000D5F1FCA0FC602E07FA315A0801092E07EC -:10451000F9FCE615E91A84003E07FA312E97FD23CF -:104520002E47FA312E37F9FC84004611000258104C -:104530008070465100025852813CEB3F80E04701B9 -:10454000000259080118D5108C013E07F9FCD5E787 -:10455000382283024C234013A6888E41E653E90794 -:10456000AFC88C018C21E209E9F4D50E382800008F -:104570005A2801F880828460D5F4A6885A20FFF377 -:104580008C41AE88D5EF3E47FA3146A1000158A5CF -:104590000FEC3E37F9FC4611000158108FF84631F8 -:1045A00000025831813C467100025873811880CA5C -:1045B0004520FFFF8660856140032801E209E8513C -:1045C000B4434C294008B7C110B3800010B30000B9 -:1045D000D527A6385A080125B4A14C5940073B01FC -:1045E000C4003B00C420D51CE2A2E8039A15D50202 -:1045F0009A2AA159A109E285E8039B2CD5028A8554 -:10460000FE044202107381E02E57FD2A2E47FD2B37 -:10461000FF2CE28FE805113380003F37FA31B4A157 -:104620004C59001B4C290019A6305A080116E2A269 -:10463000E8039B55D5028AA2A099A009E202E803EB -:104640009A10D5028A02FF6C425000735CF2B841A6 -:10465000E903113300008CC18C288C688CE1D5AD46 -:10466000FCE0FC613FCFFB3C467100025873813C8B -:1046700046B1000158B58FD44691000158948FE09F -:1046800084C081474480FFFF464100025842010C2C -:1046900046C1000258C6038046D1000258D6806445 -:1046A00046E1000258E7005847010002590801247A -:1046B000DD5DE2C0E8639630150F8001B69F49FFCB -:1046C000F8D1B49F050F80015A0801052E07FA386A -:1046D000EAA4B4A74C544014000480002E17FA3802 -:1046E000E201E8088C01EAA44400FFFEB607A839FD -:1046F000D53F8400EACA841FEAA4D53A38021800DC -:1047000040160020A689381601002E07FA27C00E91 -:10471000C60DEB590400001F5CF000C9E9072E37F5 -:10472000FBF3440FFF80EB3DD5032E37FA64000501 -:104730008000E203E81538569800DA04385718006C -:10474000D103E6C5E8038C01D5028400EACA847F60 -:1047500040081820B70714838001AEC1D505840036 -:10476000EAA4841FEACA38269808381718088CC1AA -:104770008D618D218CE848FFFF9D84C0BE80843F01 -:10478000EB5958000124FA48DD4246710002587383 -:10479000813C80064520FFFF46310002583180AC45 -:1047A000464100025842007C80A64530FFFE4691FB -:1047B000000258948124857E3865020294424C6937 -:1047C0000013BA008C41BA804C69C01098B9882394 -:1047D000EB3B401024003B01442010B080013852D4 -:1047E000010AD5083852010A9899882AEB3B3B0107 -:1047F00044208C025A0818E249FFFE86FCE1FC6165 -:104800003FCFFB14B80BC0038400D5042E07FB9DDB -:1048100092043E07F9EE2E77F9EEB8048CE1E20738 -:104820004641000158420D94E91BBF84840C42C3E9 -:1048300080244661000158630D9450D67FF48500B2 -:1048400046E1000258E7013C4490FFFF46A1000208 -:1048500058A50458473100025939810CD5418420AC -:1048600044500030DD5DE020E8E1800442009473B4 -:1048700084418C0CE0478C0CE80950307FF43B01FC -:10488000C8008C413B004820D5F68C21D5EC8C210A -:1048900050407FF43B004800E0273B0248208C0C4E -:1048A000E9F73857230240440C0884004C54C021D7 -:1048B000462100025821013C4013300088823B020F -:1048C0004400A10A84A7420290733B00C4209203D3 -:1048D000A80AB4A64C5480238D0150630030DD5DDE -:1048E000E100E83D50B3000C800B8420D5D138198D -:1048F000A000840C804A422080738423A012F4819B -:10490000FE0CB7FF920149FFE06B5CF00100B5FFC0 -:10491000F401E9CF440000FFD5CCA1734C54BFDEB5 -:104920005A7001DCB800E603E805A1764C54C05685 -:10493000D523A1764C5480085A7803F90453000912 -:104940004C54FFF5800B848184A08C81E0E4B72077 -:1049500014900001A9428C0CE8F9D5E884C0DD5D13 -:10496000E0C0E83F96304611000158108D9449FF91 -:10497000F67D8CC1D5F584015A7803B00453000943 -:104980004C54BFACC8AAA03338233002A1499AD0F6 -:104990002E47FD2AA0742E07FD2B9A69920292825F -:1049A000FE4CFE0442118C7342021073E0204EF262 -:1049B000FF954003340038133402A0018822880593 -:1049C0009221920184818C81E0E4B62B1405800150 -:1049D0008D6CE8FA48FFFF8284005A7003D1D5D469 -:1049E000FCE1FC6383808400120E0048100E0092EC -:1049F0002E17FA132E57FBBA2E07FBB9C908EA6027 -:104A0000C906EA2CC9042E17FA39C1055882800F4D -:104A10009204D505975F40828C08961F8C018548CB -:104A200042A028012E07F9E4E20AE8038C01D5042C -:104A3000E340E8048E0154A000FF400504099600FD -:104A4000F08184E046B1000158B58A7C3CCDFE6916 -:104A500046D1000158D68A70DD5DE2E04EF2015A7F -:104A6000947BEB59580001DC39001F028801B63FE6 -:104A7000A1414611000158108D94DD46EB0C3845DC -:104A80009C0080018C0CA18B04900001EA3246212D -:104A9000000158210A884C60400D4C93400B440F94 -:104AA000FFB438069C08840038011C084800011D2A -:104AB000000E009284218C01100E0092020E00481C -:104AC00040309C0CFE1F120E004838011C0046E1CD -:104AD000000158E70A94C8144621000158210A88A9 -:104AE00038111C0894BE401700003860880A8C08F2 -:104AF0008822149080015A0840F8480000F8E386A4 -:104B0000E80441234001D50341281801E2A9E80443 -:104B100040049401D5034002A401421948244210E4 -:104B2000007339369C0092214F3300072E27FBB3C8 -:104B30002E37FBB4D5052E27FBB72E37FBB8471110 -:104B400000025918810C39989C004711000259182D -:104B500083982EF7FA103918E60240F7C406E907E1 -:104B60002EF7FA39E9042EF7FA40E80886234221A5 -:104B700044244231C424969096D84F330020E2C298 -:104B8000E9093D1DFF468FA18BA2E3A64029BC1B6E -:104B9000D5028053E323E9073D1DFF478FA18BA377 -:104BA000E3A9E80284605CF3006EE80850F4FE3389 -:104BB0005CF7809FE803846080433E27F9F93E3725 -:104BC000FA1B3E87FA1E3EA7FA22E3C2E803E2037D -:104BD000E90984004621000158210A7038011C08A7 -:104BE000D503812580D092224010A0378C21E63158 -:104BF000E902FA204E8200392E07F9EEC00C9C81A2 -:104C0000DD46FE3C846C42010C7338260002EA3219 -:104C10004C20002B8007F185F584150F8003F4826A -:104C2000F837F402050F8003F504F105C81D5200A2 -:104C300080104220402442230473FE2C82C2EB13D6 -:104C40004204847395B4406308D7820040049008FE -:104C50003C9DFF4797B040002417960088D6898076 -:104C600092C440981009B41FE62D880440070060E4 -:104C7000B6C014900001E90ADD46802CEB0CEA3244 -:104C8000A14ED8042E07F9EEC8248007F48249FF0C -:104C9000F5E9F402C81E812080C080A04C550013A5 -:104CA000B41F98443827070240170460A04988C2FF -:104CB0008921C4049E619708D50284879C29974066 -:104CC000D5EEF00188C08920406328D74094A937E9 -:104CD0004601000158000A7C38001C008C01960037 -:104CE0005A080803840038059C08840C803CEB0CAF -:104CF000804CB6C1149080018001441000304223E2 -:104D000084738CE1A0551010000897F848FFFEA6A8 -:104D10003EA7F9E4FCE3FC683FCFFACC3E0FFECCA3 -:104D2000842044200048DD423E0FFF1444107FFFE2 -:104D3000FA54EAB546010001580005388420FA54B7 -:104D4000DD42EA77EA9FC02BEA28BA0D5A08011320 -:104D5000EA4CC80D2E07FBD75A2803042E07FBDBAD -:104D60002E17FA39C1092E07FC4DD5062E07FBDA9E -:104D7000D5032E07FBD82E47FA40EB0AB915CC0312 -:104D8000C30EC90D2E47FA3DCC0394019601C3070B -:104D90005A280206C10450007FD896013C13FD2713 -:104DA000C104500000C8960184203E17F9E0EA9A39 -:104DB000F1824380940B3D0DFEC04F8200185B08CA -:104DC000020BEA605A100105EA2C5A1801072E5707 -:104DD000FBE0D50D5B000305EA605A1801052E576C -:104DE000FBDFD5052E57FBDED50280B84611000744 -:104DF000120087A44611000196031250829B4611AF -:104E000000011200829A840046110005120084A855 -:104E100046110005120084A92E67FD212F27FD20D1 -:104E20003C8DFECE3D3DFEC8EAB74621000158212B -:104E30000538862046C1000358C6041C3E9FFF1457 -:104E4000B61F807181624550004847610007596B69 -:104E500005004570004C519670CC83C93EDFFECCF6 -:104E6000E266E86D81D642E1D4734341DC2495DAF1 -:104E70008480E292E8513817110140AA10203806C8 -:104E800005013814050189598A01960196431215C6 -:104E900014B202A10000E141E802AC1038A49C0267 -:104EA000E22AE8064E17000738149C0AD5074E166A -:104EB0000006854038AF1C0AD51838A69C028941E7 -:104EC00038A69C0A46A1000502A504A8E141E80D08 -:104ED00046A10005120504A846A100051035095693 -:104EE00046A10005104509575B0003154E14001339 -:104EF00046A1000502F504A952F78000E02FE80A58 -:104F0000FE02120504A9EB5610300954EB5610406E -:104F100009558C81D5AFCD03AD50D50EA4104000FE -:104F20001417AC104F3300099601E615E905B41FBC -:104F30005A08010382208C618C42D5932E37FD04E0 -:104F4000840080403E4FFF14E246E80E4611000107 -:104F5000EAD438520A02964B8823E225E8038C01F2 -:104F600096018C41D5F2E606E9072E07FA0E940168 -:104F70008C013C0BFD533C13FD53C11284003E3F9A -:104F8000FF143E4FFECCE206E80838220202402120 -:104F90004857EB2C8C01D5F88E213C1BFD53EA576A -:104FA0004200180BC821EB5646210005021004A848 -:104FB00000210956460100010200029A38258901A4 -:104FC00096038802E00146E1000258E704E8E81F82 -:104FD000460100010200029A960388408A22EB569D -:104FE000121004A8D51984003E2FFF144631000189 -:104FF00058318538E206E8D8381102023845810177 -:10500000E281E803381181098C01D5F5840046114D -:105010000005120084A85B00033646110001EB5620 -:10502000EAD4020004A9964BE020E80646110001EC -:10503000EAD48A01D502840046110005120084A931 -:105040004F330014EB56EB393C13FD33E220E80DEF -:1050500046110005021084A9E201E80784013E0719 -:10506000F9C28402EB27D50E2E07F9C25A080106B1 -:105070002E07F9C98E01EB272E07F9C9C8033E0791 -:10508000F9C284003C0BFD343E07FA43EADBF083AF -:1050900050097FFEF0843C83FD33840542040024E4 -:1050A000F0852E07F9E0F081EB56021004A82E27B8 -:1050B000FBA49EF29492F38B5CF080C8F28614FFFE -:1050C000800CE7E62E27FC0D14FF800DF287BB272E -:1050D0004621000100B1055C44707FF88400415016 -:1050E00088092EC7FA14E2E3401404063CA3FD2B02 -:1050F00081A080808120804045E0004C4761000213 -:10510000596B04E8832047710001597B853814FFEF -:10511000800EF18FE2464EF2009294D1F388E6427F -:10512000803614FF8009F30B42117873E243EB2FB2 -:1051300084E014FF800AE2F24EF2007EF303CB20FB -:10514000F309CB08F30AC306E6E2E904F304E2E359 -:10515000E91746510001EA4522308000EA4940F44F -:105160003C0040F78C07E80CEA45F505EA4940F2B7 -:10517000BC00E06FE805F5018CA196E8F3812230D0 -:1051800080004E350014F508394B9401465100015A -:10519000EA45EA4940FA3C0040F78C07E813EA4543 -:1051A000EA49414A3C008A74D50B46510001EA4560 -:1051B000EA4952F78000E06FE805EA45886FACC81D -:1051C000D503139080002A308001E075E905F50CC5 -:1051D000C507F50DC5054E3700048C019601F5068F -:1051E00040F194004EF4000DB4BFCD0A8D21F507B7 -:1051F00040948013E325E90458B5800185814E343D -:1052000000048A8397215B00031085404F33000D13 -:105210005CF203E9E904F50F8541CD0604AF800E89 -:1052200084A040A2A8065EF1FC18E80285A18CE1EA -:1052300048FFFF838C4148FFFF6F3ED7FA433CABEA -:10524000FD2B4611000110B0855C3EC7FA143C0BE3 -:10525000FD34001F80043E17F9E046010007EA40D4 -:10526000DD54DD53D816540680FF5A0801082E0776 -:10527000FB795A00FF078C01D50284003E07FB79B9 -:105280002E07FB79E6028401E80284003E07FA4318 -:105290003C13FD345CF08029E908F002EA9FC80362 -:1052A0004F820004B815C8035B180108440000C809 -:1052B0003C0BFD388401D50BEABBC0075CF08028AD -:1052C000E8048E013C0BFD38EABBC8033E07FA3DFB -:1052D0002E77FA3D5A7001044800006FBE0DB822C7 -:1052E0005A0803065A6003043E77FB782E07FB78C2 -:1052F000C004EABB3C0BFDBBEB56EB395A60030321 -:10530000CE064410012C3C1BFD39D5203C23FDBBAF -:10531000CA0C3C33FD385A30C80C5CF08051E908A7 -:10532000EA4AC906B915C9044410012CD5095CF034 -:1053300000C9E90440100809D503441000963C1B3D -:10534000FD3946110007122087B22E97FD212EA7A6 -:10535000FD203C23FD3984A040B0040952C1000067 -:105360004530004C47210002592904E882255C3071 -:105370000191E2A9E82880324212CC738600EB2F1B -:10538000E38AE8182A0080014E07000B5A600205E4 -:10539000CB03E00BE80DE040E8098A02D504E00CFD -:1053A000E80588021200FFFFD5031310FFFF8D816F -:1053B000D5E88CA1D5DF84003C0BFD393C0BFDBB4F -:1053C0003E07FB782E07FC3E9405E0042E57F9DBE0 -:1053D000E811DD51C80FDD4BC80DCD0CCF0B4601D8 -:1053E00000010000055C46110001EB16EA958401FE -:1053F000EA8A46010007041003F2EB56EB39E2207B -:10540000E815DD4BC813CD12460100010000055C14 -:1054100046110001EB18EA9584213E17FA142E0775 -:10542000F9EC8C01B89E3E17FA2D2E07FA14C80429 -:1054300046110001EA95CD53EA4CC8512E47FD2193 -:105440002E77FD2051027FFF80C54510004C47217B -:105450000002592904E8453FFFB4E2A4E83DBE80BC -:10546000C80980324212C4734292CC24EB2F804090 -:10547000D5128401D5312A308001C324BB00E667F0 -:10548000E80DC80CCD0D4030A40022318025C31595 -:10549000BD808C41E247E9F0D51D8401D51B4C58F5 -:1054A00040072230FFD9C309B880D5F422308025C7 -:1054B000CB072230FFD9CB04BB008C61D507BE805F -:1054C000D5E93CADFEB3E747E803BB80D5E38401F3 -:1054D000D5E18CA1D5C33E07F9DBD50FB912C90BB5 -:1054E0003C03FD2C8C019601EB325A0864073E17F1 -:1054F000F9DBD5038400EB322E37FA15CB392F3781 -:10550000FD212F27FD202E07F9E5802345100048B7 -:105510004470004C46510002585284E8E233E904DA -:10552000EAD28400D5274300C42442609C248440EE -:10553000E252E814941140404000888522F20CAAFF -:105540005EF78033E9088806880522F014B25EF71A -:10555000FFCEE9068C418400D5ECC008D503840158 -:105560008060EAD23E37FA15D5078C21D5D8840061 -:10557000EAD23E07FA15B80D84C05A08030ADD5175 -:10558000C8042E67FA4CC60484C184E4D50284E1C1 -:10559000EAB15A08010480C084E2EA7FE602E80327 -:1055A00084C084E1DD58DD40C00384C084E149FF4C -:1055B000E7DA40039820549000FF2EA7FD212E47E4 -:1055C000FD202E87F9E5DD51B61F2F37FA4BEA7F14 -:1055D00084A051E9FFFF80654580002645700024C6 -:1055E00046B1000258B584E845500048454FFFB821 -:1055F0005D100002E26AE85142C1D4245202A9645B -:105600005016195442D1E0244361DC24880B882BC6 -:105610004391D0248640E3C4E83C4E82000522201A -:105620008000AC80B45F41001400C2104F32000F04 -:105630004F13000D3828351123007D2F4228787331 -:1056400040214C5612207D2FD5184020E4003821EF -:10565000591138F83511898C23087A80FEB4422715 -:105660009C73422818734021245612207D2F4F121C -:10567000000522200000D502A488122082884E83D3 -:10568000000522200000AC888DC18C028C22D5C47C -:105690008C615052FFB4D5AF2E07FC0CEACDC81078 -:1056A0004601000458000E4C441000FD442002F84E -:1056B000EAB52E0FFC0C4E0401334800008646D19B -:1056C000000258D684E850827FFF8640FB36456052 -:1056D0000024826D47710007597B832447810007AE -:1056E000598C030045900064540900FFE20AE8D990 -:1056F000547900FF4233D82480C4981C40B0040879 -:105700009C3980A48184426024734259247342C32B -:10571000A4738868862050318CA8506311B8405615 -:1057200094204143840840C6B020821140398C2027 -:105730004069982040085C00382050004008600014 -:1057400038105010841F4E1700038401FE44415648 -:10575000440096484F020018220294B1FE142222FF -:1057600094B0400064169603E040E81FC11E4E0549 -:10577000001D4E25001B9A82FE549026964BAC5A73 -:10578000AC72D513880781E842F024734009BC202D -:10579000220014B2FE0C221A94B140006416FE8C52 -:1057A00040216456880296034018AC0088331200EA -:1057B0008CA98FA2120A91E08EA25B0001048601DF -:1057C000D5BA8DC1D5922E07F9FAC8042E77FC847C -:1057D000D503447000FF2E07FA11C8042E67FC841D -:1057E000D503446000FF2E57FD21EAAA9D295130C0 -:1057F0007FFF5100000146110004581088A8846101 -:105800008620E264E8202220800123208002E1C279 -:10581000E8068A52FEB49048AC88D5031310800085 -:10582000382081113920CD11E1C2E8078A52FEB437 -:1058300090483820C109D5033910C1098C61501036 -:10584000804CD5E04460004CFFAC9C8146110004C4 -:105850005810885E5113004C86018640E382E8218F -:10586000223080262330804CE1E3E8068A73FEFC78 -:105870009068ACC8D50313208000413098003830C0 -:1058800098112339FFDAE1E3E8078A73FEFC906898 -:105890003830C409D5033920C4098D818C22D5DF65 -:1058A000461100042230842F461100042210845433 -:1058B0004460004C88239021463100041211842E4C -:1058C000806E802E4232187342129873227191BBFF -:1058D000221091BA88279021121191BA40370820DE -:1058E00040170020226091BA221191E08826902171 -:1058F000121191BAFA76FF1C986242228C738804C6 -:105900004007002040270820224011BA220111BA86 -:105910004017042088049001120091BAFCE8461157 -:1059200000015810853838008101DD9E3E1FFB6064 -:10593000A608FA56A6498E0142100873EB59580082 -:1059400004E8504091B840401020A5623E2FFF70FF -:10595000976BAD509CE4A521501094B09723AD15E2 -:10596000A519400004209723AD16024180263E1F52 -:10597000FF5C9723AD14024180259723AD120241AD -:1059800080279723AD130241804C9723AD1102412C -:10599000804B9723AD170231804D96DB1231000802 -:1059A000A4C29C8496DBACC8A4019603AC0DA411E0 -:1059B0009603AC0E020100269603AC0C02010025F2 -:1059C0009603AC0A020100279603AC0B0201004CBF -:1059D0009603AC090201004B9603AC0F0201004D87 -:1059E000960312008008DD9E4621000258210380A4 -:1059F000383105003831010840310420A6D9402152 -:105A00000020AED146210002582103983831060209 -:105A10003831020A844C42300824FE8C4641000290 -:105A200058420458996388823B024800464100026C -:105A3000584203C888443B02C82088643B014800A0 -:105A40003E2FFDC43B01C82040110440EADF3A105C -:105A500084003A100420DD9E92000000842046213C -:105A60000002582103983811020A844CFE84463102 -:105A70000002583184588862B623A859A85A463182 -:105A80000002583183C88843B622A851A8522E3745 -:105A9000F9C53E2FFDC438310208EADFAE41AE42FF -:105AA0002E17F9D8AE43DD9E920000003BFFFCBCF0 -:105AB00051FFFFFC49FFFF3C3C03FFBC96034E0532 -:105AC00000AF3C23FFBC80A2461100022E07FB6101 -:105AD00000108397E220E8499A41E4224EF3004AFD -:105AE0002E17FB6046310002043181159893463130 -:105AF0000002044181134631000204318114F8523E -:105B0000465100021422811546210002144101135E -:105B100046210002143101142E27FDF1E240E85D18 -:105B20003E07FDF12E27FDF2E241E84F3E17FDF260 -:105B3000FA564200887346110002581084E850005B -:105B400014B094018801221000025A10FE4FEA5648 -:105B50002E27FB60ACC2EB223E27FB5CEC043E1719 -:105B6000FB5D3BFFFC84DD9E8A20E4224EF2FFBAFF -:105B7000463100022E17FB6000318396E261E85344 -:105B80009ACBE4624EF2FFB0463100020431813913 -:105B90008843463100020441813746310002043116 -:105BA000813842428073423284734A000060465119 -:105BB0000002142281394621000214410137462196 -:105BC000000214310138D5A92E27FDF3E222E8B1F5 -:105BD0003E17FDF348FFFFAE2E27FDF0E202E8A3DB -:105BE0003E07FDF048FFFFA02E27F9FB46110002FB -:105BF000041080F18C21EA56ACC2E241EB5914103A -:105C000000F1E8172E17FB602E07FB613E17FB5CC7 -:105C1000EC043E07FB5D3BFFFC84DD9E84A08440DA -:105C200048FFFF548A61E4624EF2FF5E48FFFFAE18 -:105C300049FFD408C8E8EA27C11C3C03FFAEEAA923 -:105C40009743D217EA2AEABFEB104E000056E9113B -:105C50008E21DD5649FFFF2C2E07FB5C5000000112 -:105C60002E17FB5DEB3CEA8749FFFE622E17FB60B7 -:105C7000EB528E01E020E8193C03FFAFEAA99743FD -:105C8000D214EA2AEABFEB11F837E90F9C49DD5636 -:105C900049FFFF0E2E07FB5C50007FFF2E17FB5DB8 -:105CA000EB3CEA8749FFFE44EB22C1193C03FFB0FD -:105CB000EAA99743D214EA2AEABF3C33FFBAF81C98 -:105CC000E90E9E49EA87EA34EA59EA4E500000019B -:105CD000DD56EA4149FFFE2C2E17FB61EADE8E01FC -:105CE000E020E81B3C03FFB1EAA99743D216EA2A59 -:105CF000EABF3C33FFBB960396DB8802E00383FFD9 -:105D0000E90C9C49EA87EA34EA59EA4E50007FFFE1 -:105D1000DD56EA4149FFFE0CEA274E120051EAC166 -:105D2000C2203C03FFB3EA569743D31BEA2AEAC2D8 -:105D3000EB10F875E916EAB63C03FFBAF87AE911F8 -:105D40003C03FFB83C43FFBA3C53FFBD9723960387 -:105D5000EAC088048803972B40F010074EF200A693 -:105D6000EADE8E01E040E82B3C03FFB4EA5697439D -:105D7000D326EA2AEAC2EB10F852E921EAB63C033C -:105D8000FFBBF857E91C3C03FFB83C43FFBB3C5347 -:105D9000FFBE97239603EAC04E00005CE9108E21F7 -:105DA0008C41DD56EA9CEA34EA4EEA598C218E0198 -:105DB000DD56EA4149FFFDBC2E17FB60EB528E0118 -:105DC000E0204EF2FF21EAC1C21C3C03FFB5EA56B7 -:105DD0009743D317EA2AEAC2EB11F821E912EAB68F -:105DE0003C03FFBAF826E90D3C03FFB93C43FFBA78 -:105DF0003C53FFBF97239603EAC04E00002BE83DBB -:105E0000EADE8E01E0404EF2FEFF3C03FFB6EA56AA -:105E100097434C51BEF9EA2AEAC2EB11960396DB8E -:105E20008804E00383FF4EF3FEEFEAB63C03FFBBBA -:105E300096DB97439823E00583FF4EF3FEE53C0392 -:105E4000FFB93C43FFBB3C53FFC097239603EAC016 -:105E500088048803972BE00483FF4EF3FED58C2142 -:105E60009C91DD56EA9CEA34EA4EEA598E218E0175 -:105E7000DD56EA4148FFFEC88C218E41DD56EA9C82 -:105E800049FFFE16EA4EEA598E218C01DD56EA41A1 -:105E900049FFFD4EEB52EA278E01400080074E027B -:105EA000FEB3EAC148FFFFAE8E2150217FFFDD56D1 -:105EB000EA9CEA34EA4EEA598C218C01DD56EA412B -:105EC00049FFFD36EA274E12FF7BEAC148FFFF4A31 -:105ED000840046110005EB4746110005120084A717 -:105EE0002E37FD21EA3D3C03FD333A6FB83C2E8747 -:105EF000FA209E454110801350107FF641208013F8 -:105F00002EE7F9EB473A55AAEFFC40C1040940D10E -:105F100084092E97FA3D84C04540004846A10002FE -:105F200058A504E84550004C5139855A456000FE9B -:105F300046B1000258B582549670E223E85080EAD8 -:105F4000820A427350734303547350739954510837 -:105F500029B284A04170B40650408001D23046116D -:105F60000007041083C54C19C00B5A88010940F67C -:105F70001406E805803140195C1AD5035010000062 -:105F800002F380008CA1EA49E02FE81513680000B5 -:105F900046110005EB5340F58420105780015CF05A -:105FA000809538458508E8038C21964946F100051F -:105FB000121784A68CE297688D82D5D14611000510 -:105FC000021084A6E22EE9094E93000884213E17B0 -:105FD000FA363C9BFD37D5038CC1D5AF2E67FCF755 -:105FE0004E63001046110005025084A72E17FC08CE -:105FF0009F092E17FC098E21FE64E0A1E928D52512 -:1060000044100064FF8C410104084611000358103D -:106010008E3C84A0D3E880814110C0004C488011A0 -:10602000A5E097FBE0C7E80A46710005027384A764 -:10603000469100058CE1127484A78C82D5F08CA166 -:10604000976850108048D5E7480000002E1FFC0CD0 -:106050004E14004D46510002585284E89DD18420D0 -:106060008C614500004C8225446000FCFBD6E06159 -:10607000E91A80854240C07322F211BAE00FE803AA -:10608000126214B280874240C8734138902022F9CE -:1060900091BAE00FE80540429020126214B28C21C0 -:1060A0009648D5E646410002584204E8FAB68C41CB -:1060B000842080E4446000FCFEECE041E91740529B -:1060C000042022F291BAE00FE803126294B29959C7 -:1060D0004103942022F811BAE00FE8054052142041 -:1060E000126294B28C219648D5E9EC043A6FB80458 -:1060F000DD9E92003A6FBABCEFF43FCFFB1484C030 -:1061000080068CC1546300FF49FFFCAA5A680CFA50 -:106110008400B880B88EEB56021004A62E07F9FB57 -:106120009201E220E82A3C03FD378C019601EAA6A1 -:106130002E37FBBB844AFE9CE040E81FDD4BC003CA -:10614000DD51C81B8400EAA63E07FA26EB20C116E3 -:1061500084E046910002589484E846E1000258E742 -:1061600004588167814780C746D1000258D68254BF -:106170008189810E480000A5C9068400EAA63E0771 -:10618000FA26EB20EB28C0E5EA779604C0E284000B -:106190003E07FA394800013640268420A7113836D8 -:1061A000850080444221C07341148820231894B292 -:1061B0005B18FE04480000928C219648E225E9ED28 -:1061C000B75F80A64E020108EB59106003965CF59C -:1061D0000022EB5910A003974EF3008C9E36E60583 -:1061E0004EF200883CB3FD423C73FD3C440001F498 -:1061F000EA20EA54EB5900000396EB3CEB5900000F -:106200000397EA41145F800149FFFC5246010002F6 -:10621000040000F12E17F9FBF501E220E8088421C3 -:106220003E17FA26441000003C1BFD372E17FB9A40 -:10623000964CC96DC6049F71545280FF4EA2000651 -:1062400050157FFF54A080FF3C1DFEC84E13008CEC -:106250005A00010448000088FA54802A42128873C8 -:106260004014842022F08CAA5EF7815F4EF2007CFD -:10627000C50C9E295015000042100873400484206C -:1062800022000CAA5C0000012E17FD218E21D15B9B -:10629000E0A1E94F4EA2005BFA34804A42228473A7 -:1062A0004016082022108CA94E1200512E17FD20F6 -:1062B0005010FFFF4CA0C04E5A080356B55F840B28 -:1062C00049FFFBCE46010005025004A68400802051 -:1062D0004500002648FFFF7440248820222111BA7F -:1062E000E0024EF2FF6B9611814480C348FFFF66C7 -:1062F0003C0DFEC54E02FF804EB2FF7E4E72FF7C0B -:106300003CBBFD423C7BFD3C48FFFF762E17FA2646 -:106310004E12FF922E17F9ED4E13FF8E2E17FA3DF7 -:106320004E13FF8AB98084013E07FA364800006A9E -:106330009C69FA54806A4230887340160C202210FF -:106340008CAAC9A98C019600D5A68C019600D5AF60 -:10635000E141E809FA3442A2847340A628202215BC -:106360000CABC1AB3C0DFEC5C0279E41854C804E99 -:106370004220A87346110002A09204108139E24124 -:10638000E81B960014AF8001C01AF20150A07FFFF5 -:10639000802842150873A0CA4611000204108139F2 -:1063A000E261E80D802AEAE1800A4410000BEAE18C -:1063B000540500FFD5EA842B49FFFB18B800E60B13 -:1063C000E8049C013C0FFEC5B80E9C013C0FFED3B7 -:1063D00048FFFF763C2DFEC52E37FA1046410002DD -:1063E000584203988020E222E80A38520602E26509 -:1063F000E8038C0196008C219648D5F63E07FA18E2 -:10640000EC0C3A6FBA84DD9EFC6051FFFB783C7D5A -:10641000FEC54E72027A4627FFFF8420B14E510F0F -:106420008068B1A6511F80C8512F80F8504F812835 -:1064300050EF8158513F8188509F81B8EAE2840033 -:10644000B0C23801860A50AF82484430003042A0C2 -:106450008C733802860A3808060A3803060A380898 -:10646000860A3809060A3802060A3807060A380971 -:10647000860A3804860A806AEB2C8C015A080CFEC6 -:106480008C215A180CDE3C1DFECF8540E22746B712 -:10649000FFFF8181800A4013BC1B47410002594A1B -:1064A00000AC4590FFFF4550003050B58FFF47616D -:1064B0000002596B013C397A2B0240250C0846D169 -:1064C000000258D680AC4D7C802840815000502F6F -:1064D0008248418100408440E041E81BE247E813E4 -:1064E000383B0B0204F4000141C1DC01403B086071 -:1064F000A0D98A6FFEDC42F15424423E7073383CCE -:106500003C0AD5054231542438BC0C0A8C41D5E5EF -:1065100038A9820A8C018D415AA80CCF4637FFFF5B -:1065200044B0003050318FFFE001E810502F824816 -:1065300040A100408440E041E80742812C248C4186 -:106540003835200AD5F98C01D5F084004627FFFFA5 -:10655000847F8140EAE2E001E80B3832820A383871 -:10656000020A38A9020A3822020A8C01D5F550BF66 -:106570008248800B854045400030E141E81FB4600F -:106580008441E041E809428150248C413880200256 -:106590004231A001D5F73834AA0AC30D8500E101C4 -:1065A000E80A42F450248D0138203C028A43382006 -:1065B0003C0AD5F68D418C04D5E186A08015869FD6 -:1065C000E001E82AB50B8441E041E80738A58A02DA -:1065D0008C4142842801D5F93888820A8440E04100 -:1065E000E81038A58A024C85400B38A28A024EA4D6 -:1065F0000007B0C2EB2C38028A0AD50A8C41D5F0CC -:10660000B0823803560A3941020A515A80018C017E -:1066100050B58030D5D68015155F8001C80A84003A -:10662000464100025842013C4420FFFF480000ABB5 -:1066300046A7FFFF50A50FFFF2018500454000303F -:1066400082AA86DF872040FC8807E82B3983660210 -:10665000517F824839C8E202437C50738400E001D4 -:10666000E81D38F20202E818383B820239E90202DA -:106670008A7C887EE06FE810CB0C38F282024EF5FF -:10668000005738F30A0AEB2D3988020A8C41D504E9 -:10669000EB2D3987020A8C01D5E3519C8001D5D4BA -:1066A00082F58400E001E80838F20202E803437B47 -:1066B000BC018C01D5F88560E162E80A38F32E024E -:1066C0008D613808BE0288173808BE0AD5F6439196 -:1066D00020008400E001E8B83832020250F00001E6 -:1066E000C31F8A77EB2DCB2138B282023987020291 -:1066F0004EB40011816FE161E81A38222E02CA08F7 -:10670000B0BE38212E02B0FE88573821AE0A8D6106 -:10671000D5F338B30A0A3988020A8C41D50638B94C -:106720000202897738B9020A800FD5D5B0823821A4 -:106730006202B0C23801E20A3982820A4E2500069E -:1067400039880A028002D5F3F0018E01F0814E02F1 -:10675000FF688400E001E8073968020A38A2020AEB -:106760008C01D5F984408002E0014EF2FF6DB0C289 -:1067700038B182024EB4000538030A0A8C418C01FC -:10678000D5F4501F81E898C19860EB3B3822000A8D -:106790008C083B01C420A88947E1000259EF013C65 -:1067A0005A0860F18420462100025821007C86426C -:1067B00044A0FFFF46B1000258B580AC4480FFFD05 -:1067C000464100025842010C81C147410002594A2A -:1067D000011884AC86A747610002596B007086FDE2 -:1067E0005C638003E2274EF20090B0C22F97FA2537 -:1067F000390186022F17FA322E07FD2AE38C43C88F -:106800008024E8083919C20238F14602E80345C07D -:1068100000642EF7FA40E9042EF7FA4CE8072F1728 -:10682000FA17E7A3E8033F27FA17E38CE84C398906 -:10683000C20238FA6000E82982304310947350FF96 -:10684000824838F7C6023914C202559C800F40F7BF -:10685000C4003911620289BC4117C63750FC800759 -:106860004207802440F055F6E3AFE90F2E07FA17F0 -:106870002F97FA3150F00003391B600042FCDC73A3 -:10688000E1AFE821C622C02280104200947350FF7D -:106890008248391782023804C2023CF3FD3B3D03B3 -:1068A000FD3588114307C024E380E92BF81540FF2C -:1068B00060603B0844003B07C42038126008380180 -:1068C000620AD51F8400D502800639068302411072 -:1068D0000C084D054014510F81E84108046083FF06 -:1068E00040FF44003B0844003885830A3B07C4202E -:1068F0003812000838E1020AD5048C015A080CE766 -:106900008C2148FFFF7151FF8488FCE0FC003FCFE1 -:10691000FAC4B9012E07FBD05A18070392013E07AB -:10692000F9E9B814C803EB28C0052E07F9E65A08A0 -:1069300001162E37F9E92E27FBD3B81AFE9CE20286 -:10694000E810EA9A42108C0BC1038C01B89ADD5111 -:10695000C805DD4BC803B800C0328400B89AD52FF3 -:106960008401EAF48400EA8E8440BA918401B89FDD -:1069700046010007EA40DD54DD53D8033E27FA2BD9 -:1069800084085A1007095A18020A2E07FB9F5A0852 -:10699000030684062E17F9F5EA738400EB232E070D -:1069A000F9F5C0038400EB4AB8015A0006045A08FE -:1069B000080746010001580008C0B89DFC80FC0093 -:1069C0003FCFFAC8B913B800C9105A0808074611D2 -:1069D0000005EB53C90AD505661000025A1004F9E8 -:1069E0002E17F9E65A18013284203E17FA04842043 -:1069F000B9995A0008045A080620B9905A080804A0 -:106A00008407D5045A08060684022E17F9E6EA73AD -:106A10008400EB23B8005A080705EB59EAE6D505D0 -:106A2000DD4BC805EB59EA6BB89CD5445A080143C5 -:106A3000EB59EA22D5FA8E03E603E83CEA30B401CA -:106A400058000400B601D5365A08062C2E27FBEA5A -:106A5000840AFE84842046410001584208C0465101 -:106A60000001585285603832050138028501E20381 -:106A7000E8039A18D5028A03E040E81046010007AF -:106A8000020007A5461100078C019601120087A598 -:106A9000B805B8908401EA8ED5048C215A18D8E53F -:106AA000B810B905E201E8048C01B890D50384015F -:106AB000EA8EFC80DD4D5A0808052E27FBA6D50E70 -:106AC00084405A08060C2E27FBB146010007EA4015 -:106AD000DD54DD5383FFD802EAE48420800146318F -:106AE00000015831871038F18511E04FE8065CF05D -:106AF0000095E8038C0196018C215A18D8F64611AE -:106B00000005EB4746110007045083C5EA5AEA47DF -:106B1000D911C00E2E07FA2B8C019600E6023E0713 -:106B2000FA2BE808840046110005EB47DD9E3E077E -:106B3000FA2BDD9EFC20DD4D5A0808092E07FBA626 -:106B4000940196032E37FBDDD5175A0806112E0740 -:106B5000FBB12E37FBD946110007045083C5EA5A12 -:106B60009401EA479603D10696D9D5068400806041 -:106B7000D5034430009684403C6DFECE940280A242 -:106B800046710002587384E88202471100015918C7 -:106B9000871098570210879A384308019B0C972159 -:106BA00096634E150007E0618420E8079A63D504D8 -:106BB00088234210C001964B3818880988204E144B -:106BC00000048CA197698C425A29B0E52E07FC0D70 -:106BD000E205E80C460100010000055C46110001D9 -:106BE00058000007EA958401EA8AFCA0FC002E57B1 -:106BF000F9CA8CA197683E57F9CA2E07FBEBD80853 -:106C00008421EAF78446DD4E3E07F9DAD50AE2052B -:106C1000E8083E07F9CA2E07F9CB8C013E07F9CBED -:106C20002E07F9CB5A08142784218446EAF7DD4E53 -:106C30003E07F9DA84203E17F9CBFA2EC8132E0747 -:106C4000FBECFE443C1FFEB7EB56EB375CF0003329 -:106C5000E8052E07F9E0E60BE90DEA213C0BFD27DC -:106C6000D5092E07FBD2FE442E07FBD3FE443C1F62 -:106C7000FEB73C03FD27C0048E013C0BFD27FC80C2 -:106C8000FC0046690000506300E8B406920C960FC1 -:106C90005A000305EAEFDD4FD5F9EAF78420844175 -:106CA00044300071DD4CFC80EA72DD9EEAD0C00405 -:106CB00084003C0FFED0DD9EFC403FCFFAC480E054 -:106CC000840080C14641000158420D9480A04430A8 -:106CD000FFFF50100008882484408C41B6A1143076 -:106CE000FFFE1430FFFF8C2C5A2804F950000030AE -:106CF0005A0A40F1840046210002582100ACEB4CB6 -:106D00003811000A98C28C08A8595A0860FBC704B9 -:106D10002E07FC03D507C6042E07FC05D5032E0756 -:106D2000FC078C01EB212E07FA355A080104840276 -:106D3000EB21EA8F8520EB0E3E97FA263E97FA3636 -:106D400084403E97FA2FBA94BAA2EB56122004A6BA -:106D5000BA9EBA97BAA03E27FA19BA9C3E97FA2A69 -:106D6000BA9AEB1392478C4196903E27FA3C3C1D11 -:106D7000FF4792278C2196483E17FA2C2E07FBB628 -:106D80002E47FD2A3E07FA255430000F4251902429 -:106D90009204402288563C2BFD362E27FD2BFF0403 -:106DA000FED4FE14401184363C1BFD403C4BFD3BA1 -:106DB0003C0BFD352E07FBB55410000F3E17FA179C -:106DC00092043E07FA322E07FB9D92043E07F9EE2D -:106DD0008402B88FB8A42E07FBA0DD4A3C0BFD3A15 -:106DE0002E07FBAADD4A3C0BFD3E2E07FBABDD4A1E -:106DF0003C0BFD3F3E97FA093E97FA373E97FA0A59 -:106E00002E07FBBEEA982E07FBBFEA8C2E07FBC1BC -:106E1000401010093E17FA1D961F842AFE0C3E07EB -:106E2000FA012E07FBCB3C0BFD43C60B2E07FBC61E -:106E30005410000F3E17F9FE92043E07F9EFD513E8 -:106E40002E07FBC45410000F3E17F9FE92043E07B4 -:106E5000F9EF2E07FBC55410000F3E17F9E7920417 -:106E60003E07F9FF4601000158000FE0843F844CC3 -:106E7000DD4284003E07FA162E17FBD68400400040 -:106E800004063E07FA022E27FBCE3E27F9EC2E37EA -:106E9000FBCFFA244221847396903E27FA0EC0025B -:106EA00084443E27F9F22E07FBD084403E07F9E9DF -:106EB0003C2BFD393E27FA3D3C2BFD343C2BFD3865 -:106EC0003E27FA393E27FA243E27F9E33E27FA0601 -:106ED0003E27F9EA3C2BFD3D3E27FA203E27FA00EB -:106EE0003E27FA2B3E27FA182E07FBC03E07FA1062 -:106EF0002E07FCF85410000F3E17FA2392043E07A9 -:106F0000FA3B2E07FCF95410000F3E17FA299204A1 -:106F10003E07F9E23E27FA40CF033E27FA4C8400B1 -:106F20003E07FA443E07FA493E07FA413E07FA4255 -:106F30003E07FA4584203C1BFD5B3C1BFD573E177A -:106F4000FA4AEAEA8420B9AAB9A92F0FFB9B4F0598 -:106F50000003842284803E17FA3084603E47FA465C -:106F600084403C3BFD5CBAA82E57FC62EA21FF44FA -:106F70003C5BFD5A2E57FC63FF443C5BFD5E2E5785 -:106F8000FC64FF443C5BFD552E57FC65FE2C3C0B1E -:106F9000FD5D2E07FC663C0BFD582E07FC673E0787 -:106FA000FA472E07FC693E07FA4B3C2BFD563E374D -:106FB000F9E8BA933E47FA213E47FA1C3E47FA2EBB -:106FC0003E58049480033E4801343802890938024F -:106FD00009098C4184605A28D8FA8400B8803E3769 -:106FE000F9DBEB32B8823E37FA3A3E37FA3E3E37AB -:106FF000F9ED2E07FC5A402010093E27F9F6961F9E -:107000003E07FA1FCF113E37FA0446010001103047 -:10701000055C460100011030055D8401EB483E37F8 -:10702000FA28BF8ABF90C604EB59EAE6D5124F048E -:10703000000CC908DD4BE6013EF7FA4C84013E071F -:10704000FA30DD4BC804EB59EA6BD503EB59EA2261 -:10705000B89D84E0442005103E77FA088420EB5662 -:10706000EA44DD423E77FA048401EB4A84C03E776D -:10707000F9E6BE9149FFE3FBEB56126004A83C6BB6 -:10708000FD373E67F9E53E67F9F33E67FA153E675F -:10709000FA2D3C6BFD304601000510600A7E46016A -:1070A00000051260053E46010005106009EA460130 -:1070B0000005126004F446310005583189ECEA32CB -:1070C000462100055821095898733801980A38015B -:1070D000180AA8091070800898728CCCA809107042 -:1070E00080085A6890F384003C0BFD53FCC02E27A7 -:1070F000FA355A1802053E27FA0DD50E8E07E6021C -:10710000E8052E07FC04EADFD5052E17FC06400132 -:1071100004403E07FA0D84003E07F9F1EABEEB0B8E -:10712000DD9EFC403FCFFB00DD51C803DD4BC019A5 -:10713000B8005A0002092E07FBC8DD4AEA202E07D4 -:10714000FBC9D5072E07FBCCDD4AEA202E07FBCD75 -:10715000DD4AEA54EAFA9402EA20EB409402D5268A -:107160002E07FA13C812B8005A0002092E07FBC8EE -:10717000DD4AEA202E07FBC9D50E2E07FBCCDD4ADF -:10718000EA202E07FBCDD507EA90961FDD4AEA20BC -:10719000EA909204DD4AEA54EA82C0092E07FC5BB9 -:1071A000DD4AEA202E07FC5BDD4AEA54EAF9EB1ED1 -:1071B000DD524200180BC006EA285A0801044900B3 -:1071C0000571B80FB905E201E80CC00BEA82C009ED -:1071D000EAFA9401EA20EB409401EA54EAF9EB1E42 -:1071E0008400EB3DDD524200180BBA05C02EB808F2 -:1071F0005A08012CE642E929EB5900100380EB59AB -:1072000000000382E201E8039A08D5028A012E37C2 -:10721000FBF2E003E81AEB5900100381EB59000080 -:107220000383E201E8039A08D5028A01E003E80D2E -:10723000EB5904000118461100020410811B920151 -:10724000E220E8038401EB3DB80FE240E8152E0789 -:10725000FA13C012EA82C8102E07FA27C80DDD4BB8 -:10726000C80BEA90961FDD4AEA20EA909204DD4AB4 -:10727000EA54EAF9EB1EB805C01E461100020010E0 -:107280008380EB598E2100000381FA5442008873F9 -:1072900046110002581084E84000802022F00CA91A -:1072A0002E07FBA29401E00FE8068400EB0EEA4AE9 -:1072B000C111D50E3C03FD315CF003E8E80B8C01F5 -:1072C000EB0E3C03FD2D5CF000C8E8048C013C0B88 -:1072D000FD2D46010007045003C4DD54DD53D80BD7 -:1072E00049FFE861EA7F5CF00064E80E8C013E072C -:1072F000FA21D50ADD52EA9FC8F4EA285A000104AF -:107300004800008AD5EEDD515A080158B808C0552A -:107310003D2DFEC5E212E851EA7FE603E94E2E67F5 -:10732000F9FD2E57FA1247310002593983802F0791 -:10733000FA2E84E08133E2F2E8369C39551000FFE2 -:10734000809140A49C20E292E82C38399D003819A5 -:107350009100E223E8039B99D5029B8B4004902087 -:1073600000250001A60197B0E202E8039B50D50278 -:107370009B42E2239768E8039A59D5028A23E423C3 -:10738000541780FFC10BE202E8039A10D5028A026B -:10739000E403540780FFC00286018C819720D5D476 -:1073A00080F1D5CA3E67F9FD3E57FA123F07FA2E23 -:1073B0005B0801043F07FA21EA7FE602E904840042 -:1073C0003E07FA2E2E07FA2E5A08010AB808B88589 -:1073D0002E07FA1C8C013E07FA1CD51DC81C49FF5C -:1073E000E66049FFF81349FFE93E49FFEA0AEA2847 -:1073F0005A0801084601000158000D9449FFE3C4F2 -:1074000046010005EA8849FFEAEE46010005EA88E0 -:1074100049FFE56B46010005EA88FCC0460100050E -:1074200058000958DD9E461100055810895846013C -:107430000005EA883B006404F8013B00E4243B00BB -:10744000640483FF3B00E4243B0058003B00D82049 -:10745000DD9E3C0FFEC8DD9E3C13FD593C53FD589C -:10746000D9048400EAEBD5092E27FA40C206C805E4 -:107470008C213C1BFD59DD9E8400EAC8DD9EFC206A -:107480003C13FD5BC904EA70DD50DD423C33FD5B1B -:107490003E5804948C6196D93C3BFD5B840080C0CF -:1074A0004671000558738DE03F0802E4F83FEAB3E7 -:1074B000F8433E280494964BE1A13E4802E4E903D8 -:1074C000F84EE80284C18C015A08D8F35A68010AC0 -:1074D000842096DB80A1F8605A18D8FF8400EA84E3 -:1074E0002E37F9F23C03FD5BE203E9088400EA84ED -:1074F000842080A1F8515A18D8FFFCA0FC203C132E -:10750000FD57C904EA79DD50DD423C33FD573E5852 -:1075100001348C6196D93C3BFD57840080C0467194 -:10752000000558738DE03F0FFF8445106D60452FB7 -:1075300092A083FFEAB338438101968B381801018A -:107540009A518824964B38128109EAB383FF3E286A -:107550000134964BE1A13E4FFF84E906EAB3964B16 -:10756000E03283FFE80284C18C015A08D8E55A68EA -:10757000010A842096DB80A1F80F5A18D8FF8400F6 -:10758000EAC72E37F9F23C03FD57E203E9168400FF -:10759000EAC7842080A138620501380105019603FD -:1075A00040000C1688069601380205093851050975 -:1075B0008C2183FF5A18D8F1FCA0FC0084013E07FF -:1075C000FA443E07FA4684003C0BFD5C84213C1FD4 -:1075D000FED9EAC8EA84EAC7DD50EA708420DD42B9 -:1075E000EA798420DD50DD42FC80FC003C1DFED9A0 -:1075F0005A18011E2E17FA445A18011384403E27C8 -:10760000FA44EB0ACB043E17FA4CD5065A38010966 -:107610003E27FA4C8420490006AD49000AC72E07D0 -:10762000FA458C013E07FA458402D50784035A10B7 -:1076300002055A18030584003C0FFED9FC80FC00AB -:107640003C1FFECE84203C1FFECDDD5746010005C9 -:10765000EA44DD42FC80FC00E201EAFDE80FC805D7 -:10766000EA2F3E1802E4D504EA2F3E1FFF8446218C -:10767000000558210DE0DD48D507C80449FFFF018A -:10768000D50349FFFF3DFC80FC005A00082D5A003D -:10769000062B3C13FD553C0DFEDBE220E9083C13B4 -:1076A000FD5D3C0DFEDAE2208401E80284003E0725 -:1076B000FA4AEA77EAB2C00C2E07FA19C009EAFDC5 -:1076C000C80449FFFEDED50F49FFFF1AD50C840020 -:1076D000EA84EAC7DD50EA708420DD42EA7984203A -:1076E000DD50DD42FC80FC203FCFFAC4EB0ACB0426 -:1076F0003C63FD5AD5075A3801053C63FD5ED5024F -:10770000EB3FEAFD4701000559080DE0C838BD2AE6 -:1077100080E080203F1802E44641000558420C30CA -:1077200038280101392881018A52969338220109AB -:10773000EB0696934E270005EB069693D504EB06D1 -:107740009693FE928822382801018C0188E25A081B -:10775000D8E9400284094010043C44007FFFE20164 -:1077600092E240103C1BE20740703C1BEAFE5CF0DA -:107770000032B9AAE8348C01EAEAD531BD29840087 -:1077800080403E7FFF844641000558420A803818F9 -:107790000101391381018A31964B38120109EB45F9 -:1077A000964B4E170005EB45964BD504EB45964B93 -:1077B000FE4A8C0188415A08D8EC400284094020D6 -:1077C000083C44007FFFE20240203C1BBAA9EAFECD -:1077D0005CF00032E8038C01EAEA84E0EAFEE60AA3 -:1077E0004EF300E2EA4CC018B92A5CF09195E91713 -:1077F0003C03FDBE8C019601E60BE902840A3C0BBA -:10780000FDBE3C03FDBEE603E8045CF09B59E907BE -:107810008401EAE9D504EAE93C0BFDBE4601000714 -:10782000EA40DD54DD53D8098400EAE94E330062B2 -:10783000506307D097B1D5034E33005CEAEDB92A07 -:10784000E201E90D3C23FD5DB929E241E908E207C7 -:10785000E906EADAC8042E07FA43C0068401EAEB17 -:107860008400EAC8D504B81449FFFDF8B829B92A3C -:107870008806E201E905EAED88C0E2C7E803DD51C8 -:10788000C8072E07FB7BC8042E07FA43C003EB286A -:10789000C006B813660000025A0801122E0FFB9BA7 -:1078A0004E04000E46010007EA6AEAB0EA85D007F6 -:1078B00046010007EA6ADD54DD53D8084601000797 -:1078C000EA6ADD54DD534C504066EB194601000274 -:1078D000EA6B5010051049FFFEB4B8135A080104B2 -:1078E0008402D5055A000303EB448400B893EB44AB -:1078F0005A300103EB443C13FD5DB829E220E90650 -:107900003C13FD55B82AE220E8068401EAEB840026 -:10791000EAC8D504B81449FFFDA1BA2AB82988C21B -:10792000E2C0E805EA60C103EA4AC106B91366107D -:1079300080025A1801122E1FFB9B4E14000E461196 -:107940000007EAD9EB3EEB24D10746110007EAD93C -:10795000EA5AEA47D90746110007EAD9EB3EEB2479 -:10796000D91988025CF03A98E8122E07FB7AE61AD9 -:10797000E90C84003E07FB7AEB1946010002EA227B -:1079800050107AF048FFFFA98C01D50284003E0711 -:10799000FB7ADD51C003EAEFD505B800C004B8009A -:1079A0008E01B880DD4B5A08012DEA72C82AEA4AD6 -:1079B000C928EAEDBA2AE240E8243C03FD5DBA2971 -:1079C000E240E81F46010007EA6ADD54DD53D019A2 -:1079D00046010007EA6AEAB0EA85D0133C03FD5687 -:1079E0005CF001F4E8038C01D50D3C1BFD56EB194E -:1079F00046010002EA2250107AF049FFFE22D50427 -:107A000084003C0BFD56B9142E07FA46C00FC90E70 -:107A10003C03FD5C2E27FA47E240E8063E17FA4693 -:107A20003C1BFD5CD5068C01D50284003C0BFD5C43 -:107A3000FCA0FC003FCFFB142E07FA4AC8052E0716 -:107A4000FA2DC802EA8A2E07FA14C02D8400EA8AA9 -:107A50002E17F9ECB80CE220EA9AE8224220840BB7 -:107A6000C21FBA00C2042E27FA2DC21AEA285C10DF -:107A700000018401EA94EA285A0001048407D5022F -:107A800084028422EA73EA2880C05A08010EEA3E82 -:107A9000C804EAB4EACED5083E67F9DED505EA6E39 -:107AA000C1038C01B88CFC80FC0046010007EA4051 -:107AB000DD54DD53D844EAB7C842EA4CC8483C1DFF -:107AC000FEC0C1065A10030744000190D505EA8F95 -:107AD000D5034400032046210005022104A8E20248 -:107AE000E902CA038405D504EB03C0048E013E07F6 -:107AF000FA00EB03C0068400EB41EAB0EA85D50545 -:107B00008401EB41DD54DD5346210007140103FDE0 -:107B10002E07FA205A08011C5A18021A4400005075 -:107B2000EA3344000078EA46DD51C803DD4BC00F5C -:107B3000EA21EA33440000DCEA46D5098400EB413F -:107B4000EAB0EA8546110007140083FDFC80FC00C2 -:107B50003FCFFAC8B80EB8A346110007045083CF30 -:107B6000EA5AEA47D10746110007041083F95A1868 -:107B700006048403D51246110005021084A83C2394 -:107B8000FD3AE2418420E805B98FC008B98ED506D8 -:107B9000B9895A0002048402B88EB80EC80A2E07AA -:107BA000FBA1EA333C03FD3EEA462E07F9FED52A47 -:107BB0005A08021EB816E6052E07FBA2E9052E1785 -:107BC000FA3DC9029201EA333C03FD3FEA462E0723 -:107BD000F9FEEAA52E07F9FFEAAF2E07FBBEEA98E9 -:107BE0002E07FBBFEA8C2E07FCDED5175A080319B7 -:107BF0002E07FBA3DD4AEA333C03FD3EEA462E078F -:107C0000F9EFEAA5EB30EAAF2E07FBBCEA982E07A6 -:107C1000FBBDEA8C2E07FCDDDD4A3C0BFD41EAB1E1 -:107C2000C022EA4CC8202E07FC4AEA332E07FC4C3F -:107C3000EA46B9162E07FC4FC104541000F0D503D4 -:107C4000401010093C1BFD32B91D5A180105961F42 -:107C50009402D502EB30EAAF2E07FBBCEA982E0760 -:107C6000FC4EEA8CB8005A0807052E07FBA5EA333C -:107C7000EA72C0042E07FBB1EA33DD51C805DD4BC3 -:107C8000C803EADAC0072E07F9EFEAA5EB308C0546 -:107C9000EAAFB81EC0038400EAA549FFFF07FC80D5 -:107CA000FC203FCFFB142E57FDC52E47FDC4842278 -:107CB0009AAC8C41402104562F07FDC688442E778C -:107CC000FDC796104621000200210381466100078E -:107CD0009A824231000340281C018C414011043635 -:107CE0004621000288270021038096489A8A422173 -:107CF0000003884396D1123307B52E37F9EDCB2117 -:107D0000B800C0594601000100100FECC9542E07FD -:107D1000FC58E002E8132E07FA3E8C0196003E075D -:107D2000FA3E2E07FA3E2E27F9F6E240E844840197 -:107D30003E07F9ED3E17FA39D53E3E17FA3ED53BE0 -:107D4000BA03CA07BA00CA053E27FA3E3E27F9ED34 -:107D50002E37FC5C46210002042100E6E262E82B9B -:107D6000FA76804042238C7346610002586304E82F -:107D700040230820222114B25A20FD1E42080C7311 -:107D800040230020220114B25A00FD16FE5C980C1C -:107D900040030020220014B25A00FD0E88A1405377 -:107DA0001420220294B25A00FD0784003E07FA3ED6 -:107DB0003E07F9EDFCA04619000004008030EA51AE -:107DC00014008030DD9E46190028A4CA8441402159 -:107DD000000C40218812AC8A501080744010804002 -:107DE000A608DD9E460900888421EA99441FFFA564 -:107DF000101000E04602A11850000300461300B91D -:107E0000B6014600066550000500461300EBB601BA -:107E1000DD9EFC40812180E080C28143DD44F80F7B -:107E20004643000088448420DD5910A10000EA99EF -:107E3000FCC0FC40812180E080C2DD444024A808D1 -:107E400040211D80884683FF463300008843A610EA -:107E5000461900888440102080A8FCC0FC40812086 -:107E60008141DD44462300D18922006480004629F7 -:107E70000088840097B0100100A880E24EA200059F -:107E800058630001D503546300FEDD448400106490 -:107E90008000100380A8FCC04638000084405031A8 -:107EA0008034B403461800009604C0065A20642D9E -:107EB0008C419690D5F75A206428A80CA08C50408D -:107EC000802058210080A88CA08C66211F0058219A -:107ED0000700A88CA0CC442CFFFFFE9E4221440842 -:107EE000A88CB604B464462F0FFFEAE2FE9E46302B -:107EF0007000FE9FB644B44442217808B6448444DE -:107F000010208024DD9EFA11DD9EFC63F081EB657C -:107F1000EB3844000400F201DD48EAA281604E0320 -:107F200000A346EFF00F818050070FFF84C185A4A6 -:107F3000F084EB8158000004387034008C0138A6BE -:107F400080004E720087540500FB8500F083E30734 -:107F50004EF2007940043400EB655810800088012F -:107F6000009000065AA0BD695AA8E90C540480C0CC -:107F70005A08C00554E4803FD50F85C1C00DD50B0C -:107F80005AA8C1082E07F9DF81C65A080106D5563E -:107F90005AA0B60A81C688C89630F081EAD784C351 -:107FA000F082D5072E07F9C45A00FFF681C6D546E0 -:107FB000800A802CF2028069EA4F5AA0B940F0038F -:107FC0005A00B23D5AA0E93B800A802CF202DD4EF5 -:107FD000F0854C900034EACBDD4F9E319780F3055D -:107FE000CEE846010007042003F0F104EB01402530 -:107FF0000804142003F0040003F0442F00FFFE8661 -:108000004021310446010007142003F0040003F06E -:10801000816AFE0EF101406006044601000714600B -:1080200003F0041003F04010A008922840108F04C1 -:10803000141003F0D50381C681898D0180CE48FFDD -:10804000FF888CE240D69C005CF684004EF3FF7300 -:10805000DD4444100078460300E71010081F842018 -:10806000DD59EA99800BFCE346090008025000083C -:10807000441035CAD10312100008DD9EFC00EA80CE -:1080800046103000EAC48C21EB36B4029604C004DA -:108090008E21C9FCFA14FC80FC00DD44DD44840020 -:1080A00046130010F81BEA50FC80FC00DD44DD4460 -:1080B000840046130011F812EA50FC80FC00DD44F5 -:1080C000DD44840046130029F809EA50FC80FC00D6 -:1080D000DD44DD44840046130028AE0846190088BC -:1080E000100080A883FFEA50FC8046090008A546DE -:1080F0004410AC53D104441FAC53AC46DD9EFC008D -:10810000EA80EB1BA446C1038420AC46FC80FC0142 -:10811000EB1D001F8000840140308002001F8001A1 -:10812000EB35FE4640118420003F8002FEC6401021 -:108130008C60003F8003FEC640108C80FE1640001D -:1081400080A0EB46EB42EA74FC819E41E623E81BEB -:10815000DD5C844010208094844110208094EA37B4 -:108160005A0002085A00030AEA631200800AD5097D -:10817000440000A5AC0ED505440000551200800C4B -:108180008400DD9EFA02DD9E46204C4B5021040007 -:10819000E241E918E604E816FC01F08180C18400A0 -:1081A000F101DD5B3C1DFEE1FA44FF8C8400F1012E -:1081B00040230857F82C8400F1018448F82D8400EE -:1081C000FC81FA02DD9EE604E82BFC4080E0812180 -:1081D00084018027DD5B464900808C8440421CA0DE -:1081E000441000658E219648B464B404C11B4060FD -:1081F0000C04CEF940248809EA21421100242E27DC -:10820000FAE28401402088578027884049000AEA22 -:1082100084018040802749000AF08006D504FA02D4 -:10822000DD9EFA14FCC04618006000008014EB16B6 -:1082300010008014DD9E46080060001000108401CC -:1082400040000412DD9E0000FC01100F8007EAAB25 -:108250009600E606E8403EFFD86438078000EABA98 -:108260004A003C0024060C12181E44600055D50E2E -:1082700044600066D50B44600077D50844600099DF -:10828000D505446000AAD50284C046190078EAAB3F -:10829000F8034619007000008008EA51EB0983FFDB -:1082A000EA57EAB2C80EEA7BC80CEA37040080102D -:1082B0004200440BC806040080104200480BC00373 -:1082C0004460005597B1EA35126000506400000028 -:1082D0008400D502FA02FC81FC2084A050210024F5 -:1082E00080854520004847110007591885002E3722 -:1082F000FD21E083E81882114302487384602E67F1 -:10830000FD20E066E80D38780D01999D40701C2035 -:10831000A5F84060982097FBADF08C61D5F18C8179 -:1083200088A2D5E6FCA0FC213FCFFAC0F081DD4653 -:1083300080E180C2DD40C00284C4DD5FC019DD453C -:108340000230009C0200000A8A604031A408BB8011 -:108350003C3DFEB0FEDABB868006490009B8B9068E -:10836000F001DD5042700873804749000A10FCA1FB -:10837000FC00E6284EF2016F9E82E6474EF2016B4A -:10838000443001903EFFD9943827880040F13C00EA -:108390004A003C0008080808080E0E004420D64099 -:1083A000D5034420D32042208C730031016C8022FD -:1083B000EAC4103100283C3DFEB28E67E662E80F49 -:1083C00046310007045183C4463A55AA5031855AB4 -:1083D000D3062E37FB9B4231900BC30504308052ED -:1083E00014310030EA530030816D103102BC00308E -:1083F000816E1031002C0030816F10310238043052 -:1084000080441431008D043080451431000E00305A -:108410008170103100400030817110310044003013 -:10842000817210310048003081731031004C0030EF -:1084300081741031005000308175103100640230B9 -:1084400080A612310012023080A71231008A023059 -:1084500080A81231001E00308176103100280030D3 -:1084600081771031003400308178103102AC003057 -:108470008179103100180030817A103105680030A0 -:10848000817C103105780030817D10310504003089 -:10849000817E103101300030817F1031012C00309D -:1084A0008180103101DC003081811031029C00306C -:1084B0008182103101D8023080A91231009A023035 -:1084C00080AA1231009C023080AB1231000A0230C7 -:1084D00080AC123100F8023080AD123100FC023065 -:1084E00080AE123100FE023080AF12310100003048 -:1084F0008183103102040430804614310038043086 -:1085000080471431003900308184103100CC0030B4 -:108510008185103100D0023080B0123100F6043075 -:1085200080481431007804308049143100790230D9 -:1085300080B1123100F4023080B2123102B8023040 -:1085400080B3123100B644300078143100B10430E9 -:10855000804B143100B34430007D143100B404303A -:1085600080381431015F04308039143101600430E7 -:10857000803A143101610430803B143101620430CF -:10858000803C143101630430803D143101640430B7 -:10859000803E1431016500308186103100D80430EE -:1085A000804D143100300430804E143100310430DD -:1085B000804F1431003200308187103100B000301C -:1085C0008188103100B400308189103105BC04303D -:1085D0008050143100B204308051143100B00030AA -:1085E000818A103101580030818B1031015C0230DA -:1085F00080B44652000012310094502280E0B461F1 -:10860000B665B485B4614C41FFFC8CA48C24DAF8C7 -:1086100049FFCC69EAD54600000D000004A58E0193 -:1086200096003E07F9D04600000D000006358E0189 -:1086300096003E07F9D7EAA280C0C80EEA21DD4FB6 -:10864000DD4D8E07E602E8088421DD45101002A00A -:10865000D503FA02D5028006FC809200FC4084C05B -:1086600080268401DD5B80268CC1840097B0DD5BB1 -:108670005A6804F884E03E77F9DD466800208521D9 -:108680003E97F9C110730168EAEF1073021410737A -:1086900002A0107300FC107300B0107300841073FC -:1086A00001001073008C1073001C10730020DD4F4C -:1086B00010930020EA2110730094EB4F8E01C8FE46 -:1086C00084214628003010130094120100E4101396 -:1086D000009046190068AE08DD4D8E07E602E80CF2 -:1086E00046010007045003C4DD54DD53D004DD52BD -:1086F000EA9FC002EA768420EA8BAE4044200A203A -:10870000EB8158000B148420DD42FCC0FC003FCFFD -:10871000FAC8DD458421EA581010001C10100084AE -:1087200010100080EA86EB54EA69B4A0EA53D9FE3F -:1087300084C1106100FC10610100B8008E07E602E0 -:10874000E80EEA76DD59EAA746090020B420581061 -:108750008800B620B42058108400B6208401EA7E38 -:10876000B8008E02E604E805FA38DD45101000D89E -:10877000B8005A0804098401490009A48421DD4590 -:10878000101001CCB8005A08020984034900099A64 -:108790008421DD45101001CCB8005A0806074410AA -:1087A0003F7EDD45141000ADFC8046010007DD472B -:1087B000461100079600DD49EA3504100015923095 -:1087C0009648C10700100050541080FE1010005051 -:1087D00004000016EA3792109600C007000080508F -:1087E000540000FD10008050EA35041000175A189C -:1087F000A510FC004410008714100017F9A5840090 -:10880000EB46EB42EA74EA80EA8FDD4FD5FD460184 -:108810000007DD4746110007960058000100DD49BA -:10882000DD9EFC0046010007DD474611000796006B -:1088300058003000DD49EA350410003A83FF421049 -:10884000E00BC108441000491210000E84201210E1 -:10885000000E0400003A4200680BC004840249FF85 -:10886000FC7646010007DD474611000796005800D8 -:108870003100DD49FC80FC0180C046090020A08455 -:10888000B646A005B601B4664211C40BC904422124 -:10889000C00BD503844180224201C80BC003844130 -:1088A00084224201CC0BC003844184234201D00BBB -:1088B000C003844080224231D40BC308DD5F9600A0 -:1088C000DD5A49FFD07E84408421B4064200580B13 -:1088D000C0203C0DFEB45A08011BDD4D5A08061895 -:1088E0002E07F9D5E608E810842A8402EAB82E1784 -:1088F000F9D58C2196483E17F9D5944A9C0A540024 -:1089000000FEEA81D50484008422DD5B8440842259 -:10891000B40684C142005C0BC007DD52FE36C019AC -:108920008006EA62D516C2105A18020BF181EA805D -:10893000F1018001441007D049FFFC47D50C8006A7 -:10894000DD5BEAC6D5085A1002078400DD5BD5035B -:108950008423D5FCFC81FC40469300CBDD44DD4400 -:10896000000488024669008884E054A0007FEB2A56 -:10897000DD4410A48802EB2ADD4400048805EB2ABC -:108980009203FCC0FC6046A300CB80C0DD44000520 -:1089900008054679008885209617EA9B4060186490 -:1089A000DD44DD4400050802EA9B54B0007F97B027 -:1089B000DD4410B50802EA9BDD4410650805EA9B1A -:1089C000FCE02E07FB80C034FC00EA8BA18349FF4A -:1089D000FFC446210000025103014420A55A802013 -:1089E000DA094621000000510600D004000106000B -:1089F000D51C3C2DFEE4E246E804C0128E01D508E9 -:108A00003C2DFEE5E2C2E806E61FE80A8C0196402E -:108A1000D507440FA55A4621000012010301460163 -:108A2000000010100600800149FFFFAEFC80DD9EB3 -:108A300046090090EB3458108004EAAC84201010F2 -:108A40000068EB50541080FBEAADDD9EC320FC00B3 -:108A50003E07FB803C1FFEE1465000F43C2FFEE247 -:108A6000998A3C3FFEE38A225042824042531024BE -:108A7000FF0C40528CB740320C773C5FFEE43C3F29 -:108A8000FEE5C00749FFFFD68400D503FA00DD9E4E -:108A9000FC8046090090EB34EABDEAAC842010105B -:108AA0000064EB50541080FDEAADDD9E4609009055 -:108AB000EB3458108001EAAC842FEA5FEB5054107D -:108AC00080FEEAADDD9E3E07FAE084603E37FAE1C3 -:108AD0003E17FAE23E17FAE33E27FAE4C007FC002D -:108AE00049FFFFD949FFFFE4FC80DD9EFC204608DA -:108AF00000504669000084E0B4001273004C460048 -:108B0000000F040002C0EAA2C82F3E77FB80441089 -:108B100001F43C1FFEE1842A3C1FFEE2441002588F -:108B20003C1FFEE3461000CF501088503C1FFEE46F -:108B3000461000C75010861A3C1FFEE54410008006 -:108B4000844549FFFFC249FFFD8B490005AE8409FA -:108B5000EB46EB42EA74EA50C807441000DA1213FD -:108B6000001A1213001EFCA02E07FAE0C0094619D5 -:108B70000090A608EA51AE0884013E07FAE1DD9EA6 -:108B80002E07FAE0C010EB15EA8B5A180809A0412D -:108B900084203E17FAE100000060D505A0028400A1 -:108BA0003E07FAE18400DD9E462800200211009C69 -:108BB0000231000A0201000A8A23964B8E099601AF -:108BC0009EC91201009484804609006896D9AF00BE -:108BD000ACC21040000884831040000C0241009A8F -:108BE00046220000402110568C419041A885442027 -:108BF00000301020002046204000401104368C2117 -:108C0000902114100009842112300014AE40DD9E22 -:108C1000FC013FCFFAC82E27FB9C4221140BC20750 -:108C200046390020A09966210008A899F181BA0070 -:108C3000BA83B880B61F2E27FB9A92473E27FB8047 -:108C400084413E27F9CF3E27F9CD49FFFD09F101C7 -:108C5000B41FC10349FFF24DB8008E02E607E820B9 -:108C60003EFFE2703807800040F03C004A003C00C4 -:108C700008080808141C2400EAE7EA75EA2C8400B6 -:108C8000E201D50C8406EA7585E2D508EAE7EA75C3 -:108C900085E0D5048406EA7585E13CFFFEBAEA5713 -:108CA000EB29C01684008422DD5BB8005A08060D4B -:108CB000840249FFFE698402B882EA30A0095800A4 -:108CC0000008A809D505FA00EA818400B882B80036 -:108CD000B90849FFFB4FC826B9008E27E622E81CD9 -:108CE00046110007045083C4EA5AEA47D1152E17EB -:108CF000FB9B4210900BC910B61F84253E17F9CF7D -:108D0000EA80B41FDD5C120082B8441007D08402F0 -:108D100049FFFA5BD507B61F49FFFF4849FFFCF83A -:108D2000B41FFC8146180020501085C8A688DD4578 -:108D3000CAFEFC008421101002A0EB155A18070D82 -:108D40004610000D02108242121002B84610000DAB -:108D500002108243D50D5A18080E4610000D02105D -:108D6000830A121002B84610000D0210830B121075 -:108D700000B6DD5C020082B8021080B649FFCAA6C8 -:108D8000EAA2FC8046080020001000F8EB54EABD7F -:108D900010107DBCEA86EA69B4A0D9FFDD9EC0044C -:108DA000FC00EA76FC80EA370400803066000001AF -:108DB00014008030DD9EFC413FCFFAC84601000719 -:108DC000DD4746110007960058005000DD4946690E -:108DD00000200403000AB61FB41F66000002B61F7D -:108DE000F081F00166000004F081B61FB43F8400FA -:108DF00049000534801FB04149FFFD3FB41F4200C8 -:108E00002C0BC02F46010007DD47461100079600D6 -:108E100058005100DD49B40666000800B606B800E7 -:108E20008E07E602E807840049FFFFBBDD59842175 -:108E3000EAF8B8008E07E602E81484028420EA5DAE -:108E400084058420EA5DEA30B40184C1580004003E -:108E5000B6018404EA7EDD59EAA7EA7BC002EAC6CD -:108E6000B41F4200280BC02946010007DD47461108 -:108E70000007960058005200DD49EA30B401660050 -:108E80000400B601B8008E07E602E804DD5984212B -:108E9000EAF8B8008E07E602E81084028421EA5D51 -:108EA00084058421EA5DEA30B401EB00B601840256 -:108EB000EA7E8421DD59EAF8B41F42004C0BC00D54 -:108EC00046010007DD474611000796005800530091 -:108ED000DD49840049FFFF65F6014263380BC60493 -:108EE00049FFF905D516F00142003C0BC01246932C -:108EF00000BB855F4679008849FFF903DD4410A473 -:108F00008003106380A8DD4410A48009106380A84A -:108F1000F001EACDC026DD4500000340B90096000F -:108F20005A180614C0035A08071DB9025A18020439 -:108F3000480000A284013E07F9D58406EA81842A0C -:108F40008402EAB84800009C5A18020CC0035A0870 -:108F5000070984008422DD5BFA00EA818400B8827C -:108F6000F001EA4D4E020046DD46DD4080C0C809F2 -:108F7000DD44460300BC8427AE41DD59106000A8E3 -:108F800046010007DD4746110007960058005400CF -:108F9000DD4984008421EA9449FFF947840EDD40CD -:108FA000C00449FFC95CD523FA02DD40C8FBFA06BC -:108FB000DD40C8F8840ADD40C8F5FA0ADD40C8F291 -:108FC000FA13DD40C8EFFA0EDD40C8ECFA18DD40B8 -:108FD000C8E9FA1CDD40C8E6DD46DD40C8E3DD58DF -:108FE000DD40C8E08407842149FFFE148400D537A2 -:108FF000F001EAB2C036DD46DD4080C0C809DD447C -:10900000460300BC8424AE41DD59106000A88402F0 -:109010008420EA5D84058420EA5DDD44843F4603C4 -:1090200000D1AE438420DD59EA9946010007DD47AF -:1090300046210007960058005500120107A03E1770 -:10904000F9D13E17F9D684008020EA9449FFF8ED63 -:109050002E07FB9E842149FFFDDD84013E07FB7F37 -:1090600046010007DD4746110007960058005600EC -:10907000DD49FCC15A00070448FFFF74840148FF22 -:10908000FF70FC00EA2C8442C9028443E607E8042E -:109090008E019600D5195A08071484004611000560 -:1090A00058108F908444EA55DD5FC0112E07FA41B5 -:1090B0003E07FA428C0196043E07FA41D5088E0815 -:1090C0009600E606E804EB65EA43EA55FC80FC00FE -:1090D0005A00060448000072F874B4A2DD45D9FEB7 -:1090E0008380B90E4210D408B98EEAAE4410FEFF58 -:1090F000FE56EA48EAAE83FF4410FBFFFE56EA48FC -:1091000083FFEA2CC9064611000600108B73D505B3 -:109110004611000600108D03EAACEAADEB312E17C4 -:10912000FA41C1215A100103F84AEB6D00200CFCF2 -:10913000F81DEB6D02500672EB6D02400673EB6D8D -:1091400002300671EB6D0220066FF8204621000602 -:10915000042103298380BA8EF82984401020023824 -:10916000480000B6EB6D00200B6CEA35102000289B -:1091700083FFEB6D025005AAEB6D024005ABEB6D72 -:10918000023005A9EB6D022005A7DD451250009CB9 -:109190001240000A1230009A1220008A83FF4621F2 -:1091A0000006042102C58380BA8EBA0E66210038FB -:1091B000BA8E83FF4800008A5A0007044800008CDA -:1091C000EA53EA865021033CEA6983FFB4A2DD45F5 -:1091D000D9FE8380B90E4210D409B98E2E27FA4CDD -:1091E000EA37CA344621000600210B6CEB4D4611CC -:1091F000000600308B704611000600208B7146116E -:10920000000600108B72F83346110006024085AA52 -:1092100046110006023085AB46110006022085A9E2 -:1092200046110006021085A7F83846110006041002 -:1092300082C51410000E46110006021085A8EA48E7 -:109240004611000600108B6FD54046210006002114 -:109250000CFCEB4D4611000600308D004611000657 -:1092600000208D014611000600108D0210300040D4 -:1092700010200044EB3183FF461100060240867245 -:1092800046110006023086734611000602208671E0 -:10929000461100060210866F1240009C1230000A30 -:1092A0001220009A1210008A83FF46110006041053 -:1092B00083291410000E4611000602108670EA4839 -:1092C0004611000600108CFFEAD384211010019C87 -:1092D00049FFFC6CFC800000FC003FCFFAC846014F -:1092E0000007DD4746110007960058001000DD49D1 -:1092F000DD4584201010008800600340EA5797B0D5 -:10930000EB29C010B9005A18060884008422DD5BDE -:109310008402EA81D5055A1802068400DD5B8400C8 -:10932000B882DD4D8E02E6074EF201873EFFE93836 -:1093300038078101EABADD0F0E00FE026201FE026B -:10934000A001D0016E02EA350410003A9EB1EADCB9 -:109350008401C10846110007EAD8EB0F40008012D3 -:10936000D50746110007EAD8EB0FFE0F960146110C -:109370000007EAA846010007021007F44400DFFFD7 -:10938000FE0E46110007EAA8EAD84400BFFFFE0E11 -:1093900046110007EAA8020087F454007FFFEAA8FC -:1093A00084003E07FB7E840EDD40C005800649FF39 -:1093B000C644EA5BFA02DD40C8FAFA06DD40C8F7A7 -:1093C0005A6001044800013BDD458422EA68842399 -:1093D000EA58EA3BE601EA42800649FFFE549E361F -:1093E000E602E9045A680D0BD506800649FFFE71B6 -:1093F0005A680705B80049FFF0FA5A680303EA6C97 -:109400005A6007185A680A03EA6C5A600D03EA5B4F -:109410008401441004A6EAB82E07F9D1C810EA8BDB -:10942000A640EABDAE40A64058108004AE40D50725 -:10943000DD5F9600DD5A49FFCAC4EA6C2E07F9D1F8 -:109440008C019600E604E803EB07EA6C8400EB0766 -:10945000DD45001003205A101A07001003205A108F -:109460000E03EA6CEA86EB54EA69B4A0D9FF461908 -:109470000090A608C8FF49FFFAA6EA57EB29C009E1 -:109480002E0FFB9A4E04000649FFFA673E07F9C308 -:1094900049FFFB78C037480000D8840ADD40C00887 -:1094A000EA31EA4DC005800649FFC6ADEA5B5A685D -:1094B0000105EA3BE601EA429E319600E6034EF2E0 -:1094C00000B1EA2C8442C9028443EB65EA43EA55C1 -:1094D0005A600303EA5BD5135A6001055A6008031A -:1094E000EA5BDD458422EA688423EA58EA3BE60128 -:1094F000EA4284438400EB65EA43EA55DD5F960067 -:10950000DD5A49FFB988EA5B5A68010ADD458422C1 -:10951000EA688423EA58EA3BE601EA42DD45842111 -:10952000101000BC500000BCA640C9FFEAC5E6030D -:10953000EAC5E90C8E02E0C0E911EAC5E206E90ECF -:109540002E17F9D09C328A01D504E206E9079E3134 -:109550009600EB65EA438443EA55EAC54C60402235 -:1095600084C1DD45126002E0DD5F9600DD5AEA76D7 -:10957000DD59EAA7EA30B401EB00B6012E07FB7E05 -:10958000E609E9078424E6143E17F9CFE806D50278 -:10959000EAC68C013E07FB7EEA7BC0438401D5020C -:1095A0008402EA7ED53E2E07F9D74C60403B49FF46 -:1095B000FADDEAF5DD455A1001058422101000B4E9 -:1095C000842284C1106001CCEA688423EA58EA3B13 -:1095D000E601EA4284438400EB65EA43EA552E073C -:1095E000F9D7DD5C5A00010C106080BC502080BCB3 -:1095F000A6109600C8FEEA53100100B484C11260A0 -:1096000082E0DD5F9600DD5AEA76DD59EAA7EA30AE -:10961000B401EB00B6018404EA7EEA7BC002EAC62C -:1096200046010007DD47461100079600580011006B -:10963000DD498400D509FA02D5075A60080448FFBD -:10964000FECD48FFFEC8FC809200FC008400EA6268 -:109650002E27FBE8842AFE548403EAB8FC802E07F8 -:10966000FB7FDD9E8E01C003EB4FD5FDDD9EFC012F -:10967000100F8007EA92EAFB8420102F800510105B -:10968000000C10100010842110100014EA3A9648C3 -:1096900010100034EA89964810100038EA399648CC -:1096A0001010003CFC818400462100065821014036 -:1096B0009640381100085030006C561080808C01A4 -:1096C00038110C085A086CF6DD9EFC203FCFFAC812 -:1096D00080E0EAFBA640466800309648C9FCB80026 -:1096E0005A08023A49FFCFBFEA535A08011FB92767 -:1096F000C91C2E07F9CD5A080117EA835A00010840 -:10970000EA835A000205EA835A08032FEB2E8400ED -:10971000120080E4DD5C001083405A1803263E07E7 -:10972000F9CDD522EA83D51BEA83DD5C5A00040F0C -:10973000EA645A00050CEA645A000609EA645A0011 -:109740000B06EA645A000C03EA648420EAFB121058 -:1097500000E4D50A5A080409B827C004121300E42B -:10976000D503120300E4EB2E8440FA0C102081B4E0 -:10977000AE0C8405107080C4102080181020811851 -:109780001000800C8401EB09FCA046080030141086 -:109790000032441FFFD8101000341010003884200D -:1097A000101000C046110006581081401210005CD5 -:1097B000969184211220005EAE40A640C9FFDD9E36 -:1097C0004619002810008068DD9E96004619002882 -:1097D00010008060DD9E46080020000004B4DD9E7D -:1097E000E624E809944DC003EB3AD503460900107E -:1097F0008820B641DD9EE624E80C944D9690C00486 -:10980000EB3A8C10D504460900108C088820AE88ED -:10981000DD9EE624E81C944DC010EB3A5030001059 -:1098200088618442AE98A6989690CAFE8C0C8820D7 -:10983000AE88A608C8FFDD9E462900108C48882205 -:10984000AE0844000040AE08A608C8FFDD9E4629C9 -:109850000020B602A851DD9E46290020140100090F -:109860001411000ADD9E46180060B601DD9E460117 -:109870000000EA5CEB17D01646010000EA5C4400E9 -:10988000A33AD01046010000EA5CEB1AD00B460167 -:1098900000000200000084205000455D400080066A -:1098A000DD9E8400DD9E46010000EA5CEB1AD007D5 -:1098B00046010000EA5C44003AA3D83FEA5EC03D9E -:1098C000FC2049FFBF01EAC3EAAA84A098504211D4 -:1098D00000732E07FBFA46310000583180048820BF -:1098E0003C23FD2E44605AA58005D111464100005D -:1098F000024200004C430006992A404204F7ADD8CA -:109900000A4180018CA188049601D5F0FE029601DF -:10991000EB651200800146010000EA5CEB1AD804F6 -:10992000440FA55AD503440FA33AEB6512008000FB -:109930008C413C2BFD2EFCA0DD9EFC00F815421056 -:109940008C0BC908F81CC906020000724200280BE3 -:10995000C03CDD529604C00846090028842110103E -:1099600000688422EA5FEA350210007283FFEADCB5 -:10997000C106460EBEBE50000BEBD514021000729D -:109980004210900B83FFC106460ECECE50000CEC69 -:10999000D50902000072EACDC007460EDEDE500097 -:1099A0000DED49FFB544DD529604C005EA7BC003C6 -:1099B00049FFFE4D840149FFB531440000C849FF0D -:1099C000FE53840249FFF3C3FC80FC00EA50DD44EF -:1099D000EA6384208448DD4E5A0844048400F81069 -:1099E000EA6384208448DD4E5A0077044800005A18 -:1099F000EA2384208446DD4E5A080205840148008B -:109A00000052EA2384208446DD4E5A08030484026F -:109A1000D549EA2384208446DD4E5A080404840391 -:109A2000D541EA2384208446DD4E5A081305440FAD -:109A3000FF02D538EA2384208446DD4E5A082305E8 -:109A4000440FFE02D52FEA2384208446DD4E5A08B7 -:109A50001405440FFF03D526EA2384208446DD4EF7 -:109A60005A081505440FFE06D51DEA2384208446B6 -:109A7000DD4E5A081605440FFF06D514EA2384204C -:109A80008446DD4E5A081705440FFF07D50BEA231D -:109A900084208446DD4E5A081805440FFF0AD5027B -:109AA000841F461100071200804046210007EA3754 -:109AB0000400803400210080FE1714008074FC80B4 -:109AC0005A0001165A080322DD458420F81244107A -:109AD0002000F815461000808C241410015F4610F9 -:109AE00001008C2C1410016083FFDD9EDD45842273 -:109AF0001410016D1410016E83FF8438141000AD32 -:109B00008427101002AC83FFDD9EFC2084C0DD445E -:109B1000467100075873829850330028EA25842044 -:109B2000844283FF96D8EA4FEA2584208444443057 -:109B30000080EA4F84208061EA2583FF8444EA4F55 -:109B4000EA2584208445DD4E380398088CC15A6884 -:109B50000DE5440072C446110007140080B1FCA05A -:109B6000FC00842280C08041EA638461EA4F8467FC -:109B700040319864EA638422844596D8EA4FFC8099 -:109B80008480D52D41414009974192104040D03703 -:109B900096D14010C008FE4742020C24E220E8099A -:109BA0009F21984AE222E905E220E8039F21984A92 -:109BB0009A484010D01740004008FE2FFECCE20328 -:109BC000E80998029E49E202E905E203E8039802E7 -:109BD0009E499A0340424008FE67DD9E3BFFFEBC63 -:109BE000FD80FD918384CB4DE3B2E8194209000763 -:109BF00082A0C00D4129000C525000204058140D85 -:109C00004118800C411894044108000CFD08805252 -:109C100049FFFFBA82C1820086E0D523C2284209EB -:109C2000000782A0C8048BB286E1D51452F0002050 -:109C30004129000C805240483C0D4058800C41089E -:109C4000000C400290044018BC0D49FFFF9D82E1CA -:109C50008220FD08805249FFFF9782C15100000019 -:109C60004FC2005386204108540DD54B41194A1765 -:109C7000842084004FC2004CB79C151E0001D547BC -:109C8000E3B3E9F74209800782A0C04452400020B4 -:109C90004059100D4029800CFEAF82624129000C12 -:109CA0004038100D4108000C4008800C4018900D01 -:109CB000FE1F49FFFF6982C182204200C869E3A1FB -:109CC000E9054C18C00CE380E809516B7FFF8A332B -:109CD00040304801E2038A2F800386E04FC200151E -:109CE0004008000140188401E3808A2F524A8020F6 -:109CF0004110900C4100540D410844044110D40D12 -:109D0000B79C151E00018016501B80003BFFFE848F -:109D1000DD9EE3F1E903E392E90986C14048480189 -:109D20008BB3E3848BAF8204D50286C086E04FC339 -:109D3000FFE9D5EA4900088249000882490001E6A6 -:109D4000041003C149003EF24608002044000030E0 -:109D5000020007A0490001F7120087A0490004048F -:109D60002E07FA4C49003F093C0DFEB249003F194D -:109D700049004B32442001B02E07FA402E07FB9BCE -:109D80005000055A460A55AA49004C333E17FB605D -:109D90004420051044000034460900883E07F9DDE0 -:109DA00049004C09461800202E07FD23660000FFDD -:109DB0002E07F9C13C0BFD4244000064580009FC29 -:109DC000440000E82E07FA1A440000BB040003C157 -:109DD0002E17FB6049004B2F023F80073C03FFBC5E -:109DE00049002C962E17FA4C140083C1020F8007ED -:109DF000440001B0461900202E07FCD74400FFFFA5 -:109E00003C0BFD3349002D564609000049003F191F -:109E10004619000049001DA1001F8005001F800792 -:109E20002E07F9DD401105042E27FD204900411BB6 -:109E30002E07FA0F045003C53E07FB613EF7F9C138 -:109E400058108B145800043C02F2829A3C0BFD44DB -:109E50005010855A1210001E40F780112E17FA3646 -:109E600049001D962E07FA024200040B2E17FB5CD8 -:109E700049003F094900403E580000013E1FFB9841 -:109E8000462800203C0BFD3C490041933C3DFED35D -:109E90002E07FB9C1010008C2E07FB5D461A55AA5E -:109EA00048004B100250000049003F2E2E07F9D900 -:109EB000101000602E17FA4049004BE549004BE0B6 -:109EC000440000CB000083402E07F9C62E07F9C0DE -:109ED000440000331010016850108FFF045003F14C -:109EE000580004EC48004A8149000AD74210840B0C -:109EF0002E27FD213E080494583184E82E07FA04E9 -:109F000049004608640000083E07FD2149003EDB89 -:109F10002E07FB9A5800041C3E08013449001156D4 -:109F20004900411B58210B14400498003E07F9CF0B -:109F30002E07FA214900403449004DB02E07F9EDB3 -:109F4000000103403C0BFD5B5000033A4610FFFF4D -:109F50003E17FB61580009EC001F80063E07FA140B -:109F6000460900903E07F9FB5810841C3E07F9E6AD -:109F7000440003E82E07FBCA50107FF6101F80062E -:109F80003E07FA1A4900160E1000855C49004DC0C4 -:109F9000020F80043E07F9EB101000A82E17FB9A61 -:109FA000109380A83E27FB61000300924000070049 -:109FB0004200100B2E07F9CC5810860449003F4C84 -:109FC000581089FC100480003C0BFD323C0BFD371F -:109FD000106000A0120087F43C2DFED32E07FD2058 -:109FE000000F800710100040101000440220001ED7 -:109FF0003E07FA38460A33AA2E07FA394200080B00 -:10A0000038128101490013D3490001DE3C33FFBC03 -:10A010002E07FA3D490040C458000E3C40F03C0079 -:10A020003C03FD3844000510581080023E07F9F843 -:10A030003C23FD423C33FD3C2E27FB613C43FD426B -:10A040002E27FC09462900002E07F9D03E67F9CFDC -:10A050003C0BFD573C0BFD59383089091005800039 -:10A06000440000322E27FA1A42000C0B490003DE8E -:10A070003E07FB713C0DFEC5101F80043E07F9E54D -:10A08000101002380210829A49000BA6020F8001BC -:10A09000020F8002021087F4045083F12E07F9DBCF -:10A0A0002E07F9DA4210A80B580007102E07F9C541 -:10A0B000400100403C0BFD4549002CF450210FFFAE -:10A0C000490021B74420003C49000C1D58000F0CEA -:10A0D0002E07FC092E07FC083E07FB7B3E07FA48CB -:10A0E0003E07FA40120087923C03FD552E17FD21D2 -:10A0F000440001F402000792020F80051010006C6A -:10A1000049001D9A3E07FA042E17F9D72E17F9D9E0 -:10A11000440000B8101000A049002F683C03FD4225 -:10A12000460800303C0DFED92E07FA492E07FA48A2 -:10A130002E07FA0758000800662100FF4440FFFF81 -:10A140002E07FA00100F8004100F8003382201013F -:10A150003E07F9D14900114A100080082E37FA4C09 -:10A160003E07FA0F42138073001F80043C0BFD3141 -:10A170004000080C3C33FFB83C33FFB92E07F9F41C -:10A180003C2DFF462E07FD213C1DFEB2580000026B -:10A190004400A55A5800000449003ADD44005AA57D -:10A1A00046090008120087BE3A0F84204900307A21 -:10A1B000002000083E07FA363E07FA352E17FB61ED -:10A1C000490019175010833A3E07F9C73E07F9C8EE -:10A1D0003E07F9C92E07FA364200140B107300A887 -:10A1E0000000055C3821820A3832020A4618003025 -:10A1F0005010A9642E07F9E7101000483C0BFD2C05 -:10A200004410006400100040002F8004502100E83A -:10A21000020004A658108004020004A84609008029 -:10A220003B00C4003E07FB603E07FA27461A33AAEC -:10A230004460FFFF3C03FD3C3E07FA2064120043EC -:10A240005C00000148003CC93812010164030003AE -:10A25000120084A63E07F9F43A0404003E07F9F51B -:10A260002E17FC084410FFFF1020802840008200B9 -:10A270004000000900100044040003FE2E07F9D836 -:10A28000021084A65000033C4400003C4601000537 -:10A290004601000646010007460100024601000390 -:10A2A0004601000446010001460100024601000388 -:10A2B0004601000346010004460100054631000244 -:10A2C00046310003463100044611000046110001EA -:10A2D0004611000246110002461100034611000417 -:10A2E0004651000746510008460100064601000796 -:10A2F00046010007460100084601000946410002E8 -:10A30000464100034641000446210007462100085B -:10A31000462100094621000246210003462100048F -:10A320004611000146110002461100034600000DCF -:10A330004600000E4600000F4601000046010001E5 -:10A3400046010002461100054611000646110007AD -:10A350004611000846110009461100064611000783 -:10A3600000010200010201000002020102020101DB -:10A370000000000000010001080910111819000177 -:10A38000040508090C0D1011141518191C1D0001E5 -:10A39000040508090C0D10110084520800280C0552 -:10A3A0000050A102941D00100000000000000000F9 -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 +:100320006400000440000009461900000400803009 +:10033000EA5814008030DD9E46190028A4CA844182 +:100340004021000C40218812AC8A5010807440106B +:100350008040A608DD9E460900888421EABC441F2F +:10036000FFA5101000E04602A1185000030046133C +:1003700000B9B6014600066550000500461300EBC3 +:10038000B601DD9EFC40812180E080C2814349FFAF +:10039000FFE44024A80840211D8088464643000011 +:1003A00088448420DD5F10A10000EABCFCC0FC4052 +:1003B000812180E080C249FFFFD04024A80840216D +:1003C0001D808846463300008843A610EAA2844078 +:1003D000102080A8FCC0FC408120814149FFFFBD66 +:1003E000462300D1892200648000462900888400C9 +:1003F00097B0100100A880E24EA2000558630001EA +:10040000D503546300FE49FFFFA8840010648000F8 +:10041000100380A8FCC0463800008440503180346E +:10042000B403461800009604C0065A20642E8C417E +:100430009690D5F75A206429A80CA08C58210080EA +:10044000A88CA08C66211F0058210700A88CA0CC86 +:10045000442CFFFFFE9E42214408A88C504080207F +:10046000B604B464462F0FFF50210FFFFE9E4630A6 +:100470007000FE9FB644B44442217808B6448444D8 +:1004800010208024DD9EFA11DD9EFC63F081EA9C41 +:10049000EB5444000400F20149004F7B49FFFFBDCB +:1004A00081604E0300A446EFF00F818050070FFFDC +:1004B00084C185A4F084EA34580000043870340004 +:1004C0008C0138A680004E720087540500FB850021 +:1004D000F083E3074EF2007940043400EA9C5810A0 +:1004E00080008801009000065AA0BD695AA8E90C56 +:1004F000540480C05A08C00554E4803FD50F85C11C +:10050000C00DD50B5AA8C1082E07F9B581C65A08E7 +:100510000106D5565AA0B60A81C688C89630F08121 +:10052000EAF584C3F082D5072E07F9955A00FFF645 +:1005300081C6D546800A802CF202806949FFFF24DB +:100540005AA0B93FF0035A00B23C5AA0E93A800AD7 +:10055000802CF20249FFFF2DF0854C900032EAE832 +:1005600049000B999E319780F305CEE5DD400420CC +:1005700003F0F104EB2140250804142003F00400EB +:1005800003F0442F00FFFE8640213104DD4014209B +:1005900003F0040003F0816AFE0EF10140600604DE +:1005A000DD40146003F0041003F04010A00892280E +:1005B00040108F04141003F0D50381C681898D018A +:1005C00080CE48FFFF888CE240D69C005CF6840019 +:1005D0004EF3FF7349FFFEC144100078460300E765 +:1005E0001010081F8420DD5FEABC800BFCE3460985 +:1005F000000802500008441035CAD1031210000848 +:10060000DD9EFC0049FFFFF546103000EAE18C2139 +:10061000EB4FB4029604C0058E21C9FCFA14FC808D +:10062000FC80FC0049FFFE9949FFFE9784004613B9 +:100630000010AE08EAA2EAB549FFFFE5FC80FC0025 +:1006400049FFFE8B49FFFE89840046130011AE0866 +:10065000EAA2EAB549FFFFD7FC80FC0049FFFE7D16 +:1006600049FFFE7B840046130029AE08EAA2EAB5E2 +:1006700049FFFFC9FC80FC0049FFFE6F49FFFE6D8A +:10068000840046130028AE08EAA2EAB549FFFFBB82 +:10069000FC8046090008A5464410AC53D104441F11 +:1006A000AC53AC46DD9EFC0049FFFFA3EB36A446ED +:1006B000C1038420AC46FC80FC01EB39001F8000A4 +:1006C000840140308002001F8001EB4CFE46401147 +:1006D0008420003F8002FEC640108C60003F8003F3 +:1006E000FEC640108C80FE16400080A0EB61EB5BE4 +:1006F000EA40EA40FC819E41E623E81BDD5E84403F +:1007000010208094844110208094EA495A00020805 +:100710005A00030AEA801200800AD509440000A5A5 +:10072000AC0ED505440000551200800C8400DD9EFF +:10073000FA02DD9E46204C4B58210400E241E919A3 +:10074000E604E817FC01F08180C18400F101490052 +:100750000B793C1DFEDBFA44FF8C8400F101402341 +:100760000857F82D8400F1018448F82E8400FC819C +:10077000FA02DD9EE604E82CFC4080E08121840141 +:10078000802749000B5F464900808C8440421CA0B2 +:10079000441000658E219648B464B404C11B4060C7 +:1007A0000C04CEF940248809DD52421100242E2782 +:1007B000FACA8401402088578027884049000B29C5 +:1007C00084018040802749000B2F8006FCC0FA027C +:1007D000DD9EFA14FCC04618006000008014EB3265 +:1007E00010008014DD9E4608006000100010840197 +:1007F00040000412DD9E0000FC01100F8007EAC9D2 +:100800009600E606E8433EFF560438078000EADD1E +:100810004A003C0024060C12181E44600055D50EF8 +:1008200044600066D50B44600077D50844600099A9 +:10083000D505446000AAD50284C046190078EAC9EB +:1008400000008008EA58EAC34619007000008008DA +:10085000EA58EAC3EA56EAD3C80F49FFFFC6C80CF4 +:10086000EA49040080104200440BC80604008010CE +:100870004200480BC0034460005597B1EA31126052 +:100880000050640000008400FC81FA02FC81FC201E +:1008900084A050210024808545200048471100078E +:1008A000591885002E37FD09E083E81882114302AC +:1008B000487384602E67FD08E066E80D38780D0106 +:1008C000999D40701C20A5F84060982097FBADF0E2 +:1008D0008C61D5F18C8188A2D5E6FCA0FC213FCFAC +:1008E000FAA0F081DD4880E180C249003B87C00268 +:1008F00084C4EA29C018DD460230009C0200000AC8 +:100900008A604031A408BB80BB00FEDABB88800649 +:10091000490009F4B908F001DD55427008738047B9 +:1009200049000A4CFCA10000FC00E6284EF20170D0 +:100930009E82E6474EF2016C443001903EFF573CE8 +:100940003827880040F13C004A003C0008080808AD +:10095000080E0E004420D640D5034420D320422068 +:100960008C730031016C8022EAE1103100283C3D9B +:10097000FEAC8E67E662E80F46310007045183C47F +:10098000463A55AA5031855AD3062E37FB83423159 +:10099000900BC3050430805214310030EA6C0030F3 +:1009A000816D103102BC0030816E1031002C00309E +:1009B000816F10310238043080441431008D0430CE +:1009C00080451431000E003081701031004000303D +:1009D00081711031004400308172103100480030C4 +:1009E00081731031004C00308174103100500030A0 +:1009F000817510310064023080A61231001202307D +:100A000080A71231008A023080A81231001E003007 +:100A100081761031002800308177103100340030A9 +:100A20008178103102AC003081791031001800302B +:100A3000817A103105680030817C103105780030F2 +:100A4000817D103105040030817E1031013000308D +:100A5000817F1031012C00308180103101DC0030A9 +:100A600081811031029C00308182103101D8023026 +:100A700080A91231009A023080AA1231009C023003 +:100A800080AB1231000A023080AC123100F8023023 +:100A900080AD123100FC023080AE123100FE023017 +:100AA00080AF123101000030818310310204043024 +:100AB000804614310038043080471431003900304A +:100AC0008184103100CC00308185103100D002309B +:100AD00080B0123100F604308048143100780430C0 +:100AE000804914310079023080B1123100F40230B3 +:100AF00080B2123102B8023080B3123100B64430F5 +:100B00000078143100B10430804B143100B344300C +:100B1000007D143100B4043080381431015F04309A +:100B20008039143101600430803A1431016104309D +:100B3000803B143101620430803C14310163043085 +:100B4000803D143101640430803E14310165003071 +:100B50008186103100D80430804D143100300430CB +:100B6000804E143100310430804F14310032003097 +:100B70008187103100B000308188103100B400301E +:100B80008189103105BC04308050143100B204302A +:100B90008051143100B00030818A1031015800308A +:100BA000818B1031015C023080B44652000012315A +:100BB0000094502280E0B461B665B485B4614C41C4 +:100BC000FFFC8CA48C24DAF84900414D49003D71AA +:100BD000EA45000004A58E0196003E07F9A5EA4506 +:100BE000000006358E0196003E07F9AD49FFFC1561 +:100BF00080C0C80FDD524900084EDD508E07E60266 +:100C0000E8088421DD46101002A0D503FA02D502BF +:100C10008006FC809200FC4084C08026840149004C +:100C2000091180268CC1840097B04900090B5A68CD +:100C300004F684E03E77F9B34668002085213E97AC +:100C4000F99110730168EABA10730214107302A0CC +:100C5000107300FC107300B0107300841073010057 +:100C60001073008C1073001C1073002049000813CF +:100C700010930020DD5210730094EB6E8E01C8FEBD +:100C800084214628003010130094120100E4101350 +:100C9000009046190068AE08DD508E07E602E80DA8 +:100CA000DD40045003C4DD54DD53D005DD5A42005D +:100CB000100BC00349FFFB3A8420EAB3AE40442046 +:100CC0000A20EA2C58000D74842049004B51FCC0C6 +:100CD000FC003FCFFAB0DD468421EA6E1010001C04 +:100CE0001010008410100080EAABEB73EA8BB4A004 +:100CF000EA6CD9FE84C1106100FC10610100B800EB +:100D00008E07E602E80F49FFFB11DD5FEAC64609E0 +:100D10000020B42058108800B620B4205810840059 +:100D2000B6208401EA81B8008E02E604E805FA38AC +:100D3000DD46101000D8B8005A08040984014900A3 +:100D400009E28421DD46101001CCB8005A080209DE +:100D50008403490009D88421DD46101001CCB80075 +:100D60005A08060644103F7EDD46EB1BFC80DD4042 +:100D7000DD49DD439600DD4AEA310410001592306A +:100D80009648C10700100050541080FE101000500B +:100D900004000016EA4992109600C0070000805037 +:100DA000540000FD10008050EA31041000175A185A +:100DB000A513FC004410008714100017F9B7840035 +:100DC000EB61EB5BEA40EA4049FFFC13EA7F490034 +:100DD0000762D5FBDD40DD49DD4396005800010088 +:100DE000DD4ADD9EFC00DD40DD49DD439600580014 +:100DF0003000DD4AEA31EB014210E00BC10844103B +:100E000000491210000E84201210000E0400003A57 +:100E10004200680BC004840249FFFC6FDD40DD49DD +:100E2000DD43960058003100DD4AFC80FC0180C0A3 +:100E300046090020A084B646A005B601B46642115A +:100E4000C40BC9044221C00BD50384418022420156 +:100E5000C80BC003844184224201CC0BC0038441EF +:100E600084234201D00BC003844080224231D40B42 +:100E7000C312EA299600EA21EA30C805EAE38C01A8 +:100E80009600EB65DD43EAE3120087BD490045A308 +:100E900084408421B4064200580BC0233C0DFEAEB2 +:100EA0005A08011EDD505A08061B2E07F9ABE6084A +:100EB000E812842A840249FFFC3F2E17F9AB8C21EB +:100EC00096483E17F9AB944A9C0A540000FE49002C +:100ED000096AD50584008422490007B4844084222D +:100EE000B40684C142005C0BC008DD5AFE36C01D4A +:100EF00080064900077ED519C2125A18020CF181EA +:100F000049FFFB77F1018001441007D049FFFC3411 +:100F1000FC81800649000796EABFFC815A1002084E +:100F200084004900078FFC818423D5FBFC81FC40B1 +:100F3000469300CB49FFFA1149FFFA0F00048802DB +:100F40004669008884E054A0007FEB4249FFFA051F +:100F500010A48802EB4249FFFA0000048805EB4226 +:100F60009203FCC0FC6046A300CB80C049FFF9F5AA +:100F7000000508054679008885209617EABD40607F +:100F8000186449FFF9EA49FFF9E800050802EABDDB +:100F900054B0007F97B049FFF9E010B50802EABDF0 +:100FA00049FFF9DB10650805EABDFCE02E07FB6888 +:100FB000C030FC00EAB3A18349FFFFBBEA680251DD +:100FC00004314420A55A8020DA08EA6800510860FC +:100FD000D00400010860D51A3C2DFEDEE246E8048C +:100FE000C0118E01D5083C2DFEDFE2C2E806E61FE7 +:100FF000E8098C019640D506440FA55AEA6812010B +:101000000431EA2C10100860800149FFFFADFC801C +:10101000DD9E46090090EB4B58108004EACB8420FB +:1010200010100068EB70541080FBEACDDD9EC320E9 +:10103000FC003E07FB683C1FFEDB465000F43C2FE3 +:10104000FEDC998A3C3FFEDD8A22504282404253B8 +:101050001024FF0C40528CB740320C773C5FFEDE10 +:101060003C3FFEDFC00749FFFFD68400FC80FA004A +:10107000DD9EFC8046090090EB4BEADFEACB842042 +:1010800010100064EB70541080FDEACDDD9E46091F +:101090000090EB4B58108001EACB842FEA7BEB7079 +:1010A000541080FEEACDDD9E3E07FAC884603E37CC +:1010B000FAC93E17FACA3E17FACB3E27FACCC00748 +:1010C000FC0049FFFFD949FFFFE4FC80DD9EFC20C6 +:1010D000460800504669000084E0B4001273004CDA +:1010E0004600000F040002C049FFF997C8323E775E +:1010F000FB68441001F43C1FFEDB842A3C1FFEDC2D +:10110000441002583C1FFEDD461000CF501088509E +:101110003C1FFEDE461000C75010861A3C1FFEDF43 +:1011200044100080844549FFFFC149FFFD76490016 +:1011300005D38409EB61EB5BEA40EA4049FFFA63BF +:10114000C808441000DA1213001A1213001EFCA083 +:10115000FCA02E07FAC8C00946190090A608EA5854 +:10116000AE0884013E07FAC9DD9E2E07FAC8C010FA +:10117000EB3DEAB35A180809A04184203E17FAC98A +:1011800000000060D505A00284003E07FAC9840073 +:10119000DD9E462800200211009C0231000A020157 +:1011A000000A8A23964B8E0996019EC9120100946B +:1011B00084804609006896D9AF00ACC21040000890 +:1011C00084831040000C0241009A46220000402116 +:1011D00010568C419041A8854420003010200020FA +:1011E00046204000401104368C2190211410000943 +:1011F000842112300014AE40DD9E0000FC013FCF80 +:10120000FAB02E27FB844221140BC2074639002076 +:10121000A09966210008A899F181BA00BA83B88024 +:10122000B61F2E27FB8292473E27FB6884413E274C +:10123000F9A43E27F9A149FFFCF0F101B41FC10355 +:1012400049002900B8008E02E607E8203EFF604C06 +:101250003807800040F03C004A003C0008080808BD +:10126000141C2400EADBEA7CEA438400E201D50C8A +:101270008406EA7C85E2D508EADBEA7C85E0D504D1 +:101280008406EA7C85E13CFFFEB4EA56EB41C018D7 +:1012900084008422490005D6B8005A08060D84024D +:1012A00049FFFE628402B882EA3FA00958000008A4 +:1012B000A809D506FA00490007768400B882B8006C +:1012C000B90849FFFB33C826B9008E27E622E81C7F +:1012D000DD43045083C4EA79EA63D1162E17FB83F9 +:1012E0004210900BC911B61F84253E17F9A449FF7F +:1012F000F980B41FDD5E120082B8441007D084026A +:1013000049FFFA3AD507B61F49FFFF4549FFFCE2FE +:10131000B41FFC8146180020501085C8A688DD4601 +:10132000CAFEFC008421101002A0EB3D5A18070DE4 +:101330004610000D02108242121002B84610000D35 +:1013400002108243D50D5A18080E4610000D0210E7 +:10135000830A121002B84610000D0210830B1210FF +:1013600000B6DD5E020082B8021080B649003F760A +:1013700049FFF853FC8046080020001000F8EB738A +:10138000EADF10107DBCEAABEA8BB4A0D9FFDD9E8A +:10139000C005FC0049FFF7CAFC80EA490400803020 +:1013A0006600000114008030DD9EFC413FCFFAB0A2 +:1013B000DD40DD49DD43960058005000DD4A4669B6 +:1013C00000200403000AB61FB41F66000002B61F07 +:1013D000F081F00166000004F081B61FB43F840084 +:1013E00049000553801FB04149FFFD22B41F420050 +:1013F0002C0BC030DD40DD49DD4396005800510024 +:10140000DD4AB40666000800B606B8008E07E6029C +:10141000E807840049FFFFBEDD5F8421EB18B800B8 +:101420008E07E602E8178402842049FFF7D6840578 +:10143000842049FFF7D2EA3FB40184C15800040078 +:10144000B6018404EA81DD5FEAC649FFF9CEC00235 +:10145000EABFB41F4200280BC029DD40DD49DD434F +:10146000960058005200DD4AEA3FB40166000400CD +:10147000B601B8008E07E602E804DD5F8421EB18B0 +:10148000B8008E07E602E8128402842149FFF7A51E +:101490008405842149FFF7A1EA3FB401EB20B6019E +:1014A0008402EA818421DD5FEB18B41F42004C0BFB +:1014B000C00BDD40DD49DD43960058005300DD4A96 +:1014C000840049FFFF67F6014263380BC60449FFF9 +:1014D000F8E2D518F00142003C0BC014469300BB63 +:1014E000855F4679008849FFF8E049FFF73610A488 +:1014F0008003106380A849FFF73010A480091063AF +:1015000080A8F001EAEAC02CDD4600000340B900E3 +:1015100096005A180616C0035A080723B9025A182B +:101520000204480000B884013E07F9AB8406490074 +:10153000063A842A840249FFF8FF480000B05A188E +:101540000210C0035A08070D840084224900047A5F +:10155000FA00490006288400DD4E3C0FFEAEF00183 +:10156000EA664E020052DD484900354880C0C80A8C +:1015700049FFF6F3460300BC8427AE41DD5F1060EF +:1015800000A8DD40DD49DD43960058005400DD4AE7 +:10159000840084214900436949FFF91F840E4900F2 +:1015A000352DC00449003E23D52DFA0249003526C9 +:1015B000C8FAFA0649003522C8F6840A4900351EE1 +:1015C000C8F2FA0A4900351AC8EEFA13490035166E +:1015D000C8EAFA0E49003512C8E6FA184900350E75 +:1015E000C8E2FA1C4900350AC8DEDD484900350664 +:1015F000C8DADD5B49003502C8D68407842149FF7B +:10160000FDFF8400D53BF001EAD3C03CDD48490032 +:1016100034F580C0C80A49FFF6A0460300BC842404 +:10162000AE41DD5F106000A88402842049FFF6D53A +:101630008405842049FFF6D149FFF68F843F460395 +:1016400000D1AE438420DD5FEABCDD40DD49EA9491 +:10165000960058005500120107A03E17F9A63E1744 +:10166000F9AC840080204900430049FFF8B62E07FA +:10167000FB86842149FFFDC484014614000A3E070D +:10168000FB59DD40DD49DD43960058005600DD4A38 +:10169000FCC15A00070448FFFF64840148FFFF5E55 +:1016A000FC00EA438442C9028443E607E8048E0151 +:1016B0009600D51D5A0807188400EA4A581086B0CB +:1016C000844449FFF90DEA29C0162E07FA163E0791 +:1016D000FA179C41964C3E17FA165A08010D3E0720 +:1016E000F9B6FC808E089600E606E805EA4AEA7735 +:1016F00049FFF8F6FC80FC005A0006044800006D23 +:10170000F86FB4A2DD46D9FE8380B90E4210D4082A +:10171000B98EEA6D4410FEFFFE56EA27EA6DEAF440 +:10172000FE56EA27EA43C905DD4B00108B73D5044A +:10173000DD4B00108D03EACBEACDEB492E17FA16EC +:10174000C1045A10011DFC80EA7D00200B6CF81AC0 +:10175000EA7D025005AAEA7D024005ABEA7D02302F +:1017600005A9EA7D022005A7F81D462100060421EF +:1017700002C58380BA8EF826480000A3EA7D0020C7 +:101780000CFCEA311020002883FFEA7D025006722B +:10179000EA7D02400673EA7D02300671EA7D02208E +:1017A000066FDD461250009C1240000A1230009A6B +:1017B0001220008A83FF462100060421032983802A +:1017C000BA8EBA0E66210038BA8E83FF844010208C +:1017D0000238480000785A00070448000078EA6C94 +:1017E000EAAB5021033CEA8B83FFB4A2DD46D9FE6D +:1017F0008380B90E4210D409B98E2E27FA21EA4906 +:10180000CA2A4621000600210B6CEB6ADD4B003032 +:101810008B70DD4B00208B71DD4B00108B72F82933 +:10182000DD4B024085AADD4B023085ABDD4B02204B +:1018300085A9DD4B021085A7F82EDD4B041082C56B +:101840001410000EDD4B021085A8EA27DD4B0010B6 +:101850008B6FD5364621000600210CFCEB6ADD4B70 +:1018600000308D00DD4B00208D01DD4B00108D021E +:101870001030004010200044EB4983FFDD4B024054 +:101880008672DD4B02308673DD4B02208671DD4BA4 +:101890000210866F1240009C1230000A1220009A3B +:1018A0001210008A83FFDD4B041083291410000EF0 +:1018B000DD4B02108670EA27DD4B00108CFFEAF149 +:1018C00084211010019C49FFFC66FC80FC003FCF86 +:1018D000FAB0DD40DD49DD43960058001000DD4AD6 +:1018E000DD4684201010008800600340EA5697B05F +:1018F000EB41C013B9005A18060A8400842249003B +:1019000002A184024900044FD5065A180207840038 +:10191000490002988400B882DD508E02E6074EF23C +:1019200001A23EFF67203807810140F03C00DD0F37 +:101930000E0032037E013203C401FA01A002EA3133 +:10194000EB019EB1EAFB8401C107DD43EAF6EB2E11 +:1019500040008012D506DD43EAF6EB2EFE0F96011D +:10196000DD43EAC7DD40021007F44400DFFFFE0E4E +:10197000DD43EAC7EAF64400BFFFFE0EDD43EAC7D7 +:10198000020087F454007FFFEAC784003E07FB583B +:10199000840E49003333C006800649003B114800DD +:1019A0000159FA024900332AC8F8FA0649003326D9 +:1019B000C8F45A60010448000158DD468422EA8ACE +:1019C0008423EA6EEA30E601EA5A800649FFFE6A9D +:1019D0009E36E602E9045A680D0BD506800649FFDB +:1019E000FE8C5A680705B8004900285C5A68030451 +:1019F000480000995A60071B5A680A04480000937F +:101A00005A600D04480001268401441004A649FFD1 +:101A1000F6932E07F9A6C81BEAB3A640EADFAE404C +:101A2000A64058108004AE40D512EA299600EA215B +:101A3000EA30C805EAE38C019600EB65EAE3DD4392 +:101A4000120087BD49003FC74800006D2E07F9A668 +:101A50008C019600E604E804EAF84800006484007B +:101A6000EAF8DD46001003205A101A08001003207F +:101A70005A100E0448000057EAABEB73EA8BB4A08F +:101A8000D9FF46190090A608C8FF49FFFA91EA5607 +:101A9000EB41C0092E0FFB824E04000649FFFA49B4 +:101AA0003E07F99449FFFB63C03D480000E4840A07 +:101AB000490032A4C009EA48EA66C0068006490027 +:101AC0003B68480000C75A680105EA30E601EA5A57 +:101AD0009E319600E6034EF200BDEA438442C902FD +:101AE0008443EA4AEA7749FFF6FB5A600304480058 +:101AF00000B1D5155A6001065A600804480000AAD2 +:101B0000DD468422EA8A8423EA6EEA30E601EA5A54 +:101B100084438400EA4AEA7749FFF6E2EA2996001C +:101B2000EA2149002DC5480000955A68010ADD46A2 +:101B30008422EA8A8423EA6EEA30E601EA5ADD4624 +:101B40008421101000BC500000BCA640C9FFEAD997 +:101B5000E603EAD9E90C8E02E0C0E912EAD9E2060E +:101B6000E90F2E17F9A59C328A01D504E206E9088F +:101B70009E319600EA4AEA77844349FFF6B1EAD9F2 +:101B80004C60402484C1DD46126002E0EA299600E0 +:101B9000EA2149FFF3CBDD5FEAC6EA3FB401EB205F +:101BA000B6012E07FB58E609E9078424E6143E1720 +:101BB000F9A4E806D502EABF8C013E07FB5849FFAD +:101BC000F614C0478401D5028402DD4EEA81D54176 +:101BD0002E07F9AD4C60403E49FFFABDEB05DD46EE +:101BE0005A1001058422101000B4842284C11060B0 +:101BF00001CCEA8A8423EA6EEA30E601EA5A844399 +:101C00008400EA4AEA7749FFF66B2E07F9ADDD5EFC +:101C10005A00010C106080BC502080BCA6109600B9 +:101C2000C8FEEA6C100100B484C1126082E0EA29A7 +:101C30009600EA2149FFF37ADD5FEAC6EA3FB40184 +:101C4000EB20B6018404EA8149FFF5CFC002EABF68 +:101C5000DD40DD49DD43960058001100DD4A840077 +:101C6000D509FA02D5075A60080448FFFEB048FFBC +:101C7000FEABFC80FC008400490000BB2E27FBD09B +:101C8000842AFE54840349FFF557FC802E07FB5934 +:101C9000DD9E8E01C003EB6ED5FDDD9EFC01100FB5 +:101CA0008007EAB6EB198420102F80051010000C75 +:101CB00010100010842110100014EA5196481010E2 +:101CC0000034EAB2964810100038EA5096481010D6 +:101CD000003CFC818400462100005821060096400B +:101CE000381100085030006C561080808C0138117B +:101CF0000C085A086CF6DD9EFC203FCFFAB080E05D +:101D0000EB19A640466800309648C9FCB8005A084E +:101D1000023A4900048FEA6C5A08011FB927C91C0E +:101D20002E07F9A15A080117EAA85A000108EAA8E3 +:101D30005A000205EAA85A08032FEB448400120057 +:101D400080E4DD5E001083405A1803263E07F9A1A7 +:101D5000D522EAA8D51BEAA8DD5E5A00040FEA8264 +:101D60005A00050CEA825A000609EA825A000B065C +:101D7000EA825A000C03EA828420EB19121000E474 +:101D8000D50A5A080409B827C004121300E4D50381 +:101D9000120300E4EB448440FA0C102081B4AE0C32 +:101DA0008405107080C41020801810208118100045 +:101DB000800C8401EAC3FCA04608003014100032F5 +:101DC000441FFFD810100034101000388420101069 +:101DD00000C046110000581086001210005C969159 +:101DE00084211220005EAE40A640C9FFDD9E461948 +:101DF000002810008068DD9E96004619002810001B +:101E00008060DD9E46080020000004B4DD9EE624CC +:101E1000E809944DC003EB56D5034609001088200D +:101E2000B641DD9EE624E80C944D9690C004EB5636 +:101E30008C10D504460900108C088820AE88DD9EE1 +:101E4000E624E81C944DC010EB5650300010886119 +:101E50008442AE98A6989690CAFE8C0C8820AE88D4 +:101E6000A608C8FFDD9E462900108C488822AE08CF +:101E700044000040AE08A608C8FFDD9E46290020A9 +:101E8000B602A851DD9E4629002014010009141154 +:101E9000000ADD9E46180060B601DD9EEA34EA7A4B +:101EA000EB33D013EA34EA7A4400A33AD00EEA3492 +:101EB000EA7AEB35D00AEA340200000084205000B0 +:101EC000455D40008006DD9E8400DD9EEA34EA7AAE +:101ED000EB35D006EA34EA7A44003AA3D83EEA4D1C +:101EE000C03CFC20490033A5EAAFEAB184A0985079 +:101EF000421100732E07FBE2463100005831800486 +:101F000088203C23FD1844605AA58005D111464124 +:101F10000000024200004C430006992A404204F7A8 +:101F2000ADD80A4180018CA188049601D5F0FE024B +:101F30009601EA9C12008001EA34EA7AEB35D80473 +:101F4000440FA55AD503440FA33AEA9C120080001F +:101F50008C413C2BFD18FCA0DD9EFC00F8154210C6 +:101F60008C0BC908F81CC906020000724200280B3D +:101F7000C03CDD5A9604C008460900288421101090 +:101F800000688422EA7BEA310210007283FFEAFBD8 +:101F9000C106460EBEBE50000BEBD51402100072F7 +:101FA0004210900B83FFC106460ECECE50000CECC3 +:101FB000D50902000072EAEAC007460EDEDE5000D4 +:101FC0000DED49002962DD5A9604C00649FFF40D63 +:101FD000C00349FFFE5184014900294DEABA49FF77 +:101FE000FE5A840249FFF389FC8046080060000025 +:101FF000000CDD9EFC0049FFF30649FFF1AEEA80CC +:102000008420844849FFF1D55A0844048400F8121A +:10201000EA808420844849FFF1CC5A0077044800C4 +:102020000064EA2A8420844649FFF1C35A08020565 +:1020300084014800005BEA2A8420844649FFF1B904 +:102040005A0803048402D551EA2A8420844649FFB1 +:10205000F1B05A0804048403D548EA2A842084464F +:1020600049FFF1A75A081305440FFF02D53EEA2A9B +:102070008420844649FFF19D5A082305440FFE023F +:10208000D534EA2A8420844649FFF1935A0814057E +:10209000440FFF03D52AEA2A8420844649FFF189A8 +:1020A0005A081505440FFE06D520EA2A84208446E6 +:1020B00049FFF17F5A081605440FFF06D516EA2A94 +:1020C0008420844649FFF1755A081705440FFF071D +:1020D000D50CEA2A8420844649FFF16B5A0818057A +:1020E000440FFF0AD502841FDD4312008040EA94AA +:1020F000EA490400803400210080FE171400807437 +:10210000FC805A0001155A080320DD468420F8118E +:1021100044102000F814461000808C241410015F35 +:10212000461001008C2C14100160DD9EDD468422D7 +:102130001410016D1410016E83FF8438EB1B84278B +:10214000101002AC83FFDD9EFC2084C049FFF10526 +:10215000467100075873829850330028DD5D842053 +:10216000844296D849FFF110DD5D842084444430D8 +:10217000008049FFF10984208061DD5D844449FFCE +:10218000F103DD5D8420844549FFF113380398088D +:102190008CC15A680DE3440072C4DD43140080B161 +:1021A000FCA0FC00842280C08041EA80846149FF59 +:1021B000F0EB846740319864EA808422844596D8A5 +:1021C00049FFF0E2FC80FC0046010003EA9B84200A +:1021D000DD59490040CD4601000358000A6C8420B7 +:1021E000DD59490040C5460100045800056C8420B3 +:1021F000442005F0490040BC46010004EA67842001 +:10220000DD59490040B584C03C6FFEBF3C6BFD4AC0 +:102210003C6BFD468026EAA3DD55490040A9EA2C27 +:10222000580003508026DD55490040A2EA928026DE +:10223000DD554900409DEA2C580001A08026DD555F +:1022400049004096DD505A08060CEA3EEA9C5810B8 +:102250008C804621000058210FE04900409AFC8004 +:10226000FC203FCFFAB0B8005A00080584C35A08D2 +:10227000060384C1B9132E27F9CB2E07F9DF880294 +:10228000E2204EF20060B913C90746010004EA6774 +:10229000DD594900406DB9132E07F9CB8440E22087 +:1022A000E82E3D0DFEC02E47FB8A2E07FBBF4430B3 +:1022B00000D8888084408405FEF4FF0446110004A1 +:1022C00058108B5C80A2EB4D4520DAC0407814207A +:1022D0000200EFF0A5F88A07960197C342738003C6 +:1022E000E0E4E804A5C88807AC082A00800188114A +:1022F0009601E3C0E80284418CA1DBE9B8138C01AC +:10230000B8935A280120442000D884A03D1DFEC067 +:10231000FEB44631000458318B5C80E5404894207F +:1023200003020000B81322118000960340008016BB +:10233000881096018CA1AC201A718001DAF084001B +:10234000B893B913EB0A2E07F9DF8803E220E938C6 +:1023500084A0BD933D0DFEC0440000D8FF8446110B +:10236000000458108B5C80852200800040281420D7 +:10237000A5D0EB2F880796018CA1AC101A408001E4 +:10238000DEF4B8005A08021D2E07FC502E17F9C1C2 +:10239000E201E8058401B88E8400D50F2E1FFB836F +:1023A0004E14000F2E17F9F0C10BC00A490002832A +:1023B000C8072E07F9C18C01DD4E3E07F9C1FCA00C +:1023C000FC203C1DFEC0EA5C2E37FA0AE203E84519 +:1023D000EB1F5A08012B2E57F9E69E19D8262E77A7 +:1023E000FBEA84A04701000159080C08446005106D +:1023F00050228F34990D8850A42003110000E3A0CF +:10240000E804A420A490D503A410A4A08A02E0E0CC +:10241000E8048400EB50D5038CA2DEEBEB1F5A08D6 +:1024200001053E37F9E4D51BEB1FC819DD509E822C +:10243000E647E8158401EB2E54200025CA06540017 +:102440000050C00DEA3ED502EADE462100025821C6 +:102450000B3C49003F9ED50349FFFF04FCA0FC0054 +:10246000EA61C0292E07F9ED2E17FBBEE201E91D36 +:10247000840084C03E07F9DB3C6FFEBF2E07F9E500 +:102480003E07F9CBDD59802646010004EA67490082 +:102490003F6F8026EAA3DD5549003F6AEA92802615 +:1024A000DD5549003F65D5073C1DFEBBC9048C01C5 +:1024B0003E07F9EDFC80FC003FCFFAB02E17F9E69D +:1024C0002E07F9E4E220E9058401EAC1840AD50374 +:1024D0008400EAC1DD4E3E07F9DF2E07F9D1C02C9A +:1024E000840149FFFE728401EB508402EB2ABE0096 +:1024F0005A68021A2E07FA065A080116DD4DE6013F +:102500003EF7FA218006802649FFF67A3E67FA06F2 +:10251000DD4DC004EA52EA28D503DD56EA8EDD4ED1 +:10252000EA83D53584003E07F9FE2E07F9E28C01D7 +:102530003E07F9E2D51249FFFF45EA84C809B80011 +:102540005A000607EA5C2E17FA0A490022E32E0712 +:10255000F9FE8C013E07F9FEEA2C02500431EB3300 +:10256000D0092E0FFB824E040006B8008E07E6024B +:10257000E806EA5C8C019600EAF0D509EA2C000036 +:102580000861EA4A8C01960010008861FC80FC20FA +:102590003C7DFEC084A04661000158630C08846342 +:1025A000DD59987D50028F34A5088806A4004202A8 +:1025B0000C738CA290029601AC08DAF484033C0FF1 +:1025C000FEBAFCA0FC003FCFFAB0B8005A000804E5 +:1025D0005A080605EA2CEB40D504B80FC804EA995E +:1025E000E601D50285E03EF7F9F0EA88EAD3C00FAC +:1025F0002E07F9F0C00CB80E5A00020A49FFFE324D +:1026000084003E07F9C98400EA5DD51284C0BE93F8 +:10261000802646010004EA67DD5949003EA9B80E4C +:102620005A08020549FFFFB5D5033E67F9C1FC8092 +:102630002E07F9D1DD9EFC0084003C0BFD2B3C0BEA +:10264000FD2C3C0BFD2F3C0BFD30EB48EB474420B1 +:102650000288EA34EB314410005049003E813E0FBD +:10266000FB18843FAE41AE40FC80FC603FCFFADCFB +:102670003C1BFD2C5CF080333C2BFD2FE90FE64228 +:10268000E90D441008343C1BFD2BB9005A18031304 +:102690003C13FDADE220E812D50D3C03FD2BC00438 +:1026A0008E013C0BFD2B3C53FD2B440007D0D8067C +:1026B00084004614000A3C0BFDAD3C23FD2B5CF16D +:1026C00007D13C03FDADE92EB9005A18030B944223 +:1026D000846A40108C36EB558425EAB9EB48D50D59 +:1026E0004010040AEB558423FE44846A40108C3663 +:1026F0003C1BFD2D8425EAB9DD4EEB473C03FD2E46 +:10270000EAADE803DD52EB473C03FD2DEAADE803FB +:10271000DD52EB483C03FD30EAADE804DD523C0BF2 +:10272000FD30B905E623E9048C269648D5028428B5 +:102730005CF107D1E94D2ED7FD092EC7FD082E37D4 +:10274000FB192E07FB185101FFFF51307FFF52602C +:1027500000013CA3FD303CB3FD2D523180013C8390 +:10276000FD2E823346410000584206D8844050E096 +:102770008009E24DE83BE253E8038251D503412151 +:10278000180080B08400E20CE81EE210E90399C34F +:10279000D50280E588F2E2E140900408E80438A21E +:1027A0000109D50EE210E90399C3D50280E588F24C +:1027B000E2EEE80438B22409D503388224098C01FA +:1027C0008EA1D5E28C418FA150420048D5D33C1355 +:1027D000FD1DEB553C1BFD2D3C1BFD2E44200288AE +:1027E000EA34EB31964B49003DBBFCE03C53FD2BFA +:1027F0005CF287D1E95244000834D858FC40DD56D9 +:1028000000000AA12F17FD0B8441846047210001BD +:102810005929082C4661000158630AA0467100013D +:10282000EAFF4500FFFF4731000159398B78852CBD +:10283000E271E82138490C00C41C40131020A6495D +:10284000C11838531100C51538A38F02955B4CA8E9 +:10285000001188A7A1694C58000D80B3425224731F +:10286000A12A5CF203EAE90588208C41960996903A +:102870008C61D5DFEB715CF08024E90650100023F9 +:102880008C4196099690400008163E07FB19EAB065 +:1028900092013E07FB18FCC0440007D0D807841FF4 +:1028A0003E07FB193E07FB18DD9EDD9EEA34EB3147 +:1028B000DD9E3C03FD2B5CF007D1E803C804DD9EE0 +:1028C0008401DD9E8402DD9E3C23FD2B5CF107D15B +:1028D000E9065A080205A4088C02AC08DD9EFC2912 +:1028E000EAA5FD30801F842049003D422E1FFB8455 +:1028F0003C33FD2B3C23FD2C3C03FD304E14002EBD +:10290000EA4A02108038121F80003C13FD2F121F6C +:1029100080032E17FB18EB023C03FD2D121F8004D1 +:102920002E17FB19120F8008121F80053C03FD2E85 +:1029300044102B67122F8002123F8001121F800665 +:10294000120F80098440E247E807380F89013803F5 +:1029500009098C41D5F9FCA9ACF0ACB1AC32FCA9A9 +:10296000FC603D3DFF412E97FC6A2E47FB8592841B +:102970003C2DFF404E4200F13F1FFD503838800093 +:102980005A38011444400030FF044430FFFF99CC12 +:10299000A1BE4C61C00BA17BDE08383090024C32E6 +:1029A000C00584603838800844400030423010242C +:1029B000EB2299CBB4A78E418FE1DC535041800CC0 +:1029C0008881B5844D02804E5121801889C1B4D2CE +:1029D0004C628048A0E140180408E0260409000188 +:1029E00095D9E90BE0E0E81940181801FE5C9A83DC +:1029F000401088368830D5028420E0E0B624E80410 +:102A00008400A821FCE09A18421800244053400199 +:102A1000400094169958D5239972E0A141104C00BA +:102A2000E904E1A7E904FCE0B644D50B40581801DD +:102A30004011CC01FE6C9B43401094368830B62484 +:102A4000E1A7E80415320001FCE0405808019A189B +:102A5000FE2C40534001405014B688A3A961FCE00D +:102A6000EB105842084440420020A7215A40FE0D76 +:102A70002E47FA0DCC71EB22D46FA1BB4C62006DD6 +:102A8000A1BE4C62406A8C6C38B880008861B58306 +:102A900005218001A0794EB30060406804084033EE +:102AA0002401E06540390408E9104041A401E081B7 +:102AB000E81B40281401422908244040C801402155 +:102AC00010568850A8BED50314B380068A69E06109 +:102AD000E93C4039040142380C248AB04021945624 +:102AE00040590800D530992A8A89E08640A0CC0058 +:102AF000E90640452401E083E904FCE0A8BED511C5 +:102B00004068140140494C01FF344060C801404214 +:102B1000189688904E450004A93ED50314B380064C +:102B200040952401E123E80415338007D51240388D +:102B3000080140290401FE9C8AB0405114B688B2B5 +:102B40004E550004A97FD505501380188440A889EC +:102B5000842138188008FCE03E1FFD5038008000BA +:102B6000DD9EFC203FCFFB1C3E6FFDB0841F84E048 +:102B70001203004412030045842050030060844C7B +:102B8000127300421273004349003BF28006EB6768 +:102B90004420006049003BEC500300788420844CC2 +:102BA00049003BE6461141415003006C501084142B +:102BB000844C49003BDDDD4058000266A640A681FA +:102BC000EA55B981A642A683EA55B984A645A686E8 +:102BD000EA55B980A647EB3AEA55B9850010000AD4 +:102BE0000020000BEA55B9860010000C0020000DF3 +:102BF000EA55B9870010000F00200010EA55B9838C +:102C0000001000110000001240000504B8823C7B57 +:102C1000FD38FCA03C3DFEBB84283E0FFE54EB2259 +:102C2000EB3AC208CB0410300008D5048E411020C6 +:102C30000008EB3ACA03B680A9018E2196488C0C95 +:102C4000C9F0DD9EFC21EB398080DD400060027D13 +:102C5000DD400070027EDD4080A10100027A3E1F4F +:102C6000FE548468840000208008C214B441E282CB +:102C7000E8038A44D5029AA2E246E80CA089E2A2BF +:102C8000E8038A45D5029AAAE247E80411008008C1 +:102C900084018E6196D88C2CCBE7FCA1FC01EB392A +:102CA00080C080012E17FA13C104842184A2D503A9 +:102CB000842284A13E4FFDB038320B02E266E80365 +:102CC0009AF3D5028A66466100070063027FFF74AB +:102CD000E2A3E90D40320860A099E240E8039A823D +:102CE000D5028A40FE7440008806FC818401FC8184 +:102CF000FC0084003C0BFD323C0BFD3E3C0BFD3CDC +:102D0000EA79EA63EA94141103CE045103CE461A19 +:102D100011AA5010811AD106EB58045103CEEB3E94 +:102D2000D93084003E07FA13440000963C0BFD3B6B +:102D3000EAE83C0BFD3DDD400000026A3C0BFD363D +:102D4000DD400000026F3C0BFD3ADD4000000274E4 +:102D5000EB2DDD40000002793C0BFD39DD40000029 +:102D600002823C0BFD33DD400000028394013C0BEA +:102D7000FD35DD40000002883C0BFD378400D5277F +:102D800084213E17FA133C0BFD3B3C0BFD3D3C0BF5 +:102D9000FD363C0BFD3ADD43041083FE92385A1891 +:102DA000110CDD40EB7292109600EB2DDD40EB72C2 +:102DB00092089600D502EB2DDD4E3C0BFD398400C8 +:102DC0003C0BFD333C0BFD353C0BFD37DD4E3C0B26 +:102DD000FD34FC80EA6F5810882C380080003E1FBC +:102DE000FD2040108040A60AA64B8A019601DD9E78 +:102DF000EA6F5810882C382080003E1FFD204000CC +:102E00008840A60138108A008A019601DD9E4000A4 +:102E1000040E9604DD9E84414011040CA480FE57EC +:102E2000AC40DD9E442EFFFF4011040CA4804011F5 +:102E3000061EAC40DD9EFC203E7FFDB080C0FA2423 +:102E40009838EB0E500380848026F80C500380865F +:102E50008026F8085003808A8026F8045003808872 +:102E6000802649FFFFE1FCA0FC623FCFFB2C2E1720 +:102E7000FBF44210980B4E1201ADF08184C049FF63 +:102E8000FECB3E9FFDB049FFFF35508F80083EDFEF +:102E9000FD803EEFFE3CEA22E2C04EF20154DD48E6 +:102EA00004BF800142B30073EA248D6CB4EB54C3B9 +:102EB00000FF4C70402BEAA100000078C8064004D7 +:102EC000986038749B0AA9C1EAA18420EA7BFA249D +:102ED000EB0E802C3E0FFE3849FFFF9F802C3E0FEB +:102EE000FE3A49FFFF9A802C3E0FFE3449FFFF9CBB +:102EF000802C3E0FFE3649FFFF973E0FFA70802C64 +:102F000049FFFF924800011B3B05C4002E17FA132E +:102F1000DD403B04442081510000027CC907E207E8 +:102F2000E810B9759A08E2E0D506E211E80AB97628 +:102F30009A08E3A0E8063E0FFE38802C49FFFF7494 +:102F4000F78214AF8003EB6349FFFE7E9630B61F15 +:102F50003C03FF1BB43F49FFFF5CC009EB63B45F58 +:102F600049FFFE9EC004B41F49FFFF673C03FF1DDD +:102F7000B43F49FFFF4EC0473C0DFEC83876990963 +:102F8000E20738A71909E808B800E2E0E8053C03C1 +:102F9000FD36E340E9263C0DFEC7E207E80AB8012A +:102FA000E2E0E8073C13FD3AB8768A01E20AE91943 +:102FB000B802E20AE808B803E340E8053C03FD3143 +:102FC000E2E0E90F3C0DFECAE20AE8183C0DFEC93A +:102FD000E340E8143C13FD39B8758A01E207E80EB6 +:102FE00040049860B6E014A00001B43F3E0FFE34E8 +:102FF00049FFFF13EAA18420EA7B3E0FFE3AB43F6B +:1030000049FFFF123C03FF1AB43F49FFFF02C01BF8 +:103010003C03FF1BB43F49FFFEFCC8154014980059 +:10302000000080605A00FF058C01100080603C1396 +:10303000FD31E227E808B8758A01E2E0E804B41F30 +:1030400049FFFEFB3C03FD38B43F49FFFEE2C00BE5 +:10305000EB63B45F49FFFE24C0063E0FFA70B43F35 +:1030600049FFFEE2EAA10010006CE634E85B8C2127 +:10307000EA94964800310287EB0E0000006094B39A +:10308000E203E83A5A30FF3938449B01BF754004E7 +:103090008800A4C29A7CBD7696499A2BE28196015B +:1030A000E808E283E806E280E804860039049B0A27 +:1030B000E224E808E223E806E220E8048EE138741E +:1030C0009B0AE264E80AE261E808E260E80640740C +:1030D0008800860015038001E204E809E201E807A0 +:1030E000E203E805400488008EA1A9418849B4E2C2 +:1030F00004A10001D511884938349B02A0918AE3CC +:1031000040050801FFCCFE0CFA84407390F640A005 +:10311000115688E38942EAA1843FB6EB14A58001E9 +:10312000EA7B3C03FF1AB43F49FFFE73C007EA2461 +:10313000B60B802BA8098400A80A8CC197B148FF60 +:10314000FEAC840049FFFE48DD43120081DF8400AD +:1031500049FFFE50DD43120081E0DD560010082CCF +:10316000DD5658000AB838000601DD43120081E13F +:103170003C43FF1ADD433C33FF1B8400120081E215 +:10318000DD43120081E384AA84258401EA940221AC +:1031900001E297A44220187346610007969112231A +:1031A00001E2EA94979C022101E3422018738E21E8 +:1031B000FE2C9691466100079649122301E3928105 +:1031C00092619601C9E42E07FE10DD43120081E4EE +:1031D000FCE2FC6080C0840E490027104E0300A66C +:1031E000FA024900270B4E0300A1FA064900270600 +:1031F0004E03009C840A490027014E030097FA0AF7 +:10320000490026FC4E030092FA13490026F74E03AC +:10321000008DFA0E490026F24E030088FA18490084 +:1032200026ED4E030083FA1C490026E84E03007E7B +:10323000DD48490026E34E030079DD5B490026DEC8 +:10324000C8743C1DFEA95A180171470100075908AE +:10325000024E472100075929021E2E97FD0B467189 +:103260000001587388FC9C748150EB5A4711000789 +:103270005918823681724731000759398206968083 +:10328000E249E8530450FFFFD64DB4414C23004BB4 +:10329000403380603853830AA8992E27FBF44221DB +:1032A000100BC21E84413889090196D0E305818242 +:1032B000E8058C415A280CF9846B8E6196D8384900 +:1032C0008D013829B10138358D018A448AA3FEACBD +:1032D00040540C01405114B788A41450FFFF2E270E +:1032E000FBF44221140BC21EB46184A138281501DD +:1032F0009728E2438185E8058CA15A580CF9848B04 +:103300008E81972038851101385891014041A001E4 +:103310003838B1018A488A65FEE4402188578845DB +:10332000B6418C018C2CD5ACFCE03C1DFEB75A1884 +:1033300002072E37F9F92E47FA10D5052E37F9FF77 +:103340002E47F9BB2E27F9EAC8115A2801202E175B +:10335000FB5D8C219648E2243E17FB5DE917EB0FDD +:103360003E07FB5D3E07FB5CD5115A080110CA0EF3 +:103370002E17FB5C8C219648E2233E17FB5CE90686 +:10338000EB0F3E27FB5D3E27FB5C2E57F9EAD80684 +:1033900084003E07FB5D3E07FB5CDD9EFC693FCF82 +:1033A000FAEC2E77F9EAB8008EE1E6025C73800150 +:1033B00084C0E9049F81FF8492C1508F803C8008C3 +:1033C0008420844C490037D446D1000158D68B78EC +:1033D00085604651000158528AA046A1000158A5B7 +:1033E0000AE8812D806B818585DF473100015939DD +:1033F0008AB8B800E260E86938140C005101800115 +:10340000C93E3D13FD29412184088090414884082C +:10341000415914004C4000344172040840265C00BD +:10342000001A8001A6918A22421080039648E62C59 +:10343000E805FE4C556080FFD503456000793826CD +:10344000480038165C009A51421080039648E62CDA +:10345000E804FE4C9648D503441000798836964817 +:10346000E3A1E90738E40C0884E138E41008D50545 +:1034700040FA0407E8028D618C81D5CD2E07FBAFA1 +:1034800038198E02E220E9108049A052806AA01A01 +:103490008801A812B429B40A8801B609A051A0195C +:1034A0008801A811D50E9618153F8003F582150FD7 +:1034B0008001490000E4EB3CF502053F8003C8E5CC +:1034C00080708D2C8D4CD5964CB3400384E08007E2 +:1034D00049FFFF2D49FFF9EF5A0801048400EB0F63 +:1034E000BF00CF053E77F9D33E77F9E83C9DFF401A +:1034F000EAB1F0863CADFF41EAB0F0875004FFFF2F +:10350000F08150057FFFF0822E07FBF44681000119 +:103510005884085C9644EA66F08A2E07FA02F08B1B +:103520002E67FC6BF188540300F0F0834005000126 +:10353000F08C95B42E07F9D397B0F085400498012C +:10354000F08D2E17FA112E07F9E8F189F0848560C5 +:1035500081884CB38075B40D04E68002F206846065 +:10356000420024694900372A804E8460490037268A +:10357000F206402488579241C904C905E240E80395 +:103580008A02D5028400B60804068001F20784602E +:103590004200286949003712804E84604900370E86 +:1035A000F207402508579241C904C905E240E803E3 +:1035B0008A02D502840014040001B408E209E90378 +:1035C000F001B60804040001E20AE904F002140460 +:1035D0000001F008C005B408F1019A08B608B40863 +:1035E000F109EA41582109684010043738112C08C4 +:1035F000F10AC1068068A059F2029A51A859041430 +:103600000001F20BEA3A5831895C40208857382192 +:10361000AC08F203E241E806F20CE222E80384215E +:10362000F185E2C0E806F10DE201E8038401F084CF +:103630008D618D0850D6800C48FFFF8D001F8014CF +:103640003E17F9D3001F80103E17F9E8DD5602003F +:10365000042EDD43120087ADDD5602000430DD4349 +:10366000120087AEEA24E6ECE80840161C60380633 +:103670001F0AA8098CE1D5F8FCE9EA3A58318AA07A +:1036800040418020EA5EA7218E41E6829690EB645D +:10369000E90CE244E90A38018100E602E9068E21DC +:1036A000964840008006DD9E8401DD9EFC203FCFD1 +:1036B000FADC2E07FA03C0058400B884480000A68F +:1036C000BE0A4E63005AB9048E21E6234EF200551D +:1036D00049FFF2DEBF005A080113800649FFFFCF01 +:1036E000C0042E07FB97D50DEA432E07FB96C109B0 +:1036F0009E7AE622E8068E0A9601D5032E07FB9AEB +:103700005A700307EAA05A100104EA43C1052E17B4 +:10371000FB988801960149001FC680C0EA6BC00A69 +:10372000840049FFFFAC2E67FC34C00392C1D50270 +:1037300097B1DD40EA59DD54DD53D8172E07F9F66D +:103740005A080114B8005A0002054460012CD50340 +:1037500044600096840049FFFF92C00740030809B7 +:1037600096014060183C97B1DD56EB3F9201E206AE +:10377000E8038400B884EA6F041082E0B804922160 +:103780004900286AB804E602E940B90AE220E83DA7 +:103790003C63FD2AEA6BC80440130409D503947105 +:1037A0009649DD51C803DD4DC00B2E07FB9449003F +:1037B0001F7A80C02E07FB9549001F758020EA62A2 +:1037C000C00C2E07FC4149001F6E80C02E07FC4133 +:1037D00049001F6994019641BA0ABB04848C465182 +:1037E000000158528B78E243E810800542011073C3 +:1037F000E642A00280E1920140733C1BE207E8032D +:10380000BA84D5038C41D5F0FCA0FC602E07FA07E2 +:103810005A0801092E07F9D5E615E91984003E0773 +:10382000FA072E97FD0B2E47FA072E37F9D584009D +:10383000EA6F58108790465100015852885CEB5A45 +:1038400080E04701000159080838D5108C013E0777 +:10385000F9D5D5E8382283024C234013A6888E413F +:10386000E653E907AFC88C018C21E209E9F4D50ED3 +:10387000382800005A2801F880828460D5F4A68890 +:103880005A20FFF38C41AE88D5EF3E47FA0746A198 +:10389000000158A5070C3E37F9D5EA6F5810871874 +:1038A000EA3A5831885C467100015873883880CAFA +:1038B0004520FFFF8660856140032801E209E85149 +:1038C000B4434C294008B7C110B3800010B30000C6 +:1038D000D527A6385A080125B4A14C5940073B0109 +:1038E000C4003B00C420D51CE2A2E8039A15D5020F +:1038F0009A2AA159A109E285E8039B2CD5028A8561 +:10390000FE044202107381E02E57FD122E47FD1374 +:10391000FF2CE28FE805113380003F37FA07B4A18E +:103920004C59001B4C290019A6305A080116E2A276 +:10393000E8039B55D5028AA2A099A009E202E803F8 +:103940009A10D5028A02FF6C425000735CF2B841B3 +:10395000E903113300008CC18C288C688CE1D5AD53 +:10396000FCE0FC613FCFFB0446710001EAFF46B179 +:10397000000158B586F4469100015894870084C030 +:103980008147468100015884082C46C1000158C671 +:103990000AA046D1000158D6878446E1000158E7C5 +:1039A00007784711000159188B7847010001590821 +:1039B0000844EA22E2C04EF2006B9630150F8001F7 +:1039C000B7BF49FFF8CBB5BFEB3C5A0801052E073E +:1039D000FA0DEAC2B4A7EA24D813000480002E1717 +:1039E000FA0DE201E8088C01EAC24400FFFEB607C6 +:1039F000A839D5478400EAE6841FEAC2D5423814C4 +:103A0000180040060420A6C12E07F9FD382605003F +:103A1000C00EC60DDD56040001E75CF000C9E907E1 +:103A20002E47FBDB440FFF80EAECD5032E47FA3824 +:103A300000058000E204E81D848C80B14250907340 +:103A4000A06A5CF080BFE90B38569800DB04385759 +:103A50001800D203E6C5E8038C01D5028400EAE62B +:103A6000EA24B607A839843F40081820AE41D5059E +:103A70008400EAC2841FEAE6383698083827180816 +:103A80008CC18D618D218CE848FFFF9584C0BE807C +:103A9000843FDD5658000844FA48490034694671AD +:103AA0000001EAFF80064520FFFFEA3A583187CC43 +:103AB000EB105842079C80A64530FFFE469100015E +:103AC00058948844857E3865020294424C690013FC +:103AD000BA008C41BA804C69C01098B98823EB5762 +:103AE000401024003B01442010B080013852010AEC +:103AF000D5083852010A9899882AEB573B0144208F +:103B00008C025A0818E249FFFE82FCE1FC613FCFBB +:103B1000FAECB807C0038400D5042E07FB85920495 +:103B2000DD4E3E07F9C72E77F9C7B8028CE1E207F0 +:103B3000EB10584204B4E91BBF82840C42C38024BA +:103B400046610001586304B450D67FF4850046E115 +:103B5000000158E7085C4490FFFF46A1000158A50A +:103B60000B78473100015939882CD54084204450C6 +:103B70000030EA22E020E8E18004420094738441AE +:103B80008C0CE0478C0CE80950307FF43B01C800F6 +:103B90008C413B004820D5F68C21D5EC8C2150403F +:103BA0007FF43B004800E0273B0248208C0CE9F7FB +:103BB0003857230240440C0884004C54C020EA418A +:103BC0005821085C4013300088823B024400A10A5F +:103BD00084A7420290733B00C4209203A80AB4A6B3 +:103BE0004C5480238D0150630030EA22E100E83D0F +:103BF00050B3000C800B8420D5D23819A000840C5F +:103C0000804A422080738423A012F481FE0CB7FF07 +:103C1000920149001E5A5CF00100B5FFF401E9D0A1 +:103C2000440000FFD5CDA1734C54BFDE5A7001DCB7 +:103C3000B800E603E805A1764C54C054D521A1761E +:103C40004C5480085A7803F9045300094C54FFF58A +:103C5000800B848184A08C81E0E4B7201490000163 +:103C6000A9428C0CE8F9D5E884C0EA22E0C0E83D1E +:103C70009630EA6FEB0649FFF6758CC1D5F78401E3 +:103C80005A7803B2045300094C54BFAEC8ACA033F9 +:103C900038233002A1499AD02E47FD12A0742E0776 +:103CA000FD139A6992029282FE4CFE0442118C73BB +:103CB00042021073E0204EF2FF97400334003813A5 +:103CC0003402A001882288059221920184818C818E +:103CD000E0E4B62B140580018D6CE8FA48FFFF8400 +:103CE00084005A7003D1D5D4FCE1FC653FCFFD00C0 +:103CF00081A0840012068048100680922E17F9EAEF +:103D00002E67FBA22E07FBA1C908EAA0C906EA4359 +:103D1000C9042E17FA0EC1055863000F9204D5048A +:103D2000979F95B3961F8C018608428040012E070D +:103D3000F9BDE208E8038C01D504E300E8048E0134 +:103D4000548000FF400404099600F08285204671EB +:103D500000015873819CEA22E3204EF20182401454 +:103D60008C08DD56580008FC382027028801F181B4 +:103D7000EA3A583184B4A041DD484234807338E3D4 +:103D8000A40080038C0C04B1800304A00001EA2489 +:103D9000EB10584201A84CB040104CA5C00E440F87 +:103DA000FFB4EA6F581081903800A40884003802EC +:103DB00024084800013D0006809286218C011006EF +:103DC0008092020680484128A40C40090004120693 +:103DD00080483802240046C1000158C601B4C81406 +:103DE000EA3A583181A83911A4084014980840369D +:103DF000000038B1840A8C08886114A180015A0837 +:103E000040F848000117E24BE80441058801D5035A +:103E100041012C01E22AE80440450401D503404059 +:103E2000A80143284024DD56580001904322107316 +:103E30003800240041390409C8062E57FB9B2E3751 +:103E4000FB9CD5052E57FB9F2E37FBA0DD56580057 +:103E5000082C392024002F17F9E7DD5658000AB83E +:103E600038004A02E3A0E8078403FF44FE1C976879 +:103E700096C0D51FEA6BC8F9DD51C8F7153F800918 +:103E8000F188F287F486150F8005F384F58349FFE6 +:103E9000F512F503F304050F8005F406F207F108A7 +:103EA000053F80095A0801063C0DFEBCE605E8DD29 +:103EB000DD5658000190391024004F13001EE365B1 +:103EC000E908B8008E018A05E20B4058BC1BD502F8 +:103ED00080B1E343E906B8018E018A03E20AE802F1 +:103EE00084605CF5806EE80850F57E335CF7809F57 +:103EF000E803846080A33E57F9D23E37F9F13E676C +:103F0000F9F4E3853E87F9F8E803E283E9088400E1 +:103F1000EA3A583181903801A408D5038141816281 +:103F20004119880941189A378DA1E7B1E902FBA030 +:103F3000C63C2E07F9C7C01051200001DD484204DD +:103F40008024866C42094C73EA3A583184B4385163 +:103F50008002EA24D02A8009151F8005F184F283AB +:103F600049FFF5FCF203F104051F8005C81E520845 +:103F70008010FE84FE0C4225C4734205447382C245 +:103F800082803D2DFF40B801405590084025100823 +:103F90004052C8B7402100579768969088B6885419 +:103FA00040B2900940A11009F001E7AD880E40062B +:103FB0000060B76014A00001E90CDD48EA6FEB0671 +:103FC00042148073EA24A14ED8042E07F9C7C825ED +:103FD000800949FFF5C3C821804080A04C540017D8 +:103FE000F101882E41160460392607020518800168 +:103FF000881288514EE2000750377FFF54E180FF5E +:10400000D50285C78CA19768D5EAF102994188410C +:1040100040B2A17740A12157DD565800019C3800DD +:1040200024008C0196005A08080384003803A40871 +:10403000840C802D42148073442000308001B761CD +:1040400014A08001EA6FEB0642148873A08D50140F +:10405000800110200008549080FF48FFFE7E3E87BC +:10406000F9BDFCE5FC673FCFFAB484003C0BFD4191 +:10407000EAA53E0FFEB484204900317AEA345800A4 +:104080000C308420EAA549003173EA3458000BE86B +:104090008420EAA54900316CEB163C13FD429603DF +:1040A000E001E9073E0FFF208420EAA549003160C6 +:1040B0003E0FFF6844107FFFFA54490031513E0F14 +:1040C000FEFC8420FA54490031532E67FB82426380 +:1040D000100BC63149FFEDDC5A080113EA61C80D27 +:1040E0002E67FBBFB80A5A0803042E67FBC3EA6BAE +:1040F000C0092E67FC35D5062E67FBC2D5032E6797 +:10410000FBC0EAA0DD4DC904C016B90FC91495B1B2 +:1041100097B1C80749FFF3CFC004B80FC00292C1DE +:10412000DD4DC009B80A5A080207B80FC004506331 +:104130007FD897B13C03FD11C004506300C897B10C +:1041400084003E07F9B9EB5F3D2DFEB74210940B9A +:10415000EB51C1155B28020ADD515A0001045A389F +:1041600001072E17FBC8D50B5B200305DD515A084C +:1041700001052E17FBC7D5032E17FBC6DD401260C5 +:1041800007A4EA341210063C97B3EA683C6BFD4082 +:10419000840012010038EA68120100392F17FD0966 +:1041A0002EA7FD08B813F0825A380105440002BC5E +:1041B000D5034400015E9601F0835A38010544009E +:1041C00000C8D502DD523E5FFEFC96013F0FFF683E +:1041D00046C1000158C60C08F08480E5848083C580 +:1041E00082904550004C4560004847710007597B5C +:1041F000850051860F343EDFFEB446E1000058E7EB +:104200000BE84681000058840C30E2914EF2009990 +:10421000826C4332547383375139A9644392587383 +:104220004092080884C0E2CA4EF2007F382C9901FF +:1042300004BF8002380C09013825890102B38000CF +:104240009A829611F081220F80021A098001E160A2 +:10425000E804022F8002ACB8B570E20BE8054E0707 +:104260000006B610D5054E0600048440B650B57061 +:104270003CF3FD4140F7AC06E8033CBBFD41C625DD +:104280003CB3FD4040B58011E160E81DEA2522B94C +:10429000FFFEEA2340F7AC07E816EA25F203EA231B +:1042A00040F78800E00FE80FE160E80440B02C011F +:1042B000D5028B60F204E162E80638B424028D6115 +:1042C00038B4240A4E0500714E07001638B6A40211 +:1042D000EA68896038B6A40A02B10038E160E80BE8 +:1042E00002BF800212B10038EA6810410076EA6825 +:1042F000106100775B2003164E040014EA6802F197 +:10430000003952F78000E00FE80CF001FE82EA2C41 +:1043100012200039EA2C10400074EA2C106000755D +:104320008CC148FFFF82C903AC78D505A438400092 +:104330000417AC388C818CE28D8448FFFF683C13F5 +:10434000FD402E07FCEC882096495A380103922143 +:1043500084008040E251E809384A0A02E224E80376 +:104360008C0196018C41D5F74E3204E0E604E90653 +:104370002E07F9E594018C01EACF5A300104480078 +:1043800004D83C13FD415CF08065E93A3C03FD42F2 +:104390005CF001F5E935E220E8339AC15EF180C9AD +:1043A000543780FFD52D22B9FFFE4EB4FFA5EA2574 +:1043B000EA2352F7FED4E00FE89EEA25EA2352F7FB +:1043C000FED4E16F4EF2FF98EA25EA2352F7FE0C85 +:1043D00040F780074EF2FF90E160E80440B02C0106 +:1043E000D5028B605EF5806454F780FF4EF2FF8447 +:1043F00038B724028D6138B7240A48FFFF7DEA2CC4 +:10440000EAA65CF00259E908EB59C0063C03FD42FC +:10441000E201E9028460EB59C0248E019601EACFE3 +:104420005A3801222E27F9E53E4FFEB494918C4173 +:1044300084203E6FFF20E231E80D38320602403121 +:10444000A8775CF180C93833060A40013C1A8C21F8 +:10445000D5F3DD4EEACF3C03FD413C0BFD42D503D5 +:104460005A3001FBEA56B90FEB45F183C81AEA2C22 +:10447000EA680210003800210076EB16382F090197 +:1044800096038802E00146E1000158E70C08E84481 +:10449000EB16960388408A22EA2C12100038D54089 +:1044A0002E67FA0B2E17F9B8840080403E7FFF205C +:1044B0004701000059080C30453000C84691000003 +:1044C00058948BE8E251E8220AB2800138438A020C +:1044D00094D2E364E8031242FFFFF403CC0FCE0E44 +:1044E00038480C02E689E90A0242FFFF5CF200C884 +:1044F000E8058C211332FFFF964838348C02E67FA2 +:10450000E9038C0196008C41D5DEEB1D3E07FA14C1 +:104510003E17F9B8D5AD8400EA4A12008038EA2C7B +:10452000EAA63C83FD1D5B20032EEA4A3C23FD40A6 +:10453000021080399693E041E8053C23FD408A2231 +:10454000D5028420EA6812110039F103C90EE30094 +:10455000E80CEA4A02108039E201E8078421EAEE19 +:1045600084223E17F99AD50E2E17F9925A18010790 +:104570002E17F99A8E213E17F99A2E17F99AC90229 +:10458000EAEE84203E17FA182E17F9B0F184501580 +:104590007FFEF1858425438404242E97F9B93C13CA +:1045A000FD2C3C23FD2F5B28030544300258D50326 +:1045B0004430012C96D9F3882E37FB8C5048FFFEEF +:1045C00094DAF3862E37FBF5F3874631000000D1ED +:1045D0008C7C2F47F9EBF48C2E37F9B6BC2784C0BE +:1045E000F38244C07FF8E3003D33FD158166F68118 +:1045F000806645E0004C47610001596B0C0882A6BB +:104600003F7FFEFC40C6100614FF800DE2714EF2A3 +:10461000009FE662801614FF800AF50C4201F873D1 +:104620009519E265F48950002964848014FF800B99 +:10463000E28A4EF2008AF504CD1CF50ACD08F50B8E +:10464000C506E682E904F505E285E913EA25EAB73D +:10465000EA2340F43C0040F79407E80BEA25EA23FC +:1046600040FC3C00E0AFE80550548001549280FFCC +:10467000EAB74E550012F709399B9C01EA25EA2357 +:1046800040FCBC0040F79407E812EA25EA23419C6D +:10469000BC008AB9D509EA25EA2352F78000E0AFC9 +:1046A000E806EA2588AFAD40CB09D50413500000D9 +:1046B000CB104022101A4012101AEAB74192801310 +:1046C00050FCFFFF5CF78095E8078C219649D509DF +:1046D000EAB741928013F708E0E5E8038C41969130 +:1046E000F7068C0240F29C004EF4000DF7018CE1BD +:1046F00097F9F781EB3CF707E387E90458D6800187 +:1047000086814E5400058B7940B580135B200314DD +:10471000F7038660CF105CF583E9E904F70D866145 +:10472000CF0A4EC20008050F80028F815D3800015C +:10473000D502826C5EF2FC18E80284C184A08C81F0 +:10474000F58248FFFF778C6148FFFF623E97F9B919 +:104750003C1BFD2C3C2BFD2FEA3410D00C7C3F473A +:10476000F9EB003F80083E37F9B63D3BFD153E674B +:10477000FA18EA2CEAA649FFEF7ADD40EA59DD543F +:10478000DD53D818EAF25A0801082E07FB5E5A00DA +:10479000FF098C01D50284004614000A3E07FB5E27 +:1047A0002E07FB5EE6028401E8028400DD4E3E0730 +:1047B000FA182E07FC269405E00B2E57F9B1E80EE7 +:1047C000DD51C80CDD4DC80ACD09EA3400000C7C6F +:1047D000EA9CEB32EACA8401EA8CDD40041003F261 +:1047E000EA2CEAA6E220E813DD4DC811CD10EA3428 +:1047F00000000C7CEA9CEB34EACA84213E17F9EBFA +:104800002E07F9C58C01B8963E17FA03EA56EB4518 +:10481000C0072E07FA14E60DE9038400EA8C2E0780 +:10482000F9EBC803EA9CEACACD5AEA61C858EB27FB +:104830002E77FD0851027FFF80C54510004C4721AF +:10484000000159290C08453FFFB4E2A4E844BE80AA +:10485000C80A80324212C4734292CC245010A96418 +:104860008040D5128401D5372A308001C327BB0090 +:10487000E667E80DC80CCD0D4030A400223180253C +:10488000C318BD808C41E247E9F0D5238401D521CE +:104890004C58400A2230FFD9C30C4634000A3C0F62 +:1048A000FEADD5F122308025CB072230FFD9CB04D5 +:1048B000BB008C61D507BE80D5E63CADFEADE747B9 +:1048C000E80646A4000A3C3FFEADD5DD8401D5DBF9 +:1048D0008CA1D5BCDD4E3E07F9B1D50FB90EC90B81 +:1048E0003C03FD168C019601EB6F5A0864073E17D6 +:1048F000F9B1D5038400EB6F2E37F9ECCB3B2F37A2 +:10490000FD092F27FD082E07F9BE8023451000481A +:104910004470004C4651000158528C08E233E905BE +:10492000DD4EEAE98400D5284300C42442609C247B +:104930008440E252E814941140404000888522F2FD +:104940000CAA5EF78033E9088806880522F014B2C5 +:104950005EF7FFCEE9068C418400D5ECC009D50393 +:1049600084018060DD4EEAE93E37F9ECD5088C2100 +:10497000D5D68400EAE9DD4E3E07F9ECB80A84C0DA +:104980005A08030ADD51C8042E67FA21C60484C1FF +:1049900084E4D50284E1EA6B5A08010480C084E211 +:1049A000EA98E602E80384C084E1DD5B49001B2647 +:1049B000C00384C084E1490025C44003982054907A +:1049C00000FF2EA7FD092E47FD082E87F9BEDD51F9 +:1049D000F0812F37FA20EA9884A051E9FFFF806523 +:1049E000458000264570002446B1000158B58C086A +:1049F00045500048454FFFB85D100002E26AE8519B +:104A000042C1D4245202A9645016195442D1E02460 +:104A10004361DC24880B882B4391D0248640E3C477 +:104A2000E83C4E82000522208000AC80F20141006B +:104A30001400C2104F32000F4F13000D38283511EB +:104A400023007D2F4228787340214C5612207D2F61 +:104A5000D5184020E4003821591138F83511898CD7 +:104A600023087A80FEB442279C73422818734021A1 +:104A7000245612207D2F4F12000522200000D5025F +:104A8000A488122082884E83000522200000AC8872 +:104A90008DC18C028C22D5C48C615052FFB4D5AF2D +:104AA0002E07FBF4EAEAC811460100045800056C21 +:104AB000441000FD442002F849002C522E0FFBF454 +:104AC0004E04013A4800008646D1000158D68C08B1 +:104AD00050827FFF8640FB3645600024826D47711F +:104AE0000007597B832447810007598C03004590B8 +:104AF0000064540900FFE20AE8D8547900FF423309 +:104B0000D82480C4981C40B004089C3980A48184B7 +:104B1000426024734259247342C3A4738868862078 +:104B200050318CA8506311B84056942041438408FA +:104B300040C6B020821140398C204069982040083E +:104B40005C00382050004008600038105010841F6E +:104B50004E1700038401FE444156440096484F021C +:104B60000018220294B1FE14222294B04000641670 +:104B70009603E040E81FC11E4E05001D4E25001B98 +:104B80009A82FE549026964BAC5AAC72D513880785 +:104B900081E842F024734009BC20220014B2FE0CCC +:104BA000221A94B140006416FE8C4021645688029B +:104BB00096034018AC00883312008CA98FA2120A09 +:104BC00091E08EA25B0001048601D5BA8DC1D59219 +:104BD0002E07F9D3C8042E77FC6CD503447000FF70 +:104BE0002E07F9E8C8042E67FC6CD503446000FF6B +:104BF0002E57FD09EAB19D2951307FFF5100000178 +:104C00004611000358108FC884618620E264E820B2 +:104C10002220800123208002E1C2E8068A52FEB4ED +:104C20009048AC88D50313108000382081113920BA +:104C3000CD11E1C2E8078A52FEB490483820C1097C +:104C4000D5033910C1098C615010804CD5E0446007 +:104C5000004CFFAC9C814611000358108F7E51130D +:104C6000004C86018640E382E821223080262330F2 +:104C7000804CE1E3E8068A73FEFC9068ACC8D5037B +:104C80001320800041309800383098112339FFDA22 +:104C9000E1E3E8078A73FEFC90683830C409D50365 +:104CA0003920C4098D818C22D5DF461100032230C2 +:104CB00087BF46110003221087E44460004C88231C +:104CC000902146310003121187BE806E802E423241 +:104CD000187342129873227191BB221091BA8827DF +:104CE0009021121191BA403708204017002022600D +:104CF00091BA221191E088269021121191BAFA7688 +:104D0000FF1C986242228C738804400700204027D1 +:104D10000820224011BA220111BA40170420880449 +:104D20009001120091BAD507E6064EF2FB2384618A +:104D300048FFFB73FCE73E1FFEFC38008101DD9E4F +:104D40003E0FFB48A680FA36A601EAC8EA41582180 +:104D50000C08401100205010A374400100203C1F9B +:104D6000FED1500029643C0FFECFDD9EEA41582160 +:104D70000AA0383105003831010840310420A6D995 +:104D800040210020AED1EA4158210AB8383106024C +:104D90003831020A844C42300824FE8CEB10584211 +:104DA0000B78996388823B024800EB1058420AE86E +:104DB00088443B02C82088643B0148003E2FFD2008 +:104DC0003B01C82040110440EAFC3A1084003A102C +:104DD0000420DD9E8420EA4158210AB83811020AD5 +:104DE000844CFE84EA3A58318B788862B623A859FD +:104DF000A85AEA3A58318AE88843B622A851A852FC +:104E00002E37F9963E2FFD2038310208EAFCAE41DC +:104E1000AE422E17F9AEAE43DD9EFC0049FFFF9275 +:104E20003C0DFED1220000004E05019A804080A07A +:104E3000EA6F2E07FB4900108AB7E220E8409A414A +:104E4000E422E940EA2FEA3A043182DD8843EA3A73 +:104E5000044182DBEA3A043182DCF8484651000121 +:104E6000142282DDEA41144102DBEA41143102DC02 +:104E70002E27FD4DE240E8523E07FD4D2E27FD4E08 +:104E8000E241E844EB1D3E17FD4EFA56420088739E +:104E9000EA6F58108C08500014B094018801221059 +:104EA00000025A10FE433C3DFEC42E27FB48ACC214 +:104EB000EAEF3E27FB403E17FB41FC808A20E422BC +:104EC000E8C2EA3AEA2F00318AB6E2614EF2014CBA +:104ED0009ACBE462E8B9EA3A043183018843EA3ABA +:104EE000044182FFEA3A0431830042428073423235 +:104EF000847383FF4651000114228301EA41144167 +:104F000002FFEA4114310300D5B42E27FD4FE222FF +:104F1000E8BDEB1D3E17FD4FD5B92E27FD4CE20233 +:104F2000E8AE3E07FD4CD5AB2E27F9D4EA6F04104E +:104F300082B98C213C3DFEC4ACC2E241DD56141066 +:104F400002B9E80D49FFECB75A00010AEA2F2E0713 +:104F5000FB493E17FB403E07FB41FC80490011A284 +:104F6000C8F6EA2FC10FEAE4EA3822517FDAD00A04 +:104F7000EA44EAD0EAD52231FFDA8802E0034EF2B1 +:104F80000120EB688E01E020E80FEAE4EA382251C4 +:104F90000026D00AEA44EAD0EAD5223180268802E7 +:104FA000E0034EF20100EAEFC10FEAE4EA382251D1 +:104FB0007FFFD00AEA44EAD0EAD52231FFFF880217 +:104FC000E0034EF200E3EB298E01E020E80FEAE473 +:104FD000EA3822510001D00AEA44EAD0EAD5223167 +:104FE00080018802E0034EF200C5EA2F4E120056FF +:104FF000EAC0C229EAACEA382251FFD9D024EA44F7 +:1050000022518000EA4F2241FFDAF88AE91C22513E +:10501000FFFFE005E918EA4E88852231FFD9888034 +:10502000E083E9118E218E41EA20EAE0F8CBEA60C4 +:10503000EA658C218C01EA20EA5749FFFE83EA2FBA +:10504000C12CEAC0EB298E01E040E827EAACEA383F +:105050002251FFDBD022EA4422518000EA4F224154 +:10506000FFDAF85EE91A22518001E005E916EA4EFE +:1050700088852231FFDB8880E083E90F8E218C4117 +:10508000EA20EAE0F89FEA60EA658C218E01EA20D6 +:10509000EA5749FFFE57EA2FEB688E01E0204EF2F7 +:1050A000FF57EAC0C22CEAACEA3822518025D0274B +:1050B000EA4422518000EA4FF831E9212251FFFFF2 +:1050C000E005E91DEA4E8885223180258880E0834D +:1050D000E9168C218E41EA20EAE0F874EA60EA657C +:1050E0008E218C01EA20EA5749FFFE2CEB68EA2F5B +:1050F0008E01400080074E02FF2BEAC0EB298E0193 +:10510000E0404EF2FF25EAACEA38225180274C50AD +:105110003F1FEA4422518000EA4F22418026880541 +:10512000E00483FF4EF3FF1422518001E0054EF3AB +:10513000FF0FEA4E8885223180278880E0834EF376 +:10514000FF078C218C41EA20EAE0F83CEA60EA653E +:105150008E218E01EA20EA5748FFFEFA84A084409F +:1051600048FFFE688A61E4624EF2FE6F48FFFEB5BA +:105170008C21EACEF827EA65EA608E01EA20EA5738 +:1051800049FFFDE048FFFF338E21EACEF81BEA65B8 +:10519000EA608C01EA20EA5749FFFDD4EAEF48FFB4 +:1051A000FF148C21EA20F80E2E07FB408E012E17EB +:1051B000FB41EB14EACE49FFFDC548FFFEF68E2108 +:1051C000EA2049FFFE2C2E07FB408C012E17FB41E5 +:1051D000EB14EACE49FFFDB6EA2F48FFFED4FC608F +:1051E00049FFEB6680E0EA4A8400EB4A84C0EA4A61 +:1051F000469A55AA1200803746B1000158B58C086E +:1052000080265094855A46C1000158C60974EA7830 +:10521000E2224EF2007044000048820B430080738B +:105220002F17FD082F27F9F650A080014400004CED +:10523000808BFAB442450073FF4C924151081954D7 +:10524000413884095042296640539420840040200C +:105250008806448000FE96C0E27140D80020E836FF +:1052600046E1000704E703C5EA5B4CE4C00C5B2899 +:10527000010AE3E3E807C2048E259649D5038E2A86 +:10528000964902F68000EA23E02FE8161282000019 +:10529000EA4A021080368C6140E604205CF080957A +:1052A00038A6050810370001E8038C2196494631DD +:1052B00000051211803602168000964B4E1700042E +:1052C0008CC197B18C018C82D5C7EA2C02100036B4 +:1052D0002E07F9C4E220E90A49FFEAED5A00010766 +:1052E0008401EA978400EA5DD505541500FF48FF64 +:1052F000FF90EA99C8205CF3003DE912EA2CEAA687 +:105300005CF000C8E80D49FFEAD65A00010A2E07F2 +:10531000FB5FE603E8088C013E07FB5FD5048400D1 +:105320003E07FB5F2E07FB5FE603E9058401EA9772 +:105330008400EA5D2E37FCDFCB0CEA2C022000371C +:10534000EADC9E41EADB8E01FE0CE040E926D52432 +:10535000EA5E2E67FD09DD52FEC49491460100030A +:10536000EA9B84A0D6EB802099C24C138011A5083B +:105370009723E064E80A464100050242003746915F +:1053800000058C81124480378C22D5F08CA197685F +:1053900050000048D5E8D5002E0FFBF44E04004F16 +:1053A0003C23FD1DEB27EB714651000158528C0840 +:1053B0008C819DC984004500004C8225446000FC1E +:1053C000FBD6E080E91A80654230407322F191BA41 +:1053D000E04FE803126194B280674230487341386D +:1053E0008C2022F991BAE04FE80540328C201261FE +:1053F00094B28C019600D5E6EA3AEA5FFAB68C21BF +:10540000840080E3446000FCFF64E020E917404131 +:10541000802022F211BAE04FE803126214B29928F8 +:105420004103902022F811BAE04FE8054041902056 +:10543000126214B28C019600D5E9FCE0FC613FCF0A +:10544000FAEC84C080068CC197B049FFFCC55A684D +:105450000CFB8400B880B889EA2C021000362E07B5 +:10546000F9D49201E220E8283C03FD208C0196014A +:10547000EA5D2E37FBA3844AFE9CE040E81DDD4D2B +:10548000C003DD51C8198400EA5DEAEDEA97C11551 +:10549000852046A1000158A50C08810980E980C932 +:1054A00046D1000158D68974818A46E1000158E747 +:1054B0000B7848000095C9058400EA5DEAEDEA979B +:1054C000EA99C0E7EA889604C0E484003E07FA0E31 +:1054D0004800012A40268420A711383685008044E0 +:1054E0004221C07341150820231894B25B18FE04B2 +:1054F000480000818C219648E225E9ED816780A66D +:105500004E0200FDDD5610600AB65CF38022DD56C7 +:1055100010700AB74EF3007B9E36E6054EF2007718 +:105520003C83FD283C93FD23440001F4EA2BEA75FB +:10553000DD5600000AB6EB14DD5600000AB7EA5744 +:10554000F58149FFFC6C2E17F9D4DD56040002B931 +:10555000F501E2204EF30068EA8896044E030071DC +:10556000C6039F719768C7049E3954B000FFB80105 +:105570004E03008FDD56040002B95A0001044800B2 +:105580000088FA54802B421288734015042022F0C0 +:105590008CAA5EF7815F4EF2007CC50A9E29802BA3 +:1055A000421008734005042022000CAAEB5EEB6455 +:1055B0008E214C50805DE0A1E9504EB2005DFA347E +:1055C000804B422284734016082022108CA9C153BC +:1055D000EB718E214CB0C0535A08035B840B49FF1A +:1055E000FBFBEA2C0250003684008020FB9648FF2B +:1055F000FF8540250820222111BAE0024EF2FF7CEF +:10560000961180E480C348FFFF77B8004E02FF92F6 +:105610004E82FF904E92FF8E3C8BFD283C9BFD23DB +:1056200048FFFF8849FFE947F5015A08010448FF90 +:10563000FF958401EAED8400EA5D48FFFF8F2E07A5 +:10564000F9FC4E02FF8FEA6296004E03FF8BB88092 +:105650008401EA97480000689C69FA54806B4230E4 +:10566000887340160C2022108CAAC9A88C019600C1 +:1056700048FFFFA58C019600D5ACE161E809FA343A +:1056800042B2847340B62C2022158CABC1A6B80060 +:10569000C0289E41856C804E4220AC73EA6FA09278 +:1056A00004108301E241E81D960014BF8001C01C74 +:1056B000F20150B07FFFEA6F58108B784215887363 +:1056C000A0CAEA6F04108301E261E80E802B49FF53 +:1056D000FB4F800B842B49FFFB4B540580FFD5E823 +:1056E000842B49FFFB45B800E60BE8038C01B8802A +:1056F000B8098C01B88948FFFF73BA002E37F9E763 +:10570000EB1058420AB88020E222E80A385206021A +:10571000E265E8038C0196008C219648D5F6DD4EB3 +:105720003E07F9EFFCE1FC6051FFFB783C7DFEBBDE +:105730004E7202784627FFFF8420B14E510F8068D9 +:10574000B1A6511F80C8512F80F8504F812850EFCB +:105750008158513F8188509F81B850210FFF8400AC +:10576000B0C23801860A50AF82484430003042A0AF +:105770008C733802860A3808060A3803060A380885 +:10578000860A3809060A3802060A3807060A38095E +:10579000860A3804860A806A3821820A8C015A08EF +:1057A0000CFD8C215A180CDD3C1DFEC18540E22702 +:1057B00046B7FFFF8181800A4013BC1B47410001AF +:1057C000594A07CC4590FFFF4550003050B58FFF38 +:1057D00047610001596B085C397A2B0240250C089F +:1057E00046D1000158D687CC4D7C8028408150009E +:1057F000502F8248418100408440E041E81BE2474D +:10580000E813383B0B0204F4000141C1DC01403BCA +:105810000860A0D98A6FFEDC42F15424423E7073C6 +:10582000383C3C0AD5054231542438BC0C0A8C4122 +:10583000D5E538A9820A8C018D415AA80CCF46378C +:10584000FFFF44B0003050318FFFE001E810502FCF +:10585000824840A100408440E041E80742812C2476 +:105860008C413835200AD5F98C01D5F08400845F4D +:10587000806040A10409E001E80B3822820A382840 +:10588000020A3839020A38A2020A8C01D5F550BF43 +:105890008248800B854045400030E141E81FB460FC +:1058A0008441E041E809428150248C413880200243 +:1058B0004231A001D5F73834AA0AC30D8500E101B1 +:1058C000E80A42F450248D0138203C028A433820F3 +:1058D0003C0AD5F68D418C04D5E186A08015869FC3 +:1058E000E001E82BB50B8441E041E80738A58A02C6 +:1058F0008C4142842801D5F93888820A8440E041ED +:10590000E81138A58A024C85400C38A28A024EA4C0 +:105910000008B0C23821820A38028A0AD50A8C41AE +:10592000D5EFB0823803560A3941020A515A800134 +:105930008C0150B58030D5D58015155F8001C80920 +:105940008400EB105842085C4420FFFF480000AA86 +:1059500046A7FFFF50A50FFFF2018500454000302C +:1059600082AA86DF872040FC88078400E82A3983E2 +:105970006602517F824839C8E202437C5073E001DD +:10598000E81D38F20202E818383B820239E90202C7 +:105990008A7C887EE06FE810CB0C38F282024EF5EC +:1059A000005638F30A0AEB433988020A8C41D504C1 +:1059B000EB433987020A8C01D5E3519C8001D5D491 +:1059C00082F5E001E80838F20202E803437BBC01FB +:1059D0008C01D5F88560E162E80A38F32E028D610A +:1059E0003808BE0288173808BE0AD5F64391200051 +:1059F0008400E001E8B93832020250F00001C31F10 +:105A00008A77EB43CB2138B28202398702024EB447 +:105A10000011816FE161E81A38222E02CA08B0BE77 +:105A200038212E02B0FE88573821AE0A8D61D5F399 +:105A300038B30A0A3988020A8C41D50638B90202FD +:105A4000897738B9020A800FD5D5B0823821620231 +:105A5000B0C23801E20A3982820A4E25000639882E +:105A60000A028002D5F3F0018E01F0814E02FF6A36 +:105A70008400E001E8073968020A38A2020A8C01B2 +:105A8000D5F984408002E0014EF2FF6EB0C238B119 +:105A900082024EB4000538030A0A8C418C01D5F409 +:105AA000501F81E898C19860EB573822000A8C0893 +:105AB0003B01C420A88947E1000159EF085C5A085E +:105AC00060F18420EA415821079C864244A0FFFFF0 +:105AD00046B1000158B587CC4480FFFDEB10584219 +:105AE000082C81C147410001594A083884AC86A777 +:105AF00047610001596B079086FD5C638003E227D4 +:105B00004EF20090B0C22F97F9FB390186022F1791 +:105B1000FA082E07FD12E38C43C88024E8083919DF +:105B2000C20238F14602E80345C000642EF7FA15B8 +:105B3000E9042EF7FA21E8072F17F9EEE7A3E803A7 +:105B40003F27F9EEE38CE84C3989C20238FA60004D +:105B5000E82982304310947350FF824838F7C60218 +:105B60003914C202559C800F40F7C40039116202FB +:105B700089BC4117C63750FC80074207802440F09B +:105B800055F6E3AFE90F2E07F9EE2F97FA0750F01D +:105B90000003391B600042FCDC73E1AFE821C62240 +:105BA000C02280104200947350FF8248391782024D +:105BB0003804C2023CF3FD223D03FD1E8811430759 +:105BC000C024E380E92BF81540FF60603B084400E7 +:105BD0003B07C420381260083801620AD51F8400D0 +:105BE000D50280063906830241100C084D05401489 +:105BF000510F81E84108046083FF40FF44003B08E7 +:105C000044003885830A3B07C4203812000838E175 +:105C1000020AD5048C015A080CE78C2148FFFF7159 +:105C200051FF8488FCE0FC003FCFFAACB9012E079D +:105C3000FBB85A1807039201DD4E3E07F9C2B810AF +:105C4000C0062E07F9BF5A08011CD506EA99C8FA02 +:105C500049FFE631C8F72E27F9C22E17FBBBB81350 +:105C6000FE54E201E810EB5F42108C0BC1038C0183 +:105C7000B893DD51C805DD4DC803B800C0348400B9 +:105C8000B893D5318401EB388400EAAE8420B98E14 +:105C90008401B897DD40EA59DD54DD53D8033E173F +:105CA000FA01B8015A0807048408D5085A08020BFB +:105CB0002E07FB875A08030784062E17F9CE49FFE3 +:105CC000DA9F840049FFE2812E07F9CEC0038400E9 +:105CD000EB4EB8015A0006045A080806EA34580088 +:105CE0000FE0B895FC80FC003FCFFAB0B90FB800C8 +:105CF000C9105A080807EA4A02108036C90AD505B1 +:105D0000661000025A1004F92E17F9BF5A1801350F +:105D100084203E17F9DD8420B9925A0008045A08FD +:105D20000623B98D5A0808048407D5045A080607C3 +:105D300084022E17F9BF49FFDA63840049FFE24568 +:105D4000B8005A080705EA52EAA4D505DD4DC80691 +:105D5000DD56EA8EDD4EEA83D5415A080140EA520B +:105D6000EA28D5F98E03E603E839EA3FB401580082 +:105D70000400B601D5335A0806292E27FBD2840A1F +:105D8000FE8484204641000058420FE04651000046 +:105D900058528C803832050138028501E203E8034D +:105DA0009A18D5028A03E040E80DDD40020007A5FD +:105DB000DD438C019601EB03B805B88D8401EAAE92 +:105DC000D5048C215A18D8E8B80DB905E201E804C9 +:105DD0008C01B88DD5038401EAAEFC80DD505A08F1 +:105DE00008052E27FB8ED50C84405A08060A2E275C +:105DF000FB99DD40EA59DD54DD53D802EAFE8420E8 +:105E000080014631000058318E3038F18511E04F65 +:105E1000E8065CF00095E8038C0196018C215A1885 +:105E2000D8F6EA4AEB4ADD43045083C5EA79EA63CF +:105E3000D911C00D2E07FA018C019600E6023E072B +:105E4000FA01E8088400EA4AEB4ADD9EDD4E3E078F +:105E5000FA01DD9EFC20DD505A0808092E07FB8E52 +:105E6000940196032E37FBC5D5165A0806102E0747 +:105E7000FB992E37FBC1DD43045083C5EA799401B9 +:105E8000EA639603D10696D9D50684008060D503CF +:105E90004430009684403C6DFEC0940280A246715E +:105EA000000158738C0882024711000059188E3087 +:105EB00098570210879A384308019B0C97219663E4 +:105EC0004E150007E0618420E8079A63D504882313 +:105ED0004210C001964B3818880988204E140004DF +:105EE0008CA197698C425A29B0E52E07FBF5E20593 +:105EF000E80AEA3400000C7CEA9C58000007EACA71 +:105F00008401EA8CFCA0FC002E57F99B8CA19768B9 +:105F10003E57F99B2E07FBD3D8098421EB15844605 +:105F200049FFD2473E07F9B0D50AE205E8083E0727 +:105F3000F99B2E07F99E8C013E07F99E2E07F99ECC +:105F40005A08142884218446EB1549FFD2323E07B3 +:105F5000F9B084203E17F99EFA2EC8132E07FBD401 +:105F6000FE443C1FFEB1EA2CEB405CF00033E80538 +:105F70002E07F9B9E60BE90DDD523C0BFD11D509F1 +:105F80002E07FBBAFE442E07FBBBFE443C1FFEB1AE +:105F90003C03FD11C0048E013C0BFD11FC80FC0094 +:105FA00046690000506300E8B406920C960F5A0050 +:105FB0000306EABA49FFDE6FD5F8EB158420844169 +:105FC0004430007149FFD1E0FC80EA84DD9E3C0D45 +:105FD000FEBBC00484003C0FFEC2DD9EFC403FCFF0 +:105FE000FAAC844080E080C1450000304651000199 +:105FF000585284B482224430FFFF8082472100013E +:1060000059290190453FFFB446910001589481A859 +:1060100046A1000158A5019C8025421140738400CF +:106020008C288C01B7A11430FFFE1430FFFF8C2C9C +:106030005A0804F9393908083844880838450808E6 +:106040008C415A280CEB8400EA41582107CCEB67BD +:106050003811000A98C28C08A8595A0860FBC70476 +:106060002E07FBEBD507C6042E07FBEDD5032E0745 +:10607000FBEF8C01EB2A2E07FA0A5A08010484026E +:10608000EB2AEA7F8520EAE73E97F9FC3E97FA0B78 +:1060900084403E97FA05BA90BA99EA2C122000364D +:1060A000BA96BA91BA983E27F9F0BA943E97FA0098 +:1060B000BA933C2DFF4092478C4196903E27FA11AF +:1060C0003C1DFF4192278C2196483E17FA022E076D +:1060D000FB9E2E47FD123E07F9FB5430000F425144 +:1060E00090249204402288563C2BFD1F2E27FD133E +:1060F000FF04FED4FE14401184363C1BFD273C4BAC +:10610000FD223C0BFD1E2E07FB9D5410000F3E1779 +:10611000F9EE92043E07FA082E07FB8592043E072B +:10612000F9C78402B88CB89A2E07FB8849000ABBCD +:106130003C0BFD212E07FB9249000AB53C0BFD25C7 +:106140002E07FB9349000AAF3C0BFD263E97F9E072 +:106150003E97FA0C3E97F9E12E07FBA6EAD22E07EE +:10616000FBA7EB1C2E07FBA9401010093E17F9F303 +:10617000961F842AFE0C3E07F9DA2E07FBB33C0B70 +:10618000FD29C60B2E07FBAE5410000F3E17F9D7A2 +:1061900092043E07F9C8D5132E07FBAC5410000F2C +:1061A0003E17F9D792043E07F9C82E07FBAD5410ED +:1061B000000F3E17F9C092043E07F9D8DD5658008B +:1061C0000700843F844C490020D384003E07F9ED4A +:1061D0002E17FBBE8400400004063E07F9DB2E2785 +:1061E000FBB63E27F9C52E37FBB7FA24422184734C +:1061F00096903E27F9E5C00284443E27F9CB2E074E +:10620000FBB884403E07F9C23E27FA0E3E27F9FA52 +:106210003E27F9BC3E27F9DE3E27F9C384003C0B3C +:10622000FD24EAE23E27F9D93E27FA013E27F9EF9D +:106230002E07FBA83E07F9E72E07FCE05410000FDD +:106240003E17F9F992043E07FA102E07FCE15410AC +:10625000000F3E17F9FF92043E07F9BB3E27FA15DF +:10626000CF033E27FA213E27FA193E27FA1E3E2782 +:10627000FA163E27FA173E27FA1A8400EA89EA85B9 +:106280003E27FA1F84203E27FA1DB9AAB9A92F0F6D +:10629000FB834F050003842284803E17FA063E47A5 +:1062A000FA1B8400EB0D8440BAA82E57FC4A4430F8 +:1062B0000064FF5C3C5BFD492E57FC4BFF5C3C5B84 +:1062C000FD4D2E57FC4CFF5C3C5BFD442E57FC4DB6 +:1062D000FEEC3C3BFD4C2E37FC4E3C3BFD472E3745 +:1062E000FC4F3E37FA1C2E37FC513E37FA203C2B30 +:1062F000FD453E07F9C1BA8F3E47F9F73E47F9F22F +:106300003E47FA043E5804C03E48016038028909FD +:10631000380209098C4184605A28D8FA8400B88070 +:106320003E37F9B1EB6FB8823E37FA0F3E37FA12BB +:106330003E37F9C62E07FC42402010093E27F9CF10 +:10634000961F3E07F9F5CF0F3E37F9DDEA341030DE +:106350000C7CEA3410300C7D8401EB503E37F9FEA2 +:10636000BF8ABF8DC604EA52EAA4D5124F04000CBE +:10637000C908DD4DE6013EF7FA2184013E07FA0621 +:10638000DD4DC804DD56EA8ED503EA52EA28DD4E1B +:10639000EA8384E0442005103E77F9DF842046013B +:1063A0000004EA6749001FE43E77F9DD8401EB4E03 +:1063B00084C03E77F9BFBE8E49FFE3D5EA2C126058 +:1063C00000383C6BFD203E67F9BE3E67F9CC3E6766 +:1063D000F9EC3E67FA033C6BFD1A460100051060BC +:1063E000019E46010005126000CE460100051060C6 +:1063F000010A46010005126000844631000558314B +:10640000810CEA2446210005582100789873380150 +:10641000980A3801180AA8091070800898728CCC64 +:10642000A809107080085A6890F38400EACFDD59FB +:10643000EA52EAA4842049001F9B49FFE0FEFCC009 +:106440002E27FA0A5A1802053E27F9E4D50F8E07BF +:10645000E602E8052E07FBECEAFCD5052E17FBEE5D +:1064600040010440DD4E3E07F9E484003E07F9CACE +:10647000EAC1EAF0DD9EFC403FCFFADCDD51C80303 +:10648000DD4DC01CB8005A00020A2E07FBB04900BF +:10649000090AEA2B2E07FBB1D5082E07FBB44900E9 +:1064A0000902EA2B2E07FBB5490008FDEA75EA4F01 +:1064B0009402EA2BEA4E9402D52C2E07F9EAC8146E +:1064C000B8005A00020A2E07FBB0490008ECEA2B7C +:1064D0002E07FBB1D5102E07FBB4490008E4EA2BC8 +:1064E0002E07FBB5D508EADA961F490008DCEA2B2F +:1064F000EADA9204490008D7EA75EA62C00C2E076E +:10650000FC43490008D0EA2B2E07FC43490008CB86 +:10651000DD4EEA7549FFF66549FFF792DD5AEB4516 +:10652000C00749FFDBB55A0801044900061DB80A37 +:10653000B904E201E80EC00DEA62C00BEA4F940113 +:10654000EA2BEA4E9401EA7549FFF64B49FFF778CA +:106550008400EAECDD5A4200180BBA04C02CB805DE +:106560005A08012AE642E927DD5600100AA0DD5646 +:1065700000000AA2E201E8039A08D5028A012E3738 +:10658000FBDAE003E818DD5600100AA1DD56000032 +:106590000AA3E201E8039A08D5028A01E003E80BA6 +:1065A000DD56EB3FEA6F041082E39201E220E8033C +:1065B0008401EAECB80AE240E8192E07F9EAC016AD +:1065C000EA62C8142E07F9FDC811DD4DC80FEADADA +:1065D000961F49000868EA2BEADA9204490008632A +:1065E000EA7549FFF5FE49FFF72BB804C01CEA6FB6 +:1065F00000108AA0DD568E2100000AA1FA54420044 +:106600008873EA6F58108C084000802022F00CA993 +:106610002E07FB8A9401E00FE8068400EAE7EACC43 +:10662000C112D50E3C03FD1B5CF003E8E80C8C01A5 +:10663000EAE73C03FD175CF000C8E8058C01DD4E7D +:106640003C0BFD17DD40045003C4DD54DD53D80A74 +:1066500049FFE82EEA98EAADE8108C013E07F9F709 +:10666000D50CDD5A4200100BC8F449FFDB115A006B +:10667000010448000090D5EDDD515A080159B805D4 +:10668000C0563D2DFEBBE212E852EA98E603E94F00 +:106690002E67F9D62E57F9E94731000159398AA0FA +:1066A0002E77FA0486008133E392E8375008000120 +:1066B000551000FF809140A4C020E292E82C3839A8 +:1066C000C10038199100E223E8039B99D5029B8B06 +:1066D0004004902000250001A60197B0E202E803E3 +:1066E0009B50D5029B42E2239768E8039A59D50252 +:1066F0008A23E423541780FFC10BE202E8039A10B7 +:10670000D5028A02E403540780FFC00284E18C8131 +:106710009720D5D48211D5C93E57F9E93E77FA04BE +:106720003E67F9D65A7801043E77F9F7EA98E6020F +:10673000E90484003E07FA042E07FA045A08010A05 +:10674000B805B8842E07F9F28C013E07F9F2D5227C +:10675000C82149FFE62549FFF7E849FFE90449FF59 +:10676000E9D749FFDA955A080107DD56580004B405 +:1067700049FFE37C46010005EA9A49FFEAB8460171 +:106780000005EA9A49FFE52746010005EA9A49FF14 +:10679000E02F49FFDA7D4E020088B8055A00010457 +:1067A00048000083BA04E642E8245A200104480065 +:1067B000007C4601000504100044DD560400024040 +:1067C000E201E8039A08D5028A015CF000C9E811E9 +:1067D0004601000504100043DD560400023FE201BB +:1067E000E8039A08D5028A015CF000974EF3005D39 +:1067F00084A0EA3AEA5F4440051084009845882363 +:1068000022608CAA8C02126085125A0848F95052F4 +:106810008048DCF48401EA7212008316EA521220E6 +:106820000317460100050000019EEA72120083185A +:10683000DD56EB3FEA72920112008319DD56040027 +:1068400002E3EA7292011200831A4400006FEA72B6 +:106850001200831B2E27FA15EA43EA7FFE0C842AD6 +:10686000EAC82E27F9B144102710EAC8EA721200CC +:10687000831C2E07FA04EA721200831D2E07F9F218 +:10688000EA721200831EEB28EA721200831FEA727A +:10689000440000DE1200832049FFE00DEA9FFE0C59 +:1068A000EA721200832146010005EA9AFCC0460103 +:1068B000000558000078DD9E4611000558108078CC +:1068C00046010005EA9AF802F8013B0064043B0027 +:1068D000E42483FF3B0058003B00D820DD9E3C0FA2 +:1068E000FEBCDD9E3C13FD483C53FD47D9048400AB +:1068F000EAEBD5092E27FA15C206C8058C213C1BE8 +:10690000FD48DD9E8400EAB8DD9EFC203C13FD4A74 +:10691000C905EAA3DD5549001D2B3C33FD4A3E580D +:1069200004C08C6196D93C3BFD4A840080C046710E +:106930000005587385003F080310EB4D452F92A0CA +:10694000EA5B38438101968BEB469A518824964B3B +:1069500038128109EA5B3E2804C0964BE1A13E480B +:106960000310E905EA5B964BE032E80284C18C0132 +:106970005A08D8E85A68010A842096DB80A1F80EEC +:106980005A18D8FF8400EA89EB0A3C03FD4AE20367 +:10699000E9158400EA89842080A138620501380164 +:1069A00005019603EB2F8806960138020509385138 +:1069B00005098C2183FF5A18D8F2FCA0FC203C1357 +:1069C000FD46C905EA92DD5549001CD23C33FD461F +:1069D0003E5801608C6196D93C3BFD46840080C0E6 +:1069E00046710005587385003F0FFFB0EB4D452FF2 +:1069F00092A0EA5B38438101968BEB469A5188243A +:106A0000964B38128109EA5B3E280160964BE1A162 +:106A10003E4FFFB0E905EA5B964BE032E80284C1E5 +:106A20008C015A08D8E85A68010A842096DB80A1B4 +:106A3000F80E5A18D8FF8400EA85EB0A3C03FD469D +:106A4000E203E9158400EA85842080A1386205010B +:106A5000380105019603EB2F8806960138020509D7 +:106A6000385105098C2183FF5A18D8F2FCA0FC008C +:106A700084013E07FA193E07FA1B8400EB0D8421BE +:106A80003C1FFED3EAB8EA89EA85DD55EAA38420F3 +:106A900049001C6EEA928420DD5549001C69FC8087 +:106AA000FC003C1DFED35A18011E2E17FA195A1865 +:106AB000011384403E27FA19EB51CB043E17FA210B +:106AC000D5065A3801093E27FA21842049FFCF2EE6 +:106AD00049FFD3612E07FA1A8C013E07FA1A840285 +:106AE000D50784035A1002055A1803068400DD4EA8 +:106AF0003C0FFED3FC80FC003C1FFEC084203C1FEA +:106B0000FEBFDD5946010004EA6749001C31FC80E4 +:106B1000FC00E201EB04E80FC805EA3E3E18031052 +:106B2000D504EA3E3E1FFFB0EA685821050049003F +:106B30001C30FC80C80449FFFEEAFC8049FFFF408E +:106B4000FC80FC005A0008305A00062E3C13FD441D +:106B50003C0DFED5E220E9083C13FD4C3C0DFED473 +:106B6000E2208401E8028400DD4E3E07FA1FEA8835 +:106B7000EAD3C00C2E07F9F0C009EB04C80449FFA2 +:106B8000FEC6D51149FFFF1CD50E8400EA89EA85AF +:106B9000DD55EAA3842049001BEBEA928420DD55F1 +:106BA00049001BE6FC80FC203FCFFAACEB51CB0444 +:106BB0003C63FD49D5075A3801053C63FD4DD502BC +:106BC000EB5AEB044701000559080500C839BD2AF6 +:106BD00080E080203F1803104641000558420350D2 +:106BE00038280101392881018A52969338220109F7 +:106BF000EB2696934E270005EB269693D504EB26BD +:106C00009693FE928822382801018C0188E25A0866 +:106C1000D8E9400284094010043C44007FFFE201AF +:106C200092E240103C1BE20740703C1BEB075CF01B +:106C30000032B9AAE8358C013E07FA1DD531BD29CD +:106C4000840080403E7FFFB046410005584201A0CD +:106C5000EB46391381018A31964B38120109EB60FA +:106C6000964B4E170005EB60964BD504EB60964BA8 +:106C7000FE4A8C0188415A08D8ED40028409402020 +:106C8000083C44007FFFE20240203C1BBAA9EB070E +:106C90005CF00032E8048C013E07FA1D84E0EB074B +:106CA000E60A4EF300E3EA61C019B92A5CF0919557 +:106CB000E9183C03FDB18C019601E60BE902840A58 +:106CC000EB1D3C0BFDB13C03FDB1E603E8045CF0B9 +:106CD0009B59E9078401EB53D504EB533C0BFDB101 +:106CE000DD40EA59DD54DD53D8098400EB534E33BF +:106CF0000061506307D097B1D5034E33005BEB1AA8 +:106D0000B92AE201E90C3C23FD4CB929E241E9072B +:106D1000E207E905EB2CC803EAF2C0068401EAEBBE +:106D20008400EAB8D504B81049FFFDDEB829B92AB5 +:106D30008806E201E905EB1A88C0E2C7E803DD51E5 +:106D4000C8062E07FB61C803EAF2C003EA99C00631 +:106D5000B80F660000025A0801102E0FFB834E0484 +:106D6000000CDD40EA8DEAD1EAA9D006DD40EA8DCB +:106D7000DD54DD53D807DD40EA8DDD54DD534C5042 +:106D8000406A49FFFE76DD56EA8E5010051049FF35 +:106D9000FEB4B80F5A0801048402D5065A00030451 +:106DA000480000598400DD4E3C0FFEBA48000053F5 +:106DB0005A3001044800004F3C13FD4CB829E22032 +:106DC000E9063C13FD44B82AE220E8068401EAEB18 +:106DD0008400EAB8D504B81049FFFD86BA2AB8295C +:106DE00088C2E2C0E805EAA0C103EACCC106B90F37 +:106DF000661080025A1801102E1FFB834E14000CDF +:106E0000DD43EAFAEB58EB3ED106DD43EAFAEA79D4 +:106E1000EA63D906DD43EAFAEB58EB3ED91B880258 +:106E20005CF03A98E8122E07FB60E61AE90C840041 +:106E30003E07FB6049FFFE1DEA52EA2850107AF037 +:106E400048FFFFA78C01D50284004614000A3E07C4 +:106E5000FB60DD51C003EABAD505B800C006B80032 +:106E60008E01DD4E3C0FFEABDD4D5A08012BEA844E +:106E7000C828EACCC926EB1ABA2AE240E8223C0329 +:106E8000FD4CBA29E240E81DDD40EA8DDD54DD53BA +:106E9000D018DD40EA8DEAD1EAA9D0133C03FD45C4 +:106EA0005CF001F4E8038C01D50D3C1BFD4549FF66 +:106EB000FDE0EA52EA2850107AF049FFFE1ED5059F +:106EC0008400DD4E3C0BFD45B9102E07FA1BC00FA8 +:106ED000C90E3C03FD4B2E27FA1CE240E8063E1784 +:106EE000FA1B3C1BFD4BD5068C01D5028400DD4E00 +:106EF000EB0DFCA0FC003FCFFAEC2E07FA1FC805F3 +:106F00002E07FA03C802EA8C2E07F9EBC03584007D +:106F1000EA8C2E17F9C5B808E220EB5FE82A422078 +:106F2000840BC227BA00C2042E27FA03C22249FFEB +:106F3000D6AF5C10000184014900169749FFD6A81E +:106F40005A0001048407D5028402842249FFD158E3 +:106F500049FFD69E80C05A08011349FFCC46C80697 +:106F60004900141E4900036ED50A3E67F9B4D507DF +:106F7000EA8FC1058C01DD4E3C0FFEC3FC80FC0096 +:106F8000DD40EA59DD54DD53D841EA61C8463C1D75 +:106F9000FEB7C1065A10030744000190D505EA7FE9 +:106FA000D50344000320EA6802210038E202E90226 +:106FB000CA038405D504EB6BC0058E01EB1D3E07AB +:106FC000F9D9EB6BC0068400EAE2EAD1EAA9D5055B +:106FD0008401EAE2DD54DD53EA94140103FD2E0737 +:106FE000F9F65A08011B5A18021944000050EA37F2 +:106FF00044000078EA76DD51C803DD4DC00EDD5255 +:10700000EA37440000DCEA76D5088400EAE2EAD1F7 +:10701000EAA9DD43140083FDFC80FC003FCFFAB0F9 +:10702000B80BB899DD43045083CFEA79EA63D106FF +:10703000DD43041083F95A1806048403D511EA4A83 +:10704000021080383C23FD21E2418420E805B98C00 +:10705000C00AB98BD508B9895A0002068402DD4EF0 +:107060003C0FFEB7B80BC80A2E07FB89EA373C0372 +:10707000FD25EA762E07F9D7D5215A0802142E07E6 +:10708000FB8AEA373C03FD26EA762E07F9D7EAAAFF +:107090002E07F9D8EAC42E07FBA6EAD22E07FBA7D3 +:1070A000D5165A0803172E07FB8B490002FCEA3756 +:1070B0003C03FD25EA762E07F9C8DD4EEAAAEAFD73 +:1070C000EAC42E07FBA4EAD22E07FBA5DD4EEB1C7B +:1070D000EA6BC024EA61C8222E07FC32EA372E0789 +:1070E000FC34EA76B9102E07FC37C104541000F0C6 +:1070F000D50340101009EB1D3C1BFD1CB9155A1897 +:107100000105961F9402D502EAFDDD4EEAC42E0762 +:10711000FBA4EAD22E07FC36EB1CB8005A08070580 +:107120002E07FB8DEA37EA84C0042E07FB99EA3765 +:10713000DD51C805DD4DC803EB2CC0072E07F9C88B +:10714000EAAAEAFD8C05EAC4B816C0038400EAAADC +:1071500049FFFF17B80B3E1FFA383E2FFA0D49FFC3 +:10716000DBB5FC80FC203FCFFAEC2E57FD212E47EB +:10717000FD2084229AAC8C41402104562F07FD2229 +:1071800088442E77FD239610EA4100210AA146612A +:1071900000079A824231000340281C018C414011B3 +:1071A0000436EA41882700210AA096489A8A42219B +:1071B0000003884396D1123307B52E37F9C6CB208A +:1071C000B800C057DD560010070CC9532E07FC400D +:1071D000E002E8132E07FA128C0196003E07FA121D +:1071E0002E07FA122E27F9CFE240E84384013E072A +:1071F000F9C63E17FA0ED53D3E17FA12D53ABA0136 +:10720000CA07BA00CA053E27FA123E27F9C62E372A +:10721000FC44EA41042102AEE262E82BFA768040A7 +:1072200042238C734661000158630C0840230820F8 +:10723000222114B25A20FD1E42080C734023002064 +:10724000220114B25A00FD16FE5C980C4003002087 +:10725000220014B25A00FD0E88A1405314202202CD +:1072600094B25A00FD0784003E07FA123E07F9C6A1 +:10727000FCA0FC01F081F001C00649FFCAB6C003C2 +:10728000EB6ED5FAFC81FC0184CEF081F0018EC159 +:1072900049FFD60297B0840549FFD4FDCEF8FC81A2 +:1072A0003EF8067040FFBC015CF7803DE8053DFFFD +:1072B000FEB68401DD9E3E080DF03C1DFEB68A1F21 +:1072C000E220E8033C0FFEB68400DD9EFC608400F3 +:1072D0003E07F9A3EB3D5A180803F8035A180604B1 +:1072E000480000BF2E97F9B14E93000ADD51C80740 +:1072F000DD4DC8053C2DFEBB4E2300755A18070412 +:107300004800009C2E87FA212E17FC533C03FD1DDC +:107310008600412080008623807044B001B046A1E1 +:10732000000158A50C08EA2C58000D74453000D80F +:107330008190802A4218AC73844050108A2442788D +:107340004C244268CC244E8200050240FAF0D5035A +:107350000240F8680A508001E285E8039B2CD502C0 +:107360008A85E092E80F4E93000E993A3840110159 +:1073700099723850150192814042143C1240FFFF2F +:10738000D52398FA38400D01E2A4E90C993238D09F +:107390000D0138F0110140F6BC06E80CEAF7E2A353 +:1073A000D50E993238F00D0138D0110140F6BC06E7 +:1073B000E90438300D01D505EAF7E265E904EAF79A +:1073C0001230FFFF84618C415A28D8BF5B0801044A +:1073D0003EC7F9B38DA18D815B1806AD3E37F9A389 +:1073E000D5335A10072B452001B04671000558735C +:1073F0008D74446000D84731000159398C089C8352 +:1074000043104824842043001824FEB4403804006C +:1074100038438D0198D138538D01928140388420B2 +:1074200088734042143C8C211241879A5A18D8F034 +:107430008C015A00030AD5E4EADEEA72EAD7EA6868 +:10744000EAA7490017A62E07FA173E07FA1EEA68B0 +:10745000582106B0EA3EEA4A58108500D506EA3EB1 +:10746000EA72EAD7EA68EAA7490017938400EA219A +:10747000DD505A0008165A00061484A08005EA3A26 +:10748000EA5FDD5950128F348823A4488CA2E6218C +:10749000880F9601DAF85CF000D9E902D500FCE02B +:1074A000FC413FCFFAB084003E07F9A049FFD4ACBD +:1074B0003E07F9AF8420F1814E0200C3EA9C0250DE +:1074C00080004410A55AEB6CEB304C5080BAEA9C1B +:1074D000025080004410A33A4C5080B39E41E627EE +:1074E000E9045A080914D50684213E17F9A05A0860 +:1074F000010EB8005A0008085A00060646010003AB +:10750000EA9BD518EA34EB3BD515541000F75A180E +:107510000205EA52EA87D50E5A18030AB814F08118 +:1075200049FFD3B6C008EA52EAA4D5045A080804B1 +:10753000B814F081B0413E0FF9AF490008DBF50106 +:107540004611000358108F7C84C1D107501085F07C +:10755000406284035C630001EAAFEADC8420FE84BD +:10756000EA3458000004949149001702B8005A0800 +:107570000809EA3EEA9CEB54F2014900170AD54B90 +:107580005A0006F98400F10149000822C006EA4DBC +:10759000540000F75A0803EFF101B8144C10400EE4 +:1075A000469100045894856CF0018029844049FF7D +:1075B000C970149F8001D509EA52EA874C103FF246 +:1075C000840149000805C8ED2F37FBF12F17FBF0A8 +:1075D0005003001294414260987394828400052FF6 +:1075E00080014098840895B180A080809C6CE293D3 +:1075F00041038400E81098C688728420E231E807CD +:1076000038A1850138A805098C21D5F98C8188A974 +:107610008802D5EDEAAFEB624201042488418C0276 +:107620004003802084209491490016A2EA4D540022 +:1076300000F75A0801044900015F49FFD449FCC121 +:10764000FC00DD5A9604C02BEA86490004D7C0042A +:1076500084003E07FB6649FFC8C8C0232E07FB66AF +:10766000C820EA86490004CAC017EA4DC81549FF78 +:10767000D3C04400025849FFD30E49FFC8B65A0888 +:107680000108EA7F49FFD30749FFC7B3D5F7840153 +:1076900049FFD3AFFC8049FFD2EFFC8049FFD3AE56 +:1076A000FC802E17F9BAFE0C9601DD9EFC60EA31D3 +:1076B0000470003F92F896785A10AA065A10CC042B +:1076C0005A18DD4C0460003F4003400954A000FFFD +:1076D00096314090200997B049FFC7955A70CC1A4F +:1076E0005A70DD2A5A78AA3084E046C1000758C68D +:1076F0000F809638E206E82750B38001800A80297F +:107700004025801349FFC65538061C0880EBD5F28A +:10771000844046B1000758B58F809610E206E81302 +:107720009DD138358800800A96B9802949FFC62C3A +:107730008047D5F4DD4000300F808029800A8046E4 +:1077400049FFC622EA498381B83F462BB00040007A +:10775000200840010115B8BFFCE0FC0049FFC5FD51 +:10776000DD5D84208441846249FFC60EF832844284 +:1077700049FFC60AF82E844349FFC606F81F49FF91 +:10778000C603840A49FFD287F824844449FFC5FC14 +:1077900084208445DD5D49FFC60C3E07F9B5F81924 +:1077A000844149FFC5F1DD5D84208442FA6449FFCC +:1077B000C5EBF80F844349FFC5E784208444443077 +:1077C0000080DD5D83FF49FFC5DF840A49FFD26386 +:1077D00084208061DD5D83FF844449FFC5D584201A +:1077E000DD5D844549FFC5E53E07F995FC80FC2039 +:1077F000840E49000403C82AFA02490003FFC82680 +:10780000FA06490003FBC822840A490003F7C81E90 +:10781000FA0A490003F3C81AFA13490003EFC8161D +:10782000FA0E490003EBC812FA18490003E7C80E24 +:10783000FA1C490003E3C80ADD48490003DFC80613 +:10784000DD5B490003DB8423C0028424EA6C02016F +:10785000009C0261000A84EA9B864400065CFF8467 +:10786000840E40631CD64063040D490003C7C82A38 +:10787000FA02490003C3C826FA06490003BFC8221A +:107880008007490003BBC81EFA0A490003B7C81A9B +:10789000FA13490003B3C816FA0E490003AFC81221 +:1078A000FA18490003ABC80EFA1C490003A7C80A1E +:1078B000DD48490003A3C806DD5B4900039FC802F9 +:1078C00092C18006FCA09C419221C113FA8F8E8147 +:1078D000C4104030047788619261E261E8039A8BBA +:1078E000D5029A99E642E9038023D5F28003DD9E12 +:1078F0008001DD9EFC403FCFFAA4EA3400000C7CFE +:10790000C004EA9C10008C7DBA125A280506840037 +:10791000EA9C10008C7D2E17F9EAEA84447003E893 +:1079200044602710FE3C42009873B90E852A8801F6 +:1079300042012473DD439601120087A22E27FA0B21 +:10794000DD4000000080EA9F42002424EAC82E1790 +:10795000F9F088019601DD43120087A3EA2CEB4081 +:10796000DD43EB03DD56020005C0DD43920112004A +:1079700087A6DD56020005C6DD439201120087A7E7 +:10798000EA5CDD43120087A8B816DD4396011200B9 +:1079900087A93C03FD7CDD43120087AAEA4FDD4343 +:1079A000120087ABEA4EDD43120087AC4400029A16 +:1079B000DD43120087B02E07F9E2DD43120087B1E4 +:1079C000EB28DD43120087B2DD4058000F668423A8 +:1079D00049FFD787EAA0DD4DFE3C4200A473DD439A +:1079E0009601120087B63C03FDAADD43120087B75B +:1079F0003C03FDA8DD43120087B82E17F9A3EB2C3A +:107A0000FF844400030942608073DD4097B1126037 +:107A100007B92E17F9F6EB6B42009C73DD43960114 +:107A2000120087BAEB59DD43120087BB2E07F9C15C +:107A3000DD43120087BCDD433C03FD4EEB373C03C6 +:107A4000FD1AEB372E07F9B0EB373C03FD62DD433F +:107A5000120087BFEA2C02000037DD43120081D8F4 +:107A60002E0FFB844E0500212E07FC4592074E0287 +:107A700000AC2E17FBF1EADCEB6CEB30FE44EA9431 +:107A800058210F448C22EB74401384204900148148 +:107A90002E67FBF1EADC8CC1FF848CC24063982026 +:107AA00084E048000085840E490002A8C8DEFA027E +:107AB000490002A4C8DAFA06490002A0C8D6840A1E +:107AC0004900029CC8D2FA0A49000298C8CEFA13AB +:107AD00049000294C8CAFA0E49000290C8C6FA18B2 +:107AE0004900028CC8C2FA1C49000288C8BEDD48A1 +:107AF000490002844E03FFBADD5B4900027F4E035A +:107B0000FFB5B8005A00010448FFFFB0B8032E27A4 +:107B1000FBF0EB6CEB305A08080D2E67FBF1FF947D +:107B20009C728AC28CC24013842040639820D50B7B +:107B30002E67FC4597B7FF948CC288464013982067 +:107B400040638820EB74EA9458210F4449001421C3 +:107B50008026EB74EA94582103B04900141A2E07CA +:107B6000FC45EB6296378C03FE0C4697FFFF8C02B8 +:107B700040038020FA3449FFD6B484C050948FFF6C +:107B800046A1000058A50004EAB0E2C04EF2FF6E24 +:107B9000EAB14070240042730073800640751C20D7 +:107BA00049FFE8CB8CC1AC3897B0D5EFEAB0E2E042 +:107BB000E80B80075093000249FFE8BF8CE1AC302E +:107BC00097F880C9D5F4FCC0FC608407DD43100041 +:107BD0008B0EDD4310008B224600000C00000000DD +:107BE0005A00A50448000195DD40045003C0EB3362 +:107BF00097694C5000EDEA45000007ACDD4B1000E2 +:107C00008B6CEA45000007AFDD4B10008B6FEA4537 +:107C1000000007B0DD4B10008B70EA45000007B193 +:107C2000DD4B10008B71EA45000007B2DD4B100000 +:107C30008B72EA45000007B3DD4B10008B73EA45F9 +:107C4000020003C9DD4B120085A9EA45020003CA00 +:107C5000DD4B120085AAEA45020003CBDD4B120082 +:107C600085ABEA45040001D5DD4B140082C5EA4529 +:107C7000020003C7DD4B120085A7EA45020003C8D6 +:107C8000DD4B120085A8EA450000093CDD4B1000E1 +:107C90008CFCEA450000093FDD4B10008CFFEA45F3 +:107CA00000000940DD4B10008D00EA45000009414D +:107CB000DD4B10008D01EA4500000942DD4B10004C +:107CC0008D02EA4500000943DD4B10008D03EA45B3 +:107CD00002000491DD4B12008671EA450200049215 +:107CE000DD4B12008672EA4502000493DD4B120060 +:107CF0008673EA4504000239DD4B14008329EA4506 +:107D00000200048FDD4B1200866FEA4502000490EA +:107D1000DD4B120086704420C00044000080DD432B +:107D2000581080004900133544000180DD4358108D +:107D300080864420C1004900132CFA1ADD435810F4 +:107D400082664420C2E04900132444000038DD4329 +:107D5000581083484420CA484900131BFA08DD43E1 +:107D6000581082064420C28049001313FA08DD43EC +:107D7000581082364420C2B04900130BFA08DD4384 +:107D80005810821E4420C29849001303FA08DD43AC +:107D90005810824E4420C2C8490012FBFA14DD4339 +:107DA000581083244420CA24490012F3FA14DD43F6 +:107DB000581083004420CA00490012EB4600000C12 +:107DC000040000CFDD43140080A5D504DD4004008D +:107DD00000A5DD4E3C0FFEA9FA17DD43100080021E +:107DE000FA01DD4310008003EA9458210086440024 +:107DF0000180EA64490012CDEADBEA7CEB6288018B +:107E00003E17FD082E27FBF284A03E07FD1145001A +:107E1000E000DD403E27FD0B145000B1804544904A +:107E2000FFFF815044B0004846C1000758C6050016 +:107E30004440006C8623452000D844DFFF94453041 +:107E40000510380814014C04803280CC42612C7338 +:107E5000846040E5140038170D0195D99E09414012 +:107E60001296408A46965CF08145408A0013E805E8 +:107E7000420434739601D5115200828840101016C6 +:107E80005000006C96014E830007501A0002420019 +:107E9000C873D5055A800204420448738C613803C4 +:107EA0001C095A3824DA8C419691505280484C591A +:107EB000FFCA4600000C040002C3DD43140083F730 +:107EC0004600000C02000585DD43120087ED4600E8 +:107ED000000C02000584DD43120087EC4600000C14 +:107EE000040002C1DD43140083F54600000C0400C9 +:107EF00002C0DD43140083F4DD43FA01140083FE65 +:107F000049FFC28B440072C0DD43140080B0FCE026 +:107F1000FC2146690008447035CA1273000849FF05 +:107F2000C372C826127300084610000C00108103AB +:107F3000EA8FC116F08149FFFC124600000C0010C8 +:107F40000106F0015A18020DDD4002000040C8048D +:107F50004400EC00D5034400E80049FFC2984420E7 +:107F600035CA46190008122080089600FCA144007A +:107F700000F0FCA1FC00EB36441035CA12100008DA +:107F8000EAE10201007242300C0BCB3302110072A5 +:107F90004200900BC83002110072EAFBC92D2E1767 +:107FA000FB834200880BC803EB4FD50649FFC3494A +:107FB000440000F1FC80B4029616C0FEEB3644206B +:107FC00035CA1220000842208C0B8020CA04EAE146 +:107FD000EB4FD50649FFC343440000F2FC80B402D6 +:107FE000920C960F5A0803FD440035CA120080080F +:107FF0008400FC808003FC80FC005CF000354EF2C5 +:1080000001823EFFCE003807810140F03C00DD0FC9 +:108010006A0070007A0084008E009800A200B6000A +:10802000C000CA00D400EA00F400FE0008011601F6 +:1080300020012A01340142014C0156016201720102 +:108040007C0186019001AC01B601C001CA01E401C6 +:10805000F202EE01F80102021C02F20226023202D2 +:108060003C025C02660270027A028A0294029E025C +:10807000A602C002CA02D402E202DD40DD47F8E0F7 +:10808000DD40DD47500076F7F8DBDD40DD5C440085 +:108090009999F86EDD40DD4750007EFFF8D1DD4054 +:1080A000DD4750007E6FF8CCDD40DD5C44009191EF +:1080B000F85F840449FFFFA280C0C00485E1480046 +:1080C00001238405F87ADD40DD4750005DDEF8B815 +:1080D000DD40DD4750005BDCF8B3DD40DD47560096 +:1080E0004444F8AE840749FFFF89C8E9840849FF82 +:1080F000FF8580C08409CEE3F860DD40DD5C44008C +:10810000AAAAF836DD40DD5C4400ACACF831DD40B5 +:10811000DD5C4400CCCCF82C840C49FFFF6F80C0A0 +:10812000840DCECDF84ADD40DD4750006EEFF88873 +:10813000DD40DD4750006CEDF883DD40DD47500049 +:108140004CCDF87EFA0049FFFF5980C0C8B8FA014B +:10815000F834DD40DD4756007777F872DD40DD47C3 +:1081600056007878F86DDD40DD5C44008888480072 +:1081700000BFFA0449FFFF4280C04E03FFA1FA0589 +:10818000F81CDD40DD4756005555F85ADD40DD4707 +:1081900056005656F855DD40DD4756006666F850E5 +:1081A000FA0749FFFF2B4E03FF8BFA0849FFFF2612 +:1081B00080C04E03FF85FA0948000056DD40DD47C8 +:1081C00056005151F83DDD40DD4756005161F83809 +:1081D000DD40DD4756006161F833FA0B49FFFF0EC1 +:1081E0004E03FF6EFA0C49FFFF0980C04E03FF6883 +:1081F000FA0DD539DD40DD4756005050F821DD40FD +:10820000DD4756005060F81CDD40DD4756006060D9 +:10821000F817FA0F49FFFEF24E03FF52FA1149FF19 +:10822000FEED80C04E03FF4CFA12D51DDD40DD4748 +:1082300056005252F805DD40DD47560052624800B4 +:108240000058DD40DD4756006262D552FA1449FFFE +:10825000FED54E03FF35FA1649FFFED080C04E030F +:10826000FF2FFA1749FFFECAE2C0D54DDD40DD47BA +:1082700056005353D53DDD40DD4756005363D53896 +:10828000DD40DD4756006363D533FA1A49FFFEB679 +:1082900080C04E03FF15FA1BD5E6DD40DD5C4400CF +:1082A000BBBBD525DD40DD5C4400BFBFD520DD4034 +:1082B000DD5CEA24D51CFA1D49FFFEA04E03FF0039 +:1082C000FA1E49FFFE9B80C04E03FEFAFA1FD5CB73 +:1082D000DD40DD5C4400B0B0D50ADD40DD5C44002B +:1082E000B0F0D505DD40DD5C4400F0F0FE0DE601A8 +:1082F000D50AEAE849FFFE8280C04E03FEE1EA8625 +:10830000D5B285E0800FFC809200FC00840049FF1C +:10831000FE754E03005D840B49FFFE70C0054400EE +:10832000ACAC48000057840F49FFFE68C00444000D +:108330001313D54FFA0349FFFE61C0044400787857 +:10834000D548840749FFFE5AC00444002222D54183 +:10835000FA0749FFFE53C00444005555D53AFA0BBD +:1083600049FFFE4CC00444005151D533FA0F49FF78 +:10837000FE45C00444005050D52CFA1449FFFE3E7F +:10838000C00444005252D525FA1949FFFE37C004F3 +:1083900044005363D51EFA1D49FFFE3080C0C0045F +:1083A0004400BBBBD5164400003149FFFE27C0087E +:1083B0004400B0F0DD43EA393E67F99CD50C8403F4 +:1083C00049FFFE1CC00444000191D5034400090983 +:1083D000DD43EA39FC80FC003FCFFA9CEA2C5800D0 +:1083E00008648420DD5949000FC38400EAB4842066 +:1083F000B9804631000746272C80142180B23E17F1 +:10840000F99D3E07F9B7B802441072C840504009C0 +:10841000D9079601B88284013E07F99DD509441019 +:108420007F0CD9069601B88284013E07F9B7B802DD +:108430004410FFFE8E01E220E8038401B882840E1E +:1084400049FFFDDCC006DD5A96373E07FB83D52C7D +:10845000FA0249FFFDD3C8F8FA0649FFFDCFC8F478 +:10846000840A49FFFDCBC8F0FA0A49FFFDC7C8ECF2 +:10847000FA1349FFFDC3C8E8FA0E49FFFDBFC8E47F +:10848000FA1849FFFDBBC8E0FA1C49FFFDB7C8DC7C +:10849000DD4849FFFDB3C8D8DD5B49FFFDAFC8D457 +:1084A000B8025A0801D2DD4849FFFDA8C00DEA52C2 +:1084B000EA288420DD5949000F53EA52EA87843FB5 +:1084C000DD5949000F4DDD5B49FFFD98C006840072 +:1084D0003E07FBAC3E07FBADFC80EA5C8C019600DE +:1084E000EAF0EA5C2E17FBEEE20156078001EAC1D2 +:1084F000EA5CDD43EB03DD9EFC00840E49FFFD7E5C +:10850000C008840C49FFFD7AC00D4400CCCCD517BF +:10851000FA0249FFFD73C8F6FA0649FFFD6FC8F27B +:10852000D513FA0049FFFD6AC00444003333D50770 +:10853000FA0449FFFD63C04A44008888DD43EA39F4 +:108540008401EA21D543840A49FFFD58C004440050 +:108550004444D53AFA0A49FFFD51C0044400666616 +:10856000D533FA0E49FFFD4AC00444006161D52CA1 +:10857000FA1349FFFD43C00444006060D525FA1892 +:1085800049FFFD3CC00444006262D51EFA1C49FF4D +:10859000FD35C00444006363D517DD4849FFFD2E57 +:1085A000C003EA24D511DD5B49FFFD28C004440067 +:1085B000F0F0D50A840649FFFD21C00444009191E2 +:1085C000D50344009999DD43EA39FC80C0045A0080 +:1085D000011BD529FC00FA1380C149FFFD0FC0071C +:1085E000EA52EA284C6040048401FC80FA1849FFF2 +:1085F000FD05C01B463100025831811C40030C03AD +:10860000EB5EFC804621000258210B3C4C11000F10 +:10861000500175E04C10000B502170D040008803D1 +:10862000EB5EDD9E8400DD9EFC808401DD9EEA64BD +:1086300000008070001080718C01420080739601F0 +:108640002E37F99D9E86EA9C58108000EAE5463157 +:1086500000079E8502318164EAE5EA94042103F271 +:108660009EC4969138208D099E833C33FD4EEAE5E9 +:108670009E823C33FD52EAE5EA94042103C19EC187 +:108680009691924838208D09EA94042103C196906E +:1086900038208109DD9E441022B850007C18FE0C61 +:1086A000441186A0EAB9500000569601DD9EFC00F8 +:1086B000FA0249FFFCA3C0052E17FCB9DD52D50F05 +:1086C000FA0649FFFC9BC00F49FFCB9EEA9F5A0860 +:1086D0000C052E07FCBBD5032E07FCBAFE0C49FF88 +:1086E000FFDCD50349FFF885DD43140083F2FC80ED +:1086F000FC00A60080C15A080A11840E49FFFC7EC6 +:10870000C809FA0249FFFC7AC805FA0649FFFC7657 +:10871000C040EA52EA87D53C5A080B10FA0649FFD6 +:10872000FC6DC006EA52EA28B60649FFFFC2DD48E2 +:1087300049FFFC64C8EFFC805A080C26FA0649FF82 +:10874000FC5DC006DD56EA8EB60649FFFFB2FA0AA6 +:1087500049FFFC54C005EA52EA28B606D50DFA13C3 +:1087600049FFFC4CC8F9FA0E49FFFC48C8F5FA1855 +:1087700049FFFC44C8F1DD4849FFFC40C00AEA5209 +:10878000EA28D5065A080F06EA2C58000864B606EF +:10879000FC80FC0084A09729E281E810A5183861CC +:1087A00015015A080106E28640433C1BD5034242AC +:1087B00018011A4180018CA1D5EFFC80FC202F17F5 +:1087C000F9B78460FB94EA78E262E8224271C0243F +:1087D00084402E47FD08E244E818995740609420F1 +:1087E00022430000385015114F12000A4332000393 +:1087F00042F28003E1EF4042BC1BD50342429000AD +:108800008C41AD309690D5E68C6196D8D5DDFCA034 +:10881000FC003FCFFA9CB802B900E220E812B8058C +:108820005A0008045A080605EA34EB3BD506EB6605 +:10883000C80846010003EA9BEA4AEAC549FFFFC0AF +:10884000B800B902E201E8048C01B880D50349FF01 +:10885000FE55FC80FC003C0DFEA93C2DFEA7E2402D +:10886000E819DD40040000B29681E241E813964920 +:108870009210EB6DDD43140080B2EB665A08010BD9 +:10888000EADEEA4AEAC5462100035821055C4900B0 +:108890000D80FC8046380030A698EB449690CAFDC7 +:1088A000FA6C102081B4AECC100080C48405102076 +:1088B0008018102081181000800C8401EAC3DD9E0E +:1088C000FC633FCFFAA08120B1813E0FF9303B001D +:1088D0004C0480E180263B00CC24A400AC082E8709 +:1088E000FCB581424004001085814E04000444C060 +:1088F000FFFFDD5E0200809C0230800A40B00C0168 +:10890000840E49FFFB7B40B5A4088460C809544429 +:10891000007F44500064FF2C4246102496E3886B8D +:10892000BB80B800FE02B888840449FFFFB5B908CF +:10893000EA68EAA7800949FFCA4184064264807355 +:108940004025001384004641000558420D74443010 +:1089500001B038130000812742908C73385209010E +:10896000385489099970A76981275011006C429287 +:108970008C7339020501502100248C0239048509C9 +:1089800096915A0806E8FCE346100080DD468C24E8 +:108990001410015F461001008C2C14100160461069 +:1089A00001808C3414100161441400001410016221 +:1089B000461000C08C2814100163461001408C3012 +:1089C00014100164FA281410016584201410016643 +:1089D0001410016714100168DD9EFC60EEE03E2F6C +:1089E000F944509F803080E0B1833E0FF9683B012D +:1089F000600084203B036020442000F03B004800DE +:108A000080093B0FC82049000CB3FA424023883745 +:108A100084609648815FF38C8009A8C1A8C2A8C36E +:108A200094498404860546BF0000E622E8093853CD +:108A3000040084404058140C808280E2D51BE62A52 +:108A4000E80838730400844040781C0C8082D50903 +:108A5000E63AE8093843040084404048100C80E2BC +:108A600080A2D5083823040084804028080C80E4C4 +:108A700080A48060862088AB39254602513180026F +:108A800089C539248E0A51218001552900FF387487 +:108A9000CA0A51218003552900FF553980FF8C6493 +:108AA0008DA13844CE0A96D83824CA0A5B1803E64A +:108AB0008C0C8C21960096495A081CB984004632C9 +:108AC0000000401480005A00740A9883B481B68272 +:108AD000B4A2B481DCFC8C04D5F5ED20FCE0FC00F4 +:108AE0002E17F9C22E07FBBBFE0C3C0FFEBE840006 +:108AF0003C0FFEBB49FFE899FC80FC402E47FB89F8 +:108B00008420FF042F27FD092F37FD0880418401B1 +:108B100080A14510004847010005590808644490A9 +:108B200000644C59001980F04272C47384609798B5 +:108B3000E2D3E80E38638D1142F32424E08FE80479 +:108B40008C2196488400422308008C61D5F18CA1C9 +:108B50009768D5E896914631000712218799964982 +:108B6000EA941211079AFCC0DD43042080B2EA9F08 +:108B700096D1FECC2E47FB962E17FB8FFE64FE0C83 +:108B8000E203E80484218400D503842084019691C3 +:108B900046310007122187999649EA941211079AE3 +:108BA000DD9EFC4244008787DD43140083C63C2DD4 +:108BB000FEC08400EB02120F8003120F8002120F1E +:108BC0008001841F120F8006120F8005120F80048F +:108BD000DD4000700F1CDD4000600F1DDD40000017 +:108BE0000F2097F897B0549000FF84A04410051010 +:108BF0009815A4009601EB02EA3D023F8001E26075 +:108C0000EA3DE8059601120F8001D51F023F800260 +:108C1000E260E80AEA33EAF34C300007EA3D9601E5 +:108C2000120F8002D512EA3D023F8003E260E80D98 +:108C3000EA33EAF34C30000AEA33EAF54C30000636 +:108C4000EA3D9601120F8003EA33EABBE260E806D0 +:108C5000EA3D9601120F8004D51FEA33EB0CE26067 +:108C6000E80AEA33EABB4C300007EA3D9601120FEE +:108C70008005D512EA33020F8006E260E80DEA3380 +:108C8000EABB4C30000AEA33EB0C4C300006EA3DFC +:108C90009601120F80068CA2D9AC8420FA44DD40E4 +:108CA00058000F2449000B6449FFF5A3FFC4EA9F55 +:108CB000407384F7022F800197F9E2E2E909FF840B +:108CC000022F8004406304D797B1E246E806DD40F6 +:108CD000EB0BDD43EA58EB09EB66C005800949FF61 +:108CE000FF45D504800949FFFF0AC806DD40EB0BAC +:108CF000DD43EB34EB09DD40EB0BC805440FAAAABA +:108D0000DD43EB09EAF3DD43960112008793EAF5B0 +:108D1000DD43960112008794020F8003DD43960124 +:108D200012008795EABBDD43960112008796EB0C93 +:108D3000DD43960112008797020F8006DD439601FE +:108D4000120087988400DD431200879B4400A66AC6 +:108D5000DD43140083C6FCC246100BD2DD46501022 +:108D6000840450200038B622B4224210D408B6221F +:108D7000EA6D4410FEFFFE56EA27EA6DEAF4FE565D +:108D8000EA27844F46190068102089040210001E4B +:108D9000844258108001EA270210001EEADFEA2709 +:108DA0008420EAF1EB49EA49EB6AFA241210009AAE +:108DB000DD9EFC20466800201003004C83860503DE +:108DC000000E467FFE3F840750738FFFFE464078BB +:108DD0001C0240738644BF8EB90EFE866610803832 +:108DE00040208864BA8E1233009C1243008A1253CA +:108DF000000AFCA0FC00DD5E0200801E84465800D4 +:108E00000080EB25EA640040812C840AFF040010F6 +:108E10008139DD5280644230807380A496D9FA0192 +:108E20008427F8AEFC80FC00DD5E0220801E44003A +:108E3000FF7FFE16EB25EA640040812D840AFF04C3 +:108E40000030813ADD5280A4425180730020812F8E +:108E50000000812E96E94011100980A4969FF89099 +:108E6000FC80FC018420F081460900681010090490 +:108E7000840E49FFF8C3C034840E49FFF8BFC039DF +:108E8000DD46EA6D4410FFDFF8064410FEFFF803EC +:108E90004410FDFFFE56EA27EA6D83FFEAF4FE5612 +:108EA000EA2751C00038B97F2E27FC9F66108F003B +:108EB000969F40108904B9FF441000321210009AA6 +:108EC0008421EAF1B45C461FFE3FEA8BFE56B63CB5 +:108ED000B43C6610803858108008B63CD51BFA02A6 +:108EE00049FFF88CC8CAFA0649FFF888C8C6D517E2 +:108EF000FA0249FFF883C006F809F00149FFFF7C38 +:108F0000D509FA0649FFF87AC00549FFFF27F001A5 +:108F1000F8B9F00149FFFD3AEA32F8F7DD4849FFB8 +:108F2000F86DDD5EC0028401100080681000806C66 +:108F3000FC81FC00DD5E0200801E58000080EB25F5 +:108F4000DD4000000080E6032E47FCB22E17FCBB7C +:108F5000E9072E27FCB1F8062E07FCB0D50C2E270A +:108F6000FCB48405FF04DD5280644230807383FFCB +:108F70002E07FCB34011100996D9969F80A449FF93 +:108F8000FF1AFC80FC2084A08225452005104100AA +:108F9000940099D59985848038381101393391012D +:108FA0008A7396DB4231C400383311098C815A48E8 +:108FB000D8F5505281B04C597FECFCA0FC0080C029 +:108FC0005A08010CDD468422EA8A8423EA6EEA32DA +:108FD000C804EA30E601EA5AFA0649FFF80F9E7122 +:108FE0004E02005D9608E606E816840340108016DF +:108FF000EB699600E6524EF2008C94919690EA72DC +:10900000EAD88463E266884F9690F86C5A6006034B +:10901000F81BD52A50037FF89640E6264EF20089C9 +:10902000842340100416EB699600E6524EF2007954 +:1090300094919690EA72EAD8846AE266884F969094 +:10904000F8515A600D0448000074EA325A08230DA2 +:10905000EA52EA87501075E0502070D049FFFF9423 +:10906000EA299600EA21EA328C019600EAB45A080D +:109070001205DD5049FFFF5FEA325EF00024E90689 +:10908000DD5049FFFED28400EAB4EA328420E612C1 +:10909000E902FA228A019600D5389608E606E81019 +:1090A000844340108816E246EB69960040278820EA +:1090B000EA72EAD79690F8165A68063BD51D500317 +:1090C0007FF89640E626E834842340100416844A4C +:1090D0002E17F9A9E246402784209600EA72EAD7C3 +:1090E000969049FFFBEF5A680D24EA325A081105A1 +:1090F000EA299600EA21EA328C019600E612E9029A +:109100008400DD4EEAB4EA3249FFFC69D5118E5283 +:1091100094919690EA6F58108C0C48FFFF748E5211 +:1091200094919690EA6F58108C0C48FFFF87FC8052 +:10913000FC00840749FFF762C022DD505A00070592 +:1091400066100002C90449FFFCCCFC802E17FCBF4E +:10915000EA8FC1105A00060FDD4684261410016DF7 +:1091600084201410016E441FFC78EB1B8427101020 +:1091700002AC44002424DD43EA39FC80840849FF22 +:10918000F73DC00449FFFB46FC80F986FC805A008D +:1091900001045A0804062E17F9B3E621EA5A9E4143 +:1091A0009688E646E816FC00844380C04010881686 +:1091B000EA4AEA77960049FFBB935A6003055A6072 +:1091C0000603FC80EA299600EA2149FFF271FC803F +:1091D000DD9EEA489604C009FC0049FFBA4EC8FE6D +:1091E00049FFBA21C8FEFC80DD9EFC00FA1349FF4E +:1091F000F705C00EEA3458000FE0EA8384218408A2 +:10920000F8108401EB38EAAE8400EB4ED50CFA1866 +:1092100049FFF6F4C8F0EA52EAA4EA8384078421FD +:1092200049FFBFEEFC80EA489604C009FC0049FFF4 +:10923000BA08C8FE49FFBA13C8FEFC80DD9EFC00D8 +:10924000EA64A60B58000010AE0BDD54DD53DD437D +:10925000140083C4F8D4FC80FC0080C0FA0849FFE5 +:10926000F6CDC00DEA48EA66C00A40031009DD5E8B +:10927000120082B850000064120080B6FA1149FF53 +:10928000F6BDC00CEA48EA66C00992C1DD4612602C +:1092900002B850630064126000B6FC80FC00EA7201 +:1092A000EAD8EADE50208A2049000873FC80FC00DE +:1092B0003FCFFA9CFA0749FFF6A1C00649FFFFC15C +:1092C00044005656D527FA0849FFF698C01BB80542 +:1092D0005A080737B802B900E220E80A49FFFFE060 +:1092E00046010003EA9BEA4AEAC549FFFA69B80069 +:1092F000B902E201E8048C01B880D52249FFFF954C +:10930000D513FA0B49FFF67AC00849FFFF9A4400CB +:109310005161DD43EA39D514FA0C49FFF66FC007F5 +:10932000B8055A08070E49FFF8E9D50AFA0D49FFB2 +:10933000F665C0FAB8055A08070449FFFFB1FC807A +:10934000FC00EA72EAD8EA3E50208A20490008214F +:10935000FC80FC003FCFFA9CFA0F49FFF64FC00695 +:1093600049FFFF6F44005060D529FA1149FFF646C6 +:10937000C01DB8055A080839B802B900E220E80B48 +:1093800049FFFFE049FFE568EA34EB3BEA4AEAC5FA +:1093900049FFFA16B800B902E201E8038C01B8806F +:1093A000BD00D92249FFFF41D513FA1449FFF62623 +:1093B000C00849FFFF4644005262DD43EA39D51434 +:1093C000FA1649FFF61BC007B8055A08080E49FFF0 +:1093D000F895D50AFA1749FFF611C0FAB8055A08E8 +:1093E000080449FFFFAFFC80FC00EA64A60B66009E +:1093F0000010AE0B8400DD43140083C449FFFEEB74 +:10940000F84BFC80FC003FCFFA9CFA1D49FFF5F6B3 +:10941000C00BEA489604C00349FFFF134400BFBFD6 +:10942000DD43EA39D533FA1E49FFF5E8C02DEA4895 +:109430009604C004B8055A08072AB802B900E22009 +:10944000E817840144100288EA68EAA7463100025E +:109450005831811C49FFF99F840044100288EA6852 +:10946000EAA74631000258318B3C49FFF994B80015 +:10947000B902E201E8048C01B880D508EA489604F4 +:10948000C00349FFFED249FFF839FC80FC00840E7E +:1094900049FFF5B4C00449FFF831F80FFA0249FF5B +:1094A000F5ADC8FAFA0649FFF5A9C8F6840A49FFDE +:1094B000F5A5C00549FFFE3E48000042FA0A49FFF3 +:1094C000F59DC00449FFFEF5D53AFA0E49FFF59621 +:1094D000C8FAFA1349FFF592C00449FFFF3CD52FA3 +:1094E000FA1849FFF58BC8FAFA1C49FFF587C00442 +:1094F00049FFFF7CD524DD4849FFF580C00449FFC2 +:10950000FF83D51D840649FFF579C00BEA88660004 +:1095100000083E07FB828400EB3884003C0FFEBE4F +:1095200049FFF978DD40045003C644006AA6D80715 +:10953000840249FFF563C00349FFFB35FC80FC0151 +:109540008400EB248402EB24DD5B49FFF5574E02D7 +:1095500001022E07F99CE60C4EF200FD96444E13D4 +:1095600000FAE602E904EAF9E622E826001F800391 +:10957000EA78EA3AEA5F88229021F879EAB6001F91 +:109580008003EA5EFA9688229021F871F873F87BDE +:109590008C21E022E911EA519648101F8005002F26 +:1095A0008005EA518C21E022E905F87DEA508C2102 +:1095B000D5F4F885D5ED661000088E22E622E8196C +:1095C000001F8003EA78EA3AEA5FF84FEAB6001F24 +:1095D0008003EA5EF849F84EF856F861E90AEA5164 +:1095E000F858E905F860EA508C21D5FBF868D5F504 +:1095F0009E44E622E904EAF9E622E822001F8003FD +:10960000EA78EA3AEA5FF831EAB6001F8003EA5ED8 +:10961000FA9688228443FE54445007D0F827101F3E +:109620008007EAB2F82CF82FF83AE90AEA51F83143 +:10963000E905F839EA508C21D5FBF841D5F59E466D +:10964000E622E904EAF9E622E841001F8003EA780D +:10965000EA3AEA5F88228443FE54F808101F800625 +:10966000001F8003EA5EFA96882290228E22964896 +:1096700083FF101F8007EAB2445007D09648101F9E +:10968000800483FFEB4CEAB283FFF809E91FEA513B +:109690009648101F8005002F8005EA518C22E02299 +:1096A00083FFE90DEB4CEA50421110734011842006 +:1096B000125094B283FFEA508C21D5EBEB2B8C2116 +:1096C0009648101F800483FFD5DE8E08E604E8422A +:1096D000000F8003EB6488018423FE0CEA5E900295 +:1096E0008E029600100F8006000F8003FA76880223 +:1096F000FE44EA4158210C084E00FFB9101F8007B4 +:10970000000F8006444007D09600EB23EB2B000FA0 +:1097100080068C02E001E91DEAC99600100F800561 +:10972000EA50EAC98C02E001E90EEB2B000F80053C +:1097300042008C7340010020124014B2000F8005DB +:109740008C01D5EC000F80048C019600EB23D5DF53 +:10975000FC81FC81FC00DD5A9604C01D49FFB84520 +:109760002E17FB662E27FBD1C003E222E90BE22273 +:10977000E905EB528C013E07FB6484003E07FB6663 +:10978000FC808C213E17FB662E07FB658C013E0793 +:10979000FB65FC80840249FFC331FC80FC40EA2267 +:1097A00084249D828E01EAB946900FFF88C097B04D +:1097B00084E050948FFFC6145A68010A5273FE0366 +:1097C00097F940049F0449FFC367D507841F50736E +:1097D00083FC49FFC36197F98EC197B0D5ED3E6711 +:1097E000F9B4FCC0FC6280C03CCDFEC32E07F9C5B5 +:1097F000F0813CADFEB7EA629600F0823C0DFEBC03 +:10980000C003EABEC0042E97FA0ED5028120DD40C7 +:10981000EA59DD54DD53D8032E97F9F685A0810669 +:10982000816DEB67EA22E360E85ADD40EB72960057 +:10983000C01B2E07FC99C018B4E84C708016E6E9EE +:10984000E9075CF3891BE9054470091BD50284E82C +:1098500004E400015CF70009E90B5CF7042FE90957 +:1098600044E0042FD506B4E804E40001D50285C81D +:109870002E57FBF4404700134252880B4037001329 +:1098800096B99639C50E40422008976140212008BC +:1098900040528D1596D14001811540028200D50DB0 +:1098A000402120084042200896919721400101154F +:1098B00040420D1540001200F18349FFC2ED977838 +:1098C00040729D1C88ED4073B91C540700FF88E06E +:1098D00040D380138D618D0CF103D5A500030020CA +:1098E0000023001400130008EB13EB0088010013A1 +:1098F000002CEA9049FFC2D0840A49FFC1CCEA2279 +:10990000E605E9120003005000230044001300386C +:10991000EB13EB0088010013005CEA9049FFC2BC26 +:10992000840A49FFC1B8EA22E609E911EB52002393 +:10993000007400130068EB13EB0088012E17FB6521 +:10994000EA9049FFC2A9840A49FFC1A5EA228420FE +:10995000844CE220E80B8066423088738C210071D1 +:10996000800888ED40D38013D5F52E27FB65EB5298 +:109970008840EA56EA66C017EACCDD4DF30294054A +:1099800040B00C64F00140B58424E20C8F43408564 +:10999000BC04E74140F43C444097A484129300483F +:1099A0003E17FA05021300480073009296C8404023 +:1099B000A0098843587380F096089862400381009C +:1099C00088E14000120088ED40001F0149FFC26499 +:1099D000FCE2FC00EA8649FFF311C83AEA935A0810 +:1099E000010449FFE76B49FFE76480C0EA93C007C1 +:1099F000EA935A08010AEA915A0801073C03FD1A42 +:109A00008C013C0BFD1AEA4DC820EA93C007EA938B +:109A10005A08011CEA915A08011949FFC2E85CF092 +:109A20000048E81384013E07F99749FFFE95EABE16 +:109A3000C005800649FFFED8D5062E07FB67C00586 +:109A400049FFFEAE49FFEDFEEABE3E07FB67FC8024 +:109A5000FC403FCFFAB080C049FFFE7EEA4DC80609 +:109A600049FFC2C55C900048D50549FFB6BE5C9071 +:109A7000000149FFC2154E0200F74E9200092E0761 +:109A8000F9B4C00549FFFE8C480000EEEA4D4E02D5 +:109A90000053EAD6C8504E92004F2E07FB66C84BC3 +:109AA000DD5A9604C80349FFC1A92E07F99844104E +:109AB000A55AEB6DEB08EA9049FFC1EE2E67F998C5 +:109AC000442FA55A4410003D8846EA4DFF8C4021A2 +:109AD00001008CC2EA3458000000406018209691C2 +:109AE00080A65003007A0A12800188419691D8FC22 +:109AF000FE92407140088540A4305AA81E058CC2D1 +:109B00008807D505A4718CC44000060049FFC1C474 +:109B10008D41FA0E49FFC0BF5AA81FF02E07F998D1 +:109B20008C019600EB5D2E17F9A8E201E92884006C +:109B3000EB5DD525002300924E2300822E17FB8477 +:109B4000EA8FC10B2E57FA0B2E07FA05D006B90083 +:109B50008E27E6224EF20074EA91C811B810C805AB +:109B6000EAD64E03007DD50B4E92000549FFFE1844 +:109B7000D506EAD6C80484013E07F9B4EAD64E02F7 +:109B800000734E920071DD5A9604C80349FFC13636 +:109B90002E07F9998C019600EB5C2E17F9A2E220B2 +:109BA000E8038401EB5C2E07F9992E77F9A79E4113 +:109BB00092E1FFCCEA9CEB5440709C202E17F9D127 +:109BC000C1124410A33AEB6DEB08EA9049FFC1645F +:109BD0002E17F999440FA33A8801EB0840000500BD +:109BE0009601D508460040305000020149FFC1549B +:109BF000840A2E27F9A784209241E222E80738330D +:109C000085018C2188039601D5F9FE024060400849 +:109C100085202E17F9A78C229022E321E8248E219B +:109C2000A4384C90C0058CE28806D505A4798CE454 +:109C30004000060049FFC1308D21D5EC5A90010447 +:109C400048FFFF9EEA914E03FF9BB810C0034E22CF +:109C5000FF8F800649FFFDC848FFFF924E92FF909C +:109C600048FFFF86FCC0FC2080E080C149FFE1B8CE +:109C7000DD50842049FFE3E6EAAF3E27FD0984007A +:109C80003E07F99CEAF83E07F9ACEA4A1000886101 +:109C9000FA003E07F994FA14FA3049FFC0012E2762 +:109CA000FD0B8425FE8C969054010003C8038C4460 +:109CB000D5028C489690662100035221007A969036 +:109CC0003E27F9A7EB272E37FD082E17FD1142126C +:109CD0000C739241402088179690C0028C413E2719 +:109CE000F9A28401EB5C4420003D40208837969027 +:109CF000C1028C413E27F9A88400EB5D2E17FB8F33 +:109D00003E17F9BA3E07F9B42E07FBF62E27FBF7EC +:109D1000402101043C2FFF402E07FBF82E17FBF9D2 +:109D2000401081043C1FFF4140210C5740109037E8 +:109D30003E27FD123E17FD138C823E47F9AE8C6222 +:109D40003E37F99684003C0BFD18CF26DD40147099 +:109D500003F1DD5A9604C007840149FFC04A84021A +:109D600049FFC04CDD4058000F448420EAFE490002 +:109D700002FFCE08DD40580003B08026EAFE49000D +:109D800002F7DD4058000F80842044200040490045 +:109D900002EF8400EB6546190008A40896013C0B0D +:109DA000FD1392013C0BFD14A40A3C0BFD1249FF6C +:109DB000C6DA84003E07F9A184203C1BFD1A3C1B37 +:109DC000FD15EAEE3E07F99A3E07F9933E07F9B80A +:109DD0003E07F9B63C1BFD423C1BFD413E07F99E88 +:109DE0002E37FBBAFA4EFE9C2E37FBBBFE9C3C2F57 +:109DF000FEB13C1BFD113E07F99B3E07F9B9FCA0E3 +:109E0000FC61DD40DD49DD439601EA26EA58DD4A82 +:109E1000DD40045003F04400A11A92B0D80349FF7A +:109E2000B43A49FFC09CDD40DD49DD439601EA2696 +:109E3000EB32DD4A49FFB94DC8FEDD40DD49DD4367 +:109E40009601EA2658000003DD4A49FFC0D549FFC4 +:109E5000F061C0029601DD43120087A1DD40DD49BB +:109E6000DD439601EA26EB34DD4A8448440000BA1B +:109E70008420846149FFB28849FFEEA8DD40DD49B6 +:109E8000DD439601EA2658000005DD4A84014410AE +:109E900001F484454430025849FFB8CB80C0C8F76C +:109EA000844584014410008049FFB900DD40021060 +:109EB00007A09649661080FF58108006121007A070 +:109EC00049FFF22549FFF289EA31EB018006EA8F6A +:109ED00049FFFECB8421EA34126000008041440037 +:109EE00000E749FFB2669601DD43120087AFDD400F +:109EF000DD49DD439601EA2658000007DD4AFA0AEB +:109F000049FFF07CC80FFA0E49FFF078C80BFA132E +:109F100049FFF074C807FA1849FFF070C80349FFF9 +:109F2000F02B49FFE03E49FFC111DD40DD49DD4333 +:109F30009601EA2658000008DD4A8400EA2184C020 +:109F40003C6FFEB4DD40022007A0467800209691C9 +:109F5000EB2158210009122007A08401100F800076 +:109F6000100F8001100F8002EB24EB233A0F8400C6 +:109F700049FFB3A48006842649FFBF8746000ED060 +:109F8000580000404410C00649FFBF7AEA3FB401C0 +:109F9000443000F566000040B601DD40022007A015 +:109FA00080269691EB215821000A122007A0440038 +:109FB00000B2844D49FFB1E846990000440000BA60 +:109FC00080268448FA6150A384F449FFB1DD50949F +:109FD00080E846B9009050738340840749FFB1AED2 +:109FE0008C05DD43140083F9B409920C960F5A08CE +:109FF0000315440000568420844149FFB1DAC00DA6 +:10A0000084208441DD5D49FFB1D45430007F842039 +:10A01000DD5D844149FFB1B8EA304E02011249FFCB +:10A02000B2E8DD40DD49DD439601EA265800000B29 +:10A03000DD4A840E49FFEFE2C0048400EA21D50F17 +:10A04000FA0249FFEFDBC8FAFA0649FFEFD7C8F674 +:10A05000DD4849FFEFD3C8F249FFE93A49FFC2EAB8 +:10A06000C820DD40DD49DD439601EA265800000C9A +:10A07000DD4A840E49FFEFC2C00449FFF230F80FF9 +:10A08000FA0249FFEFBBC8FAFA0649FFEFB7C8F674 +:10A09000DD4849FFEFB3C8F249FFC20F480000C9CD +:10A0A00084003E07F9903E07F997DD40DD49DD4326 +:10A0B0009601EA265800000DDD4A840E49FFEF9E06 +:10A0C0004E030049FA0249FFEF994E030044FA0695 +:10A0D00049FFEF944E03003FDD4849FFEF8F4E03E9 +:10A0E000003AF80A5A08010449FFDF0FDD505A0010 +:10A0F000082A5A00062849FFBDCB5A080106F87FF6 +:10A10000C80349FFE552EB17C821F879C804DD50B0 +:10A1100049FFE51949FFCFA849FFE7812E17F9BE8E +:10A120003C03FD15C9092E17F992C906C80549FF58 +:10A13000E1A480C0D50BC00AEB288C013E07F9933F +:10A14000D50549FFDE8949FFDE4BEB17C80349FF00 +:10A15000C23B49FFF99D49FFE9A584013E07F990FB +:10A16000800649FFFC77EABE49FFE3BBEA91C803DA +:10A1700049FFEA68EA8649FFEF41C00B2E07F99CC8 +:10A180008C019600E60CE9028400DD4E3E07F99C46 +:10A1900049FFC167840E49FFEF314E03004AFA02BE +:10A1A00049FFEF2C4E030045FA0649FFEF27C84050 +:10A1B000840A49FFEF23C83CFA0A49FFEF1FC83859 +:10A1C000FA1349FFEF1BC834FA0E49FFEF17C830E6 +:10A1D000FA1849FFEF13C82CFA1C49FFEF0FC828E3 +:10A1E000DD4849FFEF0BC824DD5B49FFEF07C820BE +:10A1F0003C0DFEA95A08011DEB17C81849FFDEE700 +:10A200005A080109000500009604C80449FFDD6DE5 +:10A21000D50B00050000960EC8072E07F9B0E60220 +:10A22000E90349FFDD0249FFDED449FFE665DD4071 +:10A23000DD49DD439601EA265800000EDD4ADD5077 +:10A240005A080706A7782E17F9A5D5055A08081643 +:10A25000A778EB05D912EB055A1801065A0808042D +:10A2600049FFB88BDD505A08080700058000C8FE7A +:10A2700049FFB77D49FFB850840E49FFEEBFC81DA6 +:10A28000FA0249FFEEBBC819FA0649FFEEB7C81536 +:10A29000840A49FFEEB3C811FA0A49FFEEAFC80DB0 +:10A2A000FA1349FFEEABC809DD4849FFEEA7C80520 +:10A2B000DD5B49FFEEA3C0058401F805C8FEF80682 +:10A2C0002E07F9A449FFB29AC8FC48FFFE88000097 +:10A2D00047D4000B59DE82103E0FF35C420E002182 +:10A2E0003FC800003FF80DF04900001C490000166F +:10A2F00049FFFD88D5009200D50084006405E40381 +:10A300003E0F4DF064022403640200026600000662 +:10A3100064020003EA40DD9EFC0049FFFFF0FC8080 +:10A320003E0F4DF0EA586404C003EA40DD9EFC0095 +:10A3300049FFB51FFC80FC0049FFBACAFC80400001 +:10A340000009DD9EFC0049FFB54FFC80400000097C +:10A35000DD9EFC0049FFB82BFC80000080A094919A +:10A36000880292001A128001D8FEDD9E80A08062D1 +:10A37000968F8A62C206880218128001D8FE8A026D +:10A38000C306880288033A128424D8FEDD9E80A288 +:10A390008060960F8A60C0088802284280011840B9 +:10A3A0008001D8FC8A02C308880288033A429004DC +:10A3B0003A409024D8FCDD9E8480D52D414140094F +:10A3C000974192104040D03796D14010C008FE47C8 +:10A3D00042020C24E220E8099F21984AE222E90582 +:10A3E000E220E8039F21984A9A484010D017400085 +:10A3F0004008FE2FFECCE203E80998029E49E202E3 +:10A40000E905E203E80398029E499A0340424008A6 +:10A41000FE67DD9E3BFFFEBCFD80FD918384CB4D3E +:10A42000E3B2E8194209000782A0C00D4129000CDF +:10A43000525000204058140D4118800C41189404CB +:10A440004108000CFD08805249FFFFBA82C182001A +:10A4500086E0D523C2284209000782A0C8048BB237 +:10A4600086E1D51452F000204129000C805240486A +:10A470003C0D4058800C4108000C400290044018EC +:10A48000BC0D49FFFF9D82E18220FD08805249FFFB +:10A49000FF9782C1510000004FC20053862041083F +:10A4A000540DD54B41194A17842084004FC2004CEB +:10A4B000B79C151E0001D547E3B3E9F742098007B1 +:10A4C00082A0C044524000204059100D4029800C09 +:10A4D000FEAF82624129000C4038100D4108000C8B +:10A4E0004008800C4018900DFE1F49FFFF6982C193 +:10A4F00082204200C869E3A1E9054C18C00CE38042 +:10A50000E809516B7FFF8A3340304801E2038A2F0C +:10A51000800386E04FC20015400800014018840106 +:10A52000E3808A2F524A80204110900C4100540D44 +:10A53000410844044110D40DB79C151E000180163B +:10A54000501B80003BFFFE84DD9EE3F1E903E392B4 +:10A55000E90986C1404848018BB3E3848BAF82048C +:10A56000D50286C086E04FC3FFE9D5EA4601000761 +:10A57000460100084601000946110007461100087F +:10A580004611000946080020040003C144000030C1 +:10A59000020007A0120087A046110006461100071E +:10A5A0002E07FA214614000A4614000B3C0DFEAC9F +:10A5B0002E07FA15440000645000055A460A55AAB1 +:10A5C000442001B04601000146010002460100039B +:10A5D000442005102E07FB8344000034041003C1FF +:10A5E000440000BB46180020460900883E17FB487F +:10A5F0003E07F9B32E07FD0B40F780114400FFFF23 +:10A600003CF3FD40660000FF1210001E5800011CC4 +:10A610002E07F991440000E83C0BFD284601000597 +:10A6200046010006460100072E17FB482E07F9B326 +:10A63000460900002E07F9A9023F800746010000E5 +:10A6400046010001460100023C0BFD1D3C0DFEC40D +:10A65000140083C146310001463100024631000337 +:10A66000020F8007440001B0461900206400000872 +:10A6700046210001462100022E17FA213C3DFED161 +:10A680004600000D4600000E4600000F2E07FCBFDE +:10A690004619000046110005461100064611000744 +:10A6A0002E07F9AF3C03FD233C03FD28001F800566 +:10A6B000001F800746010002460100034601000416 +:10A6C000401105042E07FB843E07FB49580000019A +:10A6D000045003C53EF7F991381281012E07F9E6BF +:10A6E0003C0BFD202E27FD0858318C082E17FB400F +:10A6F0002E07F9DB2E07F9C65010855A3E1FFB8046 +:10A700002E07FB414200040B58000B5C462100055C +:10A7100046210006462100072E07FA0E4628002093 +:10A720000220001E1010008C46110001461100028C +:10A7300046110003461100024611000346110004B1 +:10A740003C0BFD233C0BFD2A58108D742E27FD0970 +:10A75000461A55AA02500000101000603E07FD097D +:10A760004601000646010007440003E8440000CB10 +:10A770003E07F9A4000083403C0FFEC02E07F9DD20 +:10A780003C0BFD464400003358000B3C2E07FB8277 +:10A790003C0BFD4A1010016850108FFF3E07F9EB8B +:10A7A000045003F158000C0C4210840B40000700C9 +:10A7B0002E07F9973E0801602E07F9904621000701 +:10A7C00046210008462100093E07FA0B2E07F9F73B +:10A7D0002E07FA0B5800010C5800055C46110000CA +:10A7E0004611000146110002441000642E17FA15AC +:10A7F00040049800461900883E0804C05800062C02 +:10A80000442000480200003858210D740001034024 +:10A810005000033A3C0BFD1C4610FFFF3C3DFECFB1 +:10A820005CF000643E07F9BF2E27FBF12E07FD09FF +:10A830002E07FD08001F8006460900903E07F9A973 +:10A84000100080A8101F8006225000003C0BFD481D +:10A8500040000416440001F4020F8004101000A808 +:10A86000109380A8000300923E67F9A42E27FB49AD +:10A870003E07F9D110048000100080083E07FA0D51 +:10A8800058108864106000A0120087F4420104731D +:10A89000000F800710008C7C101000402E17FA0B60 +:10A8A000101000443E17FB493C0BFD3F3C23FD28A4 +:10A8B000460A33AA3E07F9C44200080B00000C7C8C +:10A8C000220180002E07F9A058108B3C5810811CE3 +:10A8D0002E07F9A52E07FBB22E07FBF12E07FBF082 +:10A8E00040F03C0044000510581080023E27FB4910 +:10A8F000462900003E07F9F62E07F99F3C2DFECFB2 +:10A9000038308909100580003C0BFD1B44000032E3 +:10A910003E07F9BE42000C0B3E07FA153E07F9FD53 +:10A920003E07F9FC3E17F9922E17FB493E07F9E660 +:10A93000101002382E07FA18020F80014410FBFF96 +:10A94000020F8002021087F4383011013E07F9A689 +:10A9500050107FF6045083F14210A80B40010040D4 +:10A960002E07F9C04420003C5873885C4000090061 +:10A970000410003A120F8007120087A52E07FA1E56 +:10A980002E17F9AD581084B42E07FA1D2E17F9AF03 +:10A99000120087922E37F9CB02000792020F800532 +:10A9A0003C0BFD4B1010006C3E07F9EA46410001DC +:10A9B0004641000246410003400040083E07FB4874 +:10A9C000440000B83C03FD403C0DFED3101000A035 +:10A9D000460800303C03FD44141000AD3E07F9D496 +:10A9E0004624000A4624000B2E07F9CD5800080023 +:10A9F000662100FF4440FFFF100F8004100F80030A +:10AA00001200801E382201012E47FD092E07F993FE +:10AA10002E07F9963E07FA0A001F80042E07F9B1A7 +:10AA20003C0BFD314000080C40000C1658738000B0 +:10AA3000580006D8580000024400A55A58000004E7 +:10AA400044005AA546090008120087BE3E07F9DDFA +:10AA50003A0F84200020000858000E30050F8001B6 +:10AA60003C1DFEAC5010833A040002E002000036A8 +:10AA70004200140B107300A83832020A4618003046 +:10AA80004200180B381801013C0BFD2E3C0BFD2D2C +:10AA9000101000481200803600100040002F800483 +:10AAA00045106D603E07F9CE502100E83E07F9CD14 +:10AAB0002E37FA212E07FB643E07FB6158108004F5 +:10AAC0003C1BFD30460900803B00C400461A33AAF7 +:10AAD0003C03FD3F4460FFFF641200433E07F999C9 +:10AAE0003E07F9985C0000012E17FB823812010125 +:10AAF000640300032E17FBF03A0404002E17FD092F +:10AB00003E07F99F2E07F99D4410FFFF2E07F9AE6F +:10AB10002E27F9A9102080282E07F9D946710000A8 +:10AB200040008200400000093C0BFD16001000446C +:10AB30002E17FD08040003FE5000033C4400003CB7 +:10AB400000010200010201000002020102020101F3 +:10AB5000000000000001000108091011181900018F +:10AB6000040508090C0D1011141518191C1D0001FD +:10AB7000040508090C0D10110084520800280C056A +:10AB80000050A102000000000000000000000000D2 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 :10ABB0000000000000000000000000000000000095 @@ -3070,7 +3070,7 @@ :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 :10BFF0000000000000000000000000000000000041 -:10C00000A55A271029020851434C4942000000005C +:10C00000A55A271129020851434C4942000000005B :10C010000000000070726F6A656374000000000029 :10C020000000000000000000000000000000000010 :10C030000000000000000000323031383032313270 @@ -3086,7 +3086,7 @@ :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 -:10C100000A003FA1621002036478641AC83CFF0A67 +:10C1000011003FA1620002036478641AC83CFF0A70 :10C110001414280F19141E0F0550250F0F81820FBC :10C120000F73A30A7828642C0F0C0000111000086C :10C130000F0A232509060A041464FF140000145092 @@ -3246,7 +3246,7 @@ :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB0000FEF79B2E000000004B00FF1F1C8A000058 +:10CB0000DEF79B2E000000004B00FF1F1C8A000078 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 @@ -3325,7 +3325,7 @@ :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 -:10CFF00000000000000000000000000000001768B2 +:10CFF0000000000000000000000000000000EF67DB :10D000000000000000000000000000000000000020 :10D010000F1C38F00F0F0F0FFFFFFFFFFFFF0F0078 :10D020000FE0C0F10F0F0F0FFFFFFFFFFFFF0F001B @@ -4093,5 +4093,5 @@ :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF000000000000F0000005300000052D71169FC +:10FFF000000000000F00000053000000611D662497 :00000001FF diff --git a/fs/file.c b/fs/file.c index 8363f7c10..327b109d5 100644 --- a/fs/file.c +++ b/fs/file.c @@ -183,11 +183,8 @@ static int expand_fdtable(struct files_struct *files, int nr) /* make sure all __fd_install() have seen resize_in_progress * or have finished their rcu_read_lock_sched() section. */ - if (atomic_read(&files->count) > 1) { - rcu_expedite_gp(); + if (atomic_read(&files->count) > 1) synchronize_sched(); - rcu_unexpedite_gp(); - } spin_lock(&files->file_lock); if (!new_fdt) diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 791eec90d..ec9c983e6 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -230,7 +230,7 @@ static struct fuse_req *get_reserved_req(struct fuse_conn *fc, struct fuse_file *ff = file->private_data; do { - wait_event(fc->reserved_req_waitq, ff->reserved_req); + fuse_wait_event(fc->reserved_req_waitq, ff->reserved_req); spin_lock(&fc->lock); if (ff->reserved_req) { req = ff->reserved_req; @@ -279,7 +279,7 @@ struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc, struct fuse_req *req; atomic_inc(&fc->num_waiting); - wait_event(fc->blocked_waitq, fc->initialized); + fuse_wait_event(fc->blocked_waitq, fc->initialized); /* Matches smp_wmb() in fuse_set_initialized() */ smp_rmb(); req = fuse_request_alloc(0); @@ -2232,7 +2232,7 @@ EXPORT_SYMBOL_GPL(fuse_abort_conn); void fuse_wait_aborted(struct fuse_conn *fc) { - wait_event(fc->blocked_waitq, atomic_read(&fc->num_waiting) == 0); + fuse_wait_event(fc->blocked_waitq, atomic_read(&fc->num_waiting) == 0); } int fuse_dev_release(struct inode *inode, struct file *file) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 3bc6e1990..8bc91639c 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1562,7 +1562,7 @@ void fuse_set_nowrite(struct inode *inode) BUG_ON(fi->writectr < 0); fi->writectr += FUSE_NOWRITE; spin_unlock(&fc->lock); - wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE); + fuse_wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE); } /* diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 6ce675416..e3df59cc9 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -382,7 +382,7 @@ static int fuse_wait_on_page_writeback(struct inode *inode, pgoff_t index) { struct fuse_inode *fi = get_fuse_inode(inode); - wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index)); + fuse_wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index)); return 0; } diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index ada567291..6c27a7009 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -23,6 +23,7 @@ #include #include #include +#include /** Max number of pages that can be used in a single read request */ #define FUSE_MAX_PAGES_PER_REQ 32 @@ -960,4 +961,33 @@ int fuse_do_setattr(struct inode *inode, struct iattr *attr, void fuse_set_initialized(struct fuse_conn *fc); +#define fuse_wait_event(wq, condition) \ +({ \ + freezer_do_not_count(); \ + wait_event(wq, condition); \ + freezer_count(); \ +}) + +#define fuse_wait_event_killable(wq, condition) \ +({ \ + int __ret = 0; \ + \ + freezer_do_not_count(); \ + __ret = wait_event_killable(wq, condition); \ + freezer_count(); \ + \ + __ret; \ +}) + +#define fuse_wait_event_killable_exclusive(wq, condition) \ +({ \ + int __ret = 0; \ + \ + freezer_do_not_count(); \ + __ret = wait_event_killable_exclusive(wq, condition); \ + freezer_count(); \ + \ + __ret; \ +}) + #endif /* _FS_FUSE_I_H */ diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig index c5dd890b3..c803afa3b 100644 --- a/fs/proc/Kconfig +++ b/fs/proc/Kconfig @@ -92,15 +92,17 @@ config PROC_UID config PROC_FSLOG bool "Enable FS logs for improving filesystem debug" depends on PROC_FS - select PROC_STLOG - select PROC_DLOG default y config PROC_STLOG bool "Enable Storage log" + depends on PROC_FSLOG + default y config PROC_DLOG bool "Enable delete logs for improving filesystem debug" + depends on PROC_FSLOG + default y config PROC_TRIGGER_SQLITE_BUG bool "Trigger bug for SQLite debugging" diff --git a/include/linux/ccic/usbpd.h b/include/linux/ccic/usbpd.h index a1a32b47d..ba8fb4648 100644 --- a/include/linux/ccic/usbpd.h +++ b/include/linux/ccic/usbpd.h @@ -45,7 +45,7 @@ #if defined(CONFIG_SEC_FACTORY) #define tTypeCSinkWaitCap (6100) /* for UCT100 */ #else -#define tTypeCSinkWaitCap (310) /* 310~620 ms */ +#define tTypeCSinkWaitCap (460) /* 310~620 ms */ #endif #define tTypeCSendSourceCap (100) /* 100~200ms Q*/ #define tSrcRecover (880) /* 660~1000ms */ @@ -602,6 +602,7 @@ struct usbpd_data { int msg_id; int specification_revision; struct mutex accept_mutex; + int is_prswap; struct timeval time1; struct timeval time2; diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 83bd4a8df..dc131da91 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h @@ -53,6 +53,7 @@ extern nodemask_t cpuset_mems_allowed(struct task_struct *p); void cpuset_init_current_mems_allowed(void); int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask); extern int cpuset_task_is_boosted(struct task_struct *p); +extern int cpuset_task_is_pinned(struct task_struct *p); extern int __cpuset_node_allowed(int node, gfp_t gfp_mask); diff --git a/include/linux/netfilter/xt_domainfilter.h b/include/linux/netfilter/xt_domainfilter.h new file mode 100644 index 000000000..259025166 --- /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/regulator/machine.h b/include/linux/regulator/machine.h index a1067d0b3..a2fac8eee 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h @@ -205,10 +205,19 @@ struct regulator_init_data { void regulator_has_full_constraints(void); int regulator_suspend_prepare(suspend_state_t state); int regulator_suspend_finish(void); +#ifdef CONFIG_SEC_PM_DEBUG +int regulator_show_enabled(void); +#endif /* CONFIG_SEC_PM_DEBUG */ #else static inline void regulator_has_full_constraints(void) { } +#ifdef CONFIG_SEC_PM_DEBUG +int regulator_show_enabled(void) +{ + return 0; +} +#endif /* CONFIG_SEC_PM_DEBUG */ static inline int regulator_suspend_prepare(suspend_state_t state) { return 0; diff --git a/include/linux/sec_ext.h b/include/linux/sec_ext.h index b349519ce..298fa8b58 100644 --- a/include/linux/sec_ext.h +++ b/include/linux/sec_ext.h @@ -68,7 +68,9 @@ extern void sec_initcall_debug_add(initcall_t fn, unsigned long long t); */ #ifdef CONFIG_SEC_PARAM #define CM_OFFSET CONFIG_CM_OFFSET -#define CM_OFFSET_LIMIT 8 +#define CM_OFFSET_LIMIT (CM_OFFSET + 3) +#define FMM_LOCK_OFFSET CONFIG_FMM_LOCK_OFFSET + enum { PARAM_OFF = '0', diff --git a/include/linux/usim_det.h b/include/linux/usim_det.h index 1e3f921f9..5671d4356 100644 --- a/include/linux/usim_det.h +++ b/include/linux/usim_det.h @@ -16,13 +16,18 @@ #define USIM_DETECT_NAME "usim_detect" #define USIM_DETECT_NAME0 "usim_detect0" #define USIM_DETECT_NAME1 "usim_detect1" -#define USIM_LOW_DETECT_COUNT 1 -#define USIM_HIGH_DETECT_COUNT 5 +#define USIM_LOW_DETECT_COUNT_DEFAULT 1 +#define USIM_HIGH_DETECT_COUNT_DEFAULT 5 +#define USIM_CHECK_DELAY_MSEC_DEFAULT 100 struct usim_det_data { char *name; u32 num_of_usim_det; + + u32 usim_check_delay_msec; + u32 usim_high_detect_count; + u32 usim_low_detect_count; int usim_det0_irq; int gpio_usim_det0; diff --git a/include/scsc/scsc_release.h b/include/scsc/scsc_release.h index 418295198..05615de7b 100644 --- a/include/scsc/scsc_release.h +++ b/include/scsc/scsc_release.h @@ -13,7 +13,7 @@ #define SCSC_RELEASE_ITERATION 60 #define SCSC_RELEASE_CANDIDATE 0 -#define SCSC_RELEASE_POINT 30 +#define SCSC_RELEASE_POINT 40 #endif diff --git a/include/uapi/linux/netfilter/xt_domainfilter.h b/include/uapi/linux/netfilter/xt_domainfilter.h new file mode 100644 index 000000000..259025166 --- /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/kernel/cpu.c b/kernel/cpu.c index cdc3d549e..545ba6c03 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -148,12 +148,20 @@ EXPORT_SYMBOL_GPL(put_online_cpus); * get_online_cpus() not an api which is called all that often. * */ +#ifndef CONFIG_TINY_RCU +extern int rcu_expedited; +static int rcu_expedited_bak; +#endif void cpu_hotplug_begin(void) { DEFINE_WAIT(wait); cpu_hotplug.active_writer = current; cpuhp_lock_acquire(); +#ifndef CONFIG_TINY_RCU + rcu_expedited_bak = rcu_expedited; + rcu_expedited = 0; +#endif for (;;) { mutex_lock(&cpu_hotplug.lock); @@ -170,6 +178,9 @@ void cpu_hotplug_done(void) { cpu_hotplug.active_writer = NULL; mutex_unlock(&cpu_hotplug.lock); +#ifndef CONFIG_TINY_RCU + rcu_expedited = rcu_expedited_bak; +#endif cpuhp_lock_release(); } diff --git a/kernel/cpuset.c b/kernel/cpuset.c index e1ae44345..550f35d04 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -173,6 +173,7 @@ typedef enum { CS_SPREAD_PAGE, CS_SPREAD_SLAB, CS_SELECTIVE_BOOST, + CS_PRIO_PINNING, } cpuset_flagbits_t; /* convenient tests for these bits */ @@ -226,6 +227,11 @@ static inline int is_selective_boost_enabled(const struct cpuset *cs) return test_bit(CS_SELECTIVE_BOOST, &cs->flags); } +static inline int is_prio_pinning_enabled(const struct cpuset *cs) +{ + return test_bit(CS_PRIO_PINNING, &cs->flags); +} + /** * cpuset_for_each_child - traverse online children of a cpuset * @child_cs: loop cursor pointing to the current child @@ -343,6 +349,20 @@ int cpuset_task_is_boosted(struct task_struct *p) } EXPORT_SYMBOL(cpuset_task_is_boosted); +int cpuset_task_is_pinned(struct task_struct *p) +{ + struct cpuset *cpuset_for_task; + int ret = 0; + + rcu_read_lock(); + cpuset_for_task = task_cs(p); + ret = is_prio_pinning_enabled(cpuset_for_task); + rcu_read_unlock(); + + return ret; +} +EXPORT_SYMBOL(cpuset_task_is_pinned); + /* * Return in pmask the portion of a cpusets's cpus_allowed that * are online. If none are online, walk up the cpuset hierarchy @@ -1655,6 +1675,7 @@ typedef enum { FILE_SPREAD_PAGE, FILE_SPREAD_SLAB, FILE_SELECTIVE_BOOST, + FILE_PRIO_PINNING, } cpuset_filetype_t; static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft, @@ -1698,6 +1719,9 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft, case FILE_SELECTIVE_BOOST: retval = update_flag(CS_SELECTIVE_BOOST, cs, val); break; + case FILE_PRIO_PINNING: + retval = update_flag(CS_PRIO_PINNING, cs, val); + break; default: retval = -EINVAL; break; @@ -1859,6 +1883,8 @@ static u64 cpuset_read_u64(struct cgroup_subsys_state *css, struct cftype *cft) return is_spread_slab(cs); case FILE_SELECTIVE_BOOST: return is_selective_boost_enabled(cs); + case FILE_PRIO_PINNING: + return is_prio_pinning_enabled(cs); default: BUG(); } @@ -1993,6 +2019,13 @@ static struct cftype files[] = { .private = FILE_SELECTIVE_BOOST, }, + { + .name = "prio_pinning", + .read_u64 = cpuset_read_u64, + .write_u64 = cpuset_write_u64, + .private = FILE_PRIO_PINNING, + }, + { } /* terminate */ }; diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 5c6085b7e..70cc83378 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "power.h" @@ -369,6 +370,9 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) suspend_stats.failed_devs[last_dev]); goto Platform_finish; } +#ifdef CONFIG_SEC_PM_DEBUG + regulator_show_enabled(); +#endif /* CONFIG_SEC_PM_DEBUG */ error = platform_suspend_prepare_late(state); if (error) goto Devices_early_resume; diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index e071177a0..d705971b4 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10074,11 +10074,15 @@ static int hmp_selective_migration(int prev_cpu, struct sched_entity *se) * waiting time */ if (is_boosted_task) { - min_load = hmp_domain_min_load(&firstboost,&min_cpu, tsk_cpus_allowed(p)); - if(min_load) { - min_load = hmp_domain_min_load(&secondboost,&min_cpu, tsk_cpus_allowed(p)); - if(min_load) - min_load = hmp_domain_min_load(&logical_nonboost,&min_cpu, tsk_cpus_allowed(p)); + if (p->prio <= 110 && cpuset_task_is_pinned(p)) { + min_load = hmp_domain_min_load(&firstboost,&min_cpu, tsk_cpus_allowed(p)); + } else { + min_load = hmp_domain_min_load(&firstboost,&min_cpu, tsk_cpus_allowed(p)); + if (min_load) { + min_load = hmp_domain_min_load(&secondboost,&min_cpu, tsk_cpus_allowed(p)); + if (min_load) + min_load = hmp_domain_min_load(&logical_nonboost,&min_cpu, tsk_cpus_allowed(p)); + } } } else { min_load = hmp_domain_min_load(&logical_nonboost,&min_cpu, tsk_cpus_allowed(p)); diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 7c8d3ed3e..7bdbcc7ba 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -71,6 +71,8 @@ int ip6_ra_control(struct sock *sk, int sel) return -ENOPROTOOPT; new_ra = (sel >= 0) ? kmalloc(sizeof(*new_ra), GFP_KERNEL) : NULL; + if (sel >= 0 && !new_ra) + return -ENOMEM; write_lock_bh(&ip6_ra_lock); for (rap = &ip6_ra_chain; (ra = *rap) != NULL; rap = &ra->next) { diff --git a/net/key/af_key.c b/net/key/af_key.c index d2ec62031..b400a4cc2 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 c74ed66eb..a0014d07e 100644 --- a/net/netfilter/Makefile +++ b/net/netfilter/Makefile @@ -171,6 +171,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 000000000..22e810aba --- /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 85c4243eb..a154faf89 100755 --- a/security/samsung/defex_lsm/Makefile +++ b/security/samsung/defex_lsm/Makefile @@ -4,6 +4,7 @@ # Features to Enable PED_ENABLE=true +PED_BASED_ON_TGID_ENABLE=true SAFEPLACE_ENABLE=true IMMUTABLE_ENABLE=true LP_ENABLE=true @@ -53,6 +54,9 @@ endif ifeq ($(PED_ENABLE), true) obj-y += defex_priv.o DEFEX_DEFINES += -DDEFEX_PED_ENABLE +ifeq ($(PED_BASED_ON_TGID_ENABLE), true) + DEFEX_DEFINES += -DDEFEX_PED_BASED_ON_TGID_ENABLE +endif endif ifeq ($(SAFEPLACE_ENABLE), true) diff --git a/security/samsung/defex_lsm/defex_ht.c b/security/samsung/defex_lsm/defex_ht.c index 24f2eb182..706984ad2 100644 --- a/security/samsung/defex_lsm/defex_ht.c +++ b/security/samsung/defex_lsm/defex_ht.c @@ -20,8 +20,19 @@ DECLARE_HASHTABLE(creds_hash, 15); #endif /* DEFEX_PED_ENABLE */ +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE +struct id_set { + unsigned int uid, fsuid, egid; +}; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + struct proc_cred_data { - unsigned int uid, fsuid, egid, p_root; + 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 */ }; struct proc_cred_struct { @@ -48,68 +59,168 @@ 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); goto alloc_obj; } cred_data = tmp_data; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + cred_data->cred_flags = 0; + cred_data->tcnt = 1; + 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); @@ -117,29 +228,146 @@ 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; - 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; +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + 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 */ } #endif /* DEFEX_PED_ENABLE */ +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE +void set_task_creds_tcnt(struct task_struct *p, int addition) +{ + 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 (pid <= MAX_PID_32) { + spin_lock_irqsave(&creds_hash_update_lock, flags); + 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(tgid_cred_data); + return; + } + } + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return; + } + + spin_lock_irqsave(&creds_hash_update_lock, flags); + 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(tgid_obj); + return; + } + break; + } + spin_unlock_irqrestore(&creds_hash_update_lock, flags); + return; +} +#else void delete_task_creds(int pid) { struct proc_cred_struct *obj; @@ -164,4 +392,5 @@ void delete_task_creds(int pid) } spin_unlock_irqrestore(&creds_hash_update_lock, flags); } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ diff --git a/security/samsung/defex_lsm/defex_priv.c b/security/samsung/defex_lsm/defex_priv.c index 0f88237b6..59cfb77ef 100644 --- a/security/samsung/defex_lsm/defex_priv.c +++ b/security/samsung/defex_lsm/defex_priv.c @@ -39,6 +39,17 @@ ssize_t task_defex_privesc_show_status(struct defex_privesc *privesc_obj, return snprintf(buf, 3, "%u\n", privesc_obj->status); } +ssize_t task_defex_privesc_show_tgid(struct defex_privesc *privesc_obj, + struct privesc_attribute *attr, char *buf) +{ +#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, struct attribute *attr, const char *buf, size_t len) { @@ -111,9 +122,12 @@ void task_defex_destroy_privesc_obj(struct defex_privesc *privesc) 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, 0444, task_defex_privesc_show_tgid, NULL); static struct attribute *privesc_default_attrs[] = { &privesc_status_attribute.attr, + &privesc_tgid_attribute.attr, NULL, }; diff --git a/security/samsung/defex_lsm/defex_procs.c b/security/samsung/defex_lsm/defex_procs.c index d520ba6b6..5b37c8cfe 100644 --- a/security/samsung/defex_lsm/defex_procs.c +++ b/security/samsung/defex_lsm/defex_procs.c @@ -38,6 +38,7 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) #include +#include #endif static const char unknown_file[] = ""; @@ -308,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; @@ -357,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; } @@ -383,123 +384,154 @@ static int task_defex_check_creds(struct task_struct *p, int syscall) char *path = NULL; int check_deeper, case_num; unsigned int cur_uid, cur_euid, cur_fsuid, cur_egid; - unsigned int uid, fsuid, 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 */ static const unsigned int dead_uid = 0xDEADBEAF; if (!is_task_creds_ready() || !p->cred) goto out; - get_task_creds(p->pid, &uid, &fsuid, &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 = uid; - g_fsuid = fsuid; - g_egid = egid; + g_uid = ref_uid; + g_fsuid = ref_fsuid; + g_egid = ref_egid; } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ cur_uid = uid_get_value(p->cred->uid); cur_euid = uid_get_value(p->cred->euid); cur_fsuid = uid_get_value(p->cred->fsuid); cur_egid = uid_get_value(p->cred->egid); - if (!uid) { + if (!ref_uid) { +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + if (p->tgid != p->pid && p->tgid != 1) { + path = defex_get_filename(p); + pr_crit("defex[6]: cred wasn't stored [task=%s, filename=%s, uid=%d, tgid=%u, pid=%u, ppid=%u]\n", + p->comm, (path ? path : ""), cur_uid, p->tgid, p->pid, p->real_parent->pid); + pr_crit("defex[6]: stored [euid=%d fsuid=%d egid=%d] current [uid=%d euid=%d fsuid=%d egid=%d]\n", + ref_uid, ref_fsuid, ref_egid, cur_uid, cur_euid, cur_fsuid, cur_egid); + goto exit; + } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ read_lock(&tasklist_lock); parent = p->parent; if (parent) 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(p->pid, 1, 1, 1, p_root); + set_task_creds(REF_PID(p), 1, 1, 1, cred_flags); } } else - set_task_creds(p->pid, cur_euid, cur_fsuid, cur_egid, p_root); - } else if (uid == 1) { + set_task_creds(REF_PID(p), cur_euid, cur_fsuid, cur_egid, cred_flags); + } else if (ref_uid == 1) { if (!CHECK_ROOT_CREDS(p)) - set_task_creds(p->pid, cur_euid, cur_fsuid, cur_egid, p_root); - } else if (uid == dead_uid || g_uid == dead_uid) { + 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 +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + ) { path = defex_get_filename(p); - pr_crit("defex[5]: process wasn't killed [task=%s, filename=%s, uid=%d]\n", p->comm, path, cur_uid); - pr_crit("defex[5]: uid=%d euid=%d fsuid=%d egid=%d\n", - cur_uid, cur_euid, cur_fsuid, cur_egid); + pr_crit("defex[5]: process wasn't killed [task=%s, filename=%s, uid=%d, tgid=%u, pid=%u, ppid=%u]\n", + p->comm, (path ? path : ""), cur_uid, p->tgid, p->pid, p->real_parent->pid); + pr_crit("defex[5]: stored [euid=%d fsuid=%d egid=%d] current [uid=%d euid=%d fsuid=%d egid=%d]\n", + ref_uid, ref_fsuid, ref_egid, cur_uid, cur_euid, cur_fsuid, cur_egid); goto exit; } else { check_deeper = 0; /* temporary allow fsuid changes to "media_rw" */ - if ((cur_uid != uid) || (cur_euid != uid) || !((cur_fsuid == fsuid) || (cur_fsuid == uid) || (cur_fsuid == AID_MEDIA_RW) || (cur_fsuid == SECUREFD_MEDIA_RW)) || (cur_egid != egid)) { + if ( (cur_uid != ref_uid) || + (cur_euid != ref_uid) || + (cur_egid != ref_egid) || + !((cur_fsuid == ref_fsuid) || + (cur_fsuid == ref_uid) || + (cur_fsuid == AID_MEDIA_RW) || + (cur_fsuid == SECUREFD_MEDIA_RW)) ) { check_deeper = 1; - set_task_creds(p->pid, 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, uid) || - !at_same_group(cur_euid, uid) || - !at_same_group_gid(cur_egid, egid) || - !at_same_group(cur_fsuid, fsuid)) && + 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)) { - set_task_creds(p->pid, dead_uid, dead_uid, dead_uid, p_root); - if (p->tgid != p->pid) - set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, p_root); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + case_num = ((p->tgid == p->pid) ? 1 : 2); +#else case_num = 1; - goto show_violation; +#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)) { - set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, p_root); - if (p->tgid != p->pid) - set_task_creds(p->pid, dead_uid, dead_uid, dead_uid, p_root); case_num = 2; - goto show_violation; + goto trigger_violation; } } +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ } - if ((p->tgid != p->pid) && CHECK_ROOT_CREDS(p) && !p_root) { - if ((g_uid > 1) && task_defex_is_secured(p)) { - set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, p_root); - if (p->tgid != p->pid) - set_task_creds(p->pid, dead_uid, dead_uid, dead_uid, p_root); + 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 + && (g_uid > 1) +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + ) { case_num = 3; - goto show_violation; + goto trigger_violation; } - } - - if (CHECK_ROOT_CREDS(p) && !CHECK_ROOT_CREDS(p->real_parent) && - task_defex_is_secured(p)) { - set_task_creds(p->pid, dead_uid, dead_uid, dead_uid, p_root); - if (p->tgid != p->pid) - set_task_creds(p->tgid, dead_uid, dead_uid, dead_uid, p_root); case_num = 4; - goto show_violation; + goto trigger_violation; } out: return DEFEX_ALLOW; -show_violation: +trigger_violation: + 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, 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]\n", - case_num, p->comm, (path ? path : ""), cur_uid); - pr_crit("defex[%d]: stored [euid=%d fsuid=%d egid=%d] uid=%d euid=%d fsuid=%d egid=%d\n", - case_num, uid, fsuid, egid, cur_uid, cur_euid, cur_fsuid, cur_egid); + pr_crit("defex[%d]: credential violation [task=%s, filename=%s, uid=%d, tgid=%u, pid=%u, ppid=%u]\n", + case_num, p->comm, (path ? path : ""), cur_uid, p->tgid, p->pid, p->real_parent->pid); + pr_crit("defex[%d]: stored [euid=%d fsuid=%d egid=%d] current [uid=%d euid=%d fsuid=%d egid=%d]\n", + case_num, ref_uid, ref_fsuid, ref_egid, cur_uid, cur_euid, cur_fsuid, cur_egid); #ifdef DEFEX_DSMS_ENABLE - defex_report_violation(PED_VIOLATION, 0, syscall, p, NULL, uid, fsuid, egid, case_num); + defex_report_violation(PED_VIOLATION, 0, syscall, p, NULL, ref_uid, ref_fsuid, ref_egid, case_num); #endif /* DEFEX_DSMS_ENABLE */ exit: @@ -715,13 +747,31 @@ do_deny: int task_defex_zero_creds(struct task_struct *tsk) { - if (is_task_creds_ready()) - delete_task_creds(tsk->pid); +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + int is_fork = -1; +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + get_task_struct(tsk); + if (tsk->flags & (PF_KTHREAD | PF_WQ_WORKER)) { + put_task_struct(tsk); + return 0; + } + if (is_task_creds_ready()) { +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE + is_fork = ((tsk->flags & PF_FORKNOEXEC) && (!READ_ONCE(tsk->on_rq))); +#ifdef TASK_NEW + if (!is_fork && (tsk->state & TASK_NEW)) + is_fork = 1; +#endif /* TASK_NEW */ + set_task_creds_tcnt(REF_PID(tsk), is_fork?1:-1); +#else + delete_task_creds(REF_PID(tsk)); +#endif /* DEFEX_PED_BASED_ON_TGID_ENABLE */ + } #ifdef DEFEX_CACHES_ENABLE defex_file_cache_delete(tsk->pid); #endif /* DEFEX_CACHES_ENABLE */ - + put_task_struct(tsk); return 0; } diff --git a/security/samsung/defex_lsm/include/defex_internal.h b/security/samsung/defex_lsm/include/defex_internal.h index 8d3dbd6c1..b0d2a3b80 100644 --- a/security/samsung/defex_lsm/include/defex_internal.h +++ b/security/samsung/defex_lsm/include/defex_internal.h @@ -18,7 +18,7 @@ #include "defex_config.h" #define DEFEX_MAJOR_VERSION 2 -#define DEFEX_MINOR_VERSION 5 +#define DEFEX_MINOR_VERSION 6 #define DEFEX_REVISION "rel" /* DEFEX Features */ @@ -87,6 +87,36 @@ void creds_fast_hash_init(void); #define uid_set_value(x, v) (x = v) #endif /* STRICT_UID_TYPE_CHECKS */ +#ifdef DEFEX_PED_BASED_ON_TGID_ENABLE +# 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; @@ -106,9 +136,15 @@ 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); -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 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/five/five_crypto.c b/security/samsung/five/five_crypto.c index dce3d9064..2ede15b04 100644 --- a/security/samsung/five/five_crypto.c +++ b/security/samsung/five/five_crypto.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "five.h" #include "five_crypto_comp.h" #include "five_porting.h" @@ -217,6 +218,8 @@ static void ahash_complete(struct crypto_async_request *req, int err) static int ahash_wait(int err, struct ahash_completion *res) { + try_to_freeze(); + switch (err) { case 0: break; @@ -411,6 +414,8 @@ static int five_calc_file_hash_tfm(struct file *file, break; offset += rbuf_len; + try_to_freeze(); + rc = crypto_shash_update(shash, rbuf, rbuf_len); if (rc) break; diff --git a/security/samsung/five/five_main.c b/security/samsung/five/five_main.c index 6b2d6d77a..f3ee8b353 100644 --- a/security/samsung/five/five_main.c +++ b/security/samsung/five/five_main.c @@ -46,7 +46,7 @@ static const bool unlink_on_error; // false static const bool check_dex2oat_binary = true; static const bool check_memfd_file = true; -static struct file *memfd_file; +static struct file *memfd_file __ro_after_init; static struct workqueue_struct *g_five_workqueue; @@ -817,7 +817,7 @@ static struct notifier_block five_reboot_nb = { .priority = INT_MAX, }; -int five_hash_algo = HASH_ALGO_SHA1; +int five_hash_algo __ro_after_init = HASH_ALGO_SHA1; static int __init hash_setup(const char *str) { diff --git a/sound/core/timer.c b/sound/core/timer.c index 6abea4e4f..b12cc9797 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -282,9 +282,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.c b/sound/soc/samsung/abox/abox.c index 674e3f03f..251220095 100644 --- a/sound/soc/samsung/abox/abox.c +++ b/sound/soc/samsung/abox/abox.c @@ -5447,14 +5447,14 @@ static int abox_disable(struct device *dev) clk_disable(data->clk_ca7); + abox_request_dram_on(data->pdev, dev, false); + abox_gic_disable_irq(&data->pdev_gic->dev); cancel_work_sync(&data->change_cpu_gear_work); abox_failsafe_report_reset(dev); - abox_request_dram_on(data->pdev, dev, false); - return 0; }