/****************************************************************************** * * Copyright(c) 2019 Realtek Corporation. All rights reserved. * * 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. * ******************************************************************************/ #include "phy_misc.h" u32 mac_fast_ch_sw(struct mac_ax_adapter *adapter, struct mac_ax_fast_ch_sw_param *fast_ch_sw_param) { u8 *buf; u32 ret = MACSUCCESS; struct fwcmd_fcs *pkt; #if MAC_AX_PHL_H2C struct rtw_h2c_pkt *h2cbuf; #else struct h2c_buf *h2cbuf; #endif h2cbuf = h2cb_alloc(adapter, H2CB_CLASS_DATA); if (!h2cbuf) return MACNPTR; buf = h2cb_put(h2cbuf, sizeof(struct fwcmd_fcs)); if (!buf) { PLTFM_MSG_ERR("[HM][H2C][FCS] ret = %d\n", MACNOBUF); return MACNOBUF; } pkt = (struct fwcmd_fcs *)buf; pkt->dword0 = cpu_to_le32(SET_WORD(fast_ch_sw_param->ap_port_id, FWCMD_H2C_FCS_AP_PORT_ID) | SET_WORD(fast_ch_sw_param->ch_idx, FWCMD_H2C_FCS_CH_IDX) | SET_WORD(fast_ch_sw_param->thermal_idx, FWCMD_H2C_FCS_THERMAL_IDX) | SET_WORD(fast_ch_sw_param->pause_rel_mode, FWCMD_H2C_FCS_PAUSE_REL_MODE) | SET_WORD(fast_ch_sw_param->con_sta_num, FWCMD_H2C_FCS_CON_STA_NUM) | (fast_ch_sw_param->band ? FWCMD_H2C_FCS_BAND : 0) | SET_WORD(fast_ch_sw_param->bandwidth, FWCMD_H2C_FCS_BANDWIDTH)); pkt->dword1 = cpu_to_le32(SET_WORD(fast_ch_sw_param->pri_ch, FWCMD_H2C_FCS_PRI_CH) | SET_WORD(fast_ch_sw_param->central_ch, FWCMD_H2C_FCS_CENTRAL_CH)); pkt->dword2 = cpu_to_le32(fast_ch_sw_param->rel_pause_tsfl); pkt->dword3 = cpu_to_le32(fast_ch_sw_param->rel_pause_tsfh); pkt->dword4 = cpu_to_le32(fast_ch_sw_param->rel_pause_delay_time); pkt->dword5 = cpu_to_le32(SET_WORD(fast_ch_sw_param->csa_pkt_id[0], FWCMD_H2C_FCS_CSA_PKT_ID0) | SET_WORD(fast_ch_sw_param->csa_pkt_id[1], FWCMD_H2C_FCS_CSA_PKT_ID1) | SET_WORD(fast_ch_sw_param->csa_pkt_id[2], FWCMD_H2C_FCS_CSA_PKT_ID2) | SET_WORD(fast_ch_sw_param->csa_pkt_id[3], FWCMD_H2C_FCS_CSA_PKT_ID3)); ret = h2c_pkt_set_hdr(adapter, h2cbuf, FWCMD_TYPE_H2C, FWCMD_H2C_CAT_MAC, FWCMD_H2C_CL_FCS, FWCMD_H2C_FUNC_FCS, 1, 1); if (ret) { PLTFM_MSG_ERR("[HM][H2C][FCS] error when set hdr\n"); return ret; } ret = h2c_pkt_build_txd(adapter, h2cbuf); if (ret) { PLTFM_MSG_ERR("[HM][H2C][FCS] error when build txd\n"); return ret; } #if MAC_AX_PHL_H2C ret = PLTFM_TX(h2cbuf); #else ret = PLTFM_TX(h2cbuf->data, h2cbuf->len); #endif h2cb_free(adapter, h2cbuf); if (ret) { PLTFM_MSG_ERR("[HM][H2C][FCS] error when h2cb free\n"); return ret; } h2c_end_flow(adapter); adapter->fast_ch_sw_info.busy = 1; if (ret) { PLTFM_MSG_ERR("[HM][H2C][FCS] error when h2c_end_flow\n"); return ret; } PLTFM_MSG_TRACE("[HM][H2C][FCS] ret = %d\n", ret); return ret; } u32 mac_fast_ch_sw_done(struct mac_ax_adapter *adapter) { if (adapter->fast_ch_sw_info.busy) return MACPROCBUSY; else return MACSUCCESS; } u32 mac_get_fast_ch_sw_rpt(struct mac_ax_adapter *adapter, u32 *fast_ch_sw_status_code) { *fast_ch_sw_status_code = adapter->fast_ch_sw_info.status; return MACSUCCESS; }