int lbs_resume(struct lbs_private *priv) { int ret; lbs_deb_enter(LBS_DEB_FW); ret = lbs_set_host_sleep(priv, 0); netif_device_attach(priv->dev); if (priv->mesh_dev) netif_device_attach(priv->mesh_dev); if (priv->deep_sleep_required) { priv->deep_sleep_required = 0; ret = lbs_set_deep_sleep(priv, 1); if (ret) netdev_err(priv->dev, "deep sleep activation failed: %d\n", ret); } if (priv->setup_fw_on_resume) ret = lbs_setup_firmware(priv); lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret); return ret; }
int lbs_suspend(struct lbs_private *priv) { int ret; lbs_deb_enter(LBS_DEB_FW); if (priv->is_deep_sleep) { ret = lbs_set_deep_sleep(priv, 0); if (ret) { netdev_err(priv->dev, "deep sleep cancellation failed: %d\n", ret); return ret; } priv->deep_sleep_required = 1; } ret = lbs_set_host_sleep(priv, 1); netif_device_detach(priv->dev); if (priv->mesh_dev) netif_device_detach(priv->mesh_dev); lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret); return ret; }
static ssize_t lbs_host_sleep_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { struct lbs_private *priv = file->private_data; ssize_t buf_size, ret; int host_sleep; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; if (!buf) return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, user_buf, buf_size)) { ret = -EFAULT; goto out_unlock; } ret = sscanf(buf, "%d", &host_sleep); if (ret != 1) { ret = -EINVAL; goto out_unlock; } if (host_sleep == 0) ret = lbs_set_host_sleep(priv, 0); else if (host_sleep == 1) { if (priv->wol_criteria == EHS_REMOVE_WAKEUP) { netdev_info(priv->dev, "wake parameters not configured\n"); ret = -EINVAL; goto out_unlock; } ret = lbs_set_host_sleep(priv, 1); } else { netdev_err(priv->dev, "invalid option\n"); ret = -EINVAL; } if (!ret) ret = count; out_unlock: free_page(addr); return ret; }
static ssize_t lbs_host_sleep_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { struct lbs_private *priv = file->private_data; ssize_t ret; int host_sleep; char *buf; buf = memdup_user_nul(user_buf, min(count, len - 1)); if (IS_ERR(buf)) return PTR_ERR(buf); ret = sscanf(buf, "%d", &host_sleep); if (ret != 1) { ret = -EINVAL; goto out_unlock; } if (host_sleep == 0) ret = lbs_set_host_sleep(priv, 0); else if (host_sleep == 1) { if (priv->wol_criteria == EHS_REMOVE_WAKEUP) { netdev_info(priv->dev, "wake parameters not configured\n"); ret = -EINVAL; goto out_unlock; } ret = lbs_set_host_sleep(priv, 1); } else { netdev_err(priv->dev, "invalid option\n"); ret = -EINVAL; } if (!ret) ret = count; out_unlock: kfree(buf); return ret; }