qcacld-3.0: Add support to get the status for Roam Scan Offload command

Add support to handle the event for the Roam Scan Offload[RSO] command
status. Inform the same to user space.

Change-Id: I2758103e8ca3c49c0fecd3323b619542dbbabf0c
CRs-Fixed: 1111809
这个提交包含在:
Sreelakshmi Konamki
2017-04-14 15:11:55 +05:30
提交者 Sandeep Puligilla
父节点 f0b92cf00b
当前提交 88a2a41bbf
修改 13 个文件,包含 153 行新增3 行删除

查看文件

@@ -167,6 +167,9 @@
#define WLAN_WAIT_TIME_BPF 1000 #define WLAN_WAIT_TIME_BPF 1000
/* Maximum time(ms) to wait for RSO CMD status event */
#define WAIT_TIME_RSO_CMD_STATUS 2000
#define MAX_NUMBER_OF_ADAPTERS 4 #define MAX_NUMBER_OF_ADAPTERS 4
#define MAX_CFG_STRING_LEN 255 #define MAX_CFG_STRING_LEN 255
@@ -1143,6 +1146,7 @@ struct hdd_adapter_s {
* disconnect is being deferred. * disconnect is being deferred.
*/ */
uint8_t cfg80211_disconnect_reason; uint8_t cfg80211_disconnect_reason;
struct lfr_firmware_status lfr_fw_status;
}; };
/* /*

查看文件

@@ -9177,6 +9177,21 @@ nla_policy qca_wlan_vendor_attr[QCA_WLAN_VENDOR_ATTR_MAX+1] = {
.len = QDF_MAC_ADDR_SIZE}, .len = QDF_MAC_ADDR_SIZE},
}; };
void wlan_hdd_rso_cmd_status_cb(void *ctx, struct rso_cmd_status *rso_status)
{
hdd_context_t *hdd_ctx = (hdd_context_t *)ctx;
hdd_adapter_t *adapter;
adapter = hdd_get_adapter_by_vdev(hdd_ctx, rso_status->vdev_id);
if (!adapter) {
hdd_err("adapter NULL");
return;
}
adapter->lfr_fw_status.is_disabled = rso_status->status;
complete(&adapter->lfr_fw_status.disable_lfr_event);
}
/** /**
* __wlan_hdd_cfg80211_set_fast_roaming() - enable/disable roaming * __wlan_hdd_cfg80211_set_fast_roaming() - enable/disable roaming
* @wiphy: Pointer to wireless phy * @wiphy: Pointer to wireless phy
@@ -9196,9 +9211,10 @@ static int __wlan_hdd_cfg80211_set_fast_roaming(struct wiphy *wiphy,
struct net_device *dev = wdev->netdev; struct net_device *dev = wdev->netdev;
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev); hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1]; struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
uint32_t is_fast_roam_enabled; uint32_t is_fast_roam_enabled, enable_lfr_fw;
int ret; int ret;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
unsigned long rc;
ENTER_DEV(dev); ENTER_DEV(dev);
@@ -9235,14 +9251,34 @@ static int __wlan_hdd_cfg80211_set_fast_roaming(struct wiphy *wiphy,
return -EINVAL; return -EINVAL;
} }
/* Update roaming */ /* Update roaming */
enable_lfr_fw = (is_fast_roam_enabled && adapter->fast_roaming_allowed);
qdf_status = sme_config_fast_roaming(hdd_ctx->hHal, adapter->sessionId, qdf_status = sme_config_fast_roaming(hdd_ctx->hHal, adapter->sessionId,
(is_fast_roam_enabled && enable_lfr_fw);
adapter->fast_roaming_allowed));
if (qdf_status != QDF_STATUS_SUCCESS) if (qdf_status != QDF_STATUS_SUCCESS)
hdd_err("sme_config_fast_roaming failed with status=%d", hdd_err("sme_config_fast_roaming failed with status=%d",
qdf_status); qdf_status);
ret = qdf_status_to_os_return(qdf_status); ret = qdf_status_to_os_return(qdf_status);
INIT_COMPLETION(adapter->lfr_fw_status.disable_lfr_event);
if (QDF_IS_STATUS_SUCCESS(qdf_status) && !enable_lfr_fw) {
/*
* wait only for LFR disable in fw as LFR enable
* is always success
*/
rc = wait_for_completion_timeout(
&adapter->lfr_fw_status.disable_lfr_event,
msecs_to_jiffies(WAIT_TIME_RSO_CMD_STATUS));
if (!rc) {
hdd_err("Timed out waiting for RSO CMD status");
return -ETIMEDOUT;
}
if (!adapter->lfr_fw_status.is_disabled) {
hdd_err("Roam disable attempt in FW fails");
return -EBUSY;
}
}
EXIT(); EXIT();
return ret; return ret;
} }

查看文件

