// SPDX-License-Identifier: GPL-2.0-only /*! ****************************************************************************** @file mac_app.c @brief MAC Application This file contains MAC APP initialization @author Nordic Semiconductor ASA @date 2013 ******************************************************************************/ #include #include #include #include #include #include "uccrt.h" #include "umac_hal.h" #include "wlan_umac_api.h" #include "umac_hal.h" #include "img_mac80211_types.h" #include "host_rpu_common_if.h" #include "lmac_if_common.h" #include "img_host_rpu_umac_iface.h" extern struct host_rpu_umac_info *umac_fw_config_params_g; extern struct lmac_fw_config_params *lmac_fw_config_params_gp; #ifdef ENABLE_OTP RETENTION_MEM_SECTION_UNINITIALIZED extern struct rpu_otp_params otp_params; #endif static SCHEDULE_T sched; static TASKQ_T schedQueues[PRIORITIES]; int warm_boot; int main_stack_size; int timer_stack_size; int umac_rx_stack_size; uint32_t *main_stack; uint32_t *timer_stack; uint32_t *umac_rx_stack; uint32_t stackpool[MAIN_TASK_STACK_SIZE + TIMER_TASK_STACK_SIZE + UMAC_RX_TASK_STACK_SIZE]; #ifdef ENABLE_STACK_SIZE_CHECK #define STACK_SIZE_CHECK_WRITE_PATTERN 0XFF #endif /* ENABLE_STACK_SIZE_CHECK */ RETENTION_MEM_SECTION_UNINITIALIZED unsigned long curr_jiffies; RETENTION_MEM_SECTION_UNINITIALIZED unsigned long prev_jiffies; RETENTION_MEM_SECTION_UNINITIALIZED unsigned long jiffies; RETENTION_MEM_SECTION_UNINITIALIZED unsigned long meos_sec; RETENTION_MEM_SECTION_UNINITIALIZED unsigned long meos_usec; RETENTION_MEM_SECTION_UNINITIALIZED unsigned int clock_ticks_usec; /*frequency in Mhz/2*/ /* ** FUNCTION: startOS ** ** DESCRIPTION: Initialises MeOS kernel ** */ void startOS(void) { TMR_setClockSpeed(clock_ticks_usec); KRN_reset(&sched, schedQueues, MAX_PRIORITY, 0, main_stack, main_stack_size, NULL, 0); KRN_startOS("Startup task"); KRN_startTimerTask("Timer Task", timer_stack, timer_stack_size); KRN_priority(NULL, KRN_LOWEST_PRIORITY+1); } void umac_init(void); int img_data_init(void); int alloc_pool_init(void); void img_module_iface_init(void); int ieee80211_init(void); unsigned int is_warm_boot; void stack_init(void) { #ifdef ENABLE_STACK_SIZE_CHECK int i; unsigned char *stack_ptr = (unsigned char *)stackpool; for (i = 0; i < sizeof(stackpool); i++) { stack_ptr[i] = STACK_SIZE_CHECK_WRITE_PATTERN; } #endif /* ENABLE_STACK_SIZE_CHECK */ main_stack = stackpool; main_stack_size = MAIN_TASK_STACK_SIZE; timer_stack = stackpool + main_stack_size; timer_stack_size = TIMER_TASK_STACK_SIZE; umac_rx_stack = stackpool + (main_stack_size + timer_stack_size); umac_rx_stack_size = UMAC_RX_TASK_STACK_SIZE; } void update_umac_version(void) { umac_fw_config_params_g->version = IMG_UMAC_VERSION(UMAC_VER) | IMG_UMAC_MAJOR(UMAC_MAJOR_VER) | IMG_UMAC_MINOR(UMAC_MINOR_VER) | IMG_UMAC_EXTRA(UMAC_EXTRA_VER); } /* ** FUNCTION: startOS ** ** DESCRIPTION: Start OS, initialise MM ops, hal ops, rf ops, lmac and umac. ** Initialise test bench if stub is defined. */ unsigned char umac_app_main_dbg; void firmWareInit(void) { uint32_t lmacBoot = 0; UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x31); umac_app_main_dbg++; /* 1 */ if ((*((unsigned int *)ABS_SYS_SLEEP_CTRL_IRQ_STATUS) & (SYS_SLEEP_CTRL_WAKEUP_IRQ_STATUS_MASK)) || (*((unsigned int *)ABS_SYS_SLEEP_CTRL_IRQ_STATUS) & (SYS_SLEEP_CTRL_TIMER_IRQ_STATUS_MASK))) { warm_boot = 1; } else { warm_boot = 0; } lmac_fw_config_params_gp = (struct lmac_fw_config_params *)(RPU_MEM_LMAC_BOOT_SIG); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x32); umac_app_main_dbg++; /* 2 */ clock_ticks_usec = UMAC_CPU_CORE_FREQ/2; UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x33); umac_app_main_dbg++; /* 3 */ /* Start MeOS */ stack_init(); startOS(); UCCP_start(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x34); umac_app_main_dbg++; /* 4 */ alloc_pool_init(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x36); umac_app_main_dbg++; /* 5 */ while (1) { lmacBoot = UCC_READ_PERIP(ABS_PMB_WLAN_TIMERS_TIM64_3_MIDSB); if (lmacBoot == 0x5a5a5a) break; } /* HAL init */ umac_hal_ops.init(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x38); umac_app_main_dbg++; /* 6 */ img_data_init(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x39); umac_app_main_dbg++; /* 7 */ umac_init(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x40); umac_app_main_dbg++; /* 8 */ umac_fw_config_params_g->version = IMG_UMAC_VERSION(UMAC_VER) | IMG_UMAC_MAJOR(UMAC_MAJOR_VER) | IMG_UMAC_MINOR(UMAC_MINOR_VER) | IMG_UMAC_EXTRA(UMAC_EXTRA_VER); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x41); umac_app_main_dbg++; /* 9 */ /*Set HP_READY*/ UCC_WRITE_PERIP(ABS_PMB_WLAN_TIMERS_TIM64_3_MSB, 0x6a6a); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x42); umac_app_main_dbg++; /* 10 */ #ifdef ENABLE_OTP umac_fw_config_params_g->info_part = otp_params.info_part; umac_fw_config_params_g->info_variant = otp_params.info_variant; umac_fw_config_params_g->info_lromversion = otp_params.info_lromversion; umac_fw_config_params_g->info_uromversion = otp_params.info_uromversion; memcpy(umac_fw_config_params_g->info_uuid, otp_params.info_uuid, 16); umac_fw_config_params_g->info_spare0 = otp_params.info_spare0; umac_fw_config_params_g->info_spare1 = otp_params.info_spare1; memcpy(umac_fw_config_params_g->mac_address0, otp_params.mac_adress0, 8); memcpy(umac_fw_config_params_g->mac_address1, otp_params.mac_address1, 8); memcpy(umac_fw_config_params_g->calib, otp_params.calib, 36); #endif umac_fw_config_params_g->boot_status= 0x5a5a5a5a; UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x43); umac_app_main_dbg++; /* 11 */ update_umac_version(); UCC_WRITE_PERIP(ABS_PMB_EDC_GPIO1_OUT, 0x44); umac_app_main_dbg++; /* 12 */ }