static ssize_t wcnss_wowenable_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { hdd_adapter_t *pAdapter = (hdd_adapter_t *)file->private_data; char cmd[MAX_USER_COMMAND_SIZE_WOWL_ENABLE + 1]; char *sptr, *token; v_U8_t wow_enable = 0; v_U8_t wow_mp = 0; v_U8_t wow_pbm = 0; if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s: Invalid adapter or adapter has invalid magic.", __func__); return -EINVAL; } if (!sme_IsFeatureSupportedByFW(WOW)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: Wake-on-Wireless feature is not supported " "in firmware!", __func__); return -EINVAL; } if (count > MAX_USER_COMMAND_SIZE_WOWL_ENABLE) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: Command length is larger than %d bytes.", __func__, MAX_USER_COMMAND_SIZE_WOWL_ENABLE); return -EINVAL; } if (copy_from_user(cmd, buf, count)) return -EFAULT; cmd[count] = '\0'; sptr = cmd; token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_enable)) return -EINVAL; if (!wow_enable) { if (!hdd_exit_wowl(pAdapter)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: hdd_exit_wowl failed!", __func__); return -EFAULT; } return count; } token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_mp)) return -EINVAL; if (wow_mp > 1) wow_mp = 1; token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_pbm)) return -EINVAL; if (wow_pbm > 1) wow_pbm = 1; if (!hdd_enter_wowl(pAdapter, wow_mp, wow_pbm)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: hdd_enter_wowl failed!", __func__); return -EFAULT; } return count; }
/** * __wcnss_wowenable_write() - write wow enable * @file: file pointer * @buf: buffer * @count: count * @ppos: position pointer * * Return: 0 on success, error number otherwise */ static ssize_t __wcnss_wowenable_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { hdd_adapter_t *pAdapter; hdd_context_t *hdd_ctx; char cmd[MAX_USER_COMMAND_SIZE_WOWL_ENABLE + 1]; char *sptr, *token; v_U8_t wow_enable = 0; v_U8_t wow_mp = 0; v_U8_t wow_pbm = 0; int ret; ENTER(); pAdapter = (hdd_adapter_t *)file->private_data; if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s: Invalid adapter or adapter has invalid magic.", __func__); return -EINVAL; } hdd_ctx = WLAN_HDD_GET_CTX(pAdapter); ret = wlan_hdd_validate_context(hdd_ctx); if (0 != ret) return ret; if (!sme_IsFeatureSupportedByFW(WOW)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: Wake-on-Wireless feature is not supported " "in firmware!", __func__); return -EINVAL; } if (count > MAX_USER_COMMAND_SIZE_WOWL_ENABLE) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: Command length is larger than %d bytes.", __func__, MAX_USER_COMMAND_SIZE_WOWL_ENABLE); return -EINVAL; } /* Get command from user */ if (copy_from_user(cmd, buf, count)) return -EFAULT; cmd[count] = '\0'; sptr = cmd; /* Get enable or disable wow */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_enable)) return -EINVAL; /* Disable wow */ if (!wow_enable) { if (!hdd_exit_wowl(pAdapter)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: hdd_exit_wowl failed!", __func__); return -EFAULT; } return count; } /* Get enable or disable magic packet mode */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_mp)) return -EINVAL; if (wow_mp > 1) wow_mp = 1; /* Get enable or disable pattern byte matching mode */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou8(token, 0, &wow_pbm)) return -EINVAL; if (wow_pbm > 1) wow_pbm = 1; if (!hdd_enter_wowl(pAdapter, wow_mp, wow_pbm)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: hdd_enter_wowl failed!", __func__); return -EFAULT; } EXIT(); return count; }