@@ -297,6 +297,18 @@ void wlan_hdd_cfg80211_extscan_callback(void *ctx,
const uint16_t evType, void *pMsg); const uint16_t evType, void *pMsg);
#endif /* FEATURE_WLAN_EXTSCAN */ #endif /* FEATURE_WLAN_EXTSCAN */
/**
* wlan_hdd_rso_cmd_status_cb() - HDD callback to read RSO command status
* @ctx: void pointer to hdd context
* @rso_status: rso command status
*
* This callback function is invoked by firmware to update
* the RSO(ROAM SCAN OFFLOAD) command status.
*
* Return: None
*/
void wlan_hdd_rso_cmd_status_cb(void *ctx, struct rso_cmd_status *rso_status);
void hdd_rssi_threshold_breached(void *hddctx, void hdd_rssi_threshold_breached(void *hddctx,
struct rssi_breach_event *data); struct rssi_breach_event *data);

查看文件

@@ -2816,6 +2816,7 @@ static hdd_adapter_t *hdd_alloc_station_adapter(hdd_context_t *hdd_ctx,
init_completion(&adapter->scan_info.abortscan_event_var); init_completion(&adapter->scan_info.abortscan_event_var);
init_completion(&adapter->lfr_fw_status.disable_lfr_event);
adapter->offloads_configured = false; adapter->offloads_configured = false;
adapter->isLinkUpSvcNeeded = false; adapter->isLinkUpSvcNeeded = false;
@@ -9350,6 +9351,8 @@ int hdd_register_cb(hdd_context_t *hdd_ctx)
sme_set_link_layer_stats_ind_cb(hdd_ctx->hHal, sme_set_link_layer_stats_ind_cb(hdd_ctx->hHal,
wlan_hdd_cfg80211_link_layer_stats_callback); wlan_hdd_cfg80211_link_layer_stats_callback);
sme_rso_cmd_status_cb(hdd_ctx->hHal, wlan_hdd_rso_cmd_status_cb);
status = sme_set_lost_link_info_cb(hdd_ctx->hHal, status = sme_set_lost_link_info_cb(hdd_ctx->hHal,
hdd_lost_link_info_cb); hdd_lost_link_info_cb);
/* print error and not block the startup process */ /* print error and not block the startup process */

查看文件

@@ -4617,6 +4617,26 @@ struct power_stats_response {
}; };
#endif #endif
/**
* struct lfr_firmware_status - LFR status in firmware
* @is_disabled: Is LFR disabled in FW
* @disable_lfr_event: Disable attempt done in FW
*/
struct lfr_firmware_status {
uint32_t is_disabled;
struct completion disable_lfr_event;
};
/**
* struct rso_cmd_status - RSO Command status
* @vdev_id: Vdev ID for which RSO command sent
* @status: Status of RSO command sent to FW
*/
struct rso_cmd_status {
uint32_t vdev_id;
bool status;
};
typedef struct { typedef struct {
uint8_t oui[WIFI_SCANNING_MAC_OUI_LENGTH]; uint8_t oui[WIFI_SCANNING_MAC_OUI_LENGTH];
} tSirScanMacOui, *tpSirScanMacOui; } tSirScanMacOui, *tpSirScanMacOui;

查看文件

@@ -256,6 +256,7 @@ enum eWniMsgTypes {
eWNI_SME_ROAM_SCAN_OFFLOAD_REQ, eWNI_SME_ROAM_SCAN_OFFLOAD_REQ,
eWNI_SME_LOST_LINK_INFO_IND, eWNI_SME_LOST_LINK_INFO_IND,
eWNI_SME_DEL_ALL_TDLS_PEERS, eWNI_SME_DEL_ALL_TDLS_PEERS,
eWNI_SME_RSO_CMD_STATUS_IND,
eWNI_SME_MSG_TYPES_END eWNI_SME_MSG_TYPES_END
}; };

查看文件

@@ -415,6 +415,7 @@ uint8_t *mac_trace_get_sme_msg_string(uint16_t sme_msg)
CASE_RETURN_STRING(eWNI_SME_DEFAULT_SCAN_IE); CASE_RETURN_STRING(eWNI_SME_DEFAULT_SCAN_IE);
CASE_RETURN_STRING(eWNI_SME_ROAM_SCAN_OFFLOAD_REQ); CASE_RETURN_STRING(eWNI_SME_ROAM_SCAN_OFFLOAD_REQ);
CASE_RETURN_STRING(eWNI_SME_LOST_LINK_INFO_IND); CASE_RETURN_STRING(eWNI_SME_LOST_LINK_INFO_IND);
CASE_RETURN_STRING(eWNI_SME_RSO_CMD_STATUS_IND);
CASE_RETURN_STRING(eWNI_SME_MSG_TYPES_END); CASE_RETURN_STRING(eWNI_SME_MSG_TYPES_END);
default: default:
return (uint8_t *) "UNKNOWN"; return (uint8_t *) "UNKNOWN";

查看文件

