/****************************************************************************** * * Copyright(c) 2019 - 2020 Realtek Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License 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. * * Author: vincent_fann@realtek.com * *****************************************************************************/ #ifndef __PHL_CMD_JOB_H__ #define __PHL_CMD_JOB_H__ #define RTW_PHL_JOB_NAME_LEN 32 #ifndef MIN #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #endif struct fsm_msg; struct _cmd_obj; /* command job */ enum JOB_ID { JOB_RUN_FUNC, JOB_ADD_STA_ENTRY, JOB_ADD_MACID, JOB_MAX, }; struct job_hdl_ent { u16 job_id; char name[RTW_PHL_JOB_NAME_LEN]; int (*job_func)(struct _cmd_obj *pcmd, void *param); }; enum JOB_RESULT { JOB_SUCCESS, /* caller thread will be schedule out until job is completed */ JOB_TIMEOUT, JOB_FAILURE }; struct wait_completion { u8 sync; u32 submit_time; /* <0: not synchronous, * 0: wait forever, * >0: max waitting time (ms) */ int max_wait_time; _os_event done; /* JOB_WAIT_COMPLETION use */ int rtn; /* handle return value */ enum JOB_RESULT result; /* operation result */ }; struct phl_cmd_job { _os_list list; u16 id; struct wait_completion wait; u8 pwr_level; union { struct { /* JOB_RUN_FUNC */ int (*func)(void *priv, void *param); /* TODO remove */ int (*fptr)(void *priv, void *param, bool discard); void *priv; void *parm; int parm_sz; char name[RTW_PHL_JOB_NAME_LEN]; } cmd; struct { /* JOB_ADD_STA_ENTRY */ struct rtw_phl_stainfo_t *sta; } sta; } u; }; enum PWR_LEVEL { PWR_DONT_CARE, /* able to run in any kind of power mode */ PWR_NO_IO, /* without register read write */ PWR_BASIC_IO /* leave 32K and PG */ }; enum JOB_SYNC { JOB_ASYNC, /* caller thread will be schedule out until job is completed */ JOB_WAIT_COMPLETION }; char *job_name(struct _cmd_obj *pcmd, u8 id); void cmd_set_job_tbl(struct _cmd_obj *pcmd); void cmd_discard_msg_job(struct _cmd_obj *pcmd, struct fsm_msg *msg); int phl_cmd_do_job(struct _cmd_obj *pcmd, void *param); /* command thread jobs */ /* TODO remove below when no reference */ enum rtw_phl_status rtw_phl_job_add_fptr(void *phl, void *func, void *priv, void *parm, char *name, enum PWR_LEVEL pwr); enum rtw_phl_status rtw_phl_job_fill_fptr(void *phl, struct phl_cmd_job *job, void *func, void *priv, void *parm, char *name, enum PWR_LEVEL pwr); enum rtw_phl_status phl_cmd_enqueue_and_wait_job(struct _cmd_obj *pcmd, struct fsm_msg *msg); enum rtw_phl_status phl_cmd_complete_job(void *phl, struct phl_cmd_job *job); enum rtw_phl_status rtw_phl_job_reg_wdog(void *phl, int (*func)(void *priv, void *param, bool discard), void *priv, void *parm, int parm_sz, char *name, enum PWR_LEVEL pwr); enum rtw_phl_status rtw_phl_cmd_pause_wdog(void *phl, char *reason); enum rtw_phl_status rtw_phl_cmd_resume_wdog(void *phl, char *reason); enum rtw_phl_status rtw_hal_add_sta_entry_job(void *phl, struct rtw_phl_stainfo_t *sta, enum JOB_SYNC sync); #endif /* __PHL_CMD_JOB_H__ */