|
@@ -2362,6 +2362,131 @@ struct link_status_priv {
|
|
|
uint8_t link_status;
|
|
|
};
|
|
|
|
|
|
+#ifdef WLAN_AP_STA_CONCURRENCY
|
|
|
+/**
|
|
|
+ * hdd_conc_set_dwell_time() - Set Concurrent dwell time parameters
|
|
|
+ * @adapter: Adapter upon which the command was received
|
|
|
+ * @command: ASCII text command that is received
|
|
|
+ *
|
|
|
+ * Driver commands:
|
|
|
+ * wpa_cli DRIVER CONCSETDWELLTIME ACTIVE MAX <value>
|
|
|
+ * wpa_cli DRIVER CONCSETDWELLTIME ACTIVE MIN <value>
|
|
|
+ * wpa_cli DRIVER CONCSETDWELLTIME PASSIVE MAX <value>
|
|
|
+ * wpa_cli DRIVER CONCSETDWELLTIME PASSIVE MIN <value>
|
|
|
+ *
|
|
|
+ * Return: 0 for success non-zero for failure
|
|
|
+ */
|
|
|
+static int hdd_conc_set_dwell_time(hdd_context_t *hdd_ctx, uint8_t *command)
|
|
|
+{
|
|
|
+ tHalHandle hhal;
|
|
|
+ struct hdd_config *p_cfg;
|
|
|
+ u8 *value = command;
|
|
|
+ tSmeConfigParams *sme_config;
|
|
|
+ int val = 0, temp = 0;
|
|
|
+ int retval = 0;
|
|
|
+
|
|
|
+ p_cfg = hdd_ctx->config;
|
|
|
+ hhal = hdd_ctx->hHal;
|
|
|
+ if (!p_cfg || !hhal) {
|
|
|
+ hdd_err("Argument passed for CONCSETDWELLTIME is incorrect");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ sme_config = qdf_mem_malloc(sizeof(*sme_config));
|
|
|
+ if (!sme_config) {
|
|
|
+ hdd_err("Failed to allocate memory for sme_config");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ qdf_mem_zero(sme_config, sizeof(*sme_config));
|
|
|
+ sme_get_config_param(hhal, sme_config);
|
|
|
+
|
|
|
+ if (strncmp(command, "CONCSETDWELLTIME ACTIVE MAX", 27) == 0) {
|
|
|
+ if (drv_cmd_validate(command, 27)) {
|
|
|
+ hdd_err("Invalid driver command");
|
|
|
+ retval = -EINVAL;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ value = value + 28;
|
|
|
+ temp = kstrtou32(value, 10, &val);
|
|
|
+ if (temp != 0 || val < CFG_ACTIVE_MAX_CHANNEL_TIME_CONC_MIN ||
|
|
|
+ val > CFG_ACTIVE_MAX_CHANNEL_TIME_CONC_MAX) {
|
|
|
+ hdd_err("Argument passed for CONCSETDWELLTIME ACTIVE MAX is incorrect");
|
|
|
+ retval = -EFAULT;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ p_cfg->nActiveMaxChnTimeConc = val;
|
|
|
+ sme_config->csrConfig.nActiveMaxChnTimeConc = val;
|
|
|
+ sme_update_config(hhal, sme_config);
|
|
|
+ } else if (strncmp(command, "CONCSETDWELLTIME ACTIVE MIN", 27) == 0) {
|
|
|
+ if (drv_cmd_validate(command, 27)) {
|
|
|
+ hdd_err("Invalid driver command");
|
|
|
+ retval = -EINVAL;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ value = value + 28;
|
|
|
+ temp = kstrtou32(value, 10, &val);
|
|
|
+ if (temp != 0 || val < CFG_ACTIVE_MIN_CHANNEL_TIME_CONC_MIN ||
|
|
|
+ val > CFG_ACTIVE_MIN_CHANNEL_TIME_CONC_MAX) {
|
|
|
+ hdd_err("argument passed for CONCSETDWELLTIME ACTIVE MIN is incorrect");
|
|
|
+ retval = -EFAULT;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ p_cfg->nActiveMinChnTimeConc = val;
|
|
|
+ sme_config->csrConfig.nActiveMinChnTimeConc = val;
|
|
|
+ sme_update_config(hhal, sme_config);
|
|
|
+ } else if (strncmp(command, "CONCSETDWELLTIME PASSIVE MAX", 28) == 0) {
|
|
|
+ if (drv_cmd_validate(command, 28)) {
|
|
|
+ hdd_err("Invalid driver command");
|
|
|
+ retval = -EINVAL;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ value = value + 29;
|
|
|
+ temp = kstrtou32(value, 10, &val);
|
|
|
+ if (temp != 0 || val < CFG_PASSIVE_MAX_CHANNEL_TIME_CONC_MIN ||
|
|
|
+ val > CFG_PASSIVE_MAX_CHANNEL_TIME_CONC_MAX) {
|
|
|
+ hdd_err("Argument passed for CONCSETDWELLTIME PASSIVE MAX is incorrect");
|
|
|
+ retval = -EFAULT;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ p_cfg->nPassiveMaxChnTimeConc = val;
|
|
|
+ sme_config->csrConfig.nPassiveMaxChnTimeConc = val;
|
|
|
+ sme_update_config(hhal, sme_config);
|
|
|
+ } else if (strncmp(command, "CONCSETDWELLTIME PASSIVE MIN", 28) == 0) {
|
|
|
+ if (drv_cmd_validate(command, 28)) {
|
|
|
+ hdd_err("Invalid driver command");
|
|
|
+ retval = -EINVAL;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ value = value + 29;
|
|
|
+ temp = kstrtou32(value, 10, &val);
|
|
|
+ if (temp != 0 || val < CFG_PASSIVE_MIN_CHANNEL_TIME_CONC_MIN ||
|
|
|
+ val > CFG_PASSIVE_MIN_CHANNEL_TIME_CONC_MAX) {
|
|
|
+ hdd_err("argument passed for SETDWELLTIME PASSIVE MIN is incorrect");
|
|
|
+ retval = -EFAULT;
|
|
|
+ goto sme_config_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ p_cfg->nPassiveMinChnTimeConc = val;
|
|
|
+ sme_config->csrConfig.nPassiveMinChnTimeConc = val;
|
|
|
+ sme_update_config(hhal, sme_config);
|
|
|
+ } else {
|
|
|
+ retval = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+sme_config_free:
|
|
|
+ qdf_mem_free(sme_config);
|
|
|
+ return retval;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static void hdd_get_link_status_cb(uint8_t status, void *context)
|
|
|
{
|
|
|
struct hdd_request *request;
|
|
@@ -4641,6 +4766,17 @@ static int drv_cmd_set_dwell_time(struct hdd_adapter *adapter,
|
|
|
return hdd_set_dwell_time(adapter, command);
|
|
|
}
|
|
|
|
|
|
+#ifdef WLAN_AP_STA_CONCURRENCY
|
|
|
+static int drv_cmd_conc_set_dwell_time(hdd_adapter_t *adapter,
|
|
|
+ hdd_context_t *hdd_ctx,
|
|
|
+ u8 *command,
|
|
|
+ u8 command_len,
|
|
|
+ hdd_priv_data_t *priv_data)
|
|
|
+{
|
|
|
+ return hdd_conc_set_dwell_time(hdd_ctx, command);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static int drv_cmd_miracast(struct hdd_adapter *adapter,
|
|
|
struct hdd_context *hdd_ctx,
|
|
|
uint8_t *command,
|
|
@@ -6821,6 +6957,9 @@ static const struct hdd_drv_cmd hdd_drv_cmds[] = {
|
|
|
{"BTCOEXMODE", drv_cmd_bt_coex_mode, true},
|
|
|
{"SCAN-ACTIVE", drv_cmd_scan_active, false},
|
|
|
{"SCAN-PASSIVE", drv_cmd_scan_passive, false},
|
|
|
+#ifdef WLAN_AP_STA_CONCURRENCY
|
|
|
+ {"CONCSETDWELLTIME", drv_cmd_conc_set_dwell_time, true},
|
|
|
+#endif
|
|
|
{"GETDWELLTIME", drv_cmd_get_dwell_time, false},
|
|
|
{"SETDWELLTIME", drv_cmd_set_dwell_time, true},
|
|
|
{"MIRACAST", drv_cmd_miracast, true},
|