@@ -1437,6 +1437,18 @@ QDF_STATUS sme_get_beacon_frm(tHalHandle hal, tCsrRoamProfile *profile,
QDF_STATUS sme_delete_all_tdls_peers(tHalHandle hal, uint8_t session_id); QDF_STATUS sme_delete_all_tdls_peers(tHalHandle hal, uint8_t session_id);
/**
* sme_rso_cmd_status_cb() - Set RSO cmd status callback
* @hal: HAL Handle
* @cb: HDD Callback to rso comman status read
*
* This function is used to save HDD RSO Command status callback in MAC
*
* Return: QDF_STATUS
*/
QDF_STATUS sme_rso_cmd_status_cb(tHalHandle hal,
void (*cb)(void *, struct rso_cmd_status *));
/** /**
* sme_register_set_connection_info_cb() - Register connection * sme_register_set_connection_info_cb() - Register connection
* info callback * info callback

查看文件

@@ -244,6 +244,8 @@ typedef struct tagSmeStruct {
bool (*set_connection_info_cb)(bool); bool (*set_connection_info_cb)(bool);
bool (*get_connection_info_cb)(uint8_t *session_id, bool (*get_connection_info_cb)(uint8_t *session_id,
enum scan_reject_states *reason); enum scan_reject_states *reason);
void (*rso_cmd_status_cb)(void *hdd_context,
struct rso_cmd_status *rso_status);
} tSmeStruct, *tpSmeStruct; } tSmeStruct, *tpSmeStruct;
#endif /* #if !defined( __SMEINTERNAL_H ) */ #endif /* #if !defined( __SMEINTERNAL_H ) */

查看文件

@@ -2630,6 +2630,11 @@ QDF_STATUS sme_process_msg(tHalHandle hHal, struct scheduler_msg *pMsg)
(struct sir_lost_link_info *)pMsg->bodyptr); (struct sir_lost_link_info *)pMsg->bodyptr);
qdf_mem_free(pMsg->bodyptr); qdf_mem_free(pMsg->bodyptr);
break; break;
case eWNI_SME_RSO_CMD_STATUS_IND:
if (pMac->sme.rso_cmd_status_cb)
pMac->sme.rso_cmd_status_cb(pMac->hHdd, pMsg->bodyptr);
qdf_mem_free(pMsg->bodyptr);
break;
default: default:
if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN) if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
@@ -16093,3 +16098,14 @@ QDF_STATUS sme_register_set_connection_info_cb(tHalHandle hHal,
} }
return status; return status;
} }
QDF_STATUS sme_rso_cmd_status_cb(tHalHandle hal,
void (*cb)(void *, struct rso_cmd_status *))
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
tpAniSirGlobal mac = PMAC_STRUCT(hal);
mac->sme.rso_cmd_status_cb = cb;
sms_log(mac, LOG1, FL("Registered RSO command status callback"));
return status;
}

查看文件

@@ -840,6 +840,16 @@ void wma_post_link_status(tAniGetLinkStatus *pGetLinkStatus,
int wma_link_status_event_handler(void *handle, uint8_t *cmd_param_info, int wma_link_status_event_handler(void *handle, uint8_t *cmd_param_info,
uint32_t len); uint32_t len);
/**
* wma_rso_cmd_status_event_handler() - RSO Command status event handler
* @wmi_event: WMI event
*
* This function is used to send RSO command status to upper layer
*
* Return: 0 for success
*/
int wma_rso_cmd_status_event_handler(wmi_roam_event_fixed_param *wmi_event);
int wma_stats_event_handler(void *handle, uint8_t *cmd_param_info, int wma_stats_event_handler(void *handle, uint8_t *cmd_param_info,
uint32_t len); uint32_t len);

查看文件

@@ -5432,6 +5432,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
roam_synch_data, NULL, op_code); roam_synch_data, NULL, op_code);
qdf_mem_free(roam_synch_data); qdf_mem_free(roam_synch_data);
break; break;
case WMI_ROAM_REASON_RSO_STATUS:
wma_rso_cmd_status_event_handler(wmi_event);
break;
default: default:
WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__, WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__,
wmi_event->reason, wmi_event->vdev_id); wmi_event->reason, wmi_event->vdev_id);

查看文件

@@ -1750,6 +1750,36 @@ int wma_link_status_event_handler(void *handle, uint8_t *cmd_param_info,
return 0; return 0;
} }
int wma_rso_cmd_status_event_handler(wmi_roam_event_fixed_param *wmi_event)
{
struct rso_cmd_status *rso_status;
struct scheduler_msg sme_msg;
QDF_STATUS qdf_status;
rso_status = qdf_mem_malloc(sizeof(*rso_status));
if (!rso_status) {
WMA_LOGE("%s: malloc fails for rso cmd status", __func__);
return -ENOMEM;
}
rso_status->vdev_id = wmi_event->vdev_id;
if (WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS == wmi_event->notif)
rso_status->status = true;
else if (WMI_ROAM_NOTIF_SCAN_MODE_FAIL == wmi_event->notif)
rso_status->status = false;
sme_msg.type = eWNI_SME_RSO_CMD_STATUS_IND;
sme_msg.bodyptr = rso_status;
sme_msg.bodyval = 0;
WMA_LOGI("%s: Post RSO cmd status to SME", __func__);
qdf_status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
WMA_LOGE("%s: fail to post RSO cmd status to SME", __func__);
qdf_mem_free(rso_status);
}
return 0;
}
/** /**
* wma_stats_event_handler() - stats event handler * wma_stats_event_handler() - stats event handler
* @handle: wma handle * @handle: wma handle