qcacmn: Support phyid conversion map for wmi_handle

Support phyid conversion map for dynamic mode switch.

Change-Id: I02aa1831bf48ca1365354d0ab9ebc240fa116043
CRs-Fixed: 2601427
This commit is contained in:
Shaakir Mohamed
2020-01-10 12:02:15 -08:00
committed by nshrivas
parent ab425a2edf
commit 68a9a92a15
4 changed files with 125 additions and 10 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -459,8 +459,9 @@ void
wmi_flush_endpoint(wmi_unified_t wmi_handle); wmi_flush_endpoint(wmi_unified_t wmi_handle);
/** /**
* wmi_pdev_id_conversion_enable() - API to enable pdev_id conversion in WMI * wmi_pdev_id_conversion_enable() - API to enable pdev_id and phy_id
* By default pdev_id conversion is not done in WMI. * conversion in WMI. By default pdev_id and
* phyid conversion is not done in WMI.
* This API can be used enable conversion in WMI. * This API can be used enable conversion in WMI.
* @param wmi_handle : handle to WMI * @param wmi_handle : handle to WMI
* @param *pdev_id_map : pdev conversion map * @param *pdev_id_map : pdev conversion map
@@ -468,7 +469,8 @@ wmi_flush_endpoint(wmi_unified_t wmi_handle);
* Return none * Return none
*/ */
void wmi_pdev_id_conversion_enable(wmi_unified_t wmi_handle, void wmi_pdev_id_conversion_enable(wmi_unified_t wmi_handle,
uint32_t *pdev_id_map, uint8_t size); uint32_t *pdev_id_map,
uint8_t size);
/** /**
* API to handle wmi rx event after UMAC has taken care of execution * API to handle wmi rx event after UMAC has taken care of execution

View File

@@ -1848,6 +1848,10 @@ uint32_t (*convert_pdev_id_host_to_target)(wmi_unified_t wmi_handle,
uint32_t pdev_id); uint32_t pdev_id);
uint32_t (*convert_pdev_id_target_to_host)(wmi_unified_t wmi_handle, uint32_t (*convert_pdev_id_target_to_host)(wmi_unified_t wmi_handle,
uint32_t pdev_id); uint32_t pdev_id);
uint32_t (*convert_phy_id_host_to_target)(wmi_unified_t wmi_handle,
uint32_t phy_id);
uint32_t (*convert_phy_id_target_to_host)(wmi_unified_t wmi_handle,
uint32_t phy_id);
/* /*
* For MCL, convert_pdev_id_host_to_target returns legacy pdev id value. * For MCL, convert_pdev_id_host_to_target returns legacy pdev id value.
@@ -1864,6 +1868,11 @@ uint32_t (*convert_host_pdev_id_to_target)(wmi_unified_t wmi_handle,
uint32_t (*convert_target_pdev_id_to_host)(wmi_unified_t wmi_handle, uint32_t (*convert_target_pdev_id_to_host)(wmi_unified_t wmi_handle,
uint32_t pdev_id); uint32_t pdev_id);
uint32_t (*convert_host_phy_id_to_target)(wmi_unified_t wmi_handle,
uint32_t phy_id);
uint32_t (*convert_target_phy_id_to_host)(wmi_unified_t wmi_handle,
uint32_t phy_id);
QDF_STATUS (*send_user_country_code_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_user_country_code_cmd)(wmi_unified_t wmi_handle,
uint8_t pdev_id, struct cc_regdmn_s *rd); uint8_t pdev_id, struct cc_regdmn_s *rd);
@@ -1955,7 +1964,8 @@ QDF_STATUS
uint8_t idx, uint8_t rpt_idx); uint8_t idx, uint8_t rpt_idx);
void (*wmi_pdev_id_conversion_enable)(wmi_unified_t wmi_handle, void (*wmi_pdev_id_conversion_enable)(wmi_unified_t wmi_handle,
uint32_t *pdev_map, uint8_t size); uint32_t *pdev_map,
uint8_t size);
void (*send_time_stamp_sync_cmd)(wmi_unified_t wmi_handle); void (*send_time_stamp_sync_cmd)(wmi_unified_t wmi_handle);
void (*wmi_free_allocated_event)(uint32_t cmd_event_id, void (*wmi_free_allocated_event)(uint32_t cmd_event_id,
void **wmi_cmd_struct_ptr); void **wmi_cmd_struct_ptr);
@@ -2203,6 +2213,8 @@ struct wmi_unified {
#endif /*WMI_EXT_DBG*/ #endif /*WMI_EXT_DBG*/
uint32_t *cmd_pdev_id_map; uint32_t *cmd_pdev_id_map;
uint32_t *evt_pdev_id_map; uint32_t *evt_pdev_id_map;
uint32_t *cmd_phy_id_map;
uint32_t *evt_phy_id_map;
qdf_atomic_t num_stats_over_qmi; qdf_atomic_t num_stats_over_qmi;
}; };
@@ -2233,7 +2245,10 @@ struct wmi_soc {
uint32_t soc_idx; uint32_t soc_idx;
uint32_t cmd_pdev_id_map[WMI_MAX_RADIOS]; uint32_t cmd_pdev_id_map[WMI_MAX_RADIOS];
uint32_t evt_pdev_id_map[WMI_MAX_RADIOS]; uint32_t evt_pdev_id_map[WMI_MAX_RADIOS];
uint32_t cmd_phy_id_map[WMI_MAX_RADIOS];
uint32_t evt_phy_id_map[WMI_MAX_RADIOS];
bool is_pdev_is_map_enable; bool is_pdev_is_map_enable;
bool is_phy_id_map_enable;
#ifdef WMI_INTERFACE_EVENT_LOGGING #ifdef WMI_INTERFACE_EVENT_LOGGING
uint32_t buf_offset_command; uint32_t buf_offset_command;
uint32_t buf_offset_event; uint32_t buf_offset_event;

View File

@@ -2630,6 +2630,8 @@ void *wmi_unified_get_pdev_handle(struct wmi_soc *soc, uint32_t pdev_idx)
wmi_handle->soc = soc; wmi_handle->soc = soc;
wmi_handle->cmd_pdev_id_map = soc->cmd_pdev_id_map; wmi_handle->cmd_pdev_id_map = soc->cmd_pdev_id_map;
wmi_handle->evt_pdev_id_map = soc->evt_pdev_id_map; wmi_handle->evt_pdev_id_map = soc->evt_pdev_id_map;
wmi_handle->cmd_phy_id_map = soc->cmd_phy_id_map;
wmi_handle->evt_phy_id_map = soc->evt_phy_id_map;
wmi_interface_logging_init(wmi_handle, pdev_idx); wmi_interface_logging_init(wmi_handle, pdev_idx);
qdf_atomic_init(&wmi_handle->pending_cmds); qdf_atomic_init(&wmi_handle->pending_cmds);
qdf_atomic_init(&wmi_handle->is_target_suspended); qdf_atomic_init(&wmi_handle->is_target_suspended);
@@ -2740,6 +2742,8 @@ void *wmi_unified_attach(void *scn_handle,
wmi_handle->scn_handle = scn_handle; wmi_handle->scn_handle = scn_handle;
wmi_handle->cmd_pdev_id_map = soc->cmd_pdev_id_map; wmi_handle->cmd_pdev_id_map = soc->cmd_pdev_id_map;
wmi_handle->evt_pdev_id_map = soc->evt_pdev_id_map; wmi_handle->evt_pdev_id_map = soc->evt_pdev_id_map;
wmi_handle->cmd_phy_id_map = soc->cmd_phy_id_map;
wmi_handle->evt_phy_id_map = soc->evt_phy_id_map;
soc->scn_handle = scn_handle; soc->scn_handle = scn_handle;
qdf_atomic_init(&wmi_handle->pending_cmds); qdf_atomic_init(&wmi_handle->pending_cmds);
qdf_atomic_init(&wmi_handle->is_target_suspended); qdf_atomic_init(&wmi_handle->is_target_suspended);
@@ -3161,8 +3165,8 @@ wmi_flush_endpoint(wmi_unified_t wmi_handle)
qdf_export_symbol(wmi_flush_endpoint); qdf_export_symbol(wmi_flush_endpoint);
/** /**
* wmi_pdev_id_conversion_enable() - API to enable pdev_id conversion in WMI * wmi_pdev_id_conversion_enable() - API to enable pdev_id/phy_id conversion
* By default pdev_id conversion is not done in WMI. * in WMI. By default pdev_id conversion is not done in WMI.
* This API can be used enable conversion in WMI. * This API can be used enable conversion in WMI.
* @param wmi_handle : handle to WMI * @param wmi_handle : handle to WMI
* @param pdev_map : pointer to pdev_map * @param pdev_map : pointer to pdev_map
@@ -3170,7 +3174,8 @@ qdf_export_symbol(wmi_flush_endpoint);
* Return none * Return none
*/ */
void wmi_pdev_id_conversion_enable(wmi_unified_t wmi_handle, void wmi_pdev_id_conversion_enable(wmi_unified_t wmi_handle,
uint32_t *pdev_id_map, uint8_t size) uint32_t *pdev_id_map,
uint8_t size)
{ {
if (wmi_handle->target_type == WMI_TLV_TARGET) if (wmi_handle->target_type == WMI_TLV_TARGET)
wmi_handle->ops->wmi_pdev_id_conversion_enable(wmi_handle, wmi_handle->ops->wmi_pdev_id_conversion_enable(wmi_handle,

View File

@@ -554,6 +554,42 @@ static uint32_t convert_target_pdev_id_to_host_pdev_id(wmi_unified_t wmi_handle,
return WMI_HOST_PDEV_ID_INVALID; return WMI_HOST_PDEV_ID_INVALID;
} }
/**
* convert_host_phy_id_to_target_phy_id() - Convert phy_id from
* host to target defines.
* @wmi_handle: pointer to wmi_handle
* @param phy_id: host pdev_id to be converted.
* Return: target phy_id after conversion.
*/
static uint32_t convert_host_phy_id_to_target_phy_id(wmi_unified_t wmi_handle,
uint32_t phy_id)
{
if (!wmi_handle->soc->is_phy_id_map_enable ||
phy_id >= WMI_MAX_RADIOS) {
return phy_id;
}
return wmi_handle->cmd_phy_id_map[phy_id];
}
/**
* convert_target_phy_id_to_host_phy_id() - Convert phy_id from
* target to host defines.
* @wmi_handle: pointer to wmi_handle
* @param phy_id: target phy_id to be converted.
* Return: host phy_id after conversion.
*/
static uint32_t convert_target_phy_id_to_host_phy_id(wmi_unified_t wmi_handle,
uint32_t phy_id)
{
if (!wmi_handle->soc->is_phy_id_map_enable ||
phy_id >= WMI_MAX_RADIOS) {
return phy_id;
}
return wmi_handle->evt_phy_id_map[phy_id];
}
/** /**
* wmi_tlv_pdev_id_conversion_enable() - Enable pdev_id conversion * wmi_tlv_pdev_id_conversion_enable() - Enable pdev_id conversion
* *
@@ -570,24 +606,40 @@ static void wmi_tlv_pdev_id_conversion_enable(wmi_unified_t wmi_handle,
wmi_handle->cmd_pdev_id_map[i] = pdev_id_map[i]; wmi_handle->cmd_pdev_id_map[i] = pdev_id_map[i];
wmi_handle->evt_pdev_id_map[i] = wmi_handle->evt_pdev_id_map[i] =
WMI_HOST_PDEV_ID_INVALID; WMI_HOST_PDEV_ID_INVALID;
wmi_handle->cmd_phy_id_map[i] = pdev_id_map[i] - 1;
wmi_handle->evt_phy_id_map[i] =
WMI_HOST_PDEV_ID_INVALID;
} }
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
if (wmi_handle->cmd_pdev_id_map[i] != if (wmi_handle->cmd_pdev_id_map[i] !=
WMI_HOST_PDEV_ID_INVALID) { WMI_HOST_PDEV_ID_INVALID) {
wmi_handle->evt_pdev_id_map wmi_handle->evt_pdev_id_map
[wmi_handle->cmd_pdev_id_map[i] - 1] = i; [wmi_handle->cmd_pdev_id_map[i] - 1] = i;
}
if (wmi_handle->cmd_phy_id_map[i] !=
WMI_HOST_PDEV_ID_INVALID) {
wmi_handle->evt_phy_id_map
[wmi_handle->cmd_phy_id_map[i]] = i;
} }
} }
wmi_handle->soc->is_pdev_is_map_enable = true; wmi_handle->soc->is_pdev_is_map_enable = true;
wmi_handle->soc->is_phy_id_map_enable = true;
} else { } else {
wmi_handle->soc->is_pdev_is_map_enable = false; wmi_handle->soc->is_pdev_is_map_enable = false;
wmi_handle->soc->is_phy_id_map_enable = false;
} }
wmi_handle->ops->convert_pdev_id_host_to_target = wmi_handle->ops->convert_pdev_id_host_to_target =
convert_host_pdev_id_to_target_pdev_id; convert_host_pdev_id_to_target_pdev_id;
wmi_handle->ops->convert_pdev_id_target_to_host = wmi_handle->ops->convert_pdev_id_target_to_host =
convert_target_pdev_id_to_host_pdev_id; convert_target_pdev_id_to_host_pdev_id;
/* phy_id convert function assignments */
wmi_handle->ops->convert_phy_id_host_to_target =
convert_host_phy_id_to_target_phy_id;
wmi_handle->ops->convert_phy_id_target_to_host =
convert_target_phy_id_to_host_phy_id;
} }
/* copy_vdev_create_pdev_id() - copy pdev from host params to target command /* copy_vdev_create_pdev_id() - copy pdev from host params to target command
@@ -10892,7 +10944,8 @@ static QDF_STATUS extract_reg_chan_list_update_event_tlv(
reg_info->phybitmap = chan_list_event_hdr->phybitmap; reg_info->phybitmap = chan_list_event_hdr->phybitmap;
reg_info->offload_enabled = true; reg_info->offload_enabled = true;
reg_info->num_phy = chan_list_event_hdr->num_phy; reg_info->num_phy = chan_list_event_hdr->num_phy;
reg_info->phy_id = chan_list_event_hdr->phy_id; reg_info->phy_id = wmi_handle->ops->convert_phy_id_target_to_host(
wmi_handle, chan_list_event_hdr->phy_id);
reg_info->ctry_code = chan_list_event_hdr->country_id; reg_info->ctry_code = chan_list_event_hdr->country_id;
reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code; reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code;
if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_PASS) if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_PASS)
@@ -11368,6 +11421,36 @@ static uint32_t convert_target_pdev_id_to_host_pdev_id_legacy(
return pdev_id; return pdev_id;
} }
/**
* convert_host_phy_id_to_target_phy_id_legacy() - Convert phy_id from
* host to target defines. For legacy there is not conversion
* required. Just return phy_id as it is.
* @param pdev_id: host phy_id to be converted.
* Return: target phy_id after conversion.
*/
static uint32_t convert_host_phy_id_to_target_phy_id_legacy(
wmi_unified_t wmi_handle,
uint32_t phy_id)
{
/*No conversion required*/
return phy_id;
}
/**
* convert_target_phy_id_to_host_phy_id_legacy() - Convert phy_id from
* target to host defines. For legacy there is not conversion
* required. Just return phy_id as it is.
* @param pdev_id: target phy_id to be converted.
* Return: host phy_id after conversion.
*/
static uint32_t convert_target_phy_id_to_host_phy_id_legacy(
wmi_unified_t wmi_handle,
uint32_t phy_id)
{
/*No conversion required*/
return phy_id;
}
/** /**
* send_set_country_cmd_tlv() - WMI scan channel list function * send_set_country_cmd_tlv() - WMI scan channel list function
* @param wmi_handle : handle to WMI. * @param wmi_handle : handle to WMI.
@@ -13025,6 +13108,16 @@ struct wmi_ops tlv_ops = {
.convert_target_pdev_id_to_host = .convert_target_pdev_id_to_host =
convert_target_pdev_id_to_host_pdev_id, convert_target_pdev_id_to_host_pdev_id,
.convert_phy_id_host_to_target =
convert_host_phy_id_to_target_phy_id_legacy,
.convert_phy_id_target_to_host =
convert_target_phy_id_to_host_phy_id_legacy,
.convert_host_phy_id_to_target =
convert_host_phy_id_to_target_phy_id,
.convert_target_phy_id_to_host =
convert_target_phy_id_to_host_phy_id,
.send_start_11d_scan_cmd = send_start_11d_scan_cmd_tlv, .send_start_11d_scan_cmd = send_start_11d_scan_cmd_tlv,
.send_stop_11d_scan_cmd = send_stop_11d_scan_cmd_tlv, .send_stop_11d_scan_cmd = send_stop_11d_scan_cmd_tlv,
.extract_reg_11d_new_country_event = .extract_reg_11d_new_country_event =