/* SPDX-License-Identifier: GPL-2.0 */ #include "halmac_88xx_cfg.h" HALMAC_RET_STATUS halmac_dump_efuse_fw_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ); HALMAC_RET_STATUS halmac_dump_efuse_drv_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ); HALMAC_RET_STATUS halmac_update_eeprom_mask_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, INOUT PHALMAC_PG_EFUSE_INFO pPg_efuse_info, OUT u8 *pEeprom_mask_updated ); HALMAC_RET_STATUS halmac_check_efuse_enough_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info, IN u8 *pEeprom_mask_updated ); HALMAC_RET_STATUS halmac_program_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info, IN u8 *pEeprom_mask_updated ); HALMAC_RET_STATUS halmac_parse_c2h_debug_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_scan_status_rpt_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_psd_data_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_efuse_data_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_physical_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_enqueue_para_buff_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PHY_PARAMETER_INFO para_info, IN u8 *pCurr_buff_wptr, OUT u8 *pEnd_cmd ); HALMAC_RET_STATUS halmac_parse_h2c_ack_cfg_para_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_gen_cfg_para_h2c_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pH2c_buff ); HALMAC_RET_STATUS halmac_parse_h2c_ack_update_packet_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_update_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_run_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_channel_switch_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_iqk_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_parse_h2c_ack_power_tracking_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ); HALMAC_RET_STATUS halmac_dump_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_EFUSE_READ_CFG cfg ) { VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status); pDriver_adapter = pHalmac_adapter->pDriver_adapter; *pProcess_status = HALMAC_CMD_PROCESS_SENDING; if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_H2C_SENT)) return HALMAC_RET_ERROR_STATE; if (HALMAC_EFUSE_R_AUTO == cfg) { if (HALMAC_DLFW_NONE == pHalmac_adapter->halmac_state.dlfw_state) status = halmac_dump_efuse_drv_88xx(pHalmac_adapter); else status = halmac_dump_efuse_fw_88xx(pHalmac_adapter); } else if (HALMAC_EFUSE_R_FW == cfg) { status = halmac_dump_efuse_fw_88xx(pHalmac_adapter); } else { status = halmac_dump_efuse_drv_88xx(pHalmac_adapter); } if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_efuse error = %x\n", status); return status; } return status; } HALMAC_RET_STATUS halmac_func_read_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 offset, IN u32 size, OUT u8 *pEfuse_map ) { VOID *pDriver_adapter = NULL; pDriver_adapter = pHalmac_adapter->pDriver_adapter; if (NULL == pEfuse_map) { PLATFORM_MSG_PRINT(pHalmac_adapter->pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Malloc for dump efuse map error\n"); return HALMAC_RET_NULL_POINTER; } if (_TRUE == pHalmac_adapter->hal_efuse_map_valid) PLATFORM_RTL_MEMCPY(pDriver_adapter, pEfuse_map, pHalmac_adapter->pHalEfuse_map + offset, size); else if (HALMAC_RET_SUCCESS != halmac_read_hw_efuse_88xx(pHalmac_adapter, offset, size, pEfuse_map)) return HALMAC_RET_EFUSE_R_FAIL; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_read_hw_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 offset, IN u32 size, OUT u8 *pEfuse_map ) { u8 value8; u32 value32; u32 address; u32 tmp32, counter; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; /* Read efuse no need 2.5V LDO */ value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3); if (value8 & BIT(7)) HALMAC_REG_WRITE_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3, (u8)(value8 & ~(BIT(7)))); value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_EFUSE_CTRL); for (address = offset; address < offset + size; address++) { value32 = value32 & ~((BIT_MASK_EF_DATA) | (BIT_MASK_EF_ADDR << BIT_SHIFT_EF_ADDR)); value32 = value32 | ((address & BIT_MASK_EF_ADDR) << BIT_SHIFT_EF_ADDR); HALMAC_REG_WRITE_32(pHalmac_adapter, REG_EFUSE_CTRL, value32 & (~BIT_EF_FLAG)); counter = 100; do { tmp32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_EFUSE_CTRL); counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pHalmac_adapter->pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "HALMAC_RET_EFUSE_R_FAIL\n"); return HALMAC_RET_EFUSE_R_FAIL; } } while (0 == (tmp32 & BIT_EF_FLAG)); *(pEfuse_map + address - offset) = (u8)(tmp32 & BIT_MASK_EF_DATA); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_dump_efuse_drv_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 *pEfuse_map = NULL; u32 efuse_size; VOID *pDriver_adapter = NULL; pDriver_adapter = pHalmac_adapter->pDriver_adapter; efuse_size = pHalmac_adapter->hw_config_info.efuse_size; if (NULL == pHalmac_adapter->pHalEfuse_map) { pHalmac_adapter->pHalEfuse_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, efuse_size); if (NULL == pHalmac_adapter->pHalEfuse_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate efuse map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } } pEfuse_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, efuse_size); if (NULL == pEfuse_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local efuse map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } if (HALMAC_RET_SUCCESS != halmac_read_hw_efuse_88xx(pHalmac_adapter, 0, efuse_size, pEfuse_map)) return HALMAC_RET_EFUSE_R_FAIL; PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); PLATFORM_RTL_MEMCPY(pDriver_adapter, pHalmac_adapter->pHalEfuse_map, pEfuse_map, efuse_size); pHalmac_adapter->hal_efuse_map_valid = _TRUE; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); PLATFORM_RTL_FREE(pDriver_adapter, pEfuse_map, efuse_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_dump_efuse_fw_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; h2c_header_info.sub_cmd_id = SUB_CMD_ID_DUMP_PHYSICAL_EFUSE; h2c_header_info.content_size = 0; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); pHalmac_adapter->halmac_state.efuse_state_set.seq_num = h2c_seq_mum; if (NULL == pHalmac_adapter->pHalEfuse_map) { pHalmac_adapter->pHalEfuse_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, pHalmac_adapter->hw_config_info.efuse_size); if (NULL == pHalmac_adapter->pHalEfuse_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac allocate efuse map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } } if (_FALSE == pHalmac_adapter->hal_efuse_map_valid) { status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_read_efuse_fw Fail = %x!!\n", status); return status; } } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_func_write_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 offset, IN u8 value ) { const u8 wite_protect_code = 0x69; u32 value32, tmp32, counter; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); pHalmac_adapter->hal_efuse_map_valid = _FALSE; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_PMC_DBG_CTRL2 + 3, wite_protect_code); /* Enable 2.5V LDO */ HALMAC_REG_WRITE_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3) | BIT(7))); value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_EFUSE_CTRL); value32 = value32 & ~((BIT_MASK_EF_DATA) | (BIT_MASK_EF_ADDR << BIT_SHIFT_EF_ADDR)); value32 = value32 | ((offset & BIT_MASK_EF_ADDR) << BIT_SHIFT_EF_ADDR) | (value & BIT_MASK_EF_DATA); HALMAC_REG_WRITE_32(pHalmac_adapter, REG_EFUSE_CTRL, value32 | BIT_EF_FLAG); counter = 100; do { tmp32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_EFUSE_CTRL); counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_write_efuse Fail !!\n"); return HALMAC_RET_EFUSE_W_FAIL; } } while (BIT_EF_FLAG == (tmp32 & BIT_EF_FLAG)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_PMC_DBG_CTRL2 + 3, 0x00); /* Disable 2.5V LDO */ HALMAC_REG_WRITE_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 3) & ~(BIT(7)))); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_func_switch_efuse_bank_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_EFUSE_BANK efuse_bank ) { u8 reg_value; PHALMAC_API pHalmac_api; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_BUSY)) return HALMAC_RET_ERROR_STATE; reg_value = HALMAC_REG_READ_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 1); if (efuse_bank == (reg_value & (BIT(0) | BIT(1)))) return HALMAC_RET_SUCCESS; reg_value &= ~(BIT(0) | BIT(1)); reg_value |= efuse_bank; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 1, reg_value); if ((HALMAC_REG_READ_8(pHalmac_adapter, REG_LDO_EFUSE_CTRL + 1) & (BIT(0) | BIT(1))) != efuse_bank) return HALMAC_RET_SWITCH_EFUSE_BANK_FAIL; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_eeprom_parser_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pPhysical_efuse_map, OUT u8 *pLogical_efuse_map ) { u8 j; u8 value8; u8 block_index; u8 valid_word_enable, word_enable; u8 efuse_read_header, efuse_read_header2 = 0; u32 eeprom_index; u32 efuse_index = 0; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; VOID *pDriver_adapter = NULL; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_RTL_MEMSET(pDriver_adapter, pLogical_efuse_map, 0xFF, eeprom_size); while (1) { value8 = *(pPhysical_efuse_map + efuse_index); efuse_read_header = value8; if ((efuse_read_header & 0x1f) == 0x0f) { efuse_index++; value8 = *(pPhysical_efuse_map + efuse_index); efuse_read_header2 = value8; block_index = ((efuse_read_header2 & 0xF0) >> 1) | ((efuse_read_header >> 5) & 0x07); word_enable = efuse_read_header2 & 0x0F; } else { block_index = (efuse_read_header & 0xF0) >> 4; word_enable = efuse_read_header & 0x0F; } if (efuse_read_header == 0xff) break; efuse_index++; if (efuse_index >= pHalmac_adapter->hw_config_info.efuse_size - HALMAC_RESERVED_EFUSE_SIZE_88XX - 1) return HALMAC_RET_EEPROM_PARSING_FAIL; for (j = 0; j < 4; j++) { valid_word_enable = (u8)((~(word_enable >> j)) & BIT(0)); if (valid_word_enable == 1) { eeprom_index = (block_index << 3) + (j << 1); if ((eeprom_index + 1) > eeprom_size) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Error: EEPROM addr exceeds eeprom_size:0x%X, at eFuse 0x%X\n", eeprom_size, efuse_index - 1); if ((efuse_read_header & 0x1f) == 0x0f) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Error: EEPROM header: 0x%X, 0x%X,\n", efuse_read_header, efuse_read_header2); else PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Error: EEPROM header: 0x%X,\n", efuse_read_header); eeprom_index++; efuse_index = efuse_index + 2; return HALMAC_RET_EEPROM_PARSING_FAIL; } else { value8 = *(pPhysical_efuse_map + efuse_index); *(pLogical_efuse_map + eeprom_index) = value8; eeprom_index++; efuse_index++; if (efuse_index > pHalmac_adapter->hw_config_info.efuse_size - HALMAC_RESERVED_EFUSE_SIZE_88XX - 1) return HALMAC_RET_EEPROM_PARSING_FAIL; value8 = *(pPhysical_efuse_map + efuse_index); *(pLogical_efuse_map + eeprom_index) = value8; efuse_index++; if (efuse_index > pHalmac_adapter->hw_config_info.efuse_size - HALMAC_RESERVED_EFUSE_SIZE_88XX) return HALMAC_RET_EEPROM_PARSING_FAIL; } } } } pHalmac_adapter->efuse_end = efuse_index; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_read_logical_efuse_map_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pMap ) { u8 *pEfuse_map = NULL; u32 efuse_size; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; efuse_size = pHalmac_adapter->hw_config_info.efuse_size; if (_FALSE == pHalmac_adapter->hal_efuse_map_valid) { pEfuse_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, efuse_size); if (NULL == pEfuse_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local efuse map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } if (NULL == pHalmac_adapter->pHalEfuse_map) { pHalmac_adapter->pHalEfuse_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, efuse_size); if (NULL == pHalmac_adapter->pHalEfuse_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate efuse map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } } status = halmac_func_read_efuse_88xx(pHalmac_adapter, 0, efuse_size, pEfuse_map); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_efuse error = %x\n", status); return status; } PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); PLATFORM_RTL_MEMCPY(pDriver_adapter, pHalmac_adapter->pHalEfuse_map, pEfuse_map, efuse_size); pHalmac_adapter->hal_efuse_map_valid = _TRUE; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); PLATFORM_RTL_FREE(pDriver_adapter, pEfuse_map, efuse_size); } if (HALMAC_RET_SUCCESS != halmac_eeprom_parser_88xx(pHalmac_adapter, pHalmac_adapter->pHalEfuse_map, pMap)) return HALMAC_RET_EEPROM_PARSING_FAIL; return status; } HALMAC_RET_STATUS halmac_func_write_logical_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 offset, IN u8 value ) { u8 pg_efuse_byte1, pg_efuse_byte2; u8 pg_block, pg_block_index; u8 pg_efuse_header, pg_efuse_header2; u8 *pEeprom_map = NULL; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; u32 efuse_end; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size); if (NULL == pEeprom_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size); status = halmac_read_logical_efuse_map_88xx(pHalmac_adapter, pEeprom_map); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_logical_efuse_map_88xx error = %x\n", status); return status; } if (*(pEeprom_map + offset) != value) { efuse_end = pHalmac_adapter->efuse_end; pg_block = (u8)(offset >> 3); pg_block_index = (u8)((offset & (8 - 1)) >> 1); if (offset > 0x7f) { pg_efuse_header = (((pg_block & 0x07) << 5) & 0xE0) | 0x0F; pg_efuse_header2 = (u8)(((pg_block & 0x78) << 1) + ((0x1 << pg_block_index) ^ 0x0F)); } else { pg_efuse_header = (u8)((pg_block << 4) + ((0x01 << pg_block_index) ^ 0x0F)); } if ((offset & 1) == 0) { pg_efuse_byte1 = value; pg_efuse_byte2 = *(pEeprom_map + offset + 1); } else { pg_efuse_byte1 = *(pEeprom_map + offset - 1); pg_efuse_byte2 = value; } if (offset > 0x7f) { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, pg_efuse_header); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 1, pg_efuse_header2); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 2, pg_efuse_byte1); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 3, pg_efuse_byte2); } else { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, pg_efuse_header); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 1, pg_efuse_byte1); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 2, pg_efuse_byte2); } if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_write_logical_efuse error = %x\n", status); return status; } } PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_func_pg_efuse_by_map_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info, IN HALMAC_EFUSE_READ_CFG cfg ) { u8 *pEeprom_mask_updated = NULL; u32 eeprom_mask_size = pHalmac_adapter->hw_config_info.eeprom_size >> 4; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pEeprom_mask_updated = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_mask_size); if (NULL == pEeprom_mask_updated) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_mask_updated, 0x00, eeprom_mask_size); status = halmac_update_eeprom_mask_88xx(pHalmac_adapter, pPg_efuse_info, pEeprom_mask_updated); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_update_eeprom_mask_88xx error = %x\n", status); return status; } status = halmac_check_efuse_enough_88xx(pHalmac_adapter, pPg_efuse_info, pEeprom_mask_updated); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_check_efuse_enough_88xx error = %x\n", status); return status; } status = halmac_program_efuse_88xx(pHalmac_adapter, pPg_efuse_info, pEeprom_mask_updated); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_program_efuse_88xx error = %x\n", status); return status; } PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_mask_updated, eeprom_mask_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_update_eeprom_mask_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, INOUT PHALMAC_PG_EFUSE_INFO pPg_efuse_info, OUT u8 *pEeprom_mask_updated ) { u8 *pEeprom_map = NULL; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; u8 *pEeprom_map_pg, *pEeprom_mask; u16 i, j; u16 map_byte_offset, mask_byte_offset; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; VOID *pDriver_adapter = NULL; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size); if (NULL == pEeprom_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size); PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_mask_updated, 0x00, pPg_efuse_info->efuse_mask_size); status = halmac_read_logical_efuse_map_88xx(pHalmac_adapter, pEeprom_map); if (HALMAC_RET_SUCCESS != status) return status; pEeprom_map_pg = pPg_efuse_info->pEfuse_map; pEeprom_mask = pPg_efuse_info->pEfuse_mask; for (i = 0; i < pPg_efuse_info->efuse_mask_size; i++) *(pEeprom_mask_updated + i) = *(pEeprom_mask + i); for (i = 0; i < pPg_efuse_info->efuse_map_size; i = i + 16) { for (j = 0; j < 16; j = j + 2) { map_byte_offset = i + j; mask_byte_offset = i >> 4; if (*(pEeprom_map_pg + map_byte_offset) == *(pEeprom_map + map_byte_offset)) { if (*(pEeprom_map_pg + map_byte_offset + 1) == *(pEeprom_map + map_byte_offset + 1)) { switch (j) { case 0: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(4) ^ 0xFF); break; case 2: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(5) ^ 0xFF); break; case 4: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(6) ^ 0xFF); break; case 6: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(7) ^ 0xFF); break; case 8: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(0) ^ 0xFF); break; case 10: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(1) ^ 0xFF); break; case 12: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(2) ^ 0xFF); break; case 14: *(pEeprom_mask_updated + mask_byte_offset) = *(pEeprom_mask_updated + mask_byte_offset) & (BIT(3) ^ 0xFF); break; default: break; } } } } } PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size); return status; } HALMAC_RET_STATUS halmac_check_efuse_enough_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info, IN u8 *pEeprom_mask_updated ) { u8 pre_word_enb, word_enb; u8 pg_efuse_header, pg_efuse_header2; u8 pg_block; u16 i, j; u32 efuse_end; u32 tmp_eeprom_offset, pg_efuse_num = 0; efuse_end = pHalmac_adapter->efuse_end; for (i = 0; i < pPg_efuse_info->efuse_map_size; i = i + 8) { tmp_eeprom_offset = i; if ((tmp_eeprom_offset & 7) > 0) { pre_word_enb = (*(pEeprom_mask_updated + (i >> 4)) & 0x0F); word_enb = pre_word_enb ^ 0x0F; } else { pre_word_enb = (*(pEeprom_mask_updated + (i >> 4)) >> 4); word_enb = pre_word_enb ^ 0x0F; } pg_block = (u8)(tmp_eeprom_offset >> 3); if (pre_word_enb > 0) { if (tmp_eeprom_offset > 0x7f) { pg_efuse_header = (((pg_block & 0x07) << 5) & 0xE0) | 0x0F; pg_efuse_header2 = (u8)(((pg_block & 0x78) << 1) + word_enb); } else { pg_efuse_header = (u8)((pg_block << 4) + word_enb); } if (tmp_eeprom_offset > 0x7f) { pg_efuse_num++; pg_efuse_num++; efuse_end = efuse_end + 2; for (j = 0; j < 4; j++) { if (((pre_word_enb >> j) & 0x1) > 0) { pg_efuse_num++; pg_efuse_num++; efuse_end = efuse_end + 2; } } } else { pg_efuse_num++; efuse_end = efuse_end + 1; for (j = 0; j < 4; j++) { if (((pre_word_enb >> j) & 0x1) > 0) { pg_efuse_num++; pg_efuse_num++; efuse_end = efuse_end + 2; } } } } } if ((pHalmac_adapter->hw_config_info.efuse_size - pg_efuse_num - HALMAC_RESERVED_EFUSE_SIZE_88XX - pHalmac_adapter->efuse_end) <= 0) return HALMAC_RET_EFUSE_NOT_ENOUGH; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_program_efuse_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info, IN u8 *pEeprom_mask_updated ) { u8 pre_word_enb, word_enb; u8 pg_efuse_header, pg_efuse_header2; u8 pg_block; u16 i, j; u32 efuse_end; u32 tmp_eeprom_offset; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; efuse_end = pHalmac_adapter->efuse_end; for (i = 0; i < pPg_efuse_info->efuse_map_size; i = i + 8) { tmp_eeprom_offset = i; if (((tmp_eeprom_offset >> 3) & 1) > 0) { pre_word_enb = (*(pEeprom_mask_updated + (i >> 4)) & 0x0F); word_enb = pre_word_enb ^ 0x0F; } else { pre_word_enb = (*(pEeprom_mask_updated + (i >> 4)) >> 4); word_enb = pre_word_enb ^ 0x0F; } pg_block = (u8)(tmp_eeprom_offset >> 3); if (pre_word_enb > 0) { if (tmp_eeprom_offset > 0x7f) { pg_efuse_header = (((pg_block & 0x07) << 5) & 0xE0) | 0x0F; pg_efuse_header2 = (u8)(((pg_block & 0x78) << 1) + word_enb); } else { pg_efuse_header = (u8)((pg_block << 4) + word_enb); } if (tmp_eeprom_offset > 0x7f) { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, pg_efuse_header); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 1, pg_efuse_header2); efuse_end = efuse_end + 2; for (j = 0; j < 4; j++) { if (((pre_word_enb >> j) & 0x1) > 0) { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, *(pPg_efuse_info->pEfuse_map + tmp_eeprom_offset + (j << 1))); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 1, *(pPg_efuse_info->pEfuse_map + tmp_eeprom_offset + (j << 1) + 1)); efuse_end = efuse_end + 2; } } } else { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, pg_efuse_header); efuse_end = efuse_end + 1; for (j = 0; j < 4; j++) { if (((pre_word_enb >> j) & 0x1) > 0) { status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end, *(pPg_efuse_info->pEfuse_map + tmp_eeprom_offset + (j << 1))); status = halmac_func_write_efuse_88xx(pHalmac_adapter, efuse_end + 1, *(pPg_efuse_info->pEfuse_map + tmp_eeprom_offset + (j << 1) + 1)); efuse_end = efuse_end + 2; } } } } } return status; } HALMAC_RET_STATUS halmac_dlfw_to_mem_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pRam_code, IN u32 dest, IN u32 code_size ) { u8 *pCode_ptr; u8 first_part; u32 mem_offset; u32 pkt_size_tmp, send_pkt_size; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; pCode_ptr = pRam_code; mem_offset = 0; first_part = 1; pkt_size_tmp = code_size; HALMAC_REG_WRITE_32(pHalmac_adapter, REG_DDMA_CH0CTRL, HALMAC_REG_READ_32(pHalmac_adapter, REG_DDMA_CH0CTRL) | BIT_DDMACH0_RESET_CHKSUM_STS); while (0 != pkt_size_tmp) { if (pkt_size_tmp >= pHalmac_adapter->max_download_size) send_pkt_size = pHalmac_adapter->max_download_size; else send_pkt_size = pkt_size_tmp; if (HALMAC_RET_SUCCESS != halmac_send_fwpkt_88xx(pHalmac_adapter, pCode_ptr + mem_offset, send_pkt_size)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_send_fwpkt_88xx fail!!"); return HALMAC_RET_DLFW_FAIL; } if (HALMAC_RET_SUCCESS != halmac_iddma_dlfw_88xx(pHalmac_adapter, HALMAC_OCPBASE_TXBUF_88XX + pHalmac_adapter->hw_config_info.txdesc_size, dest + mem_offset, send_pkt_size, first_part)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_iddma_dlfw_88xx fail!!"); return HALMAC_RET_DLFW_FAIL; } first_part = 0; mem_offset += send_pkt_size; pkt_size_tmp -= send_pkt_size; } if (HALMAC_RET_SUCCESS != halmac_check_fw_chksum_88xx(pHalmac_adapter, dest)) { PLATFORM_MSG_PRINT(pHalmac_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_check_fw_chksum_88xx fail!!"); return HALMAC_RET_DLFW_FAIL; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_send_fwpkt_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pRam_code, IN u32 code_size ) { VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; if (HALMAC_RET_SUCCESS != halmac_download_rsvd_page_88xx(pHalmac_adapter, pRam_code, code_size)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "PLATFORM_SEND_RSVD_PAGE 0 error!!\n"); return HALMAC_RET_DL_RSVD_PAGE_FAIL; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_iddma_dlfw_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 source, IN u32 dest, IN u32 length, IN u8 first ) { u32 counter; u32 ch0_control = (u32)(BIT_DDMACH0_CHKSUM_EN | BIT_DDMACH0_OWN); VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; counter = HALMC_DDMA_POLLING_COUNT; while (HALMAC_REG_READ_32(pHalmac_adapter, REG_DDMA_CH0CTRL) & BIT_DDMACH0_OWN) { counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "halmac_iddma_dlfw_88xx error-1!!\n"); return HALMAC_RET_DDMA_FAIL; } } ch0_control |= (length & BIT_MASK_DDMACH0_DLEN); if (0 == first) ch0_control |= BIT_DDMACH0_CHKSUM_CONT; HALMAC_REG_WRITE_32(pHalmac_adapter, REG_DDMA_CH0SA, source); HALMAC_REG_WRITE_32(pHalmac_adapter, REG_DDMA_CH0DA, dest); HALMAC_REG_WRITE_32(pHalmac_adapter, REG_DDMA_CH0CTRL, ch0_control); counter = HALMC_DDMA_POLLING_COUNT; while (HALMAC_REG_READ_32(pHalmac_adapter, REG_DDMA_CH0CTRL) & BIT_DDMACH0_OWN) { counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "halmac_iddma_dlfw_88xx error-2!!\n"); return HALMAC_RET_DDMA_FAIL; } } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_check_fw_chksum_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 memory_address ) { u8 mcu_fw_ctrl; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; mcu_fw_ctrl = HALMAC_REG_READ_8(pHalmac_adapter, REG_MCUFW_CTRL); if (HALMAC_REG_READ_32(pHalmac_adapter, REG_DDMA_CH0CTRL) & BIT_DDMACH0_CHKSUM_STS) { if (memory_address < HALMAC_OCPBASE_DMEM_88XX) { mcu_fw_ctrl |= BIT_IMEM_DW_OK; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(mcu_fw_ctrl & ~(BIT_IMEM_CHKSUM_OK))); } else { mcu_fw_ctrl |= BIT_DMEM_DW_OK; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(mcu_fw_ctrl & ~(BIT_DMEM_CHKSUM_OK))); } PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "halmac_check_fw_chksum_88xx error!!\n"); return HALMAC_RET_FW_CHECKSUM_FAIL; } else { if (memory_address < HALMAC_OCPBASE_DMEM_88XX) { mcu_fw_ctrl |= BIT_IMEM_DW_OK; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(mcu_fw_ctrl | BIT_IMEM_CHKSUM_OK)); } else { mcu_fw_ctrl |= BIT_DMEM_DW_OK; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(mcu_fw_ctrl | BIT_DMEM_CHKSUM_OK)); } return HALMAC_RET_SUCCESS; } } HALMAC_RET_STATUS halmac_dlfw_end_flow_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 value8; u32 counter; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; PHALMAC_API pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; HALMAC_REG_WRITE_32(pHalmac_adapter, REG_TXDMA_STATUS, BIT(2)); /* Check IMEM & DMEM checksum is OK or not */ if (0x50 == (HALMAC_REG_READ_8(pHalmac_adapter, REG_MCUFW_CTRL) & 0x50)) HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MCUFW_CTRL, (u16)(HALMAC_REG_READ_16(pHalmac_adapter, REG_MCUFW_CTRL) | BIT_FW_DW_RDY)); else return HALMAC_RET_DLFW_FAIL; HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_MCUFW_CTRL) & ~(BIT(0)))); value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_SYS_FUNC_EN + 1); value8 = (u8)(value8 | BIT(2)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SYS_FUNC_EN + 1, value8); /* Release MCU reset */ PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Download Finish, Reset CPU\n"); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_AUTO_LLT_V1, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_AUTO_LLT_V1) | BIT_AUTO_INIT_LLT_V1)); counter = 1000; while (HALMAC_REG_READ_8(pHalmac_adapter, REG_AUTO_LLT_V1) & BIT_AUTO_INIT_LLT_V1) { counter--; if (counter == 0) return HALMAC_RET_INIT_LLT_FAIL; } PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Reset LLT\n"); HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WL2LTECOEX_INDIRECT_ACCESS_CTRL_V1, 0xC00F0038); counter = 10000; while (0xC078 != HALMAC_REG_READ_16(pHalmac_adapter, REG_MCUFW_CTRL)) { if (counter == 0) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Check 0x80 = 0xC078 fail\n"); return HALMAC_RET_DLFW_FAIL; } counter--; PLATFORM_RTL_DELAY_US(pDriver_adapter, 50); } PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Check 0x80 = 0xC078 counter = %d\n", counter); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_pwr_seq_parser_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 CUT, IN u8 FAB, IN u8 INTF, IN PHALMAC_WLAN_PWR_CFG PWR_SEQ_CFG ) { u8 value; u8 PollingBit = _FALSE; u32 AryIdx = 0; u32 PollingCount; u32 offset; VOID *pDriver_adapter = NULL; HALMAC_WLAN_PWR_CFG PWR_SEQ_CMD; PHALMAC_API pHalmac_api; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; do { PWR_SEQ_CMD = PWR_SEQ_CFG[AryIdx]; if ((PWR_SEQ_CMD.interface_msk & INTF) && (PWR_SEQ_CMD.fab_msk & FAB) && (PWR_SEQ_CMD.cut_msk & CUT)) { switch (PWR_SEQ_CMD.cmd) { case HALMAC_PWR_CMD_WRITE: if (PWR_SEQ_CMD.base == HALMAC_PWR_BASEADDR_SDIO) offset = PWR_SEQ_CMD.offset | SDIO_LOCAL_OFFSET; else offset = PWR_SEQ_CMD.offset; value = HALMAC_REG_READ_8(pHalmac_adapter, offset); value = (u8)(value & (u8)(~(PWR_SEQ_CMD.msk))); value = (u8)(value | (u8)(PWR_SEQ_CMD.value & PWR_SEQ_CMD.msk)); HALMAC_REG_WRITE_8(pHalmac_adapter, offset, value); break; case HALMAC_PWR_CMD_POLLING: PollingBit = 0; PollingCount = HALMAC_POLLING_READY_TIMEOUT_COUNT; if (PWR_SEQ_CMD.base == HALMAC_PWR_BASEADDR_SDIO) offset = PWR_SEQ_CMD.offset | SDIO_LOCAL_OFFSET; else offset = PWR_SEQ_CMD.offset; do { PollingCount--; value = HALMAC_REG_READ_8(pHalmac_adapter, offset); value = (u8)(value & PWR_SEQ_CMD.msk); if (value == (PWR_SEQ_CMD.value & PWR_SEQ_CMD.msk)) { PollingBit = 1; } else { if (0 == PollingCount) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_pwr_seq_parser_88xx HALMAC_RET_PWRSEQ_POLLING_FAIL\n"); return HALMAC_RET_PWRSEQ_POLLING_FAIL; } else { PLATFORM_RTL_DELAY_US(pDriver_adapter, 50); } } } while (!PollingBit); break; case HALMAC_PWR_CMD_DELAY: if (PWR_SEQ_CMD.value == HALMAC_PWRSEQ_DELAY_US) PLATFORM_RTL_DELAY_US(pDriver_adapter, PWR_SEQ_CMD.offset); else PLATFORM_RTL_DELAY_US(pDriver_adapter, 1000 * PWR_SEQ_CMD.offset); break; case HALMAC_PWR_CMD_READ: break; case HALMAC_PWR_CMD_END: return HALMAC_RET_SUCCESS; default: PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_pwr_seq_parser_88xx HALMAC_RET_PWRSEQ_CMD_INCORRECT\n"); return HALMAC_RET_PWRSEQ_CMD_INCORRECT; } } AryIdx++; } while (1); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_get_h2c_buff_free_space_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u32 hw_wptr, fw_rptr; PHALMAC_API pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; hw_wptr = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_PKT_WRITEADDR) & BIT_MASK_H2C_WR_ADDR; fw_rptr = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_PKT_READADDR) & BIT_MASK_H2C_READ_ADDR; if (hw_wptr >= fw_rptr) pHalmac_adapter->h2c_buf_free_space = pHalmac_adapter->h2c_buff_size - (hw_wptr - fw_rptr); else pHalmac_adapter->h2c_buf_free_space = fw_rptr - hw_wptr; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_send_h2c_pkt_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pHal_h2c_cmd, IN u32 size, IN u8 ack ) { u32 counter = 100; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; while (pHalmac_adapter->h2c_buf_free_space <= HALMAC_H2C_CMD_SIZE_UNIT_88XX) { halmac_get_h2c_buff_free_space_88xx(pHalmac_adapter); counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "h2c free space is not enough!!\n"); return HALMAC_RET_H2C_SPACE_FULL; } } /* Send TxDesc + H2C_CMD */ if (_FALSE == PLATFORM_SEND_H2C_PKT(pDriver_adapter, pHal_h2c_cmd, size)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Send H2C_CMD pkt error!!\n"); return HALMAC_RET_SEND_H2C_FAIL; } pHalmac_adapter->h2c_buf_free_space -= HALMAC_H2C_CMD_SIZE_UNIT_88XX; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "H2C free space : %d\n", pHalmac_adapter->h2c_buf_free_space); return status; } HALMAC_RET_STATUS halmac_download_rsvd_page_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pHal_buf, IN u32 size ) { u8 restore[3]; u8 value8; u32 counter; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (0 == size) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Rsvd page packet size is zero!!\n"); return HALMAC_RET_ZERO_LEN_RSVD_PACKET; } value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 1); value8 = (u8)(value8 | BIT(7)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 1, value8); value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_CR + 1); restore[0] = value8; value8 = (u8)(value8 | BIT(0)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR + 1, value8); value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_BCN_CTRL); restore[1] = value8; value8 = (u8)((value8 & ~(BIT(3))) | BIT(4)); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BCN_CTRL, value8); value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_FWHW_TXQ_CTRL + 2); restore[2] = value8; value8 = (u8)(value8 & ~(BIT(6))); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FWHW_TXQ_CTRL + 2, value8); if (_FALSE == PLATFORM_SEND_RSVD_PAGE(pDriver_adapter, pHal_buf, size)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "PLATFORM_SEND_RSVD_PAGE 1 error!!\n"); status = HALMAC_RET_DL_RSVD_PAGE_FAIL; } /* Check Bcn_Valid_Bit */ counter = 100; while (!(HALMAC_REG_READ_8(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 1) & BIT(7))) { PLATFORM_RTL_DELAY_US(pDriver_adapter, 10); counter--; if (0 == counter) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Polling Bcn_Valid_Fail error!!\n"); status = HALMAC_RET_POLLING_BCN_VALID_FAIL; break; } } value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 1); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 1, (value8 | BIT(7))); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FWHW_TXQ_CTRL + 2, restore[2]); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BCN_CTRL, restore[1]); HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR + 1, restore[0]); return status; } HALMAC_RET_STATUS halmac_set_h2c_header_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT u8 *pHal_h2c_hdr, IN u16 *seq, IN u8 ack ) { VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_set_h2c_header_88xx!!\n"); H2C_CMD_HEADER_SET_CATEGORY(pHal_h2c_hdr, 0x00); H2C_CMD_HEADER_SET_TOTAL_LEN(pHal_h2c_hdr, 16); PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex)); H2C_CMD_HEADER_SET_SEQ_NUM(pHal_h2c_hdr, pHalmac_adapter->h2c_packet_seq); *seq = pHalmac_adapter->h2c_packet_seq; pHalmac_adapter->h2c_packet_seq++; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex)); if (_TRUE == ack) H2C_CMD_HEADER_SET_ACK(pHal_h2c_hdr, _TRUE); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_set_fw_offload_h2c_header_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT u8 *pHal_h2c_hdr, IN PHALMAC_H2C_HEADER_INFO pH2c_header_info, OUT u16 *pSeq_num ) { VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_set_fw_offload_h2c_header_88xx!!\n"); FW_OFFLOAD_H2C_SET_TOTAL_LEN(pHal_h2c_hdr, 8 + pH2c_header_info->content_size); FW_OFFLOAD_H2C_SET_SUB_CMD_ID(pHal_h2c_hdr, pH2c_header_info->sub_cmd_id); FW_OFFLOAD_H2C_SET_CATEGORY(pHal_h2c_hdr, 0x01); FW_OFFLOAD_H2C_SET_CMD_ID(pHal_h2c_hdr, 0xFF); PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex)); FW_OFFLOAD_H2C_SET_SEQ_NUM(pHal_h2c_hdr, pHalmac_adapter->h2c_packet_seq); *pSeq_num = pHalmac_adapter->h2c_packet_seq; pHalmac_adapter->h2c_packet_seq++; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex)); if (_TRUE == pH2c_header_info->ack) FW_OFFLOAD_H2C_SET_ACK(pHal_h2c_hdr, _TRUE); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_send_h2c_set_pwr_mode_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_FWLPS_OPTION pHal_FwLps_Opt ) { u8 h2c_buff[HALMAC_H2C_CMD_SIZE_88XX]; u8 *pH2c_header, *pH2c_cmd; u16 seq = 0; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_set_pwr_mode_88xx!!\n"); pDriver_adapter = pHalmac_adapter->pDriver_adapter; pH2c_header = h2c_buff; pH2c_cmd = pH2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX; PLATFORM_RTL_MEMSET(pDriver_adapter, h2c_buff, 0x00, HALMAC_H2C_CMD_SIZE_88XX); SET_PWR_MODE_SET_CMD_ID(pH2c_cmd, CMD_ID_SET_PWR_MODE); SET_PWR_MODE_SET_CLASS(pH2c_cmd, CLASS_SET_PWR_MODE); SET_PWR_MODE_SET_MODE(pH2c_cmd, pHal_FwLps_Opt->mode); SET_PWR_MODE_SET_CLK_REQUEST(pH2c_cmd, pHal_FwLps_Opt->clk_request); SET_PWR_MODE_SET_RLBM(pH2c_cmd, pHal_FwLps_Opt->rlbm); SET_PWR_MODE_SET_SMART_PS(pH2c_cmd, pHal_FwLps_Opt->smart_ps); SET_PWR_MODE_SET_AWAKE_INTERVAL(pH2c_cmd, pHal_FwLps_Opt->awake_interval); SET_PWR_MODE_SET_B_ALL_QUEUE_UAPSD(pH2c_cmd, pHal_FwLps_Opt->all_queue_uapsd); SET_PWR_MODE_SET_PWR_STATE(pH2c_cmd, pHal_FwLps_Opt->pwr_state); SET_PWR_MODE_SET_ANT_AUTO_SWITCH(pH2c_cmd, pHal_FwLps_Opt->ant_auto_switch); SET_PWR_MODE_SET_PS_ALLOW_BT_HIGH_PRIORITY(pH2c_cmd, pHal_FwLps_Opt->ps_allow_bt_high_Priority); SET_PWR_MODE_SET_PROTECT_BCN(pH2c_cmd, pHal_FwLps_Opt->protect_bcn); SET_PWR_MODE_SET_SILENCE_PERIOD(pH2c_cmd, pHal_FwLps_Opt->silence_period); SET_PWR_MODE_SET_FAST_BT_CONNECT(pH2c_cmd, pHal_FwLps_Opt->fast_bt_connect); SET_PWR_MODE_SET_TWO_ANTENNA_EN(pH2c_cmd, pHal_FwLps_Opt->two_antenna_en); SET_PWR_MODE_SET_ADOPT_USER_SETTING(pH2c_cmd, pHal_FwLps_Opt->adopt_user_Setting); SET_PWR_MODE_SET_DRV_BCN_EARLY_SHIFT(pH2c_cmd, pHal_FwLps_Opt->drv_bcn_early_shift); halmac_set_h2c_header_88xx(pHalmac_adapter, pH2c_header, &seq, _TRUE); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, h2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_set_pwr_mode_88xx Fail = %x!!\n", status); return status; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_func_send_original_h2c_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *original_h2c, IN u16 *seq, IN u8 ack ) { u8 H2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u8 *pH2c_header, *pH2c_cmd; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_original_h2c ==========>\n"); pH2c_header = H2c_buff; pH2c_cmd = pH2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX; PLATFORM_RTL_MEMCPY(pDriver_adapter, pH2c_cmd, original_h2c, 8); /* Original H2C 8 byte */ halmac_set_h2c_header_88xx(pHalmac_adapter, pH2c_header, seq, ack); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, H2c_buff, HALMAC_H2C_CMD_SIZE_88XX, ack); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_original_h2c Fail = %x!!\n", status); return status; } PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_original_h2c <==========\n"); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_media_status_rpt_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 op_mode, IN u8 mac_id_ind, IN u8 mac_id, IN u8 mac_id_end ) { u8 H2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u8 *pH2c_header, *pH2c_cmd; u16 seq = 0; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_set_pwr_mode_88xx!!\n"); pDriver_adapter = pHalmac_adapter->pDriver_adapter; pH2c_header = H2c_buff; pH2c_cmd = pH2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX; PLATFORM_RTL_MEMSET(pDriver_adapter, H2c_buff, 0x00, HALMAC_H2C_CMD_SIZE_88XX); MEDIA_STATUS_RPT_SET_CMD_ID(pH2c_cmd, CMD_ID_MEDIA_STATUS_RPT); MEDIA_STATUS_RPT_SET_CLASS(pH2c_cmd, CLASS_MEDIA_STATUS_RPT); MEDIA_STATUS_RPT_SET_OP_MODE(pH2c_cmd, op_mode); MEDIA_STATUS_RPT_SET_MACID_IN(pH2c_cmd, mac_id_ind); MEDIA_STATUS_RPT_SET_MACID(pH2c_cmd, mac_id); MEDIA_STATUS_RPT_SET_MACID_END(pH2c_cmd, mac_id_end); halmac_set_h2c_header_88xx(pHalmac_adapter, pH2c_header, &seq, _TRUE); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, H2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_media_status_rpt_88xx Fail = %x!!\n", status); return status; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_send_h2c_update_packet_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_PACKET_ID pkt_id, IN u8 *pkt, IN u32 pkt_size ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); ret_status = halmac_download_rsvd_page_88xx(pHalmac_adapter, pkt, pkt_size); if (HALMAC_RET_SUCCESS != ret_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_download_rsvd_page_88xx Fail = %x!!\n", ret_status); HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); return ret_status; } HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); UPDATE_PACKET_SET_SIZE(pH2c_buff, pkt_size + pHalmac_adapter->hw_config_info.txdesc_size); UPDATE_PACKET_SET_PACKET_ID(pH2c_buff, pkt_id); UPDATE_PACKET_SET_PACKET_LOC(pH2c_buff, pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy - pHalmac_adapter->txff_allocation.rsvd_pg_bndy); h2c_header_info.sub_cmd_id = SUB_CMD_ID_UPDATE_PACKET; h2c_header_info.content_size = 8; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); pHalmac_adapter->halmac_state.update_packet_set.seq_num = h2c_seq_mum; ret_status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != ret_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_update_packet_88xx Fail = %x!!\n", ret_status); return ret_status; } return ret_status; } HALMAC_RET_STATUS halmac_send_h2c_phy_parameter_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PHY_PARAMETER_INFO para_info, IN u8 full_fifo ) { u8 drv_trigger_send = _FALSE; u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; u32 info_size = 0; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; PHALMAC_CONFIG_PARA_INFO pConfig_para_info; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; pConfig_para_info = &(pHalmac_adapter->config_para_info); /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_phy_parameter_88xx!!\n"); */ if (NULL == pConfig_para_info->pCfg_para_buf) { if (_TRUE == full_fifo) pConfig_para_info->para_buf_size = HALMAC_EXTRA_INFO_BUFF_SIZE_FULL_FIFO_88XX; else pConfig_para_info->para_buf_size = HALMAC_EXTRA_INFO_BUFF_SIZE_88XX; pConfig_para_info->pCfg_para_buf = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, pConfig_para_info->para_buf_size); if (NULL != pConfig_para_info->pCfg_para_buf) { PLATFORM_RTL_MEMSET(pDriver_adapter, pConfig_para_info->pCfg_para_buf, 0x00, pConfig_para_info->para_buf_size); pConfig_para_info->full_fifo_mode = full_fifo; pConfig_para_info->pPara_buf_w = pConfig_para_info->pCfg_para_buf; pConfig_para_info->para_num = 0; pConfig_para_info->avai_para_buf_size = pConfig_para_info->para_buf_size; pConfig_para_info->value_accumulation = 0; pConfig_para_info->offset_accumulation = 0; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Allocate pCfg_para_buf fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } } if (HALMAC_RET_SUCCESS != halmac_transition_cfg_para_state_88xx(pHalmac_adapter, HALMAC_CFG_PARA_CMD_CONSTRUCT_CONSTRUCTING)) return HALMAC_RET_ERROR_STATE; halmac_enqueue_para_buff_88xx(pHalmac_adapter, para_info, pConfig_para_info->pPara_buf_w, &drv_trigger_send); if (HALMAC_PARAMETER_CMD_END != para_info->cmd_id) { pConfig_para_info->para_num++; pConfig_para_info->pPara_buf_w += HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; pConfig_para_info->avai_para_buf_size = pConfig_para_info->avai_para_buf_size - HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; } if (((pConfig_para_info->avai_para_buf_size - pHalmac_adapter->hw_config_info.txdesc_size) > HALMAC_FW_OFFLOAD_CMD_SIZE_88XX) && (_FALSE == drv_trigger_send)) { return HALMAC_RET_SUCCESS; } else { if (0 == pConfig_para_info->para_num) { PLATFORM_RTL_FREE(pDriver_adapter, pConfig_para_info->pCfg_para_buf, pConfig_para_info->para_buf_size); pConfig_para_info->pCfg_para_buf = NULL; pConfig_para_info->pPara_buf_w = NULL; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "no cfg parameter element!!\n"); if (HALMAC_RET_SUCCESS != halmac_transition_cfg_para_state_88xx(pHalmac_adapter, HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE)) return HALMAC_RET_ERROR_STATE; return HALMAC_RET_SUCCESS; } if (HALMAC_RET_SUCCESS != halmac_transition_cfg_para_state_88xx(pHalmac_adapter, HALMAC_CFG_PARA_CMD_CONSTRUCT_H2C_SENT)) return HALMAC_RET_ERROR_STATE; pHalmac_adapter->halmac_state.cfg_para_state_set.process_status = HALMAC_CMD_PROCESS_SENDING; if (_TRUE == pConfig_para_info->full_fifo_mode) HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, 0); else HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); info_size = pConfig_para_info->para_num * HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; status = halmac_download_rsvd_page_88xx(pHalmac_adapter, (u8 *)pConfig_para_info->pCfg_para_buf, info_size); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_download_rsvd_page_88xx Fail!!\n"); } else { halmac_gen_cfg_para_h2c_88xx(pHalmac_adapter, pH2c_buff); h2c_header_info.sub_cmd_id = SUB_CMD_ID_CFG_PARAMETER; h2c_header_info.content_size = 4; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); pHalmac_adapter->halmac_state.cfg_para_state_set.seq_num = h2c_seq_mum; status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail!!\n"); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "config parameter time = %d\n", HALMAC_REG_READ_32(pHalmac_adapter, REG_FW_DBG6)); } PLATFORM_RTL_FREE(pDriver_adapter, pConfig_para_info->pCfg_para_buf, pConfig_para_info->para_buf_size); pConfig_para_info->pCfg_para_buf = NULL; pConfig_para_info->pPara_buf_w = NULL; /* Restore bcn head */ HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); if (HALMAC_RET_SUCCESS != halmac_transition_cfg_para_state_88xx(pHalmac_adapter, HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE)) return HALMAC_RET_ERROR_STATE; } if (_FALSE == drv_trigger_send) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Buffer full trigger sending H2C!!\n"); return HALMAC_RET_PARA_SENDING; } return status; } HALMAC_RET_STATUS halmac_enqueue_para_buff_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_PHY_PARAMETER_INFO para_info, IN u8 *pCurr_buff_wptr, OUT u8 *pEnd_cmd ) { VOID *pDriver_adapter = NULL; PHALMAC_CONFIG_PARA_INFO pConfig_para_info = &(pHalmac_adapter->config_para_info); *pEnd_cmd = _FALSE; PHY_PARAMETER_INFO_SET_LENGTH(pCurr_buff_wptr, HALMAC_FW_OFFLOAD_CMD_SIZE_88XX); PHY_PARAMETER_INFO_SET_IO_CMD(pCurr_buff_wptr, para_info->cmd_id); switch (para_info->cmd_id) { case HALMAC_PARAMETER_CMD_BB_W8: case HALMAC_PARAMETER_CMD_BB_W16: case HALMAC_PARAMETER_CMD_BB_W32: case HALMAC_PARAMETER_CMD_MAC_W8: case HALMAC_PARAMETER_CMD_MAC_W16: case HALMAC_PARAMETER_CMD_MAC_W32: PHY_PARAMETER_INFO_SET_IO_ADDR(pCurr_buff_wptr, para_info->content.MAC_REG_W.offset); PHY_PARAMETER_INFO_SET_DATA(pCurr_buff_wptr, para_info->content.MAC_REG_W.value); PHY_PARAMETER_INFO_SET_MASK(pCurr_buff_wptr, para_info->content.MAC_REG_W.msk); PHY_PARAMETER_INFO_SET_MSK_EN(pCurr_buff_wptr, para_info->content.MAC_REG_W.msk_en); pConfig_para_info->value_accumulation += para_info->content.MAC_REG_W.value; pConfig_para_info->offset_accumulation += para_info->content.MAC_REG_W.offset; break; case HALMAC_PARAMETER_CMD_RF_W: PHY_PARAMETER_INFO_SET_RF_ADDR(pCurr_buff_wptr, para_info->content.RF_REG_W.offset); /*In rf register, the address is only 1 byte*/ PHY_PARAMETER_INFO_SET_RF_PATH(pCurr_buff_wptr, para_info->content.RF_REG_W.rf_path); PHY_PARAMETER_INFO_SET_DATA(pCurr_buff_wptr, para_info->content.RF_REG_W.value); PHY_PARAMETER_INFO_SET_MASK(pCurr_buff_wptr, para_info->content.RF_REG_W.msk); PHY_PARAMETER_INFO_SET_MSK_EN(pCurr_buff_wptr, para_info->content.RF_REG_W.msk_en); pConfig_para_info->value_accumulation += para_info->content.RF_REG_W.value; pConfig_para_info->offset_accumulation += (para_info->content.RF_REG_W.offset + (para_info->content.RF_REG_W.rf_path << 8)); break; case HALMAC_PARAMETER_CMD_DELAY_US: case HALMAC_PARAMETER_CMD_DELAY_MS: PHY_PARAMETER_INFO_SET_DELAY_VALUE(pCurr_buff_wptr, para_info->content.DELAY_TIME.delay_time); break; case HALMAC_PARAMETER_CMD_END: *pEnd_cmd = _TRUE; break; default: PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, " halmac_send_h2c_phy_parameter_88xx illegal cmd_id!!\n"); break; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_gen_cfg_para_h2c_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pH2c_buff ) { VOID *pDriver_adapter = NULL; PHALMAC_CONFIG_PARA_INFO pConfig_para_info = &(pHalmac_adapter->config_para_info); CFG_PARAMETER_SET_NUM(pH2c_buff, pConfig_para_info->para_num); if (_TRUE == pConfig_para_info->full_fifo_mode) { CFG_PARAMETER_SET_INIT_CASE(pH2c_buff, 0x1); CFG_PARAMETER_SET_PHY_PARAMETER_LOC(pH2c_buff, 0); } else { CFG_PARAMETER_SET_INIT_CASE(pH2c_buff, 0x0); CFG_PARAMETER_SET_PHY_PARAMETER_LOC(pH2c_buff, pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy - pHalmac_adapter->txff_allocation.rsvd_pg_bndy); } return HALMAC_RET_SUCCESS; } #if 0 HALMAC_RET_STATUS halmac_send_h2c_update_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_DATA_TYPE halmac_data_type, IN PHALMAC_PHY_PARAMETER_INFO para_info ) { u8 drv_trigger_send = _FALSE; u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u8 *pCurr_buf_w; u16 h2c_seq_mum = 0; u32 info_size = 0; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; PHALMAC_CONFIG_PARA_INFO pConfig_para_info; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; pConfig_para_info = &(pHalmac_adapter->config_para_info); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_phy_parameter_88xx!!\n"); if (NULL == pConfig_para_info->pCfg_para_buf) {/*Buff null, allocate memory according to use mode*/ /*else, only 4k reserved page is used*/ pConfig_para_info->para_buf_size = HALMAC_EXTRA_INFO_BUFF_SIZE_88XX; /* pConfig_para_info->datapack_segment =0; */ pConfig_para_info->pCfg_para_buf = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, pConfig_para_info->para_buf_size); if (NULL != pConfig_para_info->pCfg_para_buf) { /*Reset buffer parameter*/ PLATFORM_RTL_MEMSET(pDriver_adapter, pConfig_para_info->pCfg_para_buf, 0x00, pConfig_para_info->para_buf_size); /* pConfig_para_info->full_fifo_mode = full_fifo; */ pConfig_para_info->data_type = halmac_data_type; pConfig_para_info->pPara_buf_w = pConfig_para_info->pCfg_para_buf; pConfig_para_info->para_num = 0; pConfig_para_info->avai_para_buf_size = pConfig_para_info->para_buf_size; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Allocate pCfg_para_buf fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } } pCurr_buf_w = pConfig_para_info->pPara_buf_w; /*Start fill buffer content*/ PHY_PARAMETER_INFO_SET_LENGTH(pCurr_buf_w, HALMAC_FW_OFFLOAD_CMD_SIZE_88XX);/* Each element is 12 Byte */ PHY_PARAMETER_INFO_SET_IO_CMD(pCurr_buf_w, para_info->cmd_id); switch (para_info->cmd_id) { case HALMAC_PARAMETER_CMD_BB_W8: case HALMAC_PARAMETER_CMD_BB_W16: case HALMAC_PARAMETER_CMD_BB_W32: case HALMAC_PARAMETER_CMD_MAC_W8: case HALMAC_PARAMETER_CMD_MAC_W16: case HALMAC_PARAMETER_CMD_MAC_W32: PHY_PARAMETER_INFO_SET_IO_ADDR(pCurr_buf_w, para_info->content.MAC_REG_W.offset); PHY_PARAMETER_INFO_SET_DATA(pCurr_buf_w, para_info->content.MAC_REG_W.value); PHY_PARAMETER_INFO_SET_MASK(pCurr_buf_w, para_info->content.MAC_REG_W.msk); PHY_PARAMETER_INFO_SET_MSK_EN(pCurr_buf_w, para_info->content.MAC_REG_W.msk_en); break; case HALMAC_PARAMETER_CMD_RF_W: PHY_PARAMETER_INFO_SET_RF_ADDR(pCurr_buf_w, para_info->content.RF_REG_W.offset); /* In rf register, the address is only 1 byte */ PHY_PARAMETER_INFO_SET_RF_PATH(pCurr_buf_w, para_info->content.RF_REG_W.rf_path); PHY_PARAMETER_INFO_SET_DATA(pCurr_buf_w, para_info->content.RF_REG_W.value); PHY_PARAMETER_INFO_SET_MASK(pCurr_buf_w, para_info->content.RF_REG_W.msk); PHY_PARAMETER_INFO_SET_MSK_EN(pCurr_buf_w, para_info->content.MAC_REG_W.msk_en); break; case HALMAC_PARAMETER_CMD_DELAY_US: case HALMAC_PARAMETER_CMD_DELAY_MS: PHY_PARAMETER_INFO_SET_DELAY_VALUE(pCurr_buf_w, para_info->content.DELAY_TIME.delay_time); break; case HALMAC_PARAMETER_CMD_END: /* PHY_PARAMETER_INFO_SET_MSK_EN(pHalmac_adapter->pPara_buf_w, 1); */ drv_trigger_send = _TRUE; break; default: PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "illegal cmd_id!!\n"); /* return _FALSE; */ break; } /*Update parameter buffer variable*/ if (HALMAC_PARAMETER_CMD_END != para_info->cmd_id) { pConfig_para_info->para_num++; pConfig_para_info->pPara_buf_w += HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; pConfig_para_info->avai_para_buf_size = pConfig_para_info->avai_para_buf_size - HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; } if (((pConfig_para_info->avai_para_buf_size - pHalmac_adapter->hw_config_info.txdesc_size) > HALMAC_FW_OFFLOAD_CMD_SIZE_88XX) && (_FALSE == drv_trigger_send)) { /*There are still space for parameter cmd, and driver does not trigger it to send, so keep it in buffer temporarily*/ return HALMAC_RET_SUCCESS_ENQUEUE; } else { /*There is no space or driver trigger it to send*/ /*Update the bcn head(dma)*/ HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->h2c_extra_info_boundary & BIT_MASK_BCN_HEAD_1_V1)); /* Download to reserved page */ info_size = pConfig_para_info->para_num * HALMAC_FW_OFFLOAD_CMD_SIZE_88XX; status = halmac_download_rsvd_page_88xx(pHalmac_adapter, (u8 *)pConfig_para_info->pCfg_para_buf, info_size); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_download_rsvd_page_88xx Fail!!\n"); } else {/*download rsvd page ok, send h2c packet to fw*/ /* Construct H2C Content */ UPDATE_DATAPACK_SET_SIZE(pH2c_buff, pConfig_para_info->para_num * HALMAC_FW_OFFLOAD_CMD_SIZE_88XX); UPDATE_DATAPACK_SET_DATAPACK_ID(pH2c_buff, pConfig_para_info->data_type); UPDATE_DATAPACK_SET_DATAPACK_LOC(pH2c_buff, pHalmac_adapter->h2c_extra_info_boundary - pHalmac_adapter->Tx_boundary); UPDATE_DATAPACK_SET_DATAPACK_SEGMENT(pH2c_buff, pConfig_para_info->datapack_segment); UPDATE_DATAPACK_SET_END_SEGMENT(pH2c_buff, drv_trigger_send); /* Fill in H2C Header */ h2c_header_info.sub_cmd_id = SUB_CMD_ID_UPDATE_DATAPACK; h2c_header_info.content_size = 8; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); /* Send H2C Cmd Packet */ status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail!!\n"); } PLATFORM_RTL_FREE(pDriver_adapter, pConfig_para_info->pCfg_para_buf, pConfig_para_info->para_buf_size); if (_TRUE == drv_trigger_send) pConfig_para_info->datapack_segment = 0; else pConfig_para_info->datapack_segment++; pConfig_para_info->pCfg_para_buf = NULL; pConfig_para_info->pPara_buf_w = NULL; pConfig_para_info->para_num = 0; pConfig_para_info->avai_para_buf_size = 0; /*Restore Register after FW handle the H2C packet*/ /*only set bcn head back*/ HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->Tx_boundary & BIT_MASK_BCN_HEAD_1_V1)); } return status; } #endif HALMAC_RET_STATUS halmac_send_h2c_run_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_DATA_TYPE halmac_data_type ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_run_datapack_88xx!!\n"); RUN_DATAPACK_SET_DATAPACK_ID(pH2c_buff, halmac_data_type); h2c_header_info.sub_cmd_id = SUB_CMD_ID_RUN_DATAPACK; h2c_header_info.content_size = 4; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status); return status; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_send_bt_coex_cmd_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pBt_buf, IN u32 bt_size, IN u8 ack ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_bt_coex_cmd_88xx!!\n"); PLATFORM_RTL_MEMCPY(pDriver_adapter, pH2c_buff + 8, pBt_buf, bt_size); h2c_header_info.sub_cmd_id = SUB_CMD_ID_BT_COEX; h2c_header_info.content_size = (u16)bt_size; h2c_header_info.ack = ack; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, ack); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status); return status; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_func_ctrl_ch_switch_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_CH_SWITCH_OPTION pCs_option ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.scan_state_set.process_status); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_ctrl_ch_switch!!\n"); pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_RET_SUCCESS != halmac_transition_scan_state_88xx(pHalmac_adapter, HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT)) return HALMAC_RET_ERROR_STATE; *pProcess_status = HALMAC_CMD_PROCESS_SENDING; if (0 != pCs_option->switch_en) { HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); status = halmac_download_rsvd_page_88xx(pHalmac_adapter, pHalmac_adapter->ch_sw_info.ch_info_buf, pHalmac_adapter->ch_sw_info.total_size); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_download_rsvd_page_88xx Fail = %x!!\n", status); HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); return status; } HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1)); } CHANNEL_SWITCH_SET_SWITCH_START(pH2c_buff, pCs_option->switch_en); CHANNEL_SWITCH_SET_CHANNEL_NUM(pH2c_buff, pHalmac_adapter->ch_sw_info.ch_num); CHANNEL_SWITCH_SET_CHANNEL_INFO_LOC(pH2c_buff, pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy - pHalmac_adapter->txff_allocation.rsvd_pg_bndy); CHANNEL_SWITCH_SET_DEST_CH_EN(pH2c_buff, pCs_option->dest_ch_en); CHANNEL_SWITCH_SET_DEST_CH(pH2c_buff, pCs_option->dest_ch); CHANNEL_SWITCH_SET_PRI_CH_IDX(pH2c_buff, pCs_option->dest_pri_ch_idx); CHANNEL_SWITCH_SET_ABSOLUTE_TIME(pH2c_buff, pCs_option->absolute_time_en); CHANNEL_SWITCH_SET_TSF_LOW(pH2c_buff, pCs_option->tsf_low); CHANNEL_SWITCH_SET_PERIODIC_OPTION(pH2c_buff, pCs_option->periodic_option); CHANNEL_SWITCH_SET_NORMAL_CYCLE(pH2c_buff, pCs_option->normal_cycle); CHANNEL_SWITCH_SET_NORMAL_PERIOD(pH2c_buff, pCs_option->normal_period); CHANNEL_SWITCH_SET_SLOW_PERIOD(pH2c_buff, pCs_option->phase_2_period); CHANNEL_SWITCH_SET_CHANNEL_INFO_SIZE(pH2c_buff, pHalmac_adapter->ch_sw_info.total_size); h2c_header_info.sub_cmd_id = SUB_CMD_ID_CHANNEL_SWITCH; h2c_header_info.content_size = 20; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); pHalmac_adapter->halmac_state.scan_state_set.seq_num = h2c_seq_mum; status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status); PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->ch_sw_info.ch_info_buf, pHalmac_adapter->ch_sw_info.buf_size); pHalmac_adapter->ch_sw_info.ch_info_buf = NULL; pHalmac_adapter->ch_sw_info.ch_info_buf_w = NULL; pHalmac_adapter->ch_sw_info.extra_info_en = 0; pHalmac_adapter->ch_sw_info.buf_size = 0; pHalmac_adapter->ch_sw_info.avai_buf_size = 0; pHalmac_adapter->ch_sw_info.total_size = 0; pHalmac_adapter->ch_sw_info.ch_num = 0; if (HALMAC_RET_SUCCESS != halmac_transition_scan_state_88xx(pHalmac_adapter, HALMAC_SCAN_CMD_CONSTRUCT_IDLE)) return HALMAC_RET_ERROR_STATE; return status; } HALMAC_RET_STATUS halmac_func_send_general_info_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_GENERAL_INFO pGeneral_info ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_general_info!!\n"); GENERAL_INFO_SET_REF_TYPE(pH2c_buff, pGeneral_info->rfe_type); GENERAL_INFO_SET_RF_TYPE(pH2c_buff, pGeneral_info->rf_type); GENERAL_INFO_SET_FW_TX_BOUNDARY(pH2c_buff, pHalmac_adapter->txff_allocation.rsvd_fw_txbuff_pg_bndy - pHalmac_adapter->txff_allocation.rsvd_pg_bndy); h2c_header_info.sub_cmd_id = SUB_CMD_ID_GENERAL_INFO; h2c_header_info.content_size = 4; h2c_header_info.ack = _FALSE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status); return status; } HALMAC_RET_STATUS halmac_send_h2c_update_bcn_parse_info_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_BCN_IE_INFO pBcn_ie_info ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u16 h2c_seq_mum = 0; VOID *pDriver_adapter = NULL; HALMAC_H2C_HEADER_INFO h2c_header_info; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_update_bcn_parse_info_88xx!!\n"); pDriver_adapter = pHalmac_adapter->pDriver_adapter; UPDATE_BEACON_PARSING_INFO_SET_FUNC_EN(pH2c_buff, pBcn_ie_info->func_en); UPDATE_BEACON_PARSING_INFO_SET_SIZE_TH(pH2c_buff, pBcn_ie_info->size_th); UPDATE_BEACON_PARSING_INFO_SET_TIMEOUT(pH2c_buff, pBcn_ie_info->timeout); UPDATE_BEACON_PARSING_INFO_SET_IE_ID_BMP_0(pH2c_buff, (u32)(pBcn_ie_info->ie_bmp[0])); UPDATE_BEACON_PARSING_INFO_SET_IE_ID_BMP_1(pH2c_buff, (u32)(pBcn_ie_info->ie_bmp[1])); UPDATE_BEACON_PARSING_INFO_SET_IE_ID_BMP_2(pH2c_buff, (u32)(pBcn_ie_info->ie_bmp[2])); UPDATE_BEACON_PARSING_INFO_SET_IE_ID_BMP_3(pH2c_buff, (u32)(pBcn_ie_info->ie_bmp[3])); UPDATE_BEACON_PARSING_INFO_SET_IE_ID_BMP_4(pH2c_buff, (u32)(pBcn_ie_info->ie_bmp[4])); h2c_header_info.sub_cmd_id = SUB_CMD_ID_UPDATE_BEACON_PARSING_INFO; h2c_header_info.content_size = 24; h2c_header_info.ack = _TRUE; halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail =%x !!\n", status); return status; } return status; } HALMAC_RET_STATUS halmac_send_h2c_ps_tuning_para_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 }; u8 *pH2c_header, *pH2c_cmd; u16 seq = 0; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_h2c_ps_tuning_para_88xx!!\n"); pH2c_header = pH2c_buff; pH2c_cmd = pH2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX; halmac_set_h2c_header_88xx(pHalmac_adapter, pH2c_header, &seq, _FALSE); status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _FALSE); if (HALMAC_RET_SUCCESS != status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status); return status; } return status; } HALMAC_RET_STATUS halmac_parse_c2h_packet_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *halmac_buf, IN u32 halmac_size ) { u8 c2h_cmd, c2h_sub_cmd_id; u8 *pC2h_buf = halmac_buf + pHalmac_adapter->hw_config_info.rxdesc_size; u32 c2h_size = halmac_size - pHalmac_adapter->hw_config_info.rxdesc_size; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_parse_c2h_packet_88xx!!\n"); */ c2h_cmd = (u8)C2H_HDR_GET_CMD_ID(pC2h_buf); /* FW offload C2H cmd is 0xFF */ if (0xFF != c2h_cmd) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "C2H_PKT not for FwOffloadC2HFormat!!\n"); return HALMAC_RET_C2H_NOT_HANDLED; } /* Get C2H sub cmd ID */ c2h_sub_cmd_id = (u8)C2H_HDR_GET_C2H_SUB_CMD_ID(pC2h_buf); switch (c2h_sub_cmd_id) { case C2H_SUB_CMD_ID_C2H_DBG: status = halmac_parse_c2h_debug_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case C2H_SUB_CMD_ID_H2C_ACK_HDR: status = halmac_parse_h2c_ack_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case C2H_SUB_CMD_ID_BT_COEX_INFO: status = HALMAC_RET_C2H_NOT_HANDLED; break; case C2H_SUB_CMD_ID_SCAN_STATUS_RPT: status = halmac_parse_scan_status_rpt_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case C2H_SUB_CMD_ID_PSD_DATA: status = halmac_parse_psd_data_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case C2H_SUB_CMD_ID_EFUSE_DATA: status = halmac_parse_efuse_data_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; default: PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "c2h_sub_cmd_id switch case out of boundary!!\n"); status = HALMAC_RET_C2H_NOT_HANDLED; break; } return status; } HALMAC_RET_STATUS halmac_parse_c2h_debug_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { VOID *pDriver_adapter = NULL; u8 *pC2h_buf_local = (u8 *)NULL; u32 c2h_size_local = 0; u8 dbg_content_length = 0; u8 dbg_seq_num = 0; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pC2h_buf_local = pC2h_buf; c2h_size_local = c2h_size; dbg_content_length = (u8)C2H_HDR_GET_LEN((u8 *)pC2h_buf_local); if (dbg_content_length > C2H_DBG_CONTENT_MAX_LENGTH) { return HALMAC_RET_SUCCESS; } else { *(pC2h_buf_local + C2H_DBG_HEADER_LENGTH + dbg_content_length - 2) = '\n'; dbg_seq_num = (u8)(*(pC2h_buf_local + C2H_DBG_HEADER_LENGTH)); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[RTKFW, SEQ=%d]: %s", dbg_seq_num, (char *)(pC2h_buf_local + C2H_DBG_HEADER_LENGTH + 1)); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_scan_status_rpt_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_return_code = (u8)SCAN_STATUS_RPT_GET_H2C_RETURN_CODE(pC2h_buf); process_status = (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) ? HALMAC_CMD_PROCESS_DONE : HALMAC_CMD_PROCESS_ERROR; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_CHANNEL_SWITCH, process_status, NULL, 0); pHalmac_adapter->halmac_state.scan_state_set.process_status = process_status; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "scan status : %X\n", process_status); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_psd_data_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 segment_id = 0, segment_size = 0, h2c_seq = 0; u16 total_size; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; PHALMAC_PSD_STATE_SET pPsd_set = &(pHalmac_adapter->halmac_state.psd_set); h2c_seq = (u8)PSD_DATA_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pPsd_set->seq_num, h2c_seq); if (h2c_seq != pPsd_set->seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pPsd_set->seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pPsd_set->process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } total_size = (u16)PSD_DATA_GET_TOTAL_SIZE(pC2h_buf); segment_id = (u8)PSD_DATA_GET_SEGMENT_ID(pC2h_buf); segment_size = (u8)PSD_DATA_GET_SEGMENT_SIZE(pC2h_buf); pPsd_set->data_size = total_size; if (NULL == pPsd_set->pData) pPsd_set->pData = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, pPsd_set->data_size); if (0 == segment_id) pPsd_set->segment_size = segment_size; PLATFORM_RTL_MEMCPY(pDriver_adapter, pPsd_set->pData + segment_id * pPsd_set->segment_size, pC2h_buf + HALMAC_C2H_DATA_OFFSET_88XX, segment_size); if (_FALSE == PSD_DATA_GET_END_SEGMENT(pC2h_buf)) return HALMAC_RET_SUCCESS; process_status = HALMAC_CMD_PROCESS_DONE; pPsd_set->process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_PSD, process_status, pPsd_set->pData, pPsd_set->data_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_efuse_data_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 segment_id = 0, segment_size = 0, h2c_seq = 0; u8 *pEeprom_map = NULL; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; u8 h2c_return_code = 0; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size); if (NULL == pEeprom_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size); h2c_seq = (u8)EFUSE_DATA_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.efuse_state_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.efuse_state_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.efuse_state_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.efuse_state_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } pHalmac_adapter->halmac_state.efuse_state_set.fw_return_code = h2c_return_code; segment_id = (u8)EFUSE_DATA_GET_SEGMENT_ID(pC2h_buf); segment_size = (u8)EFUSE_DATA_GET_SEGMENT_SIZE(pC2h_buf); if (0 == segment_id) pHalmac_adapter->efuse_segment_size = segment_size; PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); PLATFORM_RTL_MEMCPY(pDriver_adapter, pHalmac_adapter->pHalEfuse_map + segment_id * pHalmac_adapter->efuse_segment_size, \ pC2h_buf + HALMAC_C2H_DATA_OFFSET_88XX, segment_size); PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); if (_FALSE == EFUSE_DATA_GET_END_SEGMENT(pC2h_buf)) return HALMAC_RET_SUCCESS; if (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) { process_status = HALMAC_CMD_PROCESS_DONE; pHalmac_adapter->halmac_state.efuse_state_set.process_status = process_status; PLATFORM_MUTEX_LOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); pHalmac_adapter->hal_efuse_map_valid = _TRUE; PLATFORM_MUTEX_UNLOCK(pDriver_adapter, &(pHalmac_adapter->EfuseMutex)); if (1 == pHalmac_adapter->event_trigger.physical_efuse_map) { PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_PHYSICAL_EFUSE, process_status, pHalmac_adapter->pHalEfuse_map, pHalmac_adapter->hw_config_info.efuse_size); pHalmac_adapter->event_trigger.physical_efuse_map = 0; } if (1 == pHalmac_adapter->event_trigger.logical_efuse_map) { if (HALMAC_RET_SUCCESS != halmac_eeprom_parser_88xx(pHalmac_adapter, pHalmac_adapter->pHalEfuse_map, pEeprom_map)) return HALMAC_RET_EEPROM_PARSING_FAIL; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_LOGICAL_EFUSE, process_status, pEeprom_map, eeprom_size); pHalmac_adapter->event_trigger.logical_efuse_map = 0; } } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.efuse_state_set.process_status = process_status; if (1 == pHalmac_adapter->event_trigger.physical_efuse_map) { PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_PHYSICAL_EFUSE, process_status, &(pHalmac_adapter->halmac_state.efuse_state_set.fw_return_code), 1); pHalmac_adapter->event_trigger.physical_efuse_map = 0; } if (1 == pHalmac_adapter->event_trigger.logical_efuse_map) { if (HALMAC_RET_SUCCESS != halmac_eeprom_parser_88xx(pHalmac_adapter, pHalmac_adapter->pHalEfuse_map, pEeprom_map)) return HALMAC_RET_EEPROM_PARSING_FAIL; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_LOGICAL_EFUSE, process_status, &(pHalmac_adapter->halmac_state.efuse_state_set.fw_return_code), 1); pHalmac_adapter->event_trigger.logical_efuse_map = 0; } } PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_cmd_id, h2c_sub_cmd_id; u8 h2c_seq = 0, offset = 0, shift = 0; u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Ack for C2H!!\n"); h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); if (HALMAC_H2C_RETURN_SUCCESS != (HALMAC_H2C_RETURN_CODE)h2c_return_code) PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "C2H_PKT Status Error!! Status = %d\n", h2c_return_code); h2c_cmd_id = (u8)H2C_ACK_HDR_GET_H2C_CMD_ID(pC2h_buf); if (0xFF != h2c_cmd_id) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "original h2c ack is not handled!!\n"); status = HALMAC_RET_C2H_NOT_HANDLED; } else { h2c_sub_cmd_id = (u8)H2C_ACK_HDR_GET_H2C_SUB_CMD_ID(pC2h_buf); switch (h2c_sub_cmd_id) { case H2C_SUB_CMD_ID_DUMP_PHYSICAL_EFUSE_ACK: break; case H2C_SUB_CMD_ID_CFG_PARAMETER_ACK: status = halmac_parse_h2c_ack_cfg_para_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_UPDATE_PACKET_ACK: status = halmac_parse_h2c_ack_update_packet_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_UPDATE_DATAPACK_ACK: status = halmac_parse_h2c_ack_update_datapack_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_RUN_DATAPACK_ACK: status = halmac_parse_h2c_ack_run_datapack_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_CHANNEL_SWITCH_ACK: status = halmac_parse_h2c_ack_channel_switch_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_IQK_ACK: status = halmac_parse_h2c_ack_iqk_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_POWER_TRACKING_ACK: status = halmac_parse_h2c_ack_power_tracking_88xx(pHalmac_adapter, pC2h_buf, c2h_size); break; case H2C_SUB_CMD_ID_PSD_ACK: break; default: PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "h2c_sub_cmd_id switch case out of boundary!!\n"); status = HALMAC_RET_C2H_NOT_HANDLED; break; } } return status; } HALMAC_RET_STATUS halmac_parse_h2c_ack_cfg_para_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_seq = 0; u8 h2c_return_code; u32 offset_accu = 0, value_accu = 0; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_seq = (u8)H2C_ACK_HDR_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.cfg_para_state_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.cfg_para_state_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.cfg_para_state_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.cfg_para_state_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); pHalmac_adapter->halmac_state.cfg_para_state_set.fw_return_code = h2c_return_code; offset_accu = CFG_PARAMETER_ACK_GET_OFFSET_ACCUMULATION(pC2h_buf); value_accu = CFG_PARAMETER_ACK_GET_VALUE_ACCUMULATION(pC2h_buf); if ((offset_accu != pHalmac_adapter->config_para_info.offset_accumulation) || (value_accu != pHalmac_adapter->config_para_info.value_accumulation)) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[C2H]offset_accu : %x, value_accu : %x!!\n", offset_accu, value_accu); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[Adapter]offset_accu : %x, value_accu : %x!!\n", pHalmac_adapter->config_para_info.offset_accumulation, pHalmac_adapter->config_para_info.value_accumulation); process_status = HALMAC_CMD_PROCESS_ERROR; } if ((HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) && (HALMAC_CMD_PROCESS_ERROR != process_status)) { process_status = HALMAC_CMD_PROCESS_DONE; pHalmac_adapter->halmac_state.cfg_para_state_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_CFG_PARA, process_status, NULL, 0); } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.cfg_para_state_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_CFG_PARA, process_status, &(pHalmac_adapter->halmac_state.cfg_para_state_set.fw_return_code), 1); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_update_packet_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_seq = 0; u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_seq = (u8)H2C_ACK_HDR_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.update_packet_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.update_packet_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.update_packet_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.update_packet_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); pHalmac_adapter->halmac_state.update_packet_set.fw_return_code = h2c_return_code; if (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) { process_status = HALMAC_CMD_PROCESS_DONE; pHalmac_adapter->halmac_state.update_packet_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_UPDATE_PACKET, process_status, NULL, 0); } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.update_packet_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_UPDATE_PACKET, process_status, &(pHalmac_adapter->halmac_state.update_packet_set.fw_return_code), 1); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_update_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_UPDATE_DATAPACK, process_status, NULL, 0); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_run_datapack_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_RUN_DATAPACK, process_status, NULL, 0); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_channel_switch_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_seq = 0; u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_seq = (u8)H2C_ACK_HDR_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.scan_state_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.scan_state_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.scan_state_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.scan_state_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); pHalmac_adapter->halmac_state.scan_state_set.fw_return_code = h2c_return_code; if (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) { process_status = HALMAC_CMD_PROCESS_RCVD; pHalmac_adapter->halmac_state.scan_state_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_CHANNEL_SWITCH, process_status, NULL, 0); } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.scan_state_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_CHANNEL_SWITCH, process_status, &(pHalmac_adapter->halmac_state.scan_state_set.fw_return_code), 1); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_iqk_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_seq = 0; u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_seq = (u8)H2C_ACK_HDR_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.iqk_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.iqk_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.iqk_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.iqk_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); pHalmac_adapter->halmac_state.iqk_set.fw_return_code = h2c_return_code; if (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) { process_status = HALMAC_CMD_PROCESS_DONE; pHalmac_adapter->halmac_state.iqk_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_IQK, process_status, NULL, 0); } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.iqk_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_IQK, process_status, &(pHalmac_adapter->halmac_state.iqk_set.fw_return_code), 1); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_parse_h2c_ack_power_tracking_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 *pC2h_buf, IN u32 c2h_size ) { u8 h2c_seq = 0; u8 h2c_return_code; VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter; HALMAC_CMD_PROCESS_STATUS process_status = HALMAC_CMD_PROCESS_UNDEFINE; h2c_seq = (u8)H2C_ACK_HDR_GET_H2C_SEQ(pC2h_buf); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "Seq num : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.power_tracking_set.seq_num, h2c_seq); if (h2c_seq != pHalmac_adapter->halmac_state.power_tracking_set.seq_num) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Seq num mismactch : h2c -> %d c2h -> %d\n", pHalmac_adapter->halmac_state.power_tracking_set.seq_num, h2c_seq); return HALMAC_RET_SUCCESS; } if (HALMAC_CMD_PROCESS_SENDING != pHalmac_adapter->halmac_state.power_tracking_set.process_status) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "Not in HALMAC_CMD_PROCESS_SENDING\n"); return HALMAC_RET_SUCCESS; } h2c_return_code = (u8)H2C_ACK_HDR_GET_H2C_RETURN_CODE(pC2h_buf); pHalmac_adapter->halmac_state.power_tracking_set.fw_return_code = h2c_return_code; if (HALMAC_H2C_RETURN_SUCCESS == (HALMAC_H2C_RETURN_CODE)h2c_return_code) { process_status = HALMAC_CMD_PROCESS_DONE; pHalmac_adapter->halmac_state.power_tracking_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_POWER_TRACKING, process_status, NULL, 0); } else { process_status = HALMAC_CMD_PROCESS_ERROR; pHalmac_adapter->halmac_state.power_tracking_set.process_status = process_status; PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_POWER_TRACKING, process_status, &(pHalmac_adapter->halmac_state.power_tracking_set.fw_return_code), 1); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_convert_to_sdio_bus_offset_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, INOUT u32 *halmac_offset ) { VOID *pDriver_adapter = NULL; pDriver_adapter = pHalmac_adapter->pDriver_adapter; switch ((*halmac_offset) & 0xFFFF0000) { case WLAN_IOREG_OFFSET: *halmac_offset = (WLAN_IOREG_DEVICE_ID << 13) | (*halmac_offset & HALMAC_WLAN_IOREG_MSK); break; case SDIO_LOCAL_OFFSET: *halmac_offset = (SDIO_LOCAL_DEVICE_ID << 13) | (*halmac_offset & HALMAC_SDIO_LOCAL_MSK); break; default: *halmac_offset = 0xFFFFFFFF; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Unknown base address!!\n"); return HALMAC_RET_CONVERT_SDIO_OFFSET_FAIL; } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_update_sdio_free_page_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u32 free_page = 0, free_page2 = 0, oqt_free_page = 0; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; PHALMAC_SDIO_FREE_SPACE pSdio_free_space; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_update_sdio_free_page_88xx ==========>\n"); pSdio_free_space = &(pHalmac_adapter->sdio_free_space); free_page = HALMAC_REG_READ_32(pHalmac_adapter, REG_SDIO_FREE_TXPG); free_page2 = HALMAC_REG_READ_32(pHalmac_adapter, REG_SDIO_FREE_TXPG2); pSdio_free_space->high_queue_number = (u16)BIT_GET_HIQ_FREEPG_V1(free_page); pSdio_free_space->normal_queue_number = (u16)BIT_GET_MID_FREEPG_V1(free_page); pSdio_free_space->low_queue_number = (u16)BIT_GET_LOW_FREEPG_V1(free_page2); pSdio_free_space->public_queue_number = (u16)BIT_GET_PUB_FREEPG_V1(free_page2); pSdio_free_space->extra_queue_number = (u16)BIT_GET_EXQ_FREEPG_V1(oqt_free_page); PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_update_sdio_free_page_88xx <==========\n"); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_update_oqt_free_space_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; PHALMAC_SDIO_FREE_SPACE pSdio_free_space; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_update_oqt_free_space_88xx ==========>\n"); pSdio_free_space = &(pHalmac_adapter->sdio_free_space); pSdio_free_space->ac_oqt_number = HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_OQT_FREE_TXPG_V1 + 2); /* pSdio_free_space->non_ac_oqt_number = (u8)BIT_GET_NOAC_OQT_FREEPG_V1(oqt_free_page); */ PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_update_oqt_free_space_88xx <==========\n"); return HALMAC_RET_SUCCESS; } HALMAC_EFUSE_CMD_CONSTRUCT_STATE halmac_query_efuse_curr_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { return pHalmac_adapter->halmac_state.efuse_state_set.efuse_cmd_construct_state; } HALMAC_RET_STATUS halmac_transition_efuse_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_EFUSE_CMD_CONSTRUCT_STATE dest_state ) { PHALMAC_EFUSE_STATE_SET pEfuse_state = &(pHalmac_adapter->halmac_state.efuse_state_set); if ((HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != pEfuse_state->efuse_cmd_construct_state) \ && (HALMAC_EFUSE_CMD_CONSTRUCT_BUSY != pEfuse_state->efuse_cmd_construct_state) \ && (HALMAC_EFUSE_CMD_CONSTRUCT_H2C_SENT != pEfuse_state->efuse_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; if (pEfuse_state->efuse_cmd_construct_state == dest_state) return HALMAC_RET_ERROR_STATE; if (HALMAC_EFUSE_CMD_CONSTRUCT_BUSY == dest_state) { if (HALMAC_EFUSE_CMD_CONSTRUCT_H2C_SENT == pEfuse_state->efuse_cmd_construct_state) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_EFUSE_CMD_CONSTRUCT_H2C_SENT == dest_state) { if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE == pEfuse_state->efuse_cmd_construct_state) return HALMAC_RET_ERROR_STATE; } pEfuse_state->efuse_cmd_construct_state = dest_state; return HALMAC_RET_SUCCESS; } HALMAC_CFG_PARA_CMD_CONSTRUCT_STATE halmac_query_cfg_para_curr_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { return pHalmac_adapter->halmac_state.cfg_para_state_set.cfg_para_cmd_construct_state; } HALMAC_RET_STATUS halmac_transition_cfg_para_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_CFG_PARA_CMD_CONSTRUCT_STATE dest_state ) { PHALMAC_CFG_PARA_STATE_SET pCfg_para = &(pHalmac_adapter->halmac_state.cfg_para_state_set); if ((HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE != pCfg_para->cfg_para_cmd_construct_state) && \ (HALMAC_CFG_PARA_CMD_CONSTRUCT_CONSTRUCTING != pCfg_para->cfg_para_cmd_construct_state) && \ (HALMAC_CFG_PARA_CMD_CONSTRUCT_H2C_SENT != pCfg_para->cfg_para_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; if (HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE == dest_state) { if (HALMAC_CFG_PARA_CMD_CONSTRUCT_CONSTRUCTING == pCfg_para->cfg_para_cmd_construct_state) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_CFG_PARA_CMD_CONSTRUCT_CONSTRUCTING == dest_state) { if (HALMAC_CFG_PARA_CMD_CONSTRUCT_H2C_SENT == pCfg_para->cfg_para_cmd_construct_state) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_CFG_PARA_CMD_CONSTRUCT_H2C_SENT == dest_state) { if ((HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE == pCfg_para->cfg_para_cmd_construct_state) \ || (HALMAC_CFG_PARA_CMD_CONSTRUCT_H2C_SENT == pCfg_para->cfg_para_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; } pCfg_para->cfg_para_cmd_construct_state = dest_state; return HALMAC_RET_SUCCESS; } HALMAC_SCAN_CMD_CONSTRUCT_STATE halmac_query_scan_curr_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { return pHalmac_adapter->halmac_state.scan_state_set.scan_cmd_construct_state; } HALMAC_RET_STATUS halmac_transition_scan_state_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_SCAN_CMD_CONSTRUCT_STATE dest_state ) { PHALMAC_SCAN_STATE_SET pScan = &(pHalmac_adapter->halmac_state.scan_state_set); if ((pScan->scan_cmd_construct_state > HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT) || (pScan->scan_cmd_construct_state < HALMAC_SCAN_CMD_CONSTRUCT_IDLE)) return HALMAC_RET_ERROR_STATE; if (HALMAC_SCAN_CMD_CONSTRUCT_IDLE == dest_state) { if ((HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED == pScan->scan_cmd_construct_state) || (HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING == pScan->scan_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED == dest_state) { if (HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT == pScan->scan_cmd_construct_state) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING == dest_state) { if ((HALMAC_SCAN_CMD_CONSTRUCT_IDLE == pScan->scan_cmd_construct_state) || (HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT == pScan->scan_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; } else if (HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT == dest_state) { if ((HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING != pScan->scan_cmd_construct_state) && (HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED != pScan->scan_cmd_construct_state)) return HALMAC_RET_ERROR_STATE; } pScan->scan_cmd_construct_state = dest_state; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_cfg_para_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { PHALMAC_CFG_PARA_STATE_SET pCfg_para_state_set = &(pHalmac_adapter->halmac_state.cfg_para_state_set); *pProcess_status = pCfg_para_state_set->process_status; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_dump_physical_efuse_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { VOID *pDriver_adapter = NULL; PHALMAC_EFUSE_STATE_SET pEfuse_state_set = &(pHalmac_adapter->halmac_state.efuse_state_set); pDriver_adapter = pHalmac_adapter->pDriver_adapter; *pProcess_status = pEfuse_state_set->process_status; if (NULL == data) return HALMAC_RET_NULL_POINTER; if (NULL == size) return HALMAC_RET_NULL_POINTER; if (HALMAC_CMD_PROCESS_DONE == *pProcess_status) { if (*size < pHalmac_adapter->hw_config_info.efuse_size) { *size = pHalmac_adapter->hw_config_info.efuse_size; return HALMAC_RET_BUFFER_TOO_SMALL; } *size = pHalmac_adapter->hw_config_info.efuse_size; PLATFORM_RTL_MEMCPY(pDriver_adapter, data, pHalmac_adapter->pHalEfuse_map, *size); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_dump_logical_efuse_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { u8 *pEeprom_map = NULL; u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size; VOID *pDriver_adapter = NULL; PHALMAC_EFUSE_STATE_SET pEfuse_state_set = &(pHalmac_adapter->halmac_state.efuse_state_set); pDriver_adapter = pHalmac_adapter->pDriver_adapter; *pProcess_status = pEfuse_state_set->process_status; pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size); if (NULL == pEeprom_map) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size); if (NULL == data) return HALMAC_RET_NULL_POINTER; if (NULL == size) return HALMAC_RET_NULL_POINTER; if (HALMAC_CMD_PROCESS_DONE == *pProcess_status) { if (*size < eeprom_size) { *size = eeprom_size; return HALMAC_RET_BUFFER_TOO_SMALL; } *size = eeprom_size; if (HALMAC_RET_SUCCESS != halmac_eeprom_parser_88xx(pHalmac_adapter, pHalmac_adapter->pHalEfuse_map, pEeprom_map)) return HALMAC_RET_EEPROM_PARSING_FAIL; PLATFORM_RTL_MEMCPY(pDriver_adapter, data, pEeprom_map, *size); } PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size); return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_channel_switch_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { PHALMAC_SCAN_STATE_SET pScan_state_set = &(pHalmac_adapter->halmac_state.scan_state_set); *pProcess_status = pScan_state_set->process_status; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_update_packet_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { PHALMAC_UPDATE_PACKET_STATE_SET pUpdate_packet_set = &(pHalmac_adapter->halmac_state.update_packet_set); *pProcess_status = pUpdate_packet_set->process_status; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_iqk_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { PHALMAC_IQK_STATE_SET pIqk_set = &(pHalmac_adapter->halmac_state.iqk_set); *pProcess_status = pIqk_set->process_status; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_power_tracking_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { PHALMAC_POWER_TRACKING_STATE_SET pPower_tracking_state_set = &(pHalmac_adapter->halmac_state.power_tracking_set);; *pProcess_status = pPower_tracking_state_set->process_status; return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_query_psd_status_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status, INOUT u8 *data, INOUT u32 *size ) { VOID *pDriver_adapter = NULL; PHALMAC_PSD_STATE_SET pPsd_set = &(pHalmac_adapter->halmac_state.psd_set); pDriver_adapter = pHalmac_adapter->pDriver_adapter; *pProcess_status = pPsd_set->process_status; if (NULL == data) return HALMAC_RET_NULL_POINTER; if (NULL == size) return HALMAC_RET_NULL_POINTER; if (HALMAC_CMD_PROCESS_DONE == *pProcess_status) { if (*size < pPsd_set->data_size) { *size = pPsd_set->data_size; return HALMAC_RET_BUFFER_TOO_SMALL; } *size = pPsd_set->data_size; PLATFORM_RTL_MEMCPY(pDriver_adapter, data, pPsd_set->pData, *size); } return HALMAC_RET_SUCCESS; } HALMAC_RET_STATUS halmac_verify_io_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 value8, wvalue8; u32 value32, value32_2, wvalue32; u32 halmac_offset; VOID *pDriver_adapter = NULL; HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) { halmac_offset = REG_PAGE5_DUMMY; if (0 == (halmac_offset & 0xFFFF0000)) halmac_offset |= WLAN_IOREG_OFFSET; halmac_convert_to_sdio_bus_offset_88xx(pHalmac_adapter, &halmac_offset); /* Verify CMD52 R/W */ wvalue8 = 0xab; PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, wvalue8); value8 = PLATFORM_SDIO_CMD52_READ(pDriver_adapter, halmac_offset); if (value8 != wvalue8) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "cmd52 r/w fail write = %X read = %X\n", wvalue8, value8); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "cmd52 r/w ok\n"); } /* Verify CMD53 R/W */ PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset, 0xaa); PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 1, 0xbb); PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 2, 0xcc); PLATFORM_SDIO_CMD52_WRITE(pDriver_adapter, halmac_offset + 3, 0xdd); value32 = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset); if (0xddccbbaa != value32) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "cmd53 r fail : read = %X\n"); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "cmd53 r ok\n"); } wvalue32 = 0x11223344; PLATFORM_SDIO_CMD53_WRITE_32(pDriver_adapter, halmac_offset, wvalue32); value32 = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset); if (value32 != wvalue32) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "cmd53 w fail\n"); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "cmd53 w ok\n"); } value32 = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset + 2); /* value32 should be 0x33441122 */ wvalue32 = 0x11225566; PLATFORM_SDIO_CMD53_WRITE_32(pDriver_adapter, halmac_offset, wvalue32); value32_2 = PLATFORM_SDIO_CMD53_READ_32(pDriver_adapter, halmac_offset + 2); /* value32 should be 0x55661122 */ if (value32_2 == value32) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "cmd52 is used for HAL_SDIO_CMD53_READ_32\n"); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "cmd53 is correctly used\n"); } } else { wvalue32 = 0x77665511; PLATFORM_REG_WRITE_32(pDriver_adapter, REG_PAGE5_DUMMY, wvalue32); value32 = PLATFORM_REG_READ_32(pDriver_adapter, REG_PAGE5_DUMMY); if (value32 != wvalue32) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "reg rw\n"); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } else { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "reg rw ok\n"); } } return ret_status; } HALMAC_RET_STATUS halmac_verify_send_rsvd_page_88xx( IN PHALMAC_ADAPTER pHalmac_adapter ) { u8 *rsvd_buf = NULL; u8 *rsvd_page = NULL; u32 i; u32 h2c_pkt_verify_size = 64, h2c_pkt_verify_payload = 0xab; VOID *pDriver_adapter = NULL; PHALMAC_API pHalmac_api; HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS; pDriver_adapter = pHalmac_adapter->pDriver_adapter; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; rsvd_buf = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, h2c_pkt_verify_size); if (NULL == rsvd_buf) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "rsvd buffer malloc fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } rsvd_page = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, h2c_pkt_verify_size + pHalmac_adapter->hw_config_info.txdesc_size); if (NULL == rsvd_page) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "rsvd page malloc fail!!\n"); return HALMAC_RET_MALLOC_FAIL; } PLATFORM_RTL_MEMSET(pDriver_adapter, rsvd_buf, (u8)h2c_pkt_verify_payload, h2c_pkt_verify_size); ret_status = halmac_download_rsvd_page_88xx(pHalmac_adapter, rsvd_buf, h2c_pkt_verify_size); if (HALMAC_RET_SUCCESS != ret_status) return ret_status; PLATFORM_RTL_MEMSET(pDriver_adapter, rsvd_page, 0x00, h2c_pkt_verify_size + pHalmac_adapter->hw_config_info.txdesc_size); ret_status = halmac_dump_fifo_88xx(pHalmac_adapter, HAL_FIFO_SEL_RSVD_PAGE, rsvd_page, h2c_pkt_verify_size + pHalmac_adapter->hw_config_info.txdesc_size); if (HALMAC_RET_SUCCESS != ret_status) return ret_status; for (i = 0; i < h2c_pkt_verify_size; i++) { if (*(rsvd_buf + i) != *(rsvd_page + (i + pHalmac_adapter->hw_config_info.txdesc_size))) { PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Compare RSVD page Fail\n"); ret_status = HALMAC_RET_PLATFORM_API_INCORRECT; } } PLATFORM_RTL_FREE(pDriver_adapter, rsvd_buf, h2c_pkt_verify_size); PLATFORM_RTL_FREE(pDriver_adapter, rsvd_page, h2c_pkt_verify_size + pHalmac_adapter->hw_config_info.txdesc_size); rsvd_buf = NULL; rsvd_page = NULL; return ret_status; } VOID halmac_power_save_cb_88xx( IN VOID *CbData ) { VOID *pDriver_adapter = NULL; PHALMAC_ADAPTER pHalmac_adapter = (PHALMAC_ADAPTER)NULL; pHalmac_adapter = (PHALMAC_ADAPTER)CbData; pDriver_adapter = pHalmac_adapter->pDriver_adapter; PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_power_save_cb_88xx\n"); } HALMAC_RET_STATUS halmac_buffer_read_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u32 offset, IN u32 size, IN HAL_FIFO_SEL halmac_fifo_sel, OUT u8 *pFifo_map ) { u32 start_page, value_read; u32 i, counter = 0, residue; PHALMAC_API pHalmac_api; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HAL_FIFO_SEL_RSVD_PAGE == halmac_fifo_sel) offset = offset + (pHalmac_adapter->txff_allocation.rsvd_pg_bndy << 7); start_page = offset >> 12; residue = offset & (4096 - 1); if ((HAL_FIFO_SEL_TX == halmac_fifo_sel) || (HAL_FIFO_SEL_RSVD_PAGE == halmac_fifo_sel)) start_page += 0x780; else if (HAL_FIFO_SEL_RX == halmac_fifo_sel) start_page += 0x700; else if (HAL_FIFO_SEL_REPORT == halmac_fifo_sel) start_page += 0x660; else if (HAL_FIFO_SEL_LLT == halmac_fifo_sel) start_page += 0x650; value_read = HALMAC_REG_READ_16(pHalmac_adapter, REG_PKTBUF_DBG_CTRL); while (1) { HALMAC_REG_WRITE_16(pHalmac_adapter, REG_PKTBUF_DBG_CTRL, (u16)(start_page | (value_read & 0xF000))); for (i = 0x8000 + residue; i <= 0x8FFF; i += 4) { *(u32 *)(pFifo_map + counter) = HALMAC_REG_READ_32(pHalmac_adapter, i); *(u32 *)(pFifo_map + counter) = rtk_le32_to_cpu(*(u32 *)(pFifo_map + counter)); counter += 4; if (size == counter) goto HALMAC_BUF_READ_OK; } residue = 0; start_page++; } HALMAC_BUF_READ_OK: HALMAC_REG_WRITE_16(pHalmac_adapter, REG_PKTBUF_DBG_CTRL, (u16)value_read); return HALMAC_RET_SUCCESS; } VOID halmac_restore_mac_register_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN PHALMAC_RESTORE_INFO pRestore_info, IN u32 restore_num ) { u8 value_length; u32 i; u32 mac_register; u32 mac_value; PHALMAC_API pHalmac_api; PHALMAC_RESTORE_INFO pCurr_restore_info = pRestore_info; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; for (i = 0; i < restore_num; i++) { mac_register = pCurr_restore_info->mac_register; mac_value = pCurr_restore_info->value; value_length = pCurr_restore_info->length; if (1 == value_length) HALMAC_REG_WRITE_8(pHalmac_adapter, mac_register, (u8)mac_value); else if (2 == value_length) HALMAC_REG_WRITE_16(pHalmac_adapter, mac_register, (u16)mac_value); else if (4 == value_length) HALMAC_REG_WRITE_32(pHalmac_adapter, mac_register, mac_value); pCurr_restore_info++; } } VOID halmac_api_record_id_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN HALMAC_API_ID api_id ) { u8 array_wptr_last; array_wptr_last = pHalmac_adapter->api_record.array_wptr; if (array_wptr_last == API_ARRAY_SIZE - 1) array_wptr_last = 0; else if (HALMAC_API_STUFF == pHalmac_adapter->api_record.api_array[0]) array_wptr_last = array_wptr_last; else array_wptr_last = array_wptr_last + 1; pHalmac_adapter->api_record.api_array[array_wptr_last] = api_id; pHalmac_adapter->api_record.array_wptr = array_wptr_last; } VOID halmac_get_hcpwm_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT u8 *pHcpwm ) { PHALMAC_API pHalmac_api; u32 hcpwm_offset = 0; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) hcpwm_offset = REG_PCIE_HCPWM1_V1; else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) hcpwm_offset = 0xFE57; else if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) hcpwm_offset = REG_SDIO_HCPWM1_V2; *pHcpwm = HALMAC_REG_READ_8(pHalmac_adapter, hcpwm_offset); } VOID halmac_get_hcpwm2_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, OUT u16 *pHcpwm2 ) { PHALMAC_API pHalmac_api; u32 hcpwm2_offset = 0; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) hcpwm2_offset = REG_PCIE_HCPWM2_V1; else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) hcpwm2_offset = 0xFE34; else if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) hcpwm2_offset = REG_SDIO_HCPWM2_V2; *pHcpwm2 = HALMAC_REG_READ_16(pHalmac_adapter, hcpwm2_offset); } VOID halmac_set_hrpwm_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u8 hrpwm ) { PHALMAC_API pHalmac_api; u32 hrpwm_offset = 0; u8 hrpwm_original = 0; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) hrpwm_offset = REG_PCIE_HRPWM1_V1; else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) hrpwm_offset = 0xFE58; else if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) hrpwm_offset = REG_SDIO_HRPWM1; hrpwm_original = HALMAC_REG_READ_8(pHalmac_adapter, hrpwm_offset); hrpwm = (hrpwm & 0x7F) | ((~hrpwm_original) & 0x80); HALMAC_REG_WRITE_8(pHalmac_adapter, hrpwm_offset, hrpwm); } VOID halmac_set_hrpwm2_88xx( IN PHALMAC_ADAPTER pHalmac_adapter, IN u16 hrpwm2 ) { PHALMAC_API pHalmac_api; u32 hrpwm2_offset = 0; u16 hrpwm2_original = 0; pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api; if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) hrpwm2_offset = REG_PCIE_HRPWM2_V1; else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) hrpwm2_offset = 0xFE36; else if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) hrpwm2_offset = REG_SDIO_HRPWM2; hrpwm2_original = HALMAC_REG_READ_16(pHalmac_adapter, hrpwm2_offset); hrpwm2 = (hrpwm2 & 0x7FFF) | ((~hrpwm2_original) & 0x8000); HALMAC_REG_WRITE_16(pHalmac_adapter, hrpwm2_offset, hrpwm2); }