1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 - 2020 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * Author: vincent_fann@realtek.com 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun *****************************************************************************/ 17*4882a593Smuzhiyun #ifndef __PHL_CMD_JOB_H__ 18*4882a593Smuzhiyun #define __PHL_CMD_JOB_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define RTW_PHL_JOB_NAME_LEN 32 21*4882a593Smuzhiyun #ifndef MIN 22*4882a593Smuzhiyun #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) 23*4882a593Smuzhiyun #endif 24*4882a593Smuzhiyun struct fsm_msg; 25*4882a593Smuzhiyun struct _cmd_obj; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* command job */ 28*4882a593Smuzhiyun enum JOB_ID { 29*4882a593Smuzhiyun JOB_RUN_FUNC, 30*4882a593Smuzhiyun JOB_ADD_STA_ENTRY, 31*4882a593Smuzhiyun JOB_ADD_MACID, 32*4882a593Smuzhiyun JOB_MAX, 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct job_hdl_ent { 36*4882a593Smuzhiyun u16 job_id; 37*4882a593Smuzhiyun char name[RTW_PHL_JOB_NAME_LEN]; 38*4882a593Smuzhiyun int (*job_func)(struct _cmd_obj *pcmd, void *param); 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum JOB_RESULT { 42*4882a593Smuzhiyun JOB_SUCCESS, 43*4882a593Smuzhiyun /* caller thread will be schedule out until job is completed */ 44*4882a593Smuzhiyun JOB_TIMEOUT, 45*4882a593Smuzhiyun JOB_FAILURE 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct wait_completion { 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun u8 sync; 51*4882a593Smuzhiyun u32 submit_time; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* <0: not synchronous, 54*4882a593Smuzhiyun * 0: wait forever, 55*4882a593Smuzhiyun * >0: max waitting time (ms) 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun int max_wait_time; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun _os_event done; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* JOB_WAIT_COMPLETION use */ 62*4882a593Smuzhiyun int rtn; /* handle return value */ 63*4882a593Smuzhiyun enum JOB_RESULT result; /* operation result */ 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct phl_cmd_job { 67*4882a593Smuzhiyun _os_list list; 68*4882a593Smuzhiyun u16 id; 69*4882a593Smuzhiyun struct wait_completion wait; 70*4882a593Smuzhiyun u8 pwr_level; 71*4882a593Smuzhiyun union { 72*4882a593Smuzhiyun struct { /* JOB_RUN_FUNC */ 73*4882a593Smuzhiyun int (*func)(void *priv, void *param); /* TODO remove */ 74*4882a593Smuzhiyun int (*fptr)(void *priv, void *param, bool discard); 75*4882a593Smuzhiyun void *priv; 76*4882a593Smuzhiyun void *parm; 77*4882a593Smuzhiyun int parm_sz; 78*4882a593Smuzhiyun char name[RTW_PHL_JOB_NAME_LEN]; 79*4882a593Smuzhiyun } cmd; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct { /* JOB_ADD_STA_ENTRY */ 82*4882a593Smuzhiyun struct rtw_phl_stainfo_t *sta; 83*4882a593Smuzhiyun } sta; 84*4882a593Smuzhiyun } u; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun enum PWR_LEVEL { 88*4882a593Smuzhiyun PWR_DONT_CARE, /* able to run in any kind of power mode */ 89*4882a593Smuzhiyun PWR_NO_IO, /* without register read write */ 90*4882a593Smuzhiyun PWR_BASIC_IO /* leave 32K and PG */ 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun enum JOB_SYNC { 94*4882a593Smuzhiyun JOB_ASYNC, 95*4882a593Smuzhiyun /* caller thread will be schedule out until job is completed */ 96*4882a593Smuzhiyun JOB_WAIT_COMPLETION 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun char *job_name(struct _cmd_obj *pcmd, u8 id); 100*4882a593Smuzhiyun void cmd_set_job_tbl(struct _cmd_obj *pcmd); 101*4882a593Smuzhiyun void cmd_discard_msg_job(struct _cmd_obj *pcmd, struct fsm_msg *msg); 102*4882a593Smuzhiyun int phl_cmd_do_job(struct _cmd_obj *pcmd, void *param); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* command thread jobs */ 105*4882a593Smuzhiyun /* TODO remove below when no reference */ 106*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_job_add_fptr(void *phl, void *func, 107*4882a593Smuzhiyun void *priv, void *parm, char *name, enum PWR_LEVEL pwr); 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_job_fill_fptr(void *phl, struct phl_cmd_job *job, 110*4882a593Smuzhiyun void *func, void *priv, void *parm, char *name, enum PWR_LEVEL pwr); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun enum rtw_phl_status phl_cmd_enqueue_and_wait_job(struct _cmd_obj *pcmd, 113*4882a593Smuzhiyun struct fsm_msg *msg); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun enum rtw_phl_status phl_cmd_complete_job(void *phl, struct phl_cmd_job *job); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_job_reg_wdog(void *phl, 118*4882a593Smuzhiyun int (*func)(void *priv, void *param, bool discard), 119*4882a593Smuzhiyun void *priv, void *parm, int parm_sz, char *name, enum PWR_LEVEL pwr); 120*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cmd_pause_wdog(void *phl, char *reason); 121*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cmd_resume_wdog(void *phl, char *reason); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun enum rtw_phl_status rtw_hal_add_sta_entry_job(void *phl, 124*4882a593Smuzhiyun struct rtw_phl_stainfo_t *sta, enum JOB_SYNC sync); 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #endif /* __PHL_CMD_JOB_H__ */ 127